@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.
- package/components.json +102 -0
- package/dist/context/ShipSiteProvider.d.ts +13 -0
- package/dist/context/ShipSiteProvider.d.ts.map +1 -1
- package/dist/context/ShipSiteProvider.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/layout/Header.d.ts.map +1 -1
- package/dist/layout/Header.js +22 -2
- package/dist/layout/Header.js.map +1 -1
- package/dist/lib/use-form-submit.d.ts +7 -0
- package/dist/lib/use-form-submit.d.ts.map +1 -0
- package/dist/lib/use-form-submit.js +47 -0
- package/dist/lib/use-form-submit.js.map +1 -0
- package/dist/marketing/ContactForm.d.ts +16 -0
- package/dist/marketing/ContactForm.d.ts.map +1 -0
- package/dist/marketing/ContactForm.js +29 -0
- package/dist/marketing/ContactForm.js.map +1 -0
- package/dist/marketing/Form.d.ts +25 -0
- package/dist/marketing/Form.d.ts.map +1 -0
- package/dist/marketing/Form.js +18 -0
- package/dist/marketing/Form.js.map +1 -0
- package/dist/marketing/FormClient.d.ts +23 -0
- package/dist/marketing/FormClient.d.ts.map +1 -0
- package/dist/marketing/FormClient.js +41 -0
- package/dist/marketing/FormClient.js.map +1 -0
- package/dist/marketing/FormEmbed.d.ts +13 -0
- package/dist/marketing/FormEmbed.d.ts.map +1 -0
- package/dist/marketing/FormEmbed.js +27 -0
- package/dist/marketing/FormEmbed.js.map +1 -0
- package/dist/marketing/NewsletterForm.d.ts +13 -0
- package/dist/marketing/NewsletterForm.d.ts.map +1 -0
- package/dist/marketing/NewsletterForm.js +23 -0
- package/dist/marketing/NewsletterForm.js.map +1 -0
- package/dist/marketing/WaitlistForm.d.ts +16 -0
- package/dist/marketing/WaitlistForm.d.ts.map +1 -0
- package/dist/marketing/WaitlistForm.js +27 -0
- package/dist/marketing/WaitlistForm.js.map +1 -0
- package/dist/ui/input.d.ts +5 -0
- package/dist/ui/input.d.ts.map +1 -0
- package/dist/ui/input.js +7 -0
- package/dist/ui/input.js.map +1 -0
- package/dist/ui/label.d.ts +5 -0
- package/dist/ui/label.d.ts.map +1 -0
- package/dist/ui/label.js +9 -0
- package/dist/ui/label.js.map +1 -0
- package/dist/ui/navigation-menu.d.ts +15 -0
- package/dist/ui/navigation-menu.d.ts.map +1 -0
- package/dist/ui/navigation-menu.js +32 -0
- package/dist/ui/navigation-menu.js.map +1 -0
- package/dist/ui/select.d.ts +14 -0
- package/dist/ui/select.d.ts.map +1 -0
- package/dist/ui/select.js +28 -0
- package/dist/ui/select.js.map +1 -0
- package/dist/ui/textarea.d.ts +5 -0
- package/dist/ui/textarea.d.ts.map +1 -0
- package/dist/ui/textarea.js +7 -0
- package/dist/ui/textarea.js.map +1 -0
- package/package.json +4 -1
- package/src/context/ShipSiteProvider.tsx +13 -1
- package/src/index.ts +7 -0
- package/src/layout/Header.tsx +155 -19
- package/src/lib/use-form-submit.ts +53 -0
- package/src/marketing/ContactForm.tsx +157 -0
- package/src/marketing/Form.tsx +41 -0
- package/src/marketing/FormClient.tsx +194 -0
- package/src/marketing/FormEmbed.tsx +118 -0
- package/src/marketing/NewsletterForm.tsx +102 -0
- package/src/marketing/WaitlistForm.tsx +145 -0
- package/src/ui/input.tsx +21 -0
- package/src/ui/label.tsx +24 -0
- package/src/ui/navigation-menu.tsx +168 -0
- package/src/ui/select.tsx +160 -0
- 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,
|
|
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;
|
|
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';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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":"
|
|
1
|
+
{"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../src/layout/Header.tsx"],"names":[],"mappings":"AAmCA,wBAAgB,MAAM,4CAuKrB"}
|
package/dist/layout/Header.js
CHANGED
|
@@ -1,16 +1,36 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import
|
|
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: [
|
|
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":"AAAA,YAAY,CAAC;;
|
|
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"}
|