Commit graph

26 commits

Author SHA1 Message Date
Vlad Sazonau
5a4e9debc1
feat: add /?template=stripe|default to url, implement URL compression logic (#130)
* feat: add debug local storage UI and update README; include new template parameter handling in invoice form

* feat: add URL compression logic when generating link to invoice to reduce url length + add unit tests + improved existing e2e tests

* ci: remove type check step from unit tests workflow to streamline CI process

* test: update e2e tests for Stripe invoice sharing logic and template; increase timeout for visibility checks

* test: refactor e2e tests for invoice generation and sharing; update element selectors and enhance URL disallow rules in robots.txt

* chore: enhance README with detailed features and update about page references; add GitHub star CTA component

* chore: update configuration files for Prettier, run prettify across the project

* chore: run dedupe

* test: add e2e tests for Open Graph meta tags in invoice templates; verify correct rendering for default and Stripe templates

* chore: remove @stagewise/toolbar-next package and related development toolbar component from the project
2025-08-20 01:15:48 +02:00
Vlad Sazonau
205f9bc234
feat: stripe invoice template, new CTA toasts, cleanup landing page + other improvements (#118)
* feat: enhance Android PDF viewer with error handling and memoization

- Added error handling for PDF loading failures in AndroidPdfViewer, utilizing Sentry for logging and user-friendly toast notifications.
- Implemented memoization for the InvoicePdfTemplate to optimize rendering performance.
- Updated layout.tsx to include necessary CSS for PDF rendering.
- Adjusted index.tsx comments for clarity on viewer types.

* feat: add new toasts, cleanup landing page, add stripe template

* feat: enhance PDF footer and update tests for dynamic content

- Introduced a new InvoiceFooter component to modularize footer rendering in PDF templates, improving code organization and reusability.
- Updated PDF tests to verify dynamic content in footers, including current month/year and payment due date, ensuring accurate invoice representation.
- Added PROD_WEBSITE_URL to config for consistent URL usage across components.
- Improved Telegram message handling with cache control headers for better performance.

* feat: implement invoice sharing logic and logo handling for stripe template

- Added state management for sharing invoices, including validation for logos that exceed URL length limits.
- Updated the share invoice button to reflect sharing capabilities based on logo presence.
- Introduced logo upload functionality with validation for file type and size, enhancing user experience.
- Refactored invoice form to disable sharing when a logo is present in Stripe templates, ensuring compliance with URL constraints.
- Improved toast notifications for user feedback on sharing and logo upload actions.

* feat: update invoice descriptions and enhance date handling in PDF templates

- Updated invoice descriptions in multiple languages to clarify that the tool runs entirely in the browser.
- Refactored date handling in the Stripe template components to ensure accurate formatting based on the invoice's language settings.
- Introduced a new InvoiceBody component to modularize the PDF rendering process, improving code organization and reusability.
- Enhanced the StripeDueAmount and StripeFooter components to reflect the updated date logic and improve overall clarity in the invoice presentation.
- Added localization support for date formatting using dayjs across various components.
- Added new currencies

* chore: remove unused vercel.json and add new e2e tests for invoice sharing and PDF generation

- Deleted the unused vercel.json configuration file.
- Updated the about page test to reflect changes in the description for clarity.
- Removed redundant error message checks in the invoice form tests.
- Added new e2e tests for PDF generation and sharing logic specific to the Stripe template, ensuring comprehensive coverage of invoice functionalities.

* feat: enhance umami tracking with invoice template data and improve error handling

* refactor: improve tooltips text and design, improve error handling and test assertions in invoice form and logo upload utilities

- Enhanced error handling in the logo upload function to ensure input elements are present and base64 data is provided.
- Updated e2e tests for the invoice generator page to use more reliable URL assertions.
- Refactored invoice form logic to simplify sharing validation based on template and logo presence.
- Improved button accessibility and user experience by clarifying aria-disabled attributes in various components.

* refactor: update CTA toast logic and improve button components

- Changed the timer for showing the CTA toast from 30 seconds to 40 seconds.

* fix tests

* fix: update date formatting in general information section to respect locale settings

* feat: add changelog page with mdx support

- Added support for MDX files in the Next.js configuration, allowing for rich content in the changelog.
- Introduced a new changelog layout and page structure to display updates effectively.
- Implemented dynamic routing for individual changelog entries, improving navigation and user experience.
- Enhanced the footer component with subscription functionality and improved styling.
- Updated translations to include changelog links across multiple languages.
- Added new components for date formatting and project logo descriptions to enhance the changelog presentation.

* feat: add environment configuration and update social links in tests

- Created a new .env.example file to define environment variables for server and client configurations, including Sentry, Resend, Redis, and personal information for invoices.
- Updated e2e tests to utilize GITHUB_URL and TWITTER_URL from the config for social media links, enhancing maintainability and consistency across the application.
- Refactored footer and about page components to use dynamic URLs for GitHub and Twitter, improving code clarity and reducing hardcoded values.

* chore: update environment configuration and README for clarity

- Updated .env.example to set default values for Sentry and Google Drive API configurations, enhancing clarity for new developers.
- Modified env.ts to remove minimum length validation for environment variables, simplifying the setup process.
- Enhanced README with quick start instructions and service links for Resend, Upstash, Google Drive API, and Telegram Bot API, improving onboarding experience.

* chore: add localtunnel script to package.json and adjust input component styles

- Added a new script expose-to-internet in package.json for localtunnel to facilitate external access during development.
- Updated the Input component to conditionally adjust width for date type inputs, enhancing responsiveness and usability.

* fix: update tagline in various components for consistency

* refactor: enhance loading component layout and styling

* refactor: improve invoice form validation and template handling

- Enhanced the InvoiceForm component to validate data before saving to local storage using Zod.
- Updated GeneralInformation component to handle template-specific updates for date format and clear fields based on the selected template.
- Adjusted StripeSellerBuyerInfo component styles for better spacing and consistency.
- Improved InvoiceBody component to handle invoice total formatting more robustly.
- Updated translations for 'billTo' in multiple languages for better accuracy.

* footer fix

* refactor: standardize date formatting in invoice templates

- Introduced STRIPE_DEFAULT_DATE_FORMAT constant for consistent date formatting across invoice-related components.
- Updated template tests to utilize the new date format for improved maintainability.
- Adjusted GeneralInformation component to set date format based on the selected template, enhancing clarity and consistency.
2025-07-09 01:39:21 +02:00
Vlad Sazonau
d3f2bdc497
chore: add tsgo, some dev libs and file structure improvements (#116)
* chore: update package.json and pnpm-lock.yaml for improved diagnostics and new dependencies

- Enhanced type-check command in package.json to include diagnostics for better TypeScript error reporting.
- Added new command type-check:go for running tsgo with diagnostics.
- Updated pnpm-lock.yaml to reflect changes in package versions and ensure consistent dependency management.
- Updated README.md to improve project description and support message.
- Refactored layout.tsx to include performance monitoring and development tools.
- Improved generate-invoice API route for better notification handling and error logging.

* move component folder

* chore: update package.json and pnpm-lock.yaml to include react-scan for performance monitoring

- Added react-scan dependency to package.json for enhanced React component diagnostics.
- Updated pnpm-lock.yaml to reflect the new dependency and ensure consistent package management.
- Modified layout.tsx to conditionally render ReactScan only in development mode, improving performance in production.

* fix: enhance initialization of react-scan component

- Added a useRef hook to prevent multiple initializations of the react-scan tool.
- Implemented error handling during initialization to log failures gracefully.
- Updated useEffect to ensure react-scan is only initialized once, improving performance and reliability.

* chore: update Playwright test commands and improve dialog handling in tests

- Modified test commands in package.json and GitHub Actions to use the 'list' reporter for better output readability.
- Enhanced invoice form tests to interact with the dialog component more effectively, ensuring visibility checks are performed on the dialog rather than the page.
- Adjusted layout.tsx to comment out development tools for cleaner production builds.
2025-05-26 02:24:53 +02:00
Vlad Sazonau
d8099a9eb9
attempt to fix android pdf preview (#115)
* attempt to fix android

* attempt to fix android

* attempt to fix android

* refactor: enhance PDF preview error handling in PdfViewer component

- Improved error handling in the BlobProvider for mobile PDF previews, providing user-friendly messages for loading and generation errors.
- Removed unused code and imports to streamline the PdfViewer component.
- Ensured consistent loading indicators and error messages for a better user experience.

* feat: implement Android PDF viewer and enhance device detection

- Added AndroidPdfViewer component to handle PDF previews specifically for Android devices, utilizing BlobProvider for compatibility.
- Updated device context to include Android detection, improving user experience on mobile platforms.
- Enhanced RootLayout to pass Android detection state to DeviceContextProvider.
- Refactored PdfViewer to conditionally render AndroidPdfViewer based on device type, ensuring seamless PDF viewing experience across devices.

* fix pdf worker

* refactor: improve Android PDF viewer loading and error handling

- Updated loading indicators in AndroidPdfViewer for better user experience, ensuring consistent styling and responsiveness.
- Simplified error messages for PDF generation failures, enhancing clarity for users.
- Refactored loading components in index.tsx to differentiate between desktop and Android viewers, improving modularity and readability.

* remove log
2025-05-20 23:20:31 +02:00
Vlad Sazonau
d6a8e5cafb
feat: save invoice to google drive and tg notification (#113)
* feat: enhance invoice generation with Telegram notifications and data compression

- Integrated Telegram messaging functionality to notify users about generated invoices, including attachments.
- Validated and compressed invoice data before generating the invoice URL for improved performance.
- Updated email content to include a link to view the invoice online, enhancing user experience.
- Added a new Telegram service for sending messages and files, ensuring robust communication.

* fix: enhance currency display in invoice form

- Updated the invoice form to include full currency names alongside symbols in the currency selection options.
- Introduced a new constant, CURRENCY_TO_LABEL, to map currency codes to their respective full names, improving clarity for users.
- Adjusted E2E tests to verify the correct display of currency options with full names.

* feat: integrate Google Drive functionality for invoice storage and enhance Telegram notifications

- Added Google Drive integration to create or find invoice folders and upload generated invoices.
- Enhanced the generate-invoice API route to include links to the uploaded invoices in Google Drive within email and Telegram notifications.
- Updated notification messages to provide clearer information about invoice details and access links.
- Introduced a new Google Drive service for managing folder creation and file uploads, improving invoice management.

* refactor: update Google Drive integration for invoice management

- Refactored the generate-invoice API route to improve clarity in folder path handling by renaming variables for better understanding.
- Enhanced the Google Drive service to streamline folder creation and retrieval, ensuring consistent naming conventions.
- Updated the bufferToStream function to utilize Node's Readable.from() for improved efficiency in streaming file uploads.
- Removed unnecessary error handling for existing folders, simplifying the logic for folder management.

* add zod schema to route.tsx

* feat: add email recipient validation to invoice generation API

* refactor: integrate environment variables using @t3-oss/env-nextjs

- Introduced a new env.ts file to centralize environment variable management with Zod validation.
- Updated various components and services to utilize the new env module for accessing environment variables, enhancing code clarity and maintainability.
- Removed direct process.env access in favor of the env object, ensuring consistent error handling and validation across the application.

* env fix

* refactor: update API route

- Ensured dynamic rendering is enforced for the invoice generation process.
2025-05-17 15:11:07 +02:00
Vlad Sazonau
6d347fc6cd
metadata updates (#110)
* chore: update asset URLs to use STATIC_ASSETS_URL for improved resource management

- Updated Open Graph image URLs in layout and About page metadata to utilize STATIC_ASSETS_URL for better asset delivery and cache management.
- Ensured consistency in asset references across the application by replacing hardcoded URLs with dynamic constructs.

* minor change

* fix: update metadata titles for consistency across application

- Revised the title in the main layout and About page metadata to include EasyInvoicePDF.com for improved branding and consistency.
- Adjusted Open Graph and Twitter card titles to reflect the new format, enhancing SEO and user experience.

* fix: update metadata and titles for improved branding consistency

- Revised titles and descriptions across multiple languages to include EasyInvoicePDF.com, enhancing brand visibility and consistency.
- Updated the E2E test title to reflect the new branding.
- Adjusted Open Graph metadata to ensure cohesive representation of the application.

* fix title

* fix: enhance metadata for improved branding consistency across multiple languages

- Updated titles, descriptions, and keywords in various language files to include the site name, enhancing brand visibility.
- Adjusted the layout file to utilize the new siteName property for Open Graph metadata, ensuring cohesive representation across the application.

* meta upd

* fix: update siteName in metadata for improved branding consistency across multiple languages

- Revised siteName entries in various language files to remove with Live Preview for a cleaner presentation.
- Adjusted the main layout metadata to reflect the updated siteName, ensuring cohesive branding across the application.

* fix: update page titles and metadata for improved branding consistency

- Revised the title in the About page and Invoice Generator page to reflect the new branding format.
- Updated layout metadata to ensure cohesive representation across the application.
- Enhanced E2E tests to verify the updated titles for better coverage and consistency.

* meta text upd
2025-05-12 13:28:33 +02:00
Vlad Sazonau
87534e4f17
chore: update routing and configuration for improved SEO and user exp… (#102)
* chore: update routing and configuration for improved SEO and user experience

- Refactored middleware to handle redirection from root to the homepage, enhancing navigation consistency.
- Updated Next.js configuration to include a redirects function for better routing management.
- Enhanced robots.txt to allow indexing of the root page while disallowing app-related paths.
- Improved sitemap generation to reflect the new routing structure.
- Removed deprecated patterns from ESLint configuration for cleaner code.
- Updated NotFound and Error components to provide user-friendly messages and links to the homepage.
- Added loading and error handling components to enhance user experience during data fetching.

* chore: update Playwright configuration and E2E tests for improved routing and timeout settings

- Reduced Playwright retries from 2 to 1 for CI environments to streamline test execution.
- Increased timeout for expect assertions from 25 seconds to 30 seconds to enhance reliability.
- Updated E2E tests to reflect new routing structure, changing expected URLs from /en/app to / for better consistency across tests.
- Modified video source URLs in tests to point to the new CDN for improved asset management.

* chore: update README and enhance PDF download link notifications

- Added new features section to README.md, highlighting live preview, shareable links, instant download, multi-language support, and European VAT calculation.
- Updated toast notification title and description in the PDF download link component to reflect user-friendly messaging about supporting the project.

* chore: update i18n schema and enhance E2E tests for routing validation

- Renamed i18n messages schema file for clarity and consistency.
- Added a new test to validate redirection from /:locale/app to / for improved routing accuracy.
- Enhanced Not Found page tests to verify correct URL handling for non-existent pages across multiple locales.
- Updated package.json to include a test script for Playwright, streamlining test execution.

* style upd

* chore: simplify middleware configuration for i18n routing

- Updated middleware to match only "/:locale/about" paths for internationalization.
- Removed unnecessary comments and streamlined the matcher configuration for clarity.

* chore: update ESLint configuration and add project description

- Removed deprecated patterns from ESLint configuration for cleaner code.
- Added a new file  with a detailed description of the EasyInvoicePDF project, highlighting its features and main pages.
- Simplified the NotFound and Error components by removing unnecessary comments and imports.

* fix: implement smooth scrolling behavior on mount in AppPageClient

- Restored the smooth scrolling effect to the top of the App page on component mount for improved user experience during navigation.
2025-05-05 21:18:29 +02:00
Vlad Sazonau
8ba995d276
chore: refactor middleware for root redirection and update configuration (#100)
* chore: refactor middleware for root redirection and update configuration

- Removed the redirects function from next.config.mjs and implemented custom middleware to handle redirection from the root path to /en/app.
- Updated robots.txt to disallow root indexing due to redirection.
- Enhanced sitemap generation by removing the root URL entry.
- Added JSON-LD schema for FAQ section in the About page to improve SEO.
- Updated package.json to include schema-dts for structured data handling.

* fix: update URL construction in AppPageClient to use window.location.origin for better compatibility

* fix: update About page content and JSON-LD schema for improved clarity and SEO

- Revised the description in the About page to enhance clarity regarding the tool's functionality.
- Updated the JSON-LD schema to include detailed information about the About page and its features, improving SEO and structured data representation.
- Adjusted the layout and styling of the About page for better responsiveness and user experience.

* fix: enhance scrolling behavior in About and App pages

- Updated the GoToAppButton component to disable default scrolling behavior on link click, ensuring consistent navigation experience.
- Implemented smooth scrolling to the top of the App page on mount, improving user experience during page transitions.

* fix: enhance JSON-LD schema in layout for improved SEO and clarity

* remove unused code

* fix: update middleware redirection status code from 301 to 308 for method preservation

* fix: update styling and accessibility in About page HeroSection

- Replaced checkmark icon with an emoji for improved accessibility.
- Updated gradient background for the browser chrome bar to enhance visual appeal.
- Adjusted color codes for the status indicators to maintain consistency and improve aesthetics.
2025-04-28 01:14:17 +02:00
VladSez
549fed296c chore: update package manager and Playwright timeout settings; enhance Sentry configuration for better environment checks
- Updated package manager version from pnpm@10.6.5 to pnpm@10.9.0 in package.json.
- Increased Playwright expect assertion timeout from 15 seconds to 25 seconds for improved test reliability.
- Refactored Sentry configuration in client, edge, and server files to utilize environment checks for enabling Sentry and DSN management, ensuring better performance and clarity in production environments.
2025-04-23 23:42:07 +02:00
Vlad Sazonau
f86dabee91
feat: i18n /about page, new translations and currencies and other improvements (#84)
* i18n init

* chore: update README and refactor localization messages

- Updated the analytics link in README.md to point to the new Umami dashboard.
- Refactored localization messages in en.d.json.ts to use consistent JSON formatting.
- Introduced a new config.ts file to manage application URL and port settings.
- Updated layout components to utilize APP_URL for metadata base URL.
- Added support for additional languages in the language switcher component.

* chore: update README and refactor localization messages

- Updated the analytics link in README.md to point to the new Umami dashboard.
- Refactored localization messages in en.d.json.ts to use consistent JSON formatting.
- Introduced a new config.ts file to manage application URL and port settings.
- Updated layout components to utilize APP_URL for metadata base URL.
- Added support for additional languages in the language switcher component.

* chore: change redirect to permanent: false in next.config.mjs

* feat: localize not-found page

* fix: languages

* refactor: update language handling and improve invoice form components

- Renamed MAP_LOCALE_TO_LABEL to MAP_LOCALE_TO_LANGUAGE for clarity in language switcher.
- Enhanced language selection logic in GeneralInformation component to handle unsupported languages gracefully.
- Adjusted invoice PDF download link styling for Portuguese language support.
- Updated translations to include additional languages (German, Spanish, Portuguese, Russian, Ukrainian) with proper formatting for invoice items table.

* chore: update .gitignore and .prettierignore for i18n files

- Added messages/en.d.json.ts to .gitignore to exclude localization files from version control.
- Created .prettierignore to prevent formatting of messages/en.d.json.ts for consistent localization handling.
- Updated INITIAL_INVOICE_DATA to set typeOfGTUFieldIsVisible to false for improved invoice form logic.

* fix

* chore: update Playwright configuration and improve invoice form tests

- Changed Playwright trace option from on-first-retry to retain-on-failure for better debugging.
- Updated invoice form test to ensure the PDF visibility toggle is unchecked by default.
- Removed redundant tooltip handling logic in seller test for cleaner code.
- Added new hero and project logos as SVG components for better asset management.
- Implemented smooth scrolling in global CSS for improved user experience.

* feat: enhance localization for About page and add new features

- Added comprehensive localization support for the About page in multiple languages (German, Spanish, Portuguese, Russian, Ukrainian).
- Introduced new features in the About section, including live preview, shareable links, instant download, multi-language support, VAT support, and open-source information.
- Updated the UI components to utilize localized strings for titles, descriptions, and buttons, improving user experience and accessibility.
- Refactored the About page to streamline the rendering of features and call-to-action sections with dynamic translations.

* feat: implement translation validation and enhance localization structure

- Added translation validation logic in next.config.mjs to ensure integrity of localization files.
- Introduced new schemas for i18n messages and translations using Zod for better type safety and validation.
- Updated invoice PDF template components to utilize the new TRANSLATIONS structure for improved localization handling.
- Enhanced Russian localization for the About page, updating titles and descriptions for consistency.
- Added jiti as a dependency for dynamic module loading in the validation process.

* refactor: enhance button components and improve layout responsiveness

- Refactored button components in the About and App pages to utilize the  prop for better integration with links.
- Updated layout classes for responsive design, ensuring proper alignment and spacing across different screen sizes.
- Adjusted the height of the language selector for improved usability.
- Optimized image attributes for better performance and accessibility.

* fix: e2e test

* minor fixes

* feat: add error handling component and enhance localization for error messages

- Introduced a new Error component for handling errors in the application, featuring user-friendly messages and Sentry integration for error tracking.
- Added comprehensive localization support for error messages in multiple languages (German, Spanish, Portuguese, Russian, Ukrainian), ensuring consistent user experience across different locales.
- Updated schemas for i18n messages to include error handling structure, improving type safety and validation.
- Refactored invoice form components to utilize new currency symbols and language labels for better clarity and usability.

* feat: enhance localization support and add new languages

- Updated English localization to include ten supported languages for invoice creation, improving clarity and user experience.
- Added French, Italian, and Dutch localization files, ensuring comprehensive language support across the application.
- Enhanced the language switcher component to accommodate new languages, improving accessibility and usability for users.
- Updated schema and translation files to reflect the new languages, ensuring type safety and validation consistency.

* feat: enhance localization and error handling for About page

- Updated localization files to include a new switchLanguage button text in multiple languages, improving user experience for language switching.
- Enhanced error handling by introducing a new Error component for better user feedback and Sentry integration.
- Improved metadata generation in the About page layout to handle errors gracefully, ensuring robust localization support.
- Refactored the LanguageSwitcher component to utilize localized button text, enhancing accessibility and usability.

* refactor: improve layout and localization handling in About and App pages

- Adjusted layout structure in the About page header for better responsiveness and alignment.
- Updated the LanguageSwitcher component to remove unnecessary locale display, enhancing clarity.
- Modified the Home component to pass locale as a prop to ProjectInfo, ensuring consistent localization support.
- Enhanced the Logo component's styling for improved visual consistency across different screen sizes.

* feat: enhance localization and add meta tags for About page

- Updated localization files to include a new tagline in multiple languages, improving user experience and consistency.
- Modified the About page to display the tagline dynamically, enhancing the overall layout and responsiveness.
- Added a new script in package.json for checking site metadata, improving development workflow.
- Introduced a new dependency for handling email sending, expanding functionality for future features.

* feat: implement newsletter subscription feature with localization support

- Added a new subscription action to handle user email subscriptions, including rate limiting and error handling.
- Created a confirmation page for verifying subscription tokens, enhancing user experience and security.
- Introduced a new SubscribeInput component for user input, featuring success and error messages.
- Updated localization files to include newsletter-related texts in multiple languages, improving accessibility.
- Enhanced the About and App pages to include newsletter subscription sections, promoting user engagement.

* feat: enhance localization for newsletter subscription messages

- Added email language information to localization files in multiple languages, improving user clarity regarding email communication.
- Updated SubscribeInput and related components to display the new email language info, enhancing user experience.
- Modified i18n schema to include email language information, ensuring type safety and validation consistency.

* feat: add robots and sitemap generation for SEO optimization

- Introduced robots.ts and sitemap.ts files to manage SEO directives and sitemap generation, enhancing search engine indexing.
- Configured robots.txt rules to allow indexing of specific routes while disallowing app-related paths, improving site visibility.
- Implemented dynamic sitemap generation based on supported languages, ensuring up-to-date indexing information for search engines.

* feat: enhance subscription token verification with rate limiting and error handling

- Implemented IP-based rate limiting for subscription token verification attempts, allowing a maximum of 5 attempts per hour per IP.
- Updated the verifySubscriptionToken function to include error messages for invalid token formats and rate limit exceedance.
- Enhanced the ConfirmSubscriptionPage to display specific error messages based on verification results, improving user feedback.

* fix: update email development script directory in package.json

- Modified the dev:email script to specify the directory for email templates, ensuring correct path usage during development.

* feat: enhance locale validation and static rendering in NotFound and layout components

- Implemented locale validation in NotFound and layout components to ensure only supported locales are processed, defaulting to 'en' for invalid locales.
- Updated setRequestLocale calls to enable static rendering, preventing dynamic server errors as per Next.js guidelines.
- Improved comments for clarity on locale handling and static rendering implications.

* feat: enhance invoice form tests and localization messages

* fix: update invoice form test selectors and localization messages

- Changed the role selectors for the Amount and Net Price fields in invoice form tests to include more descriptive names: Amount (Quantity) and Net Price (Rate or Unit Price).
- Updated localization messages in Portuguese to reflect the correct terminology for VAT support, enhancing clarity for users.
- Adjusted test cases to ensure they align with the updated field names, improving test accuracy and maintainability.

* feat: refactor NotFound component and introduce locale-specific handling

- Converted the NotFound component to support locale-specific rendering by creating a new locale-based NotFound component.
- Implemented locale validation to ensure only supported locales are processed, enhancing user experience.
- Updated comments for clarity on static rendering implications and locale handling.
- Added a catch-all page to handle undefined routes, improving navigation consistency.

* feat: add end-to-end tests for About page and Not Found page

- Introduced comprehensive Playwright tests for the About page, covering content visibility in English, French, and German, as well as language switching functionality.
- Implemented tests for the Not Found page to ensure proper error handling and navigation across multiple locales.
- Enhanced the About page components with data-testid attributes for improved testability.
- Updated the Not Found component comment for clarity on client-side rendering requirements.

* refactor: move Not Found page tests to a dedicated file

- Extracted Not Found page tests from the About page test file into a new dedicated test file for improved organization and maintainability.
- Retained existing test cases for various locales, ensuring comprehensive coverage of error handling and navigation.
- Updated the test structure to enhance clarity and separation of concerns in the test suite.

* feat: enhance About page tests and localization for newsletter subscription

- Added tests for the newsletter subscription form visibility and functionality in English and French, ensuring comprehensive coverage of user interactions.
- Updated footer links in tests to verify correct attributes and visibility for social media and feedback links.
- Enhanced localization files to include new button labels and feedback options across multiple languages, improving user experience and consistency.
- Refactored the SubscribeSection component to include an ID for easier test targeting and improved accessibility.

* fix(ci): update Playwright report path in e2e workflow

* feat: enhance invoice form with dynamic invoice number handling and localization

- Introduced InvoiceNumberHelperMessage component to provide user guidance on invoice number format and switching to default.
- Updated invoice number initialization in INITIAL_INVOICE_DATA to include localized labels.
- Enhanced language selection to automatically update the invoice number format based on the selected language.
- Improved invoice number validation in the schema to enforce character limits, ensuring better user input handling.

* chore: update .gitignore and refactor PDF test download handling

- Added 'playwright-test-downloads/' to .gitignore to prevent tracking of test downloads.
- Refactored PDF test download logic to improve directory handling and ensure recursive creation of download directories.
- Updated filename generation in InvoicePDFDownloadLink component to extract invoice number correctly for better file naming consistency.

* refactor: move default buyer and seller data to constants

- Refactored DEFAULT_BUYER_DATA and DEFAULT_SELLER_DATA from schema to constants for better organization and maintainability.
- Updated relevant test files and components to import default data from the new constants location.
- Improved clarity and separation of concerns in the codebase.

* fix: improve invoice number handling in general information section

- Updated invoice number splitting logic to correctly handle spacing after the colon for better parsing.
- Enhanced language change functionality to retain the invoice number suffix, improving user experience during language switching.

* fix: update invoice number suffix handling in general information section

- Modified invoice number suffix assignment to default to the current month and year if not provided, ensuring consistent formatting.
- Adjusted end-to-end test to reflect the updated invoice number format

* feat: integrate video demo functionality and update UI components

- Added Video component to handle video playback with intersection observer for performance optimization.
- Implemented video demo dialog in the Home and About pages to enhance user experience with a visual guide on invoice creation.
- Updated the About page to replace static image with video, improving engagement and interactivity.
- Introduced new easy-invoice-demo.mp4 and easy-invoice-hero.webp assets for the demo functionality.
- Refactored ProjectInfo component to include a button for accessing the demo video, enhancing user guidance.

* fix: update video component and tests for better playback handling

- Removed unnecessary condition from the e2e workflow for uploading Playwright reports.
- Enhanced the About page test to check for video attributes, ensuring proper visibility and functionality.
- Updated the Video component to include a testId prop for improved test targeting and added error handling for video playback.
- Implemented cleanup logic in the Video component to handle playback errors gracefully during component unmounting.

* fix: enhance About page tests for language navigation

* fix: increase timeout for Playwright expect assertions to improve test reliability

* fix: increase Playwright retries and e2e workflow timeout for improved test stability

* feat: add loading skeleton component and About page loading state

- Introduced a new Skeleton component for loading placeholders.
- Implemented AboutLoading component to display loading state for the About page, enhancing user experience during data fetching.
- Structured the layout with responsive design using Tailwind CSS, ensuring a consistent look across devices.

* fix: update metadata titles and descriptions for localization

- Modified titles in the metadata section for various languages to include About for clarity.
- Updated VAT support descriptions to specify European VAT for better accuracy across multiple languages.
- Removed redundant meta objects from the About section in localization files to streamline the structure.

* feat: refactor invoice number handling to support object structure

- Updated invoice number management to use an object with label and value, enhancing clarity and flexibility.
- Modified relevant components and tests to accommodate the new structure, ensuring consistent data handling across the application.
- Implemented breaking change handling for legacy invoice number format, improving backward compatibility.
- Enhanced form validation and error messaging for the new invoice number fields.

* feat: enhance routing and SEO configurations

- Updated ESLint configuration to restrict imports from @react-pdf/renderer to the browser-specific version for better compatibility.
- Modified Next.js routing to redirect root to /en/app, ensuring a permanent redirect for improved SEO.
- Enhanced robots.txt to allow indexing of the root and about pages while disallowing app routes and subscription confirmation pages.
- Refactored sitemap generation to include the new app route and ensure proper indexing of allowed pages.
- Updated metadata in layout and confirm subscription pages to manage indexing behavior effectively

* feat: update ESLint rules and refactor navigation imports

- Enhanced ESLint configuration to restrict imports from  and , directing to  for improved routing consistency.
- Updated various components to use the new navigation imports and adjusted link paths to  for better user experience.
- Ensured proper error handling and user-friendly messages in the NotFound and Error components.

* fix: improve styles

* feat: add GitHub Actions workflow for E2E test failure notifications

- Introduced a new workflow to notify via GitHub issue when Playwright E2E tests fail.
- The workflow triggers on completion of the E2E tests and creates an issue with relevant details, enhancing visibility on test failures.

* chore: remove GitHub Actions workflow for E2E test failure notifications

* chore: update E2E workflow to send email notifications and adjust URL in tests

- Added email notification step to the E2E workflow, sending results of Playwright tests to a specified email.
- Updated the expected URL in the not-found-page test from /en/app to /pl/app for localization consistency.

* chore: enhance E2E workflow to calculate and report test duration

- Added duration calculation for Playwright tests in the E2E workflow, outputting the formatted duration to GitHub Actions.
- Updated email notification to include the duration of the test run for better insights.

* ci improve

* ci improve

* ci improve

* chore: refactor project structure and add utility types

- Removed unused image file .
- Introduced new TypeScript utility types in  for better type handling.
- Updated import paths in  and  to use the new  directory structure.
- Added common error handling components in .
- Refactored invoice-related utility functions into .
- Implemented rate limiting functionality in  and Redis connection in .
- Cleaned up unused utility functions in .

* feat: add FAQ section to About page and update translations

- Implemented a new FAQ section in the About page, enhancing user experience by providing answers to common questions.
- Added corresponding translations for the FAQ section in multiple languages (de, en, es, fr, it, nl, pl, pt, ru, uk).
- Updated E2E tests to verify visibility of the FAQ section and its links.

* feat: integrate react-aria-components for enhanced disclosure functionality

- Added  to the project dependencies for improved accessibility and UI interactions.
- Implemented a new  component in the About page, replacing the previous accordion structure with a more accessible disclosure pattern.
- Updated FAQ section to utilize the new disclosure components, enhancing user experience and maintainability.
- Adjusted styles for better responsiveness and visual consistency.

* feat: enhance error handling for shared invoice URL

- Added user-friendly error notification when the shared invoice URL is incorrect.
- Implemented a toast message with a clear button to redirect users back to the homepage, improving user experience and error management.

* feat: update translations for multi-language support and customization options
2025-04-19 19:56:32 +02:00
Vlad Sazonau
8ba571bdcb
chore: remove @openpanel/nextjs dependency and update Sentry configuration for production environment (#85)
- Removed the @openpanel/nextjs dependency from package.json to streamline the codebase.
- Updated Sentry configuration in client, edge, and server files to use NODE_ENV instead of VERCEL_ENV for production checks.
- Refactored error handling in invoice form tests to improve clarity and maintainability.
- Enhanced error toast messages for better user guidance during PDF generation failures.
2025-03-31 17:38:10 +02:00
Vlad Sazonau
e6f54d5dfc
feat: add e2e tests with playwright and other improvements (#79)
* feat: Add language attribute to date input fields in invoice form components

- Include `lang="en"` attribute in date input fields of `InvoiceForm` and `GeneralInformation` components for improved accessibility and localization support.

* fix: Update language attribute for date input fields in invoice form components

* refactor: Improve layout and organization of invoice components

- Remove unnecessary margin from the main container in the Home component.
- Wrap the share invoice button and PDF download link in a fragment for better structure.
- Adjust margins for the ProjectInfo and action button container for improved spacing.
- Update the InvoicePDFViewer height to use full height for better responsiveness.
- Remove the deprecated RegenerateInvoiceButton component to streamline the codebase.
- Update the InvoiceClientPage to accept handleShareInvoice prop for better functionality.
- Clean up unused language attributes in date input fields across invoice form components.

* feat: Integrate Playwright for end-to-end testing and enhance invoice form components

- Add Playwright configuration and dependencies for E2E testing.
- Create GitHub Actions workflow for automated E2E tests on deployment.
- Implement initial E2E tests for the Invoice Generator Page, verifying UI elements and form functionality.
- Refactor invoice form components to include data-testid attributes for better testability.
- Update .gitignore to exclude Playwright-related files and directories.

* chore: Update GitHub Actions workflow for E2E testing and enhance test coverage

- Upgrade pnpm version from 8 to 10 in the E2E workflow for improved package management.
- Add new test case to verify header buttons and links on the Invoice Generator Page, ensuring UI elements are displayed correctly and have the expected attributes.

* chore: Enhance ESLint configuration for Playwright integration

- Add Playwright ESLint plugin to package.json for improved E2E testing support.
- Update .eslintrc.json to include overrides for E2E test files.
- Clean up GitHub Actions workflow by removing unnecessary pnpm version specification.

* chore: Update Playwright configuration and improve test assertions

- Increase timeout for expect assertions and test execution from 15 seconds to 30 seconds for better stability in E2E tests.
- Comment out mobile viewport tests to streamline configuration and focus on desktop testing.

* chore: Update configuration and refactor invoice form components

- Add compiler options to remove console logs in production and enhance logging for fetch requests in next.config.mjs.
- Update package.json to include new type definitions for ua-parser-js and add ua-parser-js as a dependency.
- Refactor invoice form components to remove form prefix IDs, simplifying data-testid attributes for better testability.
- Introduce DeviceContext for managing device type state and improve responsiveness in invoice form components.
- Implement server-side device detection using user agent parsing for better rendering on mobile and desktop views.
- Update media query hooks to streamline device type checks across components.

* chore: Update Playwright configuration and enhance invoice form tests

- Reduce timeout for expect assertions from 30 seconds to 15 seconds for improved test performance.
- Add new test for handling currency switching in the Invoice Generator Page, verifying correct currency display and calculations.
- Refactor buyer and seller information components to include tooltip messages and improve accessibility with aria attributes.
- Update BuyerDialog and BuyerManagement components to enhance user experience with better visibility and edit functionality for buyer details.

* chore: Update Playwright installation command in GitHub Actions workflow

- Modify Playwright installation command to remove explicit browser specification, allowing for default browser installation with dependencies.

* chore: Update GitHub Actions E2E workflow for Playwright report handling

- Change condition for uploading Playwright report to ensure it uploads regardless of test outcome.
- Reduce retention days for uploaded reports from 5 to 3 for better resource management.

* chore: Update Playwright installation command in GitHub Actions workflow

- Specify installation of Chromium and WebKit browsers along with dependencies for enhanced testing capabilities.

* chore: Enhance E2E tests for seller and buyer management functionality

- Add tests to verify the deletion process for sellers and buyers, including confirmation dialogs and success messages.
- Ensure localStorage data is correctly saved and parsed for both seller and buyer information.
- Introduce default data constants for sellers and buyers to streamline test setup.
- Improve accessibility by adding screen reader text for delete buttons in the seller management component.

* chore: Pin versions of GitHub Actions in E2E workflow for stability

- Update actions/checkout, pnpm/action-setup, actions/setup-node, and actions/upload-artifact to specific versions for improved reliability and security.
- Comment added to clarify the rationale for using pinned versions.

* chore: Add E2E test for accordion items visibility and localStorage state management

- Implement test to verify that accordion items are visible, collapsible, and their state is correctly saved in localStorage.
- Ensure state persistence across page reloads and validate updated states after toggling sections.
- Introduce ACCORDION_STATE_LOCAL_STORAGE_KEY and AccordionState type for better type safety and clarity.

* chore: Update Playwright configuration and add comprehensive E2E tests for seller and buyer management

- Increase timeout for expect assertions and test execution from 30 seconds to 60 seconds for improved stability in E2E tests.
- Introduce new E2E tests for seller and buyer management, covering creation, editing, and deletion processes, including confirmation dialogs and success messages.
- Ensure localStorage data is correctly saved and parsed for both seller and buyer information.
- Implement detailed validation for form fields and visibility toggles in seller and buyer management dialogs.
- Enhance accessibility by adding screen reader text for buttons and tooltips in the management components.

* chore: Refactor Playwright configuration and enhance invoice item validation tests

- Introduce a constant for timeout values in Playwright configuration for consistency and maintainability.
- Add comprehensive validation tests for amount, net price, and VAT fields in the invoice items section, ensuring proper error messages for invalid inputs.
- Update expected error messages in the schema to match the new formatting for better clarity.
- Improve test structure by utilizing descriptive variable names and modularizing input handling for better readability.

* chore: add pdf e2e tests

- Add `pdf-parse` and its type definitions to package.json for PDF handling capabilities.
- Increase Playwright timeout from 30 seconds to 60 seconds for improved test stability.
- Introduce comprehensive E2E tests for PDF generation, verifying content in both English and Polish.
- Implement cleanup procedures for test downloads to ensure a clean testing environment.
- Validate invoice data updates in the generated PDF, ensuring accurate content reflects user inputs.

* chore: add eslint, knip, lint-staged

* chore: run prettier

* chore: minor improvements

* chore: add more test and improved e2e config

* minor fixes

* minor fixes

* chore: add new test
2025-03-27 21:41:55 +01:00
Vlad Sazonau
1b3aa79553
feat: Add multi-language PDF download feature with multi-select component and create/edite/delete buyer (#73)
* feat: Add multi-language PDF download feature with advanced UI components

- Implement `InvoicePDFDownloadMultipleLanguages` component for downloading PDFs in multiple languages
- Create new UI components: `MultiSelect`, `Badge`, `Command`, `Popover`, and `Separator`
- Add language selection dropdown with advanced interaction and download capabilities
- Integrate custom tooltip and button styling for enhanced user experience
- Implement ZIP archive generation for multiple language PDFs
- Add PRO feature placeholder with commented-out code for future release

* feat: Implement Buyer Management with Local Storage and Form Validation

- Add `BuyerManagement` component for creating, editing, and deleting buyers
- Implement `BuyerDialog` for comprehensive buyer data management
- Integrate Zod schema validation for buyer data
- Add local storage persistence for buyer information
- Include error handling, analytics tracking, and Sentry error logging
- Replace placeholder "New Buyer" button with fully functional management system
- Update invoice form to support dynamic buyer selection and management

* chore: Add Node.js and pnpm version constraints to package.json

- Specify minimum Node.js version as 20.0.0
- Set pnpm package manager version to 10.5.0
- Add `engines` field to enforce development environment compatibility

* chore: Remove pnpm version constraint from package.json

- Remove explicit pnpm version requirement
- Maintain Node.js version constraint
- Simplify package manager configuration

* chore: Upgrade @react-pdf dependencies to latest versions

- Update @react-pdf/renderer from 4.2.4 to 4.3.0
- Remove @react-pdf/layout dependency

* style: Enhance MoneyInput component styling with subtle shadow and improved text color
2025-03-08 23:31:51 +01:00
Vlad Sazonau
6eb6c3aaba
feat: add more sentry captures (#70)
* feat: add more sentry captures

- Add Sentry exception capturing in error handling for multiple components
- Remove redundant logging statements
- Update error handling in various files with Sentry error tracking
- Improve error logging and tracking consistency
- add axiom to middleware

* chore: remove next-axiom logging and related dependencies

* chore: Update dependencies and add Vercel Speed Insights

* remove log.error

* feat: Enhance invoice form with mobile-friendly layout and unique form field identifiers

- Add new `InvoiceClientPage` component to manage mobile and desktop invoice form layouts
- Implement dynamic form field identifiers for mobile and desktop views
- Improve accessibility by generating unique IDs for form inputs
- Refactor invoice form to support multiple view modes
- Add project logo and branding to the main page
- Update component structure to support responsive design

* chore: minor tweaks

* minor tweak

* fix: Correct SVG attribute naming in project logo component

* fix: Improve invoice PDF document title
2025-03-05 22:05:06 +01:00
Vlad Sazonau
f135814eaf
feat: Integrate Sentry for comprehensive error monitoring and tracking (#66)
- Add Sentry configuration for client, server, and edge runtime environments
- Configure error tracking with sampling rates and performance monitoring
- Implement global error handling with Sentry exception capturing
- Add instrumentation for Next.js runtime error tracking
- Update Next.js configuration to support Sentry integration
- Add Sentry-related dependencies to package.json
2025-03-01 23:52:12 +01:00
Vlad Sazonau
b4bbf3370a
feat: Add Axiom logging and enhance error tracking across application + update invoice form styles (#65)
* feat: Add Axiom logging and enhance error tracking across application + update invoice form styles

- Integrate next-axiom for comprehensive logging and web vitals tracking
- Add logging for various error scenarios in invoice generation, form interactions, and PDF downloads
- Implement error logging in seller management, invoice form, and error page
- Create a reusable ErrorGeneratingPdfToast component
- Add web vitals tracking with AxiomWebVitals component
- Enhance analytics and error tracking with detailed log messages

* feat: Enhance error logging
2025-03-01 22:31:09 +01:00
Vlad Sazonau
1dac29c124
feat: Add mobile-friendly tabs for invoice form and PDF preview (#64)
* feat: Add mobile-friendly tabs for invoice form and PDF preview

- Implement Radix UI Tabs component for responsive invoice page layout
- Add dynamic tabs for mobile view with "Edit Invoice" and "Preview PDF" options
- Conditionally render form and PDF viewer based on selected tab
- Include icons for tab triggers to improve visual clarity
- Maintain existing desktop side-by-side layout for larger screens
- Add new Tabs UI component with custom styling

* feat: Enhance invoice form with accordion state persistence and UI refinements

- Add localStorage-based accordion state management for invoice form sections
- Implement accordion state schema with Zod for validation
- Refactor ProjectInfo component in main page
- Improve button and layout styling with responsive margins
- Add fallback for accordion state initialization
- Optimize UI components with consistent spacing and helper messages
2025-02-28 22:14:37 +01:00
Vlad Sazonau
ac5a6f4510
feat: add Radix UI Accordion to invoice form for improved section organization (#56) 2025-02-23 18:29:49 +01:00
Vlad Sazonau
47357962c7
chore: add open panel for analytics (#54)
* chore: add open panel for analytics

* refactor: replace loglib with OpenPanel for analytics tracking

* docs: add support link to README
2025-02-23 01:21:35 +01:00
Vlad Sazonau
bed431f553
feat: save sellers for future use, enhance invoice form with advanced input validation and user experience improvements (#47)
* feat: add seller management with local storage and dialog components

- Introduced new components for managing sellers: SellerManagement and SellerDialog
- Implemented local storage hook (useLocalStorageEntities) for persistent seller data
- Added ability to add, edit, and delete sellers with form validation
- Created new Radix UI dialog and alert dialog components
- Updated invoice form schema to support seller management
- Enhanced invoice form with seller selection and management functionality

* feat: enhance invoice form with advanced input validation and user experience improvements

- Added rich color toasts for form validation errors
- Improved input validation with max length and range constraints
- Enhanced input preview and helper messages for amounts and prices
- Implemented amount-in-words preview for net prices
- Updated PDF template formatting for better readability
- Refactored media query hook and utility functions
- Added more descriptive error messages and input guidance

* feat: extract default seller data and improve seller selection UX

- Created DEFAULT_SELLER_DATA constant in schema for reusable default seller configuration
- Updated seller management component to use default seller data
- Enhanced seller selection dropdown with improved styling and placeholder text
- Simplified seller reset logic across components
2025-02-22 22:27:18 +01:00
Vlad Sazonau
60cdb7d344
feat: Show/hide columns on pdf, add og image, tooltips + other improvements (#36)
* feat: enhance invoice form with new UI components and visibility controls

- Added Radix UI Switch and Tooltip components for improved interactivity
- Introduced field visibility toggles for invoice items
- Added input helper messages for better user guidance
- Updated schema to support new field visibility options
- Refined styling and responsiveness of form elements
- Improved tooltips and helper text across the invoice form

* feat: add comprehensive invoice field visibility controls and date formatting options

- Introduced granular field visibility switches for invoice items and sections
- Added support for multiple date format options
- Enhanced invoice form with dynamic field visibility toggles
- Updated PDF template to conditionally render fields based on visibility settings
- Improved date handling and formatting across invoice generation
- Added validation and helper messages for date-related fields
- Expanded schema to support more flexible invoice configuration

* refactor: update invoice PDF template column styles

- Replaced commented-out column width styles with flex-based layout
- Adjusted column width proportions for better table readability
- Simplified column width definition using flex properties

* chore: upd deps + minor fixes

* fix: improve net price validation error message

* refactor: improve invoice form field rendering and localization

- Reordered error and helper message rendering for better UX
- Added currency context to labels for clarity
- Updated input step and type attributes for improved validation
- Localized numeric inputs with toLocaleString for consistent formatting
- Made unit field optional in invoice item schema

* refactor: improve invoice PDF download and regeneration UX

- Replaced PDFDownloadLink with usePDF hook for better loading state management
- Added loading states and animations for PDF download and regeneration buttons
- Created a new RegenerateInvoiceButton component with improved error handling
- Simplified dynamic imports and component structure
- Enhanced user feedback during PDF generation process

* refactor: optimize imports and remove unused components in invoice page

* refactor: extract loading timeout constant for consistent UX
2025-02-10 22:25:47 +01:00
Vlad Sazonau
a342935e78
feat: update dependencies and enhance invoice form functionality (#14)
* feat: update dependencies and enhance invoice form functionality

- Added new dependencies: @radix-ui/react-label, @radix-ui/react-slot, class-variance-authority, clsx, sonner, tailwind-merge, and tailwindcss-animate.
- Updated package.json and pnpm-lock.yaml to reflect new versions.
- Enhanced the invoice form with improved error handling and UI components.
- Integrated a toast notification system for better user feedback.
- Updated the PDF download link to include invoice language in the filename.
- Improved layout and styling in the invoice form and PDF template components.
- Refactored state management for invoice data to streamline data loading from URL and local storage.

* feat: add Prettier configuration and update project files

- Introduced a Prettier configuration file (.prettierrc.js) for consistent code formatting.
- Updated package.json to include Prettier and its Tailwind CSS plugin as dependencies.
- Made minor formatting adjustments across various components and configuration files for improved readability and consistency.
- Enhanced the loading and invoice form components with better styling and layout adjustments.
- Ensured all JSON files and configuration files have proper formatting and structure.

* feat: enhance invoice sharing and download experience

- Updated toast notification to include rich text formatting for better user guidance on sharing invoices.
- Increased toast duration for improved visibility.
- Refactored layout of the invoice regeneration and download button for better mobile responsiveness.
- Added conditional rendering for the PDF download link based on mobile view.
- Improved styling consistency across components.

* feat: implement responsive PDF download link and add media query hook

- Introduced a custom hook `useMediaQuery` to manage responsive behavior.
- Updated the `InvoicePDFDownloadLink` component to remove mobile-specific prop and enhance styling.
- Modified the main page to conditionally render the PDF download link based on desktop view.
- Enabled server-side rendering for the PDF download link for improved performance.

* feat: enhance invoice PDF layout and translations

- Added a new center style to align content in the invoice items table.
- Updated the invoice items table to apply the center style for better visual alignment of headers.
- Modified translations for 'netAmount' and 'netPrice' to include line breaks for improved readability in the PDF output.

* fix: update link in footer to point to new personal website

* feat: add contact link to footer for user engagement
2025-01-13 22:38:54 +01:00
VladSez
141df9fd4b feat: change analytics lib + minor fixes 2024-11-30 15:36:33 +01:00
VladSez
c6418457ac chore: add metadata + minor fixes 2024-11-30 00:57:44 +01:00
VladSez
04437e829e wip 2024-11-28 23:55:20 +01:00
VladSez
db3c637fb0 Initial commit from Create Next App 2024-10-20 21:26:41 +02:00