@shipsite.dev/components 0.2.53 → 0.2.60

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/components.json +102 -0
  2. package/dist/context/ShipSiteProvider.d.ts +13 -0
  3. package/dist/context/ShipSiteProvider.d.ts.map +1 -1
  4. package/dist/context/ShipSiteProvider.js.map +1 -1
  5. package/dist/index.d.ts +5 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +6 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/layout/Header.d.ts.map +1 -1
  10. package/dist/layout/Header.js +22 -2
  11. package/dist/layout/Header.js.map +1 -1
  12. package/dist/lib/use-form-submit.d.ts +7 -0
  13. package/dist/lib/use-form-submit.d.ts.map +1 -0
  14. package/dist/lib/use-form-submit.js +47 -0
  15. package/dist/lib/use-form-submit.js.map +1 -0
  16. package/dist/marketing/ContactForm.d.ts +16 -0
  17. package/dist/marketing/ContactForm.d.ts.map +1 -0
  18. package/dist/marketing/ContactForm.js +29 -0
  19. package/dist/marketing/ContactForm.js.map +1 -0
  20. package/dist/marketing/Form.d.ts +25 -0
  21. package/dist/marketing/Form.d.ts.map +1 -0
  22. package/dist/marketing/Form.js +18 -0
  23. package/dist/marketing/Form.js.map +1 -0
  24. package/dist/marketing/FormClient.d.ts +23 -0
  25. package/dist/marketing/FormClient.d.ts.map +1 -0
  26. package/dist/marketing/FormClient.js +41 -0
  27. package/dist/marketing/FormClient.js.map +1 -0
  28. package/dist/marketing/FormEmbed.d.ts +13 -0
  29. package/dist/marketing/FormEmbed.d.ts.map +1 -0
  30. package/dist/marketing/FormEmbed.js +27 -0
  31. package/dist/marketing/FormEmbed.js.map +1 -0
  32. package/dist/marketing/NewsletterForm.d.ts +13 -0
  33. package/dist/marketing/NewsletterForm.d.ts.map +1 -0
  34. package/dist/marketing/NewsletterForm.js +23 -0
  35. package/dist/marketing/NewsletterForm.js.map +1 -0
  36. package/dist/marketing/WaitlistForm.d.ts +16 -0
  37. package/dist/marketing/WaitlistForm.d.ts.map +1 -0
  38. package/dist/marketing/WaitlistForm.js +27 -0
  39. package/dist/marketing/WaitlistForm.js.map +1 -0
  40. package/dist/ui/input.d.ts +5 -0
  41. package/dist/ui/input.d.ts.map +1 -0
  42. package/dist/ui/input.js +7 -0
  43. package/dist/ui/input.js.map +1 -0
  44. package/dist/ui/label.d.ts +5 -0
  45. package/dist/ui/label.d.ts.map +1 -0
  46. package/dist/ui/label.js +9 -0
  47. package/dist/ui/label.js.map +1 -0
  48. package/dist/ui/navigation-menu.d.ts +15 -0
  49. package/dist/ui/navigation-menu.d.ts.map +1 -0
  50. package/dist/ui/navigation-menu.js +32 -0
  51. package/dist/ui/navigation-menu.js.map +1 -0
  52. package/dist/ui/select.d.ts +14 -0
  53. package/dist/ui/select.d.ts.map +1 -0
  54. package/dist/ui/select.js +28 -0
  55. package/dist/ui/select.js.map +1 -0
  56. package/dist/ui/textarea.d.ts +5 -0
  57. package/dist/ui/textarea.d.ts.map +1 -0
  58. package/dist/ui/textarea.js +7 -0
  59. package/dist/ui/textarea.js.map +1 -0
  60. package/package.json +4 -1
  61. package/src/context/ShipSiteProvider.tsx +13 -1
  62. package/src/index.ts +7 -0
  63. package/src/layout/Header.tsx +155 -19
  64. package/src/lib/use-form-submit.ts +53 -0
  65. package/src/marketing/ContactForm.tsx +157 -0
  66. package/src/marketing/Form.tsx +41 -0
  67. package/src/marketing/FormClient.tsx +194 -0
  68. package/src/marketing/FormEmbed.tsx +118 -0
  69. package/src/marketing/NewsletterForm.tsx +102 -0
  70. package/src/marketing/WaitlistForm.tsx +145 -0
  71. package/src/ui/input.tsx +21 -0
  72. package/src/ui/label.tsx +24 -0
  73. package/src/ui/navigation-menu.tsx +168 -0
  74. package/src/ui/select.tsx +160 -0
  75. package/src/ui/textarea.tsx +20 -0
package/components.json CHANGED
@@ -473,6 +473,108 @@
473
473
  { "name": "children", "type": "React.ReactNode", "required": true, "description": "ContentSection children and other content." }
474
474
  ],
475
475
  "example": "<ContentPage title=\"About Us\">\n <ContentSection title=\"Our Mission\">\n We build tools that help developers ship faster.\n </ContentSection>\n</ContentPage>"
476
+ },
477
+ {
478
+ "name": "ContactForm",
479
+ "category": "marketing",
480
+ "description": "Contact form section with name, email, and message fields. Submits JSON to an external form backend (Formspree, Getform, Basin, etc.). Shows inline success/error states.",
481
+ "props": [
482
+ { "name": "id", "type": "string", "required": false, "description": "HTML id for anchor links." },
483
+ { "name": "action", "type": "string", "required": true, "description": "Form backend URL to POST JSON to (e.g. 'https://formspree.io/f/xpwzabcd')." },
484
+ { "name": "title", "type": "string", "required": false, "description": "Section heading. Defaults to 'Get in Touch'." },
485
+ { "name": "description", "type": "string", "required": false, "description": "Section subheading text." },
486
+ { "name": "nameLabel", "type": "string", "required": false, "description": "Label for the name field. Defaults to 'Name'." },
487
+ { "name": "emailLabel", "type": "string", "required": false, "description": "Label for the email field. Defaults to 'Email'." },
488
+ { "name": "messageLabel", "type": "string", "required": false, "description": "Label for the message field. Defaults to 'Message'." },
489
+ { "name": "submitLabel", "type": "string", "required": false, "description": "Submit button text. Defaults to 'Send Message'." },
490
+ { "name": "successTitle", "type": "string", "required": false, "description": "Heading shown after successful submission. Defaults to 'Message Sent!'." },
491
+ { "name": "successMessage", "type": "string", "required": false, "description": "Text shown after successful submission. Defaults to 'We'll get back to you as soon as possible.'." },
492
+ { "name": "variant", "type": "'section' | 'card'", "required": false, "description": "Layout variant. 'section' renders a full Section with glass-1 card. 'card' renders only the glass-2 card without a Section wrapper (for embedding inside other sections). Defaults to 'section'." }
493
+ ],
494
+ "example": "<ContactForm\n action=\"https://formspree.io/f/xpwzabcd\"\n title=\"Get in Touch\"\n description=\"Have a question? We'd love to hear from you.\"\n/>"
495
+ },
496
+ {
497
+ "name": "NewsletterForm",
498
+ "category": "marketing",
499
+ "description": "Compact email signup form with a single email input and submit button. Supports a full section layout or an inline layout for embedding inside BannerCTA or other components.",
500
+ "props": [
501
+ { "name": "id", "type": "string", "required": false, "description": "HTML id for anchor links." },
502
+ { "name": "action", "type": "string", "required": true, "description": "Form backend URL to POST JSON to (e.g. 'https://formspree.io/f/xpwzabcd')." },
503
+ { "name": "title", "type": "string", "required": false, "description": "Section heading." },
504
+ { "name": "description", "type": "string", "required": false, "description": "Section subheading text." },
505
+ { "name": "placeholder", "type": "string", "required": false, "description": "Email input placeholder. Defaults to 'Enter your email'." },
506
+ { "name": "submitLabel", "type": "string", "required": false, "description": "Submit button text. Defaults to 'Subscribe'." },
507
+ { "name": "successMessage", "type": "string", "required": false, "description": "Inline text shown after success. Defaults to 'You're subscribed!'." },
508
+ { "name": "variant", "type": "'section' | 'inline'", "required": false, "description": "Layout variant. 'section' renders a full Section. 'inline' renders only the form row (for use inside BannerCTA). Defaults to 'section'." }
509
+ ],
510
+ "example": "<NewsletterForm\n action=\"https://formspree.io/f/xpwzabcd\"\n title=\"Never miss an update\"\n description=\"Join 5,000 developers getting our weekly newsletter.\"\n/>"
511
+ },
512
+ {
513
+ "name": "WaitlistForm",
514
+ "category": "marketing",
515
+ "description": "Waitlist signup form with optional name field and badge. Displays a centered section with a glass-1 card form and a success state after submission.",
516
+ "props": [
517
+ { "name": "id", "type": "string", "required": false, "description": "HTML id for anchor links." },
518
+ { "name": "action", "type": "string", "required": true, "description": "Form backend URL to POST JSON to (e.g. 'https://formspree.io/f/xpwzabcd')." },
519
+ { "name": "title", "type": "string", "required": false, "description": "Section heading. Defaults to 'Join the Waitlist'." },
520
+ { "name": "description", "type": "string", "required": false, "description": "Section subheading text." },
521
+ { "name": "badge", "type": "string", "required": false, "description": "Badge text shown above the title (e.g. '2,400+ signups')." },
522
+ { "name": "showName", "type": "boolean", "required": false, "description": "Show a name input field in addition to email. Defaults to false." },
523
+ { "name": "nameLabel", "type": "string", "required": false, "description": "Label for the name field. Defaults to 'Name'." },
524
+ { "name": "emailLabel", "type": "string", "required": false, "description": "Label for the email field. Defaults to 'Email'." },
525
+ { "name": "submitLabel", "type": "string", "required": false, "description": "Submit button text. Defaults to 'Join Waitlist'." },
526
+ { "name": "successTitle", "type": "string", "required": false, "description": "Heading shown after success. Defaults to 'You're on the list!'." },
527
+ { "name": "successMessage", "type": "string", "required": false, "description": "Text shown after success. Defaults to 'We'll notify you when it's your turn.'." }
528
+ ],
529
+ "example": "<WaitlistForm\n action=\"https://formspree.io/f/xpwzabcd\"\n title=\"Be the first in line\"\n description=\"Join the waitlist for early access.\"\n badge=\"2,400+ signups\"\n showName={true}\n/>"
530
+ },
531
+ {
532
+ "name": "FormField",
533
+ "category": "marketing",
534
+ "description": "Data-only child component of Form. Defines a single field in a generic form. Renders nothing on its own — the parent Form component reads its props to build the form UI.",
535
+ "props": [
536
+ { "name": "name", "type": "string", "required": true, "description": "Field name used as the key in the submitted JSON payload." },
537
+ { "name": "label", "type": "string", "required": true, "description": "Visible label text for the field." },
538
+ { "name": "type", "type": "'text' | 'email' | 'tel' | 'url' | 'textarea' | 'select'", "required": false, "description": "Input type. Defaults to 'text'." },
539
+ { "name": "placeholder", "type": "string", "required": false, "description": "Placeholder text." },
540
+ { "name": "required", "type": "boolean", "required": false, "description": "Whether the field is required." },
541
+ { "name": "options", "type": "string[]", "required": false, "description": "Options for select-type fields." },
542
+ { "name": "colSpan", "type": "number", "required": false, "description": "Number of grid columns this field spans (use with Form columns prop). E.g. colSpan={2} makes the field span the full width in a 2-column layout." }
543
+ ],
544
+ "example": "<FormField name=\"email\" type=\"email\" label=\"Work Email\" required={true} colSpan={2} />"
545
+ },
546
+ {
547
+ "name": "Form",
548
+ "category": "marketing",
549
+ "description": "Generic form section that renders a configurable form from FormField children. Supports multi-column layouts, various input types including select, and submits JSON to an external form backend. Uses the server-shell + client-island pattern.",
550
+ "props": [
551
+ { "name": "id", "type": "string", "required": false, "description": "HTML id for anchor links." },
552
+ { "name": "action", "type": "string", "required": true, "description": "Form backend URL to POST JSON to (e.g. 'https://formspree.io/f/xpwzabcd')." },
553
+ { "name": "title", "type": "string", "required": false, "description": "Section heading." },
554
+ { "name": "description", "type": "string", "required": false, "description": "Section subheading text." },
555
+ { "name": "columns", "type": "number", "required": false, "description": "Number of grid columns (1, 2, 3, or 4). Defaults to 1." },
556
+ { "name": "submitLabel", "type": "string", "required": false, "description": "Submit button text. Defaults to 'Submit'." },
557
+ { "name": "successTitle", "type": "string", "required": false, "description": "Heading shown after success. Defaults to 'Submitted!'." },
558
+ { "name": "successMessage", "type": "string", "required": false, "description": "Text shown after success. Defaults to 'Thank you. We'll be in touch soon.'." },
559
+ { "name": "children", "type": "React.ReactNode", "required": true, "description": "FormField children defining the form fields." }
560
+ ],
561
+ "example": "<Form action=\"https://formspree.io/f/xpwzabcd\" title=\"Book a Demo\" columns={2}>\n <FormField name=\"firstName\" label=\"First Name\" required={true} />\n <FormField name=\"lastName\" label=\"Last Name\" required={true} />\n <FormField name=\"email\" type=\"email\" label=\"Work Email\" required={true} colSpan={2} />\n <FormField name=\"teamSize\" type=\"select\" label=\"Team Size\" options={[\"1-10\", \"11-50\", \"51-200\", \"200+\"]} />\n <FormField name=\"message\" type=\"textarea\" label=\"Message\" colSpan={2} />\n</Form>"
562
+ },
563
+ {
564
+ "name": "FormEmbed",
565
+ "category": "marketing",
566
+ "description": "Embeds an external form (Tally, Typeform, or custom URL) via iframe. Supports an inline iframe mode or a popup mode that opens the form in a centered dialog.",
567
+ "props": [
568
+ { "name": "id", "type": "string", "required": false, "description": "HTML id for anchor links." },
569
+ { "name": "src", "type": "string", "required": true, "description": "Form ID or full URL. For Tally, pass the form ID (e.g. 'wMxKqA'). For Typeform, pass the form ID. For custom, pass the full URL." },
570
+ { "name": "provider", "type": "'tally' | 'typeform' | 'custom'", "required": false, "description": "Form provider. Determines URL resolution. Defaults to 'custom'." },
571
+ { "name": "title", "type": "string", "required": false, "description": "Section heading (iframe mode only)." },
572
+ { "name": "description", "type": "string", "required": false, "description": "Section subheading text (iframe mode only)." },
573
+ { "name": "height", "type": "number", "required": false, "description": "iframe height in pixels. Defaults to 500." },
574
+ { "name": "mode", "type": "'iframe' | 'popup'", "required": false, "description": "Display mode. 'iframe' embeds inline. 'popup' shows a button that opens a dialog. Defaults to 'iframe'." },
575
+ { "name": "buttonLabel", "type": "string", "required": false, "description": "Button text for popup mode. Defaults to 'Open Form'." }
576
+ ],
577
+ "example": "<FormEmbed src=\"wMxKqA\" provider=\"tally\" title=\"Contact Us\" height={500} />"
476
578
  }
477
579
  ]
478
580
  }
@@ -18,6 +18,19 @@ export interface ShipSiteContextValue {
18
18
  items: Array<{
19
19
  label: string;
20
20
  href: string;
21
+ } | {
22
+ label: string;
23
+ children: Array<{
24
+ label: string;
25
+ href: string;
26
+ description?: string;
27
+ }>;
28
+ featured?: {
29
+ title: string;
30
+ description?: string;
31
+ href: string;
32
+ image: string;
33
+ };
21
34
  }>;
22
35
  cta?: {
23
36
  label: string;
@@ -1 +1 @@
1
- {"version":3,"file":"ShipSiteProvider.d.ts","sourceRoot":"","sources":["../../src/context/ShipSiteProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAoC,MAAM,OAAO,CAAC;AAEzD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,UAAU,EAAE;QACV,KAAK,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC9C,GAAG,CAAC,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;KACvC,CAAC;IACF,MAAM,EAAE;QACN,OAAO,CAAC,EAAE,KAAK,CAAC;YACd,KAAK,EAAE,MAAM,CAAC;YACd,KAAK,EAAE,KAAK,CAAC;gBAAE,KAAK,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAA;aAAE,CAAC,CAAC;SAC/C,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,KAAK,CAAC;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACnD,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACzD,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAID,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,KAAK,GACN,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,EAAE,oBAAoB,CAAC;CAC7B,2CAIA;AAED,wBAAgB,WAAW,yBAM1B;AAED,wBAAgB,WAAW,2BAE1B;AAED,wBAAgB,cAAc,KAEpB,MAAM,MAAM,KAAG,MAAM,CAW9B;AAED,wBAAgB,iBAAiB,2CAEhC"}
1
+ {"version":3,"file":"ShipSiteProvider.d.ts","sourceRoot":"","sources":["../../src/context/ShipSiteProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAoC,MAAM,OAAO,CAAC;AAEzD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,UAAU,EAAE;QACV,KAAK,EAAE,KAAK,CACR;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,GAC/B;YACE,KAAK,EAAE,MAAM,CAAC;YACd,QAAQ,EAAE,KAAK,CAAC;gBAAE,KAAK,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAC;gBAAC,WAAW,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC,CAAC;YACvE,QAAQ,CAAC,EAAE;gBACT,KAAK,EAAE,MAAM,CAAC;gBACd,WAAW,CAAC,EAAE,MAAM,CAAC;gBACrB,IAAI,EAAE,MAAM,CAAC;gBACb,KAAK,EAAE,MAAM,CAAC;aACf,CAAC;SACH,CACJ,CAAC;QACF,GAAG,CAAC,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;KACvC,CAAC;IACF,MAAM,EAAE;QACN,OAAO,CAAC,EAAE,KAAK,CAAC;YACd,KAAK,EAAE,MAAM,CAAC;YACd,KAAK,EAAE,KAAK,CAAC;gBAAE,KAAK,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAA;aAAE,CAAC,CAAC;SAC/C,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,KAAK,CAAC;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACnD,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACzD,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAID,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,KAAK,GACN,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,EAAE,oBAAoB,CAAC;CAC7B,2CAIA;AAED,wBAAgB,WAAW,yBAM1B;AAED,wBAAgB,WAAW,2BAE1B;AAED,wBAAgB,cAAc,KAEpB,MAAM,MAAM,KAAG,MAAM,CAW9B;AAED,wBAAgB,iBAAiB,2CAEhC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ShipSiteProvider.js","sourceRoot":"","sources":["../../src/context/ShipSiteProvider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAc,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAiCzD,MAAM,eAAe,GAAG,aAAa,CAA8B,IAAI,CAAC,CAAC;AAEzE,MAAM,UAAU,gBAAgB,CAAC,EAC/B,QAAQ,EACR,KAAK,GAIN;IACC,OAAO,CACL,KAAC,eAAe,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAA4B,CAC9E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,WAAW,EAAE,CAAC,QAAQ,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,EAAE,QAAQ,EAAE,GAAG,WAAW,EAAE,CAAC;IACnC,OAAO,CAAC,IAAY,EAAU,EAAE;QAC9B,IACE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YACvB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YACpB,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAC1B,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACzD,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IAChC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,WAAW,EAAE,CAAC,gBAAgB,CAAC;AACxC,CAAC"}
1
+ {"version":3,"file":"ShipSiteProvider.js","sourceRoot":"","sources":["../../src/context/ShipSiteProvider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAc,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AA6CzD,MAAM,eAAe,GAAG,aAAa,CAA8B,IAAI,CAAC,CAAC;AAEzE,MAAM,UAAU,gBAAgB,CAAC,EAC/B,QAAQ,EACR,KAAK,GAIN;IACC,OAAO,CACL,KAAC,eAAe,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAA4B,CAC9E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,WAAW,EAAE,CAAC,QAAQ,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,EAAE,QAAQ,EAAE,GAAG,WAAW,EAAE,CAAC;IACnC,OAAO,CAAC,IAAY,EAAU,EAAE;QAC9B,IACE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YACvB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YACpB,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAC1B,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACzD,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IAChC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,WAAW,EAAE,CAAC,gBAAgB,CAAC;AACxC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -24,6 +24,11 @@ export { Gallery, GalleryItem } from './marketing/Gallery';
24
24
  export { SocialProof } from './marketing/SocialProof';
25
25
  export { Carousel, CarouselItem } from './marketing/Carousel';
26
26
  export { TabsSection, TabItem } from './marketing/TabsSection';
27
+ export { ContactForm } from './marketing/ContactForm';
28
+ export { NewsletterForm } from './marketing/NewsletterForm';
29
+ export { WaitlistForm } from './marketing/WaitlistForm';
30
+ export { Form, FormField } from './marketing/Form';
31
+ export { FormEmbed } from './marketing/FormEmbed';
27
32
  export { BlogArticle } from './blog/BlogArticle';
28
33
  export { BlogIndex } from './blog/BlogIndex';
29
34
  export { ThemeImage } from './ui/theme-image';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,cAAc,EACd,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAGvE,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,cAAc,EACd,WAAW,EACX,aAAa,EACb,kBAAkB,GACnB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAG/D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG7C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGpD,OAAO,EACL,KAAK,EACL,WAAW,EACX,SAAS,EACT,WAAW,EACX,SAAS,EACT,QAAQ,EACR,SAAS,EACT,YAAY,GACb,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG3J,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -28,6 +28,12 @@ export { Gallery, GalleryItem } from './marketing/Gallery';
28
28
  export { SocialProof } from './marketing/SocialProof';
29
29
  export { Carousel, CarouselItem } from './marketing/Carousel';
30
30
  export { TabsSection, TabItem } from './marketing/TabsSection';
31
+ // Forms
32
+ export { ContactForm } from './marketing/ContactForm';
33
+ export { NewsletterForm } from './marketing/NewsletterForm';
34
+ export { WaitlistForm } from './marketing/WaitlistForm';
35
+ export { Form, FormField } from './marketing/Form';
36
+ export { FormEmbed } from './marketing/FormEmbed';
31
37
  // Blog
32
38
  export { BlogArticle } from './blog/BlogArticle';
33
39
  export { BlogIndex } from './blog/BlogIndex';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,oDAAoD;AAEpD,UAAU;AACV,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,cAAc,EACd,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AAGpC,QAAQ;AACR,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,SAAS;AACT,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,YAAY;AACZ,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,cAAc,EACd,WAAW,EACX,aAAa,EACb,kBAAkB,GACnB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO;AACP,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,kBAAkB;AAClB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,gBAAgB;AAChB,OAAO,EACL,KAAK,EACL,WAAW,EACX,SAAS,EACT,WAAW,EACX,SAAS,EACT,QAAQ,EACR,SAAS,EACT,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB,qCAAqC;AACrC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3J,UAAU;AACV,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../src/layout/Header.tsx"],"names":[],"mappings":"AAiBA,wBAAgB,MAAM,4CAoFrB"}
1
+ {"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../src/layout/Header.tsx"],"names":[],"mappings":"AAmCA,wBAAgB,MAAM,4CAuKrB"}
@@ -1,16 +1,36 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { Menu } from 'lucide-react';
3
+ import React from 'react';
4
+ import { ChevronDown, Menu } from 'lucide-react';
4
5
  import { useShipSite, useResolveHref } from '../context/ShipSiteProvider';
6
+ import { cn } from '../lib/utils';
5
7
  import { Button } from '../ui/button';
6
8
  import { Navbar, NavbarLeft, NavbarRight } from '../ui/navbar';
9
+ import { NavigationMenu, NavigationMenuContent, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, } from '../ui/navigation-menu';
7
10
  import { Sheet, SheetTrigger, SheetContent, SheetTitle, } from '../ui/sheet';
8
11
  import { ThemeToggle } from '../ui/theme-toggle';
9
12
  import { ClientOnly } from '../ui/client-only';
13
+ function isSubmenu(item) {
14
+ return 'children' in item;
15
+ }
10
16
  export function Header() {
11
17
  const { siteName, logo, navigation, locale, defaultLocale, darkMode } = useShipSite();
12
18
  const resolveHref = useResolveHref();
13
19
  const logoSrc = typeof logo === 'string' ? logo : logo?.light;
14
- return (_jsx("header", { className: "sticky top-0 z-50 bg-background/80 backdrop-blur-lg border-b border-border", children: _jsx("div", { className: "container-main", children: _jsxs(Navbar, { children: [_jsx(NavbarLeft, { children: _jsxs("a", { href: locale === defaultLocale ? '/' : `/${locale}`, className: "flex items-center gap-2", children: [logoSrc && (_jsx("img", { src: logoSrc, alt: siteName, className: "h-8 w-auto" })), _jsx("span", { className: "font-semibold text-lg text-foreground", children: siteName })] }) }), _jsxs(NavbarRight, { className: "hidden md:flex", children: [navigation.items.map((item) => (_jsx("a", { href: resolveHref(item.href), className: "text-sm font-medium text-muted-foreground hover:text-foreground transition-colors", children: item.label }, item.href))), darkMode && _jsx(ThemeToggle, {}), navigation.cta && (_jsx(Button, { asChild: true, size: "sm", children: _jsx("a", { href: navigation.cta.href, children: navigation.cta.label }) }))] }), _jsx("div", { className: "md:hidden", children: _jsx(ClientOnly, { fallback: _jsx(Button, { variant: "ghost", size: "icon", "aria-label": "Toggle menu", children: _jsx(Menu, { className: "size-5" }) }), children: _jsxs(Sheet, { children: [_jsx(SheetTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon", "aria-label": "Toggle menu", children: _jsx(Menu, { className: "size-5" }) }) }), _jsxs(SheetContent, { side: "right", children: [_jsx(SheetTitle, { className: "sr-only", children: "Navigation" }), _jsxs("nav", { className: "flex flex-col gap-4 mt-8", children: [navigation.items.map((item) => (_jsx("a", { href: resolveHref(item.href), className: "text-sm font-medium text-muted-foreground hover:text-foreground transition-colors", children: item.label }, item.href))), navigation.cta && (_jsx(Button, { asChild: true, className: "mt-2", children: _jsx("a", { href: navigation.cta.href, children: navigation.cta.label }) }))] })] })] }) }) })] }) }) }));
20
+ return (_jsx("header", { className: "sticky top-0 z-50 bg-background/80 backdrop-blur-lg border-b border-border", children: _jsx("div", { className: "container-main", children: _jsxs(Navbar, { children: [_jsx(NavbarLeft, { children: _jsxs("a", { href: locale === defaultLocale ? '/' : `/${locale}`, className: "flex items-center gap-2", children: [logoSrc && (_jsx("img", { src: logoSrc, alt: siteName, className: "h-8 w-auto" })), _jsx("span", { className: "font-semibold text-lg text-foreground", children: siteName })] }) }), _jsxs(NavbarRight, { className: "hidden md:flex", children: [_jsx(NavigationMenu, { children: _jsx(NavigationMenuList, { children: navigation.items.map((item, idx) => {
21
+ if (isSubmenu(item)) {
22
+ return (_jsxs(NavigationMenuItem, { children: [_jsx(NavigationMenuTrigger, { children: item.label }), _jsx(NavigationMenuContent, { children: item.featured ? (_jsxs("div", { className: "grid w-[400px] gap-3 md:w-[500px] md:grid-cols-[.75fr_1fr] lg:w-[600px]", children: [_jsx(NavigationMenuLink, { asChild: true, children: _jsxs("a", { href: resolveHref(item.featured.href), className: "flex flex-col justify-end rounded-md bg-gradient-to-b from-muted/50 to-muted p-4 no-underline outline-none select-none focus:shadow-md", children: [_jsx("img", { src: item.featured.image, alt: item.featured.title, className: "mb-2 h-24 w-full rounded object-cover" }), _jsx("div", { className: "mb-1 text-sm font-medium leading-none", children: item.featured.title }), item.featured.description && (_jsx("p", { className: "text-xs leading-snug text-muted-foreground", children: item.featured.description }))] }) }), _jsx("ul", { className: "flex flex-col gap-1 p-1", children: item.children.map((child) => (_jsx("li", { children: _jsx(NavigationMenuLink, { asChild: true, children: _jsxs("a", { href: resolveHref(child.href), className: "block rounded-md p-2 hover:bg-foreground/5", children: [_jsx("div", { className: "text-sm font-medium leading-none", children: child.label }), child.description && (_jsx("p", { className: "mt-1 line-clamp-2 text-xs leading-snug text-muted-foreground", children: child.description }))] }) }) }, child.href))) })] })) : (_jsx("ul", { className: "grid w-[300px] gap-1 p-1 md:w-[400px] md:grid-cols-2", children: item.children.map((child) => (_jsx("li", { children: _jsx(NavigationMenuLink, { asChild: true, children: _jsxs("a", { href: resolveHref(child.href), className: "block rounded-md p-2 hover:bg-foreground/5", children: [_jsx("div", { className: "text-sm font-medium leading-none", children: child.label }), child.description && (_jsx("p", { className: "mt-1 line-clamp-2 text-xs leading-snug text-muted-foreground", children: child.description }))] }) }) }, child.href))) })) })] }, idx));
23
+ }
24
+ return (_jsx(NavigationMenuItem, { children: _jsx(NavigationMenuLink, { asChild: true, children: _jsx("a", { href: resolveHref(item.href), className: "text-sm font-medium text-muted-foreground hover:text-foreground transition-colors inline-flex h-9 items-center px-4 py-2", children: item.label }) }) }, item.href));
25
+ }) }) }), darkMode && _jsx(ThemeToggle, {}), navigation.cta && (_jsx(Button, { asChild: true, size: "sm", children: _jsx("a", { href: navigation.cta.href, children: navigation.cta.label }) }))] }), _jsx("div", { className: "md:hidden", children: _jsx(ClientOnly, { fallback: _jsx(Button, { variant: "ghost", size: "icon", "aria-label": "Toggle menu", children: _jsx(Menu, { className: "size-5" }) }), children: _jsxs(Sheet, { children: [_jsx(SheetTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon", "aria-label": "Toggle menu", children: _jsx(Menu, { className: "size-5" }) }) }), _jsxs(SheetContent, { side: "right", children: [_jsx(SheetTitle, { className: "sr-only", children: "Navigation" }), _jsxs("nav", { className: "flex flex-col gap-4 mt-8", children: [navigation.items.map((item, idx) => {
26
+ if (isSubmenu(item)) {
27
+ return (_jsx(MobileSubmenu, { item: item, resolveHref: resolveHref }, idx));
28
+ }
29
+ return (_jsx("a", { href: resolveHref(item.href), className: "text-sm font-medium text-muted-foreground hover:text-foreground transition-colors", children: item.label }, item.href));
30
+ }), navigation.cta && (_jsx(Button, { asChild: true, className: "mt-2", children: _jsx("a", { href: navigation.cta.href, children: navigation.cta.label }) }))] })] })] }) }) })] }) }) }));
31
+ }
32
+ function MobileSubmenu({ item, resolveHref, }) {
33
+ const [open, setOpen] = React.useState(false);
34
+ return (_jsxs("div", { children: [_jsxs("button", { onClick: () => setOpen(!open), className: "flex items-center gap-1 text-sm font-medium text-muted-foreground hover:text-foreground transition-colors w-full", children: [item.label, _jsx(ChevronDown, { className: cn("size-3.5 transition-transform", open && "rotate-180") })] }), open && (_jsx("div", { className: "mt-2 ml-3 flex flex-col gap-2 border-l border-border pl-3", children: item.children.map((child) => (_jsx("a", { href: resolveHref(child.href), className: "text-sm text-muted-foreground hover:text-foreground transition-colors", children: child.label }, child.href))) }))] }));
15
35
  }
16
36
  //# sourceMappingURL=Header.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Header.js","sourceRoot":"","sources":["../../src/layout/Header.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Header.js","sourceRoot":"","sources":["../../src/layout/Header.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export type FormStatus = "idle" | "loading" | "success" | "error";
2
+ export declare function useFormSubmit(action: string): {
3
+ status: FormStatus;
4
+ errorMsg: string;
5
+ submit: (data: Record<string, string>) => Promise<void>;
6
+ };
7
+ //# sourceMappingURL=use-form-submit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-form-submit.d.ts","sourceRoot":"","sources":["../../src/lib/use-form-submit.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAElE,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM;;;mBAK3B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;EAyCtC"}
@@ -0,0 +1,47 @@
1
+ "use client";
2
+ import { useState, useCallback } from "react";
3
+ export function useFormSubmit(action) {
4
+ const [status, setStatus] = useState("idle");
5
+ const [errorMsg, setErrorMsg] = useState("");
6
+ const submit = useCallback(async (data) => {
7
+ setStatus("loading");
8
+ setErrorMsg("");
9
+ try {
10
+ const res = await fetch(action, {
11
+ method: "POST",
12
+ headers: {
13
+ "Content-Type": "application/json",
14
+ Accept: "application/json",
15
+ },
16
+ body: JSON.stringify(data),
17
+ });
18
+ if (!res.ok) {
19
+ let msg = "Something went wrong. Please try again.";
20
+ try {
21
+ const body = await res.json();
22
+ // Formspree returns { errors: [{ message }] }
23
+ // Getform/Basin return { message }
24
+ if (body.errors?.[0]?.message)
25
+ msg = body.errors[0].message;
26
+ else if (body.error)
27
+ msg = body.error;
28
+ else if (body.message)
29
+ msg = body.message;
30
+ }
31
+ catch {
32
+ // ignore JSON parse errors
33
+ }
34
+ setErrorMsg(msg);
35
+ setStatus("error");
36
+ return;
37
+ }
38
+ setStatus("success");
39
+ }
40
+ catch {
41
+ setErrorMsg("Network error. Please check your connection and try again.");
42
+ setStatus("error");
43
+ }
44
+ }, [action]);
45
+ return { status, errorMsg, submit };
46
+ }
47
+ //# sourceMappingURL=use-form-submit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-form-submit.js","sourceRoot":"","sources":["../../src/lib/use-form-submit.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAI9C,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAa,MAAM,CAAC,CAAC;IACzD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAE7C,MAAM,MAAM,GAAG,WAAW,CACxB,KAAK,EAAE,IAA4B,EAAE,EAAE;QACrC,SAAS,CAAC,SAAS,CAAC,CAAC;QACrB,WAAW,CAAC,EAAE,CAAC,CAAC;QAEhB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE;gBAC9B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,MAAM,EAAE,kBAAkB;iBAC3B;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;aAC3B,CAAC,CAAC;YAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,IAAI,GAAG,GAAG,yCAAyC,CAAC;gBACpD,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;oBAC9B,8CAA8C;oBAC9C,mCAAmC;oBACnC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO;wBAAE,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;yBACvD,IAAI,IAAI,CAAC,KAAK;wBAAE,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC;yBACjC,IAAI,IAAI,CAAC,OAAO;wBAAE,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC;gBAC5C,CAAC;gBAAC,MAAM,CAAC;oBACP,2BAA2B;gBAC7B,CAAC;gBACD,WAAW,CAAC,GAAG,CAAC,CAAC;gBACjB,SAAS,CAAC,OAAO,CAAC,CAAC;gBACnB,OAAO;YACT,CAAC;YAED,SAAS,CAAC,SAAS,CAAC,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,WAAW,CAAC,4DAA4D,CAAC,CAAC;YAC1E,SAAS,CAAC,OAAO,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,EACD,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AACtC,CAAC"}
@@ -0,0 +1,16 @@
1
+ interface ContactFormProps {
2
+ id?: string;
3
+ action: string;
4
+ title?: string;
5
+ description?: string;
6
+ nameLabel?: string;
7
+ emailLabel?: string;
8
+ messageLabel?: string;
9
+ submitLabel?: string;
10
+ successTitle?: string;
11
+ successMessage?: string;
12
+ variant?: "section" | "card";
13
+ }
14
+ export declare function ContactForm({ id, action, title, description, nameLabel, emailLabel, messageLabel, submitLabel, successTitle, successMessage, variant, }: ContactFormProps): import("react/jsx-runtime").JSX.Element;
15
+ export {};
16
+ //# sourceMappingURL=ContactForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContactForm.d.ts","sourceRoot":"","sources":["../../src/marketing/ContactForm.tsx"],"names":[],"mappings":"AAWA,UAAU,gBAAgB;IACxB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;CAC9B;AAED,wBAAgB,WAAW,CAAC,EAC1B,EAAE,EACF,MAAM,EACN,KAAsB,EACtB,WAAW,EACX,SAAkB,EAClB,UAAoB,EACpB,YAAwB,EACxB,WAA4B,EAC5B,YAA8B,EAC9B,cAA6D,EAC7D,OAAmB,GACpB,EAAE,gBAAgB,2CAuHlB"}
@@ -0,0 +1,29 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useId, useState } from "react";
4
+ import { CheckCircle, Loader2 } from "lucide-react";
5
+ import { Section } from "../ui/section";
6
+ import { Input } from "../ui/input";
7
+ import { Textarea } from "../ui/textarea";
8
+ import { Label } from "../ui/label";
9
+ import { Button } from "../ui/button";
10
+ import { useFormSubmit } from "../lib/use-form-submit";
11
+ export function ContactForm({ id, action, title = "Get in Touch", description, nameLabel = "Name", emailLabel = "Email", messageLabel = "Message", submitLabel = "Send Message", successTitle = "Message Sent!", successMessage = "We'll get back to you as soon as possible.", variant = "section", }) {
12
+ const uid = useId();
13
+ const { status, errorMsg, submit } = useFormSubmit(action);
14
+ const [fields, setFields] = useState({ name: "", email: "", message: "" });
15
+ function update(key, value) {
16
+ setFields((prev) => ({ ...prev, [key]: value }));
17
+ }
18
+ function handleSubmit(e) {
19
+ e.preventDefault();
20
+ submit(fields);
21
+ }
22
+ const successContent = (_jsxs("div", { className: "text-center py-12", children: [_jsx("div", { className: "w-16 h-16 rounded-full bg-primary/10 mx-auto mb-4 flex items-center justify-center", children: _jsx(CheckCircle, { className: "w-8 h-8 text-primary" }) }), _jsx("h3", { className: "text-xl font-semibold text-foreground mb-2", children: successTitle }), _jsx("p", { className: "text-muted-foreground", children: successMessage })] }));
23
+ const formContent = status === "success" ? (successContent) : (_jsxs("form", { onSubmit: handleSubmit, className: "space-y-6", children: [_jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [_jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: `${uid}-name`, children: nameLabel }), _jsx(Input, { id: `${uid}-name`, name: "name", placeholder: "Your name", value: fields.name, onChange: (e) => update("name", e.target.value), required: true, disabled: status === "loading" })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: `${uid}-email`, children: emailLabel }), _jsx(Input, { id: `${uid}-email`, name: "email", type: "email", placeholder: "you@example.com", value: fields.email, onChange: (e) => update("email", e.target.value), required: true, disabled: status === "loading" })] })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: `${uid}-message`, children: messageLabel }), _jsx(Textarea, { id: `${uid}-message`, name: "message", placeholder: "Your message...", value: fields.message, onChange: (e) => update("message", e.target.value), required: true, disabled: status === "loading" })] }), _jsx(Button, { type: "submit", variant: "default", size: "lg", className: "w-full", disabled: status === "loading", children: status === "loading" ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "size-4 animate-spin mr-2" }), "Sending..."] })) : (submitLabel) }), status === "error" && (_jsx("p", { className: "text-sm text-destructive", "aria-live": "polite", children: errorMsg }))] }));
24
+ if (variant === "card") {
25
+ return (_jsx("div", { className: "glass-2 rounded-2xl p-8", children: formContent }));
26
+ }
27
+ return (_jsx(Section, { id: id, children: _jsxs("div", { className: "container-main max-w-2xl", children: [(title || description) && (_jsxs("div", { className: "text-center mb-12", children: [title && (_jsx("h2", { className: "text-3xl md:text-4xl font-bold text-foreground mb-4", children: title })), description && (_jsx("p", { className: "text-lg text-muted-foreground max-w-2xl mx-auto", children: description }))] })), _jsx("div", { className: "glass-1 rounded-2xl p-8", children: formContent })] }) }));
28
+ }
29
+ //# sourceMappingURL=ContactForm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContactForm.js","sourceRoot":"","sources":["../../src/marketing/ContactForm.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import React from "react";
2
+ interface FormFieldProps {
3
+ name: string;
4
+ label: string;
5
+ type?: "text" | "email" | "tel" | "url" | "textarea" | "select";
6
+ placeholder?: string;
7
+ required?: boolean;
8
+ options?: string[];
9
+ colSpan?: number;
10
+ }
11
+ export declare function FormField(_props: FormFieldProps): null;
12
+ interface FormProps {
13
+ id?: string;
14
+ action: string;
15
+ title?: string;
16
+ description?: string;
17
+ columns?: number;
18
+ submitLabel?: string;
19
+ successTitle?: string;
20
+ successMessage?: string;
21
+ children: React.ReactNode;
22
+ }
23
+ export declare function Form({ children, ...rest }: FormProps): import("react/jsx-runtime").JSX.Element;
24
+ export {};
25
+ //# sourceMappingURL=Form.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Form.d.ts","sourceRoot":"","sources":["../../src/marketing/Form.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmC,MAAM,OAAO,CAAC;AAGxD,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,UAAU,GAAG,QAAQ,CAAC;IAChE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,cAAc,QAE/C;AAED,UAAU,SAAS;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,SAAS,2CAWpD"}
@@ -0,0 +1,18 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Children, isValidElement } from "react";
3
+ import { FormClient } from "./FormClient";
4
+ export function FormField(_props) {
5
+ return null;
6
+ }
7
+ export function Form({ children, ...rest }) {
8
+ const fields = [];
9
+ Children.forEach(children, (child) => {
10
+ if (!isValidElement(child))
11
+ return;
12
+ if (child.type === FormField) {
13
+ fields.push(child.props);
14
+ }
15
+ });
16
+ return _jsx(FormClient, { ...rest, fields: fields });
17
+ }
18
+ //# sourceMappingURL=Form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Form.js","sourceRoot":"","sources":["../../src/marketing/Form.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AACxD,OAAO,EAAE,UAAU,EAAqB,MAAM,cAAc,CAAC;AAY7D,MAAM,UAAU,SAAS,CAAC,MAAsB;IAC9C,OAAO,IAAI,CAAC;AACd,CAAC;AAcD,MAAM,UAAU,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAa;IACnD,MAAM,MAAM,GAAmB,EAAE,CAAC;IAElC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;QACnC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;YAAE,OAAO;QACnC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAqB,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,KAAC,UAAU,OAAK,IAAI,EAAE,MAAM,EAAE,MAAM,GAAI,CAAC;AAClD,CAAC"}
@@ -0,0 +1,23 @@
1
+ export interface FormFieldDef {
2
+ name: string;
3
+ label: string;
4
+ type?: "text" | "email" | "tel" | "url" | "textarea" | "select";
5
+ placeholder?: string;
6
+ required?: boolean;
7
+ options?: string[];
8
+ colSpan?: number;
9
+ }
10
+ interface FormClientProps {
11
+ id?: string;
12
+ action: string;
13
+ title?: string;
14
+ description?: string;
15
+ columns?: number;
16
+ submitLabel?: string;
17
+ successTitle?: string;
18
+ successMessage?: string;
19
+ fields: FormFieldDef[];
20
+ }
21
+ export declare function FormClient({ id, action, title, description, columns, submitLabel, successTitle, successMessage, fields, }: FormClientProps): import("react/jsx-runtime").JSX.Element;
22
+ export {};
23
+ //# sourceMappingURL=FormClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormClient.d.ts","sourceRoot":"","sources":["../../src/marketing/FormClient.tsx"],"names":[],"mappings":"AA+BA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,UAAU,GAAG,QAAQ,CAAC;IAChE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,eAAe;IACvB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,YAAY,EAAE,CAAC;CACxB;AAED,wBAAgB,UAAU,CAAC,EACzB,EAAE,EACF,MAAM,EACN,KAAK,EACL,WAAW,EACX,OAAW,EACX,WAAsB,EACtB,YAA2B,EAC3B,cAAqD,EACrD,MAAM,GACP,EAAE,eAAe,2CAkIjB"}
@@ -0,0 +1,41 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useId, useState } from "react";
4
+ import { CheckCircle, Loader2 } from "lucide-react";
5
+ import { Section } from "../ui/section";
6
+ import { Input } from "../ui/input";
7
+ import { Textarea } from "../ui/textarea";
8
+ import { Label } from "../ui/label";
9
+ import { Button } from "../ui/button";
10
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "../ui/select";
11
+ import { cn } from "../lib/utils";
12
+ import { useFormSubmit } from "../lib/use-form-submit";
13
+ const gridColsMap = {
14
+ 2: "md:grid-cols-2",
15
+ 3: "md:grid-cols-3",
16
+ 4: "md:grid-cols-2 lg:grid-cols-4",
17
+ };
18
+ const colSpanMap = {
19
+ 2: "md:col-span-2",
20
+ 3: "md:col-span-3",
21
+ 4: "md:col-span-4",
22
+ };
23
+ export function FormClient({ id, action, title, description, columns = 1, submitLabel = "Submit", successTitle = "Submitted!", successMessage = "Thank you. We'll be in touch soon.", fields, }) {
24
+ const uid = useId();
25
+ const { status, errorMsg, submit } = useFormSubmit(action);
26
+ const [values, setValues] = useState(() => {
27
+ const init = {};
28
+ for (const f of fields)
29
+ init[f.name] = "";
30
+ return init;
31
+ });
32
+ function update(name, value) {
33
+ setValues((prev) => ({ ...prev, [name]: value }));
34
+ }
35
+ function handleSubmit(e) {
36
+ e.preventDefault();
37
+ submit(values);
38
+ }
39
+ return (_jsx(Section, { id: id, children: _jsxs("div", { className: "container-main max-w-3xl", children: [(title || description) && (_jsxs("div", { className: "text-center mb-12", children: [title && (_jsx("h2", { className: "text-3xl md:text-4xl font-bold text-foreground mb-4", children: title })), description && (_jsx("p", { className: "text-lg text-muted-foreground max-w-2xl mx-auto", children: description }))] })), status === "success" ? (_jsxs("div", { className: "text-center py-12", children: [_jsx("div", { className: "w-16 h-16 rounded-full bg-primary/10 mx-auto mb-4 flex items-center justify-center", children: _jsx(CheckCircle, { className: "w-8 h-8 text-primary" }) }), _jsx("h3", { className: "text-xl font-semibold text-foreground mb-2", children: successTitle }), _jsx("p", { className: "text-muted-foreground", children: successMessage })] })) : (_jsxs("form", { onSubmit: handleSubmit, className: "glass-1 rounded-2xl p-8", children: [_jsx("div", { className: cn("grid grid-cols-1 gap-4", gridColsMap[columns]), children: fields.map((field) => (_jsxs("div", { className: cn("space-y-2", field.colSpan && colSpanMap[field.colSpan]), children: [_jsx(Label, { htmlFor: `${uid}-${field.name}`, children: field.label }), field.type === "textarea" ? (_jsx(Textarea, { id: `${uid}-${field.name}`, name: field.name, placeholder: field.placeholder, required: field.required, value: values[field.name] ?? "", onChange: (e) => update(field.name, e.target.value), disabled: status === "loading" })) : field.type === "select" && field.options ? (_jsxs(Select, { value: values[field.name] ?? "", onValueChange: (v) => update(field.name, v), required: field.required, disabled: status === "loading", children: [_jsx(SelectTrigger, { id: `${uid}-${field.name}`, children: _jsx(SelectValue, { placeholder: field.placeholder || "Select..." }) }), _jsx(SelectContent, { children: field.options.map((opt) => (_jsx(SelectItem, { value: opt, children: opt }, opt))) })] })) : (_jsx(Input, { id: `${uid}-${field.name}`, name: field.name, type: field.type || "text", placeholder: field.placeholder, required: field.required, value: values[field.name] ?? "", onChange: (e) => update(field.name, e.target.value), disabled: status === "loading" }))] }, field.name))) }), _jsxs("div", { className: "mt-6", children: [_jsx(Button, { type: "submit", variant: "default", size: "lg", className: "w-full", disabled: status === "loading", children: status === "loading" ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "size-4 animate-spin mr-2" }), "Submitting..."] })) : (submitLabel) }), status === "error" && (_jsx("p", { className: "text-sm text-destructive mt-2", "aria-live": "polite", children: errorMsg }))] })] }))] }) }));
40
+ }
41
+ //# sourceMappingURL=FormClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormClient.js","sourceRoot":"","sources":["../../src/marketing/FormClient.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ interface FormEmbedProps {
2
+ id?: string;
3
+ src: string;
4
+ provider?: "tally" | "typeform" | "custom";
5
+ title?: string;
6
+ description?: string;
7
+ height?: number;
8
+ mode?: "iframe" | "popup";
9
+ buttonLabel?: string;
10
+ }
11
+ export declare function FormEmbed({ id, src, provider, title, description, height, mode, buttonLabel, }: FormEmbedProps): import("react/jsx-runtime").JSX.Element;
12
+ export {};
13
+ //# sourceMappingURL=FormEmbed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormEmbed.d.ts","sourceRoot":"","sources":["../../src/marketing/FormEmbed.tsx"],"names":[],"mappings":"AAmBA,UAAU,cAAc;IACtB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,SAAS,CAAC,EACxB,EAAE,EACF,GAAG,EACH,QAAmB,EACnB,KAAK,EACL,WAAW,EACX,MAAY,EACZ,IAAe,EACf,WAAyB,GAC1B,EAAE,cAAc,2CAoChB"}