diff --git a/.agents/skills/caveman/SKILL.md b/.agents/skills/caveman/SKILL.md new file mode 100644 index 0000000..4ebcea7 --- /dev/null +++ b/.agents/skills/caveman/SKILL.md @@ -0,0 +1,72 @@ +--- +name: caveman +description: > + Ultra-compressed communication mode. Slash token usage ~75% by speaking like caveman + while keeping full technical accuracy. Use when user says "caveman mode", "talk like caveman", + "use caveman", "less tokens", "be brief", or invokes /caveman. Also auto-triggers + when token efficiency is requested. +--- + +# Caveman Mode + +## Core Rule + +Respond like smart caveman. Cut articles, filler, pleasantries. Keep all technical substance. + +## Grammar + +- Drop articles (a, an, the) +- Drop filler (just, really, basically, actually, simply) +- Drop pleasantries (sure, certainly, of course, happy to) +- Short synonyms (big not extensive, fix not "implement a solution for") +- No hedging (skip "it might be worth considering") +- Fragments fine. No need full sentence +- Technical terms stay exact. "Polymorphism" stays "polymorphism" +- Code blocks unchanged. Caveman speak around code, not in code +- Error messages quoted exact. Caveman only for explanation + +## Pattern + +``` +[thing] [action] [reason]. [next step]. +``` + +Not: +> Sure! I'd be happy to help you with that. The issue you're experiencing is likely caused by... + +Yes: +> Bug in auth middleware. Token expiry check use `<` not `<=`. Fix: + +## Examples + +**User:** Why is my React component re-rendering? + +**Normal (69 tokens):** "The reason your React component is re-rendering is likely because you're creating a new object reference on each render cycle. When you pass an inline object as a prop, React's shallow comparison sees it as a different object every time, which triggers a re-render. I'd recommend using useMemo to memoize the object." + +**Caveman (19 tokens):** "New object ref each render. Inline object prop = new ref = re-render. Wrap in `useMemo`." + +--- + +**User:** How do I set up a PostgreSQL connection pool? + +**Caveman:** +``` +Use `pg` pool: +``` +```js +const pool = new Pool({ + max: 20, + idleTimeoutMillis: 30000, + connectionTimeoutMillis: 2000, +}) +``` +``` +max = concurrent connections. Keep under DB limit. idleTimeout kill stale conn. +``` + +## Boundaries + +- Code: write normal. Caveman English only +- Git commits: normal +- PR descriptions: normal +- User say "stop caveman" or "normal mode": revert immediately diff --git a/.cursor/rules/caveman.mdc b/.cursor/rules/caveman.mdc new file mode 100644 index 0000000..fefb67c --- /dev/null +++ b/.cursor/rules/caveman.mdc @@ -0,0 +1,76 @@ +--- +alwaysApply: true +--- + +--- +name: caveman +description: > + Ultra-compressed communication mode. Slash token usage ~75% by speaking like caveman + while keeping full technical accuracy. Use when user says "caveman mode", "talk like caveman", + "use caveman", "less tokens", "be brief", or invokes /caveman. Also auto-triggers + when token efficiency is requested. +--- + +# Caveman Mode + +## Core Rule + +Respond like smart caveman. Cut articles, filler, pleasantries. Keep all technical substance. + +## Grammar + +- Drop articles (a, an, the) +- Drop filler (just, really, basically, actually, simply) +- Drop pleasantries (sure, certainly, of course, happy to) +- Short synonyms (big not extensive, fix not "implement a solution for") +- No hedging (skip "it might be worth considering") +- Fragments fine. No need full sentence +- Technical terms stay exact. "Polymorphism" stays "polymorphism" +- Code blocks unchanged. Caveman speak around code, not in code +- Error messages quoted exact. Caveman only for explanation + +## Pattern + +``` +[thing] [action] [reason]. [next step]. +``` + +Not: +> Sure! I'd be happy to help you with that. The issue you're experiencing is likely caused by... + +Yes: +> Bug in auth middleware. Token expiry check use `<` not `<=`. Fix: + +## Examples + +**User:** Why is my React component re-rendering? + +**Normal (69 tokens):** "The reason your React component is re-rendering is likely because you're creating a new object reference on each render cycle. When you pass an inline object as a prop, React's shallow comparison sees it as a different object every time, which triggers a re-render. I'd recommend using useMemo to memoize the object." + +**Caveman (19 tokens):** "New object ref each render. Inline object prop = new ref = re-render. Wrap in `useMemo`." + +--- + +**User:** How do I set up a PostgreSQL connection pool? + +**Caveman:** +``` +Use `pg` pool: +``` +```js +const pool = new Pool({ + max: 20, + idleTimeoutMillis: 30000, + connectionTimeoutMillis: 2000, +}) +``` +``` +max = concurrent connections. Keep under DB limit. idleTimeout kill stale conn. +``` + +## Boundaries + +- Code: write normal. Caveman English only +- Git commits: normal +- PR descriptions: normal +- User say "stop caveman" or "normal mode": revert immediately diff --git a/README.md b/README.md index f503a81..7d50ca2 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@
- EasyInvoicePDF Logo + + EasyInvoicePDF Logo +

EasyInvoicePDF

Free & Open-Source Invoice Generator

Create professional invoices instantly in your browser with Live Preview, Multiple Templates (including a Stripe-style design). No Sign-Up Required.

@@ -99,52 +101,62 @@ _**Add payment QR codes** with any invoice-related information (payment links, U -| Default Invoice Template | Stripe Invoice Template | -| :-----------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------: | +| Default Invoice Template | Stripe Invoice Template | +| :--------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------: | | Default Invoice Template | Stripe Invoice Template |
## 📢 What's New -**v1.0.3 — Seller & Buyer Improvements (Mar 2026)** +### EasyInvoicePDF v1.0.3 — Seller & Buyer Improvements (March 29, 2026) -- **Email visibility toggle** — control whether email addresses appear in the generated PDF +- **Seller & Buyer Email visibility toggle** — control whether email addresses appear in the generated PDF - **Confirm discard dialog** — warns about unsaved changes when closing buyer/seller dialogs - **Improved seller & buyer forms** — reworked layout, locked-state banners, and cleaner field grouping +- **Out-of-Date dates helper** shows outdated fields and provides a button to update all dates at once +- **Auto-scroll (to the last position) the invoice form on mobile** when switching between tabs (UX improvement) + +https://github.com/user-attachments/assets/1b39eb6f-e2be-493f-9825-cbce3dc6fa16 [Full release notes for v1.0.3](https://github.com/VladSez/easy-invoice-pdf/releases/tag/v1.0.3) --- -**v1.0.2 — QR Codes & Multi-Page PDFs (Mar 2026)** +### EasyInvoicePDF v1.0.2 — QR Codes & Multi-Page PDFs (March 10, 2026) - **QR code support** — add payment QR codes with custom descriptions to both templates -- **Logo upload for default template** — previously available only in the Stripe template -- **Searchable currency combobox** — grouped categories replace the native dropdown +- **Logo upload for default template** — add a logo to the default invoice template +- **Searchable currency combobox** — search by currency code, symbol, or name, grouped into categories replacing the native dropdown - **Improved multi-page PDFs** — automatic pagination and page breaks for large invoices +![qr-code](https://github.com/user-attachments/assets/9516a709-3863-48fc-a1e8-fcfbd0bb195b) + [Full release notes for v1.0.2](https://github.com/VladSez/easy-invoice-pdf/releases/tag/v1.0.2) --- -**v1.0.1 — Stripe Template & Tax Customization (Jan 2026)** +### EasyInvoicePDF v1.0.1 — Stripe Template & Tax Customization (June 12, 2025) - **Stripe-inspired invoice template** — professional styling with logo upload and payment URL field - **Customizable tax labels** — set VAT, GST, Sales Tax, or any custom label per invoice language - **Improved i18n** — dynamic tax label updates and better locale-based currency handling +https://github.com/user-attachments/assets/4eef2b90-678b-4a55-9ee5-8fcf195c993a + [Full release notes for v1.0.1](https://github.com/VladSez/easy-invoice-pdf/releases/tag/EasyInvoicePDF-1.0.1) --- -**v1.0.0 — Initial Release (Nov 2025)** +### EasyInvoicePDF v1.0.0 — Initial Release (November 19, 2025) - **Live preview** — invoice updates in real-time as you type - **Instant PDF download** — one-click, no sign-up required - **Shareable links** — send invoices directly to clients without attachments - **10 languages & 120+ currencies** — full multi-language and currency support out of the box +https://github.com/user-attachments/assets/23bb5448-c9fb-4ff2-98f3-0b80d75b7683 + [Full release notes for v1.0.0](https://github.com/VladSez/easy-invoice-pdf/releases/tag/EasyInvoicePDF-v1.0.0) ## 🌟 Star History diff --git a/skills-lock.json b/skills-lock.json index 7e73816..d46927e 100644 --- a/skills-lock.json +++ b/skills-lock.json @@ -1,6 +1,11 @@ { "version": 1, "skills": { + "caveman": { + "source": "JuliusBrussee/caveman", + "sourceType": "github", + "computedHash": "aa7939fc4d1fe31484090290da77f2d21e026aa4b34b329d00e6630feb985d75" + }, "changelog-maintenance": { "source": "supercent-io/skills-template", "sourceType": "github", diff --git a/src/app/(app)/components/invoice-page-header.tsx b/src/app/(app)/components/invoice-page-header.tsx index 7fa5a54..40c8388 100644 --- a/src/app/(app)/components/invoice-page-header.tsx +++ b/src/app/(app)/components/invoice-page-header.tsx @@ -179,7 +179,7 @@ export function InvoicePageHeader({ ) : null} */} -
+
@@ -199,6 +199,10 @@ export function InvoicePageHeader({ ); } +/** + * Renders project information links including demo video, feedback, and GitHub links. + * Manages video dialog state for the "How it works" demo. + */ function ProjectInfoLinks() { const [isVideoDialogOpen, setIsVideoDialogOpen] = useState(false); @@ -209,31 +213,33 @@ function ProjectInfoLinks() { return ( <> -
+
- {" | "} +
diff --git a/src/app/(app)/page.client.tsx b/src/app/(app)/page.client.tsx index dbd63b9..ac6c1c1 100644 --- a/src/app/(app)/page.client.tsx +++ b/src/app/(app)/page.client.tsx @@ -786,7 +786,7 @@ export function AppPageClient({ } /> -
+
diff --git a/src/app/[locale]/about/page.tsx b/src/app/[locale]/about/page.tsx index 429fb55..01e5550 100644 --- a/src/app/[locale]/about/page.tsx +++ b/src/app/[locale]/about/page.tsx @@ -266,7 +266,7 @@ function HeroSection() { src={VIDEO_DEMO_URL} posterImg={VIDEO_DEMO_FALLBACK_IMG} testId="hero-about-page-video" - description="How to create an invoice and download it as a PDF in Easy Invoice" + description="How to create and download an invoice as a PDF in EasyInvoicePDF.com" />
diff --git a/src/app/changelog/content/easy-invoice-pdf-launch.mdx b/src/app/changelog/content/easy-invoice-pdf-launch.mdx index bf10c06..709c2a4 100644 --- a/src/app/changelog/content/easy-invoice-pdf-launch.mdx +++ b/src/app/changelog/content/easy-invoice-pdf-launch.mdx @@ -1,8 +1,8 @@ export const metadata = { - title: "EasyInvoicePDF Launch - Free & Open-Source Invoice Generator", + title: "EasyInvoicePDF v1.0.0 - Free & Open-Source Invoice Generator", description: "Create professional invoices instantly with real-time preview and shareable links. No registration needed.", - date: "2025-03-03", + date: "2025-11-19", version: "1.0.0", type: "major", }; diff --git a/src/app/changelog/content/qr-codes-and-improvements.mdx b/src/app/changelog/content/qr-codes-and-improvements.mdx index f4d4f57..c501f7e 100644 --- a/src/app/changelog/content/qr-codes-and-improvements.mdx +++ b/src/app/changelog/content/qr-codes-and-improvements.mdx @@ -1,6 +1,6 @@ export const metadata = { title: - "QR Code Support, Logo Upload for the Default Invoice Template and Many More", + "EasyInvoicePDF v1.0.2 - QR Code Support, Logo Upload for the Default Invoice Template and Many More", description: "QR code generation for invoices, logo upload for the default template, searchable currency combobox, and improved multi-page PDF support", date: "2026-03-10", @@ -13,8 +13,8 @@ export const metadata = { ## ✨ Highlights - **QR code generation** for invoices with customizable descriptions and visibility toggles, supported in both default and Stripe templates -- **Logo upload for the default invoice template** (previously available only in the Stripe template) -- **Searchable currency combobox** with grouped categories, replacing the native dropdown for faster selection +- **Logo upload for the default invoice template** add a logo to the default invoice template +- **Searchable currency combobox** search by currency code, symbol, or name, grouped into categories replacing the native dropdown - **Improved multi-page PDF support** with automatic pagination and page breaks --- @@ -36,24 +36,6 @@ export const metadata = { - Delete invoice item flow not working correctly - Item name field validation too strict (now optional for flexibility) -### What's Changed - -- feat: add QR code functionality to invoice templates and other improvements + bug fixes by @VladSez in [#165](https://github.com/VladSez/easy-invoice-pdf/pull/165) -- improvement: update QR code images and enhance invoice template visuals by @VladSez in [#172](https://github.com/VladSez/easy-invoice-pdf/pull/172) -- test: enhance URL verification in e2e tests for various pages by @VladSez in [#174](https://github.com/VladSez/easy-invoice-pdf/pull/174) -- test: update navigation wait strategy in e2e tests for improved reliability by @VladSez in [#175](https://github.com/VladSez/easy-invoice-pdf/pull/175) -- feat: update Playwright configuration and enhance e2e tests by @VladSez in [#176](https://github.com/VladSez/easy-invoice-pdf/pull/176) -- chore: adjust Playwright configuration and e2e test settings for stability by @VladSez in [#177](https://github.com/VladSez/easy-invoice-pdf/pull/177) -- chore: set timezone environment variable in e2e workflow to fix timezone issue in node js server env by @VladSez in [#178](https://github.com/VladSez/easy-invoice-pdf/pull/178) -- docs: add Star History section to README and improve e2e test navigation strategy by @VladSez in [#179](https://github.com/VladSez/easy-invoice-pdf/pull/179) -- fix: delete invoice item flow by @VladSez in [#180](https://github.com/VladSez/easy-invoice-pdf/pull/180) -- fix: fix i18n issue with generating pdf via api + other improvements by @VladSez in [#181](https://github.com/VladSez/easy-invoice-pdf/pull/181) -- refactor: rename item removal handler and enhance user feedback in invoice form by @VladSez in [#182](https://github.com/VladSez/easy-invoice-pdf/pull/182) -- refactor: currency searchable combobox by @VladSez in [#183](https://github.com/VladSez/easy-invoice-pdf/pull/183) -- feat: expand TODO list with discounts feature and improve e2e workflow by @VladSez in [#186](https://github.com/VladSez/easy-invoice-pdf/pull/186) -- feat: upload logo for default invoice templates, improve add invoice btn styles, add more e2e tests by @VladSez in [#189](https://github.com/VladSez/easy-invoice-pdf/pull/189) -- fix: update README logo and refactor invoice form for Stripe payment link by @VladSez in [#190](https://github.com/VladSez/easy-invoice-pdf/pull/190) - --- **Full Changelog**: [`EasyInvoicePDF-1.0.1...v1.0.2`](https://github.com/VladSez/easy-invoice-pdf/compare/EasyInvoicePDF-1.0.1...v1.0.2) diff --git a/src/app/changelog/content/seller-buyer-improvements.mdx b/src/app/changelog/content/seller-buyer-improvements.mdx index 9658c04..54c1dc2 100644 --- a/src/app/changelog/content/seller-buyer-improvements.mdx +++ b/src/app/changelog/content/seller-buyer-improvements.mdx @@ -1,5 +1,6 @@ export const metadata = { - title: "Seller & Buyer Improvements, Email Visibility Toggle and More", + title: + "EasyInvoicePDF v1.0.3 - Email visibility toggle for seller and buyer, reworked seller/buyer sections, confirm dialog to discard changes, UX improvements", description: "Email visibility toggle for seller/buyer sections, reworked form layouts with locked-state banners, ConfirmDiscardDialog, and auto-scroll on mobile", date: "2026-03-29", @@ -9,11 +10,11 @@ export const metadata = { ## ✨ Highlights -- **Email visibility toggle** for seller and buyer sections — control whether the email address appears in the generated PDF +- **Seller & Buyer Email visibility toggle** — control whether the email address appears in the generated PDF - **`ConfirmDiscardDialog`** component to warn users about unsaved changes when closing the buyer/seller dialogs - **Reworked seller and buyer information form sections** with improved layout, locked-state banners, and cleaner field grouping - **Auto-scroll the invoice form on mobile** when switching between tabs (UX improvement) -- **Out-of-Date dates helper** improved with more accurate state detection +- **Out-of-Date dates helper** shows outdated fields and provides a button to update all dates at once