Skip to content

Vldszn/2025 07 24 migrate to tailwind 4 and tailwind eslint plugin#125

Open
VladSez wants to merge 2 commits intomainfrom
vldszn/2025-07-24_migrate-to-tailwind-4-and-tailwind-eslint-plugin
Open

Vldszn/2025 07 24 migrate to tailwind 4 and tailwind eslint plugin#125
VladSez wants to merge 2 commits intomainfrom
vldszn/2025-07-24_migrate-to-tailwind-4-and-tailwind-eslint-plugin

Conversation

@VladSez
Copy link
Copy Markdown
Owner

@VladSez VladSez commented Jul 24, 2025

Summary by CodeRabbit

  • Style

    • Reformatted all CSS class assignments across the app to use multiline template literals for improved readability and consistency.
    • Minor adjustments to the order and style of some utility classes (e.g., shadow, focus, and RTL classes).
    • Updated several shadow and focus styles for enhanced visual consistency.
  • Chores

    • Upgraded and added development dependencies for Tailwind CSS, ESLint, and related plugins.
    • Updated and reorganized ESLint and Prettier configurations for improved linting and formatting.
    • Adjusted VSCode workspace settings for Tailwind CSS and linting compatibility.
  • Refactor

    • Replaced or removed legacy Tailwind configuration and global CSS files, introducing a new global stylesheet with expanded theming, dark mode, and animation support.
    • Simplified PostCSS configuration for plugin management.
  • Bug Fixes

    • Ensured compatibility with Tailwind CSS v4 and improved border color consistency across themes.
  • Documentation

    • No user-facing documentation changes included.

@changeset-bot
Copy link
Copy Markdown

changeset-bot bot commented Jul 24, 2025

⚠️ No Changeset found

Latest commit: b2a4610

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@vercel
Copy link
Copy Markdown

vercel bot commented Jul 24, 2025

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
pdf-invoice-generator ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jul 24, 2025 9:58pm

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Jul 24, 2025

Walkthrough

This update introduces comprehensive changes to the project's styling infrastructure and codebase. It migrates Tailwind CSS configuration from a TypeScript config file to a global CSS file, updates dependencies and linting configurations for Tailwind v4 compatibility, and systematically refactors all JSX className assignments to use multiline template literals. Minor adjustments to shadow, focus, and utility classes are made for consistency. No functional logic is altered.

Changes

Files/Groups Change Summary
tailwind.config.ts, src/app/globals.css, src/globals.css Tailwind config file deleted; new global CSS file added with custom properties, themes, animations, and utilities.
package.json, postcss.config.mjs Tailwind, PostCSS, and related dependencies upgraded and consolidated for v4; new plugins and parser added.
eslint.config.mjs, .prettierrc.js, .vscode/settings.json Linting and formatting configs updated for Tailwind v4, ESM compatibility, and better Tailwind linting.
components.json, src/app/layout.tsx Tailwind CSS entry and global CSS import paths updated for new structure.
src/app/globals.css, src/app/(app)/components/, src/components/ All className strings refactored to multiline template literals; minor utility class adjustments (e.g., shadows).
src/app/(app)/, src/app/[locale]/, src/app/changelog/* ClassName attributes in all pages/components converted to template literals; no logic changes.
src/components/ui/, src/components/etc/ UI and utility components' className strings reformatted; minor reordering and shadow/focus utility tweaks.
src/app/api/generate-invoice/* Minor: blank line added and logging on rate limit exceeded.
tailwind.config.ts Tailwind config file removed; theming and animation now in global CSS.

Sequence Diagram(s)

sequenceDiagram
    participant Dev as Developer
    participant Tailwind as Tailwind CSS
    participant App as Application Components
    participant GlobalCSS as src/globals.css

    Dev->>Tailwind: Remove tailwind.config.ts
    Dev->>GlobalCSS: Add comprehensive global CSS with custom properties, themes, and utilities
    Dev->>App: Refactor all className strings to multiline template literals
    App->>GlobalCSS: Import and use global CSS for all styling and theming
    App->>Tailwind: Use Tailwind classes via global CSS, no direct config
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Poem

A bunny hopped through fields of code,
With Tailwind’s breeze, the styles bestowed.
Out went the config, in came the theme,
Multiline classes—so neat and clean!
Now every page and every view,
Is styled anew with pastel hue.
🐇✨

Note

⚡️ Unit Test Generation is now available in beta!

Learn more here, or try it out under "Finishing Touches" below.

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch vldszn/2025-07-24_migrate-to-tailwind-4-and-tailwind-eslint-plugin

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai generate unit tests to generate unit tests for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@socket-security
Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Updatedeslint-config-next@​15.2.3 ⏵ 15.4.39910063 +198100
Added@​typescript-eslint/​parser@​8.38.01001006997100
Updatedknip@​5.55.1 ⏵ 5.62.098 +110092 +795100

View full report

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 16

🔭 Outside diff range comments (3)
src/app/(app)/components/invoice-pdf-download-multiple-languages.tsx (1)

93-97: Slash in zipFileName will break downloads on Windows.

You correctly normalised invoiceNumberFormatted, but the zip filename still uses the raw invoiceNumber, so "2024/07" becomes an invalid path part.

-      const zipFileName = `invoice-${invoiceNumber}-${languages}-archive.zip`;
+      const zipFileName = `invoice-${invoiceNumberFormatted}-${languages}-archive.zip`;
src/components/seller-dialog.tsx (1)

1-4: Missing "use client" directive – this component will break in RSC mode

SellerDialog makes heavy use of useState, useEffect, localStorage, etc.
Without the "use client" pragma Next.js will treat the file as a Server Component and compilation will fail at runtime.

+/* eslint-disable @next/next/no-document-import-in-page */
+'use client';
 import { Button } from "@/components/ui/button";
src/app/(app)/components/invoice-form/sections/invoice-items.tsx (1)

120-139: Absolute delete-button container can overflow on small screens

Using -top-10 -right-3 may push the button outside the scrollable viewport on mobile. Consider using an inset inside the fieldset header (top-2 right-2) or wrapping the fieldset in relative padding.

♻️ Duplicate comments (1)
src/components/ui/money-input.tsx (1)

118-120: Same invalid ring-3 utility as flagged earlier

This instance has the same issue described in the Textarea component. Please replace or extend the Tailwind config.

🧹 Nitpick comments (19)
src/globals.css (2)

78-115: Consider consolidating duplicate theme definitions.

There appear to be two @theme blocks with overlapping variable definitions. The first @theme inline block (lines 78-115) and the second @theme block (lines 126-171) both define radius and color variables.

Consider consolidating these into a single @theme block to avoid redundancy:

-@theme inline {
-  --color-background: var(--background);
-  /* ... other color mappings ... */
-  --radius-sm: calc(var(--radius) - 4px);
-  --radius-md: calc(var(--radius) - 2px);
-  --radius-lg: var(--radius);
-  --radius-xl: calc(var(--radius) + 4px);
-  /* ... other mappings ... */
-}

@theme {
  --color-background: var(--background);
  --color-foreground: var(--foreground);
  /* ... all mappings consolidated here ... */
  
  --radius-lg: var(--radius);
  --radius-md: calc(var(--radius) - 2px);
  --radius-sm: calc(var(--radius) - 4px);
  
  --animate-accordion-down: accordion-down 0.2s ease-out;
  --animate-accordion-up: accordion-up 0.2s ease-out;
  --animate-heartbeat: heartbeat 3s ease-in-out infinite 25s;
  
  /* keyframes stay the same */
}

Also applies to: 126-171


200-202: Consider making font family more flexible.

The hardcoded Arial font family might be too restrictive. Consider using a more flexible font stack or CSS custom property.

body {
-  font-family: Arial, Helvetica, sans-serif;
+  font-family: var(--font-sans, system-ui, -apple-system, sans-serif);
}

Or define it as a custom property in the :root selector for better customization.

src/app/(app)/components/invoice-pdf-download-multiple-languages.tsx (1)

114-115: Remove stale commented prop.

variant="inverted" looks obsolete after the MultiSelect refactor. Commented code adds noise and tends to rot—delete it unless it will be re-enabled imminently.

-        // variant="inverted"
.vscode/settings.json (1)

2-8: Consider switching eslint fix-on-save from “explicit” to “always”.

"source.fixAll.eslint": "explicit" requires the user to manually pick the quick-fix command instead of running automatically on every save.
For teams that expect lint errors to be fixed automatically on save (the common convention), change the value to "always".

-    "source.fixAll.eslint": "explicit"
+    "source.fixAll.eslint": "always"

This prevents “why didn’t my classes get re-ordered?” confusion and aligns with the zero-friction DX you’re setting up with Tailwind-aware linting.

src/components/ui/alert-dialog.tsx (1)

115-118: Minor: follow existing cn style for single-line literals.

For consistency with the rest of the file (e.g. AlertDialogTitle) wrap these shorter class lists as plain strings:

-    className={cn(`
-      text-sm text-slate-500
-      dark:text-slate-400
-    `, className)}
+    className={cn("text-sm text-slate-500 dark:text-slate-400", className)}

Same for mt-2 sm:mt-0 block below.

Also applies to: 146-148

src/app/changelog/layout.tsx (2)

149-172: Avoid the extra div.container wrapper – Tailwind already scopes width.

The header now contains:

<div class="container h-auto px-3 py-2 ...">
  <div class="flex h-full ...">

container already applies horizontal padding, so the outer px-3 duplicates padding and shrinks the layout at small breakpoints.

-        <div className={`
-          container h-auto px-3 py-2
-          sm:h-16 sm:py-0
-        `}>
+        <div className={`
+          container h-auto py-2
+          sm:h-16 sm:py-0
+        `}>

Keeps spacing identical while avoiding double-padding.


192-195: Prefer semantic size utilities over manual padding duplication.

BlackGoToAppButton accepts className – the component already sets px-3 sm:px-8.
Passing the same values from the parent couples layout too tightly; leave it empty unless you want to override defaults.

-              <BlackGoToAppButton className={`
-                px-3
-                sm:px-8
-              `}>
+              <BlackGoToAppButton>
src/components/ui/disclosure.tsx (2)

97-100: Reuse the shared cn util for consistency & plugin support.

Using a raw template literal here bypasses twMerge and the Tailwind ESLint rule configured to watch cn().
Switch to:

-                    className={`
-                      ml-auto size-6 shrink-0 rounded-full p-1 transition-all duration-200
-                      hover:bg-gray-200
-                    `}
+                    className={cn(
+                      "ml-auto size-6 shrink-0 rounded-full p-1 transition-all duration-200",
+                      "hover:bg-gray-200"
+                    )}

This keeps class-deduplication consistent and silences no-unregistered-classes.


133-136: Same cn() / linting point applies to panel padding.

-        className={`
-          pt-2 pr-4 pb-4 pl-0
-          [&:has([data-slot=disclosure-group])_&]:px-11
-        `}
+        className={cn(
+          "pt-2 pr-4 pb-4 pl-0",
+          "[&:has([data-slot=disclosure-group])_&]:px-11"
+        )}

Maintains merge safety and linter compatibility.

src/components/go-to-app-button-cta.tsx (1)

27-30: Micro-nit: drop template literal for a single string

The ArrowRight icon only receives two classes. Wrapping them in a multiline template literal adds six bytes and an extra parsing step with no readability gain.

-<ArrowRight className={`
-  mr-2 h-5 w-5 transition-transform
-  group-hover:scale-110
-`} />
+<ArrowRight className="mr-2 h-5 w-5 transition-transform group-hover:scale-110" />
src/components/ui/label.tsx (1)

15-20: Order violation flagged by ESLint Tailwind plugin

text-xs font-medium text-balance … breaks the enforced class-order rule (typography classes should follow layout/display). Either:

  1. Re-order to satisfy better-tailwindcss/enforce-consistent-class-order, or
  2. Downgrade the rule severity for this file if you deliberately keep logical grouping.

Keeps the CI green and avoids noisy diffs later.

src/components/ui/tooltip.tsx (1)

48-50: Class string inside template literal contains redundant back-ticks

Unlike the big block above, this is a single-line literal; a normal string is clearer.

-<TooltipPrimitive.Arrow
-  className={`my-px border-slate-200 fill-white drop-shadow-[0_1px_0_hsl(var(--border))]`}
/>
+<TooltipPrimitive.Arrow className="my-px border-slate-200 fill-white drop-shadow-[0_1px_0_hsl(var(--border))]" />
src/app/(app)/components/invoice-form/sections/seller-information.tsx (1)

166-171: Factor out duplicated switch classes

The identical five-line template literal is repeated four times. Extracting it into a const switchBase = \...`` keeps the file DRY and guarantees all toggles stay visually consistent after future tweaks.

- className={`
-   h-5 w-8
-   [&_span]:size-4
-   data-[state=checked]:[&_span]:translate-x-3
-   data-[state=checked]:[&_span]:rtl:-translate-x-3
- `}
+ className={switchBase}

Small refactor, big maintenance win.

Also applies to: 274-279, 351-356, 429-434

src/components/subscribe-input.tsx (2)

70-71: Class-order rule still fails – run eslint --fix

better-tailwindcss/enforce-consistent-class-order expects animate-in first, then effect utilities, then duration.
Running eslint --fix will auto-sort; keeping the rule green avoids CI noise.


105-107: Nit: avoid anonymous template literals for one-liner

The icon wrapper only contains positioning & color — a plain string keeps the file smaller:

-<Mail className={`
-  absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2 text-muted-foreground
-`} />
+<Mail className="absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" />
src/app/[locale]/about/page.tsx (1)

176-181: Header container classes duplicated across files – extract constant

container h-auto px-3 py-2 sm:h-16 sm:py-0 appears in multiple pages; exporting a SiteHeader or headerBase constant keeps the design system single-source.

src/app/(app)/components/invoice-form/sections/invoice-items.tsx (1)

72-77: Switch base classes repeated 11× – factor out for maintainability

The five-line template literal defining size & transform is copy-pasted for every Switch. Move it to:

const switchBase =
  "h-5 w-8 [&_span]:size-4 data-[state=checked]:[&_span]:translate-x-3 data-[state=checked]:[&_span]:rtl:-translate-x-3";

and then className={switchBase} – easier to tweak later.

src/components/ui/command.tsx (1)

130-134: Minor: back-ticks inside cn reduce tree-shake

cn(\ … `, className)` allocates a new template literal on every render. For static strings prefer a plain string to keep memory pressure lower:

-className={cn(`
-  -mx-1 h-px bg-slate-200
-  dark:bg-slate-800
-`, className)}
+className={cn("-mx-1 h-px bg-slate-200 dark:bg-slate-800", className)}
src/components/seller-management.tsx (1)

419-423: Trim excess whitespace in multi-line template literal

Indentation inside the template string is emitted as literal spaces, producing class names with leading spaces (" bg-red-500"). While browsers ignore the extra whitespace, it:

  1. Slightly inflates the HTML payload.
  2. Trips Tailwind’s JIT class extraction if a future purge step is more strict.

Recommend using cn (already imported) for multi-line readability without the whitespace side-effect:

- className={`
-   bg-red-500 text-red-50
-   hover:bg-red-500/90
- `}
+ className={cn(
+   "bg-red-500 text-red-50",
+   "hover:bg-red-500/90"
+ )}
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5be6254 and b2a4610.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (67)
  • .prettierrc.js (1 hunks)
  • .vscode/settings.json (1 hunks)
  • components.json (1 hunks)
  • eslint.config.mjs (2 hunks)
  • package.json (2 hunks)
  • postcss.config.mjs (1 hunks)
  • src/app/(app)/components/android-pdf-viewer.tsx (5 hunks)
  • src/app/(app)/components/cta-toasts/index.tsx (8 hunks)
  • src/app/(app)/components/index.tsx (7 hunks)
  • src/app/(app)/components/invoice-form/index.tsx (10 hunks)
  • src/app/(app)/components/invoice-form/sections/buyer-information.tsx (2 hunks)
  • src/app/(app)/components/invoice-form/sections/general-information.tsx (6 hunks)
  • src/app/(app)/components/invoice-form/sections/invoice-items.tsx (13 hunks)
  • src/app/(app)/components/invoice-form/sections/seller-information.tsx (4 hunks)
  • src/app/(app)/components/invoice-pdf-download-link.tsx (1 hunks)
  • src/app/(app)/components/invoice-pdf-download-multiple-languages.tsx (1 hunks)
  • src/app/(app)/components/invoice-pdf-viewer.tsx (1 hunks)
  • src/app/(app)/loading.tsx (2 hunks)
  • src/app/(app)/page.client.tsx (12 hunks)
  • src/app/[locale]/about/loading.tsx (8 hunks)
  • src/app/[locale]/about/page.tsx (13 hunks)
  • src/app/api/generate-invoice/render-pdf-on-server.tsx (1 hunks)
  • src/app/api/generate-invoice/route.tsx (1 hunks)
  • src/app/changelog/[slug]/page.tsx (13 hunks)
  • src/app/changelog/components/date-time.tsx (1 hunks)
  • src/app/changelog/layout.tsx (6 hunks)
  • src/app/changelog/page.tsx (2 hunks)
  • src/app/confirm-subscription/page.tsx (3 hunks)
  • src/app/globals.css (0 hunks)
  • src/app/layout.tsx (2 hunks)
  • src/app/not-found.tsx (2 hunks)
  • src/components/buyer-dialog.tsx (5 hunks)
  • src/components/buyer-management.tsx (4 hunks)
  • src/components/etc/github-logo.tsx (1 hunks)
  • src/components/footer.tsx (6 hunks)
  • src/components/go-to-app-button-cta.tsx (2 hunks)
  • src/components/project-logo-description.tsx (2 hunks)
  • src/components/seller-dialog.tsx (7 hunks)
  • src/components/seller-management.tsx (4 hunks)
  • src/components/subscribe-input.tsx (3 hunks)
  • src/components/ui/accordion.tsx (2 hunks)
  • src/components/ui/alert-dialog.tsx (6 hunks)
  • src/components/ui/badge.tsx (1 hunks)
  • src/components/ui/button-helper.tsx (1 hunks)
  • src/components/ui/button.tsx (1 hunks)
  • src/components/ui/command.tsx (8 hunks)
  • src/components/ui/dialog.tsx (5 hunks)
  • src/components/ui/disclosure.tsx (2 hunks)
  • src/components/ui/dropdown-menu.tsx (9 hunks)
  • src/components/ui/form.tsx (3 hunks)
  • src/components/ui/input-helper-message.tsx (1 hunks)
  • src/components/ui/input.tsx (1 hunks)
  • src/components/ui/label.tsx (1 hunks)
  • src/components/ui/money-input.tsx (3 hunks)
  • src/components/ui/multi-select.tsx (6 hunks)
  • src/components/ui/popover.tsx (1 hunks)
  • src/components/ui/select-native.tsx (2 hunks)
  • src/components/ui/separator.tsx (1 hunks)
  • src/components/ui/switch.tsx (1 hunks)
  • src/components/ui/tabs.tsx (3 hunks)
  • src/components/ui/textarea.tsx (1 hunks)
  • src/components/ui/toasts/error-generating-pdf-toast.tsx (2 hunks)
  • src/components/ui/tooltip.tsx (1 hunks)
  • src/components/video.tsx (1 hunks)
  • src/globals.css (1 hunks)
  • src/mdx-components.tsx (5 hunks)
  • tailwind.config.ts (0 hunks)
💤 Files with no reviewable changes (2)
  • src/app/globals.css
  • tailwind.config.ts
🧰 Additional context used
📓 Path-based instructions (2)
**/*.{ts,tsx}

📄 CodeRabbit Inference Engine (.cursor/rules/error-handling.mdc)

**/*.{ts,tsx}: Model expected errors as return values in Server Actions
Use Zod for form validation and type inference
Define reusable validation schemas
Handle expected errors (form validation, API responses) with try/catch and return typed error objects
Use the ActionResponse interface pattern for server action error handling in TypeScript
Use Zod schemas and z.infer for form validation and type inference in TypeScript

**/*.{ts,tsx}: Use TypeScript for all code; prefer interfaces over types.
Avoid enums; use objects with as const instead.
Use the "function" keyword for pure functions.
Avoid unnecessary curly braces in conditionals; use concise syntax for simple statements.
Use console.log({}) syntax for debugging.

Files:

  • src/app/not-found.tsx
  • src/components/ui/tooltip.tsx
  • src/app/api/generate-invoice/route.tsx
  • src/components/ui/button-helper.tsx
  • src/mdx-components.tsx
  • src/components/ui/alert-dialog.tsx
  • src/app/api/generate-invoice/render-pdf-on-server.tsx
  • src/components/video.tsx
  • src/app/(app)/components/invoice-pdf-download-multiple-languages.tsx
  • src/components/ui/input-helper-message.tsx
  • src/app/changelog/layout.tsx
  • src/app/layout.tsx
  • src/components/ui/money-input.tsx
  • src/components/project-logo-description.tsx
  • src/components/ui/textarea.tsx
  • src/components/ui/disclosure.tsx
  • src/app/(app)/loading.tsx
  • src/components/ui/popover.tsx
  • src/app/(app)/components/invoice-pdf-download-link.tsx
  • src/components/ui/badge.tsx
  • src/components/go-to-app-button-cta.tsx
  • src/app/changelog/components/date-time.tsx
  • src/components/ui/button.tsx
  • src/components/ui/accordion.tsx
  • src/components/ui/separator.tsx
  • src/app/[locale]/about/loading.tsx
  • src/app/(app)/page.client.tsx
  • src/app/changelog/page.tsx
  • src/components/ui/switch.tsx
  • src/components/etc/github-logo.tsx
  • src/app/(app)/components/invoice-form/sections/seller-information.tsx
  • src/app/(app)/components/invoice-pdf-viewer.tsx
  • src/components/ui/multi-select.tsx
  • src/app/confirm-subscription/page.tsx
  • src/app/(app)/components/android-pdf-viewer.tsx
  • src/components/ui/dialog.tsx
  • src/components/ui/form.tsx
  • src/components/ui/toasts/error-generating-pdf-toast.tsx
  • src/components/ui/label.tsx
  • src/app/(app)/components/cta-toasts/index.tsx
  • src/components/ui/tabs.tsx
  • src/components/seller-dialog.tsx
  • src/app/(app)/components/index.tsx
  • src/app/(app)/components/invoice-form/sections/buyer-information.tsx
  • src/app/[locale]/about/page.tsx
  • src/components/ui/dropdown-menu.tsx
  • src/components/ui/select-native.tsx
  • src/components/seller-management.tsx
  • src/components/subscribe-input.tsx
  • src/components/buyer-dialog.tsx
  • src/components/buyer-management.tsx
  • src/components/ui/input.tsx
  • src/app/changelog/[slug]/page.tsx
  • src/components/ui/command.tsx
  • src/components/footer.tsx
  • src/app/(app)/components/invoice-form/sections/general-information.tsx
  • src/app/(app)/components/invoice-form/sections/invoice-items.tsx
  • src/app/(app)/components/invoice-form/index.tsx
**/*.tsx

📄 CodeRabbit Inference Engine (.cursor/rules/error-handling.mdc)

**/*.tsx: Use error boundaries for unexpected errors
Implement client-side validation for immediate feedback
Display user-friendly messages for expected errors
Catch unexpected errors (runtime errors, network issues) with error boundaries
Show generic user-friendly fallback UI for unexpected errors
Wrap React components with ErrorBoundary and provide a FallbackComponent for error handling

**/*.tsx: Favor named exports for components.
Use functional components with TypeScript interfaces.
Prefer Conditional (ternary) operator (? :) over Logical AND operator (&&) in React components.
Use declarative JSX.
Use Shadcn UI, Radix, and Tailwind for components and styling.
Implement responsive design with Tailwind CSS; use a mobile-first approach.
Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).
Wrap client components in Suspense with fallback.
Use dynamic loading for non-critical components.
Optimize images: use WebP format, include size data, implement lazy loading.
Use 'nuqs' for URL search parameter state management.
Limit 'use client': Favor server components and Next.js SSR. Use only for Web API access in small components.

Files:

  • src/app/not-found.tsx
  • src/components/ui/tooltip.tsx
  • src/app/api/generate-invoice/route.tsx
  • src/components/ui/button-helper.tsx
  • src/mdx-components.tsx
  • src/components/ui/alert-dialog.tsx
  • src/app/api/generate-invoice/render-pdf-on-server.tsx
  • src/components/video.tsx
  • src/app/(app)/components/invoice-pdf-download-multiple-languages.tsx
  • src/components/ui/input-helper-message.tsx
  • src/app/changelog/layout.tsx
  • src/app/layout.tsx
  • src/components/ui/money-input.tsx
  • src/components/project-logo-description.tsx
  • src/components/ui/textarea.tsx
  • src/components/ui/disclosure.tsx
  • src/app/(app)/loading.tsx
  • src/components/ui/popover.tsx
  • src/app/(app)/components/invoice-pdf-download-link.tsx
  • src/components/ui/badge.tsx
  • src/components/go-to-app-button-cta.tsx
  • src/app/changelog/components/date-time.tsx
  • src/components/ui/button.tsx
  • src/components/ui/accordion.tsx
  • src/components/ui/separator.tsx
  • src/app/[locale]/about/loading.tsx
  • src/app/(app)/page.client.tsx
  • src/app/changelog/page.tsx
  • src/components/ui/switch.tsx
  • src/components/etc/github-logo.tsx
  • src/app/(app)/components/invoice-form/sections/seller-information.tsx
  • src/app/(app)/components/invoice-pdf-viewer.tsx
  • src/components/ui/multi-select.tsx
  • src/app/confirm-subscription/page.tsx
  • src/app/(app)/components/android-pdf-viewer.tsx
  • src/components/ui/dialog.tsx
  • src/components/ui/form.tsx
  • src/components/ui/toasts/error-generating-pdf-toast.tsx
  • src/components/ui/label.tsx
  • src/app/(app)/components/cta-toasts/index.tsx
  • src/components/ui/tabs.tsx
  • src/components/seller-dialog.tsx
  • src/app/(app)/components/index.tsx
  • src/app/(app)/components/invoice-form/sections/buyer-information.tsx
  • src/app/[locale]/about/page.tsx
  • src/components/ui/dropdown-menu.tsx
  • src/components/ui/select-native.tsx
  • src/components/seller-management.tsx
  • src/components/subscribe-input.tsx
  • src/components/buyer-dialog.tsx
  • src/components/buyer-management.tsx
  • src/components/ui/input.tsx
  • src/app/changelog/[slug]/page.tsx
  • src/components/ui/command.tsx
  • src/components/footer.tsx
  • src/app/(app)/components/invoice-form/sections/general-information.tsx
  • src/app/(app)/components/invoice-form/sections/invoice-items.tsx
  • src/app/(app)/components/invoice-form/index.tsx
🧠 Learnings (65)
📓 Common learnings
Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.
Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.
Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.
Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).
Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.
Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal
.prettierrc.js (2)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Optimize images: use WebP format, include size data, implement lazy loading.

src/app/not-found.tsx (13)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Keep page components lean

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Show generic user-friendly fallback UI for unexpected errors

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use 'nuqs' for URL search parameter state management.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Display user-friendly messages for expected errors

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Extract business logic to separate files

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/*.tsx : Use Server Components when possible

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Catch unexpected errors (runtime errors, network issues) with error boundaries

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Wrap React components with ErrorBoundary and provide a FallbackComponent for error handling

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Use error boundaries for unexpected errors

src/components/ui/tooltip.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Prefer Conditional (ternary) operator (? :) over Logical AND operator (&&) in React components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.{ts,tsx} : Avoid unnecessary curly braces in conditionals; use concise syntax for simple statements.

src/components/ui/button-helper.tsx (7)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Keep page components lean

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

src/mdx-components.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Wrap client components in Suspense with fallback.

src/components/ui/alert-dialog.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Display user-friendly messages for expected errors

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Show generic user-friendly fallback UI for unexpected errors

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Implement client-side validation for immediate feedback

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

src/app/api/generate-invoice/render-pdf-on-server.tsx (1)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Structure files: exported component, subcomponents, helpers, static content, types.

src/components/video.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Keep page components lean

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

src/app/(app)/components/invoice-pdf-download-multiple-languages.tsx (7)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Keep page components lean

src/components/ui/input-helper-message.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Display user-friendly messages for expected errors

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Implement client-side validation for immediate feedback

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Keep page components lean

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/*.tsx : Use React Suspense boundaries

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Show generic user-friendly fallback UI for unexpected errors

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

postcss.config.mjs (3)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Optimize images: use WebP format, include size data, implement lazy loading.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

src/app/changelog/layout.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Keep page components lean

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use dynamic loading for non-critical components.

src/app/layout.tsx (14)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Keep page components lean

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Extract business logic to separate files

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/*.tsx : Use Server Components when possible

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/*.tsx : Implement proper caching strategies

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Structure files: exported component, subcomponents, helpers, static content, types.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use dynamic loading for non-critical components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Use React Context sparingly

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Limit 'use client': Favor server components and Next.js SSR. Use only for Web API access in small components.

src/components/ui/money-input.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Implement client-side validation for immediate feedback

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

src/components/project-logo-description.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Keep page components lean

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

.vscode/settings.json (11)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.{ts,tsx} : Use Zod schemas and z.infer for form validation and type inference in TypeScript

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.{ts,tsx} : Use TypeScript for all code; prefer interfaces over types.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.{ts,tsx} : Use Zod for form validation and type inference

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.{ts,tsx} : Use console.log({}) syntax for debugging.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.{ts,tsx} : Avoid enums; use objects with as const instead.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Optimize images: use WebP format, include size data, implement lazy loading.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/testing.mdc:0-0
Timestamp: 2025-07-20T22:00:37.696Z
Learning: Applies to **/*.test.{ts,tsx} : Use Vitest for unit and integration tests

src/components/ui/textarea.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Implement client-side validation for immediate feedback

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

src/components/ui/disclosure.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.{ts,tsx} : Avoid unnecessary curly braces in conditionals; use concise syntax for simple statements.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Prefer Conditional (ternary) operator (? :) over Logical AND operator (&&) in React components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use dynamic loading for non-critical components.

src/app/(app)/loading.tsx (12)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use dynamic loading for non-critical components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/*.tsx : Handle loading and error states

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Keep page components lean

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/*.tsx : Use Server Components when possible

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Show generic user-friendly fallback UI for unexpected errors

src/components/ui/popover.tsx (8)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Keep page components lean

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

src/app/(app)/components/invoice-pdf-download-link.tsx (7)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Keep page components lean

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

src/components/ui/badge.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Keep page components lean

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.{ts,tsx} : Avoid unnecessary curly braces in conditionals; use concise syntax for simple statements.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

src/components/go-to-app-button-cta.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/*.tsx : Use Server Components when possible

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Keep page components lean

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

src/app/changelog/components/date-time.tsx (4)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

src/components/ui/button.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Keep page components lean

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

src/components/ui/accordion.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.{ts,tsx} : Avoid unnecessary curly braces in conditionals; use concise syntax for simple statements.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Keep page components lean

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

src/components/ui/separator.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Keep page components lean

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

src/app/[locale]/about/loading.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use dynamic loading for non-critical components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Keep page components lean

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/*.tsx : Handle loading and error states

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Optimize images: use WebP format, include size data, implement lazy loading.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

src/app/(app)/page.client.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Keep page components lean

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Extract business logic to separate files

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/*.tsx : Use Server Components when possible

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Limit 'use client': Favor server components and Next.js SSR. Use only for Web API access in small components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

src/app/changelog/page.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Wrap client components in Suspense with fallback.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Keep page components lean

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/*.tsx : Use React Suspense boundaries

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Show generic user-friendly fallback UI for unexpected errors

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

src/components/ui/switch.tsx (12)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Prefer Conditional (ternary) operator (? :) over Logical AND operator (&&) in React components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Use React Context sparingly

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/*.tsx : Use React Suspense boundaries

components.json (12)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Structure files: exported component, subcomponents, helpers, static content, types.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Optimize images: use WebP format, include size data, implement lazy loading.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.{ts,tsx} : Use TypeScript for all code; prefer interfaces over types.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/*.tsx : Use Server Components when possible

src/components/etc/github-logo.tsx (7)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Prefer Conditional (ternary) operator (? :) over Logical AND operator (&&) in React components.

src/app/(app)/components/invoice-form/sections/seller-information.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Prefer Conditional (ternary) operator (? :) over Logical AND operator (&&) in React components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Extract business logic to separate files

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/*.tsx : Use Server Components when possible

src/app/(app)/components/invoice-pdf-viewer.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Display user-friendly messages for expected errors

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Show generic user-friendly fallback UI for unexpected errors

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Keep page components lean

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Extract business logic to separate files

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

src/components/ui/multi-select.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Prefer Conditional (ternary) operator (? :) over Logical AND operator (&&) in React components.

src/app/confirm-subscription/page.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Keep page components lean

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Extract business logic to separate files

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Prefer Conditional (ternary) operator (? :) over Logical AND operator (&&) in React components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

src/app/(app)/components/android-pdf-viewer.tsx (13)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Keep page components lean

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Extract business logic to separate files

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Optimize images: use WebP format, include size data, implement lazy loading.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use dynamic loading for non-critical components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/*.tsx : Handle loading and error states

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Show generic user-friendly fallback UI for unexpected errors

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Wrap React components with ErrorBoundary and provide a FallbackComponent for error handling

src/components/ui/dialog.tsx (11)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Show generic user-friendly fallback UI for unexpected errors

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Display user-friendly messages for expected errors

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Implement client-side validation for immediate feedback

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

src/components/ui/form.tsx (11)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Implement client-side validation for immediate feedback

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Prefer Conditional (ternary) operator (? :) over Logical AND operator (&&) in React components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.{ts,tsx} : Avoid unnecessary curly braces in conditionals; use concise syntax for simple statements.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Display user-friendly messages for expected errors

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Show generic user-friendly fallback UI for unexpected errors

src/components/ui/toasts/error-generating-pdf-toast.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Display user-friendly messages for expected errors

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Show generic user-friendly fallback UI for unexpected errors

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/testing.mdc:0-0
Timestamp: 2025-07-20T22:00:37.696Z
Learning: Applies to **/*.test.{ts,tsx} : Test error cases

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Prefer Conditional (ternary) operator (? :) over Logical AND operator (&&) in React components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Use error boundaries for unexpected errors

src/components/ui/label.tsx (9)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Prefer Conditional (ternary) operator (? :) over Logical AND operator (&&) in React components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

src/app/(app)/components/cta-toasts/index.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Prefer Conditional (ternary) operator (? :) over Logical AND operator (&&) in React components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Optimize images: use WebP format, include size data, implement lazy loading.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

src/components/ui/tabs.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Keep page components lean

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

src/components/seller-dialog.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Extract business logic to separate files

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

src/app/(app)/components/index.tsx (13)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Keep page components lean

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/*.tsx : Use Server Components when possible

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Extract business logic to separate files

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use dynamic loading for non-critical components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/*.tsx : Handle loading and error states

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Show generic user-friendly fallback UI for unexpected errors

src/app/(app)/components/invoice-form/sections/buyer-information.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Prefer Conditional (ternary) operator (? :) over Logical AND operator (&&) in React components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Implement client-side validation for immediate feedback

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

src/app/[locale]/about/page.tsx (11)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Keep page components lean

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Extract business logic to separate files

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Show generic user-friendly fallback UI for unexpected errors

src/components/ui/dropdown-menu.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use 'nuqs' for URL search parameter state management.

src/components/ui/select-native.tsx (9)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

src/components/seller-management.tsx (9)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Keep page components lean

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

src/components/subscribe-input.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Implement client-side validation for immediate feedback

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Keep page components lean

src/components/buyer-dialog.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Display user-friendly messages for expected errors

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Implement client-side validation for immediate feedback

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

src/components/buyer-management.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Keep page components lean

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

src/components/ui/input.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Implement client-side validation for immediate feedback

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

src/app/changelog/[slug]/page.tsx (13)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Keep page components lean

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Wrap client components in Suspense with fallback.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Show generic user-friendly fallback UI for unexpected errors

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use dynamic loading for non-critical components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/*.tsx : Use React Suspense boundaries

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Wrap React components with ErrorBoundary and provide a FallbackComponent for error handling

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Follow Next.js docs for Data Fetching, Rendering, and Routing.

src/components/ui/command.tsx (12)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.{ts,tsx} : Avoid unnecessary curly braces in conditionals; use concise syntax for simple statements.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Prefer Conditional (ternary) operator (? :) over Logical AND operator (&&) in React components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Implement client-side validation for immediate feedback

package.json (7)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Use pnpm.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Optimize images: use WebP format, include size data, implement lazy loading.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/testing.mdc:0-0
Timestamp: 2025-07-20T22:00:37.696Z
Learning: Applies to **/*.test.{ts,tsx} : Use Vitest for unit and integration tests

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/testing.mdc:0-0
Timestamp: 2025-07-20T22:00:37.696Z
Learning: Applies to **/*.test.{ts,tsx} : Keep tests isolated

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/testing.mdc:0-0
Timestamp: 2025-07-20T22:00:37.696Z
Learning: Applies to **/*.test.{ts,tsx} : Mock external dependencies in tests

src/components/footer.tsx (10)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Keep page components lean

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/*.tsx : Use Server Components when possible

src/app/(app)/components/invoice-form/sections/general-information.tsx (12)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Implement client-side validation for immediate feedback

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.{ts,tsx} : Avoid unnecessary curly braces in conditionals; use concise syntax for simple statements.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Display user-friendly messages for expected errors

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Prefer Conditional (ternary) operator (? :) over Logical AND operator (&&) in React components.

src/app/(app)/components/invoice-form/sections/invoice-items.tsx (12)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/*.tsx : Use Server Components when possible

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.{ts,tsx} : Avoid unnecessary curly braces in conditionals; use concise syntax for simple statements.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Prefer Conditional (ternary) operator (? :) over Logical AND operator (&&) in React components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Implement client-side validation for immediate feedback

src/globals.css (2)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

src/app/(app)/components/invoice-form/index.tsx (11)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Components: PascalCase.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to {components,app}/**/*.tsx : Keep client state minimal

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to components/**/*.tsx : Keep components small and focused

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.tsx : Implement client-side validation for immediate feedback

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to app/**/page.tsx : Keep page components lean

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Prefer Conditional (ternary) operator (? :) over Logical AND operator (&&) in React components.

eslint.config.mjs (21)

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Favor named exports for components.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use Shadcn UI, Radix, and Tailwind for components and styling.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.{ts,tsx} : Avoid enums; use objects with as const instead.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.{ts,tsx} : Use TypeScript for all code; prefer interfaces over types.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Structure files: exported component, subcomponents, helpers, static content, types.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use declarative JSX.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Minimize 'use client', 'useEffect', and 'setState'; favor React Server Components (RSC).

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Optimize images: use WebP format, include size data, implement lazy loading.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.{ts,tsx} : Use Zod schemas and z.infer for form validation and type inference in TypeScript

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Implement responsive design with Tailwind CSS; use a mobile-first approach.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/testing.mdc:0-0
Timestamp: 2025-07-20T22:00:37.696Z
Learning: Applies to **/*.test.tsx : Use React Testing Library for component testing

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/testing.mdc:0-0
Timestamp: 2025-07-20T22:00:37.696Z
Learning: Applies to **/*.test.{ts,tsx} : Use Vitest for unit and integration tests

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/testing.mdc:0-0
Timestamp: 2025-07-20T22:00:37.696Z
Learning: Applies to **/*.test.{ts,tsx} : Keep tests isolated

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.{ts,tsx} : Use Zod for form validation and type inference

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.tsx : Use functional components with TypeScript interfaces.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/testing.mdc:0-0
Timestamp: 2025-07-20T22:00:37.696Z
Learning: Applies to **/*.test.{ts,tsx} : Test files must be named *.test.ts or *.test.tsx

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/error-handling.mdc:0-0
Timestamp: 2025-07-20T21:59:36.257Z
Learning: Applies to **/*.{ts,tsx} : Define reusable validation schemas

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/testing.mdc:0-0
Timestamp: 2025-07-20T22:00:37.696Z
Learning: Applies to **/*.test.{ts,tsx} : Test error cases

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/shared.mdc:0-0
Timestamp: 2025-07-20T22:00:19.380Z
Learning: Applies to **/*.{ts,tsx} : Use console.log({}) syntax for debugging.

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/project-structure.mdc:0-0
Timestamp: 2025-07-20T21:59:55.483Z
Learning: Applies to types/**/*.{ts,tsx} : Place shared types in dedicated files

Learnt from: CR
PR: VladSez/easy-invoice-pdf#0
File: .cursor/rules/testing.mdc:0-0
Timestamp: 2025-07-20T22:00:37.696Z
Learning: Use Playwright for E2E testing

🧬 Code Graph Analysis (17)
src/components/ui/alert-dialog.tsx (1)
src/lib/utils.ts (1)
  • cn (4-6)
src/app/changelog/layout.tsx (1)
src/components/go-to-app-button-cta.tsx (1)
  • BlackGoToAppButton (37-58)
src/components/ui/popover.tsx (1)
src/lib/utils.ts (1)
  • cn (4-6)
src/components/ui/separator.tsx (1)
src/lib/utils.ts (1)
  • cn (4-6)
src/app/(app)/page.client.tsx (5)
src/components/ui/button.tsx (1)
  • Button (95-95)
src/config.ts (1)
  • GITHUB_URL (15-15)
src/components/etc/github-logo.tsx (1)
  • GithubIcon (3-21)
src/components/ui/dialog.tsx (2)
  • Dialog (145-145)
  • DialogContent (147-147)
src/app/(app)/page.tsx (1)
  • AppPage (42-44)
src/app/changelog/page.tsx (1)
src/app/changelog/components/date-time.tsx (1)
  • DateTime (1-22)
src/components/ui/switch.tsx (1)
src/lib/utils.ts (1)
  • cn (4-6)
src/components/etc/github-logo.tsx (1)
src/lib/utils.ts (1)
  • cn (4-6)
src/components/ui/dialog.tsx (1)
src/lib/utils.ts (1)
  • cn (4-6)
src/components/ui/form.tsx (1)
src/lib/utils.ts (1)
  • cn (4-6)
src/components/ui/label.tsx (1)
src/lib/utils.ts (1)
  • cn (4-6)
src/components/ui/tabs.tsx (1)
src/lib/utils.ts (1)
  • cn (4-6)
src/components/seller-dialog.tsx (1)
src/components/ui/dialog.tsx (2)
  • DialogHeader (150-150)
  • DialogFooter (149-149)
src/app/[locale]/about/page.tsx (4)
src/components/go-to-app-button-cta.tsx (2)
  • BlackGoToAppButton (37-58)
  • GoToAppButton (6-35)
src/config.ts (1)
  • GITHUB_URL (15-15)
src/components/etc/github-logo.tsx (1)
  • GithubIcon (3-21)
src/components/etc/project-logo.tsx (1)
  • ProjectLogo (3-25)
src/components/buyer-dialog.tsx (1)
src/components/ui/dialog.tsx (2)
  • DialogHeader (150-150)
  • DialogFooter (149-149)
src/app/changelog/[slug]/page.tsx (1)
src/app/changelog/components/date-time.tsx (1)
  • DateTime (1-22)
src/components/ui/command.tsx (1)
src/lib/utils.ts (1)
  • cn (4-6)
🪛 ESLint
src/components/ui/tooltip.tsx

[error] 31-41: Incorrect class order. Expected

↵ ············relative·z-50·max-w-[280px]·animate-in·rounded-lg·border·border-slate-200·bg-white·px-3↵ ············py-1.5·text-sm·text-slate-950·fade-in-0·zoom-in-95↵ ············data-[side=bottom]:slide-in-from-top-2↵ ············data-[side=left]:slide-in-from-right-2↵ ············data-[side=right]:slide-in-from-left-2↵ ············data-[side=top]:slide-in-from-bottom-2↵ ············data-[state=closed]:animate-out·data-[state=closed]:fade-out-0↵ ············data-[state=closed]:zoom-out-95↵ ············dark:border-slate-800·dark:bg-slate-950·dark:text-slate-50↵ ··········

to be

↵ ············animate-in·fade-in-0·zoom-in-95·data-[side=bottom]:slide-in-from-top-2·data-[side=left]:slide-in-from-right-2·data-[side=right]:slide-in-from-left-2·data-[side=top]:slide-in-from-bottom-2·data-[state=closed]:fade-out-0·data-[state=closed]:zoom-out-95↵ ············relative·z-50·max-w-[280px]·rounded-lg·border↵ ············border-slate-200↵ ············bg-white↵ ············px-3↵ ············py-1.5↵ ············text-sm·text-slate-950↵ ············data-[state=closed]:animate-out↵ ············dark:border-slate-800·dark:bg-slate-950·dark:text-slate-50↵ ··········

(better-tailwindcss/enforce-consistent-class-order)


[error] 32-32: Unregistered class detected: animate-in

(better-tailwindcss/no-unregistered-classes)


[error] 33-33: Unregistered class detected: fade-in-0

(better-tailwindcss/no-unregistered-classes)


[error] 33-33: Unregistered class detected: zoom-in-95

(better-tailwindcss/no-unregistered-classes)


[error] 34-34: Unregistered class detected: data-[side=bottom]:slide-in-from-top-2

(better-tailwindcss/no-unregistered-classes)


[error] 35-35: Unregistered class detected: data-[side=left]:slide-in-from-right-2

(better-tailwindcss/no-unregistered-classes)


[error] 36-36: Unregistered class detected: data-[side=right]:slide-in-from-left-2

(better-tailwindcss/no-unregistered-classes)


[error] 37-37: Unregistered class detected: data-[side=top]:slide-in-from-bottom-2

(better-tailwindcss/no-unregistered-classes)


[error] 38-38: Unregistered class detected: data-[state=closed]:animate-out

(better-tailwindcss/no-unregistered-classes)


[error] 38-38: Unregistered class detected: data-[state=closed]:fade-out-0

(better-tailwindcss/no-unregistered-classes)


[error] 39-39: Unregistered class detected: data-[state=closed]:zoom-out-95

(better-tailwindcss/no-unregistered-classes)

src/components/ui/alert-dialog.tsx

[error] 21-25: Incorrect class order. Expected

↵ ········fixed·inset-0·z-50·bg-black/80↵ ········data-[state=closed]:animate-out·data-[state=closed]:fade-out-0↵ ········data-[state=open]:animate-in·data-[state=open]:fade-in-0↵ ······

to be

↵ ········data-[state=closed]:animate-out·data-[state=closed]:fade-out-0·data-[state=open]:fade-in-0·fixed↵ ········inset-0·z-50↵ ········bg-black/80·data-[state=open]:animate-in↵ ······

(better-tailwindcss/enforce-consistent-class-order)


[error] 23-23: Unregistered class detected: data-[state=closed]:animate-out

(better-tailwindcss/no-unregistered-classes)


[error] 23-23: Unregistered class detected: data-[state=closed]:fade-out-0

(better-tailwindcss/no-unregistered-classes)


[error] 24-24: Unregistered class detected: data-[state=open]:animate-in

(better-tailwindcss/no-unregistered-classes)


[error] 24-24: Unregistered class detected: data-[state=open]:fade-in-0

(better-tailwindcss/no-unregistered-classes)


[error] 43-54: Incorrect class order. Expected

↵ ··········fixed·top-1/2·left-1/2·z-50·grid·max-h-[calc(100%-4rem)]·w-full·-translate-x-1/2↵ ··········-translate-y-1/2·gap-4·overflow-y-auto·border·border-slate-200·bg-white·p-6·shadow-lg↵ ··········shadow-black/5·duration-200↵ ··········data-[state=closed]:animate-out·data-[state=closed]:fade-out-0↵ ··········data-[state=closed]:zoom-out-95·data-[state=closed]:slide-out-to-left-1/2↵ ··········data-[state=closed]:slide-out-to-top-[48%]↵ ··········data-[state=open]:animate-in·data-[state=open]:fade-in-0·data-[state=open]:zoom-in-95↵ ··········data-[state=open]:slide-in-from-left-1/2·data-[state=open]:slide-in-from-top-[48%]↵ ··········sm:max-w-[400px]·sm:rounded-xl↵ ··········dark:border-slate-800·dark:bg-slate-950↵ ········

to be

↵ ··········data-[state=closed]:animate-out·data-[state=closed]:fade-out-0·data-[state=closed]:zoom-out-95·data-[state=closed]:slide-out-to-left-1/2·data-[state=closed]:slide-out-to-top-[48%]·data-[state=open]:fade-in-0·data-[state=open]:zoom-in-95·data-[state=open]:slide-in-from-left-1/2↵ ··········data-[state=open]:slide-in-from-top-[48%]·fixed·top-1/2·left-1/2·z-50·grid·max-h-[calc(100%-4rem)]·w-full↵ ··········-translate-x-1/2·-translate-y-1/2↵ ··········gap-4·overflow-y-auto↵ ··········border·border-slate-200↵ ··········bg-white↵ ··········p-6·shadow-lg·shadow-black/5↵ ··········duration-200·data-[state=open]:animate-in↵ ··········sm:max-w-[400px]·sm:rounded-xl↵ ··········dark:border-slate-800·dark:bg-slate-950↵ ········

(better-tailwindcss/enforce-consistent-class-order)


[error] 47-47: Unregistered class detected: data-[state=closed]:animate-out

(better-tailwindcss/no-unregistered-classes)


[error] 47-47: Unregistered class detected: data-[state=closed]:fade-out-0

(better-tailwindcss/no-unregistered-classes)


[error] 48-48: Unregistered class detected: data-[state=closed]:zoom-out-95

(better-tailwindcss/no-unregistered-classes)


[error] 48-48: Unregistered class detected: data-[state=closed]:slide-out-to-left-1/2

(better-tailwindcss/no-unregistered-classes)


[error] 49-49: Unregistered class detected: data-[state=closed]:slide-out-to-top-[48%]

(better-tailwindcss/no-unregistered-classes)


[error] 50-50: Unregistered class detected: data-[state=open]:animate-in

(better-tailwindcss/no-unregistered-classes)


[error] 50-50: Unregistered class detected: data-[state=open]:fade-in-0

(better-tailwindcss/no-unregistered-classes)


[error] 50-50: Unregistered class detected: data-[state=open]:zoom-in-95

(better-tailwindcss/no-unregistered-classes)


[error] 51-51: Unregistered class detected: data-[state=open]:slide-in-from-left-1/2

(better-tailwindcss/no-unregistered-classes)


[error] 51-51: Unregistered class detected: data-[state=open]:slide-in-from-top-[48%]

(better-tailwindcss/no-unregistered-classes)

src/components/ui/popover.tsx

[error] 22-33: Incorrect class order. Expected

↵ ··········z-50·w-72·rounded-md·border·border-slate-200·bg-white·p-4·text-slate-950·shadow-md↵ ··········outline-hidden↵ ··········data-[side=bottom]:slide-in-from-top-2↵ ··········data-[side=left]:slide-in-from-right-2↵ ··········data-[side=right]:slide-in-from-left-2↵ ··········data-[side=top]:slide-in-from-bottom-2↵ ··········data-[state=closed]:animate-out·data-[state=closed]:fade-out-0↵ ··········data-[state=closed]:zoom-out-95↵ ··········data-[state=open]:animate-in·data-[state=open]:fade-in-0·data-[state=open]:zoom-in-95↵ ··········dark:border-slate-800·dark:bg-slate-950·dark:text-slate-50↵ ········

to be

↵ ··········data-[side=bottom]:slide-in-from-top-2·data-[side=left]:slide-in-from-right-2·data-[side=right]:slide-in-from-left-2·data-[side=top]:slide-in-from-bottom-2·data-[state=closed]:fade-out-0·data-[state=closed]:zoom-out-95·data-[state=open]:fade-in-0·data-[state=open]:zoom-in-95·z-50↵ ··········w-72↵ ··········rounded-md↵ ··········border↵ ··········border-slate-200↵ ··········bg-white↵ ··········p-4·text-slate-950↵ ··········shadow-md↵ ··········outline-hidden·data-[state=closed]:animate-out·data-[state=open]:animate-in↵ ··········dark:border-slate-800·dark:bg-slate-950·dark:text-slate-50↵ ········

(better-tailwindcss/enforce-consistent-class-order)


[error] 25-25: Unregistered class detected: data-[side=bottom]:slide-in-from-top-2

(better-tailwindcss/no-unregistered-classes)


[error] 26-26: Unregistered class detected: data-[side=left]:slide-in-from-right-2

(better-tailwindcss/no-unregistered-classes)


[error] 27-27: Unregistered class detected: data-[side=right]:slide-in-from-left-2

(better-tailwindcss/no-unregistered-classes)


[error] 28-28: Unregistered class detected: data-[side=top]:slide-in-from-bottom-2

(better-tailwindcss/no-unregistered-classes)


[error] 29-29: Unregistered class detected: data-[state=closed]:animate-out

(better-tailwindcss/no-unregistered-classes)


[error] 29-29: Unregistered class detected: data-[state=closed]:fade-out-0

(better-tailwindcss/no-unregistered-classes)


[error] 30-30: Unregistered class detected: data-[state=closed]:zoom-out-95

(better-tailwindcss/no-unregistered-classes)


[error] 31-31: Unregistered class detected: data-[state=open]:animate-in

(better-tailwindcss/no-unregistered-classes)


[error] 31-31: Unregistered class detected: data-[state=open]:fade-in-0

(better-tailwindcss/no-unregistered-classes)


[error] 31-31: Unregistered class detected: data-[state=open]:zoom-in-95

(better-tailwindcss/no-unregistered-classes)

src/app/changelog/page.tsx

[error] 122-148: Incorrect class order. Expected

↵ ············prose·max-w-none·transition-all·prose-gray↵ ············dark:prose-invert↵ ············prose-headings:relative·prose-headings:mt-6·prose-headings:mb-4↵ ············prose-headings:scroll-mt-20·prose-headings:font-semibold·prose-headings:text-gray-900↵ ············dark:prose-headings:text-gray-100↵ ············prose-h1:text-2xl↵ ············prose-h2:text-xl↵ ············prose-h3:text-lg↵ ············prose-h4:text-base↵ ············prose-p:leading-relaxed·prose-p:text-gray-600↵ ············dark:prose-p:text-gray-300↵ ············prose-a:font-medium·prose-a:text-gray-500·prose-a:underline-offset-4↵ ············hover:prose-a:text-black↵ ············dark:prose-a:text-blue-400↵ ············prose-strong:text-gray-900↵ ············dark:prose-strong:text-gray-100↵ ············prose-code:rounded·prose-code:bg-gray-100·prose-code:px-1.5·prose-code:py-0.5↵ ············prose-code:text-sm↵ ············dark:prose-code:bg-gray-800↵ ············prose-pre:border·prose-pre:border-gray-200·prose-pre:bg-gray-100↵ ············dark:prose-pre:border-gray-700·dark:prose-pre:bg-gray-800↵ ············prose-li:text-gray-600↵ ············dark:prose-li:text-gray-300↵ ············prose-img:rounded-lg·prose-img:border·prose-img:border-gray-200·prose-img:shadow-md↵ ············dark:prose-img:border-gray-700↵ ··········

to be

↵ ············prose·prose-gray·dark:prose-invert·prose-headings:relative↵ ············prose-headings:mt-6↵ ············prose-headings:mb-4·prose-headings:scroll-mt-20·prose-headings:font-semibold↵ ············prose-headings:text-gray-900·dark:prose-headings:text-gray-100·prose-h1:text-2xl↵ ············prose-h2:text-xl↵ ············prose-h3:text-lg↵ ············prose-h4:text-base↵ ············prose-p:leading-relaxed↵ ············prose-p:text-gray-600↵ ············dark:prose-p:text-gray-300·prose-a:font-medium↵ ············prose-a:text-gray-500↵ ············prose-a:underline-offset-4·hover:prose-a:text-black·dark:prose-a:text-blue-400↵ ············prose-strong:text-gray-900↵ ············dark:prose-strong:text-gray-100↵ ············prose-code:rounded↵ ············prose-code:bg-gray-100↵ ············prose-code:px-1.5·prose-code:py-0.5·prose-code:text-sm·dark:prose-code:bg-gray-800↵ ············prose-pre:border↵ ············prose-pre:border-gray-200↵ ············prose-pre:bg-gray-100·dark:prose-pre:border-gray-700·dark:prose-pre:bg-gray-800↵ ············prose-li:text-gray-600·dark:prose-li:text-gray-300↵ ············prose-img:rounded-lg↵ ············prose-img:border↵ ············prose-img:border-gray-200·prose-img:shadow-md·dark:prose-img:border-gray-700·max-w-none↵ ············transition-all↵ ··········

(better-tailwindcss/enforce-consistent-class-order)


[error] 123-123: Unregistered class detected: prose

(better-tailwindcss/no-unregistered-classes)


[error] 123-123: Unregistered class detected: prose-gray

(better-tailwindcss/no-unregistered-classes)


[error] 124-124: Unregistered class detected: dark:prose-invert

(better-tailwindcss/no-unregistered-classes)


[error] 125-125: Unregistered class detected: prose-headings:relative

(better-tailwindcss/no-unregistered-classes)


[error] 125-125: Unregistered class detected: prose-headings:mt-6

(better-tailwindcss/no-unregistered-classes)


[error] 125-125: Unregistered class detected: prose-headings:mb-4

(better-tailwindcss/no-unregistered-classes)


[error] 126-126: Unregistered class detected: prose-headings:scroll-mt-20

(better-tailwindcss/no-unregistered-classes)


[error] 126-126: Unregistered class detected: prose-headings:font-semibold

(better-tailwindcss/no-unregistered-classes)


[error] 126-126: Unregistered class detected: prose-headings:text-gray-900

(better-tailwindcss/no-unregistered-classes)


[error] 127-127: Unregistered class detected: dark:prose-headings:text-gray-100

(better-tailwindcss/no-unregistered-classes)


[error] 128-128: Unregistered class detected: prose-h1:text-2xl

(better-tailwindcss/no-unregistered-classes)


[error] 129-129: Unregistered class detected: prose-h2:text-xl

(better-tailwindcss/no-unregistered-classes)


[error] 130-130: Unregistered class detected: prose-h3:text-lg

(better-tailwindcss/no-unregistered-classes)


[error] 131-131: Unregistered class detected: prose-h4:text-base

(better-tailwindcss/no-unregistered-classes)


[error] 132-132: Unregistered class detected: prose-p:leading-relaxed

(better-tailwindcss/no-unregistered-classes)


[error] 132-132: Unregistered class detected: prose-p:text-gray-600

(better-tailwindcss/no-unregistered-classes)


[error] 133-133: Unregistered class detected: dark:prose-p:text-gray-300

(better-tailwindcss/no-unregistered-classes)


[error] 134-134: Unregistered class detected: prose-a:font-medium

(better-tailwindcss/no-unregistered-classes)


[error] 134-134: Unregistered class detected: prose-a:text-gray-500

(better-tailwindcss/no-unregistered-classes)


[error] 134-134: Unregistered class detected: prose-a:underline-offset-4

(better-tailwindcss/no-unregistered-classes)


[error] 135-135: Unregistered class detected: hover:prose-a:text-black

(better-tailwindcss/no-unregistered-classes)


[error] 136-136: Unregistered class detected: dark:prose-a:text-blue-400

(better-tailwindcss/no-unregistered-classes)


[error] 137-137: Unregistered class detected: prose-strong:text-gray-900

(better-tailwindcss/no-unregistered-classes)


[error] 138-138: Unregistered class detected: dark:prose-strong:text-gray-100

(better-tailwindcss/no-unregistered-classes)


[error] 139-139: Unregistered class detected: prose-code:rounded

(better-tailwindcss/no-unregistered-classes)


[error] 139-139: Unregistered class detected: prose-code:bg-gray-100

(better-tailwindcss/no-unregistered-classes)


[error] 139-139: Unregistered class detected: prose-code:px-1.5

(better-tailwindcss/no-unregistered-classes)


[error] 139-139: Unregistered class detected: prose-code:py-0.5

(better-tailwindcss/no-unregistered-classes)


[error] 140-140: Unregistered class detected: prose-code:text-sm

(better-tailwindcss/no-unregistered-classes)


[error] 141-141: Unregistered class detected: dark:prose-code:bg-gray-800

(better-tailwindcss/no-unregistered-classes)


[error] 142-142: Unregistered class detected: prose-pre:border

(better-tailwindcss/no-unregistered-classes)


[error] 142-142: Unregistered class detected: prose-pre:border-gray-200

(better-tailwindcss/no-unregistered-classes)


[error] 142-142: Unregistered class detected: prose-pre:bg-gray-100

(better-tailwindcss/no-unregistered-classes)


[error] 143-143: Unregistered class detected: dark:prose-pre:border-gray-700

(better-tailwindcss/no-unregistered-classes)


[error] 143-143: Unregistered class detected: dark:prose-pre:bg-gray-800

(better-tailwindcss/no-unregistered-classes)


[error] 144-144: Unregistered class detected: prose-li:text-gray-600

(better-tailwindcss/no-unregistered-classes)


[error] 145-145: Unregistered class detected: dark:prose-li:text-gray-300

(better-tailwindcss/no-unregistered-classes)


[error] 146-146: Unregistered class detected: prose-img:rounded-lg

(better-tailwindcss/no-unregistered-classes)


[error] 146-146: Unregistered class detected: prose-img:border

(better-tailwindcss/no-unregistered-classes)


[error] 146-146: Unregistered class detected: prose-img:border-gray-200

(better-tailwindcss/no-unregistered-classes)


[error] 146-146: Unregistered class detected: prose-img:shadow-md

(better-tailwindcss/no-unregistered-classes)


[error] 147-147: Unregistered class detected: dark:prose-img:border-gray-700

(better-tailwindcss/no-unregistered-classes)

src/components/ui/dialog.tsx

[error] 24-28: Incorrect class order. Expected

↵ ········fixed·inset-0·z-101·bg-black/80↵ ········data-[state=closed]:animate-out·data-[state=closed]:fade-out-0↵ ········data-[state=open]:animate-in·data-[state=open]:fade-in-0↵ ······

to be

↵ ········data-[state=closed]:animate-out·data-[state=closed]:fade-out-0·data-[state=open]:fade-in-0·fixed↵ ········inset-0·z-101↵ ········bg-black/80·data-[state=open]:animate-in↵ ······

(better-tailwindcss/enforce-consistent-class-order)


[error] 26-26: Unregistered class detected: data-[state=closed]:animate-out

(better-tailwindcss/no-unregistered-classes)


[error] 26-26: Unregistered class detected: data-[state=closed]:fade-out-0

(better-tailwindcss/no-unregistered-classes)


[error] 27-27: Unregistered class detected: data-[state=open]:animate-in

(better-tailwindcss/no-unregistered-classes)


[error] 27-27: Unregistered class detected: data-[state=open]:fade-in-0

(better-tailwindcss/no-unregistered-classes)


[error] 45-56: Incorrect class order. Expected

↵ ··········fixed·top-1/2·left-1/2·z-101·grid·max-h-[calc(100%-4rem)]·w-full·max-w-[calc(100%-2rem)]↵ ··········-translate-x-1/2·-translate-y-1/2·gap-4·overflow-y-auto·rounded-xl·border·border-slate-200↵ ··········bg-white·p-6·shadow-lg·shadow-black/5·duration-200↵ ··········data-[state=closed]:animate-out·data-[state=closed]:fade-out-0↵ ··········data-[state=closed]:zoom-out-95·data-[state=closed]:slide-out-to-left-1/2↵ ··········data-[state=closed]:slide-out-to-top-[48%]↵ ··········data-[state=open]:animate-in·data-[state=open]:fade-in-0·data-[state=open]:zoom-in-95↵ ··········data-[state=open]:slide-in-from-left-1/2·data-[state=open]:slide-in-from-top-[48%]↵ ··········sm:max-w-[400px]·sm:rounded-xl↵ ··········dark:border-slate-800·dark:bg-slate-950↵ ········

to be

↵ ··········data-[state=closed]:animate-out·data-[state=closed]:fade-out-0·data-[state=closed]:zoom-out-95·data-[state=closed]:slide-out-to-left-1/2·data-[state=closed]:slide-out-to-top-[48%]·data-[state=open]:fade-in-0·data-[state=open]:zoom-in-95·data-[state=open]:slide-in-from-left-1/2↵ ··········data-[state=open]:slide-in-from-top-[48%]·fixed·top-1/2·left-1/2·z-101·grid·max-h-[calc(100%-4rem)]↵ ··········w-full·max-w-[calc(100%-2rem)]·-translate-x-1/2·-translate-y-1/2·gap-4↵ ··········overflow-y-auto·rounded-xl↵ ··········border·border-slate-200↵ ··········bg-white↵ ··········p-6·shadow-lg·shadow-black/5↵ ··········duration-200·data-[state=open]:animate-in↵ ··········sm:max-w-[400px]·sm:rounded-xl↵ ··········dark:border-slate-800·dark:bg-slate-950↵ ········

(better-tailwindcss/enforce-consistent-class-order)


[error] 49-49: Unregistered class detected: data-[state=closed]:animate-out

(better-tailwindcss/no-unregistered-classes)


[error] 49-49: Unregistered class detected: data-[state=closed]:fade-out-0

(better-tailwindcss/no-unregistered-classes)


[error] 50-50: Unregistered class detected: data-[state=closed]:zoom-out-95

(better-tailwindcss/no-unregistered-classes)


[error] 50-50: Unregistered class detected: data-[state=closed]:slide-out-to-left-1/2

(better-tailwindcss/no-unregistered-classes)


[error] 51-51: Unregistered class detected: data-[state=closed]:slide-out-to-top-[48%]

(better-tailwindcss/no-unregistered-classes)


[error] 52-52: Unregistered class detected: data-[state=open]:animate-in

(better-tailwindcss/no-unregistered-classes)


[error] 52-52: Unregistered class detected: data-[state=open]:fade-in-0

(better-tailwindcss/no-unregistered-classes)


[error] 52-52: Unregistered class detected: data-[state=open]:zoom-in-95

(better-tailwindcss/no-unregistered-classes)


[error] 53-53: Unregistered class detected: data-[state=open]:slide-in-from-left-1/2

(better-tailwindcss/no-unregistered-classes)


[error] 53-53: Unregistered class detected: data-[state=open]:slide-in-from-top-[48%]

(better-tailwindcss/no-unregistered-classes)

src/components/ui/dropdown-menu.tsx

[error] 91-102: Incorrect class order. Expected

↵ ············z-50·min-w-40·overflow-hidden·rounded-md·border·border-slate-200·bg-white·p-1↵ ············text-slate-950·shadow-lg↵ ············data-[side=bottom]:slide-in-from-top-2↵ ············data-[side=left]:slide-in-from-right-2↵ ············data-[side=right]:slide-in-from-left-2↵ ············data-[side=top]:slide-in-from-bottom-2↵ ············data-[state=closed]:animate-out·data-[state=closed]:fade-out-0↵ ············data-[state=closed]:zoom-out-95↵ ············data-[state=open]:animate-in·data-[state=open]:fade-in-0·data-[state=open]:zoom-in-95↵ ············dark:border-slate-800·dark:bg-slate-950·dark:text-slate-50↵ ··········

to be

↵ ············data-[side=bottom]:slide-in-from-top-2·data-[side=left]:slide-in-from-right-2·data-[side=right]:slide-in-from-left-2·data-[side=top]:slide-in-from-bottom-2·data-[state=closed]:fade-out-0·data-[state=closed]:zoom-out-95·data-[state=open]:fade-in-0·data-[state=open]:zoom-in-95↵ ············z-50·min-w-40↵ ············overflow-hidden↵ ············rounded-md↵ ············border↵ ············border-slate-200↵ ············bg-white·p-1↵ ············text-slate-950↵ ············shadow-lg·data-[state=closed]:animate-out·data-[state=open]:animate-in↵ ············dark:border-slate-800·dark:bg-slate-950·dark:text-slate-50↵ ··········

(better-tailwindcss/enforce-consistent-class-order)


[error] 94-94: Unregistered class detected: data-[side=bottom]:slide-in-from-top-2

(better-tailwindcss/no-unregistered-classes)


[error] 95-95: Unregistered class detected: data-[side=left]:slide-in-from-right-2

(better-tailwindcss/no-unregistered-classes)


[error] 96-96: Unregistered class detected: data-[side=right]:slide-in-from-left-2

(better-tailwindcss/no-unregistered-classes)


[error] 97-97: Unregistered class detected: data-[side=top]:slide-in-from-bottom-2

(better-tailwindcss/no-unregistered-classes)


[error] 98-98: Unregistered class detected: data-[state=closed]:animate-out

(better-tailwindcss/no-unregistered-classes)


[error] 98-98: Unregistered class detected: data-[state=closed]:fade-out-0

(better-tailwindcss/no-unregistered-classes)


[error] 99-99: Unregistered class detected: data-[state=closed]:zoom-out-95

(better-tailwindcss/no-unregistered-classes)


[error] 100-100: Unregistered class detected: data-[state=open]:animate-in

(better-tailwindcss/no-unregistered-classes)


[error] 100-100: Unregistered class detected: data-[state=open]:fade-in-0

(better-tailwindcss/no-unregistered-classes)


[error] 100-100: Unregistered class detected: data-[state=open]:zoom-in-95

(better-tailwindcss/no-unregistered-classes)


[error] 358-369: Incorrect class order. Expected

↵ ··········z-50·min-w-40·overflow-hidden·rounded-md·border·border-slate-200·bg-white·p-1↵ ··········text-slate-950·shadow-lg↵ ··········data-[side=bottom]:slide-in-from-top-2↵ ··········data-[side=left]:slide-in-from-right-2↵ ··········data-[side=right]:slide-in-from-left-2↵ ··········data-[side=top]:slide-in-from-bottom-2↵ ··········data-[state=closed]:animate-out·data-[state=closed]:fade-out-0↵ ··········data-[state=closed]:zoom-out-95↵ ··········data-[state=open]:animate-in·data-[state=open]:fade-in-0·data-[state=open]:zoom-in-95↵ ··········dark:border-slate-800·dark:bg-slate-950·dark:text-slate-50↵ ········

to be

↵ ··········data-[side=bottom]:slide-in-from-top-2·data-[side=left]:slide-in-from-right-2·data-[side=right]:slide-in-from-left-2·data-[side=top]:slide-in-from-bottom-2·data-[state=closed]:fade-out-0·data-[state=closed]:zoom-out-95·data-[state=open]:fade-in-0·data-[state=open]:zoom-in-95↵ ··········z-50·min-w-40↵ ··········overflow-hidden↵ ··········rounded-md↵ ··········border↵ ··········border-slate-200↵ ··········bg-white·p-1↵ ··········text-slate-950↵ ··········shadow-lg·data-[state=closed]:animate-out·data-[state=open]:animate-in↵ ··········dark:border-slate-800·dark:bg-slate-950·dark:text-slate-50↵ ········

(better-tailwindcss/enforce-consistent-class-order)


[error] 361-361: Unregistered class detected: data-[side=bottom]:slide-in-from-top-2

(better-tailwindcss/no-unregistered-classes)


[error] 362-362: Unregistered class detected: data-[side=left]:slide-in-from-right-2

(better-tailwindcss/no-unregistered-classes)


[error] 363-363: Unregistered class detected: data-[side=right]:slide-in-from-left-2

(better-tailwindcss/no-unregistered-classes)


[error] 364-364: Unregistered class detected: data-[side=top]:slide-in-from-bottom-2

(better-tailwindcss/no-unregistered-classes)


[error] 365-365: Unregistered class detected: data-[state=closed]:animate-out

(better-tailwindcss/no-unregistered-classes)


[error] 365-365: Unregistered class detected: data-[state=closed]:fade-out-0

(better-tailwindcss/no-unregistered-classes)


[error] 366-366: Unregistered class detected: data-[state=closed]:zoom-out-95

(better-tailwindcss/no-unregistered-classes)


[error] 367-367: Unregistered class detected: data-[state=open]:animate-in

(better-tailwindcss/no-unregistered-classes)


[error] 367-367: Unregistered class detected: data-[state=open]:fade-in-0

(better-tailwindcss/no-unregistered-classes)


[error] 367-367: Unregistered class detected: data-[state=open]:zoom-in-95

(better-tailwindcss/no-unregistered-classes)

src/components/subscribe-input.tsx

[error] 70-70: Incorrect class order. Expected

"animate-in·duration-300·fade-in-0·slide-in-from-top-1"

to be

"animate-in·fade-in-0·slide-in-from-top-1·duration-300"

(better-tailwindcss/enforce-consistent-class-order)


[error] 70-70: Unregistered class detected: animate-in

(better-tailwindcss/no-unregistered-classes)


[error] 70-70: Unregistered class detected: fade-in-0

(better-tailwindcss/no-unregistered-classes)


[error] 70-70: Unregistered class detected: slide-in-from-top-1

(better-tailwindcss/no-unregistered-classes)

src/app/changelog/[slug]/page.tsx

[error] 132-135: Incorrect class order. Expected

↵ ············prose·max-w-none·prose-gray↵ ············dark:prose-invert↵ ··········

to be

↵ ············prose·prose-gray·dark:prose-invert↵ ············max-w-none↵ ··········

(better-tailwindcss/enforce-consistent-class-order)


[error] 133-133: Unregistered class detected: prose

(better-tailwindcss/no-unregistered-classes)


[error] 133-133: Unregistered class detected: prose-gray

(better-tailwindcss/no-unregistered-classes)


[error] 134-134: Unregistered class detected: dark:prose-invert

(better-tailwindcss/no-unregistered-classes)


[error] 356-356: Unregistered class detected: prose-headings:mt-8

(better-tailwindcss/no-unregistered-classes)


[error] 356-356: Unregistered class detected: prose-headings:font-semibold

(better-tailwindcss/no-unregistered-classes)


[error] 356-356: Unregistered class detected: prose-headings:text-black

(better-tailwindcss/no-unregistered-classes)


[error] 357-357: Unregistered class detected: dark:prose-headings:text-white

(better-tailwindcss/no-unregistered-classes)


[error] 358-358: Unregistered class detected: prose-h1:text-3xl

(better-tailwindcss/no-unregistered-classes)


[error] 359-359: Unregistered class detected: prose-h2:text-2xl

(better-tailwindcss/no-unregistered-classes)


[error] 360-360: Unregistered class detected: prose-h3:text-xl

(better-tailwindcss/no-unregistered-classes)


[error] 361-361: Unregistered class detected: prose-h4:text-lg

(better-tailwindcss/no-unregistered-classes)


[error] 362-362: Unregistered class detected: prose-h5:text-base

(better-tailwindcss/no-unregistered-classes)


[error] 363-363: Unregistered class detected: prose-h6:text-sm

(better-tailwindcss/no-unregistered-classes)


[error] 364-364: Unregistered class detected: prose-p:text-gray-600

(better-tailwindcss/no-unregistered-classes)


[error] 365-365: Unregistered class detected: dark:prose-p:text-gray-300

(better-tailwindcss/no-unregistered-classes)


[error] 366-366: Unregistered class detected: prose-blockquote:border-l-blue-500

(better-tailwindcss/no-unregistered-classes)


[error] 367-367: Unregistered class detected: prose-strong:text-gray-900

(better-tailwindcss/no-unregistered-classes)


[error] 368-368: Unregistered class detected: dark:prose-strong:text-gray-100

(better-tailwindcss/no-unregistered-classes)


[error] 369-369: Unregistered class detected: prose-code:rounded

(better-tailwindcss/no-unregistered-classes)


[error] 369-369: Unregistered class detected: prose-code:bg-gray-100

(better-tailwindcss/no-unregistered-classes)


[error] 369-369: Unregistered class detected: prose-code:px-2

(better-tailwindcss/no-unregistered-classes)


[error] 369-369: Unregistered class detected: prose-code:py-1

(better-tailwindcss/no-unregistered-classes)


[error] 370-370: Unregistered class detected: dark:prose-code:bg-gray-800

(better-tailwindcss/no-unregistered-classes)


[error] 371-371: Unregistered class detected: prose-pre:bg-gray-100

(better-tailwindcss/no-unregistered-classes)


[error] 372-372: Unregistered class detected: dark:prose-pre:bg-gray-800

(better-tailwindcss/no-unregistered-classes)


[error] 373-373: Unregistered class detected: prose-li:text-gray-600

(better-tailwindcss/no-unregistered-classes)


[error] 374-374: Unregistered class detected: dark:prose-li:text-gray-300

(better-tailwindcss/no-unregistered-classes)


[error] 375-375: Unregistered class detected: prose-img:rounded-lg

(better-tailwindcss/no-unregistered-classes)


[error] 375-375: Unregistered class detected: prose-img:shadow-lg

(better-tailwindcss/no-unregistered-classes)

src/app/(app)/components/invoice-form/sections/general-information.tsx

[error] 214-214: Incorrect class order. Expected

"animate-in·duration-500·fade-in·slide-in-from-bottom-2"

to be

"animate-in·fade-in·slide-in-from-bottom-2·duration-500"

(better-tailwindcss/enforce-consistent-class-order)


[error] 214-214: Unregistered class detected: animate-in

(better-tailwindcss/no-unregistered-classes)


[error] 214-214: Unregistered class detected: fade-in

(better-tailwindcss/no-unregistered-classes)


[error] 214-214: Unregistered class detected: slide-in-from-bottom-2

(better-tailwindcss/no-unregistered-classes)


[error] 286-286: Incorrect class order. Expected

"animate-in·duration-500·fade-in·slide-in-from-bottom-2"

to be

"animate-in·fade-in·slide-in-from-bottom-2·duration-500"

(better-tailwindcss/enforce-consistent-class-order)


[error] 286-286: Unregistered class detected: animate-in

(better-tailwindcss/no-unregistered-classes)


[error] 286-286: Unregistered class detected: fade-in

(better-tailwindcss/no-unregistered-classes)


[error] 286-286: Unregistered class detected: slide-in-from-bottom-2

(better-tailwindcss/no-unregistered-classes)

🪛 Biome (2.1.2)
src/app/(app)/page.client.tsx

[error] 670-671: Avoid using target="_blank" without rel="noopener" or rel="noreferrer".

Opening external links in new tabs without rel="noopener" is a security risk. See the explanation for more details.
Safe fix: Add the rel="noopener" attribute.

(lint/security/noBlankTarget)

🔇 Additional comments (108)
src/app/api/generate-invoice/route.tsx (1)

45-46: LGTM! Good addition for monitoring rate limiting.

The console.log statement provides useful debugging information when rate limits are exceeded. The ESLint disable comment is appropriate for server-side logging.

src/mdx-components.tsx (5)

23-27: Excellent formatting improvement for Tailwind classes.

Converting to multi-line template literals significantly improves readability and maintainability of the Tailwind utility classes.


38-41: Consistent formatting applied.

The multi-line template literal format makes the pre element's styling classes much easier to read and modify.


51-54: Clean formatting for inline code styling.

The template literal approach enhances the readability of the complex class combinations for dark/light mode styling.


64-67: Improved blockquote styling readability.

The multi-line format clearly separates the different utility classes and makes the styling intentions more obvious.


82-85: Enhanced image styling clarity.

The formatting improvement makes the responsive image classes much more readable and easier to maintain.

src/globals.css (3)

1-4: Excellent Tailwind v4 migration setup.

The import structure correctly includes the new Tailwind CSS imports, animation plugin, and typography plugin. This follows Tailwind v4 best practices.


7-76: Well-structured theme system with OKLCH colors.

The comprehensive CSS custom properties provide excellent theming capabilities. Using OKLCH color space is a modern approach that offers better perceptual uniformity compared to traditional color spaces.


181-189: Good backward compatibility approach.

The compatibility styles for Tailwind v3 border color defaults ensure a smooth migration without breaking existing components.

src/app/api/generate-invoice/render-pdf-on-server.tsx (1)

13-13: Good formatting improvement.

The additional blank line improves code readability by providing better visual separation between imports and the main code body.

src/components/ui/input-helper-message.tsx (1)

10-10: Class-reordering change is harmless.

Ordering of utility classes has no functional impact; update is fine.

src/app/layout.tsx (2)

16-16: Corrected import path – looks good.

Relative path now matches src/globals.css. ✅


148-148: Body base styles added – good default.

bg-white antialiased ensures text clarity and a neutral background. No issues.

src/components/video.tsx (1)

83-83: Minor class re-ordering – no effect.

Position utilities are order-agnostic; change is purely cosmetic.

postcss.config.mjs (1)

3-3: LGTM: Correct Tailwind v4 PostCSS configuration

The migration to @tailwindcss/postcss is the proper approach for Tailwind v4, which consolidates CSS processing and autoprefixing into a single unified plugin.

src/app/not-found.tsx (2)

11-14: LGTM: Improved readability with multiline template literal

The refactoring to multiline template literal enhances readability while preserving the exact same CSS classes and styling behavior.


23-27: LGTM: Consistent formatting improvement

The multiline template literal formatting is consistent with the broader codebase refactor and improves maintainability.

src/components/ui/button-helper.tsx (1)

16-16: LGTM: Minor class reordering

The reordering of text-pretty and whitespace-normal classes doesn't affect functionality and appears to be part of the consistent styling refactor across the codebase.

src/components/etc/github-logo.tsx (1)

10-13: LGTM: Enhanced readability with multiline formatting

The conversion to multiline template literal improves code readability while preserving the exact same CSS classes and component functionality.

src/app/(app)/components/invoice-pdf-viewer.tsx (1)

14-20: LGTM: Improved readability for responsive classes

The multiline template literal formatting makes the responsive height classes more readable while preserving the exact same styling and error handling behavior.

src/app/changelog/components/date-time.tsx (1)

10-16: LGTM! Improved className formatting and shadow utility update.

The multiline template literal format significantly improves readability compared to the previous single-line string. The shadow utility class update from shadow-sm to shadow-xs aligns with Tailwind v4 conventions.

src/components/project-logo-description.tsx (2)

8-11: Excellent className formatting improvement.

The multiline template literal makes the responsive and utility classes much more readable and maintainable.


20-23: Well-formatted responsive text classes.

The multiline format clearly shows the text size progression from mobile to larger screens.

src/components/ui/badge.tsx (5)

7-12: Well-formatted base styles with Tailwind v4 compatibility.

The multiline template literal improves readability, and the focus:outline-hidden update aligns with Tailwind v4 conventions.


17-21: Clean formatting for default variant styles.

The multiline format makes the color transitions and hover states easy to read and maintain.


23-27: Well-structured secondary variant styles.

The formatting clearly separates light and dark mode styling rules.


29-33: Clear destructive variant formatting.

The red color scheme and hover states are well-organized in the multiline format.


34-37: Concise outline variant styling.

The minimal outline variant is appropriately formatted.

src/app/(app)/components/android-pdf-viewer.tsx (8)

45-49: Well-formatted error state container.

The multiline template literal clearly shows the responsive height classes and layout utilities.


62-64: Clean loading state formatting.

The container classes are well-organized for the loading indicator.


66-69: Nicely formatted spinner animation classes.

The loading spinner styles are clearly readable in the multiline format.


78-80: Clear no-URL state formatting.

Simple and effective formatting for the fallback state.


92-96: Well-structured document loading container.

The responsive height classes are clearly visible and maintainable.


98-101: Consistent spinner formatting.

The loading spinner maintains the same clear formatting pattern throughout the component.


116-121: Good page loading state formatting.

The multiline format makes the responsive height progression easy to follow.


123-126: Final spinner with consistent formatting.

All loading spinners maintain the same clear, readable formatting pattern.

src/components/ui/toasts/error-generating-pdf-toast.tsx (1)

17-20: LGTM – readability win, behaviour unchanged.

Moving the Tailwind classes into a template-literal keeps long class lists tidy without affecting runtime cost (they’re compiled away).

Also applies to: 29-32

src/components/ui/alert-dialog.tsx (1)

43-54: Same order / registration issue as above.

All AlertDialogContent utility strings need the same ordering fix and Radix variant registration, otherwise you’ll get 11 more errors.
Consider running pnpm eslint --fix src/components/ui/alert-dialog.tsx after configuring the plugin – it will auto-sort for you.

src/components/go-to-app-button-cta.tsx (2)

18-22: Non-standard utility shadow-xs – verify it is generated

shadow-xs isn’t part of Tailwind’s default shadow scale (sm | md | lg | xl | 2xl | inner | none).
Unless you added a custom shadow in a Tailwind plugin/boxShadow extension, this class will be stripped at build time, leaving the button without a shadow.
Confirm that:

  1. shadow-xs is defined in your (new) Tailwind config or in a PostCSS layer, or
  2. Revert to shadow-sm / another built-in utility.

Same caveat applies to the instance in invoice-pdf-download-link.tsx.


47-52: 👍 Readability improvement

The multiline template literal makes the variant-specific styles stand out clearly; good call.

src/components/ui/separator.tsx (1)

21-26: LGTM – semantic utilities & px aliases

Switching from h-[1px] / w-[1px] to the canonical h-px / w-px keeps intent clear while preventing potential JIT pruning. No further issues spotted.

src/app/(app)/components/invoice-pdf-download-link.tsx (1)

157-165: Custom utilities shadow-xs & ring-3 may be purged

shadow-xs and ring-3 are not part of Tailwind core scales. If they’re defined only in globals.css, JIT won’t pick them up unless you safelist the selectors or extend the config. Double-check the built CSS for those rules; otherwise users will lose elevation & focus outline.

If you confirm they’re generated, add them to tailwind.config.(js|ts) under:

extend: {
  boxShadow: { xs: '0 1px 1px 0 rgb(0 0 0 / 0.05)' },
  ringWidth: { 3: '3px' },
},
src/components/ui/switch.tsx (2)

18-26: Verify custom outline-* utilities exist

focus-visible:outline-ring/70 and focus-visible:outline-solid are not part of Tailwind-CSS core.
If they aren’t provided via the new globals.css or a plugin, the focus style will be lost, harming accessibility.

Please ensure these utilities are generated (or revert to a supported pattern such as focus-visible:outline focus-visible:outline-2 focus-visible:outline-ring).


34-41: Confirm that shadow-xs is defined

Tailwind’s default shadow scale starts at shadow-sm.
If you rely on a custom preset, great—otherwise this class is ignored and the thumb loses its elevation.

Double-check that shadow-xs is included in the new Tailwind v4 configuration.

src/app/(app)/loading.tsx (1)

3-64: Styling refactor looks good

Purely formatting changes; no functional impact and the multiline template literals improve readability. ✔️

src/components/ui/accordion.tsx (1)

32-36: Accordion class-name reformat is fine

No functional changes; the multi-line literals read better and the animation utilities remain intact.

Also applies to: 61-69

src/app/[locale]/about/loading.tsx (1)

7-8: Check availability of shadow-xs

Same concern as in Switch: Tailwind core does not ship shadow-xs.
Confirm it’s defined globally; otherwise revert to shadow-sm to avoid dropping the header shadow.

src/components/ui/form.tsx (1)

96-105: Multiline template-literals look good

The conversion to template literals keeps the conditional logic intact and doesn’t introduce any functional change. Whitespace/new-line characters are collapsed by Tailwind/clsx, so no unintended classes are generated.
LGTM.

Also applies to: 138-147, 164-173

src/app/confirm-subscription/page.tsx (1)

78-83: Formatting-only change – no issues

The template-literal conversion is purely stylistic; no behaviour is altered.

Also applies to: 108-109, 124-129

src/app/(app)/components/invoice-form/sections/buyer-information.tsx (1)

161-166: Double-check new variant ordering for the Switch

Our search across committed CSS files didn’t locate the data-[state=checked]:[&_span]:translate-x-3 rule (or its RTL counterpart). Please run a local build and confirm that Tailwind emits these exact variant rules—without them, the toggle knob won’t move when checked, and RTL support may break.

  • File: src/app/(app)/components/invoice-form/sections/buyer-information.tsx
    • Lines 161–166
    • Also applies at lines 269–274
src/components/footer.tsx (1)

27-35: Style refactor acknowledged

Class names remain unchanged; only formatting was updated for readability. No action required.

Also applies to: 36-43, 45-50, 67-71, 90-94, 107-112, 152-156, 165-169

src/components/ui/dialog.tsx (1)

24-56: ESLint flags for data-[state=*]:* variants

eslint-plugin-better-tailwindcss marks every data-[state=*] utility as “unregistered”.
These are perfectly valid arbitrary variants; add data-* to the plugin’s allowed list or disable the rule for this file to keep CI green.

src/app/changelog/page.tsx (1)

122-148: prose* classes will be stripped if the Typography plugin isn’t loaded

The linter reports all prose-* utilities as unknown, hinting that @tailwindcss/typography is no longer in the plugin array after the config migration.

Add it back:

// tailwind.config.js
module.exports = {
  plugins: [require('@tailwindcss/typography')],
};

or expect the rich-text styling to vanish in production.

src/components/buyer-management.tsx (1)

323-327: Confirm all tooling is on Tailwind v4

Utilities like text-pretty and the shorthand shrink-0 are v4 additions. If ancillary builds (Storybook, tests, CI containers) still resolve Tailwind v3 they’ll silently drop these classes.

Make sure every build target consumes the same upgraded version before merging.

Also applies to: 345-347, 354-360

src/app/(app)/page.client.tsx (7)

220-230: LGTM: Template literal formatting improves readability

The conversion from inline string to template literal enhances code readability while maintaining the same styling behavior.


323-327: LGTM: Consistent template literal formatting

Good consistency with the overall className formatting refactor throughout the codebase.


385-392: LGTM: Improved container formatting

The template literal format makes the responsive design classes more readable while preserving all styling behavior.


393-399: LGTM: Consistent container formatting

Template literal formatting improves readability of the layout classes without affecting functionality.


490-490: LGTM: Modernized Tailwind class usage

Good use of the shrink-0 shorthand instead of flex-shrink-0, and consistent template literal formatting.


478-482: LGTM: Consistent template literal formatting across components

All these changes maintain the same styling while improving code readability through template literal formatting. Good consistency with the codebase refactoring pattern.

Also applies to: 495-500, 577-581, 589-592, 602-605, 615-618


640-645: LGTM: Template literal formatting enhances readability

All these className conversions to template literals improve code readability while maintaining the same styling behavior. Excellent consistency with the overall refactoring approach.

Also applies to: 653-658, 677-680, 687-692

src/components/ui/tabs.tsx (4)

29-34: LGTM: Template literal formatting improves readability

The conversion to template literal format enhances code organization while maintaining all styling functionality.


49-61: LGTM: Enhanced formatting with minor style refinements

The template literal format significantly improves readability of the complex styling classes. The adjustments to focus-visible:ring-3 and shadow-xs align with the design system updates throughout the codebase.


75-75: LGTM: Semantic improvement with outline-hidden

Good use of outline-hidden instead of outline-none for better semantic clarity while maintaining the same visual behavior.


29-61: ESLint warnings are likely false positives due to Tailwind v4 migration

The static analysis warnings about "unregistered classes" for data-attribute animations and class ordering appear to be related to the Tailwind CSS v4 migration in this PR. These classes are valid Tailwind utilities and the warnings can be safely ignored.

To confirm the Tailwind configuration is properly updated for these animation classes, you may want to verify the new global CSS setup supports these utilities.

src/app/(app)/components/index.tsx (6)

15-19: LGTM: Improved loading component formatting

Template literal formatting enhances readability of the loading component styles while maintaining all functionality.

Also applies to: 32-35


139-139: LGTM: Shadow system update for consistency

The change from shadow-sm to shadow-xs aligns with the design system updates throughout the codebase, providing more subtle shadow effects.


158-162: LGTM: Enhanced formatting for complex styling

Template literal formatting significantly improves readability of the complex shadow and layout styling for the sticky footer container.


182-186: LGTM: Consistent tooltip formatting

Template literal formatting improves readability of tooltip content styling while maintaining proper text hierarchy and spacing.

Also applies to: 199-203


194-194: LGTM: Modernized Tailwind shorthand

Good use of shrink-0 shorthand instead of flex-shrink-0, consistent with the Tailwind CSS modernization throughout the codebase.


222-225: LGTM: Enhanced desktop layout formatting

Template literal formatting improves readability of the responsive desktop layout styling, making the grid system and height adjustments clearer.

Also applies to: 233-236

src/components/ui/dropdown-menu.tsx (5)

91-102: LGTM: Significantly improved readability for complex styling

The template literal format makes the extensive animation, positioning, and theme classes much more readable and maintainable without affecting functionality.


137-157: LGTM: Excellent organization of complex interactive styling

The template literal format transforms a very complex className string into readable, well-organized styling that clearly shows all the interactive states, variants, and theme variations.


175-182: LGTM: Consistent formatting for form components

Template literal formatting improves readability of the checkbox and radio item styling while maintaining all focus states and indicator positioning.

Also applies to: 188-190, 220-227, 232-234


256-260: LGTM: Comprehensive formatting improvements across all components

All dropdown menu sub-components now use consistent template literal formatting, significantly improving code readability while maintaining all styling and interaction behavior.

Also applies to: 276-279, 295-299, 326-333, 341-344, 358-369


91-102: ESLint warnings are false positives from Tailwind v4 migration

The static analysis warnings about "unregistered classes" for data-attribute animations and class ordering are likely related to the Tailwind CSS v4 migration. These animation classes are valid Tailwind utilities and the warnings can be ignored.

Also applies to: 358-369

src/app/changelog/[slug]/page.tsx (7)

98-110: LGTM: Enhanced layout formatting with semantic structure

Template literal formatting improves readability of responsive layout styling while maintaining proper semantic HTML structure and comprehensive responsive/dark mode support.

Also applies to: 115-118, 131-136, 138-142, 144-150


154-159: LGTM: Improved author and social section formatting

Template literal formatting enhances readability of the author information and social sharing styling while maintaining proper text hierarchy and interactive states.

Also applies to: 167-172, 191-194, 201-206, 209-214, 218-222


236-239: LGTM: Consistent social icon formatting

Template literal formatting improves readability of social sharing icons while maintaining platform-specific styling and hover effects across all social platforms.

Also applies to: 250-253, 265-268, 280-283, 295-298, 310-313, 326-329, 339-342


354-376: LGTM: Excellent organization of complex prose styling

The template literal format transforms extensive prose typography styling into a highly readable and maintainable format, clearly organizing all heading levels, text elements, code blocks, and dark mode variants.


380-385: LGTM: Clean loading state formatting

Template literal formatting improves readability of the Suspense fallback styling while maintaining animation and dark mode support.


405-410: LGTM: Enhanced navigation formatting

Template literal formatting significantly improves readability of the complex navigation styling, making the responsive design and interactive states much clearer and more maintainable.

Also applies to: 412-416, 421-424, 426-432, 433-438, 441-448, 458-463, 469-472, 474-480, 482-487, 489-496


132-135: ESLint warnings about prose classes are false positives

The static analysis warnings about "unregistered" prose classes like prose, prose-gray, and prose-headings:* are false positives. These are standard classes from the Tailwind Typography plugin and the warnings are likely due to the Tailwind CSS v4 migration in this PR.

You may want to verify that the Tailwind Typography plugin is properly configured in the new setup.

Also applies to: 354-376

src/components/ui/select-native.tsx (1)

19-29: ring-3 is not a standard Tailwind width – verify custom token exists

Tailwind ships ring widths ring-0, ring-1, ring-2, ring-4, ring-8.
ring-3 will be ignored unless you’ve extended theme.ringWidth.

If the intent was to keep the previous 2-pixel ring, revert to ring-2; otherwise add the custom value in the Tailwind config (or the new globals.css).

src/components/subscribe-input.tsx (1)

26-33: Static-analysis flags show unregistered animation utilities

The linter reports animate-in, fade-in-0, slide-in-from-top-1 as unknown classes (line 70).
Confirm these utilities are declared in globals.css (or in the new plugin) and, if they’re custom keyframes, add them to the safelist so better-tailwindcss stops flagging.

src/app/[locale]/about/page.tsx (1)

661-668: GoToAppButton variant leaks white text on dark bg in dark-mode

When bg-white is applied inside a dark section (bg-slate-900) the button will stay white in dark mode as well, possibly clashing with the design. Consider bg-slate-50 dark:bg-white or remove the explicit background so the base component handles it.

src/app/(app)/components/invoice-form/sections/invoice-items.tsx (1)

116-121: Shadow downgrade (shadowshadow-sm) may affect visual hierarchy

If the surrounding cards still use shadow-lg / shadow-md, reducing to shadow-sm could flatten the item and hurt affordance. Double-check the design spec.

src/app/(app)/components/invoice-form/index.tsx (4)

358-358: LGTM! Consistent shadow utility updates.

The change from shadow to shadow-sm for all AccordionItem components is consistent and aligns with the overall styling updates in this PR.

Also applies to: 377-377, 396-396, 415-415


443-443: LGTM! Shadow utility refinement.

The change from shadow-sm to shadow-xs for the total field container is consistent with other shadow utility updates throughout the codebase.


472-472: Verify margin class order doesn't affect layout.

The order of margin classes was swapped from mb-2 mt-6 to mt-6 mb-2. While this shouldn't affect the final styling, it's worth verifying that the layout remains unchanged.


488-494: LGTM! Consistent Switch component className refactoring.

The Switch component className changes are consistent across all instances:

  • Converted to multiline template literals for better readability
  • Updated selector syntax from [_span]:data-[state=checked]:translate-x-3 to data-[state=checked]:[&_span]:translate-x-3
  • RTL support syntax similarly updated

These changes align with Tailwind CSS v4 best practices and improve code maintainability.

Also applies to: 614-620, 667-673, 694-700

src/components/ui/input.tsx (2)

12-22: LGTM! Well-structured Input component styling refactor.

The refactoring improves readability with multiline template literals and includes several refinements:

  • Shadow utility updated from shadow-sm to shadow-xs (consistent with other components)
  • Focus styles simplified by removing explicit focus-visible:border-indigo-500 while keeping the ring style
  • aria-readonly selectors changed from bracket notation to the more concise variant syntax

All changes maintain functionality while improving code maintainability.


25-30: LGTM! Search and file input type styles properly formatted.

The search and file input type-specific styles have been converted to multiline template literals with proper formatting, improving readability without altering functionality.

Also applies to: 32-38

src/components/ui/multi-select.tsx (4)

34-38: LGTM! Variant styles properly formatted.

The multiSelectVariants base classes have been converted to a multiline template literal, improving readability while maintaining the same hover animation effects.


228-237: LGTM! Button styling enhancements.

The Button component styling has been improved with:

  • Multiline template literal formatting for better readability
  • Shadow utility updated to shadow-xs (consistent with other components)
  • Enhanced focus styles with focus-visible:ring-3 for better accessibility

These changes align with the overall styling updates in the PR.

Also applies to: 299-309


311-311: Minor: ChevronDown icon class reordering.

The ChevronDown icon classes were reordered from h-4 w-4 text-muted-foreground to h-4 w-4 text-muted-foreground. While functionally identical, this change appears to be for consistency.


268-273: LGTM! Consistent Badge and CommandItem styling.

The Badge and CommandItem components have been refactored with multiline template literals, maintaining functionality while improving code readability. The conditional styling logic remains intact.

Also applies to: 344-354, 386-391

src/app/(app)/components/invoice-form/sections/general-information.tsx (4)

227-229: LGTM! Logo image styling updates.

The logo image styling has been properly refactored with:

  • Shadow utility updated from shadow-sm to shadow-xs
  • Multiline template literal formatting

These changes are consistent with the overall styling updates.


234-239: LGTM! Remove button focus style update.

The focus style change from focus:outline-none to focus:outline-hidden is a good improvement. The outline-hidden utility is more semantic and maintains accessibility while hiding the outline.


638-644: LGTM! Switch component className refactoring.

The Switch component className has been consistently refactored to match the pattern used in other files, with proper data attribute selector syntax for Tailwind CSS v4.


261-265: LGTM! Consistent multiline template literal formatting.

The label upload area and alert message container have been refactored with multiline template literals, improving readability while maintaining the same styling behavior.

Also applies to: 508-519

eslint.config.mjs (3)

9-20: LGTM! Proper ESM compatibility setup.

The addition of dirname and fileURLToPath imports correctly sets up __dirname for ESM compatibility, fixing the invalid import.meta.dirname usage in FlatCompat initialization.


29-38: LGTM! Enhanced linting configuration.

Good additions:

  • reportUnusedDisableDirectives: true helps maintain clean code by flagging unnecessary ESLint disable comments
  • projectService: true enables TypeScript's project service for better type-aware linting

131-131: LGTM! Correct Tailwind CSS v4 configuration.

The better-tailwindcss plugin is properly configured to use src/globals.css as the entry point, which aligns with Tailwind CSS v4's CSS-based configuration approach (as opposed to the JavaScript-based config in v3).

Also applies to: 178-178

src/components/seller-management.tsx (4)

255-261: Conditional placeholder styling looks good

Using cn() to append "text-gray-700 italic" only when no seller is selected is concise and keeps the base styles untouched.
No further action needed.


337-344: Clarity-first copy + semantic colouring approved

The reordered class string (text-xs leading-relaxed text-pretty text-red-700) keeps typography utilities grouped and uses the new text-pretty helper—nice touch for readability.


357-365: Tooltip body re-ordering OK

Same observation as above—class-ordering and text-pretty introduction don’t affect behaviour and improve consistency.


368-377: Tailwind v4 migration from flex-shrink-0shrink-0 is correct

The icon now follows v4 naming while the additional fill-red-600/text-white combo cleanly separates fill and stroke colours for Lucide SVGs.

const config = {
trailingComma: "es5",
plugins: [require.resolve("prettier-plugin-tailwindcss")],
// plugins: [require.resolve("prettier-plugin-tailwindcss")],
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Verify Tailwind class ordering after disabling prettier-plugin-tailwindcss.

Commenting out the Prettier Tailwind plugin aligns with the migration to ESLint-based linting, but this removes automatic class ordering. Ensure that eslint-plugin-better-tailwindcss is properly configured to maintain consistent class ordering across the codebase.


🏁 Script executed:

#!/bin/bash
# Verify ESLint Tailwind configuration is properly set up
echo "Checking ESLint configuration for Tailwind CSS linting..."
cat eslint.config.mjs | grep -A 10 -B 5 "tailwind"

echo -e "\nChecking if better-tailwindcss plugin is installed..."
cat package.json | grep "better-tailwindcss"

Length of output: 3544


Ensure Tailwind CSS class ordering is enforced via ESLint plugin

We’ve confirmed that eslint-plugin-better-tailwindcss v3.7.1 is installed and pulled into your eslint.config.mjs with the recommended-warn and recommended-error rule sets. However, class‐order enforcement isn’t explicitly enabled (the better-tailwindcss/enforce-consistent-class-order rule is commented out), so you should turn it on to retain the same ordering behavior Prettier provided.

• File to update: eslint.config.mjs
• Location: inside the rules object for "better-tailwindcss"

Suggested diff:

   rules: {
-    // "better-tailwindcss/enforce-consistent-class-order": "off",
+    "better-tailwindcss/enforce-consistent-class-order": "error",
     "better-tailwindcss/enforce-consistent-line-wrapping": [
       "warn",
       { printWidth: 100 },
     ],
   },

This guarantees consistent Tailwind class ordering across your TS/TSX files.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// plugins: [require.resolve("prettier-plugin-tailwindcss")],
rules: {
"better-tailwindcss/enforce-consistent-class-order": "error",
"better-tailwindcss/enforce-consistent-line-wrapping": [
"warn",
{ printWidth: 100 },
],
},
🤖 Prompt for AI Agents
In eslint.config.mjs, locate the rules object for "better-tailwindcss" and
explicitly enable the "better-tailwindcss/enforce-consistent-class-order" rule
by setting it to "error" or "warn". This will enforce consistent Tailwind CSS
class ordering as previously handled by Prettier, ensuring uniform styling
across your TS/TSX files.

Comment on lines +7 to +8
"config": "",
"css": "src/globals.css",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

❓ Verification inconclusive

Empty tailwind.config path may break the shadcn CLI.

The generator (shadcn-ui@latest init / add) expects a valid Tailwind config file to read theme tokens.
"config": "" will be interpreted as “file not found” and the CLI may bail out or silently fall back to the default theme.

Consider either:

-    "config": "",
+    // point to the actual file if you keep one
+    "config": "tailwind.config.js",

or drop the key entirely if you really want the default theme:

-    "config": "",

🏁 Script executed:

#!/usr/bin/env bash
# Verify whether a Tailwind config file still exists anywhere in the repo.
fd '^tailwind\.config\.(js|cjs|mjs|ts)$' .

Length of output: 44


Ensure a valid Tailwind config or remove the config key

It looks like there isn’t a tailwind.config.js (or .cjs/.mjs/.ts) file in the repo. An empty "config": "" entry in components.json can cause the shadcn CLI to error out or silently fall back to the default theme. To address this, choose one of the following:

  • If you need custom theme tokens, add a Tailwind config file at the project root and point to it:
      // components.json
    - "config": "",
    + "config": "tailwind.config.js",
  • If you don’t require any custom theme and prefer the default, simply remove the key:
    - "config": "",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"config": "",
"css": "src/globals.css",
// components.json
- "config": "",
+ "config": "tailwind.config.js",
"css": "src/globals.css",
🤖 Prompt for AI Agents
In components.json at lines 7 to 8, the "config" key is set to an empty string,
which can cause errors or fallback issues with the shadcn CLI. To fix this,
either add a valid Tailwind config file (e.g., tailwind.config.js) at the
project root and update the "config" value to point to it, or if no custom theme
is needed, remove the "config" key entirely from components.json.

Comment on lines +91 to +181
{
files: ["src/**/*.{ts,tsx,cts,mts}"],
languageOptions: {
parser: eslintParserTypeScript,
parserOptions: {
project: true,
},
},
},
{
files: ["src/**/*.{jsx,tsx}"],
languageOptions: {
parser: eslintParserTypeScript,
parserOptions: {
project: true,
ecmaFeatures: {
jsx: true,
},
},
},
plugins: {
"better-tailwindcss": eslintPluginBetterTailwindcss,
},
rules: {
// enable all recommended rules to report a warning
...eslintPluginBetterTailwindcss.configs["recommended-warn"].rules,
// enable all recommended rules to report an error
...eslintPluginBetterTailwindcss.configs["recommended-error"].rules,

// or configure rules individually
"better-tailwindcss/enforce-consistent-line-wrapping": [
"warn",
{ printWidth: 100 },
],
},
settings: {
"better-tailwindcss": {
// tailwindcss 3: the path to the tailwind config file (eg: `tailwind.config.js`)
// tailwindConfig: "tailwind.config.js",
// tsconfig: "tsconfig.json",
entryPoint: "src/globals.css",
},
},
},

// for better-tailwindcss plugin
{
files: ["src/**/*.{ts,tsx,cts,mts}"],
languageOptions: {
parser: eslintParserTypeScript,
parserOptions: {
project: true,
},
},
},
{
files: ["src/**/*.{jsx,tsx}"],
languageOptions: {
parserOptions: {
ecmaFeatures: {
jsx: true,
},
},
},
plugins: {
// https://github.com/schoero/eslint-plugin-better-tailwindcss
"better-tailwindcss": eslintPluginBetterTailwindcss,
},
rules: {
// enable all recommended rules to report a warning
...eslintPluginBetterTailwindcss.configs["recommended-warn"].rules,
// enable all recommended rules to report an error
...eslintPluginBetterTailwindcss.configs["recommended-error"].rules,

// or configure rules individually
"better-tailwindcss/enforce-consistent-line-wrapping": [
"warn",
{ printWidth: 100 },
],
// "better-tailwindcss/enforce-consistent-class-order": "off",
},
settings: {
"better-tailwindcss": {
// tailwindcss 4: the path to the entry file of the css based tailwind config (eg: `src/global.css`)
// entryPoint: "src/global.css",
// tailwindcss 3: the path to the tailwind config file (eg: `tailwind.config.js`)
// tailwindConfig: "tailwind.config.js",
entryPoint: "src/globals.css",
},
},
},
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Remove duplicate better-tailwindcss configuration.

There are two identical configuration blocks for the better-tailwindcss plugin (lines 91-134 and 136-181). This duplication should be removed to avoid confusion and potential conflicts.

  },
-  {
-    files: ["src/**/*.{ts,tsx,cts,mts}"],
-    languageOptions: {
-      parser: eslintParserTypeScript,
-      parserOptions: {
-        project: true,
-      },
-    },
-  },
-  {
-    files: ["src/**/*.{jsx,tsx}"],
-    languageOptions: {
-      parser: eslintParserTypeScript,
-      parserOptions: {
-        project: true,
-        ecmaFeatures: {
-          jsx: true,
-        },
-      },
-    },
-    plugins: {
-      "better-tailwindcss": eslintPluginBetterTailwindcss,
-    },
-    rules: {
-      // enable all recommended rules to report a warning
-      ...eslintPluginBetterTailwindcss.configs["recommended-warn"].rules,
-      // enable all recommended rules to report an error
-      ...eslintPluginBetterTailwindcss.configs["recommended-error"].rules,
-
-      // or configure rules individually
-      "better-tailwindcss/enforce-consistent-line-wrapping": [
-        "warn",
-        { printWidth: 100 },
-      ],
-    },
-    settings: {
-      "better-tailwindcss": {
-        // tailwindcss 3: the path to the tailwind config file (eg: `tailwind.config.js`)
-        // tailwindConfig: "tailwind.config.js",
-        // tsconfig: "tsconfig.json",
-        entryPoint: "src/globals.css",
-      },
-    },
-  },
-
-  // for better-tailwindcss plugin
   {
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
{
files: ["src/**/*.{ts,tsx,cts,mts}"],
languageOptions: {
parser: eslintParserTypeScript,
parserOptions: {
project: true,
},
},
},
{
files: ["src/**/*.{jsx,tsx}"],
languageOptions: {
parser: eslintParserTypeScript,
parserOptions: {
project: true,
ecmaFeatures: {
jsx: true,
},
},
},
plugins: {
"better-tailwindcss": eslintPluginBetterTailwindcss,
},
rules: {
// enable all recommended rules to report a warning
...eslintPluginBetterTailwindcss.configs["recommended-warn"].rules,
// enable all recommended rules to report an error
...eslintPluginBetterTailwindcss.configs["recommended-error"].rules,
// or configure rules individually
"better-tailwindcss/enforce-consistent-line-wrapping": [
"warn",
{ printWidth: 100 },
],
},
settings: {
"better-tailwindcss": {
// tailwindcss 3: the path to the tailwind config file (eg: `tailwind.config.js`)
// tailwindConfig: "tailwind.config.js",
// tsconfig: "tsconfig.json",
entryPoint: "src/globals.css",
},
},
},
// for better-tailwindcss plugin
{
files: ["src/**/*.{ts,tsx,cts,mts}"],
languageOptions: {
parser: eslintParserTypeScript,
parserOptions: {
project: true,
},
},
},
{
files: ["src/**/*.{jsx,tsx}"],
languageOptions: {
parserOptions: {
ecmaFeatures: {
jsx: true,
},
},
},
plugins: {
// https://github.com/schoero/eslint-plugin-better-tailwindcss
"better-tailwindcss": eslintPluginBetterTailwindcss,
},
rules: {
// enable all recommended rules to report a warning
...eslintPluginBetterTailwindcss.configs["recommended-warn"].rules,
// enable all recommended rules to report an error
...eslintPluginBetterTailwindcss.configs["recommended-error"].rules,
// or configure rules individually
"better-tailwindcss/enforce-consistent-line-wrapping": [
"warn",
{ printWidth: 100 },
],
// "better-tailwindcss/enforce-consistent-class-order": "off",
},
settings: {
"better-tailwindcss": {
// tailwindcss 4: the path to the entry file of the css based tailwind config (eg: `src/global.css`)
// entryPoint: "src/global.css",
// tailwindcss 3: the path to the tailwind config file (eg: `tailwind.config.js`)
// tailwindConfig: "tailwind.config.js",
entryPoint: "src/globals.css",
},
},
},
{
files: ["src/**/*.{ts,tsx,cts,mts}"],
languageOptions: {
parser: eslintParserTypeScript,
parserOptions: {
project: true,
},
},
},
{
files: ["src/**/*.{jsx,tsx}"],
languageOptions: {
parser: eslintParserTypeScript,
parserOptions: {
project: true,
ecmaFeatures: {
jsx: true,
},
},
},
plugins: {
"better-tailwindcss": eslintPluginBetterTailwindcss,
},
rules: {
// enable all recommended rules to report a warning
...eslintPluginBetterTailwindcss.configs["recommended-warn"].rules,
// enable all recommended rules to report an error
...eslintPluginBetterTailwindcss.configs["recommended-error"].rules,
// or configure rules individually
"better-tailwindcss/enforce-consistent-line-wrapping": [
"warn",
{ printWidth: 100 },
],
},
settings: {
"better-tailwindcss": {
entryPoint: "src/globals.css",
},
},
},
🤖 Prompt for AI Agents
In eslint.config.mjs between lines 91 and 181, there are two duplicate
configuration blocks for the better-tailwindcss plugin with identical settings.
Remove one of these duplicate blocks entirely to avoid confusion and potential
conflicts, ensuring only a single configuration block for better-tailwindcss
remains.

Comment on lines +93 to 100
"@tailwindcss/postcss": "4.1.11",
"@types/file-saver": "2.0.7",
"@types/node": "22.8.1",
"@types/pdf-parse": "1.1.5",
"@types/react": "18.3.12",
"@types/react-dom": "18.3.1",
"@typescript-eslint/parser": "8.38.0",
"@typescript/native-preview": "7.0.0-dev.20250525.1",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Version / package mismatch in TypeScript-ESLint tooling

@typescript-eslint/parser is declared at 8.38.0 while typescript-eslint meta-package is 8.32.0 and @typescript-eslint/eslint-plugin is missing entirely.
Mixing minor versions regularly breaks linting.

Action items:

  1. Pin all @typescript-eslint/* packages (parser + eslint-plugin) to the same version, e.g. 8.38.0.
  2. Remove the stray typescript-eslint entry – that package is unrelated.
  3. Add "@typescript-eslint/eslint-plugin": "8.38.0" if ESLint config expects it.

Optionally, remove prettier-plugin-tailwindcss if you’ve disabled it in Prettier to avoid unnecessary install time.

Also applies to: 116-119

🤖 Prompt for AI Agents
In package.json around lines 93 to 100 and 116 to 119, the @typescript-eslint
packages have version mismatches and missing entries. Ensure all
@typescript-eslint packages, including @typescript-eslint/parser and
@typescript-eslint/eslint-plugin, are pinned to the same version, such as
8.38.0. Remove the unrelated typescript-eslint package entry. Add
@typescript-eslint/eslint-plugin at version 8.38.0 if it is expected by the
ESLint configuration. Optionally, remove prettier-plugin-tailwindcss if it is
disabled in Prettier to reduce install time.

Comment on lines 100 to 116
<div
className="relative max-w-sm rounded-lg border border-indigo-200 bg-gradient-to-br from-indigo-50 via-white to-purple-50 p-4 shadow-xl"
className={`
relative max-w-sm rounded-lg border border-indigo-200 bg-linear-to-br from-indigo-50
via-white to-purple-50 p-4 shadow-xl
`}
data-testid="download-pdf-toast"
>
{/* Close button - styled like default Sonner toast */}
<SonnerCloseButton onClick={() => sonnerToast.dismiss(id)} />

<div className="relative">
<div className="mb-2 flex items-center gap-2">
<div className="flex h-8 w-8 items-center justify-center rounded-lg bg-gradient-to-br from-indigo-500 to-purple-600">
<div className={`
flex h-8 w-8 items-center justify-center rounded-lg bg-linear-to-br from-indigo-500
to-purple-600
`}>
<GiftIcon className="h-4 w-4 text-white" />
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Verify custom bg-linear-to-* utilities exist

The refactor replaces the native Tailwind bg-gradient-to-* utilities with bg-linear-to-*. Tailwind v4 does not ship these by default; they must be declared in src/globals.css (or a plugin layer).
Please confirm the utilities are defined, otherwise these components will render without background gradients.

Also applies to: 130-135, 192-199, 221-226, 250-264, 276-284, 341-345, 368-372


🏁 Script executed:

#!/bin/bash
# Grep for a custom utility definition
rg --no-heading 'bg-linear-to-' -n src | head

Length of output: 1478


🏁 Script executed:

#!/bin/bash
# Search for custom gradient utilities in CSS files
rg --no-heading '\.bg-linear-to-' -n --glob '*.css' .
# Search for custom definitions in Tailwind config
rg --no-heading 'bg-linear-to-' -n tailwind.config.js

Length of output: 168


🏁 Script executed:

#!/bin/bash
# List all CSS files in the repository
echo "CSS files found:"
rg --files --glob '*.css'

# Search for gradient utility definitions inside all CSS files
echo -e "\nSearching for 'bg-linear-to-' definitions in CSS files:"
rg --no-heading 'bg-linear-to-' -n --glob '*.css'

# Locate any Tailwind configuration files (JS or TS)
echo -e "\nTailwind config files:"
rg --files | grep -Ei 'tailwind(\.config)?\.(js|ts)$' || echo "No Tailwind config file found"

# If a globals.css exists at src/globals.css, inspect it
if [ -f src/globals.css ]; then
  echo -e "\nInspecting src/globals.css:"
  rg --no-heading 'bg-linear-to-' -n src/globals.css || echo "No definitions in src/globals.css"
fi

Length of output: 683


Define missing bg-linear-to-* utilities

I searched both your global CSS and potential Tailwind config files and found no custom definitions for the new bg-linear-to-* classes. Without those, all gradients using bg-linear-to-b, bg-linear-to-r, bg-linear-to-br, etc., will fall back to a solid background.

Please add definitions for these utilities, for example by extending Tailwind’s backgroundImage in your tailwind.config.js or by declaring the corresponding @layer utilities rules in src/globals.css.

• If using Tailwind config, create (or locate) tailwind.config.js/.ts and add under theme.extend.backgroundImage:

module.exports = {
  theme: {
    extend: {
      backgroundImage: {
        'linear-to-r': 'linear-gradient(to right, var(--tw-gradient-stops))',
        'linear-to-b': 'linear-gradient(to bottom, var(--tw-gradient-stops))',
        'linear-to-br': 'linear-gradient(to bottom right, var(--tw-gradient-stops))',
        // …add as needed
      },
    },
  },
  // …rest of config
}

• Or in src/globals.css (adjust syntax to your setup):

@layer utilities {
  .bg-linear-to-r { background-image: linear-gradient(to right, var(--tw-gradient-stops)); }
  .bg-linear-to-b { background-image: linear-gradient(to bottom, var(--tw-gradient-stops)); }
  .bg-linear-to-br { background-image: linear-gradient(to bottom right, var(--tw-gradient-stops)); }
  /* …etc. */
}

Once these utilities are declared, all toast components will render the intended gradients.

🤖 Prompt for AI Agents
In src/app/(app)/components/cta-toasts/index.tsx around lines 100 to 116, the
CSS classes bg-linear-to-br and similar gradient utilities are used but not
defined in your Tailwind setup or global CSS. To fix this, add these gradient
background utilities either by extending the backgroundImage property in your
tailwind.config.js file under theme.extend with entries like 'linear-to-r',
'linear-to-b', and 'linear-to-br' mapped to the appropriate linear-gradient CSS
strings, or by declaring corresponding CSS rules inside an @layer utilities
block in src/globals.css defining these classes with background-image properties
using linear-gradient and var(--tw-gradient-stops). This will ensure the
gradient backgrounds render correctly in the toast components.

Comment on lines +60 to 66
`
flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-hidden
placeholder:text-slate-500
disabled:cursor-not-allowed disabled:opacity-50
dark:placeholder:text-slate-400
`,
className
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

outline-hidden is not a Tailwind utility – causes loss of focus ring

Tailwind v4 valid values: outline-none, outline, outline-0, outline-1, etc.
outline-hidden will be stripped → the input will inherit browser default outline, hurting accessibility. Revert to outline-none and rely on the surrounding border / ring for focus-visible styling.

- flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-hidden
+ flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
`
flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-hidden
placeholder:text-slate-500
disabled:cursor-not-allowed disabled:opacity-50
dark:placeholder:text-slate-400
`,
className
`
flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none
placeholder:text-slate-500
disabled:cursor-not-allowed disabled:opacity-50
dark:placeholder:text-slate-400
`,
className
🤖 Prompt for AI Agents
In src/components/ui/command.tsx around lines 60 to 66, replace the invalid
Tailwind class 'outline-hidden' with 'outline-none' to prevent the loss of the
focus ring and maintain accessibility. This change ensures the input does not
inherit the browser's default outline and relies on the surrounding border or
ring for focus-visible styling.

Comment on lines +25 to +28
fixed inset-0 z-101 bg-black/80
data-[state=closed]:animate-out data-[state=closed]:fade-out-0
data-[state=open]:animate-in data-[state=open]:fade-in-0
`,
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

z-101 is invalid – overlay/content lose their stacking order

Tailwind’s preset stops at z-50. Switching from the valid arbitrary value z-[101] to z-101 removes the rule, so the dialog may appear behind other fixed elements.

- fixed inset-0 z-101 bg-black/80
+ fixed inset-0 z-[101] bg-black/80
...
- fixed top-1/2 left-1/2 z-101 grid …
+ fixed top-1/2 left-1/2 z-[101] grid …

Re-introduce the bracketed form (or extend the scale in tailwind.config) for reliable stacking.

Also applies to: 46-56

🧰 Tools
🪛 ESLint

[error] 24-28: Incorrect class order. Expected

↵ ········fixed·inset-0·z-101·bg-black/80↵ ········data-[state=closed]:animate-out·data-[state=closed]:fade-out-0↵ ········data-[state=open]:animate-in·data-[state=open]:fade-in-0↵ ······

to be

↵ ········data-[state=closed]:animate-out·data-[state=closed]:fade-out-0·data-[state=open]:fade-in-0·fixed↵ ········inset-0·z-101↵ ········bg-black/80·data-[state=open]:animate-in↵ ······

(better-tailwindcss/enforce-consistent-class-order)


[error] 26-26: Unregistered class detected: data-[state=closed]:animate-out

(better-tailwindcss/no-unregistered-classes)


[error] 26-26: Unregistered class detected: data-[state=closed]:fade-out-0

(better-tailwindcss/no-unregistered-classes)


[error] 27-27: Unregistered class detected: data-[state=open]:animate-in

(better-tailwindcss/no-unregistered-classes)


[error] 27-27: Unregistered class detected: data-[state=open]:fade-in-0

(better-tailwindcss/no-unregistered-classes)

🤖 Prompt for AI Agents
In src/components/ui/dialog.tsx around lines 25 to 28 and also lines 46 to 56,
the class name z-101 is invalid in Tailwind CSS because the default z-index
scale only goes up to z-50. Replace z-101 with the arbitrary value syntax
z-[101] to ensure the stacking order is applied correctly and the dialog appears
above other fixed elements. Alternatively, you can extend the z-index scale in
tailwind.config.js, but using the bracketed form is the quickest fix here.

Comment on lines +22 to +33
`
z-50 w-72 rounded-md border border-slate-200 bg-white p-4 text-slate-950 shadow-md
outline-hidden
data-[side=bottom]:slide-in-from-top-2
data-[side=left]:slide-in-from-right-2
data-[side=right]:slide-in-from-left-2
data-[side=top]:slide-in-from-bottom-2
data-[state=closed]:animate-out data-[state=closed]:fade-out-0
data-[state=closed]:zoom-out-95
data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95
dark:border-slate-800 dark:bg-slate-950 dark:text-slate-50
`,
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Good formatting improvement, but address ESLint configuration issues.

The multiline template literal format significantly improves readability. However, the ESLint errors indicate potential issues with the Tailwind v4 migration:

  1. Class order enforcement: The new better-tailwindcss/enforce-consistent-class-order rule expects a different class arrangement
  2. Unregistered animation classes: The data-[state=*]:animate-* and data-[side=*]:slide-in-* classes are not recognized

These animation classes are likely custom utilities that need to be properly configured in the new Tailwind v4 setup.

Verify that the animation utilities are properly defined in the new Tailwind configuration:


🏁 Script executed:

#!/bin/bash
# Check if animation utilities are defined in the new global CSS
echo "Checking for animation utility definitions..."
rg -A 5 -B 5 "(slide-in|animate-in|animate-out|fade-in|fade-out|zoom-in|zoom-out)" src/globals.css

# Check for any custom animation definitions
echo -e "\nChecking for @keyframes definitions..."
rg -A 10 "@keyframes" src/globals.css

Length of output: 767


🏁 Script executed:

#!/bin/bash
# Verify custom animation keyframes and animation utilities in Tailwind config
echo "Searching Tailwind config for keyframes extensions..."
rg -n -A5 "keyframes" tailwind.config.{js,ts} || echo "No keyframes block found in tailwind.config.js/ts"
echo -e "\nSearching Tailwind config for animation extensions..."
rg -n -A5 "animation" tailwind.config.{js,ts} || echo "No animation block found in tailwind.config.js/ts"

Length of output: 813


🏁 Script executed:

#!/bin/bash
# Locate Tailwind configuration files
echo "Locating tailwind configuration files..."
fd tailwind.config.* || echo "No tailwind.config.* found"

# Search package.json for animation-related Tailwind plugins
echo -e "\nChecking package.json for animation-related dependencies..."
rg -n "tailwindcss-animate" package.json || echo "No tailwindcss-animate plugin found"
rg -n "@tailwindcss" package.json || echo "No @tailwindcss scoped plugins found"

# Inspect src/globals.css for custom utility definitions
echo -e "\nInspecting src/globals.css for custom utility definitions..."
rg -n "@layer utilities" -A20 src/globals.css || echo "No @layer utilities block found"
rg -n "slide-in-from" -A5 src/globals.css || echo "No slide-in-from-* utility definitions"
rg -n "animate-in" -A5 src/globals.css || echo "No animate-in/out utility definitions"
rg -n "fade-in" -A5 src/globals.css || echo "No fade-in/out utility definitions"
rg -n "zoom-in" -A5 src/globals.css || echo "No zoom-in/out utility definitions"

Length of output: 1354


Configure and register custom animation utilities in Tailwind CSS

It looks like none of your data-[state=*]:animate-*, data-[state=*]:fade-*, data-[state=*]:zoom-* or data-[side=*]:slide-in-* classes are defined in your project’s Tailwind setup. You’ll need to:

• Add (or update) a tailwind.config.js/ts file at project root
– Install and register the tailwindcss-animate plugin (you already have it in package.json)
– Extend theme.keyframes and theme.animation with your custom names
• Or declare them under @layer utilities in src/globals.css with matching @keyframes

Also, once the utilities are recognized, reorder your classes to satisfy the new better-tailwindcss/enforce-consistent-class-order rule.

Files to update:

  • tailwind.config.js (or .ts)
  • src/globals.css (if you prefer defining utilities there)

Example tailwind.config.ts snippet:

+ import { defineConfig } from 'tailwindcss'
+ import animatePlugin from 'tailwindcss-animate'
  export default defineConfig({
    content: ['./src/**/*.{js,ts,jsx,tsx}'],
    theme: {
      extend: {
+       keyframes: {
+         'slide-in-from-top': { /* … */ },
+         'slide-in-from-right': { /* … */ },
+         /* etc. */
+       },
+       animation: {
+         'slide-in-from-top-2': 'slide-in-from-top 0.2s ease-out',
+         'animate-in':         'fade-in 0.15s ease-in-out',
+         /* etc. */
+       },
      },
    },
+   plugins: [animatePlugin],
  })

Or in src/globals.css:

@layer utilities {
  @keyframes slide-in-from-top { /* … */ }
  .slide-in-from-top-2 { animation: slide-in-from-top 0.2s ease-out; }
  /* define each utility */
}
🧰 Tools
🪛 ESLint

[error] 22-33: Incorrect class order. Expected

↵ ··········z-50·w-72·rounded-md·border·border-slate-200·bg-white·p-4·text-slate-950·shadow-md↵ ··········outline-hidden↵ ··········data-[side=bottom]:slide-in-from-top-2↵ ··········data-[side=left]:slide-in-from-right-2↵ ··········data-[side=right]:slide-in-from-left-2↵ ··········data-[side=top]:slide-in-from-bottom-2↵ ··········data-[state=closed]:animate-out·data-[state=closed]:fade-out-0↵ ··········data-[state=closed]:zoom-out-95↵ ··········data-[state=open]:animate-in·data-[state=open]:fade-in-0·data-[state=open]:zoom-in-95↵ ··········dark:border-slate-800·dark:bg-slate-950·dark:text-slate-50↵ ········

to be

↵ ··········data-[side=bottom]:slide-in-from-top-2·data-[side=left]:slide-in-from-right-2·data-[side=right]:slide-in-from-left-2·data-[side=top]:slide-in-from-bottom-2·data-[state=closed]:fade-out-0·data-[state=closed]:zoom-out-95·data-[state=open]:fade-in-0·data-[state=open]:zoom-in-95·z-50↵ ··········w-72↵ ··········rounded-md↵ ··········border↵ ··········border-slate-200↵ ··········bg-white↵ ··········p-4·text-slate-950↵ ··········shadow-md↵ ··········outline-hidden·data-[state=closed]:animate-out·data-[state=open]:animate-in↵ ··········dark:border-slate-800·dark:bg-slate-950·dark:text-slate-50↵ ········

(better-tailwindcss/enforce-consistent-class-order)


[error] 25-25: Unregistered class detected: data-[side=bottom]:slide-in-from-top-2

(better-tailwindcss/no-unregistered-classes)


[error] 26-26: Unregistered class detected: data-[side=left]:slide-in-from-right-2

(better-tailwindcss/no-unregistered-classes)


[error] 27-27: Unregistered class detected: data-[side=right]:slide-in-from-left-2

(better-tailwindcss/no-unregistered-classes)


[error] 28-28: Unregistered class detected: data-[side=top]:slide-in-from-bottom-2

(better-tailwindcss/no-unregistered-classes)


[error] 29-29: Unregistered class detected: data-[state=closed]:animate-out

(better-tailwindcss/no-unregistered-classes)


[error] 29-29: Unregistered class detected: data-[state=closed]:fade-out-0

(better-tailwindcss/no-unregistered-classes)


[error] 30-30: Unregistered class detected: data-[state=closed]:zoom-out-95

(better-tailwindcss/no-unregistered-classes)


[error] 31-31: Unregistered class detected: data-[state=open]:animate-in

(better-tailwindcss/no-unregistered-classes)


[error] 31-31: Unregistered class detected: data-[state=open]:fade-in-0

(better-tailwindcss/no-unregistered-classes)


[error] 31-31: Unregistered class detected: data-[state=open]:zoom-in-95

(better-tailwindcss/no-unregistered-classes)

🤖 Prompt for AI Agents
In src/components/ui/popover.tsx lines 22 to 33, the custom animation classes
used are not defined in the Tailwind CSS setup. To fix this, add or update
tailwind.config.js or tailwind.config.ts at the project root to include the
tailwindcss-animate plugin and extend theme.keyframes and theme.animation with
the custom animations matching the class names used. Alternatively, define the
keyframes and animation utilities under @layer utilities in src/globals.css with
corresponding @keyframes and class definitions. After defining these, reorder
the classes in the component to comply with the
better-tailwindcss/enforce-consistent-class-order rule.

Comment on lines +16 to +17
focus-visible:border-indigo-500/50 focus-visible:ring-3 focus-visible:ring-indigo-200
disabled:cursor-not-allowed disabled:opacity-50
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

ring-3 is not part of Tailwind’s default ring-width scale

The default scale only ships ring, ring-0, ring-1, ring-2, ring-4, and ring-8.
ring-3 will therefore be purged at build-time unless you have explicitly extended theme.ringWidth. The previous focus-visible:ring (== ring-2) was valid.

-          focus-visible:border-indigo-500/50 focus-visible:ring-3 focus-visible:ring-indigo-200
+          focus-visible:border-indigo-500/50 focus-visible:ring-2 focus-visible:ring-indigo-200

Confirm you really need a custom width and, if so, extend the theme; otherwise switch to one of the supported utilities.


🏁 Script executed:

#!/bin/bash
# List Tailwind config files in the repo root
echo "Config files at repo root:"
ls tailwind.config.* 2>/dev/null || echo "None found"

# Search for any ringWidth customizations in those config files
for cfg in tailwind.config.*; do
  if [ -f "$cfg" ]; then
    echo "=== Inspecting $cfg ==="
    rg -n "ringWidth" "$cfg" || echo "  → No ringWidth key in $cfg"
  fi
done

Length of output: 182


Unsupported ring-3 Utility
Tailwind’s default ringWidth scale only includes ring-0, ring-1, ring-2, ring-4, and ring-8. We couldn’t locate any tailwind.config.* or ringWidth extension in the repo, so ring-3 will be purged at build time.

• File: src/components/ui/textarea.tsx
Lines: 16–17

Apply one of the following fixes:

  1. Use the closest default width:
- focus-visible:border-indigo-500/50 focus-visible:ring-3 focus-visible:ring-indigo-200
+ focus-visible:border-indigo-500/50 focus-visible:ring-2 focus-visible:ring-indigo-200
  1. Or, if you truly need a 3px ring, extend your Tailwind config:
// tailwind.config.js
module.exports = {
  theme: {
    extend: {
      ringWidth: {
        3: '3px',
      },
    },
  },
};
🤖 Prompt for AI Agents
In src/components/ui/textarea.tsx at lines 16 to 17, the class `ring-3` is used
but Tailwind CSS does not support a ring width of 3 by default, causing it to be
purged during build. To fix this, either replace `ring-3` with the closest
supported ring width like `ring-2` or `ring-4`, or extend the Tailwind
configuration by adding a `ringWidth` entry for `3: '3px'` in the
tailwind.config.js file under the theme.extend section.

Comment on lines +31 to 43
`
relative z-50 max-w-[280px] animate-in rounded-lg border border-slate-200 bg-white px-3
py-1.5 text-sm text-slate-950 fade-in-0 zoom-in-95
data-[side=bottom]:slide-in-from-top-2
data-[side=left]:slide-in-from-right-2
data-[side=right]:slide-in-from-left-2
data-[side=top]:slide-in-from-bottom-2
data-[state=closed]:animate-out data-[state=closed]:fade-out-0
data-[state=closed]:zoom-out-95
dark:border-slate-800 dark:bg-slate-950 dark:text-slate-50
`,
className
)}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Unregistered animation utilities – build will drop them

animate-in, fade-in-0, zoom-in-95, slide-in-from-*, animate-out, etc. are provided by tailwindcss-animate (used by shadcn-ui).
ESLint reports them as “unregistered”, meaning your Tailwind config no longer loads the plugin after the v4 migration.

Result: the tooltip will render without any entrance/exit animation.

Quick fix:

// tailwind.config.ts
 module.exports = {
   plugins: [
+    require('tailwindcss-animate'),
   ],
 }

Alternatively, remove the utilities or replace them with core transition / animate-* classes.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
`
relative z-50 max-w-[280px] animate-in rounded-lg border border-slate-200 bg-white px-3
py-1.5 text-sm text-slate-950 fade-in-0 zoom-in-95
data-[side=bottom]:slide-in-from-top-2
data-[side=left]:slide-in-from-right-2
data-[side=right]:slide-in-from-left-2
data-[side=top]:slide-in-from-bottom-2
data-[state=closed]:animate-out data-[state=closed]:fade-out-0
data-[state=closed]:zoom-out-95
dark:border-slate-800 dark:bg-slate-950 dark:text-slate-50
`,
className
)}
// tailwind.config.ts
module.exports = {
plugins: [
require('tailwindcss-animate'),
],
}
🧰 Tools
🪛 ESLint

[error] 31-41: Incorrect class order. Expected

↵ ············relative·z-50·max-w-[280px]·animate-in·rounded-lg·border·border-slate-200·bg-white·px-3↵ ············py-1.5·text-sm·text-slate-950·fade-in-0·zoom-in-95↵ ············data-[side=bottom]:slide-in-from-top-2↵ ············data-[side=left]:slide-in-from-right-2↵ ············data-[side=right]:slide-in-from-left-2↵ ············data-[side=top]:slide-in-from-bottom-2↵ ············data-[state=closed]:animate-out·data-[state=closed]:fade-out-0↵ ············data-[state=closed]:zoom-out-95↵ ············dark:border-slate-800·dark:bg-slate-950·dark:text-slate-50↵ ··········

to be

↵ ············animate-in·fade-in-0·zoom-in-95·data-[side=bottom]:slide-in-from-top-2·data-[side=left]:slide-in-from-right-2·data-[side=right]:slide-in-from-left-2·data-[side=top]:slide-in-from-bottom-2·data-[state=closed]:fade-out-0·data-[state=closed]:zoom-out-95↵ ············relative·z-50·max-w-[280px]·rounded-lg·border↵ ············border-slate-200↵ ············bg-white↵ ············px-3↵ ············py-1.5↵ ············text-sm·text-slate-950↵ ············data-[state=closed]:animate-out↵ ············dark:border-slate-800·dark:bg-slate-950·dark:text-slate-50↵ ··········

(better-tailwindcss/enforce-consistent-class-order)


[error] 32-32: Unregistered class detected: animate-in

(better-tailwindcss/no-unregistered-classes)


[error] 33-33: Unregistered class detected: fade-in-0

(better-tailwindcss/no-unregistered-classes)


[error] 33-33: Unregistered class detected: zoom-in-95

(better-tailwindcss/no-unregistered-classes)


[error] 34-34: Unregistered class detected: data-[side=bottom]:slide-in-from-top-2

(better-tailwindcss/no-unregistered-classes)


[error] 35-35: Unregistered class detected: data-[side=left]:slide-in-from-right-2

(better-tailwindcss/no-unregistered-classes)


[error] 36-36: Unregistered class detected: data-[side=right]:slide-in-from-left-2

(better-tailwindcss/no-unregistered-classes)


[error] 37-37: Unregistered class detected: data-[side=top]:slide-in-from-bottom-2

(better-tailwindcss/no-unregistered-classes)


[error] 38-38: Unregistered class detected: data-[state=closed]:animate-out

(better-tailwindcss/no-unregistered-classes)


[error] 38-38: Unregistered class detected: data-[state=closed]:fade-out-0

(better-tailwindcss/no-unregistered-classes)


[error] 39-39: Unregistered class detected: data-[state=closed]:zoom-out-95

(better-tailwindcss/no-unregistered-classes)

🤖 Prompt for AI Agents
In src/components/ui/tooltip.tsx around lines 31 to 43, the Tailwind CSS
animation utilities like animate-in, fade-in-0, zoom-in-95, and slide-in-from-*
are unregistered because the tailwindcss-animate plugin is not loaded in the
Tailwind config after the v4 migration. To fix this, update the Tailwind
configuration file to include the tailwindcss-animate plugin so these classes
are recognized and applied correctly, restoring the tooltip's entrance and exit
animations. Alternatively, replace these custom animation classes with standard
Tailwind core transition or animate-* classes if you prefer not to use the
plugin.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant