@flamingo-stack/openframe-frontend-core 0.0.596-2034.5684.1 → 0.0.596-2034.5686.1

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 (132) hide show
  1. package/dist/__tests__/fixtures/meeting-booking.d.ts +21 -0
  2. package/dist/__tests__/fixtures/meeting-booking.d.ts.map +1 -1
  3. package/dist/{chunk-NE3SHUIJ.cjs → chunk-25LZZY6E.cjs} +3 -3
  4. package/dist/{chunk-NE3SHUIJ.cjs.map → chunk-25LZZY6E.cjs.map} +1 -1
  5. package/dist/{chunk-CBR4H6JJ.cjs → chunk-3IT35YDV.cjs} +53 -53
  6. package/dist/{chunk-CBR4H6JJ.cjs.map → chunk-3IT35YDV.cjs.map} +1 -1
  7. package/dist/{chunk-WTK5YZYU.js → chunk-A6YERC4N.js} +2 -2
  8. package/dist/{chunk-XNZMKCA4.js → chunk-AGKFT4FA.js} +5 -5
  9. package/dist/{chunk-QAJXIOK2.js → chunk-AYMBMVOD.js} +2 -2
  10. package/dist/{chunk-7XHONLYQ.js → chunk-BLYQD3PG.js} +2 -2
  11. package/dist/{chunk-WDOERQZK.cjs → chunk-D3Q3VYRU.cjs} +16 -16
  12. package/dist/{chunk-WDOERQZK.cjs.map → chunk-D3Q3VYRU.cjs.map} +1 -1
  13. package/dist/{chunk-DD64DQHM.cjs → chunk-E4YWJY3A.cjs} +4 -4
  14. package/dist/{chunk-DD64DQHM.cjs.map → chunk-E4YWJY3A.cjs.map} +1 -1
  15. package/dist/{chunk-E7FDTOJ6.js → chunk-FGHJ3BC7.js} +3 -3
  16. package/dist/{chunk-E6NN7MAN.js → chunk-FIQIT6HX.js} +2 -2
  17. package/dist/{chunk-J2OCCRFC.js → chunk-GZ76RASF.js} +4 -4
  18. package/dist/{chunk-BC73KAXX.cjs → chunk-HPUD7X67.cjs} +4 -4
  19. package/dist/{chunk-BC73KAXX.cjs.map → chunk-HPUD7X67.cjs.map} +1 -1
  20. package/dist/{chunk-B3446RB6.cjs → chunk-IDDGXYES.cjs} +17 -17
  21. package/dist/{chunk-B3446RB6.cjs.map → chunk-IDDGXYES.cjs.map} +1 -1
  22. package/dist/{chunk-ESHCKTES.js → chunk-J5EA7PMY.js} +4 -4
  23. package/dist/{chunk-3PUXHFC4.js → chunk-JVYNMMNE.js} +3 -3
  24. package/dist/{chunk-QT6Q6SUK.js → chunk-KOLVBEW5.js} +1 -1
  25. package/dist/{chunk-QT6Q6SUK.js.map → chunk-KOLVBEW5.js.map} +1 -1
  26. package/dist/{chunk-NBJELHZE.cjs → chunk-MN4TFBRA.cjs} +3 -3
  27. package/dist/{chunk-NBJELHZE.cjs.map → chunk-MN4TFBRA.cjs.map} +1 -1
  28. package/dist/{chunk-C2UBAAGD.cjs → chunk-N6HNK25A.cjs} +1 -1
  29. package/dist/{chunk-C2UBAAGD.cjs.map → chunk-N6HNK25A.cjs.map} +1 -1
  30. package/dist/{chunk-NTJGRZ7G.cjs → chunk-OI7RNQAS.cjs} +33 -33
  31. package/dist/{chunk-NTJGRZ7G.cjs.map → chunk-OI7RNQAS.cjs.map} +1 -1
  32. package/dist/{chunk-OKCGXXEK.js → chunk-PO4ATWE4.js} +2 -2
  33. package/dist/{chunk-X6TLDYMG.js → chunk-QNZM43HU.js} +3 -3
  34. package/dist/{chunk-6RISTRR3.cjs → chunk-QVOGALQE.cjs} +3 -3
  35. package/dist/{chunk-6RISTRR3.cjs.map → chunk-QVOGALQE.cjs.map} +1 -1
  36. package/dist/{chunk-IJ4SGRAN.js → chunk-S7LV66HD.js} +6 -6
  37. package/dist/{chunk-6X63WX5D.cjs → chunk-SLIUM3VO.cjs} +34 -34
  38. package/dist/{chunk-6X63WX5D.cjs.map → chunk-SLIUM3VO.cjs.map} +1 -1
  39. package/dist/{chunk-XTZECFMT.cjs → chunk-TDLETTI4.cjs} +10 -10
  40. package/dist/{chunk-XTZECFMT.cjs.map → chunk-TDLETTI4.cjs.map} +1 -1
  41. package/dist/{chunk-S2WP7ELW.js → chunk-TYURDSIN.js} +34 -32
  42. package/dist/chunk-TYURDSIN.js.map +1 -0
  43. package/dist/{chunk-DR4WXTKP.cjs → chunk-TZK5N6AH.cjs} +83 -81
  44. package/dist/chunk-TZK5N6AH.cjs.map +1 -0
  45. package/dist/{chunk-EM3T7YXE.js → chunk-Y6JB7X5Y.js} +2 -2
  46. package/dist/{chunk-HCHTKE6I.cjs → chunk-YP56SX7C.cjs} +3 -3
  47. package/dist/{chunk-HCHTKE6I.cjs.map → chunk-YP56SX7C.cjs.map} +1 -1
  48. package/dist/{chunk-UG43WQ2C.cjs → chunk-YQYOEGAT.cjs} +23 -23
  49. package/dist/{chunk-UG43WQ2C.cjs.map → chunk-YQYOEGAT.cjs.map} +1 -1
  50. package/dist/{chunk-YZALGXOM.js → chunk-ZVBYWM5Z.js} +2 -2
  51. package/dist/{chunk-ANGSMT5Q.cjs → chunk-ZXEYS2XP.cjs} +17 -17
  52. package/dist/{chunk-ANGSMT5Q.cjs.map → chunk-ZXEYS2XP.cjs.map} +1 -1
  53. package/dist/components/case-studies/index.cjs +9 -9
  54. package/dist/components/case-studies/index.js +3 -3
  55. package/dist/components/contact/index.cjs +4 -4
  56. package/dist/components/contact/index.js +3 -3
  57. package/dist/components/docs/index.cjs +7 -7
  58. package/dist/components/docs/index.js +6 -6
  59. package/dist/components/embeds/index.cjs +4 -4
  60. package/dist/components/embeds/index.js +3 -3
  61. package/dist/components/faq/index.cjs +4 -4
  62. package/dist/components/faq/index.js +3 -3
  63. package/dist/components/features/index.cjs +3 -3
  64. package/dist/components/features/index.js +2 -2
  65. package/dist/components/help-center-pages/index.cjs +23 -23
  66. package/dist/components/help-center-pages/index.js +14 -14
  67. package/dist/components/index.cjs +35 -33
  68. package/dist/components/index.cjs.map +1 -1
  69. package/dist/components/index.js +15 -13
  70. package/dist/components/index.js.map +1 -1
  71. package/dist/components/meeting-scheduler/booking-form.d.ts +15 -3
  72. package/dist/components/meeting-scheduler/booking-form.d.ts.map +1 -1
  73. package/dist/components/meeting-scheduler/index.cjs +81 -89
  74. package/dist/components/meeting-scheduler/index.cjs.map +1 -1
  75. package/dist/components/meeting-scheduler/index.d.ts +2 -0
  76. package/dist/components/meeting-scheduler/index.d.ts.map +1 -1
  77. package/dist/components/meeting-scheduler/index.js +56 -64
  78. package/dist/components/meeting-scheduler/index.js.map +1 -1
  79. package/dist/components/navigation/index.cjs +6 -6
  80. package/dist/components/navigation/index.js +5 -5
  81. package/dist/components/onboarding-guides/index.cjs +6 -6
  82. package/dist/components/onboarding-guides/index.js +5 -5
  83. package/dist/components/tickets/index.cjs +7 -7
  84. package/dist/components/tickets/index.js +6 -6
  85. package/dist/components/ui/benefit-card.d.ts +7 -0
  86. package/dist/components/ui/benefit-card.d.ts.map +1 -1
  87. package/dist/components/ui/field-wrapper.d.ts +4 -4
  88. package/dist/components/ui/file-manager/index.cjs +4 -4
  89. package/dist/components/ui/file-manager/index.js +1 -1
  90. package/dist/components/ui/index.cjs +5 -3
  91. package/dist/components/ui/index.cjs.map +1 -1
  92. package/dist/components/ui/index.js +4 -2
  93. package/dist/index.cjs +9 -7
  94. package/dist/index.cjs.map +1 -1
  95. package/dist/index.js +8 -6
  96. package/dist/index.js.map +1 -1
  97. package/dist/schemas/meeting-booking-schema.cjs.map +1 -1
  98. package/dist/schemas/meeting-booking-schema.d.ts.map +1 -1
  99. package/dist/schemas/meeting-booking-schema.js.map +1 -1
  100. package/dist/utils/hubspot-meetings-convention.d.ts +1 -1
  101. package/dist/utils/hubspot-meetings-convention.d.ts.map +1 -1
  102. package/dist/utils/index.cjs.map +1 -1
  103. package/dist/utils/index.js.map +1 -1
  104. package/package.json +1 -1
  105. package/src/__tests__/benefit-card-border.test.ts +29 -0
  106. package/src/__tests__/booking-form-field-rows.test.tsx +9 -47
  107. package/src/__tests__/booking-form-number-field.test.tsx +14 -44
  108. package/src/__tests__/fixtures/meeting-booking.tsx +61 -0
  109. package/src/__tests__/meeting-scheduler-details-first.test.tsx +3 -6
  110. package/src/components/meeting-scheduler/booking-form.tsx +96 -70
  111. package/src/components/meeting-scheduler/index.tsx +24 -14
  112. package/src/components/ui/benefit-card.tsx +45 -39
  113. package/src/components/ui/field-wrapper.tsx +4 -4
  114. package/src/schemas/meeting-booking-schema.ts +1 -0
  115. package/src/utils/hubspot-meetings-convention.ts +1 -1
  116. package/dist/chunk-DR4WXTKP.cjs.map +0 -1
  117. package/dist/chunk-S2WP7ELW.js.map +0 -1
  118. package/src/__tests__/fixtures/meeting-booking.ts +0 -27
  119. /package/dist/{chunk-WTK5YZYU.js.map → chunk-A6YERC4N.js.map} +0 -0
  120. /package/dist/{chunk-XNZMKCA4.js.map → chunk-AGKFT4FA.js.map} +0 -0
  121. /package/dist/{chunk-QAJXIOK2.js.map → chunk-AYMBMVOD.js.map} +0 -0
  122. /package/dist/{chunk-7XHONLYQ.js.map → chunk-BLYQD3PG.js.map} +0 -0
  123. /package/dist/{chunk-E7FDTOJ6.js.map → chunk-FGHJ3BC7.js.map} +0 -0
  124. /package/dist/{chunk-E6NN7MAN.js.map → chunk-FIQIT6HX.js.map} +0 -0
  125. /package/dist/{chunk-J2OCCRFC.js.map → chunk-GZ76RASF.js.map} +0 -0
  126. /package/dist/{chunk-ESHCKTES.js.map → chunk-J5EA7PMY.js.map} +0 -0
  127. /package/dist/{chunk-3PUXHFC4.js.map → chunk-JVYNMMNE.js.map} +0 -0
  128. /package/dist/{chunk-OKCGXXEK.js.map → chunk-PO4ATWE4.js.map} +0 -0
  129. /package/dist/{chunk-X6TLDYMG.js.map → chunk-QNZM43HU.js.map} +0 -0
  130. /package/dist/{chunk-IJ4SGRAN.js.map → chunk-S7LV66HD.js.map} +0 -0
  131. /package/dist/{chunk-EM3T7YXE.js.map → chunk-Y6JB7X5Y.js.map} +0 -0
  132. /package/dist/{chunk-YZALGXOM.js.map → chunk-ZVBYWM5Z.js.map} +0 -0
@@ -1,3 +1,4 @@
1
+ import { type BookingFormProps } from '../../components/meeting-scheduler/booking-form';
1
2
  import type { MeetingAvailability, MeetingFormField } from '../../schemas/meeting-booking-schema';
2
3
  /** One well-formed slot-first payload minus the questions — the base every
3
4
  * booking-schema test extends, declared once. */
@@ -12,4 +13,24 @@ export declare const BOOKING_BASE: {
12
13
  };
13
14
  /** A minimal availability payload carrying exactly the given questions. */
14
15
  export declare function availabilityWith(formFields: MeetingFormField[]): MeetingAvailability;
16
+ /** Everything a `BookingForm` mount needs besides the availability and the
17
+ * submit handler. A function: the honeypot ref must be fresh per mount. */
18
+ export declare const bookingFormBaseProps: () => {
19
+ meetingId: string;
20
+ startTimeMs: number;
21
+ durationMs: number;
22
+ timezone: string;
23
+ isSubmitting: boolean;
24
+ honeypotInputProps: {
25
+ ref: import("react").RefObject<HTMLInputElement | null>;
26
+ name: string;
27
+ };
28
+ getSignals: () => {};
29
+ };
30
+ export declare const typeInto: (el: HTMLElement, value: string) => boolean;
31
+ /** The identity trio every submit needs. */
32
+ export declare const fillIdentity: () => void;
33
+ export type BookingFormSubmit = (payload: Record<string, unknown>) => Promise<void>;
34
+ /** Mount a `BookingForm` over `availability` with the base props; returns the submit spy. */
35
+ export declare function mountBookingForm(availability: MeetingAvailability, props?: Partial<BookingFormProps>): import("vitest").Mock<BookingFormSubmit>;
15
36
  //# sourceMappingURL=meeting-booking.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"meeting-booking.d.ts","sourceRoot":"","sources":["../../../src/__tests__/fixtures/meeting-booking.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAElG;kDACkD;AAClD,eAAO,MAAM,YAAY;;;;;;;;CAQxB,CAAC;AAEF,2EAA2E;AAC3E,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,gBAAgB,EAAE,GAAG,mBAAmB,CAWpF"}
1
+ {"version":3,"file":"meeting-booking.d.ts","sourceRoot":"","sources":["../../../src/__tests__/fixtures/meeting-booking.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAe,KAAK,gBAAgB,EAAE,MAAM,iDAAiD,CAAC;AACrG,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAElG;kDACkD;AAClD,eAAO,MAAM,YAAY;;;;;;;;CAQxB,CAAC;AAEF,2EAA2E;AAC3E,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,gBAAgB,EAAE,GAAG,mBAAmB,CAWpF;AAED;4EAC4E;AAC5E,eAAO,MAAM,oBAAoB;;;;;;;;;;;CAQ/B,CAAC;AAEH,eAAO,MAAM,QAAQ,GAAI,IAAI,WAAW,EAAE,OAAO,MAAM,YAA+C,CAAC;AAEvG,4CAA4C;AAC5C,eAAO,MAAM,YAAY,YAIxB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEpF,6FAA6F;AAC7F,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,mBAAmB,EAAE,KAAK,GAAE,OAAO,CAAC,gBAAgB,CAAM,4CAIxG"}
@@ -1,7 +1,7 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); 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 _chunkDR4WXTKPcjs = require('./chunk-DR4WXTKP.cjs');
4
+ var _chunkTZK5N6AHcjs = require('./chunk-TZK5N6AH.cjs');
5
5
 
6
6
 
7
7
 
@@ -55,7 +55,7 @@ function DetailPageSkeleton({
55
55
  ] }, section))
56
56
  ] });
57
57
  if (bare) return content;
58
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkDR4WXTKPcjs.PageLayout, { showHeader: false, className: "mx-auto max-w-[1280px] bg-ods-bg px-6 py-6 md:px-20 md:py-10", children: content });
58
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkTZK5N6AHcjs.PageLayout, { showHeader: false, className: "mx-auto max-w-[1280px] bg-ods-bg px-6 py-6 md:px-20 md:py-10", children: content });
59
59
  }
60
60
 
61
61
  // src/components/shared/article-author-byline.tsx
@@ -143,4 +143,4 @@ function ArticleAuthorByline({
143
143
 
144
144
 
145
145
  exports.DetailPageSkeleton = DetailPageSkeleton; exports.ArticleAuthorByline = ArticleAuthorByline;
146
- //# sourceMappingURL=chunk-NE3SHUIJ.cjs.map
146
+ //# sourceMappingURL=chunk-25LZZY6E.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-NE3SHUIJ.cjs","../src/components/shared/detail-page-skeleton.tsx","../src/components/shared/article-author-byline.tsx"],"names":["jsxs","jsx"],"mappings":"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","file":"/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-NE3SHUIJ.cjs","sourcesContent":[null,"'use client';\n\nimport { PageLayout } from '../layout/page-layout';\n\nexport interface DetailPageSkeletonProps {\n metadataColumns?: number; // Number of metadata grid columns (default 4)\n showImageGallery?: boolean; // Show horizontal image gallery (default true)\n /** Render only the skeleton blocks, WITHOUT the self-contained page wrapper\n * — the caller supplies its own (e.g. `<PageShell>`) so the loading state\n * matches the loaded page's width, padding, and min-height. Default false\n * (self-contained `<PageLayout>` at the hub article width). */\n bare?: boolean;\n}\n\nexport function DetailPageSkeleton({\n metadataColumns = 4,\n showImageGallery = true,\n bare = false,\n}: DetailPageSkeletonProps = {}) {\n const content = (\n <div className=\"animate-pulse space-y-6 md:space-y-10\">\n {/* Title Block */}\n <div className=\"flex w-full flex-col gap-6\">\n <div className=\"h-16 w-full max-w-3xl rounded bg-ods-card md:h-20\"></div>\n </div>\n\n {/* Category Tags Skeleton */}\n <div className=\"flex w-full flex-wrap gap-2\">\n <div className=\"h-8 w-32 rounded bg-ods-card\"></div>\n <div className=\"h-8 w-28 rounded bg-ods-card\"></div>\n <div className=\"h-8 w-36 rounded bg-ods-card\"></div>\n </div>\n\n {/* Metadata Grid Skeleton */}\n <div\n className={`grid grid-cols-1 md:grid-cols-${metadataColumns} w-full overflow-hidden rounded-md border border-ods-border`}\n >\n {Array.from({ length: metadataColumns }).map((_, i) => (\n <div key={i} className=\"border-b border-ods-border bg-ods-card p-4 last:border-r-0 md:border-b-0 md:border-r\">\n <div className=\"mb-2 h-6 w-24 rounded bg-ods-border\"></div>\n <div className=\"h-5 w-20 rounded bg-ods-border\"></div>\n </div>\n ))}\n </div>\n\n {/* Image Gallery Skeleton */}\n {showImageGallery && (\n <div className=\"flex w-full gap-6 overflow-x-auto\">\n {[1, 2, 3, 4, 5].map(i => (\n <div key={i} className=\"h-[200px] w-[240px] shrink-0 rounded-md border border-ods-border bg-ods-card\"></div>\n ))}\n </div>\n )}\n\n {/* Featured Image Skeleton (for case studies) */}\n {!showImageGallery && <div className=\"aspect-[2560/1366] w-full rounded-md bg-ods-card\"></div>}\n\n {/* Content Sections Skeleton */}\n {[1, 2, 3].map(section => (\n <div key={section} className=\"space-y-6\">\n <div className=\"h-16 w-64 rounded bg-ods-card\"></div>\n <div className=\"space-y-3\">\n <div className=\"h-6 w-full rounded bg-ods-card\"></div>\n <div className=\"h-6 w-full rounded bg-ods-card\"></div>\n <div className=\"h-6 w-4/5 rounded bg-ods-card\"></div>\n </div>\n </div>\n ))}\n </div>\n );\n if (bare) return content;\n return (\n <PageLayout showHeader={false} className=\"mx-auto max-w-[1280px] bg-ods-bg px-6 py-6 md:px-20 md:py-10\">\n {content}\n </PageLayout>\n );\n}\n","'use client';\n\n/**\n * Shared \"author byline\" card used by article-shaped detail pages\n * (blog post, product release, onboarding guide, investor update).\n *\n * MOVED from the hub so any consuming app can embed it; hub call sites\n * import it directly and pass their platform-aware copy explicitly\n * (`fallbackBio={defaultAuthorFallbackBio()}` from the hub's app-config).\n *\n * Embed-readiness contract:\n * - `Link` / `Image` render through the embed-shims (plain `<a>` / `<img>`\n * in non-Next hosts; the real Next primitives once the host registers\n * them at app init).\n * - The avatar is proxied through the OPTIONAL ambient `ChatRuntime`\n * (`endpoints.imageProxyUrlPrefix`, same config `useProxiedImageUrl`\n * reads) — when no runtime is mounted the raw URL renders as-is, so the\n * component never throws outside a provider. Hosts can also inject\n * `proxyImageUrl` to bypass the runtime entirely.\n * - `fallbackBio` is a PLAIN prop (no app-config import): the lib has no\n * platform awareness; pass copy or leave it absent to render nothing.\n *\n * Render order: avatar → name + job title + date → bio (when present).\n * Returns null when `author` is empty (no card rendered).\n */\n\nimport { Calendar, User } from 'lucide-react';\nimport { useChatRuntime } from '../../contexts/chat-runtime-context';\nimport Image from '../../embed-shims/next-image';\nimport Link from '../../embed-shims/next-link';\nimport { cn } from '../../utils/cn';\nimport { formatBioText } from '../../utils/format';\nimport { getProxiedImageUrl } from '../../utils/image-proxy';\n\nexport interface ArticleAuthorBylineProps {\n /** Author display name. Required — block is hidden when null/empty. */\n author: string | null;\n /** Avatar URL. Falls back to a placeholder when null. */\n avatar?: string | null;\n /** Optional bio paragraph rendered below the name. */\n bio?: string | null;\n /** Optional job title rendered immediately under the name. */\n jobTitle?: string | null;\n /** Optional published date (ISO string or Date). Rendered next to the name. */\n publishedAt?: string | Date | null;\n /** Optional link target for the author name (e.g. the author page). */\n href?: string | null;\n /**\n * Fallback paragraph when `bio` is empty. Plain copy — the lib has no\n * platform/config awareness, so hosts that want a branded default\n * (\"Contributing author on the {platform} platform\") pass it explicitly\n * (the hub wrapper derives it from `getAppConfig()`). Absent/null ⇒\n * nothing renders below the name when `bio` is empty.\n */\n fallbackBio?: string | null;\n /** Avatar size variant. `md` = 56px (default), `lg` = 64px. */\n size?: 'md' | 'lg';\n /**\n * Host-injected avatar-URL mapper. Wins over the ambient-runtime proxy\n * resolution. Use when the host proxies images outside the `ChatRuntime`\n * config (e.g. a bespoke CDN rewrite).\n */\n proxyImageUrl?: (url: string) => string;\n className?: string;\n}\n\nfunction formatDate(value: string | Date): string {\n const d = typeof value === 'string' ? new Date(value) : value;\n if (Number.isNaN(d.getTime())) return '';\n // `timeZone: 'UTC'` keeps the SSR (server = UTC) and client (user's local tz)\n // renders identical — without it a published_at near a midnight boundary\n // formats to a different day on each side, triggering a React #418 hydration\n // text mismatch. Matches the convention in blog-metadata.tsx / investor-update.\n return d.toLocaleDateString('en-US', {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n timeZone: 'UTC',\n });\n}\n\nexport function ArticleAuthorByline({\n author,\n avatar,\n bio,\n jobTitle,\n publishedAt,\n href,\n fallbackBio,\n size = 'md',\n proxyImageUrl,\n className,\n}: ArticleAuthorBylineProps) {\n // Optional runtime — `useChatRuntime` returns null outside a provider, so\n // the byline works in bare embeds (raw avatar URL) and proxies whenever the\n // host mounted a runtime with `imageProxyUrlPrefix` (the hub always does).\n const runtime = useChatRuntime();\n if (!author) return null;\n\n const proxiedAvatar = avatar\n ? proxyImageUrl\n ? proxyImageUrl(avatar)\n : (getProxiedImageUrl(avatar, {\n proxyPrefix: runtime?.endpoints.imageProxyUrlPrefix,\n skipDomains: runtime?.endpoints.imageProxySkipDomains,\n directHttps: true,\n }) ?? avatar)\n : '';\n\n // Class-driven sizing (md = 56px, lg = 64px). The numeric pair feeds only\n // the Image element's intrinsic width/height attributes (required by the\n // Next image shim) — layout comes from the classes.\n const avatarSizeClass = size === 'lg' ? 'w-16 h-16' : 'w-14 h-14';\n const avatarIconClass = size === 'lg' ? 'w-8 h-8' : 'w-7 h-7';\n const avatarDim = size === 'lg' ? 64 : 56;\n const formattedBio = formatBioText(bio ?? null);\n const dateLabel = publishedAt ? formatDate(publishedAt) : '';\n\n return (\n <div\n className={cn(\n 'rounded-lg border border-ods-border bg-ods-card p-6',\n 'flex flex-col items-start gap-4 md:flex-row',\n className,\n )}\n >\n {/* Avatar */}\n <div className=\"flex-shrink-0\">\n {avatar ? (\n <Image\n src={proxiedAvatar || avatar}\n alt={author}\n width={avatarDim}\n height={avatarDim}\n className={cn('rounded-full border-2 border-ods-border object-cover', avatarSizeClass)}\n />\n ) : (\n <div\n className={cn(\n 'flex items-center justify-center rounded-full border-2 border-ods-border bg-ods-bg',\n avatarSizeClass,\n )}\n >\n <User className={cn('text-ods-text-secondary', avatarIconClass)} />\n </div>\n )}\n </div>\n\n {/* Name + meta + bio */}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-baseline gap-x-3 gap-y-1\">\n <h3 className=\"text-ods-text-primary text-h5\">\n {href ? (\n <Link href={href} className=\"transition-colors hover:text-ods-accent\">\n {author}\n </Link>\n ) : (\n author\n )}\n </h3>\n {dateLabel && (\n <span className=\"text-body-sm inline-flex items-center gap-1 font-body text-ods-text-secondary\">\n <Calendar className=\"h-3 w-3\" />\n {dateLabel}\n </span>\n )}\n </div>\n {jobTitle && <p className=\"text-body-sm mt-0.5 font-body text-ods-text-secondary\">{jobTitle}</p>}\n {formattedBio ? (\n <p className=\"text-body-md mt-2 font-body leading-relaxed text-ods-text-secondary\">{formattedBio}</p>\n ) : fallbackBio ? (\n <p className=\"text-body-md mt-2 font-body italic text-ods-text-secondary\">{fallbackBio}</p>\n ) : null}\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-25LZZY6E.cjs","../src/components/shared/detail-page-skeleton.tsx","../src/components/shared/article-author-byline.tsx"],"names":["jsxs","jsx"],"mappings":"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","file":"/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-25LZZY6E.cjs","sourcesContent":[null,"'use client';\n\nimport { PageLayout } from '../layout/page-layout';\n\nexport interface DetailPageSkeletonProps {\n metadataColumns?: number; // Number of metadata grid columns (default 4)\n showImageGallery?: boolean; // Show horizontal image gallery (default true)\n /** Render only the skeleton blocks, WITHOUT the self-contained page wrapper\n * — the caller supplies its own (e.g. `<PageShell>`) so the loading state\n * matches the loaded page's width, padding, and min-height. Default false\n * (self-contained `<PageLayout>` at the hub article width). */\n bare?: boolean;\n}\n\nexport function DetailPageSkeleton({\n metadataColumns = 4,\n showImageGallery = true,\n bare = false,\n}: DetailPageSkeletonProps = {}) {\n const content = (\n <div className=\"animate-pulse space-y-6 md:space-y-10\">\n {/* Title Block */}\n <div className=\"flex w-full flex-col gap-6\">\n <div className=\"h-16 w-full max-w-3xl rounded bg-ods-card md:h-20\"></div>\n </div>\n\n {/* Category Tags Skeleton */}\n <div className=\"flex w-full flex-wrap gap-2\">\n <div className=\"h-8 w-32 rounded bg-ods-card\"></div>\n <div className=\"h-8 w-28 rounded bg-ods-card\"></div>\n <div className=\"h-8 w-36 rounded bg-ods-card\"></div>\n </div>\n\n {/* Metadata Grid Skeleton */}\n <div\n className={`grid grid-cols-1 md:grid-cols-${metadataColumns} w-full overflow-hidden rounded-md border border-ods-border`}\n >\n {Array.from({ length: metadataColumns }).map((_, i) => (\n <div key={i} className=\"border-b border-ods-border bg-ods-card p-4 last:border-r-0 md:border-b-0 md:border-r\">\n <div className=\"mb-2 h-6 w-24 rounded bg-ods-border\"></div>\n <div className=\"h-5 w-20 rounded bg-ods-border\"></div>\n </div>\n ))}\n </div>\n\n {/* Image Gallery Skeleton */}\n {showImageGallery && (\n <div className=\"flex w-full gap-6 overflow-x-auto\">\n {[1, 2, 3, 4, 5].map(i => (\n <div key={i} className=\"h-[200px] w-[240px] shrink-0 rounded-md border border-ods-border bg-ods-card\"></div>\n ))}\n </div>\n )}\n\n {/* Featured Image Skeleton (for case studies) */}\n {!showImageGallery && <div className=\"aspect-[2560/1366] w-full rounded-md bg-ods-card\"></div>}\n\n {/* Content Sections Skeleton */}\n {[1, 2, 3].map(section => (\n <div key={section} className=\"space-y-6\">\n <div className=\"h-16 w-64 rounded bg-ods-card\"></div>\n <div className=\"space-y-3\">\n <div className=\"h-6 w-full rounded bg-ods-card\"></div>\n <div className=\"h-6 w-full rounded bg-ods-card\"></div>\n <div className=\"h-6 w-4/5 rounded bg-ods-card\"></div>\n </div>\n </div>\n ))}\n </div>\n );\n if (bare) return content;\n return (\n <PageLayout showHeader={false} className=\"mx-auto max-w-[1280px] bg-ods-bg px-6 py-6 md:px-20 md:py-10\">\n {content}\n </PageLayout>\n );\n}\n","'use client';\n\n/**\n * Shared \"author byline\" card used by article-shaped detail pages\n * (blog post, product release, onboarding guide, investor update).\n *\n * MOVED from the hub so any consuming app can embed it; hub call sites\n * import it directly and pass their platform-aware copy explicitly\n * (`fallbackBio={defaultAuthorFallbackBio()}` from the hub's app-config).\n *\n * Embed-readiness contract:\n * - `Link` / `Image` render through the embed-shims (plain `<a>` / `<img>`\n * in non-Next hosts; the real Next primitives once the host registers\n * them at app init).\n * - The avatar is proxied through the OPTIONAL ambient `ChatRuntime`\n * (`endpoints.imageProxyUrlPrefix`, same config `useProxiedImageUrl`\n * reads) — when no runtime is mounted the raw URL renders as-is, so the\n * component never throws outside a provider. Hosts can also inject\n * `proxyImageUrl` to bypass the runtime entirely.\n * - `fallbackBio` is a PLAIN prop (no app-config import): the lib has no\n * platform awareness; pass copy or leave it absent to render nothing.\n *\n * Render order: avatar → name + job title + date → bio (when present).\n * Returns null when `author` is empty (no card rendered).\n */\n\nimport { Calendar, User } from 'lucide-react';\nimport { useChatRuntime } from '../../contexts/chat-runtime-context';\nimport Image from '../../embed-shims/next-image';\nimport Link from '../../embed-shims/next-link';\nimport { cn } from '../../utils/cn';\nimport { formatBioText } from '../../utils/format';\nimport { getProxiedImageUrl } from '../../utils/image-proxy';\n\nexport interface ArticleAuthorBylineProps {\n /** Author display name. Required — block is hidden when null/empty. */\n author: string | null;\n /** Avatar URL. Falls back to a placeholder when null. */\n avatar?: string | null;\n /** Optional bio paragraph rendered below the name. */\n bio?: string | null;\n /** Optional job title rendered immediately under the name. */\n jobTitle?: string | null;\n /** Optional published date (ISO string or Date). Rendered next to the name. */\n publishedAt?: string | Date | null;\n /** Optional link target for the author name (e.g. the author page). */\n href?: string | null;\n /**\n * Fallback paragraph when `bio` is empty. Plain copy — the lib has no\n * platform/config awareness, so hosts that want a branded default\n * (\"Contributing author on the {platform} platform\") pass it explicitly\n * (the hub wrapper derives it from `getAppConfig()`). Absent/null ⇒\n * nothing renders below the name when `bio` is empty.\n */\n fallbackBio?: string | null;\n /** Avatar size variant. `md` = 56px (default), `lg` = 64px. */\n size?: 'md' | 'lg';\n /**\n * Host-injected avatar-URL mapper. Wins over the ambient-runtime proxy\n * resolution. Use when the host proxies images outside the `ChatRuntime`\n * config (e.g. a bespoke CDN rewrite).\n */\n proxyImageUrl?: (url: string) => string;\n className?: string;\n}\n\nfunction formatDate(value: string | Date): string {\n const d = typeof value === 'string' ? new Date(value) : value;\n if (Number.isNaN(d.getTime())) return '';\n // `timeZone: 'UTC'` keeps the SSR (server = UTC) and client (user's local tz)\n // renders identical — without it a published_at near a midnight boundary\n // formats to a different day on each side, triggering a React #418 hydration\n // text mismatch. Matches the convention in blog-metadata.tsx / investor-update.\n return d.toLocaleDateString('en-US', {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n timeZone: 'UTC',\n });\n}\n\nexport function ArticleAuthorByline({\n author,\n avatar,\n bio,\n jobTitle,\n publishedAt,\n href,\n fallbackBio,\n size = 'md',\n proxyImageUrl,\n className,\n}: ArticleAuthorBylineProps) {\n // Optional runtime — `useChatRuntime` returns null outside a provider, so\n // the byline works in bare embeds (raw avatar URL) and proxies whenever the\n // host mounted a runtime with `imageProxyUrlPrefix` (the hub always does).\n const runtime = useChatRuntime();\n if (!author) return null;\n\n const proxiedAvatar = avatar\n ? proxyImageUrl\n ? proxyImageUrl(avatar)\n : (getProxiedImageUrl(avatar, {\n proxyPrefix: runtime?.endpoints.imageProxyUrlPrefix,\n skipDomains: runtime?.endpoints.imageProxySkipDomains,\n directHttps: true,\n }) ?? avatar)\n : '';\n\n // Class-driven sizing (md = 56px, lg = 64px). The numeric pair feeds only\n // the Image element's intrinsic width/height attributes (required by the\n // Next image shim) — layout comes from the classes.\n const avatarSizeClass = size === 'lg' ? 'w-16 h-16' : 'w-14 h-14';\n const avatarIconClass = size === 'lg' ? 'w-8 h-8' : 'w-7 h-7';\n const avatarDim = size === 'lg' ? 64 : 56;\n const formattedBio = formatBioText(bio ?? null);\n const dateLabel = publishedAt ? formatDate(publishedAt) : '';\n\n return (\n <div\n className={cn(\n 'rounded-lg border border-ods-border bg-ods-card p-6',\n 'flex flex-col items-start gap-4 md:flex-row',\n className,\n )}\n >\n {/* Avatar */}\n <div className=\"flex-shrink-0\">\n {avatar ? (\n <Image\n src={proxiedAvatar || avatar}\n alt={author}\n width={avatarDim}\n height={avatarDim}\n className={cn('rounded-full border-2 border-ods-border object-cover', avatarSizeClass)}\n />\n ) : (\n <div\n className={cn(\n 'flex items-center justify-center rounded-full border-2 border-ods-border bg-ods-bg',\n avatarSizeClass,\n )}\n >\n <User className={cn('text-ods-text-secondary', avatarIconClass)} />\n </div>\n )}\n </div>\n\n {/* Name + meta + bio */}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-baseline gap-x-3 gap-y-1\">\n <h3 className=\"text-ods-text-primary text-h5\">\n {href ? (\n <Link href={href} className=\"transition-colors hover:text-ods-accent\">\n {author}\n </Link>\n ) : (\n author\n )}\n </h3>\n {dateLabel && (\n <span className=\"text-body-sm inline-flex items-center gap-1 font-body text-ods-text-secondary\">\n <Calendar className=\"h-3 w-3\" />\n {dateLabel}\n </span>\n )}\n </div>\n {jobTitle && <p className=\"text-body-sm mt-0.5 font-body text-ods-text-secondary\">{jobTitle}</p>}\n {formattedBio ? (\n <p className=\"text-body-md mt-2 font-body leading-relaxed text-ods-text-secondary\">{formattedBio}</p>\n ) : fallbackBio ? (\n <p className=\"text-body-md mt-2 font-body italic text-ods-text-secondary\">{fallbackBio}</p>\n ) : null}\n </div>\n </div>\n );\n}\n"]}
@@ -1,13 +1,13 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } 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 _chunkUG43WQ2Ccjs = require('./chunk-UG43WQ2C.cjs');
4
+ var _chunkYQYOEGATcjs = require('./chunk-YQYOEGAT.cjs');
5
5
 
6
6
 
7
7
 
8
8
 
9
9
 
10
- var _chunkXTZECFMTcjs = require('./chunk-XTZECFMT.cjs');
10
+ var _chunkTDLETTI4cjs = require('./chunk-TDLETTI4.cjs');
11
11
 
12
12
 
13
13
 
@@ -18,7 +18,7 @@ var _chunkO4VZOA2Qcjs = require('./chunk-O4VZOA2Q.cjs');
18
18
 
19
19
 
20
20
 
21
- var _chunk6RISTRR3cjs = require('./chunk-6RISTRR3.cjs');
21
+ var _chunkQVOGALQEcjs = require('./chunk-QVOGALQE.cjs');
22
22
 
23
23
 
24
24
 
@@ -33,7 +33,7 @@ var _chunk6RISTRR3cjs = require('./chunk-6RISTRR3.cjs');
33
33
 
34
34
 
35
35
 
36
- var _chunkDR4WXTKPcjs = require('./chunk-DR4WXTKP.cjs');
36
+ var _chunkTZK5N6AHcjs = require('./chunk-TZK5N6AH.cjs');
37
37
 
38
38
 
39
39
 
@@ -46,7 +46,7 @@ var _chunkH64ZHSYRcjs = require('./chunk-H64ZHSYR.cjs');
46
46
 
47
47
 
48
48
 
49
- var _chunkC2UBAAGDcjs = require('./chunk-C2UBAAGD.cjs');
49
+ var _chunkN6HNK25Acjs = require('./chunk-N6HNK25A.cjs');
50
50
 
51
51
 
52
52
 
@@ -113,7 +113,7 @@ var TicketActionFailure = class extends Error {
113
113
  function useTicketActions(options) {
114
114
  const queryClient = _reactquery.useQueryClient.call(void 0, );
115
115
  const ticketActionEndpoint = _nullishCoalesce(_chunkRDTOMWDNcjs.useRequiredChatRuntime.call(void 0, ).endpoints.ticketActionUrl, () => ( TICKET_ACTION_ENDPOINT));
116
- const ticketLive = _chunk6RISTRR3cjs.useOptionalTicketLive.call(void 0, );
116
+ const ticketLive = _chunkQVOGALQEcjs.useOptionalTicketLive.call(void 0, );
117
117
  const notifyTicketCreated = _optionalChain([ticketLive, 'optionalAccess', _2 => _2.notifyTicketCreated]);
118
118
  const { prependOptimistic, removeOptimistic, removeTicketFromCache, toast: toast2, onSupportSystemDown } = options;
119
119
  const formInFlightRef = _react.useRef.call(void 0, null);
@@ -274,10 +274,10 @@ function useTicketActions(options) {
274
274
  ..._optionalChain([input, 'access', _3 => _3.attachments, 'optionalAccess', _4 => _4.length]) ? { attachments: input.attachments } : {}
275
275
  });
276
276
  if (result.mirror_synced === false) {
277
- toast2(_chunk6RISTRR3cjs.TOAST_COPY.open_mirror_pending);
277
+ toast2(_chunkQVOGALQEcjs.TOAST_COPY.open_mirror_pending);
278
278
  watchMirrorSync(placeholderId, result.ticket_id);
279
279
  } else {
280
- toast2(_chunk6RISTRR3cjs.TOAST_COPY.open_success);
280
+ toast2(_chunkQVOGALQEcjs.TOAST_COPY.open_success);
281
281
  await queryClient.invalidateQueries({ queryKey: ["tickets"] });
282
282
  removeOptimistic(placeholderId);
283
283
  }
@@ -363,7 +363,7 @@ function useTicketActions(options) {
363
363
  ...hasText ? { content_addendum: trimmed } : {},
364
364
  ...hasFiles ? { attachments } : {}
365
365
  },
366
- _chunk6RISTRR3cjs.TOAST_COPY.comment_success,
366
+ _chunkQVOGALQEcjs.TOAST_COPY.comment_success,
367
367
  "send message"
368
368
  );
369
369
  if (ok) {
@@ -386,13 +386,13 @@ function useTicketActions(options) {
386
386
  status: "CLOSED",
387
387
  ..._optionalChain([resolution, 'optionalAccess', _6 => _6.trim, 'call', _7 => _7()]) ? { resolution: resolution.trim() } : {}
388
388
  },
389
- _chunk6RISTRR3cjs.TOAST_COPY.close_success,
389
+ _chunkQVOGALQEcjs.TOAST_COPY.close_success,
390
390
  "close ticket"
391
391
  ),
392
392
  [updateTicket]
393
393
  );
394
394
  const reopenTicket = _react.useCallback.call(void 0,
395
- (ticket) => updateTicket(ticket, { status: "OPEN" }, _chunk6RISTRR3cjs.TOAST_COPY.reopen_success, "reopen ticket"),
395
+ (ticket) => updateTicket(ticket, { status: "OPEN" }, _chunkQVOGALQEcjs.TOAST_COPY.reopen_success, "reopen ticket"),
396
396
  [updateTicket]
397
397
  );
398
398
  return _react.useMemo.call(void 0,
@@ -617,14 +617,14 @@ function useTicketsList(filters) {
617
617
  // src/components/tickets/ticket-open-form.tsx
618
618
 
619
619
  var _jsxruntime = require('react/jsx-runtime');
620
- var COUNTER_VISIBLE_AT = Math.floor(_chunk6RISTRR3cjs.TICKET_TEXT_MAX_CHARS * 0.8);
620
+ var COUNTER_VISIBLE_AT = Math.floor(_chunkQVOGALQEcjs.TICKET_TEXT_MAX_CHARS * 0.8);
621
621
  function TicketOpenForm({ onSubmit, isSubmitting, supportSystemDown }) {
622
622
  const [subject, setSubject] = _react.useState.call(void 0, "");
623
623
  const [content, setContent] = _react.useState.call(void 0, "");
624
624
  const { attachments, readyAttachments, hasInflightUploads, addFiles, removeAttachment, clear } = _chunkL7GNBUXFcjs.useChatAttachments.call(void 0, );
625
625
  const trimmedSubject = subject.trim();
626
626
  const trimmedContent = content.trim();
627
- const overCap = content.length > _chunk6RISTRR3cjs.TICKET_TEXT_MAX_CHARS;
627
+ const overCap = content.length > _chunkQVOGALQEcjs.TICKET_TEXT_MAX_CHARS;
628
628
  const showCounter = content.length >= COUNTER_VISIBLE_AT;
629
629
  const canSubmit = !isSubmitting && !supportSystemDown && !hasInflightUploads && trimmedSubject.length > 0 && trimmedContent.length > 0 && !overCap;
630
630
  const handleSubmit = async (e) => {
@@ -651,7 +651,7 @@ function TicketOpenForm({ onSubmit, isSubmitting, supportSystemDown }) {
651
651
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { children: [
652
652
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "label", { htmlFor: "ticket-subject", className: "mb-1 block text-ods-text-primary text-h6", children: "Ticket Subject" }),
653
653
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
654
- _chunkC2UBAAGDcjs.Input,
654
+ _chunkN6HNK25Acjs.Input,
655
655
  {
656
656
  id: "ticket-subject",
657
657
  type: "text",
@@ -666,7 +666,7 @@ function TicketOpenForm({ onSubmit, isSubmitting, supportSystemDown }) {
666
666
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { children: [
667
667
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "label", { htmlFor: "ticket-content", className: "mb-1 block text-ods-text-primary text-h6", children: "Your Message" }),
668
668
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
669
- _chunkDR4WXTKPcjs.Textarea,
669
+ _chunkTZK5N6AHcjs.Textarea,
670
670
  {
671
671
  id: "ticket-content",
672
672
  placeholder: "Describe your issue or question in detail...",
@@ -680,7 +680,7 @@ function TicketOpenForm({ onSubmit, isSubmitting, supportSystemDown }) {
680
680
  showCounter && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "p", { className: `mt-1 text-right text-h6 ${overCap ? "text-ods-error" : "text-ods-text-secondary"}`, children: [
681
681
  content.length,
682
682
  "/",
683
- _chunk6RISTRR3cjs.TICKET_TEXT_MAX_CHARS
683
+ _chunkQVOGALQEcjs.TICKET_TEXT_MAX_CHARS
684
684
  ] })
685
685
  ] }),
686
686
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
@@ -796,7 +796,7 @@ function TicketLinkedDeliveryCard({ clickup, className }) {
796
796
  dateClosed: clickup.date_closed,
797
797
  clickupUrl: _nullishCoalesce(clickup.clickup_url, () => ( ""))
798
798
  };
799
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: `overflow-hidden rounded-md border border-ods-border bg-ods-bg ${_nullishCoalesce(className, () => ( ""))}`, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXTZECFMTcjs.DeliveryRow, { item, href: clickup.delivery_href, caption: "Linked delivery" }) });
799
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: `overflow-hidden rounded-md border border-ods-border bg-ods-bg ${_nullishCoalesce(className, () => ( ""))}`, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkTDLETTI4cjs.DeliveryRow, { item, href: clickup.delivery_href, caption: "Linked delivery" }) });
800
800
  }
801
801
 
802
802
  // src/components/tickets/ticket-reply-composer.tsx
@@ -849,7 +849,7 @@ function TicketReplyComposer({
849
849
  sending: busy || attachments.hasInflightUploads,
850
850
  disabled: supportSystemDown,
851
851
  allowEmptySend: hasReadyFiles,
852
- maxLength: _chunk6RISTRR3cjs.TICKET_TEXT_MAX_CHARS,
852
+ maxLength: _chunkQVOGALQEcjs.TICKET_TEXT_MAX_CHARS,
853
853
  onSend: handleSend
854
854
  }
855
855
  ),
@@ -878,25 +878,25 @@ function TicketReplyComposer({
878
878
  }
879
879
  )
880
880
  ] }),
881
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkDR4WXTKPcjs.AlertDialog, { open: closeDialogOpen, onOpenChange: setCloseDialogOpen, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkDR4WXTKPcjs.AlertDialogContent, { className: "border-ods-border bg-ods-card", children: [
882
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkDR4WXTKPcjs.AlertDialogHeader, { children: [
883
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkDR4WXTKPcjs.AlertDialogTitle, { className: "text-ods-text-primary", children: "Close this ticket?" }),
884
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkDR4WXTKPcjs.AlertDialogDescription, { className: "text-ods-text-secondary", children: "Add an optional resolution note below. You can reopen the ticket later if needed." })
881
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkTZK5N6AHcjs.AlertDialog, { open: closeDialogOpen, onOpenChange: setCloseDialogOpen, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkTZK5N6AHcjs.AlertDialogContent, { className: "border-ods-border bg-ods-card", children: [
882
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkTZK5N6AHcjs.AlertDialogHeader, { children: [
883
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkTZK5N6AHcjs.AlertDialogTitle, { className: "text-ods-text-primary", children: "Close this ticket?" }),
884
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkTZK5N6AHcjs.AlertDialogDescription, { className: "text-ods-text-secondary", children: "Add an optional resolution note below. You can reopen the ticket later if needed." })
885
885
  ] }),
886
886
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
887
- _chunkDR4WXTKPcjs.Textarea,
887
+ _chunkTZK5N6AHcjs.Textarea,
888
888
  {
889
889
  value: resolution,
890
890
  onChange: (e) => setResolution(e.target.value),
891
891
  placeholder: "Resolution (optional)",
892
892
  rows: 3,
893
- maxLength: _chunk6RISTRR3cjs.TICKET_TEXT_MAX_CHARS,
893
+ maxLength: _chunkQVOGALQEcjs.TICKET_TEXT_MAX_CHARS,
894
894
  className: "mt-2"
895
895
  }
896
896
  ),
897
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkDR4WXTKPcjs.AlertDialogFooter, { children: [
897
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkTZK5N6AHcjs.AlertDialogFooter, { children: [
898
898
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
899
- _chunkDR4WXTKPcjs.AlertDialogCancel,
899
+ _chunkTZK5N6AHcjs.AlertDialogCancel,
900
900
  {
901
901
  disabled: busy,
902
902
  className: "border-ods-border bg-transparent text-ods-text-primary hover:bg-ods-border",
@@ -904,7 +904,7 @@ function TicketReplyComposer({
904
904
  }
905
905
  ),
906
906
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
907
- _chunkDR4WXTKPcjs.AlertDialogAction,
907
+ _chunkTZK5N6AHcjs.AlertDialogAction,
908
908
  {
909
909
  onClick: () => void confirmClose(),
910
910
  disabled: busy,
@@ -967,9 +967,9 @@ var TICKET_FEED_INNER = "flex flex-col gap-4 md:gap-6 px-4 md:px-6 py-4 md:py-6"
967
967
  var TICKET_FEED_SKELETON_ROWS = 6;
968
968
  function TicketTimelinePanel({ ticket }) {
969
969
  const identity = _chunkL7GNBUXFcjs.useChatIdentity.call(void 0, );
970
- const externalId = _chunk6RISTRR3cjs.isOptimistic.call(void 0, ticket) ? null : ticket.external_id;
970
+ const externalId = _chunkQVOGALQEcjs.isOptimistic.call(void 0, ticket) ? null : ticket.external_id;
971
971
  const { engagements, isLoading } = useTicketEngagements(externalId, !!externalId);
972
- const live = _chunk6RISTRR3cjs.useOptionalTicketLive.call(void 0, );
972
+ const live = _chunkQVOGALQEcjs.useOptionalTicketLive.call(void 0, );
973
973
  const setOpenTicketId = _optionalChain([live, 'optionalAccess', _25 => _25.setOpenTicketId]);
974
974
  const markRead = _optionalChain([live, 'optionalAccess', _26 => _26.markRead]);
975
975
  const markReadDebounceRef = _react.useRef.call(void 0, null);
@@ -993,7 +993,7 @@ function TicketTimelinePanel({ ticket }) {
993
993
  markReadDebounceRef.current = setTimeout(() => {
994
994
  markReadDebounceRef.current = null;
995
995
  void markRead(externalId);
996
- }, _chunk6RISTRR3cjs.TICKET_MARK_READ_DEBOUNCE_MS);
996
+ }, _chunkQVOGALQEcjs.TICKET_MARK_READ_DEBOUNCE_MS);
997
997
  }, [engagementsCount, externalId, markRead]);
998
998
  const { scrollRef, contentRef } = _usesticktobottom.useStickToBottom.call(void 0, { initial: "instant", resize: "smooth" });
999
999
  const bodyTurns = ticket.body ? ticket.body.split(TURN_SEPARATOR_RE).map((t) => t.trim()).filter(Boolean) : [];
@@ -1062,7 +1062,7 @@ function TicketTimelinePanel({ ticket }) {
1062
1062
  avatarUrl: avatarSrc,
1063
1063
  timeLabel: eng.createdAt ? _chunkL7GNBUXFcjs.formatRelativeTime.call(void 0, eng.createdAt) : null,
1064
1064
  body: stripAttachmentsPreamble(_nullishCoalesce(eng.body, () => ( ""))),
1065
- footer: engAttachments.length > 0 ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "mt-2", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkDR4WXTKPcjs.TicketAttachmentsList, { attachments: engAttachments, size: "compact" }) }) : null
1065
+ footer: engAttachments.length > 0 ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "mt-2", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkTZK5N6AHcjs.TicketAttachmentsList, { attachments: engAttachments, size: "compact" }) }) : null
1066
1066
  },
1067
1067
  eng.id
1068
1068
  );
@@ -1175,7 +1175,7 @@ function TicketRow({
1175
1175
  onActionCollapsed,
1176
1176
  id
1177
1177
  }) {
1178
- const optimistic = _chunk6RISTRR3cjs.isOptimistic.call(void 0, ticket);
1178
+ const optimistic = _chunkQVOGALQEcjs.isOptimistic.call(void 0, ticket);
1179
1179
  const rowRef = _react.useRef.call(void 0, null);
1180
1180
  const handleClick = _react.useCallback.call(void 0, () => {
1181
1181
  onToggle(ticket.id);
@@ -1344,11 +1344,11 @@ function TicketCenterAuthed({
1344
1344
  ) }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkWCBRZCU4cjs.Card, { className: "overflow-hidden", children: merged.map((ticket) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1345
1345
  TicketRow,
1346
1346
  {
1347
- id: _chunkDR4WXTKPcjs.devSectionAnchorId.call(void 0, "ticket", ticket.external_id),
1347
+ id: _chunkTZK5N6AHcjs.devSectionAnchorId.call(void 0, "ticket", ticket.external_id),
1348
1348
  ticket,
1349
1349
  expanded: expandedTicketId === ticket.id,
1350
1350
  onToggle: toggleRow,
1351
- busy: _chunk6RISTRR3cjs.isOptimistic.call(void 0, ticket) ? false : actions.isRowBusy(ticket.id),
1351
+ busy: _chunkQVOGALQEcjs.isOptimistic.call(void 0, ticket) ? false : actions.isRowBusy(ticket.id),
1352
1352
  supportSystemDown,
1353
1353
  onSendMessage: actions.sendMessage,
1354
1354
  onClose: actions.closeTicket,
@@ -1402,7 +1402,7 @@ function HelpCenterCard({
1402
1402
  onClearReplyError,
1403
1403
  id
1404
1404
  }) {
1405
- const optimistic = _chunk6RISTRR3cjs.isOptimistic.call(void 0, ticket);
1405
+ const optimistic = _chunkQVOGALQEcjs.isOptimistic.call(void 0, ticket);
1406
1406
  const rawStatus = (_nullishCoalesce(ticket.status, () => ( "OPEN"))).toUpperCase();
1407
1407
  const priority = (_nullishCoalesce(ticket.priority, () => ( ""))).toUpperCase();
1408
1408
  const relativeUpdated = ticket.hubspot_updated_at ? _chunkL7GNBUXFcjs.formatRelativeTime.call(void 0, ticket.hubspot_updated_at) : "recently";
@@ -1424,7 +1424,7 @@ function HelpCenterCard({
1424
1424
  });
1425
1425
  return () => cancelAnimationFrame(raf);
1426
1426
  }, [isExpanded]);
1427
- const live = _chunk6RISTRR3cjs.useOptionalTicketLive.call(void 0, );
1427
+ const live = _chunkQVOGALQEcjs.useOptionalTicketLive.call(void 0, );
1428
1428
  const unreadCount = !optimistic && ticket.external_id && _optionalChain([live, 'optionalAccess', _64 => _64.unreadByTicket, 'access', _65 => _65[ticket.external_id]]) || 0;
1429
1429
  const rightBadges = /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
1430
1430
  unreadCount > 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
@@ -1474,7 +1474,7 @@ function HelpCenterCard({
1474
1474
  "aria-controls": isExpanded ? `help-center-drawer-${ticket.id}` : void 0,
1475
1475
  className: "w-full p-[12px] text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ods-accent disabled:cursor-default md:p-[16px]",
1476
1476
  children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1477
- _chunkXTZECFMTcjs.DevCardRowContent,
1477
+ _chunkTDLETTI4cjs.DevCardRowContent,
1478
1478
  {
1479
1479
  title,
1480
1480
  subtitle,
@@ -1551,10 +1551,10 @@ function HelpCenterCreateForm({
1551
1551
  const subjectField = /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col", children: [
1552
1552
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkCHIHYC7Qcjs.Label, { htmlFor: "help-center-subject", children: [
1553
1553
  "Subject",
1554
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkC2UBAAGDcjs.RequiredMark, {})
1554
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkN6HNK25Acjs.RequiredMark, {})
1555
1555
  ] }),
1556
1556
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1557
- _chunkC2UBAAGDcjs.Input,
1557
+ _chunkN6HNK25Acjs.Input,
1558
1558
  {
1559
1559
  id: "help-center-subject",
1560
1560
  type: "text",
@@ -1575,7 +1575,7 @@ function HelpCenterCreateForm({
1575
1575
  subjectError && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { id: "help-center-subject-error", className: "mt-1 text-ods-error text-h6", children: subjectError })
1576
1576
  ] });
1577
1577
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1578
- _chunkUG43WQ2Ccjs.ContactForm,
1578
+ _chunkYQYOEGATcjs.ContactForm,
1579
1579
  {
1580
1580
  title: "Open a new ticket",
1581
1581
  footerText: "The support team typically responds within one business day.",
@@ -1617,25 +1617,25 @@ function HelpCenterList({ toast: toast2 = _chunkM4YQUHORcjs.toast, backButton, t
1617
1617
  const searchParams = _chunkSADRZ4YIcjs.useSearchParams.call(void 0, );
1618
1618
  const router = _chunkSADRZ4YIcjs.useRouter.call(void 0, );
1619
1619
  const pathname = _chunkSADRZ4YIcjs.usePathname.call(void 0, );
1620
- const search = searchParams.get(_chunkDR4WXTKPcjs.DEV_SECTION_PARAM_KEYS.search) || "";
1620
+ const search = searchParams.get(_chunkTZK5N6AHcjs.DEV_SECTION_PARAM_KEYS.search) || "";
1621
1621
  const status = searchParams.get("status") || "all";
1622
- const ticketParam = searchParams.get(_chunkDR4WXTKPcjs.TICKET_OPEN_PARAM) || "";
1622
+ const ticketParam = searchParams.get(_chunkTZK5N6AHcjs.TICKET_OPEN_PARAM) || "";
1623
1623
  const page = _chunkH64ZHSYRcjs.positiveInt.call(void 0, searchParams.get("page"), 1);
1624
1624
  if (identity.isLoading) {
1625
1625
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1626
- _chunkXTZECFMTcjs.DevSectionPage,
1626
+ _chunkTDLETTI4cjs.DevSectionPage,
1627
1627
  {
1628
1628
  sectionKey: "tickets",
1629
1629
  backButton,
1630
1630
  title,
1631
1631
  shell,
1632
1632
  preControls: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, HelpCenterCreateFormSkeleton, {}),
1633
- children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXTZECFMTcjs.DevCardRowSkeletonList, {})
1633
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkTDLETTI4cjs.DevCardRowSkeletonList, {})
1634
1634
  }
1635
1635
  );
1636
1636
  }
1637
1637
  if (identity.authTier === "anon" || !_optionalChain([identity, 'access', _66 => _66.user, 'optionalAccess', _67 => _67.email])) {
1638
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXTZECFMTcjs.DevSectionPage, { sectionKey: "tickets", backButton, title, shell, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1638
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkTDLETTI4cjs.DevSectionPage, { sectionKey: "tickets", backButton, title, shell, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1639
1639
  _chunkO4VZOA2Qcjs.EmptyState,
1640
1640
  {
1641
1641
  type: "generic",
@@ -1687,8 +1687,8 @@ function HelpCenterListAuthed({
1687
1687
  const setOpenTicket = _react.useCallback.call(void 0,
1688
1688
  (externalId) => {
1689
1689
  const params = new URLSearchParams(searchParams.toString());
1690
- if (externalId) params.set(_chunkDR4WXTKPcjs.TICKET_OPEN_PARAM, externalId);
1691
- else params.delete(_chunkDR4WXTKPcjs.TICKET_OPEN_PARAM);
1690
+ if (externalId) params.set(_chunkTZK5N6AHcjs.TICKET_OPEN_PARAM, externalId);
1691
+ else params.delete(_chunkTZK5N6AHcjs.TICKET_OPEN_PARAM);
1692
1692
  const qs = params.toString();
1693
1693
  router.replace(qs ? `${pathname}?${qs}` : pathname, { scroll: false });
1694
1694
  },
@@ -1765,13 +1765,13 @@ function HelpCenterListAuthed({
1765
1765
  ] }),
1766
1766
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkCJBSU3XBcjs.Button, { type: "button", variant: "accent", onClick: () => refetch(), children: "Retry" })
1767
1767
  ] }),
1768
- !error && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "w-full", children: isLoading ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXTZECFMTcjs.DevCardRowSkeletonList, {}) : !hasResults && isFetching ? (
1768
+ !error && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "w-full", children: isLoading ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkTDLETTI4cjs.DevCardRowSkeletonList, {}) : !hasResults && isFetching ? (
1769
1769
  // Bridge state — background refetch in flight and the
1770
1770
  // optimistic placeholder was just removed by the mutation
1771
1771
  // callback. Without this branch "No tickets yet" would flash
1772
1772
  // for ~50ms between `removeOptimistic` and the server
1773
1773
  // response landing.
1774
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXTZECFMTcjs.DevCardRowSkeletonList, { rows: 1 })
1774
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkTDLETTI4cjs.DevCardRowSkeletonList, { rows: 1 })
1775
1775
  ) : !hasResults ? hasActiveFilters ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1776
1776
  _chunkO4VZOA2Qcjs.EmptyState,
1777
1777
  {
@@ -1807,11 +1807,11 @@ function HelpCenterListAuthed({
1807
1807
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "w-full overflow-clip rounded-[6px] border border-ods-border bg-ods-card", children: merged.map((ticket) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1808
1808
  HelpCenterCard,
1809
1809
  {
1810
- id: _chunkDR4WXTKPcjs.devSectionAnchorId.call(void 0, "ticket", ticket.external_id),
1810
+ id: _chunkTZK5N6AHcjs.devSectionAnchorId.call(void 0, "ticket", ticket.external_id),
1811
1811
  ticket,
1812
1812
  expanded: expandedTicketId === ticket.id,
1813
1813
  onToggle: toggleRow,
1814
- busy: _chunk6RISTRR3cjs.isOptimistic.call(void 0, ticket) ? false : actions.isRowBusy(ticket.id),
1814
+ busy: _chunkQVOGALQEcjs.isOptimistic.call(void 0, ticket) ? false : actions.isRowBusy(ticket.id),
1815
1815
  supportSystemDown,
1816
1816
  onSendMessage: actions.sendMessage,
1817
1817
  onClose: actions.closeTicket,
@@ -1825,7 +1825,7 @@ function HelpCenterListAuthed({
1825
1825
  ) }),
1826
1826
  !error && totalPages > 1 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkO4VZOA2Qcjs.UnifiedPagination, { currentPage: page, totalPages })
1827
1827
  ] });
1828
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXTZECFMTcjs.DevSectionPage, { sectionKey: "tickets", backButton, title, shell, preControls: form, children: body });
1828
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkTDLETTI4cjs.DevSectionPage, { sectionKey: "tickets", backButton, title, shell, preControls: form, children: body });
1829
1829
  }
1830
1830
 
1831
1831
 
@@ -1844,4 +1844,4 @@ function HelpCenterListAuthed({
1844
1844
 
1845
1845
 
1846
1846
  exports.useTicketActions = useTicketActions; exports.mapTicketActionError = mapTicketActionError; exports.useTicketsList = useTicketsList; exports.TicketOpenForm = TicketOpenForm; exports.useTicketEngagements = useTicketEngagements; exports.TicketLinkedDeliveryCard = TicketLinkedDeliveryCard; exports.TicketReplyComposer = TicketReplyComposer; exports.TicketDetailDrawer = TicketDetailDrawer; exports.TicketRow = TicketRow; exports.TicketCenter = TicketCenter; exports.HelpCenterCard = HelpCenterCard; exports.HelpCenterCreateFormSkeleton = HelpCenterCreateFormSkeleton; exports.HelpCenterCreateForm = HelpCenterCreateForm; exports.HelpCenterList = HelpCenterList;
1847
- //# sourceMappingURL=chunk-CBR4H6JJ.cjs.map
1847
+ //# sourceMappingURL=chunk-3IT35YDV.cjs.map