@flamingo-stack/openframe-frontend-core 0.0.660-snapshot.20260923164839 → 0.0.660

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 (100) hide show
  1. package/dist/{chunk-5LS7KNAU.js → chunk-2DLM3NXE.js} +5 -5
  2. package/dist/{chunk-RFGXKRRL.js → chunk-6DVSTVUU.js} +6 -6
  3. package/dist/{chunk-EUT6SQW7.js → chunk-6KR74SOJ.js} +3 -3
  4. package/dist/{chunk-ZASHVL45.cjs → chunk-AOOORZI5.cjs} +3 -3
  5. package/dist/{chunk-ZASHVL45.cjs.map → chunk-AOOORZI5.cjs.map} +1 -1
  6. package/dist/{chunk-Z572FXXM.js → chunk-APWQTZCR.js} +2 -2
  7. package/dist/{chunk-M23ZPKOK.js → chunk-E7C3F2SK.js} +2 -2
  8. package/dist/{chunk-XOA32PN3.cjs → chunk-EOGXNLZC.cjs} +22 -22
  9. package/dist/{chunk-XOA32PN3.cjs.map → chunk-EOGXNLZC.cjs.map} +1 -1
  10. package/dist/{chunk-6VY6PXAN.cjs → chunk-GDHV5W5C.cjs} +33 -33
  11. package/dist/{chunk-6VY6PXAN.cjs.map → chunk-GDHV5W5C.cjs.map} +1 -1
  12. package/dist/{chunk-4NKKPGDN.js → chunk-H7ORPMRH.js} +19 -21
  13. package/dist/{chunk-4NKKPGDN.js.map → chunk-H7ORPMRH.js.map} +1 -1
  14. package/dist/{chunk-D7QWYQBQ.cjs → chunk-ITVLOEGF.cjs} +71 -71
  15. package/dist/{chunk-D7QWYQBQ.cjs.map → chunk-ITVLOEGF.cjs.map} +1 -1
  16. package/dist/{chunk-RPHRBZG6.cjs → chunk-K4W3II7M.cjs} +3 -3
  17. package/dist/{chunk-RPHRBZG6.cjs.map → chunk-K4W3II7M.cjs.map} +1 -1
  18. package/dist/{chunk-IMDYBINC.js → chunk-KP4K6I5O.js} +3 -3
  19. package/dist/{chunk-H3DF7COI.cjs → chunk-L4YJU3AG.cjs} +15 -15
  20. package/dist/{chunk-H3DF7COI.cjs.map → chunk-L4YJU3AG.cjs.map} +1 -1
  21. package/dist/{chunk-GXHZCGVJ.cjs → chunk-LSVQNRX4.cjs} +19 -21
  22. package/dist/chunk-LSVQNRX4.cjs.map +1 -0
  23. package/dist/{chunk-U4N65JUW.js → chunk-MEFCA6VD.js} +3 -3
  24. package/dist/{chunk-FC6I2NWF.js → chunk-MW7LEMFG.js} +2 -2
  25. package/dist/{chunk-QARWK4LN.cjs → chunk-NXAXZPEO.cjs} +10 -10
  26. package/dist/{chunk-QARWK4LN.cjs.map → chunk-NXAXZPEO.cjs.map} +1 -1
  27. package/dist/{chunk-PC5WWTDM.js → chunk-P2ROGTMF.js} +3 -3
  28. package/dist/{chunk-ZIT4TC5R.cjs → chunk-PUE4XMZK.cjs} +163 -163
  29. package/dist/{chunk-ZIT4TC5R.cjs.map → chunk-PUE4XMZK.cjs.map} +1 -1
  30. package/dist/{chunk-WDJT7NJ5.js → chunk-QVZD2LLU.js} +5 -5
  31. package/dist/{chunk-4EY5JSMK.cjs → chunk-RRGTBH3L.cjs} +5 -5
  32. package/dist/{chunk-4EY5JSMK.cjs.map → chunk-RRGTBH3L.cjs.map} +1 -1
  33. package/dist/{chunk-Q4XWYP5U.js → chunk-T6LNAX4R.js} +4 -4
  34. package/dist/{chunk-7KNVRRI4.cjs → chunk-UIAXQJPV.cjs} +22 -22
  35. package/dist/{chunk-7KNVRRI4.cjs.map → chunk-UIAXQJPV.cjs.map} +1 -1
  36. package/dist/{chunk-F5LMTKQD.js → chunk-VFGBRGFB.js} +3 -3
  37. package/dist/{chunk-YNW3DQFY.cjs → chunk-VJMPYY5O.cjs} +25 -25
  38. package/dist/{chunk-YNW3DQFY.cjs.map → chunk-VJMPYY5O.cjs.map} +1 -1
  39. package/dist/{chunk-TRR6XUEP.js → chunk-VVOI2OC3.js} +2 -2
  40. package/dist/{chunk-4JITKV2S.cjs → chunk-VW7NXM2O.cjs} +45 -45
  41. package/dist/{chunk-4JITKV2S.cjs.map → chunk-VW7NXM2O.cjs.map} +1 -1
  42. package/dist/{chunk-WGTKYVBK.cjs → chunk-VWGFJJD6.cjs} +10 -10
  43. package/dist/{chunk-WGTKYVBK.cjs.map → chunk-VWGFJJD6.cjs.map} +1 -1
  44. package/dist/{chunk-GLDXZK76.cjs → chunk-WMIB6JSA.cjs} +4 -4
  45. package/dist/{chunk-GLDXZK76.cjs.map → chunk-WMIB6JSA.cjs.map} +1 -1
  46. package/dist/{chunk-KCYGLC7Q.js → chunk-WWEQT2WX.js} +5 -5
  47. package/dist/{chunk-N4ORXOZK.cjs → chunk-Z7NI2TQD.cjs} +10 -10
  48. package/dist/{chunk-N4ORXOZK.cjs.map → chunk-Z7NI2TQD.cjs.map} +1 -1
  49. package/dist/{chunk-J5TAB64U.js → chunk-ZT3CZCDS.js} +2 -2
  50. package/dist/components/case-studies/index.cjs +14 -14
  51. package/dist/components/case-studies/index.js +3 -3
  52. package/dist/components/chat/index.cjs +2 -2
  53. package/dist/components/chat/index.js +1 -1
  54. package/dist/components/chat/utils/history-merge.d.ts +0 -6
  55. package/dist/components/chat/utils/history-merge.d.ts.map +1 -1
  56. package/dist/components/contact/index.cjs +4 -4
  57. package/dist/components/contact/index.js +3 -3
  58. package/dist/components/docs/index.cjs +7 -7
  59. package/dist/components/docs/index.js +6 -6
  60. package/dist/components/embeds/index.cjs +4 -4
  61. package/dist/components/embeds/index.js +3 -3
  62. package/dist/components/faq/index.cjs +4 -4
  63. package/dist/components/faq/index.js +3 -3
  64. package/dist/components/features/index.cjs +3 -3
  65. package/dist/components/features/index.js +2 -2
  66. package/dist/components/help-center-pages/index.cjs +23 -23
  67. package/dist/components/help-center-pages/index.js +14 -14
  68. package/dist/components/index.cjs +39 -39
  69. package/dist/components/index.js +13 -13
  70. package/dist/components/meeting-scheduler/index.cjs +24 -24
  71. package/dist/components/meeting-scheduler/index.js +2 -2
  72. package/dist/components/navigation/index.cjs +6 -6
  73. package/dist/components/navigation/index.js +5 -5
  74. package/dist/components/onboarding-guides/index.cjs +6 -6
  75. package/dist/components/onboarding-guides/index.js +5 -5
  76. package/dist/components/tickets/index.cjs +7 -7
  77. package/dist/components/tickets/index.js +6 -6
  78. package/dist/components/ui/index.cjs +3 -3
  79. package/dist/components/ui/index.js +2 -2
  80. package/dist/index.cjs +7 -7
  81. package/dist/index.js +6 -6
  82. package/package.json +1 -1
  83. package/src/components/chat/utils/__tests__/history-merge.test.ts +0 -62
  84. package/src/components/chat/utils/history-merge.ts +17 -31
  85. package/dist/chunk-GXHZCGVJ.cjs.map +0 -1
  86. /package/dist/{chunk-5LS7KNAU.js.map → chunk-2DLM3NXE.js.map} +0 -0
  87. /package/dist/{chunk-RFGXKRRL.js.map → chunk-6DVSTVUU.js.map} +0 -0
  88. /package/dist/{chunk-EUT6SQW7.js.map → chunk-6KR74SOJ.js.map} +0 -0
  89. /package/dist/{chunk-Z572FXXM.js.map → chunk-APWQTZCR.js.map} +0 -0
  90. /package/dist/{chunk-M23ZPKOK.js.map → chunk-E7C3F2SK.js.map} +0 -0
  91. /package/dist/{chunk-IMDYBINC.js.map → chunk-KP4K6I5O.js.map} +0 -0
  92. /package/dist/{chunk-U4N65JUW.js.map → chunk-MEFCA6VD.js.map} +0 -0
  93. /package/dist/{chunk-FC6I2NWF.js.map → chunk-MW7LEMFG.js.map} +0 -0
  94. /package/dist/{chunk-PC5WWTDM.js.map → chunk-P2ROGTMF.js.map} +0 -0
  95. /package/dist/{chunk-WDJT7NJ5.js.map → chunk-QVZD2LLU.js.map} +0 -0
  96. /package/dist/{chunk-Q4XWYP5U.js.map → chunk-T6LNAX4R.js.map} +0 -0
  97. /package/dist/{chunk-F5LMTKQD.js.map → chunk-VFGBRGFB.js.map} +0 -0
  98. /package/dist/{chunk-TRR6XUEP.js.map → chunk-VVOI2OC3.js.map} +0 -0
  99. /package/dist/{chunk-KCYGLC7Q.js.map → chunk-WWEQT2WX.js.map} +0 -0
  100. /package/dist/{chunk-J5TAB64U.js.map → chunk-ZT3CZCDS.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-7KNVRRI4.cjs","../src/components/contact/contact-form.tsx","../src/schemas/contact-schema.ts"],"names":[],"mappings":"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","file":"/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-7KNVRRI4.cjs","sourcesContent":[null,"'use client';\n\n/**\n * `<ContactForm />` — the canonical contact form used by every public\n * surface (TMCG join, case-study pitch, generic /contact, Help Center\n * ticket creation, etc.).\n *\n * Self-contained inside the lib — host-specific values (user id for\n * tracking, platform-specific contact reasons, reddit-click attribution\n * id) flow IN via props. The hub passes them via a thin\n * `<ContactForm>` wrapper that resolves them from `useAuth` /\n * `getAppConfig` / `getStoredRedditClickId`. Other embedders pass\n * whatever they have (or omit).\n *\n * Field-hide + custom-submit + extra-top-field knobs let one form\n * serve both contact and ticket-creation flows without forking:\n * - Contact page: rendered with all fields visible, built-in submit\n * flow to `/api/contact` via `useContactSubmission`.\n * - Ticket page: hides name/email/companySize/referralSource/\n * helpCategory; supplies `extraTopField` (a Subject input) +\n * `onCustomSubmit` wired to `useTicketActions.submitTicket`.\n */\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { useState, type ReactNode } from 'react';\nimport { useForm, Controller } from 'react-hook-form';\nimport { useContactSubmission } from '../../hooks/use-contact-submission';\nimport { useHumanitySignals } from '../../hooks/use-humanity-signals';\nimport {\n ContactSchema,\n type ContactFormData,\n companySizeOptions,\n referralSourceOptions,\n defaultHelpCategoryOptions,\n} from '../../schemas/contact-schema';\nimport { HUBSPOT_DO_NOT_COLLECT_FORM_PROPS } from '../../utils/hubspot-collected-forms';\nimport { ChatAttachmentAddButton, ChatAttachmentChipStrip } from '../chat/chat-attachment-bar';\nimport { useChatAttachments } from '../chat/hooks/use-chat-attachments';\nimport type { ChatAttachment } from '../chat/utils/chat-attachment-markdown';\nimport { SECTION_HEADING_CLASS } from '../layout/page-heading';\nimport {\n Button,\n type ButtonProps,\n Input,\n Textarea,\n Select,\n SelectTrigger,\n SelectValue,\n SelectContent,\n SelectItem,\n Label,\n} from '../ui';\nimport { HoneypotField } from '../ui/honeypot-field';\nimport { RequiredMark } from '../ui/required-mark';\n\n/**\n * Fields the caller can suppress. Six values — every primary form\n * field plus `name` and `email` (newly hideable so ticket-creation\n * surfaces can hide them; they still need to validate, so the caller\n * MUST supply pre-filled values via `defaultValues` when hiding them).\n */\nexport type ContactFormHideableField = 'name' | 'email' | 'companySize' | 'referralSource' | 'helpCategory' | 'message';\n\nexport interface ContactFormProps {\n /** Host-side user id passed to `useContactSubmission` for attribution.\n * Hub wrapper passes `useAuth().user?.id`; lib's Help Center surface\n * passes `useChatIdentity().user?.id`. Omit for anon flows. */\n userId?: string;\n /** Platform-specific help-category dropdown options. Hub wrapper\n * passes `getAppConfig().contact.contactReasons`. Defaults to the\n * lib's `defaultHelpCategoryOptions`. */\n helpCategoryOptions?: readonly string[];\n /** Reddit click attribution id. Caller resolves from wherever they\n * stash it (hub: sessionStorage via `getStoredRedditClickId`). When\n * set, it's spread into the submission payload. */\n rdtCid?: string;\n /** Called after a successful submit so the caller can clear their\n * attribution storage (hub wrapper calls `clearStoredRedditClickId`).\n * Fires for BOTH the built-in and custom submit paths. */\n onSubmitSuccess?: () => void;\n\n prefilledReason?: string;\n prefilledMessage?: string;\n hideFields?: ContactFormHideableField[];\n /** Authoritative pre-fill for any field the caller hides. Merged\n * into react-hook-form's `defaultValues` AFTER the legacy\n * `prefilledReason` / `prefilledMessage` props (caller-supplied\n * wins). REQUIRED when hiding `name` / `email` / `helpCategory` —\n * those fields are still validated by Zod even when not rendered. */\n defaultValues?: Partial<ContactFormData>;\n /** Optional custom submit handler. When provided, the form bypasses\n * the built-in `useContactSubmission` flow (no /api/contact call,\n * no success-redirect, no built-in toast) — the caller owns the\n * entire side-effect chain. Reset + `onSubmitSuccess` still fire\n * on a successful await.\n *\n * Receives the schema-validated form payload PLUS the ready\n * attachments array (empty when `attachmentsEnabled === false` or\n * the user hasn't picked any). Caller forwards `attachments` to\n * whichever sink owns the upload (e.g. `actions.submitTicket`'s\n * `attachments` field for HubSpot Note engagements). */\n onCustomSubmit?: (data: ContactFormData, attachments: ChatAttachment[]) => Promise<void>;\n /** Turn on the attachments bar (file `+` button + chip strip) using\n * the same lib primitives the chat composer uses\n * (`<ChatAttachmentAddButton>` + `<ChatAttachmentChipStrip>` +\n * `useChatAttachments`). When `false` (the default), the form\n * doesn't render the bar AND the attachments array passed to\n * `onCustomSubmit` is always empty. */\n attachmentsEnabled?: boolean;\n /** Render slot for an EXTRA field at the very top of the form,\n * ABOVE the name/email row. Use this for ticket surfaces that need\n * a Subject input — the field is NOT part of `ContactSchema`, so\n * the caller manages its own state + validation and reads the\n * value back inside `onCustomSubmit`. */\n extraTopField?: ReactNode;\n\n title?: string;\n subtitle?: string;\n footerText?: string;\n noBorder?: boolean;\n noPadding?: boolean;\n buttonVariant?: ButtonProps['variant'];\n buttonClassName?: string;\n /** Submit-button label. Defaults to \"Send Message\". Override for\n * ticket surfaces (e.g. \"Open ticket\"). */\n submitLabel?: string;\n /** Success-state submit-button label (shown briefly after submit on\n * the built-in flow). Defaults to \"Message Sent!\". Has no effect\n * when `onCustomSubmit` is provided — the caller owns success UX. */\n submitSuccessLabel?: string;\n successRedirectUrl?: string;\n successToastMessage?: string;\n}\n\nexport function ContactForm({\n userId,\n helpCategoryOptions = defaultHelpCategoryOptions,\n rdtCid,\n onSubmitSuccess,\n prefilledReason,\n prefilledMessage,\n hideFields = [],\n defaultValues: defaultValuesProp,\n onCustomSubmit,\n extraTopField,\n attachmentsEnabled = false,\n title = 'Hit Us Up',\n subtitle,\n footerText = 'We typically respond within 24 hours. We respect your privacy – no spam, ever.',\n noBorder = false,\n noPadding = false,\n buttonVariant = 'accent',\n buttonClassName = '',\n submitLabel = 'Send Message',\n submitSuccessLabel = 'Message Sent!',\n successRedirectUrl = '/blog#community',\n successToastMessage = 'Redirecting you to join our community...',\n}: ContactFormProps = {}) {\n // Attachments staging — same hook the chat composer + ticket\n // detail-drawer composer use. Files upload to Supabase as soon as\n // the user picks them; `readyAttachments` is the wire-shape array\n // ready for the next submit. `hasInflightUploads` disables Send\n // until every upload settles.\n const attachments = useChatAttachments();\n // Built-in contact-API flow. Hook is called unconditionally (rules\n // of hooks); we just don't dispatch its `submit` when the caller\n // passes `onCustomSubmit`. The hook owns its own toast + redirect\n // chain so bypassing it cleanly hands all side-effects to the caller.\n const builtInSubmission = useContactSubmission({\n userId,\n successRedirectUrl,\n successToastMessage,\n });\n // Independent in-flight tracker for the custom path — we can't reuse\n // `builtInSubmission.isSubmitting` because that hook never sees a\n // request when `onCustomSubmit` is active.\n const [customSubmitting, setCustomSubmitting] = useState(false);\n\n // Invisible bot-protection signals (honeypot + timing). Spread into the\n // submit payload for BOTH the built-in and custom paths; reset on success.\n const { honeypotInputProps, getSignals, resetSignals } = useHumanitySignals();\n\n const isSubmitting = onCustomSubmit ? customSubmitting : builtInSubmission.isSubmitting;\n // `isSuccess` only ever fires on the built-in path; custom callers\n // own their own UX (no \"Message Sent!\" button-label flicker).\n const isSuccess = onCustomSubmit ? false : builtInSubmission.isSuccess;\n\n const {\n register,\n handleSubmit,\n control,\n formState: { errors },\n reset,\n } = useForm<ContactFormData>({\n resolver: zodResolver(ContactSchema),\n defaultValues: {\n ...(prefilledReason && { helpCategory: prefilledReason }),\n ...(prefilledMessage && { message: prefilledMessage }),\n // Caller-supplied defaults win over the legacy `prefilled*` props\n // (they're the authoritative seed for hidden fields).\n ...defaultValuesProp,\n },\n });\n\n const handleFormSubmit = async (data: ContactFormData) => {\n if (isSubmitting) return;\n if (attachmentsEnabled && attachments.hasInflightUploads) return;\n try {\n const payload = { ...data, ...(rdtCid && { rdt_cid: rdtCid }), ...getSignals() };\n const readyAttachments = attachmentsEnabled ? attachments.readyAttachments : [];\n if (onCustomSubmit) {\n setCustomSubmitting(true);\n try {\n await onCustomSubmit(payload, readyAttachments);\n } finally {\n setCustomSubmitting(false);\n }\n } else {\n await builtInSubmission.submit(payload);\n }\n onSubmitSuccess?.();\n reset();\n resetSignals();\n if (attachmentsEnabled) attachments.clear();\n } catch {\n // Error toast is owned by the active flow:\n // - built-in: `useContactSubmission` toasts inside `submit()`.\n // - custom: the caller toasts inside `onCustomSubmit`.\n // Either way we swallow here so a thrown error doesn't crash the\n // form tree (react-hook-form's onSubmit handler rejects upward).\n }\n };\n\n const showName = !hideFields.includes('name');\n const showEmail = !hideFields.includes('email');\n const showNameEmailRow = showName || showEmail;\n const showCompanySize = !hideFields.includes('companySize');\n const showReferralSource = !hideFields.includes('referralSource');\n const showHelpCategory = !hideFields.includes('helpCategory');\n const showMessage = !hideFields.includes('message');\n\n return (\n <div\n className={`flex h-full flex-col ${!noBorder ? 'rounded-2xl border border-ods-border md:rounded-3xl' : ''} ${!noPadding ? 'p-6 md:p-8 lg:p-10' : ''}`}\n >\n {(title || subtitle) && (\n <div className=\"mb-6 md:mb-8\">\n {title && <h2 className={`${SECTION_HEADING_CLASS} mb-3 md:mb-4`}>{title}</h2>}\n {subtitle && <p className=\"text-ods-text-primary text-h4\">{subtitle}</p>}\n </div>\n )}\n\n <form\n onSubmit={handleSubmit(handleFormSubmit, validationErrors => {\n // When validation fails on a HIDDEN field (e.g. ticket form\n // hides name/email/helpCategory and seeds them via\n // `defaultValues`), there's no visible error UI for the user\n // — the submit button just appears dead. Log so the broken\n // defaultValues wiring is at least discoverable in DevTools.\n console.warn(\n '[ContactForm] submit blocked by validation:',\n Object.fromEntries(Object.entries(validationErrors).map(([k, v]) => [k, v?.message ?? v])),\n );\n })}\n className=\"flex flex-grow flex-col space-y-4 md:space-y-6\"\n {...HUBSPOT_DO_NOT_COLLECT_FORM_PROPS}\n >\n {/* Hidden inputs for fields that are required by `ContactSchema`\n but suppressed from the visible UI via `hideFields`. Without\n these, `register('name')` never runs, react-hook-form skips\n the field at submit time, and Zod's required-string check\n fails silently — the user clicks Submit and NOTHING visible\n happens (no error, no network call). The caller-supplied\n `defaultValues` seed the values; the hidden inputs just tell\n RHF to include them in the submit payload. */}\n {!showName && <input type=\"hidden\" {...register('name')} />}\n {!showEmail && <input type=\"hidden\" {...register('email')} />}\n {!showHelpCategory && <input type=\"hidden\" {...register('helpCategory')} />}\n {!showMessage && <input type=\"hidden\" {...register('message')} />}\n\n {/* Invisible honeypot — real users never fill it; bots that fill every field trip it. */}\n <HoneypotField {...honeypotInputProps} />\n\n {/* Extra top field (e.g. Subject for ticket forms). Rendered\n outside the schema-driven layout so the caller fully owns\n label / placeholder / state. */}\n {extraTopField}\n\n {showNameEmailRow && (\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2 md:gap-6\">\n {showName && (\n <div className=\"flex flex-col\">\n <Label htmlFor=\"name\">\n Your Name\n <RequiredMark />\n </Label>\n <Input\n id=\"name\"\n type=\"text\"\n {...register('name')}\n placeholder=\"Jane Doe\"\n aria-invalid={!!errors.name}\n aria-required\n aria-describedby=\"name-error\"\n className=\"h-12 border-ods-border bg-ods-card px-3 text-ods-text-primary placeholder-ods-text-secondary\"\n />\n {errors.name && (\n <span id=\"name-error\" className=\"mt-1 text-ods-error text-h6\">\n {errors.name.message}\n </span>\n )}\n </div>\n )}\n {showEmail && (\n <div className=\"flex flex-col\">\n <Label htmlFor=\"email\">\n Email\n <RequiredMark />\n </Label>\n <Input\n id=\"email\"\n type=\"email\"\n {...register('email')}\n placeholder=\"jane@company.com\"\n aria-invalid={!!errors.email}\n aria-required\n aria-describedby=\"email-error\"\n className=\"h-12 border-ods-border bg-ods-card px-3 text-ods-text-primary placeholder-ods-text-secondary\"\n />\n {errors.email && (\n <span id=\"email-error\" className=\"mt-1 text-ods-error text-h6\">\n {errors.email.message}\n </span>\n )}\n </div>\n )}\n </div>\n )}\n\n {(showCompanySize || showReferralSource) && (\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2 md:gap-6\">\n {showCompanySize && (\n <div className=\"flex flex-col\">\n <Label htmlFor=\"companySize\">Company Size</Label>\n <Controller\n control={control}\n name=\"companySize\"\n render={({ field }) => (\n <Select onValueChange={field.onChange} defaultValue={field.value}>\n <SelectTrigger\n id=\"companySize\"\n aria-label=\"Company Size\"\n className=\"h-12 border-ods-border bg-ods-card px-3 text-ods-text-primary\"\n >\n <SelectValue placeholder=\"Select company size\" />\n </SelectTrigger>\n <SelectContent>\n {companySizeOptions.map(opt => (\n <SelectItem key={opt} value={opt}>\n {opt}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n />\n {errors.companySize && (\n <span id=\"companySize-error\" className=\"mt-1 text-ods-error text-h6\">\n {errors.companySize.message}\n </span>\n )}\n </div>\n )}\n {showReferralSource && (\n <div className=\"flex flex-col\">\n <Label htmlFor=\"referralSource\">How did you hear about us?</Label>\n <Controller\n control={control}\n name=\"referralSource\"\n render={({ field }) => (\n <Select onValueChange={field.onChange} defaultValue={field.value}>\n <SelectTrigger\n id=\"referralSource\"\n aria-label=\"Referral Source\"\n className=\"h-12 border-ods-border bg-ods-card px-3 text-ods-text-primary\"\n >\n <SelectValue placeholder=\"Select an option\" />\n </SelectTrigger>\n <SelectContent>\n {referralSourceOptions.map(opt => (\n <SelectItem key={opt} value={opt}>\n {opt}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n />\n {errors.referralSource && (\n <span id=\"referralSource-error\" className=\"mt-1 text-ods-error text-h6\">\n {errors.referralSource.message}\n </span>\n )}\n </div>\n )}\n </div>\n )}\n\n {showHelpCategory && (\n <div className=\"flex flex-col\">\n <Label htmlFor=\"helpCategory\">\n Choose your main interest\n <RequiredMark />\n </Label>\n <Controller\n control={control}\n name=\"helpCategory\"\n render={({ field }) => (\n <Select onValueChange={field.onChange} defaultValue={field.value}>\n <SelectTrigger\n id=\"helpCategory\"\n aria-label=\"Help Category\"\n aria-required\n className=\"h-12 border-ods-border bg-ods-card px-3 text-ods-text-primary\"\n >\n <SelectValue placeholder=\"Choose your main interest\" />\n </SelectTrigger>\n <SelectContent>\n {helpCategoryOptions.map(opt => (\n <SelectItem key={opt} value={opt}>\n {opt}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n />\n {errors.helpCategory && (\n <span id=\"helpCategory-error\" className=\"mt-1 text-ods-error text-h6\">\n {errors.helpCategory.message}\n </span>\n )}\n </div>\n )}\n\n {showMessage && (\n <div className=\"flex flex-grow flex-col\">\n <Label htmlFor=\"message\">\n Your Message\n <RequiredMark />\n </Label>\n <Textarea\n id=\"message\"\n {...register('message')}\n placeholder=\"Share your current challenges or questions about open-source alternatives...\"\n aria-invalid={!!errors.message}\n aria-required\n aria-describedby=\"message-error\"\n className=\"h-full flex-grow border-ods-border bg-ods-card text-ods-text-primary placeholder-ods-text-secondary\"\n />\n {errors.message && (\n <span id=\"message-error\" className=\"mt-1 text-ods-error text-h6\">\n {errors.message.message}\n </span>\n )}\n </div>\n )}\n\n {/* Attachments — only renders when `attachmentsEnabled` is on.\n Uses the SAME chip strip + add button + staging hook the\n chat composer and ticket-drawer composer use, so the visual\n chip styling + upload-progress UX are identical everywhere\n attachments appear. */}\n {attachmentsEnabled && (\n <div className=\"flex flex-col gap-2\">\n <ChatAttachmentChipStrip\n attachments={attachments.attachments}\n onRemove={attachments.removeAttachment}\n disabled={isSubmitting}\n />\n <div className=\"flex items-center gap-2\">\n <ChatAttachmentAddButton\n attachmentsEnabled\n attachmentsCount={attachments.attachments.length}\n onAddFiles={attachments.addFiles}\n disabled={isSubmitting}\n />\n <span className=\"text-ods-text-secondary text-h6\">Attach files (optional)</span>\n </div>\n </div>\n )}\n\n <div className=\"mt-auto flex w-full flex-col items-center justify-end gap-4 pt-2 md:flex-row md:gap-6\">\n {footerText && <p className=\"text-center text-ods-text-secondary text-h6 md:text-left\">{footerText}</p>}\n <Button\n type=\"submit\"\n loading={isSubmitting}\n disabled={isSubmitting || isSuccess || (attachmentsEnabled && attachments.hasInflightUploads)}\n variant={buttonVariant}\n className={`w-full md:w-auto ${buttonClassName}`}\n >\n {isSuccess ? submitSuccessLabel : submitLabel}\n </Button>\n </div>\n </form>\n </div>\n );\n}\n","import { z } from 'zod';\n\n// Dropdown option constants — re-exported by `<ContactForm>` consumers\n// that want to surface their own custom Select widgets keyed on the\n// same allowed-value set.\nexport const companySizeOptions = ['1-10', '11-50', '51-200', '201-500', '501-1000', '1001+'] as const;\n\nexport const referralSourceOptions = [\n 'Google',\n 'LinkedIn',\n 'Twitter/X',\n 'Reddit',\n 'Friend / Colleague',\n 'Other',\n] as const;\n\n// Default fallback options — used when the embedder doesn't supply\n// platform-specific help-category options via the `helpCategoryOptions`\n// prop on `<ContactForm>`.\nexport const defaultHelpCategoryOptions = [\n 'Open-Source Alternatives',\n 'Vendor Cost Reduction',\n 'MSP Best Practices',\n 'Partnerships',\n 'Press',\n 'Other',\n] as const;\n\n// Reusable LinkedIn URL validator — the single source of truth. Every\n// public form schema, every admin update schema, every HubSpot push\n// validator MUST reference this so validation rules cannot drift\n// across boundaries.\n//\n// Host validation parses the URL and checks the hostname suffix so an\n// adversarial input like `https://evil.com/linkedin.com/x` is rejected\n// (substring match would have accepted it — CodeQL alert\n// \"Incomplete URL substring sanitization\").\nexport const LinkedInUrlSchema = z\n .string()\n .url({ message: 'Please enter a valid LinkedIn URL' })\n .refine(\n url => {\n try {\n const host = new URL(url).hostname.toLowerCase();\n return host === 'linkedin.com' || host.endsWith('.linkedin.com');\n } catch {\n return false;\n }\n },\n {\n message: 'Please enter a valid LinkedIn profile URL',\n },\n )\n .optional()\n .or(z.literal(''));\n\n/**\n * Base schema — fields shared by every contact-style form (main contact\n * form, TMCG join, data-room request, case-study pitch, etc.). Any\n * field that exists on a form but NOT on this schema is silently\n * stripped by `safeParse` — that's exactly the bug the LinkedIn field\n * hit historically.\n */\nexport const ContactBaseSchema = z.object({\n name: z.string().min(2, { message: 'Name must be at least 2 characters' }).max(255, { message: 'Name is too long' }),\n email: z.string().email({ message: 'Please enter a valid email address' }).max(255),\n linkedin_url: LinkedInUrlSchema,\n helpCategory: z\n .string()\n .min(1, { message: 'Please select what we can help you with' })\n .max(255, { message: 'Help category is too long' }),\n message: z\n .string()\n .min(10, { message: 'Message must be at least 10 characters' })\n .max(5000, { message: 'Message is too long (5,000 character limit)' }),\n rdt_cid: z.string().optional(),\n});\n\n// Public POST /api/contact validator — base + dropdown fields used by\n// the generic contact form. Other form-specific schemas extend\n// `ContactBaseSchema`.\nexport const ContactSchema = ContactBaseSchema.extend({\n companySize: z\n .string()\n .optional()\n .refine(val => !val || companySizeOptions.includes(val as (typeof companySizeOptions)[number]), {\n message: 'Please select a valid company size',\n }),\n referralSource: z\n .string()\n .optional()\n .refine(val => !val || referralSourceOptions.includes(val as (typeof referralSourceOptions)[number]), {\n message: 'Please select a valid referral source',\n }),\n});\n\nexport type ContactFormData = z.infer<typeof ContactSchema>;\n\nexport interface ContactApiResponse {\n success: boolean;\n error?: string;\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-UIAXQJPV.cjs","../src/components/contact/contact-form.tsx","../src/schemas/contact-schema.ts"],"names":[],"mappings":"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","file":"/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-UIAXQJPV.cjs","sourcesContent":[null,"'use client';\n\n/**\n * `<ContactForm />` — the canonical contact form used by every public\n * surface (TMCG join, case-study pitch, generic /contact, Help Center\n * ticket creation, etc.).\n *\n * Self-contained inside the lib — host-specific values (user id for\n * tracking, platform-specific contact reasons, reddit-click attribution\n * id) flow IN via props. The hub passes them via a thin\n * `<ContactForm>` wrapper that resolves them from `useAuth` /\n * `getAppConfig` / `getStoredRedditClickId`. Other embedders pass\n * whatever they have (or omit).\n *\n * Field-hide + custom-submit + extra-top-field knobs let one form\n * serve both contact and ticket-creation flows without forking:\n * - Contact page: rendered with all fields visible, built-in submit\n * flow to `/api/contact` via `useContactSubmission`.\n * - Ticket page: hides name/email/companySize/referralSource/\n * helpCategory; supplies `extraTopField` (a Subject input) +\n * `onCustomSubmit` wired to `useTicketActions.submitTicket`.\n */\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { useState, type ReactNode } from 'react';\nimport { useForm, Controller } from 'react-hook-form';\nimport { useContactSubmission } from '../../hooks/use-contact-submission';\nimport { useHumanitySignals } from '../../hooks/use-humanity-signals';\nimport {\n ContactSchema,\n type ContactFormData,\n companySizeOptions,\n referralSourceOptions,\n defaultHelpCategoryOptions,\n} from '../../schemas/contact-schema';\nimport { HUBSPOT_DO_NOT_COLLECT_FORM_PROPS } from '../../utils/hubspot-collected-forms';\nimport { ChatAttachmentAddButton, ChatAttachmentChipStrip } from '../chat/chat-attachment-bar';\nimport { useChatAttachments } from '../chat/hooks/use-chat-attachments';\nimport type { ChatAttachment } from '../chat/utils/chat-attachment-markdown';\nimport { SECTION_HEADING_CLASS } from '../layout/page-heading';\nimport {\n Button,\n type ButtonProps,\n Input,\n Textarea,\n Select,\n SelectTrigger,\n SelectValue,\n SelectContent,\n SelectItem,\n Label,\n} from '../ui';\nimport { HoneypotField } from '../ui/honeypot-field';\nimport { RequiredMark } from '../ui/required-mark';\n\n/**\n * Fields the caller can suppress. Six values — every primary form\n * field plus `name` and `email` (newly hideable so ticket-creation\n * surfaces can hide them; they still need to validate, so the caller\n * MUST supply pre-filled values via `defaultValues` when hiding them).\n */\nexport type ContactFormHideableField = 'name' | 'email' | 'companySize' | 'referralSource' | 'helpCategory' | 'message';\n\nexport interface ContactFormProps {\n /** Host-side user id passed to `useContactSubmission` for attribution.\n * Hub wrapper passes `useAuth().user?.id`; lib's Help Center surface\n * passes `useChatIdentity().user?.id`. Omit for anon flows. */\n userId?: string;\n /** Platform-specific help-category dropdown options. Hub wrapper\n * passes `getAppConfig().contact.contactReasons`. Defaults to the\n * lib's `defaultHelpCategoryOptions`. */\n helpCategoryOptions?: readonly string[];\n /** Reddit click attribution id. Caller resolves from wherever they\n * stash it (hub: sessionStorage via `getStoredRedditClickId`). When\n * set, it's spread into the submission payload. */\n rdtCid?: string;\n /** Called after a successful submit so the caller can clear their\n * attribution storage (hub wrapper calls `clearStoredRedditClickId`).\n * Fires for BOTH the built-in and custom submit paths. */\n onSubmitSuccess?: () => void;\n\n prefilledReason?: string;\n prefilledMessage?: string;\n hideFields?: ContactFormHideableField[];\n /** Authoritative pre-fill for any field the caller hides. Merged\n * into react-hook-form's `defaultValues` AFTER the legacy\n * `prefilledReason` / `prefilledMessage` props (caller-supplied\n * wins). REQUIRED when hiding `name` / `email` / `helpCategory` —\n * those fields are still validated by Zod even when not rendered. */\n defaultValues?: Partial<ContactFormData>;\n /** Optional custom submit handler. When provided, the form bypasses\n * the built-in `useContactSubmission` flow (no /api/contact call,\n * no success-redirect, no built-in toast) — the caller owns the\n * entire side-effect chain. Reset + `onSubmitSuccess` still fire\n * on a successful await.\n *\n * Receives the schema-validated form payload PLUS the ready\n * attachments array (empty when `attachmentsEnabled === false` or\n * the user hasn't picked any). Caller forwards `attachments` to\n * whichever sink owns the upload (e.g. `actions.submitTicket`'s\n * `attachments` field for HubSpot Note engagements). */\n onCustomSubmit?: (data: ContactFormData, attachments: ChatAttachment[]) => Promise<void>;\n /** Turn on the attachments bar (file `+` button + chip strip) using\n * the same lib primitives the chat composer uses\n * (`<ChatAttachmentAddButton>` + `<ChatAttachmentChipStrip>` +\n * `useChatAttachments`). When `false` (the default), the form\n * doesn't render the bar AND the attachments array passed to\n * `onCustomSubmit` is always empty. */\n attachmentsEnabled?: boolean;\n /** Render slot for an EXTRA field at the very top of the form,\n * ABOVE the name/email row. Use this for ticket surfaces that need\n * a Subject input — the field is NOT part of `ContactSchema`, so\n * the caller manages its own state + validation and reads the\n * value back inside `onCustomSubmit`. */\n extraTopField?: ReactNode;\n\n title?: string;\n subtitle?: string;\n footerText?: string;\n noBorder?: boolean;\n noPadding?: boolean;\n buttonVariant?: ButtonProps['variant'];\n buttonClassName?: string;\n /** Submit-button label. Defaults to \"Send Message\". Override for\n * ticket surfaces (e.g. \"Open ticket\"). */\n submitLabel?: string;\n /** Success-state submit-button label (shown briefly after submit on\n * the built-in flow). Defaults to \"Message Sent!\". Has no effect\n * when `onCustomSubmit` is provided — the caller owns success UX. */\n submitSuccessLabel?: string;\n successRedirectUrl?: string;\n successToastMessage?: string;\n}\n\nexport function ContactForm({\n userId,\n helpCategoryOptions = defaultHelpCategoryOptions,\n rdtCid,\n onSubmitSuccess,\n prefilledReason,\n prefilledMessage,\n hideFields = [],\n defaultValues: defaultValuesProp,\n onCustomSubmit,\n extraTopField,\n attachmentsEnabled = false,\n title = 'Hit Us Up',\n subtitle,\n footerText = 'We typically respond within 24 hours. We respect your privacy – no spam, ever.',\n noBorder = false,\n noPadding = false,\n buttonVariant = 'accent',\n buttonClassName = '',\n submitLabel = 'Send Message',\n submitSuccessLabel = 'Message Sent!',\n successRedirectUrl = '/blog#community',\n successToastMessage = 'Redirecting you to join our community...',\n}: ContactFormProps = {}) {\n // Attachments staging — same hook the chat composer + ticket\n // detail-drawer composer use. Files upload to Supabase as soon as\n // the user picks them; `readyAttachments` is the wire-shape array\n // ready for the next submit. `hasInflightUploads` disables Send\n // until every upload settles.\n const attachments = useChatAttachments();\n // Built-in contact-API flow. Hook is called unconditionally (rules\n // of hooks); we just don't dispatch its `submit` when the caller\n // passes `onCustomSubmit`. The hook owns its own toast + redirect\n // chain so bypassing it cleanly hands all side-effects to the caller.\n const builtInSubmission = useContactSubmission({\n userId,\n successRedirectUrl,\n successToastMessage,\n });\n // Independent in-flight tracker for the custom path — we can't reuse\n // `builtInSubmission.isSubmitting` because that hook never sees a\n // request when `onCustomSubmit` is active.\n const [customSubmitting, setCustomSubmitting] = useState(false);\n\n // Invisible bot-protection signals (honeypot + timing). Spread into the\n // submit payload for BOTH the built-in and custom paths; reset on success.\n const { honeypotInputProps, getSignals, resetSignals } = useHumanitySignals();\n\n const isSubmitting = onCustomSubmit ? customSubmitting : builtInSubmission.isSubmitting;\n // `isSuccess` only ever fires on the built-in path; custom callers\n // own their own UX (no \"Message Sent!\" button-label flicker).\n const isSuccess = onCustomSubmit ? false : builtInSubmission.isSuccess;\n\n const {\n register,\n handleSubmit,\n control,\n formState: { errors },\n reset,\n } = useForm<ContactFormData>({\n resolver: zodResolver(ContactSchema),\n defaultValues: {\n ...(prefilledReason && { helpCategory: prefilledReason }),\n ...(prefilledMessage && { message: prefilledMessage }),\n // Caller-supplied defaults win over the legacy `prefilled*` props\n // (they're the authoritative seed for hidden fields).\n ...defaultValuesProp,\n },\n });\n\n const handleFormSubmit = async (data: ContactFormData) => {\n if (isSubmitting) return;\n if (attachmentsEnabled && attachments.hasInflightUploads) return;\n try {\n const payload = { ...data, ...(rdtCid && { rdt_cid: rdtCid }), ...getSignals() };\n const readyAttachments = attachmentsEnabled ? attachments.readyAttachments : [];\n if (onCustomSubmit) {\n setCustomSubmitting(true);\n try {\n await onCustomSubmit(payload, readyAttachments);\n } finally {\n setCustomSubmitting(false);\n }\n } else {\n await builtInSubmission.submit(payload);\n }\n onSubmitSuccess?.();\n reset();\n resetSignals();\n if (attachmentsEnabled) attachments.clear();\n } catch {\n // Error toast is owned by the active flow:\n // - built-in: `useContactSubmission` toasts inside `submit()`.\n // - custom: the caller toasts inside `onCustomSubmit`.\n // Either way we swallow here so a thrown error doesn't crash the\n // form tree (react-hook-form's onSubmit handler rejects upward).\n }\n };\n\n const showName = !hideFields.includes('name');\n const showEmail = !hideFields.includes('email');\n const showNameEmailRow = showName || showEmail;\n const showCompanySize = !hideFields.includes('companySize');\n const showReferralSource = !hideFields.includes('referralSource');\n const showHelpCategory = !hideFields.includes('helpCategory');\n const showMessage = !hideFields.includes('message');\n\n return (\n <div\n className={`flex h-full flex-col ${!noBorder ? 'rounded-2xl border border-ods-border md:rounded-3xl' : ''} ${!noPadding ? 'p-6 md:p-8 lg:p-10' : ''}`}\n >\n {(title || subtitle) && (\n <div className=\"mb-6 md:mb-8\">\n {title && <h2 className={`${SECTION_HEADING_CLASS} mb-3 md:mb-4`}>{title}</h2>}\n {subtitle && <p className=\"text-ods-text-primary text-h4\">{subtitle}</p>}\n </div>\n )}\n\n <form\n onSubmit={handleSubmit(handleFormSubmit, validationErrors => {\n // When validation fails on a HIDDEN field (e.g. ticket form\n // hides name/email/helpCategory and seeds them via\n // `defaultValues`), there's no visible error UI for the user\n // — the submit button just appears dead. Log so the broken\n // defaultValues wiring is at least discoverable in DevTools.\n console.warn(\n '[ContactForm] submit blocked by validation:',\n Object.fromEntries(Object.entries(validationErrors).map(([k, v]) => [k, v?.message ?? v])),\n );\n })}\n className=\"flex flex-grow flex-col space-y-4 md:space-y-6\"\n {...HUBSPOT_DO_NOT_COLLECT_FORM_PROPS}\n >\n {/* Hidden inputs for fields that are required by `ContactSchema`\n but suppressed from the visible UI via `hideFields`. Without\n these, `register('name')` never runs, react-hook-form skips\n the field at submit time, and Zod's required-string check\n fails silently — the user clicks Submit and NOTHING visible\n happens (no error, no network call). The caller-supplied\n `defaultValues` seed the values; the hidden inputs just tell\n RHF to include them in the submit payload. */}\n {!showName && <input type=\"hidden\" {...register('name')} />}\n {!showEmail && <input type=\"hidden\" {...register('email')} />}\n {!showHelpCategory && <input type=\"hidden\" {...register('helpCategory')} />}\n {!showMessage && <input type=\"hidden\" {...register('message')} />}\n\n {/* Invisible honeypot — real users never fill it; bots that fill every field trip it. */}\n <HoneypotField {...honeypotInputProps} />\n\n {/* Extra top field (e.g. Subject for ticket forms). Rendered\n outside the schema-driven layout so the caller fully owns\n label / placeholder / state. */}\n {extraTopField}\n\n {showNameEmailRow && (\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2 md:gap-6\">\n {showName && (\n <div className=\"flex flex-col\">\n <Label htmlFor=\"name\">\n Your Name\n <RequiredMark />\n </Label>\n <Input\n id=\"name\"\n type=\"text\"\n {...register('name')}\n placeholder=\"Jane Doe\"\n aria-invalid={!!errors.name}\n aria-required\n aria-describedby=\"name-error\"\n className=\"h-12 border-ods-border bg-ods-card px-3 text-ods-text-primary placeholder-ods-text-secondary\"\n />\n {errors.name && (\n <span id=\"name-error\" className=\"mt-1 text-ods-error text-h6\">\n {errors.name.message}\n </span>\n )}\n </div>\n )}\n {showEmail && (\n <div className=\"flex flex-col\">\n <Label htmlFor=\"email\">\n Email\n <RequiredMark />\n </Label>\n <Input\n id=\"email\"\n type=\"email\"\n {...register('email')}\n placeholder=\"jane@company.com\"\n aria-invalid={!!errors.email}\n aria-required\n aria-describedby=\"email-error\"\n className=\"h-12 border-ods-border bg-ods-card px-3 text-ods-text-primary placeholder-ods-text-secondary\"\n />\n {errors.email && (\n <span id=\"email-error\" className=\"mt-1 text-ods-error text-h6\">\n {errors.email.message}\n </span>\n )}\n </div>\n )}\n </div>\n )}\n\n {(showCompanySize || showReferralSource) && (\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2 md:gap-6\">\n {showCompanySize && (\n <div className=\"flex flex-col\">\n <Label htmlFor=\"companySize\">Company Size</Label>\n <Controller\n control={control}\n name=\"companySize\"\n render={({ field }) => (\n <Select onValueChange={field.onChange} defaultValue={field.value}>\n <SelectTrigger\n id=\"companySize\"\n aria-label=\"Company Size\"\n className=\"h-12 border-ods-border bg-ods-card px-3 text-ods-text-primary\"\n >\n <SelectValue placeholder=\"Select company size\" />\n </SelectTrigger>\n <SelectContent>\n {companySizeOptions.map(opt => (\n <SelectItem key={opt} value={opt}>\n {opt}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n />\n {errors.companySize && (\n <span id=\"companySize-error\" className=\"mt-1 text-ods-error text-h6\">\n {errors.companySize.message}\n </span>\n )}\n </div>\n )}\n {showReferralSource && (\n <div className=\"flex flex-col\">\n <Label htmlFor=\"referralSource\">How did you hear about us?</Label>\n <Controller\n control={control}\n name=\"referralSource\"\n render={({ field }) => (\n <Select onValueChange={field.onChange} defaultValue={field.value}>\n <SelectTrigger\n id=\"referralSource\"\n aria-label=\"Referral Source\"\n className=\"h-12 border-ods-border bg-ods-card px-3 text-ods-text-primary\"\n >\n <SelectValue placeholder=\"Select an option\" />\n </SelectTrigger>\n <SelectContent>\n {referralSourceOptions.map(opt => (\n <SelectItem key={opt} value={opt}>\n {opt}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n />\n {errors.referralSource && (\n <span id=\"referralSource-error\" className=\"mt-1 text-ods-error text-h6\">\n {errors.referralSource.message}\n </span>\n )}\n </div>\n )}\n </div>\n )}\n\n {showHelpCategory && (\n <div className=\"flex flex-col\">\n <Label htmlFor=\"helpCategory\">\n Choose your main interest\n <RequiredMark />\n </Label>\n <Controller\n control={control}\n name=\"helpCategory\"\n render={({ field }) => (\n <Select onValueChange={field.onChange} defaultValue={field.value}>\n <SelectTrigger\n id=\"helpCategory\"\n aria-label=\"Help Category\"\n aria-required\n className=\"h-12 border-ods-border bg-ods-card px-3 text-ods-text-primary\"\n >\n <SelectValue placeholder=\"Choose your main interest\" />\n </SelectTrigger>\n <SelectContent>\n {helpCategoryOptions.map(opt => (\n <SelectItem key={opt} value={opt}>\n {opt}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n />\n {errors.helpCategory && (\n <span id=\"helpCategory-error\" className=\"mt-1 text-ods-error text-h6\">\n {errors.helpCategory.message}\n </span>\n )}\n </div>\n )}\n\n {showMessage && (\n <div className=\"flex flex-grow flex-col\">\n <Label htmlFor=\"message\">\n Your Message\n <RequiredMark />\n </Label>\n <Textarea\n id=\"message\"\n {...register('message')}\n placeholder=\"Share your current challenges or questions about open-source alternatives...\"\n aria-invalid={!!errors.message}\n aria-required\n aria-describedby=\"message-error\"\n className=\"h-full flex-grow border-ods-border bg-ods-card text-ods-text-primary placeholder-ods-text-secondary\"\n />\n {errors.message && (\n <span id=\"message-error\" className=\"mt-1 text-ods-error text-h6\">\n {errors.message.message}\n </span>\n )}\n </div>\n )}\n\n {/* Attachments — only renders when `attachmentsEnabled` is on.\n Uses the SAME chip strip + add button + staging hook the\n chat composer and ticket-drawer composer use, so the visual\n chip styling + upload-progress UX are identical everywhere\n attachments appear. */}\n {attachmentsEnabled && (\n <div className=\"flex flex-col gap-2\">\n <ChatAttachmentChipStrip\n attachments={attachments.attachments}\n onRemove={attachments.removeAttachment}\n disabled={isSubmitting}\n />\n <div className=\"flex items-center gap-2\">\n <ChatAttachmentAddButton\n attachmentsEnabled\n attachmentsCount={attachments.attachments.length}\n onAddFiles={attachments.addFiles}\n disabled={isSubmitting}\n />\n <span className=\"text-ods-text-secondary text-h6\">Attach files (optional)</span>\n </div>\n </div>\n )}\n\n <div className=\"mt-auto flex w-full flex-col items-center justify-end gap-4 pt-2 md:flex-row md:gap-6\">\n {footerText && <p className=\"text-center text-ods-text-secondary text-h6 md:text-left\">{footerText}</p>}\n <Button\n type=\"submit\"\n loading={isSubmitting}\n disabled={isSubmitting || isSuccess || (attachmentsEnabled && attachments.hasInflightUploads)}\n variant={buttonVariant}\n className={`w-full md:w-auto ${buttonClassName}`}\n >\n {isSuccess ? submitSuccessLabel : submitLabel}\n </Button>\n </div>\n </form>\n </div>\n );\n}\n","import { z } from 'zod';\n\n// Dropdown option constants — re-exported by `<ContactForm>` consumers\n// that want to surface their own custom Select widgets keyed on the\n// same allowed-value set.\nexport const companySizeOptions = ['1-10', '11-50', '51-200', '201-500', '501-1000', '1001+'] as const;\n\nexport const referralSourceOptions = [\n 'Google',\n 'LinkedIn',\n 'Twitter/X',\n 'Reddit',\n 'Friend / Colleague',\n 'Other',\n] as const;\n\n// Default fallback options — used when the embedder doesn't supply\n// platform-specific help-category options via the `helpCategoryOptions`\n// prop on `<ContactForm>`.\nexport const defaultHelpCategoryOptions = [\n 'Open-Source Alternatives',\n 'Vendor Cost Reduction',\n 'MSP Best Practices',\n 'Partnerships',\n 'Press',\n 'Other',\n] as const;\n\n// Reusable LinkedIn URL validator — the single source of truth. Every\n// public form schema, every admin update schema, every HubSpot push\n// validator MUST reference this so validation rules cannot drift\n// across boundaries.\n//\n// Host validation parses the URL and checks the hostname suffix so an\n// adversarial input like `https://evil.com/linkedin.com/x` is rejected\n// (substring match would have accepted it — CodeQL alert\n// \"Incomplete URL substring sanitization\").\nexport const LinkedInUrlSchema = z\n .string()\n .url({ message: 'Please enter a valid LinkedIn URL' })\n .refine(\n url => {\n try {\n const host = new URL(url).hostname.toLowerCase();\n return host === 'linkedin.com' || host.endsWith('.linkedin.com');\n } catch {\n return false;\n }\n },\n {\n message: 'Please enter a valid LinkedIn profile URL',\n },\n )\n .optional()\n .or(z.literal(''));\n\n/**\n * Base schema — fields shared by every contact-style form (main contact\n * form, TMCG join, data-room request, case-study pitch, etc.). Any\n * field that exists on a form but NOT on this schema is silently\n * stripped by `safeParse` — that's exactly the bug the LinkedIn field\n * hit historically.\n */\nexport const ContactBaseSchema = z.object({\n name: z.string().min(2, { message: 'Name must be at least 2 characters' }).max(255, { message: 'Name is too long' }),\n email: z.string().email({ message: 'Please enter a valid email address' }).max(255),\n linkedin_url: LinkedInUrlSchema,\n helpCategory: z\n .string()\n .min(1, { message: 'Please select what we can help you with' })\n .max(255, { message: 'Help category is too long' }),\n message: z\n .string()\n .min(10, { message: 'Message must be at least 10 characters' })\n .max(5000, { message: 'Message is too long (5,000 character limit)' }),\n rdt_cid: z.string().optional(),\n});\n\n// Public POST /api/contact validator — base + dropdown fields used by\n// the generic contact form. Other form-specific schemas extend\n// `ContactBaseSchema`.\nexport const ContactSchema = ContactBaseSchema.extend({\n companySize: z\n .string()\n .optional()\n .refine(val => !val || companySizeOptions.includes(val as (typeof companySizeOptions)[number]), {\n message: 'Please select a valid company size',\n }),\n referralSource: z\n .string()\n .optional()\n .refine(val => !val || referralSourceOptions.includes(val as (typeof referralSourceOptions)[number]), {\n message: 'Please select a valid referral source',\n }),\n});\n\nexport type ContactFormData = z.infer<typeof ContactSchema>;\n\nexport interface ContactApiResponse {\n success: boolean;\n error?: string;\n}\n"]}
@@ -4,7 +4,7 @@ import {
4
4
  getOSLabel,
5
5
  getShellLabel,
6
6
  getToolLabel
7
- } from "./chunk-M23ZPKOK.js";
7
+ } from "./chunk-E7C3F2SK.js";
8
8
  import {
9
9
  useOnboardingState
10
10
  } from "./chunk-LXBHYUIN.js";
@@ -13,7 +13,7 @@ import {
13
13
  } from "./chunk-BXWXBBAC.js";
14
14
  import {
15
15
  SECTION_HEADING_CLASS
16
- } from "./chunk-4NKKPGDN.js";
16
+ } from "./chunk-H7ORPMRH.js";
17
17
  import {
18
18
  ToolIcon,
19
19
  cn as cn2
@@ -558,4 +558,4 @@ export {
558
558
  OnboardingStepCard,
559
559
  OnboardingWalkthrough
560
560
  };
561
- //# sourceMappingURL=chunk-F5LMTKQD.js.map
561
+ //# sourceMappingURL=chunk-VFGBRGFB.js.map
@@ -1,7 +1,7 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }"use client";
2
2
 
3
3
 
4
- var _chunk4EY5JSMKcjs = require('./chunk-4EY5JSMK.cjs');
4
+ var _chunkRRGTBH3Lcjs = require('./chunk-RRGTBH3L.cjs');
5
5
 
6
6
 
7
7
 
@@ -13,7 +13,7 @@ var _chunk4EY5JSMKcjs = require('./chunk-4EY5JSMK.cjs');
13
13
 
14
14
 
15
15
 
16
- var _chunkZIT4TC5Rcjs = require('./chunk-ZIT4TC5R.cjs');
16
+ var _chunkPUE4XMZKcjs = require('./chunk-PUE4XMZK.cjs');
17
17
 
18
18
 
19
19
 
@@ -21,7 +21,7 @@ var _chunkXNJZ6A2Scjs = require('./chunk-XNJZ6A2S.cjs');
21
21
 
22
22
 
23
23
 
24
- var _chunkGXHZCGVJcjs = require('./chunk-GXHZCGVJ.cjs');
24
+ var _chunkLSVQNRX4cjs = require('./chunk-LSVQNRX4.cjs');
25
25
 
26
26
 
27
27
 
@@ -184,7 +184,7 @@ function MobileNavPanel({ isOpen, config }) {
184
184
  );
185
185
  };
186
186
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
187
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: _chunkX7CEWD6Vcjs.cn.call(void 0, "fixed inset-0 z-[9998]", _chunkGXHZCGVJcjs.OVERLAY_BACKDROP_CLASS), onClick: config.onClose }),
187
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: _chunkX7CEWD6Vcjs.cn.call(void 0, "fixed inset-0 z-[9998]", _chunkLSVQNRX4cjs.OVERLAY_BACKDROP_CLASS), onClick: config.onClose }),
188
188
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
189
189
  "div",
190
190
  {
@@ -239,16 +239,16 @@ function MobileNavPanel({ isOpen, config }) {
239
239
  // src/components/navigation/ticket-alerts-button.tsx
240
240
 
241
241
  function TicketAlertsButton({ href, onNavigate, disabled, className }) {
242
- const live = _chunk4EY5JSMKcjs.useOptionalTicketLive.call(void 0, );
242
+ const live = _chunkRRGTBH3Lcjs.useOptionalTicketLive.call(void 0, );
243
243
  if (!live || !live.authed || live.unreadTotal === 0) return null;
244
244
  const targetId = live.nextUnreadTicketId;
245
- const target = targetId ? _chunkZIT4TC5Rcjs.buildTicketOpenHref.call(void 0, href, targetId) : href;
245
+ const target = targetId ? _chunkPUE4XMZKcjs.buildTicketOpenHref.call(void 0, href, targetId) : href;
246
246
  const handleClick = () => {
247
247
  if (onNavigate) onNavigate(target);
248
248
  else window.location.assign(target);
249
249
  };
250
250
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
251
- _chunkZIT4TC5Rcjs.HeaderButton,
251
+ _chunkPUE4XMZKcjs.HeaderButton,
252
252
  {
253
253
  icon: (
254
254
  // Glyph inherits HeaderButton's standard cell coloring (secondary at
@@ -258,7 +258,7 @@ function TicketAlertsButton({ href, onNavigate, disabled, className }) {
258
258
  // existing while updates are unread — never by tinting the glyph.
259
259
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "relative inline-flex", children: [
260
260
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkYRTMAXLEcjs.LifeBuoyIcon, { className: "h-6 w-6" }),
261
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZIT4TC5Rcjs.UnreadCountBadge, { count: live.unreadTotal })
261
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkPUE4XMZKcjs.UnreadCountBadge, { count: live.unreadTotal })
262
262
  ] })
263
263
  ),
264
264
  "aria-label": `Support tickets \u2014 ${live.unreadTotal} unread ${live.unreadTotal === 1 ? "update" : "updates"}`,
@@ -576,7 +576,7 @@ function Header({ config }) {
576
576
  leading: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
577
577
  !!_optionalChain([config, 'access', _12 => _12.actions, 'optionalAccess', _13 => _13.left, 'optionalAccess', _14 => _14.length]) && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex h-full items-center border-r border-ods-border", children: config.actions.left }),
578
578
  _optionalChain([config, 'access', _15 => _15.mobile, 'optionalAccess', _16 => _16.enabled]) && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
579
- _chunkZIT4TC5Rcjs.HeaderButton,
579
+ _chunkPUE4XMZKcjs.HeaderButton,
580
580
  {
581
581
  className: "border-r border-ods-border lg:hidden",
582
582
  onClick: () => {
@@ -677,7 +677,7 @@ function HeaderSkeleton({ config }) {
677
677
  // src/components/navigation/client-only-header.tsx
678
678
 
679
679
  function ClientOnlyHeader({ config, skeleton }) {
680
- const isClient = _chunkGXHZCGVJcjs.useIsHydrated.call(void 0, );
680
+ const isClient = _chunkLSVQNRX4cjs.useIsHydrated.call(void 0, );
681
681
  if (!isClient) {
682
682
  return skeleton || /* @__PURE__ */ _jsxruntime.jsx.call(void 0, HeaderSkeleton, { config });
683
683
  }
@@ -691,7 +691,7 @@ var _framermotion = require('framer-motion');
691
691
 
692
692
  function SlidingSidebar({ config }) {
693
693
  const [expandedItems, setExpandedItems] = _react.useState.call(void 0, /* @__PURE__ */ new Set());
694
- const mounted = _chunkGXHZCGVJcjs.useIsHydrated.call(void 0, );
694
+ const mounted = _chunkLSVQNRX4cjs.useIsHydrated.call(void 0, );
695
695
  const headerHeight = _chunkTLLJIGTPcjs.useHeaderHeight.call(void 0, );
696
696
  const asideRef = _react.useRef.call(void 0, null);
697
697
  const prefersReducedMotion = _framermotion.useReducedMotion.call(void 0, );
@@ -823,7 +823,7 @@ function SlidingSidebar({ config }) {
823
823
  duration: 0.3,
824
824
  ease: [0.4, 0, 0.2, 1]
825
825
  },
826
- className: _chunkX7CEWD6Vcjs.cn.call(void 0, "fixed inset-0 z-[45]", _chunkGXHZCGVJcjs.OVERLAY_BACKDROP_CLASS),
826
+ className: _chunkX7CEWD6Vcjs.cn.call(void 0, "fixed inset-0 z-[45]", _chunkLSVQNRX4cjs.OVERLAY_BACKDROP_CLASS),
827
827
  onClick: () => config.onClose()
828
828
  }
829
829
  ) }),
@@ -944,7 +944,7 @@ var NavigationSidebarItemButton = _react.memo.call(void 0, function NavigationSi
944
944
  _react.cloneElement.call(void 0, item.icon, {
945
945
  color: isActive && !disabled ? "text-ods-accent" : "text-ods-text-secondary"
946
946
  }),
947
- hasUnread && !showLabel && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZIT4TC5Rcjs.UnreadDot, { size: "fixed" })
947
+ hasUnread && !showLabel && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkPUE4XMZKcjs.UnreadDot, { size: "fixed" })
948
948
  ] }),
949
949
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
950
950
  "span",
@@ -1042,7 +1042,7 @@ function NavigationSidebar({ config, disabled = false }) {
1042
1042
  setTabletFor(isTablet);
1043
1043
  if (isTablet) setTabletMinimized(true);
1044
1044
  }
1045
- const hydrated = _chunkGXHZCGVJcjs.useIsHydrated.call(void 0, );
1045
+ const hydrated = _chunkLSVQNRX4cjs.useIsHydrated.call(void 0, );
1046
1046
  const minimized = hydrated ? isTablet ? tabletMinimized : desktopMinimized : _nullishCoalesce(config.minimized, () => ( false));
1047
1047
  const [transitionsEnabled, setTransitionsEnabled] = _react.useState.call(void 0, false);
1048
1048
  const isOverlayOpen = isTablet && !minimized;
@@ -1224,7 +1224,7 @@ function HeaderGlobalSearch({
1224
1224
  "form",
1225
1225
  {
1226
1226
  onSubmit: handleSubmit,
1227
- ..._chunkZIT4TC5Rcjs.HUBSPOT_DO_NOT_COLLECT_FORM_PROPS,
1227
+ ..._chunkPUE4XMZKcjs.HUBSPOT_DO_NOT_COLLECT_FORM_PROPS,
1228
1228
  className: _chunkX7CEWD6Vcjs.cn.call(void 0,
1229
1229
  "flex h-full flex-1 items-center gap-2 px-3",
1230
1230
  // Transparent so the cell inherits the bar's background
@@ -1411,7 +1411,7 @@ var AppHeader = _react2.default.memo(function AppHeaderImpl({
1411
1411
  leading: (
1412
1412
  // Mobile: Burger Menu Button
1413
1413
  !isMdUp && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1414
- _chunkZIT4TC5Rcjs.HeaderButton,
1414
+ _chunkPUE4XMZKcjs.HeaderButton,
1415
1415
  {
1416
1416
  onClick: onToggleMobileMenu,
1417
1417
  isActive: isMobileMenuOpen,
@@ -1437,7 +1437,7 @@ var AppHeader = _react2.default.memo(function AppHeaderImpl({
1437
1437
  center: showSearch ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, HeaderGlobalSearch, { onSubmit: onSearch, className: _chunkX7CEWD6Vcjs.cn.call(void 0, "w-full", dimmedClass) }) : void 0,
1438
1438
  sideActions: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
1439
1439
  showSearch && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1440
- _chunkZIT4TC5Rcjs.HeaderButton,
1440
+ _chunkPUE4XMZKcjs.HeaderButton,
1441
1441
  {
1442
1442
  icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkWZW7C7TFcjs.SearchIcon, { className: "h-6 w-6" }),
1443
1443
  "aria-label": "Search",
@@ -1454,7 +1454,7 @@ var AppHeader = _react2.default.memo(function AppHeaderImpl({
1454
1454
  className: _chunkX7CEWD6Vcjs.cn.call(void 0, "hidden lg:flex", dimmedClass)
1455
1455
  }
1456
1456
  ),
1457
- showTimeTracker && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZIT4TC5Rcjs.TimeTrackerHeaderButton, { disabled, className: _chunkX7CEWD6Vcjs.cn.call(void 0, cellDivider, dimmedClass) }),
1457
+ showTimeTracker && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkPUE4XMZKcjs.TimeTrackerHeaderButton, { disabled, className: _chunkX7CEWD6Vcjs.cn.call(void 0, cellDivider, dimmedClass) }),
1458
1458
  showNotifications && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1459
1459
  NotificationsHeaderButton,
1460
1460
  {
@@ -1474,7 +1474,7 @@ var AppHeader = _react2.default.memo(function AppHeaderImpl({
1474
1474
  ),
1475
1475
  isMdUp && showUser && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkGSD62VAYcjs.DropdownMenu, { children: [
1476
1476
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkGSD62VAYcjs.DropdownMenuTrigger, { asChild: true, disabled, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1477
- _chunkZIT4TC5Rcjs.HeaderButton,
1477
+ _chunkPUE4XMZKcjs.HeaderButton,
1478
1478
  {
1479
1479
  icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1480
1480
  _chunkODB2AEUWcjs.SquareAvatar,
@@ -1558,12 +1558,12 @@ var AppHeader = _react2.default.memo(function AppHeaderImpl({
1558
1558
  );
1559
1559
  });
1560
1560
  function NotificationsHeaderButton({ fallbackUnreadCount, disabled, dimmedClass }) {
1561
- const ctx = _chunkZIT4TC5Rcjs.useOptionalNotifications.call(void 0, );
1561
+ const ctx = _chunkPUE4XMZKcjs.useOptionalNotifications.call(void 0, );
1562
1562
  const hasUnread = (_nullishCoalesce(_optionalChain([ctx, 'optionalAccess', _94 => _94.unreadCount]), () => ( fallbackUnreadCount))) > 0;
1563
1563
  const isActive = _nullishCoalesce(_optionalChain([ctx, 'optionalAccess', _95 => _95.isOpen]), () => ( false));
1564
1564
  const onClick = _optionalChain([ctx, 'optionalAccess', _96 => _96.toggle]);
1565
1565
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1566
- _chunkZIT4TC5Rcjs.HeaderButton,
1566
+ _chunkPUE4XMZKcjs.HeaderButton,
1567
1567
  {
1568
1568
  icon: isActive ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkYRTMAXLEcjs.XmarkIcon, { className: "h-6 w-6" }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkYRTMAXLEcjs.BellIcon, { className: "h-6 w-6" }),
1569
1569
  showUnreadDot: !isActive && hasUnread,
@@ -1702,7 +1702,7 @@ var MobileBurgerMenu = _react2.default.memo(function MobileBurgerMenuImpl({
1702
1702
  {
1703
1703
  className: _chunkX7CEWD6Vcjs.cn.call(void 0,
1704
1704
  "absolute inset-0 z-[100] md:hidden",
1705
- _chunkGXHZCGVJcjs.OVERLAY_BACKDROP_CLASS,
1705
+ _chunkLSVQNRX4cjs.OVERLAY_BACKDROP_CLASS,
1706
1706
  "transition-all duration-300 motion-reduce:transition-none",
1707
1707
  isOpen ? "opacity-100" : "pointer-events-none opacity-0"
1708
1708
  ),
@@ -1837,7 +1837,7 @@ function AppLayout({
1837
1837
  }),
1838
1838
  []
1839
1839
  );
1840
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZIT4TC5Rcjs.AppLayoutDrawerContainerContext.Provider, { value: drawerContainer, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZIT4TC5Rcjs.AppLayoutDrawerCoordinationContext.Provider, { value: drawerCoordination, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunkX7CEWD6Vcjs.cn.call(void 0, "flex h-screen flex-col bg-ods-bg", className), children: [
1840
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkPUE4XMZKcjs.AppLayoutDrawerContainerContext.Provider, { value: drawerContainer, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkPUE4XMZKcjs.AppLayoutDrawerCoordinationContext.Provider, { value: drawerCoordination, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunkX7CEWD6Vcjs.cn.call(void 0, "flex h-screen flex-col bg-ods-bg", className), children: [
1841
1841
  topBar,
1842
1842
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "relative flex min-h-0 flex-1", children: [
1843
1843
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, NavigationSidebar, { config: sidebarConfig, disabled }),
@@ -1861,7 +1861,7 @@ function AppLayout({
1861
1861
  disabled
1862
1862
  }
1863
1863
  ),
1864
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZIT4TC5Rcjs.NotificationDrawer, {}),
1864
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkPUE4XMZKcjs.NotificationDrawer, {}),
1865
1865
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { ref: setDrawerContainer, className: "relative flex flex-1 flex-col overflow-hidden", children: [
1866
1866
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "main", { className: _chunkX7CEWD6Vcjs.cn.call(void 0, "flex-1 overflow-y-auto", mainClassName), children }),
1867
1867
  drawer
@@ -1890,4 +1890,4 @@ function AppLayout({
1890
1890
 
1891
1891
 
1892
1892
  exports.MingoAiButton = MingoAiButton; exports.MOBILE_NAV_PANEL_ID = MOBILE_NAV_PANEL_ID; exports.MobileNavPanel = MobileNavPanel; exports.TicketAlertsButton = TicketAlertsButton; exports.TopNavigation = TopNavigation; exports.Header = Header; exports.HeaderSkeleton = HeaderSkeleton; exports.ClientOnlyHeader = ClientOnlyHeader; exports.SlidingSidebar = SlidingSidebar; exports.NAVIGATION_SIDEBAR_WIDTH_VAR = NAVIGATION_SIDEBAR_WIDTH_VAR; exports.NavigationSidebar = NavigationSidebar; exports.HeaderGlobalSearch = HeaderGlobalSearch; exports.HeaderMingoButton = HeaderMingoButton; exports.HeaderOrganizationFilter = HeaderOrganizationFilter; exports.AppHeader = AppHeader; exports.MobileBurgerMenu = MobileBurgerMenu; exports.AppLayout = AppLayout;
1893
- //# sourceMappingURL=chunk-YNW3DQFY.cjs.map
1893
+ //# sourceMappingURL=chunk-VJMPYY5O.cjs.map