@flamingo-stack/openframe-frontend-core 0.0.503 → 0.0.504
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-OAWFYZZT.js → chunk-32J4AXWO.js} +3 -3
- package/dist/{chunk-4UNQMYP7.cjs → chunk-5JEL52KB.cjs} +3 -3
- package/dist/{chunk-4UNQMYP7.cjs.map → chunk-5JEL52KB.cjs.map} +1 -1
- package/dist/{chunk-HR6F6IP4.js → chunk-AFHWEJXM.js} +6 -6
- package/dist/{chunk-3T4SMJM5.cjs → chunk-AI7ASU6V.cjs} +93 -93
- package/dist/{chunk-3T4SMJM5.cjs.map → chunk-AI7ASU6V.cjs.map} +1 -1
- package/dist/{chunk-FFXNRJ5S.cjs → chunk-C6Q3BJDJ.cjs} +2 -2
- package/dist/chunk-C6Q3BJDJ.cjs.map +1 -0
- package/dist/{chunk-72DF3QTA.cjs → chunk-CQ6O6ER2.cjs} +12 -12
- package/dist/{chunk-72DF3QTA.cjs.map → chunk-CQ6O6ER2.cjs.map} +1 -1
- package/dist/{chunk-VYEDTVIZ.js → chunk-CSRGIQ2G.js} +3 -3
- package/dist/{chunk-7L2RVINX.cjs → chunk-D3VTZBWC.cjs} +32 -32
- package/dist/{chunk-7L2RVINX.cjs.map → chunk-D3VTZBWC.cjs.map} +1 -1
- package/dist/{chunk-4SR2QHMB.js → chunk-EFBKOCEA.js} +3 -3
- package/dist/{chunk-JGXAVNZQ.js → chunk-FW2U6U4P.js} +45 -34
- package/dist/{chunk-JGXAVNZQ.js.map → chunk-FW2U6U4P.js.map} +1 -1
- package/dist/{chunk-BZF63JXP.js → chunk-GCVAZR52.js} +5 -5
- package/dist/{chunk-FTOVZ7O2.js → chunk-HNDHCJV4.js} +6 -6
- package/dist/{chunk-UCV4LFUG.cjs → chunk-IZTXVVGY.cjs} +40 -40
- package/dist/{chunk-UCV4LFUG.cjs.map → chunk-IZTXVVGY.cjs.map} +1 -1
- package/dist/{chunk-XV5SXALY.js → chunk-JCF55O7G.js} +2 -2
- package/dist/{chunk-CLQEBWV7.js → chunk-JQDGP4CE.js} +4 -4
- package/dist/{chunk-SGWPW2AO.cjs → chunk-KHE3OBHD.cjs} +18 -18
- package/dist/{chunk-SGWPW2AO.cjs.map → chunk-KHE3OBHD.cjs.map} +1 -1
- package/dist/{chunk-J4T5ZBWG.cjs → chunk-KZSQMZUL.cjs} +19 -19
- package/dist/{chunk-J4T5ZBWG.cjs.map → chunk-KZSQMZUL.cjs.map} +1 -1
- package/dist/{chunk-VO2ZONMR.js → chunk-MRPFFHBK.js} +3 -3
- package/dist/{chunk-JIZJDAXI.cjs → chunk-NNQMA3N6.cjs} +12 -12
- package/dist/{chunk-JIZJDAXI.cjs.map → chunk-NNQMA3N6.cjs.map} +1 -1
- package/dist/{chunk-AWDHRIL3.cjs → chunk-OK34RZWT.cjs} +73 -73
- package/dist/{chunk-AWDHRIL3.cjs.map → chunk-OK34RZWT.cjs.map} +1 -1
- package/dist/{chunk-2OXJ6NHI.cjs → chunk-Q6RMV5WK.cjs} +5 -5
- package/dist/{chunk-2OXJ6NHI.cjs.map → chunk-Q6RMV5WK.cjs.map} +1 -1
- package/dist/{chunk-G43CEISB.js → chunk-QFQBYNQJ.js} +4 -4
- package/dist/{chunk-WHJGRRK2.js → chunk-QW7SW5HY.js} +52 -43
- package/dist/chunk-QW7SW5HY.js.map +1 -0
- package/dist/{chunk-L5CI57RM.cjs → chunk-T3BF6JTQ.cjs} +52 -43
- package/dist/chunk-T3BF6JTQ.cjs.map +1 -0
- package/dist/{chunk-RR3Z52X5.cjs → chunk-US2F5GJO.cjs} +40 -40
- package/dist/{chunk-RR3Z52X5.cjs.map → chunk-US2F5GJO.cjs.map} +1 -1
- package/dist/{chunk-5RIHLXEP.cjs → chunk-WXARO2KA.cjs} +33 -33
- package/dist/{chunk-5RIHLXEP.cjs.map → chunk-WXARO2KA.cjs.map} +1 -1
- package/dist/{chunk-DMXB3VE2.cjs → chunk-X5USQ6UC.cjs} +492 -481
- package/dist/chunk-X5USQ6UC.cjs.map +1 -0
- package/dist/{chunk-SFJRMBJC.js → chunk-XRGAQM3F.js} +2 -2
- package/dist/{chunk-VCPTU4IW.js → chunk-XT4P4JGJ.js} +6 -6
- package/dist/{chunk-F7AD5CUU.js → chunk-YKF25XRY.js} +2 -2
- package/dist/chunk-YKF25XRY.js.map +1 -0
- package/dist/components/case-studies/index.cjs +10 -10
- package/dist/components/case-studies/index.js +4 -4
- package/dist/components/chat/index.cjs +4 -4
- package/dist/components/chat/index.js +3 -3
- package/dist/components/contact/index.cjs +5 -5
- package/dist/components/contact/index.js +4 -4
- package/dist/components/docs/index.cjs +7 -7
- package/dist/components/docs/index.js +6 -6
- package/dist/components/embeds/index.cjs +5 -5
- package/dist/components/embeds/index.js +4 -4
- package/dist/components/faq/index.cjs +6 -6
- package/dist/components/faq/index.js +5 -5
- package/dist/components/features/index.cjs +4 -4
- package/dist/components/features/index.js +3 -3
- package/dist/components/help-center-pages/index.cjs +23 -23
- package/dist/components/help-center-pages/index.js +14 -14
- package/dist/components/index.cjs +161 -161
- package/dist/components/index.js +12 -12
- package/dist/components/navigation/header-button.d.ts.map +1 -1
- package/dist/components/navigation/header.d.ts.map +1 -1
- package/dist/components/navigation/index.cjs +4 -4
- package/dist/components/navigation/index.js +3 -3
- package/dist/components/navigation/mingo-ai-button.d.ts.map +1 -1
- package/dist/components/navigation/top-navigation.d.ts +5 -1
- package/dist/components/navigation/top-navigation.d.ts.map +1 -1
- package/dist/components/onboarding-guides/index.cjs +8 -8
- package/dist/components/onboarding-guides/index.js +7 -7
- package/dist/components/related-content/index.cjs +6 -6
- package/dist/components/related-content/index.js +5 -5
- package/dist/components/tickets/index.cjs +7 -7
- package/dist/components/tickets/index.js +6 -6
- package/dist/components/ui/button/button.d.ts +6 -5
- package/dist/components/ui/button/button.d.ts.map +1 -1
- package/dist/components/ui/file-manager/index.cjs +50 -50
- package/dist/components/ui/file-manager/index.js +1 -1
- package/dist/components/ui/index.cjs +4 -4
- package/dist/components/ui/index.js +3 -3
- package/dist/hooks/index.cjs +2 -2
- package/dist/hooks/index.js +1 -1
- package/dist/hooks/ui/use-header-height.d.ts.map +1 -1
- package/dist/index.cjs +4 -4
- package/dist/index.js +3 -3
- package/package.json +1 -1
- package/src/components/features/time-tracker/time-tracker-header-button.tsx +1 -1
- package/src/components/navigation/app-header.tsx +10 -10
- package/src/components/navigation/header-button.tsx +4 -1
- package/src/components/navigation/header-mingo-button.tsx +2 -2
- package/src/components/navigation/header-skeleton.tsx +4 -4
- package/src/components/navigation/header.tsx +20 -14
- package/src/components/navigation/mingo-ai-button.tsx +23 -22
- package/src/components/navigation/mobile-burger-menu.tsx +3 -3
- package/src/components/navigation/top-navigation.tsx +17 -1
- package/src/components/ui/button/button.tsx +165 -133
- package/src/hooks/ui/use-header-height.ts +3 -1
- package/src/stories/TopNavigation.stories.tsx +20 -1
- package/dist/chunk-DMXB3VE2.cjs.map +0 -1
- package/dist/chunk-F7AD5CUU.js.map +0 -1
- package/dist/chunk-FFXNRJ5S.cjs.map +0 -1
- package/dist/chunk-L5CI57RM.cjs.map +0 -1
- package/dist/chunk-WHJGRRK2.js.map +0 -1
- /package/dist/{chunk-OAWFYZZT.js.map → chunk-32J4AXWO.js.map} +0 -0
- /package/dist/{chunk-HR6F6IP4.js.map → chunk-AFHWEJXM.js.map} +0 -0
- /package/dist/{chunk-VYEDTVIZ.js.map → chunk-CSRGIQ2G.js.map} +0 -0
- /package/dist/{chunk-4SR2QHMB.js.map → chunk-EFBKOCEA.js.map} +0 -0
- /package/dist/{chunk-BZF63JXP.js.map → chunk-GCVAZR52.js.map} +0 -0
- /package/dist/{chunk-FTOVZ7O2.js.map → chunk-HNDHCJV4.js.map} +0 -0
- /package/dist/{chunk-XV5SXALY.js.map → chunk-JCF55O7G.js.map} +0 -0
- /package/dist/{chunk-CLQEBWV7.js.map → chunk-JQDGP4CE.js.map} +0 -0
- /package/dist/{chunk-VO2ZONMR.js.map → chunk-MRPFFHBK.js.map} +0 -0
- /package/dist/{chunk-G43CEISB.js.map → chunk-QFQBYNQJ.js.map} +0 -0
- /package/dist/{chunk-SFJRMBJC.js.map → chunk-XRGAQM3F.js.map} +0 -0
- /package/dist/{chunk-VCPTU4IW.js.map → chunk-XT4P4JGJ.js.map} +0 -0
|
@@ -108,6 +108,14 @@ var init_button = _chunkVRHGVLSLcjs.__esm.call(void 0, {
|
|
|
108
108
|
// hosts stop re-implementing a <button> to escape the 20px svg cap.
|
|
109
109
|
"icon-glyph": "p-0 h-14 w-14 [&_svg]:h-14 [&_svg]:w-14"
|
|
110
110
|
},
|
|
111
|
+
// Label typography axis (Figma 133-740). `bold` is the classic h3-bold
|
|
112
|
+
// label; `regular` swaps the DEFAULT size's label to the h4 step
|
|
113
|
+
// (DM Sans 500, neutral tracking) — added for navigation buttons.
|
|
114
|
+
// `small` keeps its mono-uppercase h5 label on both fonts per the spec.
|
|
115
|
+
font: {
|
|
116
|
+
bold: "",
|
|
117
|
+
regular: ""
|
|
118
|
+
},
|
|
111
119
|
fullWidth: {
|
|
112
120
|
true: "w-full",
|
|
113
121
|
false: ""
|
|
@@ -118,11 +126,15 @@ var init_button = _chunkVRHGVLSLcjs.__esm.call(void 0, {
|
|
|
118
126
|
}
|
|
119
127
|
},
|
|
120
128
|
compoundVariants: [
|
|
121
|
-
{ size: "small", class: "[&_svg]:h-4 [&_svg]:w-4" }
|
|
129
|
+
{ size: "small", class: "[&_svg]:h-4 [&_svg]:w-4" },
|
|
130
|
+
// Comes after the size classes, so cn()'s tailwind-merge resolves the
|
|
131
|
+
// ods-typography group in favour of text-h4.
|
|
132
|
+
{ size: "default", font: "regular", class: "text-h4" }
|
|
122
133
|
],
|
|
123
134
|
defaultVariants: {
|
|
124
135
|
variant: "accent",
|
|
125
136
|
size: "default",
|
|
137
|
+
font: "bold",
|
|
126
138
|
fullWidth: false,
|
|
127
139
|
noPaddingX: false
|
|
128
140
|
}
|
|
@@ -145,12 +157,19 @@ var init_button = _chunkVRHGVLSLcjs.__esm.call(void 0, {
|
|
|
145
157
|
warning: buttonSurfaceClasses.warning
|
|
146
158
|
},
|
|
147
159
|
size: {
|
|
148
|
-
default: "h-12
|
|
160
|
+
default: "h-12",
|
|
149
161
|
small: "h-6 md:h-8 text-h5"
|
|
150
162
|
},
|
|
163
|
+
// Same label-typography axis as the normal layout — `regular` swaps the
|
|
164
|
+
// default size's h3-bold label for the h4 (DM Sans 500) step.
|
|
165
|
+
font: { bold: "", regular: "" },
|
|
151
166
|
fullWidth: { true: "w-full", false: "" }
|
|
152
167
|
},
|
|
153
|
-
|
|
168
|
+
compoundVariants: [
|
|
169
|
+
{ size: "default", font: "bold", class: "text-h3" },
|
|
170
|
+
{ size: "default", font: "regular", class: "text-h4" }
|
|
171
|
+
],
|
|
172
|
+
defaultVariants: { variant: "accent", size: "default", font: "bold", fullWidth: false }
|
|
154
173
|
}
|
|
155
174
|
);
|
|
156
175
|
splitSlotVariants = _classvarianceauthority.cva.call(void 0,
|
|
@@ -172,20 +191,32 @@ var init_button = _chunkVRHGVLSLcjs.__esm.call(void 0, {
|
|
|
172
191
|
{ slot: "main", size: "small", class: "px-[var(--spacing-system-xs)]" },
|
|
173
192
|
{ slot: "icon", size: "default", class: "w-10" },
|
|
174
193
|
{ slot: "icon", size: "small", class: "w-6 md:w-8" },
|
|
175
|
-
{
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
194
|
+
{
|
|
195
|
+
slot: "icon",
|
|
196
|
+
variant: "accent",
|
|
197
|
+
class: _chunkA62C4C4Vcjs.cn.call(void 0,
|
|
198
|
+
splitDividerColorClasses.accent,
|
|
199
|
+
"group-disabled:border-ods-disabled group-aria-disabled:border-ods-disabled"
|
|
200
|
+
)
|
|
201
|
+
},
|
|
179
202
|
{ slot: "icon", variant: "outline", class: splitDividerColorClasses.outline },
|
|
180
203
|
{ slot: "icon", variant: "transparent", class: splitDividerColorClasses.transparent },
|
|
181
|
-
{
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
204
|
+
{
|
|
205
|
+
slot: "icon",
|
|
206
|
+
variant: "destructive",
|
|
207
|
+
class: _chunkA62C4C4Vcjs.cn.call(void 0,
|
|
208
|
+
splitDividerColorClasses.destructive,
|
|
209
|
+
"group-disabled:border-ods-disabled group-aria-disabled:border-ods-disabled"
|
|
210
|
+
)
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
slot: "icon",
|
|
214
|
+
variant: "warning",
|
|
215
|
+
class: _chunkA62C4C4Vcjs.cn.call(void 0,
|
|
216
|
+
splitDividerColorClasses.warning,
|
|
217
|
+
"group-disabled:border-ods-disabled group-aria-disabled:border-ods-disabled"
|
|
218
|
+
)
|
|
219
|
+
}
|
|
189
220
|
],
|
|
190
221
|
defaultVariants: { slot: "main", size: "default", variant: "accent" }
|
|
191
222
|
}
|
|
@@ -205,6 +236,7 @@ var init_button = _chunkVRHGVLSLcjs.__esm.call(void 0, {
|
|
|
205
236
|
className,
|
|
206
237
|
variant,
|
|
207
238
|
size,
|
|
239
|
+
font,
|
|
208
240
|
fullWidth,
|
|
209
241
|
noPaddingX,
|
|
210
242
|
asChild,
|
|
@@ -226,10 +258,7 @@ var init_button = _chunkVRHGVLSLcjs.__esm.call(void 0, {
|
|
|
226
258
|
if (useSplitLayout) {
|
|
227
259
|
const safeSize = _nullishCoalesce(size, () => ( "default"));
|
|
228
260
|
const safeVariant = _nullishCoalesce(variant, () => ( "accent"));
|
|
229
|
-
const shellClasses = _chunkA62C4C4Vcjs.cn.call(void 0,
|
|
230
|
-
splitShellVariants({ variant: safeVariant, size: safeSize, fullWidth }),
|
|
231
|
-
className
|
|
232
|
-
);
|
|
261
|
+
const shellClasses = _chunkA62C4C4Vcjs.cn.call(void 0, splitShellVariants({ variant: safeVariant, size: safeSize, font, fullWidth }), className);
|
|
233
262
|
const mainSlotClass = splitSlotVariants({ slot: "main", size: safeSize, variant: safeVariant });
|
|
234
263
|
const iconSlotClass = splitSlotVariants({ slot: "icon", size: safeSize, variant: safeVariant });
|
|
235
264
|
const splitContent = /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
|
|
@@ -266,19 +295,9 @@ var init_button = _chunkVRHGVLSLcjs.__esm.call(void 0, {
|
|
|
266
295
|
}
|
|
267
296
|
);
|
|
268
297
|
}
|
|
269
|
-
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
270
|
-
"button",
|
|
271
|
-
{
|
|
272
|
-
ref,
|
|
273
|
-
className: shellClasses,
|
|
274
|
-
disabled: isDisabled,
|
|
275
|
-
onClick,
|
|
276
|
-
...props,
|
|
277
|
-
children: splitContent
|
|
278
|
-
}
|
|
279
|
-
);
|
|
298
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "button", { ref, className: shellClasses, disabled: isDisabled, onClick, ...props, children: splitContent });
|
|
280
299
|
}
|
|
281
|
-
const classes = _chunkA62C4C4Vcjs.cn.call(void 0, buttonVariants({ variant, size, fullWidth, noPaddingX }), className);
|
|
300
|
+
const classes = _chunkA62C4C4Vcjs.cn.call(void 0, buttonVariants({ variant, size, font, fullWidth, noPaddingX }), className);
|
|
282
301
|
if (asChild) {
|
|
283
302
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _reactslot.Slot, { ref, className: classes, ...props, children });
|
|
284
303
|
}
|
|
@@ -313,17 +332,7 @@ var init_button = _chunkVRHGVLSLcjs.__esm.call(void 0, {
|
|
|
313
332
|
}
|
|
314
333
|
);
|
|
315
334
|
}
|
|
316
|
-
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
317
|
-
"button",
|
|
318
|
-
{
|
|
319
|
-
ref,
|
|
320
|
-
className: classes,
|
|
321
|
-
disabled: isDisabled,
|
|
322
|
-
onClick,
|
|
323
|
-
...props,
|
|
324
|
-
children: content
|
|
325
|
-
}
|
|
326
|
-
);
|
|
335
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "button", { ref, className: classes, disabled: isDisabled, onClick, ...props, children: content });
|
|
327
336
|
});
|
|
328
337
|
}
|
|
329
338
|
});
|
|
@@ -994,4 +1003,4 @@ SkeletonNavigation.displayName = "SkeletonNavigation";
|
|
|
994
1003
|
|
|
995
1004
|
|
|
996
1005
|
exports.FieldWrapper = FieldWrapper; exports.Input = Input; exports.buttonVariants = buttonVariants; exports.Button = Button; exports.init_button = init_button; exports.SplitButton = SplitButton; exports.init_split_button = init_split_button; exports.init_button2 = init_button2; exports.Checkbox = Checkbox; exports.PortalContainerContext = PortalContainerContext; exports.usePortalContainer = usePortalContainer; exports.DropdownMenu = DropdownMenu; exports.DropdownMenuTrigger = DropdownMenuTrigger; exports.DropdownMenuGroup = DropdownMenuGroup; exports.DropdownMenuPortal = DropdownMenuPortal; exports.DropdownMenuSub = DropdownMenuSub; exports.DropdownMenuRadioGroup = DropdownMenuRadioGroup; exports.DropdownMenuSubTrigger = DropdownMenuSubTrigger; exports.DropdownMenuSubContent = DropdownMenuSubContent; exports.DropdownMenuContent = DropdownMenuContent; exports.DropdownMenuItem = DropdownMenuItem; exports.DropdownMenuCheckboxItem = DropdownMenuCheckboxItem; exports.DropdownMenuRadioItem = DropdownMenuRadioItem; exports.DropdownMenuLabel = DropdownMenuLabel; exports.DropdownMenuSeparator = DropdownMenuSeparator; exports.DropdownMenuShortcut = DropdownMenuShortcut; exports.Skeleton = Skeleton; exports.SkeletonText = SkeletonText; exports.SkeletonCard = SkeletonCard; exports.SkeletonGrid = SkeletonGrid; exports.SkeletonButton = SkeletonButton; exports.SkeletonHeading = SkeletonHeading; exports.SkeletonList = SkeletonList; exports.SkeletonNavigation = SkeletonNavigation;
|
|
997
|
-
//# sourceMappingURL=chunk-
|
|
1006
|
+
//# sourceMappingURL=chunk-T3BF6JTQ.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-T3BF6JTQ.cjs","../src/components/ui/button/button-styles.ts","../src/components/ui/button/button.tsx","../src/components/ui/button/split-button.tsx","../src/components/ui/button/index.ts","../src/components/ui/field-wrapper.tsx","../src/components/ui/input.tsx","../src/components/ui/checkbox.tsx","../src/components/ui/dropdown-menu.tsx","../src/components/ui/portal-container.tsx","../src/components/ui/skeleton.tsx"],"names":["jsxs","jsx","React","Button","cva"],"mappings":"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","file":"/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-T3BF6JTQ.cjs","sourcesContent":[null,"// Shared style atoms for `Button` and `SplitButton`. Extracted to keep a single\n// source of truth for surface colors, outline borders, and split-divider colors.\n\n// Each variant pairs `disabled:` (real `<button disabled>`) with `aria-disabled:`\n// (used for `<Link aria-disabled>` since anchors don't support `:disabled`).\nexport const buttonSurfaceClasses = {\n accent:\n \"bg-ods-accent text-ods-text-on-accent hover:bg-ods-accent-hover active:bg-ods-accent-active disabled:bg-ods-disabled aria-disabled:bg-ods-disabled\",\n outline:\n \"bg-ods-card text-ods-text-primary hover:bg-ods-bg-hover active:bg-ods-bg-active disabled:bg-ods-card disabled:text-ods-text-disabled aria-disabled:bg-ods-card aria-disabled:text-ods-text-disabled\",\n transparent:\n \"bg-transparent text-ods-text-primary hover:bg-ods-bg-hover active:bg-ods-bg-active disabled:bg-transparent disabled:text-ods-text-disabled aria-disabled:bg-transparent aria-disabled:text-ods-text-disabled\",\n destructive:\n \"bg-ods-error text-ods-text-on-accent hover:bg-ods-error-hover active:bg-ods-error-active disabled:bg-ods-disabled aria-disabled:bg-ods-disabled\",\n warning:\n \"bg-ods-warning text-ods-text-on-accent hover:bg-ods-warning-hover active:bg-ods-warning-active disabled:bg-ods-disabled aria-disabled:bg-ods-disabled\",\n // A self-contained glyph (play badge, unmute glyph) that already carries its\n // own scrim: no button surface at all, in any state. Distinct from\n // `transparent`, whose hover/active fills would paint a rectangle behind the\n // glyph — which is why call sites were undoing them with\n // `hover:bg-transparent active:bg-transparent`.\n glyph:\n \"bg-transparent text-ods-text-primary hover:bg-transparent active:bg-transparent disabled:bg-transparent disabled:text-ods-text-disabled aria-disabled:bg-transparent aria-disabled:text-ods-text-disabled\",\n // Chrome that sits ON media (video cards, image lightboxes): a scrim disc so\n // the glyph stays legible over an arbitrary frame. Promoted to a variant\n // because the walkthrough card, its theater and the bite cards were each\n // stacking the same classes at the call site.\n overlay:\n \"rounded-full bg-ods-overlay text-ods-text-primary backdrop-blur-sm hover:text-ods-accent active:text-ods-accent-active disabled:text-ods-text-disabled aria-disabled:text-ods-text-disabled\",\n} as const\n\nexport const outlineBorderClasses =\n \"border border-ods-border hover:border-ods-border-hover active:border-ods-border-active disabled:border-ods-border aria-disabled:border-ods-border\"\n\n// Glyph scale for the split-layout button family: 16px below md, 24px from md.\n//\n// Shared because the same page-header action renders through EITHER of the two\n// split layouts depending on its shape — `SplitButton` for two click targets, and\n// `Button` + `splitIcon` for one with a decorative trailing glyph — and the two sit\n// side by side in the same row. They used to disagree: `SplitButton` carried this\n// responsive scale while the `Button` split slots re-declared a flat 20px, so a\n// \"submenu\" action's icons rendered 4px smaller than its neighbour's on desktop.\n// `Button`'s own flat `[&_svg]:h-5` stays as it is for ordinary (non-split) buttons.\nexport const splitGlyphSizeClasses = \"[&_svg]:h-4 [&_svg]:w-4 md:[&_svg]:h-6 md:[&_svg]:w-6\"\n\n// Color of the vertical seam between the main and icon halves (split layouts).\nexport const splitDividerColorClasses = {\n accent: \"border-ods-accent-active\",\n outline: \"border-ods-border\",\n transparent: \"border-ods-border\",\n destructive: \"border-ods-error-active\",\n warning: \"border-ods-warning-active\",\n} as const\n\nexport type ButtonSurfaceVariant = keyof typeof buttonSurfaceClasses\n","'use client';\n\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport React from 'react';\nimport Link from '../../../embed-shims/next-link';\n\nimport { cn } from '../../../utils/cn';\nimport {\n buttonSurfaceClasses,\n outlineBorderClasses,\n splitDividerColorClasses,\n splitGlyphSizeClasses,\n} from './button-styles';\n\n// Default layout: centered single content area, padding/gap on the button itself.\nconst buttonVariants = cva(\n [\n 'relative inline-flex items-center justify-center gap-[var(--spacing-system-xsf)]',\n 'rounded-md whitespace-nowrap',\n 'transition-colors duration-200',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ods-focus',\n 'disabled:pointer-events-none',\n '[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:h-5 [&_svg]:w-5',\n ],\n {\n variants: {\n variant: {\n accent: buttonSurfaceClasses.accent,\n outline: cn(buttonSurfaceClasses.outline, outlineBorderClasses),\n transparent: buttonSurfaceClasses.transparent,\n destructive: buttonSurfaceClasses.destructive,\n warning: buttonSurfaceClasses.warning,\n glyph: buttonSurfaceClasses.glyph,\n overlay: buttonSurfaceClasses.overlay,\n },\n size: {\n default: 'py-[var(--spacing-system-sf)] px-[var(--spacing-system-m)] text-h3 md:h-12 h-11',\n small: 'p-[var(--spacing-system-xs)] text-h5 h-6 md:h-8',\n 'small-legacy': 'py-[var(--spacing-system-xs)] px-[var(--spacing-system-m)] h-10 text-[14px] font-bold', // Temporary alias for \"small\" — deprecated; grep size=\"small-legacy\" (lib + hub) and migrate the remaining consumers before removal\n // 24px pill for slim strips (announcement/promo bars, inline banner\n // actions — Primer banner / Polaris banner / Vercel-bar convention).\n // The label matches the strip's MESSAGE type ramp exactly (DM Sans\n // regular, 13px -> md:14px, snug leading — the announcement bar's\n // subtitle styling): in-strip CTAs must never read louder than the\n // message beside them, so this deliberately uses neither the\n // mono-uppercase control style of \"small\" nor a heavier weight.\n // Pinned h-6 across breakpoints (24px = the WCAG 2.5.8 target-size\n // floor) with horizontal-dominant padding and a 14px glyph.\n compact: 'py-0 px-[var(--spacing-system-sf)] text-h6 font-normal h-6 [&_svg]:h-3.5 [&_svg]:w-3.5',\n icon: 'p-[var(--spacing-system-sf)] h-11 w-11 md:h-12 md:w-12 [&_svg]:h-4 [&_svg]:w-4 md:[&_svg]:h-6 md:[&_svg]:w-6',\n // Quiet 32px icon target with a 16px glyph, fixed across breakpoints\n // (Carbon ghost sm / Primer medium / shadcn icon-sm all pin 32px;\n // ≥ the 24px WCAG 2.5.8 target floor). For icon actions that read as\n // metadata rather than CTAs — author-page social rows, share rows.\n // Pair with variant=\"transparent\" for the ghost treatment.\n 'icon-sm': 'p-[var(--spacing-system-xxs)] h-8 w-8 [&_svg]:h-4 [&_svg]:w-4',\n // Bare 56px media glyph (play / unmute over video). A size variant so\n // hosts stop re-implementing a <button> to escape the 20px svg cap.\n 'icon-glyph': 'p-0 h-14 w-14 [&_svg]:h-14 [&_svg]:w-14',\n },\n // Label typography axis (Figma 133-740). `bold` is the classic h3-bold\n // label; `regular` swaps the DEFAULT size's label to the h4 step\n // (DM Sans 500, neutral tracking) — added for navigation buttons.\n // `small` keeps its mono-uppercase h5 label on both fonts per the spec.\n font: {\n bold: '',\n regular: '',\n },\n fullWidth: {\n true: 'w-full',\n false: '',\n },\n noPaddingX: {\n true: 'px-0',\n false: '',\n },\n },\n compoundVariants: [\n { size: 'small', class: '[&_svg]:h-4 [&_svg]:w-4' },\n // Comes after the size classes, so cn()'s tailwind-merge resolves the\n // ods-typography group in favour of text-h4.\n { size: 'default', font: 'regular', class: 'text-h4' },\n ],\n defaultVariants: {\n variant: 'accent',\n size: 'default',\n font: 'bold',\n fullWidth: false,\n noPaddingX: false,\n },\n },\n);\n\n// Split layout (used when `splitIcon` is provided): outer button has no padding;\n// inner slots own padding/gap so the divider can span full button height.\nconst splitShellVariants = cva(\n [\n 'group relative inline-flex items-stretch overflow-hidden rounded-md whitespace-nowrap',\n 'transition-colors duration-200',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ods-focus',\n 'disabled:pointer-events-none',\n ],\n {\n variants: {\n variant: {\n accent: buttonSurfaceClasses.accent,\n outline: cn(buttonSurfaceClasses.outline, outlineBorderClasses),\n transparent: buttonSurfaceClasses.transparent,\n destructive: buttonSurfaceClasses.destructive,\n warning: buttonSurfaceClasses.warning,\n },\n size: {\n default: 'h-12',\n small: 'h-6 md:h-8 text-h5',\n },\n // Same label-typography axis as the normal layout — `regular` swaps the\n // default size's h3-bold label for the h4 (DM Sans 500) step.\n font: { bold: '', regular: '' },\n fullWidth: { true: 'w-full', false: '' },\n },\n compoundVariants: [\n { size: 'default', font: 'bold', class: 'text-h3' },\n { size: 'default', font: 'regular', class: 'text-h4' },\n ],\n defaultVariants: { variant: 'accent', size: 'default', font: 'bold', fullWidth: false },\n },\n);\n\nconst splitSlotVariants = cva(\n // Glyph size lives per-size, not in the base: cva concatenates base + variant\n // without tailwind-merge, so a base `[&_svg]:h-5` and a variant `[&_svg]:h-4`\n // would both ship and the winner would come down to stylesheet order.\n ['inline-flex items-center justify-center', '[&_svg]:shrink-0'],\n {\n variants: {\n slot: {\n main: 'gap-[var(--spacing-system-xsf)]',\n icon: 'border-l',\n },\n size: { default: splitGlyphSizeClasses, small: '[&_svg]:h-4 [&_svg]:w-4' },\n variant: { accent: '', outline: '', transparent: '', destructive: '', warning: '' },\n },\n compoundVariants: [\n { slot: 'main', size: 'default', class: 'px-[var(--spacing-system-m)] py-[var(--spacing-system-sf)]' },\n { slot: 'main', size: 'small', class: 'px-[var(--spacing-system-xs)]' },\n { slot: 'icon', size: 'default', class: 'w-10' },\n { slot: 'icon', size: 'small', class: 'w-6 md:w-8' },\n {\n slot: 'icon',\n variant: 'accent',\n class: cn(\n splitDividerColorClasses.accent,\n 'group-disabled:border-ods-disabled group-aria-disabled:border-ods-disabled',\n ),\n },\n { slot: 'icon', variant: 'outline', class: splitDividerColorClasses.outline },\n { slot: 'icon', variant: 'transparent', class: splitDividerColorClasses.transparent },\n {\n slot: 'icon',\n variant: 'destructive',\n class: cn(\n splitDividerColorClasses.destructive,\n 'group-disabled:border-ods-disabled group-aria-disabled:border-ods-disabled',\n ),\n },\n {\n slot: 'icon',\n variant: 'warning',\n class: cn(\n splitDividerColorClasses.warning,\n 'group-disabled:border-ods-disabled group-aria-disabled:border-ods-disabled',\n ),\n },\n ],\n defaultVariants: { slot: 'main', size: 'default', variant: 'accent' },\n },\n);\n\n/** @deprecated Use `size=\"small\"` instead. Temporary alias kept for backward compatibility; will be removed in the future. */\ntype DeprecatedButtonSize = 'small-legacy';\n\ntype ButtonSize =\n | Exclude<VariantProps<typeof buttonVariants>['size'], 'small-legacy' | null | undefined>\n | DeprecatedButtonSize;\n\ninterface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n Omit<VariantProps<typeof buttonVariants>, 'size'> {\n asChild?: boolean;\n href?: string;\n openInNewTab?: boolean;\n prefetch?: boolean;\n /**\n * Pre-resolved anchor bundle (from `useNavLink({ href, targetPlatform })`).\n * When set, renders the Button as `<Link>` with `href` / `target` / `rel`\n * / `onClick` spread from this object. Lets callers thread the unified\n * nav decision directly without `<Button asChild><a {...linkProps}/>`\n * gymnastics. Wins over the separate `href` / `openInNewTab` props.\n */\n linkProps?: {\n href: string;\n target?: '_blank';\n rel?: 'noopener noreferrer';\n onClick?: React.MouseEventHandler<HTMLAnchorElement>;\n } | null;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n /**\n * Renders a vertical divider and trailing icon area inside the button.\n * The whole button stays a single click target — the icon is decorative\n * (`aria-hidden`). For two independent click targets, use `<SplitButton>`.\n * Only honored when `size` is `\"default\"` or `\"small\"`.\n */\n splitIcon?: React.ReactNode;\n loading?: boolean;\n size?: ButtonSize;\n}\n\nconst Spinner = () => (\n <svg className=\"animate-spin\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n);\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n {\n className,\n variant,\n size,\n font,\n fullWidth,\n noPaddingX,\n asChild,\n href,\n openInNewTab,\n prefetch,\n linkProps,\n leftIcon,\n rightIcon,\n splitIcon,\n loading,\n children,\n disabled,\n onClick,\n ...props\n },\n ref,\n) {\n const isDisabled = disabled || loading;\n\n // splitIcon is only supported for default/small sizes. With other sizes\n // (icon, small-legacy) we silently fall back to the normal layout.\n const useSplitLayout = !!splitIcon && (size === 'default' || size === 'small' || size === undefined);\n\n if (useSplitLayout) {\n const safeSize = (size ?? 'default') as 'default' | 'small';\n const safeVariant = (variant ?? 'accent') as 'accent' | 'outline' | 'transparent' | 'destructive' | 'warning';\n const shellClasses = cn(splitShellVariants({ variant: safeVariant, size: safeSize, font, fullWidth }), className);\n const mainSlotClass = splitSlotVariants({ slot: 'main', size: safeSize, variant: safeVariant });\n const iconSlotClass = splitSlotVariants({ slot: 'icon', size: safeSize, variant: safeVariant });\n\n const splitContent = (\n <>\n <span className={cn('contents', loading && 'invisible')}>\n <span className={mainSlotClass}>\n {leftIcon && <span className=\"inline-flex items-center\">{leftIcon}</span>}\n {children}\n {rightIcon && <span className=\"inline-flex items-center\">{rightIcon}</span>}\n </span>\n <span aria-hidden=\"true\" className={iconSlotClass}>\n {splitIcon}\n </span>\n </span>\n {loading && (\n <span className=\"absolute inset-0 inline-flex items-center justify-center text-ods-text-primary\">\n <Spinner />\n </span>\n )}\n </>\n );\n\n // `linkProps` (the pre-resolved bundle from `useNavLink({ href, targetPlatform })`)\n // wins over the legacy `href` + `openInNewTab` props so callers can thread\n // the unified nav decision directly. Either path produces the same `<Link>`.\n const splitAnchor =\n linkProps ??\n (href\n ? {\n href,\n target: openInNewTab ? ('_blank' as const) : undefined,\n rel: openInNewTab ? ('noopener noreferrer' as const) : undefined,\n onClick: onClick as unknown as React.MouseEventHandler<HTMLAnchorElement> | undefined,\n }\n : null);\n if (splitAnchor) {\n return (\n <Link\n href={splitAnchor.href}\n prefetch={prefetch}\n target={splitAnchor.target}\n rel={splitAnchor.rel}\n // The Link branches don't spread {...props} (button attrs don't\n // belong on an anchor), but the accessible name MUST survive —\n // icon-only link buttons have no text content.\n aria-label={props['aria-label']}\n aria-disabled={isDisabled || undefined}\n tabIndex={isDisabled ? -1 : undefined}\n className={cn(shellClasses, isDisabled && 'pointer-events-none')}\n onClick={splitAnchor.onClick}\n >\n {splitContent}\n </Link>\n );\n }\n\n return (\n <button ref={ref} className={shellClasses} disabled={isDisabled} onClick={onClick} {...props}>\n {splitContent}\n </button>\n );\n }\n\n const classes = cn(buttonVariants({ variant, size, font, fullWidth, noPaddingX }), className);\n\n // asChild: consumer fully controls the rendered element; we just stamp our classes.\n if (asChild) {\n return (\n <Slot ref={ref} className={classes} {...props}>\n {children}\n </Slot>\n );\n }\n\n // Real content stays in layout (preserving width) but goes invisible while loading.\n // The spinner is absolutely positioned so it never shifts the button's size.\n const content = (\n <>\n <span className={cn('contents', loading && 'invisible')}>\n {leftIcon && <span className=\"inline-flex items-center\">{leftIcon}</span>}\n {children}\n {rightIcon && <span className=\"inline-flex items-center\">{rightIcon}</span>}\n </span>\n {loading && (\n <span className=\"absolute inset-0 inline-flex items-center justify-center text-ods-text-primary\">\n <Spinner />\n </span>\n )}\n </>\n );\n\n // Same `linkProps`-wins-over-href resolution as the splitIcon branch.\n const anchor =\n linkProps ??\n (href\n ? {\n href,\n target: openInNewTab ? ('_blank' as const) : undefined,\n rel: openInNewTab ? ('noopener noreferrer' as const) : undefined,\n onClick: onClick as unknown as React.MouseEventHandler<HTMLAnchorElement> | undefined,\n }\n : null);\n if (anchor) {\n return (\n <Link\n href={anchor.href}\n prefetch={prefetch}\n target={anchor.target}\n rel={anchor.rel}\n // See the splitAnchor branch — keep the accessible name on the\n // anchor render (icon-only link buttons have no text content).\n aria-label={props['aria-label']}\n aria-disabled={isDisabled || undefined}\n tabIndex={isDisabled ? -1 : undefined}\n className={cn(classes, isDisabled && 'pointer-events-none')}\n onClick={anchor.onClick}\n >\n {content}\n </Link>\n );\n }\n\n return (\n <button ref={ref} className={classes} disabled={isDisabled} onClick={onClick} {...props}>\n {content}\n </button>\n );\n});\n\nexport { Button, buttonVariants, type ButtonProps };\n","\"use client\"\n\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport Link from \"../../../embed-shims/next-link\"\nimport React from \"react\"\n\nimport { cn } from \"../../../utils/cn\"\nimport { buttonSurfaceClasses, splitDividerColorClasses, splitGlyphSizeClasses } from \"./button-styles\"\n\n// Two independent interactive halves: each a `<button>` or `<a>`. The seam is\n// a 1px border on the left edge of the icon half, colored per variant. For a\n// single-target variant (decorative trailing icon), use `<Button splitIcon>`.\n\nconst splitHalfBase = [\n \"relative inline-flex items-center justify-center gap-[var(--spacing-system-xsf)]\",\n \"whitespace-nowrap transition-colors duration-200\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ods-focus focus-visible:z-10\",\n \"disabled:pointer-events-none\",\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0\",\n]\n\nconst splitHalfVariants = cva(splitHalfBase, {\n variants: {\n variant: {\n accent: buttonSurfaceClasses.accent,\n outline: buttonSurfaceClasses.outline, // Outline border lives in compoundVariants so we can omit the seam edge.\n transparent: buttonSurfaceClasses.transparent,\n destructive: buttonSurfaceClasses.destructive,\n warning: buttonSurfaceClasses.warning,\n },\n size: {\n default: `h-10 md:h-12 px-[var(--spacing-system-m)] py-[var(--spacing-system-sf)] text-h3 ${splitGlyphSizeClasses}`,\n small: \"h-6 md:h-8 px-[var(--spacing-system-xs)] text-h5 [&_svg]:h-3 [&_svg]:w-3 md:[&_svg]:h-4 md:[&_svg]:w-4\",\n },\n side: { main: \"\", icon: \"\" },\n soloOnMobile: { true: \"\", false: \"\" },\n },\n compoundVariants: [\n // Rounded corners + per-variant seam. The icon-side's left border is the divider.\n { variant: \"accent\", side: \"main\", class: \"rounded-l-md\" },\n { variant: \"accent\", side: \"icon\", class: cn(\n \"rounded-r-md border-l\",\n splitDividerColorClasses.accent,\n \"disabled:border-ods-disabled aria-disabled:border-ods-disabled\",\n ) },\n { variant: \"destructive\", side: \"main\", class: \"rounded-l-md\" },\n { variant: \"destructive\", side: \"icon\", class: cn(\n \"rounded-r-md border-l\",\n splitDividerColorClasses.destructive,\n \"disabled:border-ods-disabled aria-disabled:border-ods-disabled\",\n ) },\n { variant: \"warning\", side: \"main\", class: \"rounded-l-md\" },\n { variant: \"warning\", side: \"icon\", class: cn(\n \"rounded-r-md border-l\",\n splitDividerColorClasses.warning,\n \"disabled:border-ods-disabled aria-disabled:border-ods-disabled\",\n ) },\n { variant: \"outline\", side: \"main\", class: \"rounded-l-md border-y border-l border-ods-border\" },\n { variant: \"outline\", side: \"icon\", class: \"rounded-r-md border border-ods-border\" },\n { variant: \"transparent\", side: \"main\", class: \"rounded-md\" },\n { variant: \"transparent\", side: \"icon\", class: cn(\"rounded-md\", splitDividerColorClasses.transparent) },\n\n // Icon half: per Figma, narrower than main height (default: 40×48; small: 32×32).\n { side: \"icon\", size: \"default\", class: \"w-10 px-0\" },\n { side: \"icon\", size: \"small\", class: \"w-6 md:w-8 px-0\" },\n\n { side: \"icon\", soloOnMobile: true, class: \"max-md:hidden\" },\n { side: \"main\", soloOnMobile: true, class: \"max-md:rounded-r-md\" },\n { variant: \"outline\", side: \"main\", soloOnMobile: true, class: \"max-md:border-r\" },\n ],\n defaultVariants: { variant: \"accent\", size: \"default\", side: \"main\", soloOnMobile: false },\n})\n\ntype SplitButtonVariant = NonNullable<VariantProps<typeof splitHalfVariants>[\"variant\"]>\ntype SplitButtonSize = NonNullable<VariantProps<typeof splitHalfVariants>[\"size\"]>\n\ninterface SplitButtonIconAction {\n icon: React.ReactNode\n /** The icon half is interactive but has no visible text — needs an accessible name. */\n \"aria-label\": string\n onClick?: React.MouseEventHandler<HTMLButtonElement | HTMLAnchorElement>\n href?: string\n /**\n * Opens `href` with `target=\"_blank\"`. Also marks the half as a new-tab\n * affordance, which hides it below `md` (set it for `onClick` handlers that\n * open a new tab/window themselves).\n */\n openInNewTab?: boolean\n prefetch?: boolean\n disabled?: boolean\n}\n\ninterface SplitButtonProps {\n variant?: SplitButtonVariant\n size?: SplitButtonSize\n fullWidth?: boolean\n className?: string\n\n children: React.ReactNode\n onClick?: React.MouseEventHandler<HTMLButtonElement | HTMLAnchorElement>\n href?: string\n openInNewTab?: boolean\n prefetch?: boolean\n leftIcon?: React.ReactNode\n rightIcon?: React.ReactNode\n /** Disables both halves. Equivalent to `mainDisabled && iconAction.disabled`. */\n disabled?: boolean\n /** Disables only the main half. Combine with `iconAction.disabled` for finer control. */\n mainDisabled?: boolean\n type?: \"button\" | \"submit\" | \"reset\"\n \"aria-label\"?: string\n groupAriaLabel?: string\n\n iconAction: SplitButtonIconAction\n}\n\ninterface HalfOptions {\n variant: SplitButtonVariant\n size: SplitButtonSize\n side: \"main\" | \"icon\"\n soloOnMobile?: boolean\n href?: string\n openInNewTab?: boolean\n prefetch?: boolean\n onClick?: React.MouseEventHandler<HTMLButtonElement | HTMLAnchorElement>\n disabled?: boolean\n /** Stretch this half to fill the group's free space (the icon half stays fixed-width). */\n grow?: boolean\n type?: \"button\" | \"submit\" | \"reset\"\n ariaLabel?: string\n children: React.ReactNode\n}\n\nfunction Half({ variant, size, side, soloOnMobile, href, openInNewTab, prefetch, onClick, disabled, grow, type = \"button\", ariaLabel, children }: HalfOptions) {\n const classes = cn(splitHalfVariants({ variant, size, side, soloOnMobile }), grow && \"flex-1\")\n\n if (href) {\n return (\n <Link\n href={href}\n prefetch={prefetch}\n target={openInNewTab ? \"_blank\" : undefined}\n rel={openInNewTab ? \"noopener noreferrer\" : undefined}\n aria-disabled={disabled || undefined}\n tabIndex={disabled ? -1 : undefined}\n aria-label={ariaLabel}\n className={cn(classes, disabled && \"pointer-events-none\")}\n onClick={onClick as unknown as React.MouseEventHandler<HTMLAnchorElement> | undefined}\n >\n {children}\n </Link>\n )\n }\n\n return (\n <button\n type={type}\n className={classes}\n disabled={disabled}\n aria-label={ariaLabel}\n onClick={onClick as React.MouseEventHandler<HTMLButtonElement>}\n >\n {children}\n </button>\n )\n}\n\nconst SplitButton = React.forwardRef<HTMLDivElement, SplitButtonProps>(function SplitButton(\n {\n variant = \"accent\",\n size = \"default\",\n fullWidth = false,\n className,\n children,\n onClick,\n href,\n openInNewTab,\n prefetch,\n leftIcon,\n rightIcon,\n disabled,\n mainDisabled,\n type,\n iconAction,\n \"aria-label\": ariaLabel,\n groupAriaLabel,\n },\n ref,\n) {\n const soloOnMobile = !!iconAction.openInNewTab\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-label={groupAriaLabel}\n className={cn(\"inline-flex items-stretch\", fullWidth && \"w-full\", className)}\n >\n <Half\n variant={variant}\n size={size}\n side=\"main\"\n soloOnMobile={soloOnMobile}\n href={href}\n openInNewTab={openInNewTab}\n prefetch={prefetch}\n onClick={onClick}\n disabled={disabled || mainDisabled}\n grow={fullWidth}\n type={type}\n ariaLabel={ariaLabel}\n >\n {leftIcon && <span className=\"inline-flex items-center\">{leftIcon}</span>}\n <span>{children}</span>\n {rightIcon && <span className=\"inline-flex items-center\">{rightIcon}</span>}\n </Half>\n <Half\n variant={variant}\n size={size}\n side=\"icon\"\n soloOnMobile={soloOnMobile}\n href={iconAction.href}\n openInNewTab={iconAction.openInNewTab}\n prefetch={iconAction.prefetch}\n onClick={iconAction.onClick}\n disabled={disabled || iconAction.disabled}\n ariaLabel={iconAction[\"aria-label\"]}\n >\n <span className=\"inline-flex items-center\">{iconAction.icon}</span>\n </Half>\n </div>\n )\n})\n\nexport { SplitButton, type SplitButtonProps, type SplitButtonIconAction }\n","export * from './button'\nexport * from './split-button'\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"../../utils/cn\"\n\nexport interface FieldWrapperProps {\n /** Label text displayed above the field */\n label?: string\n /**\n * Status message displayed below the field, on ONE line, ellipsized on\n * overflow (full text via the native `title`).\n *\n * It is positioned OUT OF FLOW (absolute, hanging below the wrapper), so it\n * never changes the field's height when it appears — the same treatment\n * `CheckboxBlock` uses. The trade is that it overlaps whatever sits directly\n * below: a form stacking fields needs at least ~20px of vertical gap (e.g.\n * `gap-[var(--spacing-system-lf)]`) for the message to land in clear space.\n */\n error?: string\n /** Color variant for the message: \"error\" (red), \"warning\" (yellow), \"success\" (green) or \"muted\" (grey) */\n errorVariant?: \"error\" | \"warning\" | \"success\" | \"muted\"\n /** Additional className for the outer wrapper */\n className?: string\n children: React.ReactNode\n}\n\nconst errorVariantClasses = {\n error: \"text-ods-error\",\n warning: \"text-ods-warning\",\n success: \"text-ods-success\",\n muted: \"text-ods-text-secondary\",\n} as const\n\nconst FieldWrapper = React.forwardRef<HTMLDivElement, FieldWrapperProps>(\n ({ label, error, errorVariant = \"error\", className, children }, ref) => {\n const hasChrome = label != null || error != null\n\n return (\n <div ref={ref} className={cn(hasChrome ? \"relative flex w-full flex-col\" : \"contents\", className)}>\n {label && (\n <label className=\"text-h4 text-ods-text-primary mb-1\">\n {label}\n </label>\n )}\n {children}\n {error && (\n <p className={cn(\"absolute bottom-0 left-0 right-0 translate-y-full text-h6 truncate\", errorVariantClasses[errorVariant])} title={error}>\n {error}\n </p>\n )}\n </div>\n )\n }\n)\nFieldWrapper.displayName = \"FieldWrapper\"\n\nexport { FieldWrapper }\n","\"use client\"\n\nimport * as React from \"react\";\n\nimport { Loader2 } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\nimport { FieldWrapper } from \"./field-wrapper\";\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n /** When true, renders error border & ring */\n invalid?: boolean;\n /** Element displayed at the start (left) of the input */\n startAdornment?: React.ReactNode;\n /** Element displayed at the end (right) of the input */\n endAdornment?: React.ReactNode;\n /** Label text displayed above the input */\n label?: string;\n /** Status message displayed below the input */\n error?: string;\n /** Color variant for the message: \"error\" (red), \"warning\" (yellow), \"success\" (green) or \"muted\" (grey).\n Only \"error\" and \"warning\" mark the field invalid (colored border). */\n errorVariant?: \"error\" | \"warning\" | \"success\" | \"muted\";\n /** When true, shows a loading spinner as end adornment */\n loading?: boolean;\n}\n\nconst invalidBorderClasses = {\n error: \"border-ods-error hover:border-ods-error has-[:focus]:border-ods-error\",\n warning: \"!border-ods-warning hover:!border-ods-warning has-[:focus]:!border-ods-warning\",\n} as const;\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, invalid = false, startAdornment, endAdornment, label, error, errorVariant = \"error\", loading = false, ...props }, ref) => {\n // success/muted are informational — they never paint the invalid border\n const variantIsInvalid = errorVariant === \"error\" || errorVariant === \"warning\"\n const isInvalid = invalid || (!!error && variantIsInvalid)\n\n // Range inputs get a clean slider rendering — no label wrapper, borders, or adornments\n if (type === 'range') {\n const rangeInput = (\n <input\n type=\"range\"\n className={cn(\n \"w-full cursor-pointer appearance-none rounded-full bg-white/30 h-1\",\n // Webkit (Chrome/Safari) thumb\n \"[&::-webkit-slider-thumb]:appearance-none\",\n \"[&::-webkit-slider-thumb]:w-3 [&::-webkit-slider-thumb]:h-3\",\n \"[&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-white\",\n \"[&::-webkit-slider-thumb]:cursor-pointer [&::-webkit-slider-thumb]:shadow-sm\",\n // Firefox thumb\n \"[&::-moz-range-thumb]:w-3 [&::-moz-range-thumb]:h-3\",\n \"[&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:bg-white\",\n \"[&::-moz-range-thumb]:border-0 [&::-moz-range-thumb]:cursor-pointer\",\n // Firefox track\n \"[&::-moz-range-track]:bg-transparent\",\n // Disabled\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n ref={ref}\n {...props}\n />\n )\n return label ? (\n <FieldWrapper label={label} error={error} errorVariant={errorVariant}>\n {rangeInput}\n </FieldWrapper>\n ) : rangeInput\n }\n\n const content = (\n <label\n data-invalid={isInvalid || undefined}\n className={cn(\n // Layout & spacing\n \"flex w-full items-center gap-2 rounded-[6px] border px-3 h-11 md:h-12 cursor-text\",\n // Focus-within states\n \"has-[:focus-visible]:outline-none\",\n \"group\",\n // Animations & touch UX\n \"transition-colors duration-200\",\n // Theme palette\n \"bg-ods-card border-ods-border has-[:focus]:border-ods-accent\",\n // Hover & active (not disabled)\n !props.disabled && \"hover:bg-ods-bg-hover hover:border-ods-border-hover active:bg-ods-bg-active active:border-ods-border-active\",\n // Disabled. The adornments (and any icon inside them) carry their own\n // `text-ods-text-secondary`, so grey them from here — a disabled field\n // must read as one flat colour, not grey text next to a live icon.\n // Scoped to the DIRECT span children (the two adornment wrappers): a\n // descendant rule would also repaint whatever the caller renders INSIDE\n // an adornment, which is passed verbatim precisely so it can own its\n // colour (a `Tag` there went invisible against its own fill).\n props.disabled && \"!cursor-not-allowed bg-ods-bg\",\n \"has-[:disabled]:[&>span]:text-ods-text-disabled has-[:disabled]:[&_svg]:text-ods-text-disabled\",\n // Invalid\n isInvalid && invalidBorderClasses[variantIsInvalid ? (errorVariant as \"error\" | \"warning\") : \"error\"],\n className\n )}\n >\n {startAdornment && (\n <span className=\"text-h6 flex-shrink-0 text-ods-text-secondary transition-colors duration-200 group-has-[:focus]:text-ods-accent group-data-[invalid]:text-ods-error [&_svg]:size-4 md:[&_svg]:size-6\">\n {startAdornment}\n </span>\n )}\n <input\n type={type}\n className={cn(\n // Layout\n \"flex-1 min-w-0 bg-transparent border-none outline-none\",\n // Typography\n \"text-h4\",\n // Colors\n \"text-ods-text-primary placeholder:text-ods-text-secondary\",\n // File input adjustments\n \"file:border-0 file:bg-transparent\",\n // Disabled\n \"disabled:cursor-not-allowed disabled:text-ods-text-disabled disabled:placeholder:text-ods-border\",\n // Touch\n \"touch-manipulation\",\n // Autofill override\n \"[&:-webkit-autofill]:[-webkit-box-shadow:0_0_0_9999px_transparent_inset] [&:-webkit-autofill]:[-webkit-text-fill-color:var(--color-text-primary)] [&:-webkit-autofill]:[caret-color:var(--color-text-primary)] [&:-webkit-autofill]:[transition:background-color_9999s_ease-in-out_0s]\"\n )}\n ref={ref}\n {...props}\n />\n {loading && (\n <Loader2 className=\"animate-spin flex-shrink-0 text-ods-text-secondary size-4 md:size-6\" />\n )}\n {!loading && endAdornment && (\n <span className=\"text-h6 flex-shrink-0 text-ods-text-secondary transition-colors duration-200 group-has-[:focus]:text-ods-accent group-data-[invalid]:text-ods-error [&_svg]:size-4 md:[&_svg]:size-6\">\n {endAdornment}\n </span>\n )}\n </label>\n )\n\n return (\n <FieldWrapper label={label} error={error} errorVariant={errorVariant}>\n {content}\n </FieldWrapper>\n )\n }\n)\nInput.displayName = \"Input\"\n\nexport { Input };\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\"\n\nimport { cn } from \"../../utils/cn\"\nimport { CheckboxCheckmarkIcon } from \"../icons-v2-generated/signs-and-symbols/checkbox-checkmark-icon\"\n\nconst Checkbox = React.forwardRef<\n React.ElementRef<typeof CheckboxPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n className={cn(\n \"peer h-4 w-4 shrink-0 rounded-sm border border-ods-border bg-ods-card focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ods-accent focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-ods-accent data-[state=checked]:border-ods-accent\",\n className\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n className={cn(\"flex items-center justify-center text-ods-text-on-accent\")}\n >\n <CheckboxCheckmarkIcon size={10} />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n))\nCheckbox.displayName = CheckboxPrimitive.Root.displayName\n\nexport { Checkbox }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\n\nimport { cn } from \"../../utils/cn\"\nimport { usePortalContainer } from \"./portal-container\"\n\nconst DropdownMenu = DropdownMenuPrimitive.Root\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"flex cursor-pointer gap-2 select-none items-center rounded-sm px-2 py-1.5 text-h6 outline-none hover:bg-ods-bg-hover focus:bg-ods-bg-hover data-[state=open]:bg-ods-bg-hover [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto\" />\n </DropdownMenuPrimitive.SubTrigger>\n))\nDropdownMenuSubTrigger.displayName =\n DropdownMenuPrimitive.SubTrigger.displayName\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border border-ods-border bg-ods-card p-1 text-ods-text-primary shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuSubContent.displayName =\n DropdownMenuPrimitive.SubContent.displayName\n\nconst DropdownMenuContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => {\n // Portal into the active container (e.g. a drawer) so the menu inherits its\n // stacking context; falls back to `document.body` when none is provided.\n const container = usePortalContainer()\n return (\n <DropdownMenuPrimitive.Portal container={container ?? undefined}>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border border-ods-border bg-ods-card p-1 text-ods-text-primary shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n )\n})\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nconst DropdownMenuItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-h6 outline-none transition-colors text-ods-text-primary hover:bg-ods-bg-hover hover:text-ods-text-primary focus:bg-ods-bg-hover focus:text-ods-text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n \"relative flex cursor-pointer select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-h6 outline-none transition-colors text-ods-text-primary hover:bg-ods-bg-hover hover:text-ods-text-primary focus:bg-ods-bg-hover focus:text-ods-text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n))\nDropdownMenuCheckboxItem.displayName =\n DropdownMenuPrimitive.CheckboxItem.displayName\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n \"relative flex cursor-pointer select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-h6 outline-none transition-colors text-ods-text-primary hover:bg-ods-bg-hover hover:text-ods-text-primary focus:bg-ods-bg-hover focus:text-ods-text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-ods-accent\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n))\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(\n \"px-2 py-1.5 text-h6 font-semibold text-ods-text-secondary\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-ods-border\", className)}\n {...props}\n />\n))\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\n\nconst DropdownMenuShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\"ml-auto text-h6 text-ods-text-secondary opacity-60\", className)}\n {...props}\n />\n )\n}\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\"\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n}\n","'use client'\n\nimport * as React from 'react'\n\n/**\n * The DOM node that Radix overlays (dropdown menus, tooltips) should portal\n * into, instead of the default `document.body`.\n *\n * Portaling to `document.body` lifts content out of every local stacking\n * context, which forces overlays opened *inside* a high-z surface (e.g. the\n * chat drawer) to escalate their own z-index to compete at the document\n * root. Pointing the portal at a node *inside* that surface instead\n * lets the content inherit the surface's stacking context — small, local\n * z-indices then \"just work\" and no escalation is needed. Radix positions\n * content with `strategy: \"fixed\"`, so it still escapes ancestor\n * `overflow: hidden` clipping regardless of where it is portaled.\n *\n * Default `null` → Radix falls back to `document.body` (unchanged behaviour\n * everywhere a provider isn't present).\n */\nexport const PortalContainerContext = React.createContext<HTMLElement | null>(\n null,\n)\n\n/** Read the active portal container (or `null` to use `document.body`). */\nexport function usePortalContainer(): HTMLElement | null {\n return React.useContext(PortalContainerContext)\n}\n","\"use client\"\n\nimport * as React from 'react'\nimport { cn } from \"../../utils/cn\"\n\ninterface SkeletonProps extends React.HTMLAttributes<HTMLDivElement> {\n className?: string\n}\n\nconst Skeleton = React.forwardRef<HTMLDivElement, SkeletonProps>(\n ({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n \"animate-pulse rounded-md bg-ods-border\",\n className\n )}\n {...props}\n />\n )\n }\n)\nSkeleton.displayName = 'Skeleton'\n\ninterface SkeletonTextProps extends React.HTMLAttributes<HTMLDivElement> {\n lines?: number\n className?: string\n}\n\nconst SkeletonText = React.forwardRef<HTMLDivElement, SkeletonTextProps>(\n ({ lines = 1, className, ...props }, ref) => {\n return (\n <div ref={ref} className={cn(\"space-y-2\", className)} {...props}>\n {Array.from({ length: lines }).map((_, i) => (\n <Skeleton \n key={i} \n className={cn(\n \"h-4\",\n i === lines - 1 && lines > 1 && \"w-3/4\" // Last line shorter for multi-line\n )} \n />\n ))}\n </div>\n )\n }\n)\nSkeletonText.displayName = 'SkeletonText'\n\ninterface SkeletonCardProps extends React.HTMLAttributes<HTMLDivElement> {\n showImage?: boolean\n className?: string\n}\n\nconst SkeletonCard = React.forwardRef<HTMLDivElement, SkeletonCardProps>(\n ({ showImage = false, className, ...props }, ref) => {\n return (\n <div \n ref={ref}\n className={cn(\n \"rounded-lg border border-ods-border overflow-hidden\",\n className\n )}\n {...props}\n >\n {showImage && (\n <Skeleton className=\"h-48 w-full\" />\n )}\n <div className=\"p-6\">\n <Skeleton className=\"h-6 w-3/4 mb-4\" />\n <SkeletonText lines={3} />\n </div>\n </div>\n )\n }\n)\nSkeletonCard.displayName = 'SkeletonCard'\n\ninterface SkeletonGridProps extends React.HTMLAttributes<HTMLDivElement> {\n columns?: number\n items?: number\n showImages?: boolean\n className?: string\n}\n\nconst SkeletonGrid = React.forwardRef<HTMLDivElement, SkeletonGridProps>(\n ({ columns = 3, items = 6, showImages = false, className, ...props }, ref) => {\n return (\n <div \n ref={ref}\n className={cn(\n `grid grid-cols-1 gap-6`,\n columns === 2 && \"md:grid-cols-2\",\n columns === 3 && \"md:grid-cols-3\",\n columns === 4 && \"md:grid-cols-4\",\n className\n )}\n {...props}\n >\n {Array.from({ length: items }).map((_, i) => (\n <SkeletonCard key={i} showImage={showImages} />\n ))}\n </div>\n )\n }\n)\nSkeletonGrid.displayName = 'SkeletonGrid'\n\ninterface SkeletonButtonProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: 'sm' | 'default' | 'lg'\n className?: string\n}\n\nconst SkeletonButton = React.forwardRef<HTMLDivElement, SkeletonButtonProps>(\n ({ size = 'default', className, ...props }, ref) => {\n const sizeClasses = {\n sm: 'h-8 w-20',\n default: 'h-10 w-32',\n lg: 'h-12 w-40'\n }\n \n return (\n <Skeleton \n ref={ref}\n className={cn(\n \"rounded-lg\",\n sizeClasses[size],\n className\n )}\n {...props}\n />\n )\n }\n)\nSkeletonButton.displayName = 'SkeletonButton'\n\ninterface SkeletonHeadingProps extends React.HTMLAttributes<HTMLDivElement> {\n level?: 1 | 2 | 3 | 4 | 5 | 6\n className?: string\n}\n\nconst SkeletonHeading = React.forwardRef<HTMLDivElement, SkeletonHeadingProps>(\n ({ level = 1, className, ...props }, ref) => {\n const heightClasses = {\n 1: 'h-12',\n 2: 'h-10',\n 3: 'h-8',\n 4: 'h-7',\n 5: 'h-6',\n 6: 'h-5'\n }\n \n return (\n <Skeleton \n ref={ref}\n className={cn(\n heightClasses[level],\n \"w-3/4\",\n className\n )}\n {...props}\n />\n )\n }\n)\nSkeletonHeading.displayName = 'SkeletonHeading'\n\ninterface SkeletonListProps extends React.HTMLAttributes<HTMLDivElement> {\n items?: number\n className?: string\n}\n\nconst SkeletonList = React.forwardRef<HTMLDivElement, SkeletonListProps>(\n ({ items = 5, className, ...props }, ref) => {\n return (\n <div ref={ref} className={cn(\"space-y-3\", className)} {...props}>\n {Array.from({ length: items }).map((_, i) => (\n <div key={i} className=\"flex items-center gap-3\">\n <Skeleton className=\"h-10 w-10 rounded-full flex-shrink-0\" />\n <div className=\"flex-1\">\n <Skeleton className=\"h-4 w-1/3 mb-1\" />\n <Skeleton className=\"h-3 w-1/2\" />\n </div>\n </div>\n ))}\n </div>\n )\n }\n)\nSkeletonList.displayName = 'SkeletonList'\n\ninterface SkeletonNavigationProps extends React.HTMLAttributes<HTMLDivElement> {\n items?: number\n className?: string\n}\n\nconst SkeletonNavigation = React.forwardRef<HTMLDivElement, SkeletonNavigationProps>(\n ({ items = 6, className, ...props }, ref) => {\n return (\n <div ref={ref} className={cn(\"flex items-center gap-6\", className)} {...props}>\n {Array.from({ length: items }).map((_, i) => (\n <Skeleton key={i} className=\"h-5 w-20\" />\n ))}\n </div>\n )\n }\n)\nSkeletonNavigation.displayName = 'SkeletonNavigation'\n\nexport { \n Skeleton,\n SkeletonText,\n SkeletonCard,\n SkeletonGrid,\n SkeletonButton,\n SkeletonHeading,\n SkeletonList,\n SkeletonNavigation\n}"]}
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var _chunkNNQMA3N6cjs = require('./chunk-NNQMA3N6.cjs');
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var _chunkCQ6O6ER2cjs = require('./chunk-CQ6O6ER2.cjs');
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
|
|
@@ -19,13 +19,13 @@ var _chunk72DF3QTAcjs = require('./chunk-72DF3QTA.cjs');
|
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
|
|
22
|
-
var
|
|
22
|
+
var _chunkX5USQ6UCcjs = require('./chunk-X5USQ6UC.cjs');
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
|
|
27
27
|
|
|
28
|
-
var
|
|
28
|
+
var _chunkC6Q3BJDJcjs = require('./chunk-C6Q3BJDJ.cjs');
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
var _chunkLILQJ3UZcjs = require('./chunk-LILQJ3UZ.cjs');
|
|
@@ -1043,9 +1043,9 @@ function useDocNavigation() {
|
|
|
1043
1043
|
function scrollToContent() {
|
|
1044
1044
|
const article = document.querySelector("article");
|
|
1045
1045
|
if (article) {
|
|
1046
|
-
|
|
1046
|
+
_chunkC6Q3BJDJcjs.scrollElementIntoView.call(void 0, article, { headerOffset: _chunkC6Q3BJDJcjs.HUB_HEADER_OFFSET_PX });
|
|
1047
1047
|
} else {
|
|
1048
|
-
|
|
1048
|
+
_chunkC6Q3BJDJcjs.scrollElementIntoView.call(void 0, document.documentElement);
|
|
1049
1049
|
}
|
|
1050
1050
|
}
|
|
1051
1051
|
function findFirstDocPath(folder) {
|
|
@@ -1065,8 +1065,8 @@ function findFirstDocPath(folder) {
|
|
|
1065
1065
|
}
|
|
1066
1066
|
function useDocumentTree(config, initialPath) {
|
|
1067
1067
|
const { structureEndpoint, contentEndpoint, baseRoute } = config;
|
|
1068
|
-
const folderIndexFile = _nullishCoalesce(config.folderIndexFile, () => (
|
|
1069
|
-
const cleanInitialPath =
|
|
1068
|
+
const folderIndexFile = _nullishCoalesce(config.folderIndexFile, () => ( _chunkX5USQ6UCcjs.DEFAULT_FOLDER_INDEX_FILE));
|
|
1069
|
+
const cleanInitialPath = _chunkX5USQ6UCcjs.stripFolderIndexFromPath.call(void 0,
|
|
1070
1070
|
_optionalChain([initialPath, 'optionalAccess', _2 => _2.replace, 'call', _3 => _3(/\/$/, "")]) || "",
|
|
1071
1071
|
folderIndexFile
|
|
1072
1072
|
);
|
|
@@ -1092,12 +1092,12 @@ function useDocumentTree(config, initialPath) {
|
|
|
1092
1092
|
} else if (pathname.startsWith(`${normalizedBaseRoute}/`)) {
|
|
1093
1093
|
pathFromUrl = pathname.substring(`${normalizedBaseRoute}/`.length);
|
|
1094
1094
|
}
|
|
1095
|
-
pathFromUrl =
|
|
1095
|
+
pathFromUrl = _chunkX5USQ6UCcjs.stripFolderIndexFromPath.call(void 0, pathFromUrl, folderIndexFile);
|
|
1096
1096
|
if (pathFromUrl !== selectedPathRef.current) {
|
|
1097
1097
|
setSelectedPath(pathFromUrl);
|
|
1098
1098
|
if (pathFromUrl) {
|
|
1099
1099
|
const parentPath = pathFromUrl.includes("/") ? pathFromUrl.substring(0, pathFromUrl.lastIndexOf("/")) : pathFromUrl;
|
|
1100
|
-
setExpandedNodes(new Set(
|
|
1100
|
+
setExpandedNodes(new Set(_chunkX5USQ6UCcjs.getDocAncestorNodeIds.call(void 0, parentPath)));
|
|
1101
1101
|
}
|
|
1102
1102
|
setTimeout(() => {
|
|
1103
1103
|
scrollToContent();
|
|
@@ -1112,7 +1112,7 @@ function useDocumentTree(config, initialPath) {
|
|
|
1112
1112
|
setSelectedPath(cleanInitialPath);
|
|
1113
1113
|
if (cleanInitialPath) {
|
|
1114
1114
|
const parentPath = cleanInitialPath.includes("/") ? cleanInitialPath.substring(0, cleanInitialPath.lastIndexOf("/")) : cleanInitialPath;
|
|
1115
|
-
setExpandedNodes(new Set(
|
|
1115
|
+
setExpandedNodes(new Set(_chunkX5USQ6UCcjs.getDocAncestorNodeIds.call(void 0, parentPath)));
|
|
1116
1116
|
}
|
|
1117
1117
|
setTimeout(scrollToContent, 150);
|
|
1118
1118
|
}, [cleanInitialPath]);
|
|
@@ -1132,7 +1132,7 @@ function useDocumentTree(config, initialPath) {
|
|
|
1132
1132
|
if (selectedPath === "") {
|
|
1133
1133
|
pathToFetch = folderIndexFile;
|
|
1134
1134
|
} else {
|
|
1135
|
-
const node =
|
|
1135
|
+
const node = _chunkX5USQ6UCcjs.findDocNodeByPath.call(void 0, selectedPath, structure);
|
|
1136
1136
|
if (node && node.type === "folder" && !node.hasReadme) {
|
|
1137
1137
|
const firstDocPath = findFirstDocPath(node);
|
|
1138
1138
|
if (!firstDocPath) {
|
|
@@ -1164,7 +1164,7 @@ function useDocumentTree(config, initialPath) {
|
|
|
1164
1164
|
try {
|
|
1165
1165
|
setIsLoadingStructure(true);
|
|
1166
1166
|
setError(null);
|
|
1167
|
-
const response = await
|
|
1167
|
+
const response = await _chunkC6Q3BJDJcjs.contentFetch.call(void 0, structureEndpoint);
|
|
1168
1168
|
if (!response.ok) {
|
|
1169
1169
|
throw new Error("Failed to load documentation structure");
|
|
1170
1170
|
}
|
|
@@ -1174,7 +1174,7 @@ function useDocumentTree(config, initialPath) {
|
|
|
1174
1174
|
if (cleanInitialPath) {
|
|
1175
1175
|
const pathForExpansion = cleanInitialPath.includes(".") ? cleanInitialPath.substring(0, cleanInitialPath.lastIndexOf("/")) : cleanInitialPath;
|
|
1176
1176
|
if (pathForExpansion) {
|
|
1177
|
-
setExpandedNodes(new Set(
|
|
1177
|
+
setExpandedNodes(new Set(_chunkX5USQ6UCcjs.getDocAncestorNodeIds.call(void 0, pathForExpansion)));
|
|
1178
1178
|
}
|
|
1179
1179
|
} else if (result.data.length > 0) {
|
|
1180
1180
|
const hasRootReadme = result.data.some(
|
|
@@ -1204,7 +1204,7 @@ function useDocumentTree(config, initialPath) {
|
|
|
1204
1204
|
const fetchContent = async (path) => {
|
|
1205
1205
|
try {
|
|
1206
1206
|
setIsLoadingContent(true);
|
|
1207
|
-
const response = await
|
|
1207
|
+
const response = await _chunkC6Q3BJDJcjs.contentFetch.call(void 0, `${contentEndpoint}?path=${encodeURIComponent(path)}`);
|
|
1208
1208
|
if (path !== lastFetchedPath.current) return;
|
|
1209
1209
|
if (!response.ok) {
|
|
1210
1210
|
if (response.status === 404) {
|
|
@@ -1216,8 +1216,8 @@ function useDocumentTree(config, initialPath) {
|
|
|
1216
1216
|
setContent(null);
|
|
1217
1217
|
return;
|
|
1218
1218
|
}
|
|
1219
|
-
const probe =
|
|
1220
|
-
|
|
1219
|
+
const probe = _chunkX5USQ6UCcjs.findDocNodeByPath.call(void 0,
|
|
1220
|
+
_chunkX5USQ6UCcjs.stripFolderIndexFromPath.call(void 0, path, folderIndexFile),
|
|
1221
1221
|
structure
|
|
1222
1222
|
);
|
|
1223
1223
|
const probeIsNoReadmeFolder = !!probe && probe.type === "folder" && !probe.hasReadme;
|
|
@@ -1274,16 +1274,16 @@ function useDocumentTree(config, initialPath) {
|
|
|
1274
1274
|
if (node.type === "folder") {
|
|
1275
1275
|
setExpandedNodes((prev) => {
|
|
1276
1276
|
if (prev.has(node.id)) {
|
|
1277
|
-
const ancestorIds =
|
|
1277
|
+
const ancestorIds = _chunkX5USQ6UCcjs.getDocAncestorNodeIds.call(void 0, node.path);
|
|
1278
1278
|
ancestorIds.pop();
|
|
1279
1279
|
return new Set(ancestorIds);
|
|
1280
1280
|
}
|
|
1281
|
-
return new Set(
|
|
1281
|
+
return new Set(_chunkX5USQ6UCcjs.getDocAncestorNodeIds.call(void 0, node.path));
|
|
1282
1282
|
});
|
|
1283
1283
|
} else {
|
|
1284
1284
|
const lastSlash = node.path.lastIndexOf("/");
|
|
1285
1285
|
if (lastSlash > 0) {
|
|
1286
|
-
setExpandedNodes(new Set(
|
|
1286
|
+
setExpandedNodes(new Set(_chunkX5USQ6UCcjs.getDocAncestorNodeIds.call(void 0, node.path.substring(0, lastSlash))));
|
|
1287
1287
|
}
|
|
1288
1288
|
}
|
|
1289
1289
|
lastFetchedPath.current = null;
|
|
@@ -1295,9 +1295,9 @@ function useDocumentTree(config, initialPath) {
|
|
|
1295
1295
|
const hashIndex = path.indexOf("#");
|
|
1296
1296
|
const anchor = hashIndex !== -1 ? path.substring(hashIndex) : "";
|
|
1297
1297
|
const cleanPath = path.replace(/\/$/, "").split("#")[0];
|
|
1298
|
-
const pathForSelection = anchor && _optionalChain([options, 'optionalAccess', _4 => _4.fromInternalLink]) && cleanPath === "" ? selectedPathRef.current :
|
|
1298
|
+
const pathForSelection = anchor && _optionalChain([options, 'optionalAccess', _4 => _4.fromInternalLink]) && cleanPath === "" ? selectedPathRef.current : _chunkX5USQ6UCcjs.stripFolderIndexFromPath.call(void 0, cleanPath, folderIndexFile);
|
|
1299
1299
|
if (anchor && _optionalChain([options, 'optionalAccess', _5 => _5.fromInternalLink]) && pathForSelection === selectedPathRef.current) {
|
|
1300
|
-
|
|
1300
|
+
_chunkC6Q3BJDJcjs.navigateSamePageHash.call(void 0, anchor, { headerOffset: _chunkC6Q3BJDJcjs.HUB_HEADER_OFFSET_PX });
|
|
1301
1301
|
return;
|
|
1302
1302
|
}
|
|
1303
1303
|
const scrollAfterNav = () => {
|
|
@@ -1305,7 +1305,7 @@ function useDocumentTree(config, initialPath) {
|
|
|
1305
1305
|
setTimeout(() => {
|
|
1306
1306
|
const el = document.getElementById(anchor.substring(1));
|
|
1307
1307
|
if (el) {
|
|
1308
|
-
|
|
1308
|
+
_chunkC6Q3BJDJcjs.scrollElementIntoView.call(void 0, el, { headerOffset: _chunkC6Q3BJDJcjs.HUB_HEADER_OFFSET_PX });
|
|
1309
1309
|
} else {
|
|
1310
1310
|
scrollToContent();
|
|
1311
1311
|
}
|
|
@@ -1357,8 +1357,8 @@ function useDocumentTree(config, initialPath) {
|
|
|
1357
1357
|
return docNavigation.register({
|
|
1358
1358
|
baseRoute: normalizedBaseRoute,
|
|
1359
1359
|
findNodeByPath: (path) => {
|
|
1360
|
-
const clean =
|
|
1361
|
-
return _nullishCoalesce(
|
|
1360
|
+
const clean = _chunkX5USQ6UCcjs.stripFolderIndexFromPath.call(void 0, path.replace(/\/$/, "").split("#")[0], folderIndexFile);
|
|
1361
|
+
return _nullishCoalesce(_chunkX5USQ6UCcjs.findDocNodeByPath.call(void 0, clean, structure), () => ( null));
|
|
1362
1362
|
},
|
|
1363
1363
|
selectNode
|
|
1364
1364
|
});
|
|
@@ -1399,7 +1399,7 @@ function useScrollSpy(sections) {
|
|
|
1399
1399
|
if (!targetElement) return;
|
|
1400
1400
|
isScrollingFromClick.current = true;
|
|
1401
1401
|
setActiveSection(sectionId);
|
|
1402
|
-
|
|
1402
|
+
_chunkC6Q3BJDJcjs.scrollElementIntoView.call(void 0, targetElement, { headerOffset: SCROLL_OFFSET });
|
|
1403
1403
|
setTimeout(() => {
|
|
1404
1404
|
isScrollingFromClick.current = false;
|
|
1405
1405
|
}, 800);
|
|
@@ -1443,7 +1443,7 @@ function useDocsResolveLink(sourceId, resolveLinkEndpoint) {
|
|
|
1443
1443
|
return _react.useCallback.call(void 0,
|
|
1444
1444
|
async (href, currentPath) => {
|
|
1445
1445
|
try {
|
|
1446
|
-
const response = await
|
|
1446
|
+
const response = await _chunkC6Q3BJDJcjs.contentFetch.call(void 0, resolvedResolveLinkEndpoint, {
|
|
1447
1447
|
method: "POST",
|
|
1448
1448
|
headers: { "Content-Type": "application/json" },
|
|
1449
1449
|
body: JSON.stringify({ link: href, currentPath, source: sourceId })
|
|
@@ -1531,7 +1531,7 @@ function DocViewerContent({
|
|
|
1531
1531
|
label: _nullishCoalesce(_optionalChain([backButton, 'optionalAccess', _23 => _23.label]), () => ( "Back to home")),
|
|
1532
1532
|
onClick: () => router.push(_nullishCoalesce(_optionalChain([backButton, 'optionalAccess', _24 => _24.href]), () => ( "/")))
|
|
1533
1533
|
};
|
|
1534
|
-
const docSearch =
|
|
1534
|
+
const docSearch = _chunkCQ6O6ER2cjs.useDocSearch.call(void 0, {
|
|
1535
1535
|
source: chatSource,
|
|
1536
1536
|
baseRoute,
|
|
1537
1537
|
searchEndpoint,
|
|
@@ -1555,7 +1555,7 @@ function DocViewerContent({
|
|
|
1555
1555
|
onResolveLink: resolveLink
|
|
1556
1556
|
});
|
|
1557
1557
|
}, [content, renderContent, navigateToDoc, sourceId, resolveLink]);
|
|
1558
|
-
const selectedNodeDocType = selectedPath && structure.length > 0 ? _optionalChain([
|
|
1558
|
+
const selectedNodeDocType = selectedPath && structure.length > 0 ? _optionalChain([_chunkX5USQ6UCcjs.findDocNodeByPath.call(void 0, selectedPath, structure), 'optionalAccess', _25 => _25.documentType]) : void 0;
|
|
1559
1559
|
const activeDocType = _nullishCoalesce(_optionalChain([content, 'optionalAccess', _26 => _26.documentType]), () => ( selectedNodeDocType));
|
|
1560
1560
|
const isMarkdownContent = !activeDocType || activeDocType === "markdown";
|
|
1561
1561
|
const showStickyNav = isMarkdownContent;
|
|
@@ -1566,9 +1566,9 @@ function DocViewerContent({
|
|
|
1566
1566
|
const containerBgStyle = colorPalette.containerBackground !== "transparent" ? { backgroundColor: colorPalette.containerBackground } : {};
|
|
1567
1567
|
const defaultEmptyText = structure.length > 0 ? "Select a document from the sidebar to view" : "No documents yet. Add content from the admin panel.";
|
|
1568
1568
|
const resolvedEmptyText = emptyStateText || defaultEmptyText;
|
|
1569
|
-
const inner = /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { style: { ...bgStyle, ...containerBgStyle }, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1569
|
+
const inner = /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { style: { ...bgStyle, ...containerBgStyle }, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkX5USQ6UCcjs.PageLayout, { title, subtitle, titleSize: "h1", titleWrap: true, backButton: _nullishCoalesce(backCfg, () => ( void 0)), children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "w-full flex flex-col gap-10", children: [
|
|
1570
1570
|
showAIChat && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1571
|
-
|
|
1571
|
+
_chunkCQ6O6ER2cjs.DocSearchBar,
|
|
1572
1572
|
{
|
|
1573
1573
|
placeholder: `Search ${_optionalChain([sidebarLabel, 'optionalAccess', _30 => _30.toLowerCase, 'call', _31 => _31()]) || "documents"}...`,
|
|
1574
1574
|
query: docSearch.query,
|
|
@@ -1589,7 +1589,7 @@ function DocViewerContent({
|
|
|
1589
1589
|
!error && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col lg:flex-row gap-6 lg:gap-10 items-start flex-1", children: [
|
|
1590
1590
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "w-full lg:w-[320px] lg:shrink-0", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "lg:sticky lg:top-20", children: isLoadingStructure ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, CategorySidebarSkeleton, {}) : /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
|
|
1591
1591
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, PersistentMobileDropdown, { isLoading: false, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1592
|
-
|
|
1592
|
+
_chunkX5USQ6UCcjs.MobileNavigationDropdown,
|
|
1593
1593
|
{
|
|
1594
1594
|
nodes: structure,
|
|
1595
1595
|
selectedPath,
|
|
@@ -1603,7 +1603,7 @@ function DocViewerContent({
|
|
|
1603
1603
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, PersistentSidebar, { isLoading: false, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "hidden lg:block", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "space-y-4", children: [
|
|
1604
1604
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h3", { className: "text-h5 font-semibold text-ods-text-secondary", children: sidebarLabel }),
|
|
1605
1605
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1606
|
-
|
|
1606
|
+
_chunkX5USQ6UCcjs.MultiLevelNavigation,
|
|
1607
1607
|
{
|
|
1608
1608
|
nodes: structure,
|
|
1609
1609
|
selectedPath,
|
|
@@ -1648,7 +1648,7 @@ function DocViewerContent({
|
|
|
1648
1648
|
showStickyNav && content && stickyNavSections.length > 0 && !isLoadingContent && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "hidden lg:block", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "sticky top-24", children: [
|
|
1649
1649
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h3", { className: "text-h5 font-semibold text-ods-text-secondary mb-4", children: "ON THIS PAGE" }),
|
|
1650
1650
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1651
|
-
|
|
1651
|
+
_chunkX5USQ6UCcjs.StickySectionNav,
|
|
1652
1652
|
{
|
|
1653
1653
|
sections: stickyNavSections,
|
|
1654
1654
|
activeSection,
|
|
@@ -1663,7 +1663,7 @@ function DocViewerContent({
|
|
|
1663
1663
|
) })
|
|
1664
1664
|
] })
|
|
1665
1665
|
] }) }) });
|
|
1666
|
-
return shell ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1666
|
+
return shell ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkX5USQ6UCcjs.PageShell, { contentClassName: `${bgClass} ${className}`, children: inner }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: `page-shell-content ${bgClass} ${className}`.trim(), children: inner });
|
|
1667
1667
|
}
|
|
1668
1668
|
|
|
1669
1669
|
// src/components/docs/skeletons.tsx
|
|
@@ -1759,11 +1759,11 @@ function EmbedSkeleton({ documentType } = {}) {
|
|
|
1759
1759
|
|
|
1760
1760
|
var DEFAULT_TITLE = "Documents";
|
|
1761
1761
|
var defaultFallbackRenderer = () => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "text-center py-16", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-ods-text-secondary", children: "Unsupported document type" }) });
|
|
1762
|
-
var defaultPdfRenderer = (content, handlers) => content.fileUrl ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1763
|
-
var defaultGoogleSheetRenderer = (content, handlers) => content.externalUrl ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1764
|
-
var defaultFigmaRenderer = (content, handlers) => content.externalUrl ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1762
|
+
var defaultPdfRenderer = (content, handlers) => content.fileUrl ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkNNQMA3N6cjs.PdfViewer, { src: content.fileUrl, fileName: content.fileName }) : defaultFallbackRenderer(content, handlers);
|
|
1763
|
+
var defaultGoogleSheetRenderer = (content, handlers) => content.externalUrl ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkNNQMA3N6cjs.GoogleSheetsViewer, { externalUrl: content.externalUrl, fileName: content.fileName }) : defaultFallbackRenderer(content, handlers);
|
|
1764
|
+
var defaultFigmaRenderer = (content, handlers) => content.externalUrl ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkX5USQ6UCcjs.FigmaEmbed, { url: content.externalUrl, title: content.fileName, loading: "eager" }) : defaultFallbackRenderer(content, handlers);
|
|
1765
1765
|
var defaultFileRenderer = (content) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
1766
|
-
|
|
1766
|
+
_chunkNNQMA3N6cjs.FileDownloadCard,
|
|
1767
1767
|
{
|
|
1768
1768
|
fileName: content.fileName,
|
|
1769
1769
|
mimeType: content.mimeType,
|
|
@@ -1845,4 +1845,4 @@ function DocsHubPage({
|
|
|
1845
1845
|
|
|
1846
1846
|
|
|
1847
1847
|
exports.PersistentFilterControls = PersistentFilterControls; exports.PersistentSearchContainer = PersistentSearchContainer; exports.PersistentSidebar = PersistentSidebar; exports.PersistentMobileDropdown = PersistentMobileDropdown; exports.UnifiedSkeleton = UnifiedSkeleton; exports.TextSkeleton = TextSkeleton; exports.InteractiveSkeleton = InteractiveSkeleton; exports.MediaSkeleton = MediaSkeleton; exports.CardSkeleton = CardSkeleton; exports.CardSkeletonGrid = CardSkeletonGrid; exports.AnnouncementBarSkeleton = AnnouncementBarSkeleton; exports.HeroSkeleton = HeroSkeleton; exports.SearchContainerSkeleton = SearchContainerSkeleton; exports.CategorySidebarSkeleton = CategorySidebarSkeleton; exports.BreadcrumbSkeleton = BreadcrumbSkeleton; exports.ResultsHeaderSkeleton = ResultsHeaderSkeleton; exports.TwoColumnLayoutSkeleton = TwoColumnLayoutSkeleton; exports.ArticleLayoutSkeleton = ArticleLayoutSkeleton; exports.VendorDetailLayoutSkeleton = VendorDetailLayoutSkeleton; exports.StatsSectionSkeleton = StatsSectionSkeleton; exports.BlogCardGridSkeleton = BlogCardGridSkeleton; exports.VendorGridSkeleton = VendorGridSkeleton; exports.SlackCommunitySkeleton = SlackCommunitySkeleton; exports.DocNavigationProvider = DocNavigationProvider; exports.useDocNavigation = useDocNavigation; exports.useDocumentTree = useDocumentTree; exports.useScrollSpy = useScrollSpy; exports.DocViewer = DocViewer; exports.MarkdownSkeleton = MarkdownSkeleton; exports.EmbedSkeleton = EmbedSkeleton; exports.DocsHubPage = DocsHubPage;
|
|
1848
|
-
//# sourceMappingURL=chunk-
|
|
1848
|
+
//# sourceMappingURL=chunk-US2F5GJO.cjs.map
|