@flamingo-stack/openframe-frontend-core 0.0.285 → 0.0.286
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-3MCHAFHB.js +89 -0
- package/dist/chunk-3MCHAFHB.js.map +1 -0
- package/dist/{chunk-IMNGGLKL.js → chunk-3ZXUQQL4.js} +2 -2
- package/dist/{chunk-44ZFLMYC.cjs → chunk-4WACBTZU.cjs} +30 -30
- package/dist/{chunk-44ZFLMYC.cjs.map → chunk-4WACBTZU.cjs.map} +1 -1
- package/dist/{chunk-23UOJUDF.js → chunk-5BTZOVDQ.js} +4 -4
- package/dist/chunk-5KD3S25X.cjs +312 -0
- package/dist/chunk-5KD3S25X.cjs.map +1 -0
- package/dist/chunk-6N26CURS.cjs +2417 -0
- package/dist/chunk-6N26CURS.cjs.map +1 -0
- package/dist/{chunk-XX7P4IL2.js → chunk-7NM7DEUK.js} +4 -143
- package/dist/chunk-7NM7DEUK.js.map +1 -0
- package/dist/chunk-BBZ7AX5H.cjs +290 -0
- package/dist/chunk-BBZ7AX5H.cjs.map +1 -0
- package/dist/chunk-C6SCWXDP.js +290 -0
- package/dist/chunk-C6SCWXDP.js.map +1 -0
- package/dist/{chunk-GVSTRN36.cjs → chunk-D3LEFMOA.cjs} +3 -3
- package/dist/{chunk-GVSTRN36.cjs.map → chunk-D3LEFMOA.cjs.map} +1 -1
- package/dist/{chunk-P45Q4QCU.cjs → chunk-D5YY5U6J.cjs} +19 -15
- package/dist/chunk-D5YY5U6J.cjs.map +1 -0
- package/dist/chunk-DDAT4RKX.js +2417 -0
- package/dist/chunk-DDAT4RKX.js.map +1 -0
- package/dist/{chunk-PVXCVPJD.cjs → chunk-EI4WALN2.cjs} +67 -1626
- package/dist/chunk-EI4WALN2.cjs.map +1 -0
- package/dist/{chunk-ZIODAAFY.cjs → chunk-EL5GCMPU.cjs} +20 -159
- package/dist/chunk-EL5GCMPU.cjs.map +1 -0
- package/dist/{chunk-VQW7CEGS.js → chunk-FSBDVT6R.js} +1831 -3672
- package/dist/chunk-FSBDVT6R.js.map +1 -0
- package/dist/{chunk-DPKUSBQH.cjs → chunk-GDF2R2ER.cjs} +1073 -2914
- package/dist/chunk-GDF2R2ER.cjs.map +1 -0
- package/dist/chunk-HLQW7MWJ.cjs +1594 -0
- package/dist/chunk-HLQW7MWJ.cjs.map +1 -0
- package/dist/chunk-I6ZPGKZ2.cjs +151 -0
- package/dist/chunk-I6ZPGKZ2.cjs.map +1 -0
- package/dist/{chunk-J66U3LPZ.cjs → chunk-KBKZYJRI.cjs} +33 -332
- package/dist/chunk-KBKZYJRI.cjs.map +1 -0
- package/dist/{chunk-USPATRSC.js → chunk-N6ZM5PYZ.js} +45 -344
- package/dist/chunk-N6ZM5PYZ.js.map +1 -0
- package/dist/{chunk-RGALV4UX.js → chunk-POKKCWKF.js} +3 -82
- package/dist/chunk-POKKCWKF.js.map +1 -0
- package/dist/{chunk-XDI5JSWB.cjs → chunk-QCKN37OP.cjs} +45 -41
- package/dist/chunk-QCKN37OP.cjs.map +1 -0
- package/dist/{chunk-KNCDUWY2.js → chunk-QF2X6PTD.js} +10 -6
- package/dist/{chunk-KNCDUWY2.js.map → chunk-QF2X6PTD.js.map} +1 -1
- package/dist/{chunk-Z3V2SGQZ.js → chunk-R2KT5GDD.js} +324 -1883
- package/dist/chunk-R2KT5GDD.js.map +1 -0
- package/dist/{chunk-RJUGNL2A.cjs → chunk-RQ6RTBKF.cjs} +16 -12
- package/dist/chunk-RQ6RTBKF.cjs.map +1 -0
- package/dist/chunk-TFSYSWPS.cjs +89 -0
- package/dist/chunk-TFSYSWPS.cjs.map +1 -0
- package/dist/chunk-TYZEMPPH.js +312 -0
- package/dist/chunk-TYZEMPPH.js.map +1 -0
- package/dist/{chunk-O5N57CRV.js → chunk-VCQ3CTYK.js} +12 -8
- package/dist/{chunk-O5N57CRV.js.map → chunk-VCQ3CTYK.js.map} +1 -1
- package/dist/chunk-VRSXJ5QJ.js +1599 -0
- package/dist/chunk-VRSXJ5QJ.js.map +1 -0
- package/dist/{chunk-53CFL7PH.js → chunk-XQL4WDML.js} +11 -7
- package/dist/{chunk-53CFL7PH.js.map → chunk-XQL4WDML.js.map} +1 -1
- package/dist/chunk-Y4JNA4W6.cjs +1599 -0
- package/dist/chunk-Y4JNA4W6.cjs.map +1 -0
- package/dist/{chunk-ZSUNQJRO.cjs → chunk-YETA25JW.cjs} +2 -81
- package/dist/chunk-YETA25JW.cjs.map +1 -0
- package/dist/chunk-YVB3VDIQ.js +1594 -0
- package/dist/chunk-YVB3VDIQ.js.map +1 -0
- package/dist/chunk-ZLN6SM2U.js +151 -0
- package/dist/chunk-ZLN6SM2U.js.map +1 -0
- package/dist/components/chat/chat-attachment-bar.d.ts.map +1 -1
- package/dist/components/chat/index.cjs +12 -6
- package/dist/components/chat/index.cjs.map +1 -1
- package/dist/components/chat/index.js +45 -39
- package/dist/components/contact/index.cjs +11 -7
- package/dist/components/contact/index.cjs.map +1 -1
- package/dist/components/contact/index.js +10 -6
- package/dist/components/docs/doc-navigation-context.d.ts +39 -0
- package/dist/components/docs/doc-navigation-context.d.ts.map +1 -0
- package/dist/components/docs/doc-viewer.d.ts +66 -0
- package/dist/components/docs/doc-viewer.d.ts.map +1 -0
- package/dist/components/docs/index.cjs +34 -0
- package/dist/components/docs/index.cjs.map +1 -0
- package/dist/components/docs/index.d.ts +8 -0
- package/dist/components/docs/index.d.ts.map +1 -0
- package/dist/components/docs/index.js +34 -0
- package/dist/components/docs/index.js.map +1 -0
- package/dist/components/docs/use-document-tree.d.ts +41 -0
- package/dist/components/docs/use-document-tree.d.ts.map +1 -0
- package/dist/components/docs/use-scroll-spy.d.ts +16 -0
- package/dist/components/docs/use-scroll-spy.d.ts.map +1 -0
- package/dist/components/embeds/embed-iframe.d.ts +29 -0
- package/dist/components/embeds/embed-iframe.d.ts.map +1 -0
- package/dist/components/embeds/figma-embed.d.ts +27 -0
- package/dist/components/embeds/figma-embed.d.ts.map +1 -0
- package/dist/components/embeds/google-sheets-viewer.d.ts +8 -0
- package/dist/components/embeds/google-sheets-viewer.d.ts.map +1 -0
- package/dist/components/embeds/index.cjs +37 -0
- package/dist/components/embeds/index.cjs.map +1 -0
- package/dist/components/embeds/index.d.ts +9 -0
- package/dist/components/embeds/index.d.ts.map +1 -0
- package/dist/components/embeds/index.js +37 -0
- package/dist/components/embeds/index.js.map +1 -0
- package/dist/components/embeds/pdf-viewer.d.ts +10 -0
- package/dist/components/embeds/pdf-viewer.d.ts.map +1 -0
- package/dist/components/faq/index.cjs +12 -8
- package/dist/components/faq/index.cjs.map +1 -1
- package/dist/components/faq/index.js +11 -7
- package/dist/components/features/index.cjs +10 -6
- package/dist/components/features/index.cjs.map +1 -1
- package/dist/components/features/index.js +9 -5
- package/dist/components/index.cjs +247 -1120
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +645 -1518
- package/dist/components/index.js.map +1 -1
- package/dist/components/navigation/index.cjs +15 -6
- package/dist/components/navigation/index.cjs.map +1 -1
- package/dist/components/navigation/index.d.ts +2 -0
- package/dist/components/navigation/index.d.ts.map +1 -1
- package/dist/components/navigation/index.js +15 -6
- package/dist/components/navigation/multi-level-navigation.d.ts +28 -0
- package/dist/components/navigation/multi-level-navigation.d.ts.map +1 -0
- package/dist/components/onboarding-guides/index.cjs +34 -29
- package/dist/components/onboarding-guides/index.cjs.map +1 -1
- package/dist/components/onboarding-guides/index.js +13 -8
- package/dist/components/onboarding-guides/index.js.map +1 -1
- package/dist/components/related-content/index.cjs +12 -8
- package/dist/components/related-content/index.cjs.map +1 -1
- package/dist/components/related-content/index.js +11 -7
- package/dist/components/tickets/index.cjs +75 -70
- package/dist/components/tickets/index.cjs.map +1 -1
- package/dist/components/tickets/index.js +16 -11
- package/dist/components/tickets/index.js.map +1 -1
- package/dist/components/ui/index.cjs +12 -6
- package/dist/components/ui/index.cjs.map +1 -1
- package/dist/components/ui/index.js +65 -59
- package/dist/embed-shims/index.cjs +3 -3
- package/dist/embed-shims/index.cjs.map +1 -1
- package/dist/embed-shims/index.js +8 -8
- package/dist/hooks/index.cjs +6 -3
- package/dist/hooks/index.cjs.map +1 -1
- package/dist/hooks/index.js +7 -4
- package/dist/index.cjs +62 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +257 -201
- package/dist/types/doc-source.cjs +4 -0
- package/dist/types/doc-source.cjs.map +1 -0
- package/dist/types/doc-source.d.ts +86 -0
- package/dist/types/doc-source.d.ts.map +1 -0
- package/dist/types/doc-source.js +3 -0
- package/dist/types/doc-source.js.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/doc-path-utils.d.ts +24 -0
- package/dist/utils/doc-path-utils.d.ts.map +1 -0
- package/dist/utils/doc-tree-nav.d.ts +35 -0
- package/dist/utils/doc-tree-nav.d.ts.map +1 -0
- package/dist/utils/embed-url-converters.d.ts +16 -0
- package/dist/utils/embed-url-converters.d.ts.map +1 -0
- package/dist/utils/format.d.ts +9 -0
- package/dist/utils/format.d.ts.map +1 -1
- package/dist/utils/index.cjs +297 -0
- package/dist/utils/index.cjs.map +1 -1
- package/dist/utils/index.d.ts +7 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +276 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/markdown-section-extractor.d.ts +23 -0
- package/dist/utils/markdown-section-extractor.d.ts.map +1 -0
- package/dist/utils/markdown-to-plain.d.ts +32 -0
- package/dist/utils/markdown-to-plain.d.ts.map +1 -0
- package/dist/utils/tree-builder.d.ts +30 -0
- package/dist/utils/tree-builder.d.ts.map +1 -0
- package/package.json +19 -1
- package/src/components/chat/chat-attachment-bar.tsx +6 -11
- package/src/components/docs/doc-navigation-context.tsx +123 -0
- package/src/components/docs/doc-viewer.tsx +345 -0
- package/src/components/docs/index.ts +12 -0
- package/src/components/docs/use-document-tree.ts +427 -0
- package/src/components/docs/use-scroll-spy.ts +93 -0
- package/src/components/embeds/embed-iframe.tsx +103 -0
- package/src/components/embeds/figma-embed.tsx +147 -0
- package/src/components/embeds/google-sheets-viewer.tsx +54 -0
- package/src/components/embeds/index.ts +11 -0
- package/src/components/embeds/pdf-viewer.tsx +64 -0
- package/src/components/index.ts +2 -0
- package/src/components/navigation/index.ts +5 -0
- package/src/components/navigation/multi-level-navigation.tsx +358 -0
- package/src/types/doc-source.ts +88 -0
- package/src/types/index.ts +4 -0
- package/src/utils/doc-path-utils.ts +47 -0
- package/src/utils/doc-tree-nav.ts +111 -0
- package/src/utils/embed-url-converters.ts +77 -0
- package/src/utils/format.ts +16 -0
- package/src/utils/index.ts +11 -0
- package/src/utils/markdown-section-extractor.ts +106 -0
- package/src/utils/markdown-to-plain.ts +69 -0
- package/src/utils/tree-builder.ts +114 -0
- package/dist/chunk-DPKUSBQH.cjs.map +0 -1
- package/dist/chunk-J66U3LPZ.cjs.map +0 -1
- package/dist/chunk-P45Q4QCU.cjs.map +0 -1
- package/dist/chunk-PVXCVPJD.cjs.map +0 -1
- package/dist/chunk-RGALV4UX.js.map +0 -1
- package/dist/chunk-RJUGNL2A.cjs.map +0 -1
- package/dist/chunk-USPATRSC.js.map +0 -1
- package/dist/chunk-VQW7CEGS.js.map +0 -1
- package/dist/chunk-XDI5JSWB.cjs.map +0 -1
- package/dist/chunk-XX7P4IL2.js.map +0 -1
- package/dist/chunk-Z3V2SGQZ.js.map +0 -1
- package/dist/chunk-ZIODAAFY.cjs.map +0 -1
- package/dist/chunk-ZSUNQJRO.cjs.map +0 -1
- /package/dist/{chunk-IMNGGLKL.js.map → chunk-3ZXUQQL4.js.map} +0 -0
- /package/dist/{chunk-23UOJUDF.js.map → chunk-5BTZOVDQ.js.map} +0 -0
|
@@ -1,10 +1,27 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import {
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
COMPACT_CARD_IMAGE_SLOT,
|
|
4
|
+
COMPACT_CARD_META_ROW_BOX,
|
|
5
|
+
COMPACT_CARD_OUTER,
|
|
6
|
+
COMPACT_CARD_ROW_FILLER,
|
|
7
|
+
COMPACT_CARD_SKELETON_IMAGE_SLOT,
|
|
8
|
+
COMPACT_CARD_SKELETON_OUTER,
|
|
9
|
+
COMPACT_CARD_SUMMARY,
|
|
10
|
+
COMPACT_CARD_TEXT_COL,
|
|
11
|
+
COMPACT_CARD_TITLE,
|
|
12
|
+
COMPACT_CARD_TITLE_ROW,
|
|
13
|
+
SECTION_HEADING_CLASS,
|
|
14
|
+
decideNewTab,
|
|
15
|
+
fetchPriorityProp,
|
|
16
|
+
formatDate,
|
|
17
|
+
formatDurationMMSS,
|
|
18
|
+
getFirstLastInitials,
|
|
19
|
+
nameInitials
|
|
20
|
+
} from "./chunk-VRSXJ5QJ.js";
|
|
21
|
+
import {
|
|
5
22
|
useNearViewport,
|
|
6
23
|
useOgPlaceholder
|
|
7
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-3MCHAFHB.js";
|
|
8
25
|
import {
|
|
9
26
|
useChatRuntime
|
|
10
27
|
} from "./chunk-LCNMR277.js";
|
|
@@ -23,21 +40,8 @@ import {
|
|
|
23
40
|
init_next_link,
|
|
24
41
|
next_link_default
|
|
25
42
|
} from "./chunk-OHPI2HRK.js";
|
|
26
|
-
import {
|
|
27
|
-
ClickUpIcon,
|
|
28
|
-
FacebookIcon,
|
|
29
|
-
GitHubIcon,
|
|
30
|
-
HubspotIcon,
|
|
31
|
-
InstagramIcon,
|
|
32
|
-
LinkedInIcon,
|
|
33
|
-
OpenFrameLogo,
|
|
34
|
-
SlackIcon,
|
|
35
|
-
XLogo,
|
|
36
|
-
YouTubeIcon
|
|
37
|
-
} from "./chunk-V4IIBNTA.js";
|
|
38
43
|
import {
|
|
39
44
|
cn,
|
|
40
|
-
getBaseUrl,
|
|
41
45
|
init_cn
|
|
42
46
|
} from "./chunk-XTCBRQN2.js";
|
|
43
47
|
import {
|
|
@@ -46,172 +50,14 @@ import {
|
|
|
46
50
|
Chevron02LeftIcon,
|
|
47
51
|
Chevron02RightIcon,
|
|
48
52
|
Ellipsis01Icon,
|
|
49
|
-
PlayIcon
|
|
50
|
-
XmarkCircleIcon
|
|
53
|
+
PlayIcon
|
|
51
54
|
} from "./chunk-J7AV6H63.js";
|
|
52
|
-
import {
|
|
53
|
-
SearchIcon
|
|
54
|
-
} from "./chunk-6U3IUD57.js";
|
|
55
|
-
|
|
56
|
-
// src/components/ui/hidden-tags-popup.tsx
|
|
57
|
-
import { forwardRef } from "react";
|
|
58
|
-
init_cn();
|
|
59
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
60
|
-
var HiddenTagsPopup = forwardRef(function HiddenTagsPopup2({ items, onRemove, disabled, className, style }, ref) {
|
|
61
|
-
return /* @__PURE__ */ jsx(
|
|
62
|
-
"div",
|
|
63
|
-
{
|
|
64
|
-
ref,
|
|
65
|
-
style,
|
|
66
|
-
className: cn(
|
|
67
|
-
// Base positioning is neutral (left-anchored); consumers override via
|
|
68
|
-
// `style.left` (search-input, tag-search-input) or `className` (autocomplete).
|
|
69
|
-
"absolute top-full left-0 mt-1 z-50 min-w-[200px]",
|
|
70
|
-
"bg-ods-card border border-ods-border rounded-[6px] shadow-lg",
|
|
71
|
-
"animate-in fade-in-0 zoom-in-95 duration-150",
|
|
72
|
-
className
|
|
73
|
-
),
|
|
74
|
-
children: items.map((item) => /* @__PURE__ */ jsxs(
|
|
75
|
-
"div",
|
|
76
|
-
{
|
|
77
|
-
className: cn(
|
|
78
|
-
"flex items-center justify-between gap-3 px-3 h-11 md:h-12",
|
|
79
|
-
"border-b border-ods-border last:border-b-0"
|
|
80
|
-
),
|
|
81
|
-
children: [
|
|
82
|
-
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 text-h5 truncate uppercase text-ods-text-primary", title: typeof item.label === "string" ? item.label : void 0, children: item.label }),
|
|
83
|
-
!disabled && onRemove && /* @__PURE__ */ jsx(
|
|
84
|
-
"button",
|
|
85
|
-
{
|
|
86
|
-
type: "button",
|
|
87
|
-
onClick: (e) => {
|
|
88
|
-
e.stopPropagation();
|
|
89
|
-
onRemove(item.value);
|
|
90
|
-
},
|
|
91
|
-
className: "shrink-0 text-ods-text-secondary hover:text-ods-text-primary transition-colors",
|
|
92
|
-
"aria-label": `Remove ${String(item.label)}`,
|
|
93
|
-
children: /* @__PURE__ */ jsx(XmarkCircleIcon, { size: 20 })
|
|
94
|
-
}
|
|
95
|
-
)
|
|
96
|
-
]
|
|
97
|
-
},
|
|
98
|
-
String(item.value)
|
|
99
|
-
))
|
|
100
|
-
}
|
|
101
|
-
);
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
// src/components/ui/tag.tsx
|
|
105
|
-
import { cva } from "class-variance-authority";
|
|
106
|
-
init_cn();
|
|
107
|
-
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
108
|
-
var tagVariants = cva(
|
|
109
|
-
[
|
|
110
|
-
"text-h5 h-8 inline-flex items-center justify-center gap-[var(--spacing-system-xxs)] p-[var(--spacing-system-xsf)] rounded-md",
|
|
111
|
-
"transition-colors duration-150"
|
|
112
|
-
],
|
|
113
|
-
{
|
|
114
|
-
variants: {
|
|
115
|
-
variant: {
|
|
116
|
-
primary: [
|
|
117
|
-
"bg-[var(--ods-open-yellow-base)] text-[var(--ods-system-greys-black)]",
|
|
118
|
-
"hover:bg-[var(--ods-open-yellow-hover)] active:bg-[var(--ods-open-yellow-action)]"
|
|
119
|
-
],
|
|
120
|
-
outline: [
|
|
121
|
-
"bg-[var(--ods-system-greys-black)] text-[var(--ods-system-greys-white)] border border-[var(--ods-system-greys-soft-grey)]",
|
|
122
|
-
"hover:bg-[var(--ods-system-greys-black-hover)] hover:border-[var(--ods-system-greys-soft-grey-hover)]",
|
|
123
|
-
"active:bg-[var(--ods-system-greys-black-action)] active:border-[var(--ods-system-greys-soft-grey-action)]"
|
|
124
|
-
],
|
|
125
|
-
success: [
|
|
126
|
-
"bg-[var(--ods-attention-green-success-secondary)] text-[var(--ods-attention-green-success)]",
|
|
127
|
-
"hover:bg-[#385029] active:bg-[#425a33]"
|
|
128
|
-
],
|
|
129
|
-
warning: [
|
|
130
|
-
"bg-[var(--ods-attention-yellow-warning-secondary)] text-[var(--ods-attention-yellow-warning)]",
|
|
131
|
-
"hover:bg-[#544729] active:bg-[#5e5133]"
|
|
132
|
-
],
|
|
133
|
-
error: [
|
|
134
|
-
"bg-[var(--ods-attention-red-error-secondary)] text-[var(--ods-attention-red-error)]",
|
|
135
|
-
"hover:bg-[#542b2b] active:bg-[#5e3535]"
|
|
136
|
-
],
|
|
137
|
-
critical: [
|
|
138
|
-
"bg-[var(--ods-attention-red-error)] text-[var(--ods-attention-red-error-secondary)]",
|
|
139
|
-
"hover:bg-[var(--ods-attention-red-error-hover)] active:bg-[var(--ods-attention-red-error-action)]"
|
|
140
|
-
],
|
|
141
|
-
grey: [
|
|
142
|
-
"bg-[var(--ods-system-greys-soft-grey)] text-[var(--ods-system-greys-grey)]",
|
|
143
|
-
"hover:bg-[var(--ods-system-greys-soft-grey-hover)] active:bg-[var(--ods-system-greys-soft-grey-action)]"
|
|
144
|
-
],
|
|
145
|
-
// Matches the EntityTagBadges / StatusBadge tag skin (ods-card + ods-border,
|
|
146
|
-
// mono uppercase) so the tag-editor chips render identically to the public
|
|
147
|
-
// tag badges. Used for FilterChipData variant 'tag' (see search-input).
|
|
148
|
-
badge: [
|
|
149
|
-
"bg-ods-card text-ods-text-primary border border-ods-border font-mono uppercase tracking-wide",
|
|
150
|
-
"hover:border-ods-accent transition-colors"
|
|
151
|
-
]
|
|
152
|
-
}
|
|
153
|
-
},
|
|
154
|
-
defaultVariants: {
|
|
155
|
-
variant: "primary"
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
);
|
|
159
|
-
var disabledTagClasses = [
|
|
160
|
-
"bg-[var(--ods-system-greys-soft-grey)] text-[var(--ods-system-greys-grey)]",
|
|
161
|
-
"border-transparent",
|
|
162
|
-
"cursor-not-allowed",
|
|
163
|
-
"pointer-events-none"
|
|
164
|
-
];
|
|
165
|
-
function Tag({
|
|
166
|
-
label,
|
|
167
|
-
variant,
|
|
168
|
-
icon,
|
|
169
|
-
onClose,
|
|
170
|
-
className,
|
|
171
|
-
labelClassName,
|
|
172
|
-
disabled,
|
|
173
|
-
...props
|
|
174
|
-
}) {
|
|
175
|
-
return /* @__PURE__ */ jsxs2(
|
|
176
|
-
"div",
|
|
177
|
-
{
|
|
178
|
-
className: cn(
|
|
179
|
-
tagVariants({ variant }),
|
|
180
|
-
disabled && disabledTagClasses,
|
|
181
|
-
className
|
|
182
|
-
),
|
|
183
|
-
"aria-disabled": disabled || void 0,
|
|
184
|
-
...props,
|
|
185
|
-
children: [
|
|
186
|
-
icon && /* @__PURE__ */ jsx2("span", { className: "flex items-center justify-center size-5 shrink-0", children: icon }),
|
|
187
|
-
/* @__PURE__ */ jsx2("span", { className: cn("truncate", labelClassName), title: typeof label === "string" ? label : void 0, children: label }),
|
|
188
|
-
onClose && /* @__PURE__ */ jsx2(
|
|
189
|
-
"button",
|
|
190
|
-
{
|
|
191
|
-
type: "button",
|
|
192
|
-
disabled,
|
|
193
|
-
onClick: (e) => {
|
|
194
|
-
e.stopPropagation();
|
|
195
|
-
onClose();
|
|
196
|
-
},
|
|
197
|
-
className: cn(
|
|
198
|
-
"flex items-center justify-center size-5 shrink-0 rounded-full opacity-70 transition-opacity",
|
|
199
|
-
disabled ? "cursor-not-allowed" : "hover:opacity-100"
|
|
200
|
-
),
|
|
201
|
-
"aria-label": "Remove",
|
|
202
|
-
children: /* @__PURE__ */ jsx2(XmarkCircleIcon, { className: "size-4" })
|
|
203
|
-
}
|
|
204
|
-
)
|
|
205
|
-
]
|
|
206
|
-
}
|
|
207
|
-
);
|
|
208
|
-
}
|
|
209
55
|
|
|
210
56
|
// src/components/ui/card.tsx
|
|
211
57
|
init_cn();
|
|
212
58
|
import * as React from "react";
|
|
213
|
-
import { jsx
|
|
214
|
-
var Card = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
|
|
59
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
60
|
+
var Card = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
215
61
|
"div",
|
|
216
62
|
{
|
|
217
63
|
ref,
|
|
@@ -223,7 +69,7 @@ var Card = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ js
|
|
|
223
69
|
}
|
|
224
70
|
));
|
|
225
71
|
Card.displayName = "Card";
|
|
226
|
-
var CardHeader = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
|
|
72
|
+
var CardHeader = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
227
73
|
"div",
|
|
228
74
|
{
|
|
229
75
|
ref,
|
|
@@ -232,7 +78,7 @@ var CardHeader = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__
|
|
|
232
78
|
}
|
|
233
79
|
));
|
|
234
80
|
CardHeader.displayName = "CardHeader";
|
|
235
|
-
var CardTitle = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
|
|
81
|
+
var CardTitle = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
236
82
|
"div",
|
|
237
83
|
{
|
|
238
84
|
ref,
|
|
@@ -244,7 +90,7 @@ var CardTitle = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__
|
|
|
244
90
|
}
|
|
245
91
|
));
|
|
246
92
|
CardTitle.displayName = "CardTitle";
|
|
247
|
-
var CardDescription = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
|
|
93
|
+
var CardDescription = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
248
94
|
"div",
|
|
249
95
|
{
|
|
250
96
|
ref,
|
|
@@ -253,9 +99,9 @@ var CardDescription = React.forwardRef(({ className, ...props }, ref) => /* @__P
|
|
|
253
99
|
}
|
|
254
100
|
));
|
|
255
101
|
CardDescription.displayName = "CardDescription";
|
|
256
|
-
var CardContent = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
|
|
102
|
+
var CardContent = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn("p-6 pt-0", className), ...props }));
|
|
257
103
|
CardContent.displayName = "CardContent";
|
|
258
|
-
var CardFooter = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
|
|
104
|
+
var CardFooter = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
259
105
|
"div",
|
|
260
106
|
{
|
|
261
107
|
ref,
|
|
@@ -265,7 +111,7 @@ var CardFooter = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__
|
|
|
265
111
|
));
|
|
266
112
|
CardFooter.displayName = "CardFooter";
|
|
267
113
|
function CardHorizontal({ icon, title, description, className = "", borderLeft = true }) {
|
|
268
|
-
return /* @__PURE__ */
|
|
114
|
+
return /* @__PURE__ */ jsxs(
|
|
269
115
|
"div",
|
|
270
116
|
{
|
|
271
117
|
className: cn(
|
|
@@ -274,10 +120,10 @@ function CardHorizontal({ icon, title, description, className = "", borderLeft =
|
|
|
274
120
|
className
|
|
275
121
|
),
|
|
276
122
|
children: [
|
|
277
|
-
/* @__PURE__ */
|
|
278
|
-
/* @__PURE__ */
|
|
279
|
-
/* @__PURE__ */
|
|
280
|
-
/* @__PURE__ */
|
|
123
|
+
/* @__PURE__ */ jsx("div", { className: "w-5 h-5 flex-shrink-0", children: icon }),
|
|
124
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col min-w-0", children: [
|
|
125
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium text-sm md:text-sm text-ods-text-primary leading-tight mb-0.5 text-left", children: title }),
|
|
126
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs md:text-sm text-ods-text-secondary leading-tight text-left", children: description })
|
|
281
127
|
] })
|
|
282
128
|
]
|
|
283
129
|
}
|
|
@@ -288,9 +134,9 @@ function CardHorizontal({ icon, title, description, className = "", borderLeft =
|
|
|
288
134
|
init_cn();
|
|
289
135
|
import * as React2 from "react";
|
|
290
136
|
import * as TabsPrimitive from "@radix-ui/react-tabs";
|
|
291
|
-
import { jsx as
|
|
137
|
+
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
292
138
|
var Tabs = TabsPrimitive.Root;
|
|
293
|
-
var TabsList = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
|
|
139
|
+
var TabsList = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx2(
|
|
294
140
|
TabsPrimitive.List,
|
|
295
141
|
{
|
|
296
142
|
ref,
|
|
@@ -302,7 +148,7 @@ var TabsList = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__
|
|
|
302
148
|
}
|
|
303
149
|
));
|
|
304
150
|
TabsList.displayName = TabsPrimitive.List.displayName;
|
|
305
|
-
var TabsTrigger = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
|
|
151
|
+
var TabsTrigger = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx2(
|
|
306
152
|
TabsPrimitive.Trigger,
|
|
307
153
|
{
|
|
308
154
|
ref,
|
|
@@ -314,7 +160,7 @@ var TabsTrigger = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE
|
|
|
314
160
|
}
|
|
315
161
|
));
|
|
316
162
|
TabsTrigger.displayName = TabsPrimitive.Trigger.displayName;
|
|
317
|
-
var TabsContent = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
|
|
163
|
+
var TabsContent = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx2(
|
|
318
164
|
TabsPrimitive.Content,
|
|
319
165
|
{
|
|
320
166
|
ref,
|
|
@@ -329,9 +175,9 @@ TabsContent.displayName = TabsPrimitive.Content.displayName;
|
|
|
329
175
|
|
|
330
176
|
// src/components/ui/status-badge.tsx
|
|
331
177
|
init_cn();
|
|
332
|
-
import { cva
|
|
333
|
-
import { jsx as
|
|
334
|
-
var statusBadgeVariants =
|
|
178
|
+
import { cva } from "class-variance-authority";
|
|
179
|
+
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
180
|
+
var statusBadgeVariants = cva(
|
|
335
181
|
"inline-flex items-center justify-center rounded font-mono font-medium uppercase tracking-wide",
|
|
336
182
|
{
|
|
337
183
|
variants: {
|
|
@@ -373,11 +219,11 @@ function StatusBadge({
|
|
|
373
219
|
if (singleLine) return text;
|
|
374
220
|
if (variant === "button" && text.includes(" ")) {
|
|
375
221
|
const words = text.split(" ");
|
|
376
|
-
return /* @__PURE__ */
|
|
222
|
+
return /* @__PURE__ */ jsx3("span", { className: "flex flex-col items-center justify-center text-center gap-0", children: words.map((word, index) => /* @__PURE__ */ jsx3("span", { className: "block", children: word }, index)) });
|
|
377
223
|
}
|
|
378
224
|
return text;
|
|
379
225
|
};
|
|
380
|
-
return /* @__PURE__ */
|
|
226
|
+
return /* @__PURE__ */ jsx3(
|
|
381
227
|
"span",
|
|
382
228
|
{
|
|
383
229
|
className: cn(statusBadgeVariants({ variant, colorScheme }), className),
|
|
@@ -396,7 +242,7 @@ import rehypeHighlight from "rehype-highlight";
|
|
|
396
242
|
import rehypeRaw from "rehype-raw";
|
|
397
243
|
import { visit } from "unist-util-visit";
|
|
398
244
|
init_cn();
|
|
399
|
-
import { jsx as
|
|
245
|
+
import { jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
400
246
|
var EVENT_HANDLER_ATTR_RE = /^on[a-z]+$/i;
|
|
401
247
|
var JAVASCRIPT_URL_RE = /^[\s\x00-\x1f]*javascript:/i;
|
|
402
248
|
var DATA_URL_RE = /^[\s\x00-\x1f]*data:/i;
|
|
@@ -705,16 +551,16 @@ var MermaidDiagram = ({ chart }) => {
|
|
|
705
551
|
}
|
|
706
552
|
}, [chart, mounted]);
|
|
707
553
|
if (error) {
|
|
708
|
-
return /* @__PURE__ */
|
|
709
|
-
/* @__PURE__ */
|
|
710
|
-
/* @__PURE__ */
|
|
711
|
-
/* @__PURE__ */
|
|
554
|
+
return /* @__PURE__ */ jsxs2("div", { className: "error-state bg-ods-card border border-ods-border rounded-lg p-6 my-6", children: [
|
|
555
|
+
/* @__PURE__ */ jsx4("div", { className: "error-icon flex justify-center mb-4", children: /* @__PURE__ */ jsx4(AlertCircleIcon, { className: "w-12 h-12 text-ods-error" }) }),
|
|
556
|
+
/* @__PURE__ */ jsx4("div", { className: "error-title text-center font-sans font-semibold text-lg text-ods-error mb-2", children: "Diagram Error" }),
|
|
557
|
+
/* @__PURE__ */ jsx4("div", { className: "error-description text-center font-sans text-sm text-ods-text-secondary mb-4 break-words overflow-hidden max-w-full", children: /* @__PURE__ */ jsx4("div", { className: "overflow-x-auto", children: /* @__PURE__ */ jsx4("pre", { className: "whitespace-pre-wrap break-words text-xs", children: error }) }) })
|
|
712
558
|
] });
|
|
713
559
|
}
|
|
714
560
|
if (isLoading || !svg) {
|
|
715
|
-
return /* @__PURE__ */
|
|
561
|
+
return /* @__PURE__ */ jsx4("div", { className: "skeleton-code bg-ods-card border border-ods-border rounded-lg p-6 min-h-[120px] flex items-center justify-center", children: /* @__PURE__ */ jsx4("div", { className: "animate-pulse text-ods-text-tertiary font-sans", children: isLoading ? "Loading diagram renderer..." : "Rendering diagram..." }) });
|
|
716
562
|
}
|
|
717
|
-
return /* @__PURE__ */
|
|
563
|
+
return /* @__PURE__ */ jsx4("div", { className: "mermaid-container rounded-lg p-4 md:p-6 lg:p-8 my-6 overflow-x-auto bg-ods-card border border-ods-border", children: /* @__PURE__ */ jsx4("div", { className: "flex justify-center items-center w-full min-h-[200px] md:min-h-[250px] lg:min-h-[300px]", children: /* @__PURE__ */ jsx4(
|
|
718
564
|
"div",
|
|
719
565
|
{
|
|
720
566
|
className: "mermaid-svg-container w-full flex justify-center max-w-full",
|
|
@@ -840,12 +686,12 @@ var SimpleMarkdownRendererImpl = ({
|
|
|
840
686
|
[preprocessContent, content]
|
|
841
687
|
);
|
|
842
688
|
const makeHeading = useCallback(
|
|
843
|
-
(
|
|
689
|
+
(Tag, level, headingClassName) => ({ children }) => {
|
|
844
690
|
const text = extractText(children);
|
|
845
|
-
const effectiveLevel =
|
|
691
|
+
const effectiveLevel = Tag === "h1" && demoteMarkdownH1ToH2 ? 2 : level;
|
|
846
692
|
const id = generateHeadingId(text, effectiveLevel);
|
|
847
|
-
const EffectiveTag =
|
|
848
|
-
return /* @__PURE__ */
|
|
693
|
+
const EffectiveTag = Tag === "h1" && demoteMarkdownH1ToH2 ? "h2" : Tag;
|
|
694
|
+
return /* @__PURE__ */ jsx4(EffectiveTag, { id, className: headingClassName, children });
|
|
849
695
|
},
|
|
850
696
|
[generateHeadingId, demoteMarkdownH1ToH2]
|
|
851
697
|
);
|
|
@@ -855,12 +701,12 @@ var SimpleMarkdownRendererImpl = ({
|
|
|
855
701
|
const match = /language-(\w+)/.exec(codeClassName || "");
|
|
856
702
|
const language = match ? match[1] : "";
|
|
857
703
|
if (!inline && language === "mermaid") {
|
|
858
|
-
return /* @__PURE__ */
|
|
704
|
+
return /* @__PURE__ */ jsx4(MermaidDiagram, { chart: String(children).replace(/\n$/, "") });
|
|
859
705
|
}
|
|
860
706
|
if (!inline && match) {
|
|
861
|
-
return /* @__PURE__ */
|
|
862
|
-
/* @__PURE__ */
|
|
863
|
-
/* @__PURE__ */
|
|
707
|
+
return /* @__PURE__ */ jsxs2("div", { className: "code-block-container border rounded-lg my-6 overflow-hidden bg-ods-card border-ods-border", children: [
|
|
708
|
+
/* @__PURE__ */ jsx4("div", { className: "code-header border-b px-4 py-2 bg-ods-card border-ods-border", children: /* @__PURE__ */ jsx4("span", { className: "font-sans text-xs uppercase tracking-wide text-ods-text-tertiary", children: language || "code" }) }),
|
|
709
|
+
/* @__PURE__ */ jsx4("div", { className: "p-4", children: /* @__PURE__ */ jsx4("pre", { className: "overflow-x-auto", children: /* @__PURE__ */ jsx4(
|
|
864
710
|
"code",
|
|
865
711
|
{
|
|
866
712
|
className: cn(`language-${language} hljs`, textSizes.code),
|
|
@@ -875,12 +721,12 @@ var SimpleMarkdownRendererImpl = ({
|
|
|
875
721
|
) }) })
|
|
876
722
|
] });
|
|
877
723
|
}
|
|
878
|
-
return /* @__PURE__ */
|
|
724
|
+
return /* @__PURE__ */ jsx4("code", { className: "font-mono text-[0.9em] px-1.5 py-0.5 rounded border bg-ods-card text-ods-text-primary border-ods-border", ...props, children });
|
|
879
725
|
},
|
|
880
726
|
// --- div (pass-through, overridable for embeds) ---
|
|
881
|
-
div: ({ node, className: divClassName, children, ...props }) => /* @__PURE__ */
|
|
727
|
+
div: ({ node, className: divClassName, children, ...props }) => /* @__PURE__ */ jsx4("div", { className: divClassName, ...props, children }),
|
|
882
728
|
// --- blockquote ---
|
|
883
|
-
blockquote: ({ children }) => /* @__PURE__ */
|
|
729
|
+
blockquote: ({ children }) => /* @__PURE__ */ jsx4("blockquote", { className: "border-l-4 border-ods-accent ml-0 pl-6 my-8 py-4 rounded-r-lg bg-ods-bg-secondary", children: /* @__PURE__ */ jsx4("div", { className: cn("font-sans leading-relaxed text-ods-text-secondary", textSizes.blockquote), children }) }),
|
|
884
730
|
// --- headings ---
|
|
885
731
|
h1: makeHeading("h1", 1, cn("font-sans font-bold mt-8 mb-4 first:mt-0 text-ods-text-primary", textSizes.h1)),
|
|
886
732
|
h2: makeHeading("h2", 2, cn("font-sans font-semibold mt-8 mb-4 pb-2 border-b text-ods-text-primary border-ods-border", textSizes.h2)),
|
|
@@ -889,20 +735,20 @@ var SimpleMarkdownRendererImpl = ({
|
|
|
889
735
|
h5: makeHeading("h5", 5, cn("font-sans font-semibold mt-3 mb-2 text-ods-text-primary", textSizes.h5)),
|
|
890
736
|
h6: makeHeading("h6", 6, cn("font-sans font-semibold mt-3 mb-1 text-ods-text-primary", textSizes.h6)),
|
|
891
737
|
// --- paragraph ---
|
|
892
|
-
p: ({ children }) => /* @__PURE__ */
|
|
738
|
+
p: ({ children }) => /* @__PURE__ */ jsx4("p", { className: cn("leading-relaxed mb-4 first:mt-0 last:mb-0 text-ods-text-primary", textSizes.p), children }),
|
|
893
739
|
// --- links ---
|
|
894
740
|
a: ({ href, children, className: linkClassName }) => {
|
|
895
741
|
const isBroken = brokenLinks.includes(href);
|
|
896
742
|
const isInternalDocLink = propCurrentPath !== void 0 && propCurrentPath !== null && href && !href.startsWith("http") && !href.startsWith("#");
|
|
897
743
|
if (isBroken) {
|
|
898
|
-
return /* @__PURE__ */
|
|
744
|
+
return /* @__PURE__ */ jsxs2("span", { className: "text-ods-accent cursor-not-allowed", children: [
|
|
899
745
|
children,
|
|
900
|
-
/* @__PURE__ */
|
|
746
|
+
/* @__PURE__ */ jsx4("sup", { className: "ml-1 text-xs font-bold text-ods-attention-red-error", children: "[BROKEN]" })
|
|
901
747
|
] });
|
|
902
748
|
}
|
|
903
749
|
if (isInternalDocLink && onInternalLinkClick) {
|
|
904
750
|
const currentPath = propCurrentPath ?? "";
|
|
905
|
-
return /* @__PURE__ */
|
|
751
|
+
return /* @__PURE__ */ jsx4(
|
|
906
752
|
"span",
|
|
907
753
|
{
|
|
908
754
|
className: "text-ods-accent no-underline relative transition-colors duration-200 hover:after:w-full after:content-[''] after:absolute after:w-0 after:h-0.5 after:-bottom-0.5 after:left-0 after:bg-ods-accent after:transition-all after:duration-300 cursor-pointer",
|
|
@@ -937,7 +783,7 @@ var SimpleMarkdownRendererImpl = ({
|
|
|
937
783
|
}
|
|
938
784
|
);
|
|
939
785
|
}
|
|
940
|
-
return /* @__PURE__ */
|
|
786
|
+
return /* @__PURE__ */ jsx4(
|
|
941
787
|
"a",
|
|
942
788
|
{
|
|
943
789
|
href,
|
|
@@ -998,7 +844,7 @@ var SimpleMarkdownRendererImpl = ({
|
|
|
998
844
|
// (cached re-renders pop in without a perceptible shift).
|
|
999
845
|
img: ({ src, alt }) => {
|
|
1000
846
|
if (!src || typeof src !== "string" || src.trim() === "") return null;
|
|
1001
|
-
return /* @__PURE__ */
|
|
847
|
+
return /* @__PURE__ */ jsx4(
|
|
1002
848
|
next_image_default,
|
|
1003
849
|
{
|
|
1004
850
|
src,
|
|
@@ -1012,22 +858,22 @@ var SimpleMarkdownRendererImpl = ({
|
|
|
1012
858
|
);
|
|
1013
859
|
},
|
|
1014
860
|
// --- lists ---
|
|
1015
|
-
ul: ({ children }) => /* @__PURE__ */
|
|
1016
|
-
ol: ({ children }) => /* @__PURE__ */
|
|
1017
|
-
li: ({ children }) => /* @__PURE__ */
|
|
861
|
+
ul: ({ children }) => /* @__PURE__ */ jsx4("ul", { className: "list-disc list-outside my-4 ml-8 space-y-2 text-ods-text-primary", children }),
|
|
862
|
+
ol: ({ children }) => /* @__PURE__ */ jsx4("ol", { className: "list-decimal list-outside my-4 ml-8 space-y-2 text-ods-text-primary", children }),
|
|
863
|
+
li: ({ children }) => /* @__PURE__ */ jsx4("li", { className: cn("leading-relaxed pl-2", textSizes.li), children }),
|
|
1018
864
|
// --- tables ---
|
|
1019
|
-
table: ({ children }) => /* @__PURE__ */
|
|
1020
|
-
thead: ({ children }) => /* @__PURE__ */
|
|
1021
|
-
th: ({ children }) => /* @__PURE__ */
|
|
1022
|
-
td: ({ children }) => /* @__PURE__ */
|
|
865
|
+
table: ({ children }) => /* @__PURE__ */ jsx4("div", { className: "table-container my-6 overflow-x-auto", children: /* @__PURE__ */ jsx4("div", { className: "min-w-full border rounded-lg border-ods-border bg-ods-card", children: /* @__PURE__ */ jsx4("table", { className: "w-full table-fixed md:table-auto", children }) }) }),
|
|
866
|
+
thead: ({ children }) => /* @__PURE__ */ jsx4("thead", { className: "bg-ods-bg-secondary", children }),
|
|
867
|
+
th: ({ children }) => /* @__PURE__ */ jsx4("th", { className: cn("px-2 md:px-4 py-3 text-left font-semibold text-ods-accent border-r last:border-r-0 break-words border-ods-border", textSizes.th), children }),
|
|
868
|
+
td: ({ children }) => /* @__PURE__ */ jsx4("td", { className: cn("px-2 md:px-4 py-3 border-r last:border-r-0 border-b break-words whitespace-normal text-ods-text-primary border-ods-border", textSizes.td), children }),
|
|
1023
869
|
// --- horizontal rule ---
|
|
1024
|
-
hr: () => /* @__PURE__ */
|
|
870
|
+
hr: () => /* @__PURE__ */ jsx4("hr", { className: "border-0 border-t my-8 border-ods-border" }),
|
|
1025
871
|
// --- merge overrides ---
|
|
1026
872
|
...componentOverrides
|
|
1027
873
|
}), [makeHeading, brokenLinks, propCurrentPath, onInternalLinkClick, onResolveLink, componentOverrides, textSizes]);
|
|
1028
|
-
return /* @__PURE__ */
|
|
1029
|
-
/* @__PURE__ */
|
|
1030
|
-
/* @__PURE__ */
|
|
874
|
+
return /* @__PURE__ */ jsxs2("div", { className: `simple-markdown-renderer ${className}`, children: [
|
|
875
|
+
/* @__PURE__ */ jsx4("style", { dangerouslySetInnerHTML: { __html: mermaidStyles } }),
|
|
876
|
+
/* @__PURE__ */ jsx4("div", { className: "content-wrapper max-w-none break-words", children: /* @__PURE__ */ jsx4("article", { className: "prose prose-lg max-w-none", children: /* @__PURE__ */ jsx4(
|
|
1031
877
|
ReactMarkdown,
|
|
1032
878
|
{
|
|
1033
879
|
remarkPlugins: [remarkGfm, remarkBreaks, ...additionalRemarkPlugins ?? []],
|
|
@@ -1051,312 +897,10 @@ var SimpleMarkdownRendererImpl = ({
|
|
|
1051
897
|
};
|
|
1052
898
|
var SimpleMarkdownRenderer = memo(SimpleMarkdownRendererImpl);
|
|
1053
899
|
|
|
1054
|
-
// src/utils/format.ts
|
|
1055
|
-
function formatDate(date, options = {
|
|
1056
|
-
year: "numeric",
|
|
1057
|
-
month: "long",
|
|
1058
|
-
day: "numeric"
|
|
1059
|
-
}) {
|
|
1060
|
-
const dateObj = typeof date === "string" ? new Date(date) : date;
|
|
1061
|
-
if (isNaN(dateObj.getTime())) {
|
|
1062
|
-
console.warn("Invalid date provided to formatDate:", date);
|
|
1063
|
-
return "Invalid Date";
|
|
1064
|
-
}
|
|
1065
|
-
return dateObj.toLocaleDateString("en-US", options);
|
|
1066
|
-
}
|
|
1067
|
-
function formatNumber(num) {
|
|
1068
|
-
return num.toLocaleString();
|
|
1069
|
-
}
|
|
1070
|
-
function formatPrice(price, currency = "USD") {
|
|
1071
|
-
return new Intl.NumberFormat("en-US", {
|
|
1072
|
-
style: "currency",
|
|
1073
|
-
currency
|
|
1074
|
-
}).format(price);
|
|
1075
|
-
}
|
|
1076
|
-
function formatBytes(bytes, decimals = 2) {
|
|
1077
|
-
if (bytes === 0) return "0 Bytes";
|
|
1078
|
-
const k = 1024;
|
|
1079
|
-
const dm = decimals < 0 ? 0 : decimals;
|
|
1080
|
-
const sizes = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
|
|
1081
|
-
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
1082
|
-
return Number.parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + " " + sizes[i];
|
|
1083
|
-
}
|
|
1084
|
-
function formatBytesShort(bytes) {
|
|
1085
|
-
if (bytes === 0) return "0 B";
|
|
1086
|
-
const k = 1024;
|
|
1087
|
-
const sizes = ["B", "KB", "MB", "GB", "TB"];
|
|
1088
|
-
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
1089
|
-
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;
|
|
1090
|
-
}
|
|
1091
|
-
function formatLargeNumber(num) {
|
|
1092
|
-
if (num === 0) return "0";
|
|
1093
|
-
const isNegative = num < 0;
|
|
1094
|
-
const absNum = Math.abs(num);
|
|
1095
|
-
let result;
|
|
1096
|
-
if (absNum >= 1e9) {
|
|
1097
|
-
result = `${Math.floor(absNum / 1e9)}B`;
|
|
1098
|
-
} else if (absNum >= 1e6) {
|
|
1099
|
-
result = `${Math.floor(absNum / 1e6)}M`;
|
|
1100
|
-
} else if (absNum >= 1e3) {
|
|
1101
|
-
result = `${Math.floor(absNum / 1e3)}K`;
|
|
1102
|
-
} else {
|
|
1103
|
-
result = Math.floor(absNum).toString();
|
|
1104
|
-
}
|
|
1105
|
-
return isNegative ? `-${result}` : result;
|
|
1106
|
-
}
|
|
1107
|
-
function formatAbbreviatedNumber(n) {
|
|
1108
|
-
if (n >= 1e9) {
|
|
1109
|
-
const value = n / 1e9;
|
|
1110
|
-
return `${Number.isInteger(value) ? value.toFixed(0) : value.toFixed(1)}B`;
|
|
1111
|
-
}
|
|
1112
|
-
if (n >= 1e6) {
|
|
1113
|
-
const value = n / 1e6;
|
|
1114
|
-
return `${Number.isInteger(value) ? value.toFixed(0) : value.toFixed(1)}M`;
|
|
1115
|
-
}
|
|
1116
|
-
if (n >= 1e3) {
|
|
1117
|
-
const value = n / 1e3;
|
|
1118
|
-
return `${Number.isInteger(value) ? value.toFixed(0) : value.toFixed(1)}K`;
|
|
1119
|
-
}
|
|
1120
|
-
return n.toLocaleString();
|
|
1121
|
-
}
|
|
1122
|
-
function getFirstLastInitials(name) {
|
|
1123
|
-
if (!name) return "";
|
|
1124
|
-
const words = name.trim().split(/\s+/);
|
|
1125
|
-
if (words.length === 0 || !words[0]) return "";
|
|
1126
|
-
if (words.length === 1) return words[0].charAt(0).toUpperCase();
|
|
1127
|
-
return (words[0].charAt(0) + words[words.length - 1].charAt(0)).toUpperCase();
|
|
1128
|
-
}
|
|
1129
|
-
function nameInitials(name, fallback = "E") {
|
|
1130
|
-
const source = typeof name === "string" ? name.trim() : "";
|
|
1131
|
-
const words = source.length > 0 ? source.split(/\s+/) : [];
|
|
1132
|
-
const letters = words.map((w) => w[0]).filter(Boolean).slice(0, 2).join("");
|
|
1133
|
-
return (letters || fallback).toUpperCase();
|
|
1134
|
-
}
|
|
1135
|
-
function formatDurationMMSS(seconds) {
|
|
1136
|
-
if (!seconds) return "";
|
|
1137
|
-
const hours = Math.floor(seconds / 3600);
|
|
1138
|
-
const minutes = Math.floor(seconds % 3600 / 60);
|
|
1139
|
-
const secs = Math.floor(seconds % 60);
|
|
1140
|
-
if (hours > 0) {
|
|
1141
|
-
return `${hours}:${minutes.toString().padStart(2, "0")}:${secs.toString().padStart(2, "0")}`;
|
|
1142
|
-
}
|
|
1143
|
-
return `${minutes}:${secs.toString().padStart(2, "0")}`;
|
|
1144
|
-
}
|
|
1145
|
-
function formatDurationCompact(seconds) {
|
|
1146
|
-
if (!seconds) return "";
|
|
1147
|
-
const hours = Math.floor(seconds / 3600);
|
|
1148
|
-
const minutes = Math.floor(seconds % 3600 / 60);
|
|
1149
|
-
if (hours > 0) {
|
|
1150
|
-
return `${hours}h ${minutes}m`;
|
|
1151
|
-
}
|
|
1152
|
-
return `${minutes} min`;
|
|
1153
|
-
}
|
|
1154
|
-
function formatTimeWithTimezone(date, timezone) {
|
|
1155
|
-
if (!date) return "";
|
|
1156
|
-
const dateObj = typeof date === "string" ? new Date(date) : date;
|
|
1157
|
-
const timeStr = dateObj.toLocaleTimeString("en-US", {
|
|
1158
|
-
hour: "numeric",
|
|
1159
|
-
minute: "2-digit",
|
|
1160
|
-
hour12: true
|
|
1161
|
-
});
|
|
1162
|
-
return timezone ? `${timeStr} ${timezone}` : timeStr;
|
|
1163
|
-
}
|
|
1164
|
-
function formatDurationFromRange(startAt, endAt) {
|
|
1165
|
-
if (!startAt || !endAt) return "";
|
|
1166
|
-
const start = typeof startAt === "string" ? new Date(startAt) : startAt;
|
|
1167
|
-
const end = typeof endAt === "string" ? new Date(endAt) : endAt;
|
|
1168
|
-
const durationMs = end.getTime() - start.getTime();
|
|
1169
|
-
const minutes = Math.round(durationMs / 6e4);
|
|
1170
|
-
if (minutes >= 60) {
|
|
1171
|
-
const hours = Math.floor(minutes / 60);
|
|
1172
|
-
const mins = minutes % 60;
|
|
1173
|
-
return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;
|
|
1174
|
-
}
|
|
1175
|
-
return `${minutes}m`;
|
|
1176
|
-
}
|
|
1177
|
-
function formatDateUTC(value, options = {}) {
|
|
1178
|
-
const { fallback = "N/A", timezone = "UTC" } = options;
|
|
1179
|
-
if (value === null || value === void 0 || value === "") return fallback;
|
|
1180
|
-
let ms;
|
|
1181
|
-
if (typeof value === "number") {
|
|
1182
|
-
ms = value;
|
|
1183
|
-
} else {
|
|
1184
|
-
const n = Number(value);
|
|
1185
|
-
if (Number.isFinite(n) && n > 0 && /^-?\d+(\.\d+)?$/.test(value.trim())) {
|
|
1186
|
-
ms = n;
|
|
1187
|
-
} else {
|
|
1188
|
-
ms = Date.parse(value.includes("T") ? value : value + "T00:00:00Z");
|
|
1189
|
-
}
|
|
1190
|
-
}
|
|
1191
|
-
if (!Number.isFinite(ms)) return fallback;
|
|
1192
|
-
return new Date(ms).toLocaleDateString("en-US", {
|
|
1193
|
-
year: "numeric",
|
|
1194
|
-
month: "short",
|
|
1195
|
-
day: "numeric",
|
|
1196
|
-
timeZone: timezone === "local" ? void 0 : "UTC"
|
|
1197
|
-
});
|
|
1198
|
-
}
|
|
1199
|
-
function formatEntryMonthUTC(entryMonth, style = "short") {
|
|
1200
|
-
if (!entryMonth) return null;
|
|
1201
|
-
return new Date(entryMonth).toLocaleDateString("en-US", { month: style, year: "numeric", timeZone: "UTC" });
|
|
1202
|
-
}
|
|
1203
|
-
function formatLegalDate(dateInput) {
|
|
1204
|
-
return new Intl.DateTimeFormat("en-US", {
|
|
1205
|
-
year: "numeric",
|
|
1206
|
-
month: "2-digit",
|
|
1207
|
-
day: "2-digit"
|
|
1208
|
-
}).format(new Date(dateInput));
|
|
1209
|
-
}
|
|
1210
|
-
function formatCurrency(value) {
|
|
1211
|
-
if (value == null) return "N/A";
|
|
1212
|
-
return new Intl.NumberFormat("en-US", {
|
|
1213
|
-
style: "currency",
|
|
1214
|
-
currency: "USD",
|
|
1215
|
-
maximumFractionDigits: 0
|
|
1216
|
-
}).format(value);
|
|
1217
|
-
}
|
|
1218
|
-
function formatPercent(value) {
|
|
1219
|
-
if (value == null) return "N/A";
|
|
1220
|
-
return `${value.toFixed(2)}%`;
|
|
1221
|
-
}
|
|
1222
|
-
function formatWholeDollars(price, currency = "USD") {
|
|
1223
|
-
return new Intl.NumberFormat("en-US", {
|
|
1224
|
-
style: "currency",
|
|
1225
|
-
currency,
|
|
1226
|
-
maximumFractionDigits: 0
|
|
1227
|
-
}).format(price);
|
|
1228
|
-
}
|
|
1229
|
-
function formatCompactMetric(value, format = "number", options) {
|
|
1230
|
-
if (value === 0 || value === null || value === void 0) {
|
|
1231
|
-
if (format === "currency") return `${options?.prefix || "$"}0`;
|
|
1232
|
-
if (format === "percentage") return "0%";
|
|
1233
|
-
if (format === "months") return `0 ${options?.suffix || "months"}`;
|
|
1234
|
-
return "0";
|
|
1235
|
-
}
|
|
1236
|
-
const absValue = Math.abs(value);
|
|
1237
|
-
const sign = value < 0 ? "-" : "";
|
|
1238
|
-
if (format === "currency") {
|
|
1239
|
-
const prefix = options?.prefix || "$";
|
|
1240
|
-
const compact = (val, divisor, suffix) => {
|
|
1241
|
-
const divided = val / divisor;
|
|
1242
|
-
const formatted = divided % 1 === 0 ? divided.toFixed(0) : divided.toFixed(1);
|
|
1243
|
-
return `${sign}${prefix}${formatted}${suffix}`;
|
|
1244
|
-
};
|
|
1245
|
-
if (absValue >= 1e9) return compact(absValue, 1e9, "B");
|
|
1246
|
-
if (absValue >= 1e6) return compact(absValue, 1e6, "M");
|
|
1247
|
-
if (absValue >= 1e3) return `${sign}${prefix}${(absValue / 1e3).toFixed(0)}K`;
|
|
1248
|
-
return `${sign}${prefix}${absValue.toLocaleString()}`;
|
|
1249
|
-
}
|
|
1250
|
-
if (format === "percentage") {
|
|
1251
|
-
return `${sign}${absValue}%`;
|
|
1252
|
-
}
|
|
1253
|
-
if (format === "months") {
|
|
1254
|
-
const rounded = Math.round(value * 10) / 10;
|
|
1255
|
-
return `${rounded} ${options?.suffix || "months"}`;
|
|
1256
|
-
}
|
|
1257
|
-
if (absValue >= 1e6) return `${sign}${(absValue / 1e6).toFixed(1)}M`;
|
|
1258
|
-
if (absValue >= 1e3) return `${sign}${(absValue / 1e3).toFixed(1)}K`;
|
|
1259
|
-
return value.toLocaleString();
|
|
1260
|
-
}
|
|
1261
|
-
function getTrendColors(direction, polarity = "positive") {
|
|
1262
|
-
if (direction === "neutral" || polarity === "neutral") {
|
|
1263
|
-
return {
|
|
1264
|
-
textClass: "text-ods-text-secondary",
|
|
1265
|
-
badgeClass: "bg-ods-border text-ods-text-secondary"
|
|
1266
|
-
};
|
|
1267
|
-
}
|
|
1268
|
-
const isPositiveOutcome = direction === "up" && polarity === "positive" || direction === "down" && polarity === "negative";
|
|
1269
|
-
if (isPositiveOutcome) {
|
|
1270
|
-
return {
|
|
1271
|
-
textClass: "text-ods-success",
|
|
1272
|
-
badgeClass: "bg-ods-success-secondary text-ods-success"
|
|
1273
|
-
};
|
|
1274
|
-
}
|
|
1275
|
-
return {
|
|
1276
|
-
textClass: "text-ods-error",
|
|
1277
|
-
badgeClass: "bg-ods-error-secondary text-ods-error"
|
|
1278
|
-
};
|
|
1279
|
-
}
|
|
1280
|
-
function formatDateRange(start, end) {
|
|
1281
|
-
if (!start || !end) return "";
|
|
1282
|
-
const fmt = (s) => {
|
|
1283
|
-
const bareMatch = /^(\d{4})-(\d{2})-(\d{2})$/.exec(s);
|
|
1284
|
-
const d = bareMatch ? new Date(Number(bareMatch[1]), Number(bareMatch[2]) - 1, Number(bareMatch[3])) : new Date(s);
|
|
1285
|
-
if (Number.isNaN(d.getTime())) return s;
|
|
1286
|
-
return d.toLocaleDateString(void 0, {
|
|
1287
|
-
month: "short",
|
|
1288
|
-
day: "numeric",
|
|
1289
|
-
year: "numeric"
|
|
1290
|
-
});
|
|
1291
|
-
};
|
|
1292
|
-
return `${fmt(start)} \u2014 ${fmt(end)}`;
|
|
1293
|
-
}
|
|
1294
|
-
function formatDateTimeAt(dateString) {
|
|
1295
|
-
const date = new Date(dateString);
|
|
1296
|
-
const dateStr = date.toLocaleDateString("en-US", {
|
|
1297
|
-
month: "short",
|
|
1298
|
-
day: "numeric",
|
|
1299
|
-
year: "numeric"
|
|
1300
|
-
});
|
|
1301
|
-
const timeStr = date.toLocaleTimeString("en-US", {
|
|
1302
|
-
hour: "numeric",
|
|
1303
|
-
minute: "2-digit",
|
|
1304
|
-
hour12: true
|
|
1305
|
-
});
|
|
1306
|
-
return `${dateStr} at ${timeStr}`;
|
|
1307
|
-
}
|
|
1308
|
-
function formatDurationFromMs(ms) {
|
|
1309
|
-
if (!ms || isNaN(ms) || ms < 0) return "0ms";
|
|
1310
|
-
if (ms < 1e3) return `${ms}ms`;
|
|
1311
|
-
if (ms < 6e4) return `${(ms / 1e3).toFixed(1)}s`;
|
|
1312
|
-
return `${(ms / 6e4).toFixed(1)}m`;
|
|
1313
|
-
}
|
|
1314
|
-
function formatDuration(seconds) {
|
|
1315
|
-
if (seconds < 60) return `${seconds} seconds`;
|
|
1316
|
-
if (seconds < 3600) return `${Math.floor(seconds / 60)} minutes`;
|
|
1317
|
-
const hours = Math.floor(seconds / 3600);
|
|
1318
|
-
const minutes = Math.floor(seconds % 3600 / 60);
|
|
1319
|
-
if (minutes === 0) return `${hours} hour${hours > 1 ? "s" : ""}`;
|
|
1320
|
-
return `${hours} hour${hours > 1 ? "s" : ""} ${minutes} minute${minutes > 1 ? "s" : ""}`;
|
|
1321
|
-
}
|
|
1322
|
-
function formatUnderscoreText(text) {
|
|
1323
|
-
return text.split("_").map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join(" ");
|
|
1324
|
-
}
|
|
1325
|
-
function stripHtml(html) {
|
|
1326
|
-
let noTags = html;
|
|
1327
|
-
let prev;
|
|
1328
|
-
do {
|
|
1329
|
-
prev = noTags;
|
|
1330
|
-
noTags = noTags.replace(/<[^<>]*>/g, "");
|
|
1331
|
-
} while (noTags !== prev);
|
|
1332
|
-
return noTags.replace(/ /g, " ").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, '"').replace(/'/g, "'").replace(/'/g, "'").replace(/'/g, "'").replace(/&/g, "&").replace(/\s+/g, " ").trim();
|
|
1333
|
-
}
|
|
1334
|
-
function formatClassification(classification) {
|
|
1335
|
-
const customMappings = {
|
|
1336
|
-
openframe_selected: "OpenFrame Selected"
|
|
1337
|
-
};
|
|
1338
|
-
return customMappings[classification] || formatUnderscoreText(classification);
|
|
1339
|
-
}
|
|
1340
|
-
function formatPricingModel(pricingModel) {
|
|
1341
|
-
const customMappings = {
|
|
1342
|
-
one_time: "One-time Purchase",
|
|
1343
|
-
self_hosted: "Self-hosted"
|
|
1344
|
-
};
|
|
1345
|
-
return customMappings[pricingModel] || formatUnderscoreText(pricingModel);
|
|
1346
|
-
}
|
|
1347
|
-
function formatBioText(aboutHtml, fallback = "") {
|
|
1348
|
-
if (!aboutHtml || !aboutHtml.trim()) return fallback;
|
|
1349
|
-
if (aboutHtml.includes("<p")) {
|
|
1350
|
-
const paragraphs = aboutHtml.split(/<p[^<>]*>/).slice(1).map((part) => part.split("</p>")[0]).map((text) => stripHtml(text).trim()).filter((text) => text.length > 0);
|
|
1351
|
-
if (paragraphs.length > 0) return paragraphs.join(" ");
|
|
1352
|
-
}
|
|
1353
|
-
return stripHtml(aboutHtml).trim() || fallback;
|
|
1354
|
-
}
|
|
1355
|
-
|
|
1356
900
|
// src/components/ui/square-avatar.tsx
|
|
1357
901
|
import * as React4 from "react";
|
|
1358
902
|
init_cn();
|
|
1359
|
-
import { jsx as
|
|
903
|
+
import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
1360
904
|
var SquareAvatar = React4.memo(React4.forwardRef(
|
|
1361
905
|
({ className, src, alt, size = "md", fallback, variant = "square", initialsClassName, ...props }, ref) => {
|
|
1362
906
|
const sizeClasses = {
|
|
@@ -1375,7 +919,7 @@ var SquareAvatar = React4.memo(React4.forwardRef(
|
|
|
1375
919
|
square: "rounded-md",
|
|
1376
920
|
round: "rounded-full"
|
|
1377
921
|
};
|
|
1378
|
-
return /* @__PURE__ */
|
|
922
|
+
return /* @__PURE__ */ jsxs3(
|
|
1379
923
|
"div",
|
|
1380
924
|
{
|
|
1381
925
|
className: cn(
|
|
@@ -1387,7 +931,7 @@ var SquareAvatar = React4.memo(React4.forwardRef(
|
|
|
1387
931
|
ref,
|
|
1388
932
|
...props,
|
|
1389
933
|
children: [
|
|
1390
|
-
/* @__PURE__ */
|
|
934
|
+
/* @__PURE__ */ jsx5("div", { className: cn(
|
|
1391
935
|
// Initials default to `--color-text-primary` (the old
|
|
1392
936
|
// `text-ods-text-primary` value) so they stay readable on the default
|
|
1393
937
|
// `bg-ods-bg` AND on the brand accent fills (`bg-ods-flamingo-pink`
|
|
@@ -1402,7 +946,7 @@ var SquareAvatar = React4.memo(React4.forwardRef(
|
|
|
1402
946
|
initialsClassName,
|
|
1403
947
|
src && "hidden"
|
|
1404
948
|
), children: getFirstLastInitials(fallback || alt) || "?" }),
|
|
1405
|
-
src && /* @__PURE__ */
|
|
949
|
+
src && /* @__PURE__ */ jsx5(
|
|
1406
950
|
next_image_default,
|
|
1407
951
|
{
|
|
1408
952
|
className: "absolute inset-0 h-full w-full object-cover",
|
|
@@ -1508,7 +1052,7 @@ import { Check } from "lucide-react";
|
|
|
1508
1052
|
import React7, { useCallback as useCallback3 } from "react";
|
|
1509
1053
|
init_cn();
|
|
1510
1054
|
init_button();
|
|
1511
|
-
import { Fragment, jsx as
|
|
1055
|
+
import { Fragment, jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
1512
1056
|
var ROW_CLASSES = "flex flex-1 min-w-0 items-center gap-[var(--spacing-system-xsf)] p-[var(--spacing-system-s)] cursor-pointer transition-colors bg-ods-bg outline-none";
|
|
1513
1057
|
var WRAPPER_CLASSES = "relative flex items-stretch border-b border-ods-border last:border-b-0";
|
|
1514
1058
|
var SECONDARY_ACTION_CLASSES = "flex p-[var(--spacing-system-s)] shrink-0 items-center justify-center self-stretch border-l border-ods-border transition-colors hover:bg-ods-bg-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ods-focus [&_svg]:w-4 [&_svg]:h-4 md:[&_svg]:w-6 md:[&_svg]:h-6";
|
|
@@ -1529,7 +1073,7 @@ var SecondaryAction = ({ action }) => {
|
|
|
1529
1073
|
action.disabled && "cursor-not-allowed opacity-60 pointer-events-none"
|
|
1530
1074
|
);
|
|
1531
1075
|
if (action.href) {
|
|
1532
|
-
return /* @__PURE__ */
|
|
1076
|
+
return /* @__PURE__ */ jsx6(
|
|
1533
1077
|
next_link_default,
|
|
1534
1078
|
{
|
|
1535
1079
|
href: action.href,
|
|
@@ -1545,7 +1089,7 @@ var SecondaryAction = ({ action }) => {
|
|
|
1545
1089
|
}
|
|
1546
1090
|
);
|
|
1547
1091
|
}
|
|
1548
|
-
return /* @__PURE__ */
|
|
1092
|
+
return /* @__PURE__ */ jsx6(
|
|
1549
1093
|
"button",
|
|
1550
1094
|
{
|
|
1551
1095
|
type: "button",
|
|
@@ -1599,7 +1143,7 @@ var MenuItem = ({ item, onItemClick }) => {
|
|
|
1599
1143
|
[item, onItemClick]
|
|
1600
1144
|
);
|
|
1601
1145
|
if (item.type === "separator") {
|
|
1602
|
-
return /* @__PURE__ */
|
|
1146
|
+
return /* @__PURE__ */ jsx6("div", { className: "bg-ods-system-greys-soft-grey h-1 w-full" });
|
|
1603
1147
|
}
|
|
1604
1148
|
const itemClasses = cn(
|
|
1605
1149
|
ROW_CLASSES,
|
|
@@ -1610,8 +1154,8 @@ var MenuItem = ({ item, onItemClick }) => {
|
|
|
1610
1154
|
"data-[state=open]:bg-ods-bg-active focus:bg-ods-bg-hover"
|
|
1611
1155
|
);
|
|
1612
1156
|
const renderAsLink = !!item.href && item.type !== "submenu" && item.type !== "checkbox";
|
|
1613
|
-
const rowContent = /* @__PURE__ */
|
|
1614
|
-
item.icon && /* @__PURE__ */
|
|
1157
|
+
const rowContent = /* @__PURE__ */ jsxs4(Fragment, { children: [
|
|
1158
|
+
item.icon && /* @__PURE__ */ jsx6(
|
|
1615
1159
|
"div",
|
|
1616
1160
|
{
|
|
1617
1161
|
className: cn(
|
|
@@ -1622,7 +1166,7 @@ var MenuItem = ({ item, onItemClick }) => {
|
|
|
1622
1166
|
children: item.icon
|
|
1623
1167
|
}
|
|
1624
1168
|
),
|
|
1625
|
-
/* @__PURE__ */
|
|
1169
|
+
/* @__PURE__ */ jsx6(
|
|
1626
1170
|
"span",
|
|
1627
1171
|
{
|
|
1628
1172
|
className: cn(
|
|
@@ -1632,21 +1176,21 @@ var MenuItem = ({ item, onItemClick }) => {
|
|
|
1632
1176
|
children: item.label
|
|
1633
1177
|
}
|
|
1634
1178
|
),
|
|
1635
|
-
item.type === "checkbox" && /* @__PURE__ */
|
|
1179
|
+
item.type === "checkbox" && /* @__PURE__ */ jsx6(
|
|
1636
1180
|
"div",
|
|
1637
1181
|
{
|
|
1638
1182
|
className: cn(
|
|
1639
1183
|
"w-4 h-4 md:w-6 md:h-6 flex items-center justify-center rounded-md transition-colors",
|
|
1640
1184
|
item.checked ? "bg-ods-accent" : "border-2 border-ods-border bg-transparent"
|
|
1641
1185
|
),
|
|
1642
|
-
children: item.checked && /* @__PURE__ */
|
|
1186
|
+
children: item.checked && /* @__PURE__ */ jsx6(Check, { className: "w-3 h-3 md:w-4 md:h-4 text-ods-text-on-accent", strokeWidth: 3 })
|
|
1643
1187
|
}
|
|
1644
1188
|
),
|
|
1645
|
-
item.type === "submenu" && /* @__PURE__ */
|
|
1189
|
+
item.type === "submenu" && /* @__PURE__ */ jsx6(Chevron02RightIcon, { className: "w-4 h-4 md:w-6 md:h-6 text-ods-text-secondary" })
|
|
1646
1190
|
] });
|
|
1647
1191
|
if (renderAsLink && item.href) {
|
|
1648
|
-
return /* @__PURE__ */
|
|
1649
|
-
/* @__PURE__ */
|
|
1192
|
+
return /* @__PURE__ */ jsxs4("div", { className: WRAPPER_CLASSES, children: [
|
|
1193
|
+
/* @__PURE__ */ jsx6(
|
|
1650
1194
|
next_link_default,
|
|
1651
1195
|
{
|
|
1652
1196
|
href: item.href,
|
|
@@ -1658,13 +1202,13 @@ var MenuItem = ({ item, onItemClick }) => {
|
|
|
1658
1202
|
children: rowContent
|
|
1659
1203
|
}
|
|
1660
1204
|
),
|
|
1661
|
-
item.iconAction && /* @__PURE__ */
|
|
1205
|
+
item.iconAction && /* @__PURE__ */ jsx6(SecondaryAction, { action: item.iconAction })
|
|
1662
1206
|
] });
|
|
1663
1207
|
}
|
|
1664
1208
|
if (item.type === "submenu" && item.submenu) {
|
|
1665
|
-
return /* @__PURE__ */
|
|
1666
|
-
/* @__PURE__ */
|
|
1667
|
-
/* @__PURE__ */
|
|
1209
|
+
return /* @__PURE__ */ jsxs4("div", { className: WRAPPER_CLASSES, children: [
|
|
1210
|
+
/* @__PURE__ */ jsxs4(DropdownMenuPrimitive.Sub, { children: [
|
|
1211
|
+
/* @__PURE__ */ jsx6(
|
|
1668
1212
|
DropdownMenuPrimitive.SubTrigger,
|
|
1669
1213
|
{
|
|
1670
1214
|
disabled: item.disabled,
|
|
@@ -1672,12 +1216,12 @@ var MenuItem = ({ item, onItemClick }) => {
|
|
|
1672
1216
|
children: rowContent
|
|
1673
1217
|
}
|
|
1674
1218
|
),
|
|
1675
|
-
/* @__PURE__ */
|
|
1219
|
+
/* @__PURE__ */ jsx6(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx6(
|
|
1676
1220
|
DropdownMenuPrimitive.SubContent,
|
|
1677
1221
|
{
|
|
1678
1222
|
sideOffset: 4,
|
|
1679
1223
|
className: "z-[1500] min-w-[256px] max-h-[var(--radix-popper-available-height)] bg-ods-bg border border-ods-border rounded-md shadow-xl overflow-y-auto p-0",
|
|
1680
|
-
children: item.submenu.map((subItem, index) => /* @__PURE__ */
|
|
1224
|
+
children: item.submenu.map((subItem, index) => /* @__PURE__ */ jsx6(
|
|
1681
1225
|
MenuItem,
|
|
1682
1226
|
{
|
|
1683
1227
|
item: subItem,
|
|
@@ -1688,11 +1232,11 @@ var MenuItem = ({ item, onItemClick }) => {
|
|
|
1688
1232
|
}
|
|
1689
1233
|
) })
|
|
1690
1234
|
] }),
|
|
1691
|
-
item.iconAction && /* @__PURE__ */
|
|
1235
|
+
item.iconAction && /* @__PURE__ */ jsx6(SecondaryAction, { action: item.iconAction })
|
|
1692
1236
|
] });
|
|
1693
1237
|
}
|
|
1694
|
-
return /* @__PURE__ */
|
|
1695
|
-
/* @__PURE__ */
|
|
1238
|
+
return /* @__PURE__ */ jsxs4("div", { className: WRAPPER_CLASSES, children: [
|
|
1239
|
+
/* @__PURE__ */ jsx6(
|
|
1696
1240
|
"div",
|
|
1697
1241
|
{
|
|
1698
1242
|
role: "menuitem",
|
|
@@ -1704,23 +1248,23 @@ var MenuItem = ({ item, onItemClick }) => {
|
|
|
1704
1248
|
children: rowContent
|
|
1705
1249
|
}
|
|
1706
1250
|
),
|
|
1707
|
-
item.iconAction && /* @__PURE__ */
|
|
1251
|
+
item.iconAction && /* @__PURE__ */ jsx6(SecondaryAction, { action: item.iconAction })
|
|
1708
1252
|
] });
|
|
1709
1253
|
};
|
|
1710
|
-
var GroupSeparator = () => /* @__PURE__ */
|
|
1254
|
+
var GroupSeparator = () => /* @__PURE__ */ jsx6("div", { className: "bg-ods-bg-surface h-[3px] w-full" });
|
|
1711
1255
|
var ActionsMenu = ({
|
|
1712
1256
|
groups,
|
|
1713
1257
|
className = "",
|
|
1714
1258
|
onItemClick
|
|
1715
1259
|
}) => {
|
|
1716
|
-
return /* @__PURE__ */
|
|
1260
|
+
return /* @__PURE__ */ jsx6(
|
|
1717
1261
|
"div",
|
|
1718
1262
|
{
|
|
1719
1263
|
className: `relative min-w-[256px] max-h-[var(--radix-popper-available-height)] bg-ods-bg border border-ods-border rounded-md shadow-lg overflow-y-auto ${className}`,
|
|
1720
1264
|
children: groups.map((group, groupIndex) => {
|
|
1721
1265
|
const groupKey = group.id || group.items.map((i) => i.id).join("|");
|
|
1722
|
-
return /* @__PURE__ */
|
|
1723
|
-
group.items.map((item, itemIndex) => /* @__PURE__ */
|
|
1266
|
+
return /* @__PURE__ */ jsxs4(React7.Fragment, { children: [
|
|
1267
|
+
group.items.map((item, itemIndex) => /* @__PURE__ */ jsx6(
|
|
1724
1268
|
MenuItem,
|
|
1725
1269
|
{
|
|
1726
1270
|
item,
|
|
@@ -1728,7 +1272,7 @@ var ActionsMenu = ({
|
|
|
1728
1272
|
},
|
|
1729
1273
|
item.id || `${groupKey}-${itemIndex}`
|
|
1730
1274
|
)),
|
|
1731
|
-
group.separator && groupIndex < groups.length - 1 && /* @__PURE__ */
|
|
1275
|
+
group.separator && groupIndex < groups.length - 1 && /* @__PURE__ */ jsx6(GroupSeparator, {})
|
|
1732
1276
|
] }, groupKey);
|
|
1733
1277
|
})
|
|
1734
1278
|
}
|
|
@@ -1764,18 +1308,18 @@ var ActionsMenuDropdown = ({
|
|
|
1764
1308
|
},
|
|
1765
1309
|
[onItemClick, setOpen]
|
|
1766
1310
|
);
|
|
1767
|
-
return /* @__PURE__ */
|
|
1768
|
-
/* @__PURE__ */
|
|
1311
|
+
return /* @__PURE__ */ jsxs4(DropdownMenu, { open, onOpenChange: setOpen, modal: false, children: [
|
|
1312
|
+
/* @__PURE__ */ jsx6(DropdownMenuTrigger, { asChild: true, children: customTrigger ?? /* @__PURE__ */ jsx6(
|
|
1769
1313
|
Button,
|
|
1770
1314
|
{
|
|
1771
1315
|
variant: "outline",
|
|
1772
1316
|
size: "icon",
|
|
1773
1317
|
"aria-label": triggerAriaLabel,
|
|
1774
1318
|
className: triggerClassName || "bg-ods-card border-ods-border hover:bg-ods-bg-hover flex items-center justify-center focus-visible:ring-0",
|
|
1775
|
-
leftIcon: trigger ?? /* @__PURE__ */
|
|
1319
|
+
leftIcon: trigger ?? /* @__PURE__ */ jsx6(Ellipsis01Icon, { size: 24, className: "text-ods-text-primary" })
|
|
1776
1320
|
}
|
|
1777
1321
|
) }),
|
|
1778
|
-
/* @__PURE__ */
|
|
1322
|
+
/* @__PURE__ */ jsx6(
|
|
1779
1323
|
DropdownMenuContent,
|
|
1780
1324
|
{
|
|
1781
1325
|
align,
|
|
@@ -1786,7 +1330,7 @@ var ActionsMenuDropdown = ({
|
|
|
1786
1330
|
"p-0 border-0 bg-transparent shadow-none overflow-visible",
|
|
1787
1331
|
contentClassName
|
|
1788
1332
|
),
|
|
1789
|
-
children: /* @__PURE__ */
|
|
1333
|
+
children: /* @__PURE__ */ jsx6(
|
|
1790
1334
|
ActionsMenu,
|
|
1791
1335
|
{
|
|
1792
1336
|
groups,
|
|
@@ -1799,69 +1343,6 @@ var ActionsMenuDropdown = ({
|
|
|
1799
1343
|
] });
|
|
1800
1344
|
};
|
|
1801
1345
|
|
|
1802
|
-
// src/utils/image-proxy.ts
|
|
1803
|
-
function getProxiedImageUrl(imageUrl, options) {
|
|
1804
|
-
if (!imageUrl) return null;
|
|
1805
|
-
const proxyPrefix = options?.proxyPrefix;
|
|
1806
|
-
const skipDomains = options?.skipDomains ?? [];
|
|
1807
|
-
const directHttps = options?.directHttps ?? false;
|
|
1808
|
-
if (proxyPrefix && imageUrl.includes(proxyPrefix)) {
|
|
1809
|
-
return imageUrl;
|
|
1810
|
-
}
|
|
1811
|
-
if (!imageUrl.startsWith("http://") && !imageUrl.startsWith("https://")) {
|
|
1812
|
-
return imageUrl;
|
|
1813
|
-
}
|
|
1814
|
-
if (directHttps && imageUrl.startsWith("https://")) {
|
|
1815
|
-
return imageUrl;
|
|
1816
|
-
}
|
|
1817
|
-
if (!proxyPrefix) {
|
|
1818
|
-
return imageUrl;
|
|
1819
|
-
}
|
|
1820
|
-
for (const domain of skipDomains) {
|
|
1821
|
-
if (imageUrl.includes(domain)) {
|
|
1822
|
-
return imageUrl;
|
|
1823
|
-
}
|
|
1824
|
-
}
|
|
1825
|
-
return `${proxyPrefix}?url=${encodeURIComponent(imageUrl)}`;
|
|
1826
|
-
}
|
|
1827
|
-
function urlPathLooksLikeSvg(imageUrl) {
|
|
1828
|
-
try {
|
|
1829
|
-
return /\.svg$/i.test(new URL(imageUrl).pathname);
|
|
1830
|
-
} catch {
|
|
1831
|
-
return /\.svg(\?|#|$)/i.test(imageUrl);
|
|
1832
|
-
}
|
|
1833
|
-
}
|
|
1834
|
-
function shouldProxyImage(imageUrl, proxyPrefix) {
|
|
1835
|
-
if (!imageUrl) return false;
|
|
1836
|
-
if (!imageUrl.startsWith("http://") && !imageUrl.startsWith("https://")) return false;
|
|
1837
|
-
if (proxyPrefix && imageUrl.includes(proxyPrefix)) return false;
|
|
1838
|
-
return true;
|
|
1839
|
-
}
|
|
1840
|
-
function generateImageSizes(_url) {
|
|
1841
|
-
return `(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw`;
|
|
1842
|
-
}
|
|
1843
|
-
|
|
1844
|
-
// src/components/chat/utils/is-cross-origin-url.ts
|
|
1845
|
-
function isCrossOriginUrl(url) {
|
|
1846
|
-
if (!url) return false;
|
|
1847
|
-
if (url.startsWith("/") && !url.startsWith("//")) return false;
|
|
1848
|
-
return true;
|
|
1849
|
-
}
|
|
1850
|
-
|
|
1851
|
-
// src/components/chat/utils/decide-new-tab.ts
|
|
1852
|
-
function decideNewTab(input) {
|
|
1853
|
-
const { href, targetPlatform, openIn, alwaysNewTab, runtimeMode, currentSource } = input;
|
|
1854
|
-
if (runtimeMode === "embed") return true;
|
|
1855
|
-
if (openIn === "new-tab") return true;
|
|
1856
|
-
if (alwaysNewTab === true) return true;
|
|
1857
|
-
if (openIn === "same-tab") return false;
|
|
1858
|
-
if (targetPlatform !== void 0 && targetPlatform !== null && currentSource) {
|
|
1859
|
-
return targetPlatform !== currentSource;
|
|
1860
|
-
}
|
|
1861
|
-
if (!href) return false;
|
|
1862
|
-
return isCrossOriginUrl(href);
|
|
1863
|
-
}
|
|
1864
|
-
|
|
1865
1346
|
// src/components/chat/utils/nav-anchor-props.ts
|
|
1866
1347
|
function computeIsNewTab(runtime, href, targetPlatform) {
|
|
1867
1348
|
if (!href) return false;
|
|
@@ -1879,56 +1360,9 @@ function buildAnchorProps(href, isNewTab) {
|
|
|
1879
1360
|
return href ? { href, ...newTabAnchorAttrs(isNewTab) } : void 0;
|
|
1880
1361
|
}
|
|
1881
1362
|
|
|
1882
|
-
// src/components/chat/utils/chat-nav-resolution.ts
|
|
1883
|
-
var NEW_TAB_FEATURES = "noopener,noreferrer";
|
|
1884
|
-
function isModifierClick(e) {
|
|
1885
|
-
return e.button !== 0 || !!e.metaKey || !!e.ctrlKey || !!e.shiftKey || !!e.altKey;
|
|
1886
|
-
}
|
|
1887
|
-
function stripSameOriginToPath(href) {
|
|
1888
|
-
if (!href.startsWith("http")) return href;
|
|
1889
|
-
try {
|
|
1890
|
-
const u = new URL(href);
|
|
1891
|
-
return u.pathname + u.search + u.hash;
|
|
1892
|
-
} catch {
|
|
1893
|
-
return href;
|
|
1894
|
-
}
|
|
1895
|
-
}
|
|
1896
|
-
function resolveHrefForRuntime(href, runtime) {
|
|
1897
|
-
if (runtime.navigation.mode !== "embed") return href;
|
|
1898
|
-
if (href.startsWith("http")) return href;
|
|
1899
|
-
if (href.startsWith("//")) return href;
|
|
1900
|
-
const origin = runtime.navigation.defaultContentOrigin;
|
|
1901
|
-
if (!origin) return href;
|
|
1902
|
-
return origin.replace(/\/+$/, "") + (href.startsWith("/") ? href : "/" + href);
|
|
1903
|
-
}
|
|
1904
|
-
function resolveExternalNavigation(args) {
|
|
1905
|
-
let abs = args.href;
|
|
1906
|
-
if (abs.startsWith("//")) abs = window.location.protocol + abs;
|
|
1907
|
-
if (!abs.startsWith("http")) {
|
|
1908
|
-
if (args.runtime.navigation.defaultContentOrigin) {
|
|
1909
|
-
let origin = args.runtime.navigation.defaultContentOrigin;
|
|
1910
|
-
while (origin.endsWith("/")) origin = origin.slice(0, -1);
|
|
1911
|
-
abs = origin + (abs.startsWith("/") ? abs : "/" + abs);
|
|
1912
|
-
} else if (args.runtime.navigation.mode === "embed" && process.env.NODE_ENV !== "production") {
|
|
1913
|
-
console.warn(
|
|
1914
|
-
"[chat-nav-resolution] relative href in embed mode with no defaultContentOrigin set on runtime.navigation \u2014 link will resolve against the embedder origin.",
|
|
1915
|
-
{ href: abs, targetPlatform: args.targetPlatform }
|
|
1916
|
-
);
|
|
1917
|
-
}
|
|
1918
|
-
}
|
|
1919
|
-
const open = () => {
|
|
1920
|
-
if (args.runtime.navigation.openExternal) {
|
|
1921
|
-
args.runtime.navigation.openExternal(abs);
|
|
1922
|
-
} else {
|
|
1923
|
-
window.open(abs, "_blank", NEW_TAB_FEATURES);
|
|
1924
|
-
}
|
|
1925
|
-
};
|
|
1926
|
-
return { href: abs, open };
|
|
1927
|
-
}
|
|
1928
|
-
|
|
1929
1363
|
// src/components/chat/entity-cards/entity-author-card.tsx
|
|
1930
1364
|
init_next_link();
|
|
1931
|
-
import { jsx as
|
|
1365
|
+
import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
1932
1366
|
var EMPTY_AUTHOR_PLACEHOLDER = {
|
|
1933
1367
|
full_name: "\u2014",
|
|
1934
1368
|
avatar_url: null,
|
|
@@ -1940,9 +1374,9 @@ function EntityMetadataValueCell({
|
|
|
1940
1374
|
className,
|
|
1941
1375
|
uppercase = true
|
|
1942
1376
|
}) {
|
|
1943
|
-
return /* @__PURE__ */
|
|
1944
|
-
/* @__PURE__ */
|
|
1945
|
-
/* @__PURE__ */
|
|
1377
|
+
return /* @__PURE__ */ jsx7("div", { className: `bg-ods-card p-4 flex flex-col gap-3 ${className ?? ""}`, children: /* @__PURE__ */ jsxs5("div", { className: "flex flex-col gap-0", children: [
|
|
1378
|
+
/* @__PURE__ */ jsx7("p", { className: "text-h4 text-ods-text-primary", children: uppercase ? value.toLocaleUpperCase() : value }),
|
|
1379
|
+
/* @__PURE__ */ jsx7("p", { className: "font-['DM_Sans'] font-medium text-[14px] leading-[20px] text-ods-text-secondary", children: label })
|
|
1946
1380
|
] }) });
|
|
1947
1381
|
}
|
|
1948
1382
|
function EntityMetadataAuthorCell({
|
|
@@ -1953,8 +1387,8 @@ function EntityMetadataAuthorCell({
|
|
|
1953
1387
|
}) {
|
|
1954
1388
|
const trimmedName = typeof author.full_name === "string" ? author.full_name.trim() : "";
|
|
1955
1389
|
const fullName = trimmedName || "Unknown Author";
|
|
1956
|
-
return /* @__PURE__ */
|
|
1957
|
-
/* @__PURE__ */
|
|
1390
|
+
return /* @__PURE__ */ jsxs5("div", { className: `bg-ods-card p-4 flex items-center gap-3 ${className ?? ""}`, children: [
|
|
1391
|
+
/* @__PURE__ */ jsx7(
|
|
1958
1392
|
SquareAvatar,
|
|
1959
1393
|
{
|
|
1960
1394
|
src: author.avatar_url || "",
|
|
@@ -1964,9 +1398,9 @@ function EntityMetadataAuthorCell({
|
|
|
1964
1398
|
variant: "round"
|
|
1965
1399
|
}
|
|
1966
1400
|
),
|
|
1967
|
-
/* @__PURE__ */
|
|
1968
|
-
/* @__PURE__ */
|
|
1969
|
-
/* @__PURE__ */
|
|
1401
|
+
/* @__PURE__ */ jsxs5("div", { className: "flex flex-col gap-0 flex-1 min-w-0", children: [
|
|
1402
|
+
/* @__PURE__ */ jsx7("p", { className: "text-h3 tracking-[-0.36px] text-ods-text-primary truncate", title: fullName, children: authorHref && trimmedName ? /* @__PURE__ */ jsx7(next_link_default, { href: authorHref, className: "hover:text-ods-accent transition-colors", children: fullName }) : fullName }),
|
|
1403
|
+
/* @__PURE__ */ jsx7("p", { className: "font-['DM_Sans'] font-medium text-[14px] leading-[20px] text-ods-text-secondary", children: author.job_title || roleLabel })
|
|
1970
1404
|
] })
|
|
1971
1405
|
] });
|
|
1972
1406
|
}
|
|
@@ -1990,12 +1424,12 @@ function EntityAuthorCard({
|
|
|
1990
1424
|
const totalCells = extras.length + (showDateCell ? 1 : 0) + 1;
|
|
1991
1425
|
const gridColsClass = totalCells >= 4 ? "md:grid-cols-4" : totalCells === 3 ? "md:grid-cols-3" : totalCells === 2 ? "md:grid-cols-2" : "md:grid-cols-1";
|
|
1992
1426
|
const dividerClass = "border-b md:border-b-0 md:border-r border-ods-border";
|
|
1993
|
-
return /* @__PURE__ */
|
|
1427
|
+
return /* @__PURE__ */ jsxs5(
|
|
1994
1428
|
"div",
|
|
1995
1429
|
{
|
|
1996
1430
|
className: `grid grid-cols-1 ${gridColsClass} border border-ods-border rounded-md overflow-hidden w-full ${className ?? ""}`,
|
|
1997
1431
|
children: [
|
|
1998
|
-
extras.map((cell, i) => /* @__PURE__ */
|
|
1432
|
+
extras.map((cell, i) => /* @__PURE__ */ jsx7(
|
|
1999
1433
|
EntityMetadataValueCell,
|
|
2000
1434
|
{
|
|
2001
1435
|
value: cell.value,
|
|
@@ -2005,7 +1439,7 @@ function EntityAuthorCard({
|
|
|
2005
1439
|
},
|
|
2006
1440
|
`${cell.label}-${i}`
|
|
2007
1441
|
)),
|
|
2008
|
-
showDateCell && /* @__PURE__ */
|
|
1442
|
+
showDateCell && /* @__PURE__ */ jsx7(
|
|
2009
1443
|
EntityMetadataValueCell,
|
|
2010
1444
|
{
|
|
2011
1445
|
value: dateLabel,
|
|
@@ -2014,21 +1448,21 @@ function EntityAuthorCard({
|
|
|
2014
1448
|
className: dividerClass
|
|
2015
1449
|
}
|
|
2016
1450
|
),
|
|
2017
|
-
/* @__PURE__ */
|
|
1451
|
+
/* @__PURE__ */ jsx7(EntityMetadataAuthorCell, { author: effectiveAuthor, roleLabel, authorHref })
|
|
2018
1452
|
]
|
|
2019
1453
|
}
|
|
2020
1454
|
);
|
|
2021
1455
|
}
|
|
2022
1456
|
|
|
2023
1457
|
// src/components/chat/entity-cards/blog-image-placeholder.tsx
|
|
2024
|
-
import { jsx as
|
|
1458
|
+
import { jsx as jsx8 } from "react/jsx-runtime";
|
|
2025
1459
|
function BlogImagePlaceholder({
|
|
2026
1460
|
imageUrl,
|
|
2027
1461
|
title,
|
|
2028
1462
|
className = ""
|
|
2029
1463
|
}) {
|
|
2030
1464
|
if (!imageUrl) return null;
|
|
2031
|
-
return /* @__PURE__ */
|
|
1465
|
+
return /* @__PURE__ */ jsx8("span", { className: `relative block w-full h-full overflow-hidden bg-ods-bg ${className}`, children: /* @__PURE__ */ jsx8(
|
|
2032
1466
|
"img",
|
|
2033
1467
|
{
|
|
2034
1468
|
src: imageUrl,
|
|
@@ -2042,19 +1476,10 @@ function BlogImagePlaceholder({
|
|
|
2042
1476
|
) });
|
|
2043
1477
|
}
|
|
2044
1478
|
|
|
2045
|
-
// src/utils/fetch-priority.ts
|
|
2046
|
-
import React8 from "react";
|
|
2047
|
-
var REACT_MAJOR = parseInt((React8.version || "0").split(".")[0], 10);
|
|
2048
|
-
var USE_CAMEL_CASE_FETCH_PRIORITY = REACT_MAJOR >= 19;
|
|
2049
|
-
function fetchPriorityProp(priority) {
|
|
2050
|
-
const value = priority === void 0 ? "auto" : typeof priority === "boolean" ? priority ? "high" : "low" : priority;
|
|
2051
|
-
return USE_CAMEL_CASE_FETCH_PRIORITY ? { fetchPriority: value } : { fetchpriority: value };
|
|
2052
|
-
}
|
|
2053
|
-
|
|
2054
1479
|
// src/components/features/video.tsx
|
|
2055
1480
|
import { useEffect as useEffect4, useMemo as useMemo3, useRef as useRef4, useState as useState3 } from "react";
|
|
2056
1481
|
import MuxPlayer from "@mux/mux-player-react";
|
|
2057
|
-
import { jsx as
|
|
1482
|
+
import { jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
2058
1483
|
if (typeof window !== "undefined") {
|
|
2059
1484
|
const w = window;
|
|
2060
1485
|
if (!w.chrome?.cast) {
|
|
@@ -2115,7 +1540,7 @@ function Video(props) {
|
|
|
2115
1540
|
if (!url) return null;
|
|
2116
1541
|
const effectiveKind = resolveKind(props, url);
|
|
2117
1542
|
const layout = props.layout ?? "native";
|
|
2118
|
-
const inner = effectiveKind === "youtube" ? /* @__PURE__ */
|
|
1543
|
+
const inner = effectiveKind === "youtube" ? /* @__PURE__ */ jsx9(
|
|
2119
1544
|
YouTubeFacade,
|
|
2120
1545
|
{
|
|
2121
1546
|
url,
|
|
@@ -2124,7 +1549,7 @@ function Video(props) {
|
|
|
2124
1549
|
className: props.className,
|
|
2125
1550
|
minimalControls: props.minimalControls
|
|
2126
1551
|
}
|
|
2127
|
-
) : /* @__PURE__ */
|
|
1552
|
+
) : /* @__PURE__ */ jsx9(
|
|
2128
1553
|
FilePlayer,
|
|
2129
1554
|
{
|
|
2130
1555
|
url,
|
|
@@ -2148,9 +1573,9 @@ function resolveKind(props, url) {
|
|
|
2148
1573
|
function wrapWithLayout(inner, layout) {
|
|
2149
1574
|
switch (layout) {
|
|
2150
1575
|
case "centered":
|
|
2151
|
-
return /* @__PURE__ */
|
|
1576
|
+
return /* @__PURE__ */ jsx9("div", { className: "flex justify-center w-full", children: /* @__PURE__ */ jsx9("div", { className: "w-full max-w-3xl aspect-video rounded-lg overflow-hidden border border-ods-border", children: inner }) });
|
|
2152
1577
|
case "fill":
|
|
2153
|
-
return /* @__PURE__ */
|
|
1578
|
+
return /* @__PURE__ */ jsx9("div", { className: "absolute inset-0 w-full h-full", children: inner });
|
|
2154
1579
|
case "native":
|
|
2155
1580
|
default:
|
|
2156
1581
|
return inner;
|
|
@@ -2169,7 +1594,7 @@ function FilePlayer({
|
|
|
2169
1594
|
"[Video] srtContent supplied without captionsUrl \u2014 captions will not render. Pass captionsUrl (the VTT URL) instead; raw SRT text overlays are no longer supported."
|
|
2170
1595
|
);
|
|
2171
1596
|
}
|
|
2172
|
-
return /* @__PURE__ */
|
|
1597
|
+
return /* @__PURE__ */ jsx9(
|
|
2173
1598
|
MuxPlayer,
|
|
2174
1599
|
{
|
|
2175
1600
|
src: url,
|
|
@@ -2181,7 +1606,7 @@ function FilePlayer({
|
|
|
2181
1606
|
accentColor: "var(--ods-accent, var(--color-accent-primary))",
|
|
2182
1607
|
className,
|
|
2183
1608
|
style: { width: "100%", height: "100%" },
|
|
2184
|
-
children: captionsUrl ? /* @__PURE__ */
|
|
1609
|
+
children: captionsUrl ? /* @__PURE__ */ jsx9(
|
|
2185
1610
|
"track",
|
|
2186
1611
|
{
|
|
2187
1612
|
kind: "captions",
|
|
@@ -2203,7 +1628,7 @@ function YouTubeFacade({
|
|
|
2203
1628
|
}) {
|
|
2204
1629
|
const videoId = extractYouTubeId(url);
|
|
2205
1630
|
if (!videoId) return null;
|
|
2206
|
-
return /* @__PURE__ */
|
|
1631
|
+
return /* @__PURE__ */ jsx9(YouTubeFacadeInner, { videoId, title, priority, className, minimalControls });
|
|
2207
1632
|
}
|
|
2208
1633
|
var YT_NOCOOKIE_ORIGIN = "https://www.youtube-nocookie.com";
|
|
2209
1634
|
var YT_STATE_ENDED = 0;
|
|
@@ -2289,7 +1714,7 @@ function YouTubeFacadeInner({
|
|
|
2289
1714
|
const wrapperClass = `relative w-full ${className ?? ""}`;
|
|
2290
1715
|
const wrapperStyle = { paddingBottom: "56.25%" };
|
|
2291
1716
|
if (activated) {
|
|
2292
|
-
return /* @__PURE__ */
|
|
1717
|
+
return /* @__PURE__ */ jsx9("div", { className: wrapperClass, style: wrapperStyle, children: /* @__PURE__ */ jsx9(
|
|
2293
1718
|
"iframe",
|
|
2294
1719
|
{
|
|
2295
1720
|
ref: iframeRef,
|
|
@@ -2301,7 +1726,7 @@ function YouTubeFacadeInner({
|
|
|
2301
1726
|
}
|
|
2302
1727
|
) });
|
|
2303
1728
|
}
|
|
2304
|
-
return /* @__PURE__ */
|
|
1729
|
+
return /* @__PURE__ */ jsx9("div", { className: wrapperClass, style: wrapperStyle, children: /* @__PURE__ */ jsxs6(
|
|
2305
1730
|
"button",
|
|
2306
1731
|
{
|
|
2307
1732
|
type: "button",
|
|
@@ -2309,9 +1734,9 @@ function YouTubeFacadeInner({
|
|
|
2309
1734
|
onClick: () => setActivated(true),
|
|
2310
1735
|
className: "group absolute inset-0 p-0 m-0 border border-ods-border rounded-lg overflow-hidden bg-ods-card cursor-pointer",
|
|
2311
1736
|
children: [
|
|
2312
|
-
/* @__PURE__ */
|
|
2313
|
-
/* @__PURE__ */
|
|
2314
|
-
/* @__PURE__ */
|
|
1737
|
+
/* @__PURE__ */ jsxs6("picture", { children: [
|
|
1738
|
+
/* @__PURE__ */ jsx9("source", { type: "image/webp", srcSet: posterWebp }),
|
|
1739
|
+
/* @__PURE__ */ jsx9(
|
|
2315
1740
|
"img",
|
|
2316
1741
|
{
|
|
2317
1742
|
src: posterJpg,
|
|
@@ -2323,35 +1748,14 @@ function YouTubeFacadeInner({
|
|
|
2323
1748
|
}
|
|
2324
1749
|
)
|
|
2325
1750
|
] }),
|
|
2326
|
-
/* @__PURE__ */
|
|
1751
|
+
/* @__PURE__ */ jsx9("div", { className: "absolute inset-0 flex items-center justify-center bg-ods-bg-inverse bg-opacity-20 transition-opacity duration-200 group-hover:bg-opacity-30", children: /* @__PURE__ */ jsx9("span", { className: "flex items-center justify-center w-16 h-16 rounded-full bg-ods-accent text-ods-text-on-accent shadow-lg transition-transform duration-200 group-hover:scale-110", children: /* @__PURE__ */ jsx9(PlayIcon, { size: 24, color: "currentColor", className: "ml-1" }) }) })
|
|
2327
1752
|
]
|
|
2328
1753
|
}
|
|
2329
1754
|
) });
|
|
2330
1755
|
}
|
|
2331
1756
|
|
|
2332
|
-
// src/components/layout/page-heading.tsx
|
|
2333
|
-
import { Fragment as Fragment2, jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
2334
|
-
var PAGE_HEADING_CLASS = "text-h1 text-ods-text-primary";
|
|
2335
|
-
var SECTION_HEADING_CLASS = "text-h2 text-ods-text-primary";
|
|
2336
|
-
var DESCRIPTION_CLASS = "mt-6 max-w-[640px] font-['DM_Sans'] text-[16px] md:text-[18px] leading-[24px] md:leading-[28px] text-ods-text-secondary";
|
|
2337
|
-
function PageHeading({
|
|
2338
|
-
children,
|
|
2339
|
-
as: Tag2 = "h1",
|
|
2340
|
-
description,
|
|
2341
|
-
className,
|
|
2342
|
-
descriptionClassName
|
|
2343
|
-
}) {
|
|
2344
|
-
const headingClass = className ? `${PAGE_HEADING_CLASS} ${className}` : PAGE_HEADING_CLASS;
|
|
2345
|
-
const descClass = descriptionClassName ? `${DESCRIPTION_CLASS} ${descriptionClassName}` : DESCRIPTION_CLASS;
|
|
2346
|
-
const hasDescription = description != null && description !== "" && typeof description !== "boolean";
|
|
2347
|
-
return /* @__PURE__ */ jsxs9(Fragment2, { children: [
|
|
2348
|
-
/* @__PURE__ */ jsx12(Tag2, { className: headingClass, children }),
|
|
2349
|
-
hasDescription && /* @__PURE__ */ jsx12("p", { className: descClass, children: description })
|
|
2350
|
-
] });
|
|
2351
|
-
}
|
|
2352
|
-
|
|
2353
1757
|
// src/components/features/video-ratio-tabs.tsx
|
|
2354
|
-
import { Fragment as
|
|
1758
|
+
import { Fragment as Fragment2, jsx as jsx10, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
2355
1759
|
var TAB_TRIGGER_CLASS = "rounded-none border-b-2 border-transparent data-[state=active]:border-ods-accent data-[state=active]:bg-transparent data-[state=active]:shadow-none px-4 py-2 text-sm text-ods-text-secondary data-[state=active]:text-ods-text-primary";
|
|
2356
1760
|
var RATIO_GRID_CLASS = {
|
|
2357
1761
|
portrait: "grid grid-cols-2 md:grid-cols-3 gap-4",
|
|
@@ -2376,17 +1780,17 @@ function RatioTabs({
|
|
|
2376
1780
|
const activeTabs = RATIO_TAB_CONFIG.filter((t) => groups[t.key].count > 0);
|
|
2377
1781
|
if (activeTabs.length <= 1) {
|
|
2378
1782
|
const active = activeTabs[0];
|
|
2379
|
-
return active ? /* @__PURE__ */
|
|
1783
|
+
return active ? /* @__PURE__ */ jsx10(Fragment2, { children: groups[active.key].render() }) : null;
|
|
2380
1784
|
}
|
|
2381
1785
|
const firstTab = defaultTab && groups[defaultTab].count > 0 ? defaultTab : activeTabs[0].key;
|
|
2382
|
-
return /* @__PURE__ */
|
|
2383
|
-
/* @__PURE__ */
|
|
1786
|
+
return /* @__PURE__ */ jsxs7(Tabs, { defaultValue: firstTab, className: `w-full ${className}`, children: [
|
|
1787
|
+
/* @__PURE__ */ jsx10(TabsList, { className: "inline-flex justify-start rounded-none bg-transparent h-auto p-0 gap-0 mb-2", children: activeTabs.map((t) => /* @__PURE__ */ jsxs7(TabsTrigger, { value: t.key, className: TAB_TRIGGER_CLASS, children: [
|
|
2384
1788
|
t.label,
|
|
2385
1789
|
" (",
|
|
2386
1790
|
groups[t.key].count,
|
|
2387
1791
|
")"
|
|
2388
1792
|
] }, t.key)) }),
|
|
2389
|
-
activeTabs.map((t) => /* @__PURE__ */
|
|
1793
|
+
activeTabs.map((t) => /* @__PURE__ */ jsx10(
|
|
2390
1794
|
TabsContent,
|
|
2391
1795
|
{
|
|
2392
1796
|
value: t.key,
|
|
@@ -2429,7 +1833,7 @@ function groupByAspectRatio(items, getAspectRatio) {
|
|
|
2429
1833
|
|
|
2430
1834
|
// src/components/features/video-bites-display.tsx
|
|
2431
1835
|
import { useMemo as useMemo4 } from "react";
|
|
2432
|
-
import { jsx as
|
|
1836
|
+
import { jsx as jsx11, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
2433
1837
|
var RATIO_TO_CSS_ASPECT = {
|
|
2434
1838
|
portrait: "9 / 16",
|
|
2435
1839
|
square: "1 / 1",
|
|
@@ -2437,7 +1841,7 @@ var RATIO_TO_CSS_ASPECT = {
|
|
|
2437
1841
|
};
|
|
2438
1842
|
function LazyBite({ ratio, children }) {
|
|
2439
1843
|
const { ref, isNear } = useNearViewport("500px");
|
|
2440
|
-
return /* @__PURE__ */
|
|
1844
|
+
return /* @__PURE__ */ jsx11("div", { ref, style: { aspectRatio: RATIO_TO_CSS_ASPECT[ratio] }, children: isNear ? children : /* @__PURE__ */ jsx11("div", { className: "w-full h-full bg-ods-card rounded-md" }) });
|
|
2441
1845
|
}
|
|
2442
1846
|
function VideoBitesDisplay({
|
|
2443
1847
|
bites,
|
|
@@ -2460,27 +1864,27 @@ function VideoBitesDisplay({
|
|
|
2460
1864
|
}, [bites, filterPublished]);
|
|
2461
1865
|
const totalCount = grouped.portrait.length + grouped.square.length + grouped.landscape.length;
|
|
2462
1866
|
if (totalCount === 0) return null;
|
|
2463
|
-
return /* @__PURE__ */
|
|
2464
|
-
showTitle && /* @__PURE__ */
|
|
2465
|
-
grouped.hasMultiple ? /* @__PURE__ */
|
|
1867
|
+
return /* @__PURE__ */ jsxs8("div", { className: "flex flex-col gap-6 w-full min-w-0", children: [
|
|
1868
|
+
showTitle && /* @__PURE__ */ jsx11("h2", { className: `${SECTION_HEADING_CLASS} break-words`, children: title }),
|
|
1869
|
+
grouped.hasMultiple ? /* @__PURE__ */ jsx11(
|
|
2466
1870
|
RatioTabs,
|
|
2467
1871
|
{
|
|
2468
1872
|
groups: {
|
|
2469
1873
|
portrait: {
|
|
2470
1874
|
count: grouped.portrait.length,
|
|
2471
|
-
render: () => /* @__PURE__ */
|
|
1875
|
+
render: () => /* @__PURE__ */ jsx11(BiteGrid, { bites: grouped.portrait, ratio: "portrait" })
|
|
2472
1876
|
},
|
|
2473
1877
|
square: {
|
|
2474
1878
|
count: grouped.square.length,
|
|
2475
|
-
render: () => /* @__PURE__ */
|
|
1879
|
+
render: () => /* @__PURE__ */ jsx11(BiteGrid, { bites: grouped.square, ratio: "square" })
|
|
2476
1880
|
},
|
|
2477
1881
|
landscape: {
|
|
2478
1882
|
count: grouped.landscape.length,
|
|
2479
|
-
render: () => /* @__PURE__ */
|
|
1883
|
+
render: () => /* @__PURE__ */ jsx11(BiteGrid, { bites: grouped.landscape, ratio: "landscape" })
|
|
2480
1884
|
}
|
|
2481
1885
|
}
|
|
2482
1886
|
}
|
|
2483
|
-
) : /* @__PURE__ */
|
|
1887
|
+
) : /* @__PURE__ */ jsx11(
|
|
2484
1888
|
BiteGrid,
|
|
2485
1889
|
{
|
|
2486
1890
|
bites: grouped.portrait.length > 0 ? grouped.portrait : grouped.square.length > 0 ? grouped.square : grouped.landscape,
|
|
@@ -2490,17 +1894,17 @@ function VideoBitesDisplay({
|
|
|
2490
1894
|
] });
|
|
2491
1895
|
}
|
|
2492
1896
|
function BiteGrid({ bites, ratio }) {
|
|
2493
|
-
return /* @__PURE__ */
|
|
1897
|
+
return /* @__PURE__ */ jsx11("div", { className: RATIO_DISPLAY_GRID_CLASS[ratio], children: bites.map((bite, index) => /* @__PURE__ */ jsx11(LazyBite, { ratio, children: /* @__PURE__ */ jsx11(VideoBiteCard, { url: bite.url, title: bite.title, thumbnailUrl: bite.thumbnail_url }) }, bite.url || index)) });
|
|
2494
1898
|
}
|
|
2495
1899
|
function VideoBiteCard({ url, title, thumbnailUrl }) {
|
|
2496
|
-
return /* @__PURE__ */
|
|
2497
|
-
/* @__PURE__ */
|
|
2498
|
-
title && /* @__PURE__ */
|
|
1900
|
+
return /* @__PURE__ */ jsxs8(Card, { className: "overflow-hidden border border-ods-border bg-ods-card hover:border-ods-accent transition-colors flex flex-col h-full", children: [
|
|
1901
|
+
/* @__PURE__ */ jsx11("div", { className: "relative flex-1 min-h-0", children: /* @__PURE__ */ jsx11(Video, { url, poster: thumbnailUrl || void 0, layout: "fill" }) }),
|
|
1902
|
+
title && /* @__PURE__ */ jsx11("div", { className: "p-4", children: /* @__PURE__ */ jsx11("p", { className: "text-h4 text-ods-text-primary line-clamp-2", title, children: title }) })
|
|
2499
1903
|
] });
|
|
2500
1904
|
}
|
|
2501
1905
|
|
|
2502
1906
|
// src/components/features/entity-video-section.tsx
|
|
2503
|
-
import { Fragment as
|
|
1907
|
+
import { Fragment as Fragment3, jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
2504
1908
|
function EntityVideoSection({
|
|
2505
1909
|
mainVideoUrl,
|
|
2506
1910
|
youtubeUrl,
|
|
@@ -2525,10 +1929,10 @@ function EntityVideoSection({
|
|
|
2525
1929
|
}
|
|
2526
1930
|
const fullVideoUrl = youtubeUrl || mainVideoUrl || null;
|
|
2527
1931
|
const fullVideoKind = youtubeUrl ? "youtube" : "auto";
|
|
2528
|
-
return /* @__PURE__ */
|
|
2529
|
-
hasVideo && (hasFullVideo && hasHighlight ? /* @__PURE__ */
|
|
2530
|
-
/* @__PURE__ */
|
|
2531
|
-
/* @__PURE__ */
|
|
1932
|
+
return /* @__PURE__ */ jsxs9(Fragment3, { children: [
|
|
1933
|
+
hasVideo && (hasFullVideo && hasHighlight ? /* @__PURE__ */ jsxs9(Tabs, { defaultValue: "full-video", className: "w-full", children: [
|
|
1934
|
+
/* @__PURE__ */ jsxs9(TabsList, { className: "inline-flex justify-start rounded-none bg-transparent h-auto p-0 gap-0", children: [
|
|
1935
|
+
/* @__PURE__ */ jsx12(
|
|
2532
1936
|
TabsTrigger,
|
|
2533
1937
|
{
|
|
2534
1938
|
value: "full-video",
|
|
@@ -2536,7 +1940,7 @@ function EntityVideoSection({
|
|
|
2536
1940
|
children: "Full Video"
|
|
2537
1941
|
}
|
|
2538
1942
|
),
|
|
2539
|
-
/* @__PURE__ */
|
|
1943
|
+
/* @__PURE__ */ jsx12(
|
|
2540
1944
|
TabsTrigger,
|
|
2541
1945
|
{
|
|
2542
1946
|
value: "highlights",
|
|
@@ -2545,7 +1949,7 @@ function EntityVideoSection({
|
|
|
2545
1949
|
}
|
|
2546
1950
|
)
|
|
2547
1951
|
] }),
|
|
2548
|
-
/* @__PURE__ */
|
|
1952
|
+
/* @__PURE__ */ jsx12(TabsContent, { value: "full-video", className: "mt-4", children: /* @__PURE__ */ jsx12(
|
|
2549
1953
|
Video,
|
|
2550
1954
|
{
|
|
2551
1955
|
kind: fullVideoKind,
|
|
@@ -2558,7 +1962,7 @@ function EntityVideoSection({
|
|
|
2558
1962
|
priority
|
|
2559
1963
|
}
|
|
2560
1964
|
) }),
|
|
2561
|
-
/* @__PURE__ */
|
|
1965
|
+
/* @__PURE__ */ jsx12(TabsContent, { value: "highlights", className: "mt-4", children: /* @__PURE__ */ jsx12(
|
|
2562
1966
|
Video,
|
|
2563
1967
|
{
|
|
2564
1968
|
url: highlightVideoUrl,
|
|
@@ -2566,7 +1970,7 @@ function EntityVideoSection({
|
|
|
2566
1970
|
layout: "centered"
|
|
2567
1971
|
}
|
|
2568
1972
|
) })
|
|
2569
|
-
] }) : hasFullVideo ? /* @__PURE__ */
|
|
1973
|
+
] }) : hasFullVideo ? /* @__PURE__ */ jsx12(
|
|
2570
1974
|
Video,
|
|
2571
1975
|
{
|
|
2572
1976
|
kind: fullVideoKind,
|
|
@@ -2578,7 +1982,7 @@ function EntityVideoSection({
|
|
|
2578
1982
|
layout: "centered",
|
|
2579
1983
|
priority
|
|
2580
1984
|
}
|
|
2581
|
-
) : /* @__PURE__ */
|
|
1985
|
+
) : /* @__PURE__ */ jsx12(
|
|
2582
1986
|
Video,
|
|
2583
1987
|
{
|
|
2584
1988
|
url: highlightVideoUrl,
|
|
@@ -2587,11 +1991,11 @@ function EntityVideoSection({
|
|
|
2587
1991
|
priority
|
|
2588
1992
|
}
|
|
2589
1993
|
)),
|
|
2590
|
-
videoSummary && MarkdownRenderer && /* @__PURE__ */
|
|
2591
|
-
/* @__PURE__ */
|
|
2592
|
-
/* @__PURE__ */
|
|
1994
|
+
videoSummary && MarkdownRenderer && /* @__PURE__ */ jsxs9("div", { className: "flex flex-col gap-6 w-full min-w-0", children: [
|
|
1995
|
+
/* @__PURE__ */ jsx12("h2", { className: `${SECTION_HEADING_CLASS} break-words`, children: "Summary" }),
|
|
1996
|
+
/* @__PURE__ */ jsx12("div", { className: "text-h4 text-ods-text-primary break-words overflow-hidden", children: /* @__PURE__ */ jsx12(MarkdownRenderer, { content: videoSummary }) })
|
|
2593
1997
|
] }),
|
|
2594
|
-
videoBites && videoBites.length > 0 && /* @__PURE__ */
|
|
1998
|
+
videoBites && videoBites.length > 0 && /* @__PURE__ */ jsx12(
|
|
2595
1999
|
VideoBitesDisplay,
|
|
2596
2000
|
{
|
|
2597
2001
|
bites: videoBites,
|
|
@@ -2602,40 +2006,6 @@ function EntityVideoSection({
|
|
|
2602
2006
|
] });
|
|
2603
2007
|
}
|
|
2604
2008
|
|
|
2605
|
-
// src/components/chat/utils/compact-card-classes.ts
|
|
2606
|
-
var COMPACT_CARD_OUTER = "my-1.5 flex items-start gap-3 w-full p-2 rounded-lg border border-ods-border bg-ods-card no-underline transition-colors hover:border-ods-text-secondary/40";
|
|
2607
|
-
var COMPACT_CARD_OUTER_STATIC = "my-1.5 flex items-start gap-3 w-full p-2 rounded-lg border border-ods-border bg-ods-card no-underline cursor-default";
|
|
2608
|
-
var COMPACT_CARD_SKELETON_OUTER = "my-1.5 flex w-full animate-pulse items-start gap-3 rounded-lg border border-ods-border bg-ods-card p-2";
|
|
2609
|
-
var COMPACT_CARD_IMAGE_SLOT = "relative block shrink-0 self-start w-14 h-14 aspect-square overflow-hidden rounded-md bg-ods-bg";
|
|
2610
|
-
var COMPACT_CARD_SKELETON_IMAGE_SLOT = "block h-14 w-14 aspect-square shrink-0 self-start rounded-md bg-ods-bg";
|
|
2611
|
-
var COMPACT_CARD_ICON_SLOT = "flex h-14 w-14 aspect-square shrink-0 self-start items-center justify-center rounded-md bg-ods-bg text-ods-accent";
|
|
2612
|
-
var COMPACT_CARD_TEXT_COL = "flex min-w-0 flex-1 flex-col gap-0.5 min-h-14";
|
|
2613
|
-
var COMPACT_CARD_TITLE_ROW = "flex items-center min-w-0 h-5";
|
|
2614
|
-
var COMPACT_CARD_META_ROW_BOX = "flex items-center min-w-0 h-4";
|
|
2615
|
-
var COMPACT_CARD_TITLE = "truncate text-sm font-semibold leading-5 text-ods-text-primary";
|
|
2616
|
-
var COMPACT_CARD_SUBTITLE = "truncate text-[11px] leading-4 text-ods-text-secondary";
|
|
2617
|
-
var COMPACT_CARD_SUMMARY = "truncate text-[11px] leading-4 text-ods-text-secondary/80";
|
|
2618
|
-
var COMPACT_CARD_META_ROW = "flex items-center gap-1.5 min-w-0 text-[11px] leading-4 text-ods-text-secondary";
|
|
2619
|
-
var COMPACT_CARD_ROW_FILLER = "\xA0";
|
|
2620
|
-
var SAFE_URL_SCHEMES = ["http:", "https:", "mailto:"];
|
|
2621
|
-
function safeHref(url) {
|
|
2622
|
-
if (!url) return null;
|
|
2623
|
-
if (/[\u0000-\u001f\u007f\u200b-\u200d\u2028\u2029\ufeff]/.test(url)) return null;
|
|
2624
|
-
const trimmed = url.trim();
|
|
2625
|
-
if (!trimmed) return null;
|
|
2626
|
-
if (trimmed.startsWith("/") && !trimmed.startsWith("//")) return trimmed;
|
|
2627
|
-
if (trimmed.startsWith("#")) return trimmed;
|
|
2628
|
-
if (/^[a-z][a-z0-9+.-]*:$/i.test(trimmed)) return null;
|
|
2629
|
-
try {
|
|
2630
|
-
const parsed = new URL(trimmed, "https://_safehref_base.invalid");
|
|
2631
|
-
if (!SAFE_URL_SCHEMES.includes(parsed.protocol)) return null;
|
|
2632
|
-
if ((parsed.protocol === "https:" || parsed.protocol === "http:") && !parsed.hostname) return null;
|
|
2633
|
-
return trimmed;
|
|
2634
|
-
} catch {
|
|
2635
|
-
return null;
|
|
2636
|
-
}
|
|
2637
|
-
}
|
|
2638
|
-
|
|
2639
2009
|
// src/components/chat/entity-cards/onboarding-guide-card.tsx
|
|
2640
2010
|
init_next_link();
|
|
2641
2011
|
init_cn();
|
|
@@ -2676,7 +2046,7 @@ function useEntityCardPlaceholder({
|
|
|
2676
2046
|
}
|
|
2677
2047
|
|
|
2678
2048
|
// src/components/chat/entity-cards/onboarding-guide-card.tsx
|
|
2679
|
-
import { jsx as
|
|
2049
|
+
import { jsx as jsx13, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
2680
2050
|
function stripMarkdownPreview(text) {
|
|
2681
2051
|
return text.replace(/```[\s\S]*?```/g, " ").replace(/^#{1,6}\s+/gm, "").replace(/!?\[([^\]]*)\]\([^)]*\)/g, "$1").replace(/[*_~`>]/g, "").replace(/^\s*[-+]\s+/gm, "").replace(/-{3,}/g, " ").replace(/\s+/g, " ").trim().replace(/^([\s\S]{240})[\s\S]+$/, "$1\u2026");
|
|
2682
2052
|
}
|
|
@@ -2690,64 +2060,64 @@ var HORIZONTAL_SIZE_TOKENS = {
|
|
|
2690
2060
|
};
|
|
2691
2061
|
function OnboardingGuideCardSkeleton({ size = "default" }) {
|
|
2692
2062
|
if (size === "catalog") {
|
|
2693
|
-
return /* @__PURE__ */
|
|
2694
|
-
/* @__PURE__ */
|
|
2695
|
-
/* @__PURE__ */
|
|
2696
|
-
/* @__PURE__ */
|
|
2697
|
-
/* @__PURE__ */
|
|
2698
|
-
/* @__PURE__ */
|
|
2699
|
-
/* @__PURE__ */
|
|
2063
|
+
return /* @__PURE__ */ jsxs10("div", { className: "bg-ods-system-greys-black border border-ods-border rounded-lg overflow-hidden flex flex-col p-6 gap-4 animate-pulse", children: [
|
|
2064
|
+
/* @__PURE__ */ jsxs10("div", { className: "flex flex-col md:flex-row gap-4 md:gap-6", children: [
|
|
2065
|
+
/* @__PURE__ */ jsx13("div", { className: "w-full md:w-[256px] aspect-[1200/630] bg-ods-border rounded-lg flex-shrink-0" }),
|
|
2066
|
+
/* @__PURE__ */ jsxs10("div", { className: "flex-1 min-w-0 flex flex-col", children: [
|
|
2067
|
+
/* @__PURE__ */ jsxs10("div", { className: "min-h-[60px] md:min-h-[72px] flex flex-col gap-1.5 justify-start mb-3", children: [
|
|
2068
|
+
/* @__PURE__ */ jsx13("div", { className: "h-[25px] md:h-[30px] w-3/4 bg-ods-border rounded" }),
|
|
2069
|
+
/* @__PURE__ */ jsx13("div", { className: "h-[25px] md:h-[30px] w-1/2 bg-ods-border rounded" })
|
|
2700
2070
|
] }),
|
|
2701
|
-
/* @__PURE__ */
|
|
2702
|
-
/* @__PURE__ */
|
|
2703
|
-
/* @__PURE__ */
|
|
2071
|
+
/* @__PURE__ */ jsxs10("div", { className: "min-h-[46px] md:min-h-[52px] flex flex-col gap-2 justify-start", children: [
|
|
2072
|
+
/* @__PURE__ */ jsx13("div", { className: "h-3 w-full bg-ods-border/70 rounded" }),
|
|
2073
|
+
/* @__PURE__ */ jsx13("div", { className: "h-3 w-5/6 bg-ods-border/70 rounded" })
|
|
2704
2074
|
] })
|
|
2705
2075
|
] })
|
|
2706
2076
|
] }),
|
|
2707
|
-
/* @__PURE__ */
|
|
2708
|
-
[0, 1].map((i) => /* @__PURE__ */
|
|
2077
|
+
/* @__PURE__ */ jsxs10("div", { className: "grid grid-cols-1 md:grid-cols-3 border border-ods-border rounded-md overflow-hidden w-full", children: [
|
|
2078
|
+
[0, 1].map((i) => /* @__PURE__ */ jsx13(
|
|
2709
2079
|
"div",
|
|
2710
2080
|
{
|
|
2711
2081
|
className: "bg-ods-card p-4 flex flex-col gap-3 border-b md:border-b-0 md:border-r border-ods-border",
|
|
2712
|
-
children: /* @__PURE__ */
|
|
2713
|
-
/* @__PURE__ */
|
|
2714
|
-
/* @__PURE__ */
|
|
2082
|
+
children: /* @__PURE__ */ jsxs10("div", { className: "flex flex-col gap-2", children: [
|
|
2083
|
+
/* @__PURE__ */ jsx13("div", { className: "h-6 w-32 bg-ods-bg rounded" }),
|
|
2084
|
+
/* @__PURE__ */ jsx13("div", { className: "h-3 w-20 bg-ods-bg/60 rounded" })
|
|
2715
2085
|
] })
|
|
2716
2086
|
},
|
|
2717
2087
|
`cell-${i}`
|
|
2718
2088
|
)),
|
|
2719
|
-
/* @__PURE__ */
|
|
2720
|
-
/* @__PURE__ */
|
|
2721
|
-
/* @__PURE__ */
|
|
2722
|
-
/* @__PURE__ */
|
|
2723
|
-
/* @__PURE__ */
|
|
2089
|
+
/* @__PURE__ */ jsxs10("div", { className: "bg-ods-card p-4 flex items-center gap-3", children: [
|
|
2090
|
+
/* @__PURE__ */ jsx13("div", { className: "h-10 w-10 rounded-full bg-ods-bg shrink-0" }),
|
|
2091
|
+
/* @__PURE__ */ jsxs10("div", { className: "flex flex-col gap-2 flex-1 min-w-0", children: [
|
|
2092
|
+
/* @__PURE__ */ jsx13("div", { className: "h-4 w-3/4 bg-ods-bg rounded" }),
|
|
2093
|
+
/* @__PURE__ */ jsx13("div", { className: "h-3 w-1/2 bg-ods-bg/60 rounded" })
|
|
2724
2094
|
] })
|
|
2725
2095
|
] })
|
|
2726
2096
|
] })
|
|
2727
2097
|
] });
|
|
2728
2098
|
}
|
|
2729
2099
|
if (size === "sm") {
|
|
2730
|
-
return /* @__PURE__ */
|
|
2731
|
-
/* @__PURE__ */
|
|
2732
|
-
/* @__PURE__ */
|
|
2733
|
-
/* @__PURE__ */
|
|
2734
|
-
/* @__PURE__ */
|
|
2735
|
-
/* @__PURE__ */
|
|
2100
|
+
return /* @__PURE__ */ jsxs10("span", { className: COMPACT_CARD_SKELETON_OUTER, children: [
|
|
2101
|
+
/* @__PURE__ */ jsx13("span", { className: COMPACT_CARD_SKELETON_IMAGE_SLOT }),
|
|
2102
|
+
/* @__PURE__ */ jsxs10("span", { className: COMPACT_CARD_TEXT_COL, children: [
|
|
2103
|
+
/* @__PURE__ */ jsx13("span", { className: COMPACT_CARD_TITLE_ROW, children: /* @__PURE__ */ jsx13("span", { className: "h-3.5 w-3/5 rounded bg-ods-bg" }) }),
|
|
2104
|
+
/* @__PURE__ */ jsx13("span", { className: COMPACT_CARD_META_ROW_BOX, children: /* @__PURE__ */ jsx13("span", { className: "h-3 w-2/5 rounded bg-ods-bg/70" }) }),
|
|
2105
|
+
/* @__PURE__ */ jsx13("span", { className: COMPACT_CARD_META_ROW_BOX, children: /* @__PURE__ */ jsx13("span", { className: "h-3 w-11/12 rounded bg-ods-bg/40" }) })
|
|
2736
2106
|
] }),
|
|
2737
|
-
/* @__PURE__ */
|
|
2107
|
+
/* @__PURE__ */ jsx13("span", { className: "flex shrink-0 items-center self-start h-5", children: /* @__PURE__ */ jsx13("span", { className: "h-3.5 w-3.5 rounded bg-ods-bg" }) })
|
|
2738
2108
|
] });
|
|
2739
2109
|
}
|
|
2740
2110
|
const t = HORIZONTAL_SIZE_TOKENS.default;
|
|
2741
|
-
return /* @__PURE__ */
|
|
2111
|
+
return /* @__PURE__ */ jsxs10(
|
|
2742
2112
|
"span",
|
|
2743
2113
|
{
|
|
2744
2114
|
className: `flex items-start gap-3 rounded-md border border-ods-border bg-ods-card ${t.padding} animate-pulse`,
|
|
2745
2115
|
children: [
|
|
2746
|
-
/* @__PURE__ */
|
|
2747
|
-
/* @__PURE__ */
|
|
2748
|
-
/* @__PURE__ */
|
|
2749
|
-
/* @__PURE__ */
|
|
2750
|
-
/* @__PURE__ */
|
|
2116
|
+
/* @__PURE__ */ jsx13("span", { className: `shrink-0 inline-flex items-center justify-center rounded-full bg-ods-bg ${t.step}` }),
|
|
2117
|
+
/* @__PURE__ */ jsxs10("span", { className: "flex flex-col gap-2 flex-1 min-w-0", children: [
|
|
2118
|
+
/* @__PURE__ */ jsx13("span", { className: "block h-4 w-2/3 rounded bg-ods-bg" }),
|
|
2119
|
+
/* @__PURE__ */ jsx13("span", { className: "block h-3 w-1/3 rounded bg-ods-bg/70" }),
|
|
2120
|
+
/* @__PURE__ */ jsx13("span", { className: "block h-3 w-full rounded bg-ods-bg/40" })
|
|
2751
2121
|
] })
|
|
2752
2122
|
]
|
|
2753
2123
|
}
|
|
@@ -2779,7 +2149,7 @@ function OnboardingGuideCard({
|
|
|
2779
2149
|
const hasVideoCover = !!(guide.main_video_thumbnail || guide.highlight_video_thumbnail);
|
|
2780
2150
|
const stepLabel = typeof guide.step_order === "number" ? String(guide.step_order).padStart(2, "0") : "\u2014";
|
|
2781
2151
|
const durationLabel = typeof guide.highlight_video_duration_ms === "number" && guide.highlight_video_duration_ms > 0 ? formatDurationMMSS(Math.floor(guide.highlight_video_duration_ms / 1e3)) : "";
|
|
2782
|
-
return /* @__PURE__ */
|
|
2152
|
+
return /* @__PURE__ */ jsx13(
|
|
2783
2153
|
next_link_default,
|
|
2784
2154
|
{
|
|
2785
2155
|
href,
|
|
@@ -2795,10 +2165,10 @@ function OnboardingGuideCard({
|
|
|
2795
2165
|
className
|
|
2796
2166
|
),
|
|
2797
2167
|
"aria-label": `Open ${guide.title}`,
|
|
2798
|
-
children: /* @__PURE__ */
|
|
2799
|
-
/* @__PURE__ */
|
|
2800
|
-
/* @__PURE__ */
|
|
2801
|
-
coverImage ? /* @__PURE__ */
|
|
2168
|
+
children: /* @__PURE__ */ jsxs10("div", { className: "flex flex-col p-6 gap-4", children: [
|
|
2169
|
+
/* @__PURE__ */ jsxs10("div", { className: "flex flex-col md:flex-row gap-4 md:gap-6", children: [
|
|
2170
|
+
/* @__PURE__ */ jsx13("div", { className: "w-full md:w-[256px] flex-shrink-0", children: /* @__PURE__ */ jsxs10("div", { className: "relative rounded-lg overflow-hidden w-full aspect-[1200/630] bg-ods-bg", children: [
|
|
2171
|
+
coverImage ? /* @__PURE__ */ jsx13(
|
|
2802
2172
|
next_image_default,
|
|
2803
2173
|
{
|
|
2804
2174
|
src: coverImage,
|
|
@@ -2808,7 +2178,7 @@ function OnboardingGuideCard({
|
|
|
2808
2178
|
className: "object-cover",
|
|
2809
2179
|
unoptimized: true
|
|
2810
2180
|
}
|
|
2811
|
-
) : /* @__PURE__ */
|
|
2181
|
+
) : /* @__PURE__ */ jsx13(
|
|
2812
2182
|
BlogImagePlaceholder,
|
|
2813
2183
|
{
|
|
2814
2184
|
title: guide.title,
|
|
@@ -2816,18 +2186,18 @@ function OnboardingGuideCard({
|
|
|
2816
2186
|
className: "absolute inset-0"
|
|
2817
2187
|
}
|
|
2818
2188
|
),
|
|
2819
|
-
hasVideoCover && coverImage && /* @__PURE__ */
|
|
2820
|
-
durationLabel && /* @__PURE__ */
|
|
2821
|
-
/* @__PURE__ */
|
|
2189
|
+
hasVideoCover && coverImage && /* @__PURE__ */ jsx13("span", { className: "absolute inset-0 flex items-center justify-center bg-black/30", children: /* @__PURE__ */ jsx13(Play, { className: "w-10 h-10 text-white", fill: "white" }) }),
|
|
2190
|
+
durationLabel && /* @__PURE__ */ jsxs10("span", { className: "absolute bottom-2 right-2 inline-flex items-center gap-1 px-2 py-1 rounded bg-black/60 text-white text-xs font-medium font-mono", children: [
|
|
2191
|
+
/* @__PURE__ */ jsx13(Clock, { className: "w-3 h-3" }),
|
|
2822
2192
|
durationLabel
|
|
2823
2193
|
] })
|
|
2824
2194
|
] }) }),
|
|
2825
|
-
/* @__PURE__ */
|
|
2826
|
-
/* @__PURE__ */
|
|
2827
|
-
/* @__PURE__ */
|
|
2195
|
+
/* @__PURE__ */ jsxs10("div", { className: "flex-1 min-w-0 flex flex-col", children: [
|
|
2196
|
+
/* @__PURE__ */ jsx13("div", { className: "min-h-[60px] md:min-h-[72px] flex items-start mb-3", children: /* @__PURE__ */ jsx13("h3", { className: "font-['Azeret_Mono'] font-semibold text-xl md:text-2xl text-ods-text-primary leading-tight line-clamp-2", children: guide.title }) }),
|
|
2197
|
+
/* @__PURE__ */ jsx13("div", { className: "min-h-[46px] md:min-h-[52px]", children: /* @__PURE__ */ jsx13("p", { className: "font-['DM_Sans'] text-sm md:text-base text-ods-text-secondary leading-relaxed line-clamp-2", children: stripMarkdownPreview(guide.video_summary || guide.content || "") }) })
|
|
2828
2198
|
] })
|
|
2829
2199
|
] }),
|
|
2830
|
-
/* @__PURE__ */
|
|
2200
|
+
/* @__PURE__ */ jsx13(
|
|
2831
2201
|
EntityAuthorCard,
|
|
2832
2202
|
{
|
|
2833
2203
|
author: guide.author,
|
|
@@ -2857,9 +2227,9 @@ function OnboardingGuideCard({
|
|
|
2857
2227
|
guide.section,
|
|
2858
2228
|
author
|
|
2859
2229
|
].filter((s) => typeof s === "string" && s.length > 0);
|
|
2860
|
-
return /* @__PURE__ */
|
|
2861
|
-
/* @__PURE__ */
|
|
2862
|
-
compactCover ? /* @__PURE__ */
|
|
2230
|
+
return /* @__PURE__ */ jsxs10(next_link_default, { href, target, rel, prefetch: false, className: cn(COMPACT_CARD_OUTER, className), children: [
|
|
2231
|
+
/* @__PURE__ */ jsxs10("span", { className: COMPACT_CARD_IMAGE_SLOT, children: [
|
|
2232
|
+
compactCover ? /* @__PURE__ */ jsx13(
|
|
2863
2233
|
next_image_default,
|
|
2864
2234
|
{
|
|
2865
2235
|
src: compactCover,
|
|
@@ -2869,20 +2239,20 @@ function OnboardingGuideCard({
|
|
|
2869
2239
|
className: "object-contain",
|
|
2870
2240
|
unoptimized: true
|
|
2871
2241
|
}
|
|
2872
|
-
) : /* @__PURE__ */
|
|
2873
|
-
hasVideoCover && compactCover && /* @__PURE__ */
|
|
2242
|
+
) : /* @__PURE__ */ jsx13("span", { className: "flex h-full w-full items-center justify-center text-ods-accent", children: /* @__PURE__ */ jsx13(GraduationCap, { className: "w-4 h-4" }) }),
|
|
2243
|
+
hasVideoCover && compactCover && /* @__PURE__ */ jsx13("span", { className: "absolute inset-0 flex items-center justify-center bg-black/30", children: /* @__PURE__ */ jsx13(Play, { className: "h-4 w-4 text-white", fill: "white" }) })
|
|
2874
2244
|
] }),
|
|
2875
|
-
/* @__PURE__ */
|
|
2876
|
-
/* @__PURE__ */
|
|
2877
|
-
/* @__PURE__ */
|
|
2878
|
-
/* @__PURE__ */
|
|
2245
|
+
/* @__PURE__ */ jsxs10("span", { className: COMPACT_CARD_TEXT_COL, children: [
|
|
2246
|
+
/* @__PURE__ */ jsx13("span", { className: COMPACT_CARD_TITLE_ROW, children: /* @__PURE__ */ jsx13("span", { className: cn(COMPACT_CARD_TITLE, "font-['Azeret_Mono']"), children: guide.title }) }),
|
|
2247
|
+
/* @__PURE__ */ jsx13("span", { className: COMPACT_CARD_META_ROW_BOX, children: /* @__PURE__ */ jsx13("span", { className: "truncate text-[11px] leading-4 text-[var(--color-accent-primary)]", children: subtitleParts.join(" \xB7 ") }) }),
|
|
2248
|
+
/* @__PURE__ */ jsx13("span", { className: COMPACT_CARD_META_ROW_BOX, children: /* @__PURE__ */ jsx13("span", { className: COMPACT_CARD_SUMMARY, children: summary2 || COMPACT_CARD_ROW_FILLER }) })
|
|
2879
2249
|
] }),
|
|
2880
|
-
/* @__PURE__ */
|
|
2250
|
+
/* @__PURE__ */ jsx13("span", { className: "flex shrink-0 items-center self-start h-5 text-ods-text-secondary", children: /* @__PURE__ */ jsx13(ExternalLink, { className: "w-3.5 h-3.5" }) })
|
|
2881
2251
|
] });
|
|
2882
2252
|
}
|
|
2883
2253
|
const t = HORIZONTAL_SIZE_TOKENS.default;
|
|
2884
2254
|
const summary = stripMarkdownPreview(guide.video_summary || guide.content || "");
|
|
2885
|
-
return /* @__PURE__ */
|
|
2255
|
+
return /* @__PURE__ */ jsxs10(
|
|
2886
2256
|
next_link_default,
|
|
2887
2257
|
{
|
|
2888
2258
|
href,
|
|
@@ -2894,7 +2264,7 @@ function OnboardingGuideCard({
|
|
|
2894
2264
|
className
|
|
2895
2265
|
),
|
|
2896
2266
|
children: [
|
|
2897
|
-
/* @__PURE__ */
|
|
2267
|
+
/* @__PURE__ */ jsx13(
|
|
2898
2268
|
"span",
|
|
2899
2269
|
{
|
|
2900
2270
|
className: `shrink-0 inline-flex items-center justify-center rounded-full bg-ods-accent/10 text-ods-accent font-semibold ${t.step}`,
|
|
@@ -2902,432 +2272,24 @@ function OnboardingGuideCard({
|
|
|
2902
2272
|
children: guide.step_order
|
|
2903
2273
|
}
|
|
2904
2274
|
),
|
|
2905
|
-
/* @__PURE__ */
|
|
2906
|
-
/* @__PURE__ */
|
|
2907
|
-
/* @__PURE__ */
|
|
2908
|
-
/* @__PURE__ */
|
|
2909
|
-
/* @__PURE__ */
|
|
2275
|
+
/* @__PURE__ */ jsxs10("span", { className: "flex flex-col gap-0.5 flex-1 min-w-0", children: [
|
|
2276
|
+
/* @__PURE__ */ jsx13("span", { className: `block ${t.title} text-ods-text-primary truncate`, children: guide.title }),
|
|
2277
|
+
/* @__PURE__ */ jsxs10("span", { className: "inline-flex items-center gap-1 font-['DM_Sans'] text-[12px] leading-[16px] text-ods-text-secondary", children: [
|
|
2278
|
+
/* @__PURE__ */ jsx13(GraduationCap, { className: "h-3 w-3 shrink-0" }),
|
|
2279
|
+
/* @__PURE__ */ jsx13("span", { className: "truncate", children: guide.section })
|
|
2910
2280
|
] }),
|
|
2911
|
-
summary && /* @__PURE__ */
|
|
2281
|
+
summary && /* @__PURE__ */ jsx13("span", { className: `font-['DM_Sans'] text-[14px] leading-[20px] text-ods-text-secondary ${t.summaryClamp}`, children: summary })
|
|
2912
2282
|
] })
|
|
2913
2283
|
]
|
|
2914
2284
|
}
|
|
2915
2285
|
);
|
|
2916
2286
|
}
|
|
2917
2287
|
|
|
2918
|
-
// src/utils/source-icons.ts
|
|
2919
|
-
var SOURCE_ICON_NAMES = {
|
|
2920
|
-
// Doc tables
|
|
2921
|
-
"openframe-docs": "openframe",
|
|
2922
|
-
"data-room-docs": "shield",
|
|
2923
|
-
// CMS / programs
|
|
2924
|
-
"blog-posts": "newspaper",
|
|
2925
|
-
"product-releases": "rocket",
|
|
2926
|
-
"case-studies": "briefcase",
|
|
2927
|
-
"onboarding-guides": "graduation-cap",
|
|
2928
|
-
webinars: "video",
|
|
2929
|
-
events: "calendar",
|
|
2930
|
-
podcasts: "headphones",
|
|
2931
|
-
"customer-interviews": "users",
|
|
2932
|
-
// Financials
|
|
2933
|
-
"investor-updates": "mail",
|
|
2934
|
-
"financial-kpis": "activity",
|
|
2935
|
-
"financial-cap-table": "table",
|
|
2936
|
-
"financial-pnl": "trending-up",
|
|
2937
|
-
"financial-balance-sheet": "dollar-sign",
|
|
2938
|
-
"financial-cash-flow": "banknote",
|
|
2939
|
-
// ClickUp
|
|
2940
|
-
"clickup-roadmap": "clickup",
|
|
2941
|
-
"clickup-delivery": "clickup",
|
|
2942
|
-
"clickup-tasks-internal": "clickup",
|
|
2943
|
-
// GitHub
|
|
2944
|
-
"github-commits": "github",
|
|
2945
|
-
"github-pull-requests": "github",
|
|
2946
|
-
"github-pr-reviews": "github",
|
|
2947
|
-
"github-commits-public": "github",
|
|
2948
|
-
"github-pull-requests-public": "github",
|
|
2949
|
-
"github-pr-reviews-public": "github",
|
|
2950
|
-
// HubSpot
|
|
2951
|
-
"hubspot-tickets": "hubspot",
|
|
2952
|
-
"hubspot-tickets-anon": "hubspot",
|
|
2953
|
-
"hubspot-tickets-self": "hubspot",
|
|
2954
|
-
// Communications
|
|
2955
|
-
"slack-messages": "slack"
|
|
2956
|
-
};
|
|
2957
|
-
function getSourceIconName(tableId) {
|
|
2958
|
-
if (!tableId) return void 0;
|
|
2959
|
-
return SOURCE_ICON_NAMES[tableId];
|
|
2960
|
-
}
|
|
2961
|
-
var SOURCE_LABELS_BY_TABLE = {
|
|
2962
|
-
// Doc tables
|
|
2963
|
-
"openframe-docs": "OpenFrame Docs",
|
|
2964
|
-
"data-room-docs": "Data Room",
|
|
2965
|
-
// CMS / programs
|
|
2966
|
-
"blog-posts": "Blog Posts",
|
|
2967
|
-
"product-releases": "Product Releases",
|
|
2968
|
-
"case-studies": "Case Studies",
|
|
2969
|
-
"onboarding-guides": "Onboarding Guides",
|
|
2970
|
-
webinars: "Webinars",
|
|
2971
|
-
events: "Events",
|
|
2972
|
-
podcasts: "Podcasts",
|
|
2973
|
-
"customer-interviews": "Customer Interviews",
|
|
2974
|
-
// Financials
|
|
2975
|
-
"investor-updates": "Investor Updates",
|
|
2976
|
-
"financial-kpis": "Financial KPIs",
|
|
2977
|
-
"financial-cap-table": "Cap Table",
|
|
2978
|
-
"financial-pnl": "Profit & Loss",
|
|
2979
|
-
"financial-balance-sheet": "Balance Sheet",
|
|
2980
|
-
"financial-cash-flow": "Cash Flow",
|
|
2981
|
-
// ClickUp
|
|
2982
|
-
"clickup-roadmap": "ClickUp Roadmap",
|
|
2983
|
-
"clickup-delivery": "ClickUp Delivery",
|
|
2984
|
-
"clickup-tasks-internal": "ClickUp Tasks",
|
|
2985
|
-
// GitHub
|
|
2986
|
-
"github-commits": "GitHub Commits",
|
|
2987
|
-
"github-pull-requests": "GitHub Pull Requests",
|
|
2988
|
-
"github-pr-reviews": "GitHub PR Reviews",
|
|
2989
|
-
"github-commits-public": "OpenFrame Commits",
|
|
2990
|
-
"github-pull-requests-public": "OpenFrame Pull Requests",
|
|
2991
|
-
"github-pr-reviews-public": "OpenFrame PR Reviews",
|
|
2992
|
-
// HubSpot
|
|
2993
|
-
"hubspot-tickets": "HubSpot Tickets",
|
|
2994
|
-
"hubspot-tickets-anon": "Known Issues",
|
|
2995
|
-
"hubspot-tickets-self": "My Tickets",
|
|
2996
|
-
// Communications
|
|
2997
|
-
"slack-messages": "OpenMSP Community"
|
|
2998
|
-
};
|
|
2999
|
-
function getSourceLabel(tableId) {
|
|
3000
|
-
return SOURCE_LABELS_BY_TABLE[tableId] ?? tableId;
|
|
3001
|
-
}
|
|
3002
|
-
var DEFAULT_DOCUMENT_TYPE_TO_TABLE_ID = {
|
|
3003
|
-
// Doc tables
|
|
3004
|
-
markdown: "openframe-docs",
|
|
3005
|
-
data_room_doc: "data-room-docs",
|
|
3006
|
-
// CMS / programs
|
|
3007
|
-
blog_post: "blog-posts",
|
|
3008
|
-
product_release: "product-releases",
|
|
3009
|
-
case_study: "case-studies",
|
|
3010
|
-
onboarding_guide: "onboarding-guides",
|
|
3011
|
-
webinar: "webinars",
|
|
3012
|
-
event: "events",
|
|
3013
|
-
podcast: "podcasts",
|
|
3014
|
-
customer_interview: "customer-interviews",
|
|
3015
|
-
// Financials
|
|
3016
|
-
investor_update: "investor-updates",
|
|
3017
|
-
financial_kpi: "financial-kpis",
|
|
3018
|
-
cap_table: "financial-cap-table",
|
|
3019
|
-
profit_loss: "financial-pnl",
|
|
3020
|
-
balance_sheet: "financial-balance-sheet",
|
|
3021
|
-
cash_flow: "financial-cash-flow",
|
|
3022
|
-
// ClickUp
|
|
3023
|
-
roadmap_item: "clickup-roadmap",
|
|
3024
|
-
delivery_item: "clickup-delivery",
|
|
3025
|
-
internal_task: "clickup-tasks-internal",
|
|
3026
|
-
// GitHub
|
|
3027
|
-
github_commit: "github-commits",
|
|
3028
|
-
github_pull_request: "github-pull-requests",
|
|
3029
|
-
github_pr_review: "github-pr-reviews",
|
|
3030
|
-
github_commit_public: "github-commits-public",
|
|
3031
|
-
github_pull_request_public: "github-pull-requests-public",
|
|
3032
|
-
github_pr_review_public: "github-pr-reviews-public",
|
|
3033
|
-
// HubSpot
|
|
3034
|
-
hubspot_ticket: "hubspot-tickets",
|
|
3035
|
-
hubspot_ticket_anon: "hubspot-tickets-anon",
|
|
3036
|
-
hubspot_ticket_self: "hubspot-tickets-self",
|
|
3037
|
-
// Communications
|
|
3038
|
-
slack_message: "slack-messages"
|
|
3039
|
-
};
|
|
3040
|
-
function defaultTableIdForDocumentType(documentType) {
|
|
3041
|
-
return DEFAULT_DOCUMENT_TYPE_TO_TABLE_ID[documentType] ?? null;
|
|
3042
|
-
}
|
|
3043
|
-
|
|
3044
|
-
// src/components/chat/utils/icon-registry.ts
|
|
3045
|
-
import { createElement } from "react";
|
|
3046
|
-
import {
|
|
3047
|
-
Activity,
|
|
3048
|
-
Banknote,
|
|
3049
|
-
Bell,
|
|
3050
|
-
BookOpen,
|
|
3051
|
-
Box,
|
|
3052
|
-
Briefcase,
|
|
3053
|
-
Calendar,
|
|
3054
|
-
CheckSquare,
|
|
3055
|
-
DollarSign,
|
|
3056
|
-
Facebook,
|
|
3057
|
-
FileText,
|
|
3058
|
-
Github,
|
|
3059
|
-
Globe,
|
|
3060
|
-
GraduationCap as GraduationCap2,
|
|
3061
|
-
Headphones,
|
|
3062
|
-
Info,
|
|
3063
|
-
Instagram,
|
|
3064
|
-
Mail,
|
|
3065
|
-
Megaphone,
|
|
3066
|
-
MessageCircle,
|
|
3067
|
-
MessageSquare,
|
|
3068
|
-
Newspaper,
|
|
3069
|
-
Package,
|
|
3070
|
-
PenSquare,
|
|
3071
|
-
Rocket,
|
|
3072
|
-
Search,
|
|
3073
|
-
Send,
|
|
3074
|
-
Shield,
|
|
3075
|
-
Star,
|
|
3076
|
-
TableProperties,
|
|
3077
|
-
TrendingUp,
|
|
3078
|
-
Twitter,
|
|
3079
|
-
Users,
|
|
3080
|
-
Video as Video2,
|
|
3081
|
-
Youtube
|
|
3082
|
-
} from "lucide-react";
|
|
3083
|
-
var OpenFrameLogoIcon = ({ className }) => createElement(OpenFrameLogo, { className, upperPathColor: "currentColor" });
|
|
3084
|
-
var ICON_REGISTRY = {
|
|
3085
|
-
// lucide-react (kebab-case)
|
|
3086
|
-
activity: Activity,
|
|
3087
|
-
banknote: Banknote,
|
|
3088
|
-
bell: Bell,
|
|
3089
|
-
"book-open": BookOpen,
|
|
3090
|
-
box: Box,
|
|
3091
|
-
briefcase: Briefcase,
|
|
3092
|
-
calendar: Calendar,
|
|
3093
|
-
"check-square": CheckSquare,
|
|
3094
|
-
"dollar-sign": DollarSign,
|
|
3095
|
-
// For brand-vs-lucide variants the kebab key is the BRAND (most-common
|
|
3096
|
-
// social-platform intent); `'<name>-lucide'` carries the lucide outline.
|
|
3097
|
-
facebook: FacebookIcon,
|
|
3098
|
-
"facebook-lucide": Facebook,
|
|
3099
|
-
"file-text": FileText,
|
|
3100
|
-
// `'github-lucide'` is the lucide outline glyph (used by
|
|
3101
|
-
// `social_platforms.icon_name='Github'`); `'github'` is the brand icon
|
|
3102
|
-
// (used by `chat_admin_slash_commands.icon_name='github'`). The PascalCase
|
|
3103
|
-
// alias `'Github' → 'github-lucide'` routes the lucide glyph for
|
|
3104
|
-
// social-platform DB rows; `'GitHubIcon' → 'github'` keeps brand routing
|
|
3105
|
-
// consistent for callers that store the PascalCase component name.
|
|
3106
|
-
github: GitHubIcon,
|
|
3107
|
-
"github-lucide": Github,
|
|
3108
|
-
globe: Globe,
|
|
3109
|
-
"graduation-cap": GraduationCap2,
|
|
3110
|
-
headphones: Headphones,
|
|
3111
|
-
info: Info,
|
|
3112
|
-
instagram: InstagramIcon,
|
|
3113
|
-
"instagram-lucide": Instagram,
|
|
3114
|
-
mail: Mail,
|
|
3115
|
-
megaphone: Megaphone,
|
|
3116
|
-
"message-circle": MessageCircle,
|
|
3117
|
-
"message-square": MessageSquare,
|
|
3118
|
-
newspaper: Newspaper,
|
|
3119
|
-
package: Package,
|
|
3120
|
-
"pen-square": PenSquare,
|
|
3121
|
-
rocket: Rocket,
|
|
3122
|
-
search: Search,
|
|
3123
|
-
send: Send,
|
|
3124
|
-
shield: Shield,
|
|
3125
|
-
star: Star,
|
|
3126
|
-
table: TableProperties,
|
|
3127
|
-
"trending-up": TrendingUp,
|
|
3128
|
-
twitter: Twitter,
|
|
3129
|
-
users: Users,
|
|
3130
|
-
video: Video2,
|
|
3131
|
-
youtube: YouTubeIcon,
|
|
3132
|
-
"youtube-lucide": Youtube,
|
|
3133
|
-
// brand-only icons (no lucide variant in current use)
|
|
3134
|
-
slack: SlackIcon,
|
|
3135
|
-
clickup: ClickUpIcon,
|
|
3136
|
-
hubspot: HubspotIcon,
|
|
3137
|
-
linkedin: LinkedInIcon,
|
|
3138
|
-
x: XLogo,
|
|
3139
|
-
openframe: OpenFrameLogoIcon
|
|
3140
|
-
};
|
|
3141
|
-
var PASCAL_TO_KEBAB_ALIASES = {
|
|
3142
|
-
// Lucide PascalCase names → kebab equivalents
|
|
3143
|
-
Activity: "activity",
|
|
3144
|
-
Banknote: "banknote",
|
|
3145
|
-
Bell: "bell",
|
|
3146
|
-
BookOpen: "book-open",
|
|
3147
|
-
Box: "box",
|
|
3148
|
-
Briefcase: "briefcase",
|
|
3149
|
-
Calendar: "calendar",
|
|
3150
|
-
CheckSquare: "check-square",
|
|
3151
|
-
DollarSign: "dollar-sign",
|
|
3152
|
-
// Lucide PascalCase → the `-lucide` kebab variant (kebab default is the
|
|
3153
|
-
// brand icon for the social-platform names below).
|
|
3154
|
-
Facebook: "facebook-lucide",
|
|
3155
|
-
FileText: "file-text",
|
|
3156
|
-
Github: "github-lucide",
|
|
3157
|
-
Globe: "globe",
|
|
3158
|
-
GraduationCap: "graduation-cap",
|
|
3159
|
-
Headphones: "headphones",
|
|
3160
|
-
Info: "info",
|
|
3161
|
-
Instagram: "instagram-lucide",
|
|
3162
|
-
Mail: "mail",
|
|
3163
|
-
Megaphone: "megaphone",
|
|
3164
|
-
MessageCircle: "message-circle",
|
|
3165
|
-
MessageSquare: "message-square",
|
|
3166
|
-
Newspaper: "newspaper",
|
|
3167
|
-
Package: "package",
|
|
3168
|
-
PenSquare: "pen-square",
|
|
3169
|
-
Rocket: "rocket",
|
|
3170
|
-
Search: "search",
|
|
3171
|
-
Send: "send",
|
|
3172
|
-
Shield: "shield",
|
|
3173
|
-
Star: "star",
|
|
3174
|
-
TableProperties: "table",
|
|
3175
|
-
TrendingUp: "trending-up",
|
|
3176
|
-
Twitter: "twitter",
|
|
3177
|
-
Users: "users",
|
|
3178
|
-
Video: "video",
|
|
3179
|
-
Youtube: "youtube-lucide",
|
|
3180
|
-
// Brand-icon PascalCase exports → kebab (kebab default is the brand)
|
|
3181
|
-
SlackIcon: "slack",
|
|
3182
|
-
GitHubIcon: "github",
|
|
3183
|
-
ClickUpIcon: "clickup",
|
|
3184
|
-
HubspotIcon: "hubspot",
|
|
3185
|
-
LinkedInIcon: "linkedin",
|
|
3186
|
-
FacebookIcon: "facebook",
|
|
3187
|
-
InstagramIcon: "instagram",
|
|
3188
|
-
YouTubeIcon: "youtube",
|
|
3189
|
-
XLogo: "x",
|
|
3190
|
-
OpenFrameLogo: "openframe"
|
|
3191
|
-
};
|
|
3192
|
-
function normalizeIconKey(key) {
|
|
3193
|
-
return PASCAL_TO_KEBAB_ALIASES[key] ?? key;
|
|
3194
|
-
}
|
|
3195
|
-
function getIconComponent(iconName) {
|
|
3196
|
-
if (!iconName) return FileText;
|
|
3197
|
-
return ICON_REGISTRY[normalizeIconKey(iconName)] ?? FileText;
|
|
3198
|
-
}
|
|
3199
|
-
var SIZE_CLASSES = {
|
|
3200
|
-
xs: "w-3 h-3",
|
|
3201
|
-
// 12px
|
|
3202
|
-
sm: "w-4 h-4",
|
|
3203
|
-
// 16px
|
|
3204
|
-
md: "w-6 h-6",
|
|
3205
|
-
// 24px
|
|
3206
|
-
lg: "w-8 h-8",
|
|
3207
|
-
// 32px
|
|
3208
|
-
xl: "w-12 h-12"
|
|
3209
|
-
// 48px
|
|
3210
|
-
};
|
|
3211
|
-
var ICON_COLORS = {
|
|
3212
|
-
linkedin: { color: "#0A66C2" },
|
|
3213
|
-
facebook: { color: "#1877F2" },
|
|
3214
|
-
youtube: { color: "#FF0000" }
|
|
3215
|
-
};
|
|
3216
|
-
function getDynamicIcon(iconName, size = "md", className) {
|
|
3217
|
-
if (!iconName) {
|
|
3218
|
-
console.warn("[getDynamicIcon] No iconName provided, using Globe fallback");
|
|
3219
|
-
return createElement(Globe, { className: SIZE_CLASSES[size] });
|
|
3220
|
-
}
|
|
3221
|
-
const sizeClass = SIZE_CLASSES[size];
|
|
3222
|
-
const finalClassName = className ? `${sizeClass} ${className}` : sizeClass;
|
|
3223
|
-
const canonicalKey = normalizeIconKey(iconName);
|
|
3224
|
-
const IconComponent = ICON_REGISTRY[canonicalKey];
|
|
3225
|
-
if (IconComponent) {
|
|
3226
|
-
const colorConfig = ICON_COLORS[canonicalKey] || {};
|
|
3227
|
-
return createElement(IconComponent, { className: finalClassName, ...colorConfig });
|
|
3228
|
-
}
|
|
3229
|
-
console.error(
|
|
3230
|
-
`[getDynamicIcon] Icon NOT found in registry: "${iconName}" (normalized to "${canonicalKey}"). Available icons:`,
|
|
3231
|
-
Object.keys(ICON_REGISTRY)
|
|
3232
|
-
);
|
|
3233
|
-
return createElement(Globe, { className: finalClassName });
|
|
3234
|
-
}
|
|
3235
|
-
|
|
3236
|
-
// src/components/chat/utils/source-row-cta.ts
|
|
3237
|
-
import { FileText as FileText2 } from "lucide-react";
|
|
3238
|
-
init_cn();
|
|
3239
|
-
function sanitizePath(path) {
|
|
3240
|
-
return (path || "").replace(/[^a-zA-Z0-9/_\-.]/g, "");
|
|
3241
|
-
}
|
|
3242
|
-
function sourceRowCtxFromRuntime(runtime, surface = {}) {
|
|
3243
|
-
return {
|
|
3244
|
-
currentPlatform: runtime.source ?? null,
|
|
3245
|
-
composeContentUrl: runtime.composeContentUrl,
|
|
3246
|
-
docPlatformTargets: runtime.docPlatformTargets,
|
|
3247
|
-
baseRoute: surface.baseRoute,
|
|
3248
|
-
chipBasePlatform: surface.chipBasePlatform
|
|
3249
|
-
};
|
|
3250
|
-
}
|
|
3251
|
-
function pickSourceIcon(sourceRepo, documentType) {
|
|
3252
|
-
const iconName = sourceRepo ? getSourceIconName(sourceRepo) : void 0;
|
|
3253
|
-
const icon = iconName ? getIconComponent(iconName) : FileText2;
|
|
3254
|
-
const iconLabel = documentType ?? "Source";
|
|
3255
|
-
return { icon, iconLabel };
|
|
3256
|
-
}
|
|
3257
|
-
var DOC_TABLE_TYPES = ["markdown", "data_room_doc"];
|
|
3258
|
-
function shouldFallbackToPathNav(row) {
|
|
3259
|
-
return !!row.documentType && DOC_TABLE_TYPES.includes(row.documentType);
|
|
3260
|
-
}
|
|
3261
|
-
function resolveSourceRowCTA(row, ctx = {}) {
|
|
3262
|
-
const sourceRepo = row.sourceRepo ?? (row.documentType && ctx.tableIdForDocumentType ? ctx.tableIdForDocumentType(row.documentType) : null) ?? null;
|
|
3263
|
-
const { icon, iconLabel } = pickSourceIcon(sourceRepo, row.documentType);
|
|
3264
|
-
let href = null;
|
|
3265
|
-
let targetPlatform = null;
|
|
3266
|
-
const idValue = (row.id ?? "").trim();
|
|
3267
|
-
if (row.path && shouldFallbackToPathNav(row) && !row.externalUrl) {
|
|
3268
|
-
const safePath = sanitizePath(row.path);
|
|
3269
|
-
if (safePath) {
|
|
3270
|
-
const docTarget = row.documentType ? ctx.docPlatformTargets?.[row.documentType] : void 0;
|
|
3271
|
-
if (docTarget) {
|
|
3272
|
-
const seg = docTarget.basePath.split("/").filter(Boolean).join("/");
|
|
3273
|
-
const base = `${getBaseUrl(docTarget.platform)}${seg ? `/${seg}` : ""}/`;
|
|
3274
|
-
href = safeHref(new URL(safePath, base).toString()) ?? null;
|
|
3275
|
-
targetPlatform = docTarget.platform;
|
|
3276
|
-
} else if (ctx.chipBasePlatform) {
|
|
3277
|
-
const base = `${getBaseUrl(ctx.chipBasePlatform)}/knowledge-base/`;
|
|
3278
|
-
href = safeHref(new URL(safePath, base).toString()) ?? null;
|
|
3279
|
-
targetPlatform = ctx.chipBasePlatform;
|
|
3280
|
-
} else if (ctx.baseRoute) {
|
|
3281
|
-
const synthetic = `https://_internal_.local${ctx.baseRoute.startsWith("/") ? ctx.baseRoute : "/" + ctx.baseRoute}/`;
|
|
3282
|
-
const absolute = new URL(safePath, synthetic).toString();
|
|
3283
|
-
href = safeHref(absolute.replace("https://_internal_.local", "")) ?? null;
|
|
3284
|
-
targetPlatform = ctx.currentPlatform ?? null;
|
|
3285
|
-
}
|
|
3286
|
-
}
|
|
3287
|
-
} else if (ctx.composeContentUrl && row.documentType && row.externalUrl) {
|
|
3288
|
-
const composed = ctx.composeContentUrl({
|
|
3289
|
-
type: row.documentType,
|
|
3290
|
-
identifier: idValue,
|
|
3291
|
-
externalUrl: row.externalUrl,
|
|
3292
|
-
targetPlatform: row.targetPlatform ?? null
|
|
3293
|
-
});
|
|
3294
|
-
href = composed.href ? safeHref(composed.href) ?? null : null;
|
|
3295
|
-
targetPlatform = composed.targetPlatform;
|
|
3296
|
-
} else if (row.externalUrl) {
|
|
3297
|
-
href = safeHref(row.externalUrl) ?? null;
|
|
3298
|
-
targetPlatform = row.targetPlatform ?? null;
|
|
3299
|
-
}
|
|
3300
|
-
const askable = !!(idValue && row.documentType);
|
|
3301
|
-
const chatRef = askable ? {
|
|
3302
|
-
type: row.documentType,
|
|
3303
|
-
...sourceRepo ? { sourceRepo } : {},
|
|
3304
|
-
id: idValue,
|
|
3305
|
-
title: row.title,
|
|
3306
|
-
url: href,
|
|
3307
|
-
targetPlatform,
|
|
3308
|
-
// Carry `path` so a downstream inline card (rendered from this
|
|
3309
|
-
// chatRef on a subsequent turn) gets the same doc-tree-swap
|
|
3310
|
-
// routing the chip already used. Without it, the Ask drill-in
|
|
3311
|
-
// would resolve to a same-tab full-page nav even when an in-app
|
|
3312
|
-
// path is available.
|
|
3313
|
-
...row.path ? { metadata: { path: row.path } } : {}
|
|
3314
|
-
} : null;
|
|
3315
|
-
return { icon, iconLabel, href, targetPlatform, askable, chatRef };
|
|
3316
|
-
}
|
|
3317
|
-
function resolveSourceIcon(input, ctx = {}) {
|
|
3318
|
-
if (!input) return { Icon: FileText2, label: "Source" };
|
|
3319
|
-
const { sourceRepo, documentType } = typeof input === "string" ? { sourceRepo: null, documentType: input } : input;
|
|
3320
|
-
if (!sourceRepo && !documentType) return { Icon: FileText2, label: "Source" };
|
|
3321
|
-
const resolvedRepo = sourceRepo ?? (documentType && ctx.tableIdForDocumentType ? ctx.tableIdForDocumentType(documentType) : null) ?? null;
|
|
3322
|
-
const { icon, iconLabel } = pickSourceIcon(resolvedRepo, documentType);
|
|
3323
|
-
return { Icon: icon, label: iconLabel };
|
|
3324
|
-
}
|
|
3325
|
-
|
|
3326
2288
|
// src/components/ui/page-actions.tsx
|
|
3327
2289
|
init_cn();
|
|
3328
|
-
import
|
|
2290
|
+
import React10 from "react";
|
|
3329
2291
|
init_button();
|
|
3330
|
-
import { Fragment as
|
|
2292
|
+
import { Fragment as Fragment4, jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
3331
2293
|
function actionKey(action, idx) {
|
|
3332
2294
|
return `${action.label ?? action.ariaLabel ?? "action"}-${idx}`;
|
|
3333
2295
|
}
|
|
@@ -3359,7 +2321,7 @@ function actionToMenuItems(action, idx) {
|
|
|
3359
2321
|
}
|
|
3360
2322
|
function renderActionButton(action, opts = {}) {
|
|
3361
2323
|
if (action.iconAction) {
|
|
3362
|
-
return /* @__PURE__ */
|
|
2324
|
+
return /* @__PURE__ */ jsx14(
|
|
3363
2325
|
SplitButton,
|
|
3364
2326
|
{
|
|
3365
2327
|
variant: action.variant ?? void 0,
|
|
@@ -3377,18 +2339,18 @@ function renderActionButton(action, opts = {}) {
|
|
|
3377
2339
|
);
|
|
3378
2340
|
}
|
|
3379
2341
|
if (action.submenu && action.submenu.length > 0) {
|
|
3380
|
-
return /* @__PURE__ */
|
|
2342
|
+
return /* @__PURE__ */ jsx14(
|
|
3381
2343
|
ActionsMenuDropdown,
|
|
3382
2344
|
{
|
|
3383
2345
|
groups: [{ items: action.submenu }],
|
|
3384
|
-
customTrigger: /* @__PURE__ */
|
|
2346
|
+
customTrigger: /* @__PURE__ */ jsx14(
|
|
3385
2347
|
Button,
|
|
3386
2348
|
{
|
|
3387
2349
|
variant: "outline",
|
|
3388
2350
|
disabled: action.disabled,
|
|
3389
2351
|
loading: action.loading,
|
|
3390
2352
|
leftIcon: action.icon,
|
|
3391
|
-
splitIcon: /* @__PURE__ */
|
|
2353
|
+
splitIcon: /* @__PURE__ */ jsx14(Chevron02DownIcon, { className: "h-4 w-4" }),
|
|
3392
2354
|
className: opts.fullWidth ? "flex-1" : void 0,
|
|
3393
2355
|
children: action.label
|
|
3394
2356
|
}
|
|
@@ -3398,8 +2360,8 @@ function renderActionButton(action, opts = {}) {
|
|
|
3398
2360
|
}
|
|
3399
2361
|
const isIconOnly = opts.iconOnly || !action.label || action.iconOnlyOnDesktop;
|
|
3400
2362
|
if (isIconOnly) {
|
|
3401
|
-
const iconNode = action.iconOnlyOnDesktop ? /* @__PURE__ */
|
|
3402
|
-
return /* @__PURE__ */
|
|
2363
|
+
const iconNode = action.iconOnlyOnDesktop ? /* @__PURE__ */ jsx14("span", { className: "inline-flex [&_svg]:!text-ods-text-primary", children: action.icon }) : action.icon;
|
|
2364
|
+
return /* @__PURE__ */ jsx14(
|
|
3403
2365
|
Button,
|
|
3404
2366
|
{
|
|
3405
2367
|
variant: action.variant,
|
|
@@ -3415,7 +2377,7 @@ function renderActionButton(action, opts = {}) {
|
|
|
3415
2377
|
}
|
|
3416
2378
|
);
|
|
3417
2379
|
}
|
|
3418
|
-
return /* @__PURE__ */
|
|
2380
|
+
return /* @__PURE__ */ jsx14(
|
|
3419
2381
|
Button,
|
|
3420
2382
|
{
|
|
3421
2383
|
variant: action.variant,
|
|
@@ -3440,12 +2402,12 @@ function PageActions({
|
|
|
3440
2402
|
className
|
|
3441
2403
|
}) {
|
|
3442
2404
|
if (variant === "icon-buttons") {
|
|
3443
|
-
return /* @__PURE__ */
|
|
2405
|
+
return /* @__PURE__ */ jsx14(IconButtonsVariant, { actions, menuActions, selector, className });
|
|
3444
2406
|
}
|
|
3445
2407
|
if (variant === "menu-primary") {
|
|
3446
|
-
return /* @__PURE__ */
|
|
2408
|
+
return /* @__PURE__ */ jsx14(MenuPrimaryVariant, { actions, menuActions: menuActions || [], selector, className });
|
|
3447
2409
|
}
|
|
3448
|
-
return /* @__PURE__ */
|
|
2410
|
+
return /* @__PURE__ */ jsx14(PrimaryButtonsVariant, { actions, className });
|
|
3449
2411
|
}
|
|
3450
2412
|
function IconButtonsVariant({
|
|
3451
2413
|
actions,
|
|
@@ -3458,13 +2420,13 @@ function IconButtonsVariant({
|
|
|
3458
2420
|
const isSingleAction = actions.length === 1 && !actions[0].submenu?.length;
|
|
3459
2421
|
const singleAction = isSingleAction ? actions[0] : null;
|
|
3460
2422
|
const useSingleActionMobile = isSingleAction && !hasMenuActions;
|
|
3461
|
-
return /* @__PURE__ */
|
|
3462
|
-
/* @__PURE__ */
|
|
2423
|
+
return /* @__PURE__ */ jsxs11(Fragment4, { children: [
|
|
2424
|
+
/* @__PURE__ */ jsxs11("div", { className: cn("hidden md:flex items-center", ACTIONS_GAP, className), children: [
|
|
3463
2425
|
selector,
|
|
3464
|
-
desktopActions.map((action, idx) => /* @__PURE__ */
|
|
3465
|
-
hasMenuActions && /* @__PURE__ */
|
|
2426
|
+
desktopActions.map((action, idx) => /* @__PURE__ */ jsx14(React10.Fragment, { children: renderActionButton(action) }, actionKey(action, idx))),
|
|
2427
|
+
hasMenuActions && /* @__PURE__ */ jsx14(ActionsMenuDropdown, { groups: menuActions })
|
|
3466
2428
|
] }),
|
|
3467
|
-
/* @__PURE__ */
|
|
2429
|
+
/* @__PURE__ */ jsx14("div", { className: cn("flex md:hidden", className), children: useSingleActionMobile && singleAction ? renderActionButton(singleAction, { iconOnly: true }) : /* @__PURE__ */ jsx14(
|
|
3468
2430
|
ActionsMenuDropdown,
|
|
3469
2431
|
{
|
|
3470
2432
|
groups: [
|
|
@@ -3485,9 +2447,9 @@ function PrimaryButtonsVariant({
|
|
|
3485
2447
|
return 0;
|
|
3486
2448
|
});
|
|
3487
2449
|
const desktopActions = sortedActions.filter((a) => !a.showOnlyMobile);
|
|
3488
|
-
return /* @__PURE__ */
|
|
3489
|
-
/* @__PURE__ */
|
|
3490
|
-
/* @__PURE__ */
|
|
2450
|
+
return /* @__PURE__ */ jsxs11(Fragment4, { children: [
|
|
2451
|
+
/* @__PURE__ */ jsx14("div", { className: cn("hidden md:flex items-center", ACTIONS_GAP, className), children: desktopActions.map((action, idx) => /* @__PURE__ */ jsx14(React10.Fragment, { children: renderActionButton(action) }, `desktop-${actionKey(action, idx)}`)) }),
|
|
2452
|
+
/* @__PURE__ */ jsx14(MobileBottomActions, { actions: sortedActions })
|
|
3491
2453
|
] });
|
|
3492
2454
|
}
|
|
3493
2455
|
function MenuPrimaryVariant({
|
|
@@ -3498,13 +2460,13 @@ function MenuPrimaryVariant({
|
|
|
3498
2460
|
}) {
|
|
3499
2461
|
const desktopActions = actions.filter((a) => !a.showOnlyMobile);
|
|
3500
2462
|
const hasMenuActions = menuActions.some((g) => g.items.length > 0);
|
|
3501
|
-
return /* @__PURE__ */
|
|
3502
|
-
/* @__PURE__ */
|
|
2463
|
+
return /* @__PURE__ */ jsxs11(Fragment4, { children: [
|
|
2464
|
+
/* @__PURE__ */ jsxs11("div", { className: cn("hidden md:flex items-center", ACTIONS_GAP, className), children: [
|
|
3503
2465
|
selector,
|
|
3504
|
-
hasMenuActions && /* @__PURE__ */
|
|
3505
|
-
desktopActions.map((action, idx) => /* @__PURE__ */
|
|
2466
|
+
hasMenuActions && /* @__PURE__ */ jsx14(ActionsMenuDropdown, { groups: menuActions }),
|
|
2467
|
+
desktopActions.map((action, idx) => /* @__PURE__ */ jsx14(React10.Fragment, { children: renderActionButton({ ...action, variant: action.variant || "accent" }) }, `desktop-${actionKey(action, idx)}`))
|
|
3506
2468
|
] }),
|
|
3507
|
-
/* @__PURE__ */
|
|
2469
|
+
/* @__PURE__ */ jsx14("div", { className: cn("flex md:hidden", className), children: /* @__PURE__ */ jsx14(
|
|
3508
2470
|
ActionsMenuDropdown,
|
|
3509
2471
|
{
|
|
3510
2472
|
groups: [
|
|
@@ -3516,12 +2478,12 @@ function MenuPrimaryVariant({
|
|
|
3516
2478
|
] });
|
|
3517
2479
|
}
|
|
3518
2480
|
function MobileBottomActions({ actions }) {
|
|
3519
|
-
return /* @__PURE__ */
|
|
2481
|
+
return /* @__PURE__ */ jsx14("div", { className: cn(
|
|
3520
2482
|
"fixed md:hidden bottom-0 left-0 right-0 z-50",
|
|
3521
2483
|
"bg-ods-card border-t border-ods-border",
|
|
3522
2484
|
"flex items-start pt-6 pb-6 px-6",
|
|
3523
2485
|
ACTIONS_GAP
|
|
3524
|
-
), children: actions.map((action, idx) => /* @__PURE__ */
|
|
2486
|
+
), children: actions.map((action, idx) => /* @__PURE__ */ jsx14(React10.Fragment, { children: renderActionButton(action, { fullWidth: !!action.label }) }, `mobile-${actionKey(action, idx)}`)) });
|
|
3525
2487
|
}
|
|
3526
2488
|
function usePageActionsBottomPadding(variant) {
|
|
3527
2489
|
return variant === "primary-buttons" || variant === "menu-primary" ? "pb-40 md:pb-0" : "";
|
|
@@ -3529,17 +2491,17 @@ function usePageActionsBottomPadding(variant) {
|
|
|
3529
2491
|
|
|
3530
2492
|
// src/components/ui/entity-image.tsx
|
|
3531
2493
|
init_cn();
|
|
3532
|
-
import
|
|
3533
|
-
import { jsx as
|
|
2494
|
+
import React11 from "react";
|
|
2495
|
+
import { jsx as jsx15 } from "react/jsx-runtime";
|
|
3534
2496
|
function EntityImage({ src, alt, fallbackText, className }) {
|
|
3535
|
-
const [imageFailed, setImageFailed] =
|
|
3536
|
-
|
|
2497
|
+
const [imageFailed, setImageFailed] = React11.useState(false);
|
|
2498
|
+
React11.useEffect(() => {
|
|
3537
2499
|
setImageFailed(false);
|
|
3538
2500
|
}, [src]);
|
|
3539
2501
|
const showFallback = imageFailed || !src;
|
|
3540
2502
|
const initials = getFirstLastInitials(fallbackText ?? alt);
|
|
3541
2503
|
if (showFallback) {
|
|
3542
|
-
return /* @__PURE__ */
|
|
2504
|
+
return /* @__PURE__ */ jsx15(
|
|
3543
2505
|
"div",
|
|
3544
2506
|
{
|
|
3545
2507
|
"aria-label": alt,
|
|
@@ -3551,7 +2513,7 @@ function EntityImage({ src, alt, fallbackText, className }) {
|
|
|
3551
2513
|
}
|
|
3552
2514
|
);
|
|
3553
2515
|
}
|
|
3554
|
-
return /* @__PURE__ */
|
|
2516
|
+
return /* @__PURE__ */ jsx15(
|
|
3555
2517
|
"img",
|
|
3556
2518
|
{
|
|
3557
2519
|
src: src ?? void 0,
|
|
@@ -3570,9 +2532,9 @@ init_cn();
|
|
|
3570
2532
|
|
|
3571
2533
|
// src/components/layout/back-button.tsx
|
|
3572
2534
|
init_cn();
|
|
3573
|
-
import { jsx as
|
|
2535
|
+
import { jsx as jsx16, jsxs as jsxs12 } from "react/jsx-runtime";
|
|
3574
2536
|
function BackButton({ label = "Back", className, type = "button", ...props }) {
|
|
3575
|
-
return /* @__PURE__ */
|
|
2537
|
+
return /* @__PURE__ */ jsxs12(
|
|
3576
2538
|
"button",
|
|
3577
2539
|
{
|
|
3578
2540
|
type,
|
|
@@ -3586,15 +2548,15 @@ function BackButton({ label = "Back", className, type = "button", ...props }) {
|
|
|
3586
2548
|
),
|
|
3587
2549
|
...props,
|
|
3588
2550
|
children: [
|
|
3589
|
-
/* @__PURE__ */
|
|
3590
|
-
/* @__PURE__ */
|
|
2551
|
+
/* @__PURE__ */ jsx16(Chevron02LeftIcon, { className: "size-6 shrink-0" }),
|
|
2552
|
+
/* @__PURE__ */ jsx16("span", { className: "text-h4", children: label })
|
|
3591
2553
|
]
|
|
3592
2554
|
}
|
|
3593
2555
|
);
|
|
3594
2556
|
}
|
|
3595
2557
|
|
|
3596
2558
|
// src/components/layout/title-block.tsx
|
|
3597
|
-
import { jsx as
|
|
2559
|
+
import { jsx as jsx17, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
3598
2560
|
function TitleBlock({
|
|
3599
2561
|
title,
|
|
3600
2562
|
subtitle,
|
|
@@ -3609,7 +2571,7 @@ function TitleBlock({
|
|
|
3609
2571
|
}) {
|
|
3610
2572
|
const hasActions = actions && actions.length > 0;
|
|
3611
2573
|
const hasMenuActions = !!menuActions && menuActions.some((g) => g.items.length > 0);
|
|
3612
|
-
return /* @__PURE__ */
|
|
2574
|
+
return /* @__PURE__ */ jsxs13(
|
|
3613
2575
|
"div",
|
|
3614
2576
|
{
|
|
3615
2577
|
className: cn(
|
|
@@ -3626,8 +2588,8 @@ function TitleBlock({
|
|
|
3626
2588
|
className
|
|
3627
2589
|
),
|
|
3628
2590
|
children: [
|
|
3629
|
-
/* @__PURE__ */
|
|
3630
|
-
backButton && /* @__PURE__ */
|
|
2591
|
+
/* @__PURE__ */ jsxs13("div", { className: "flex flex-col gap-[var(--spacing-system-xs)] flex-1 min-w-0", children: [
|
|
2592
|
+
backButton && /* @__PURE__ */ jsx17(
|
|
3631
2593
|
BackButton,
|
|
3632
2594
|
{
|
|
3633
2595
|
onClick: backButton.onClick,
|
|
@@ -3635,8 +2597,8 @@ function TitleBlock({
|
|
|
3635
2597
|
className: "hidden md:inline-flex"
|
|
3636
2598
|
}
|
|
3637
2599
|
),
|
|
3638
|
-
image || subtitle ? /* @__PURE__ */
|
|
3639
|
-
image && /* @__PURE__ */
|
|
2600
|
+
image || subtitle ? /* @__PURE__ */ jsxs13("div", { className: "flex items-center gap-[var(--spacing-system-m)] min-w-0 w-full", children: [
|
|
2601
|
+
image && /* @__PURE__ */ jsx17(
|
|
3640
2602
|
EntityImage,
|
|
3641
2603
|
{
|
|
3642
2604
|
src: image.src,
|
|
@@ -3644,13 +2606,13 @@ function TitleBlock({
|
|
|
3644
2606
|
fallbackText: image.alt || title
|
|
3645
2607
|
}
|
|
3646
2608
|
),
|
|
3647
|
-
/* @__PURE__ */
|
|
3648
|
-
title && /* @__PURE__ */
|
|
3649
|
-
subtitle && /* @__PURE__ */
|
|
2609
|
+
/* @__PURE__ */ jsxs13("div", { className: "flex flex-col justify-center min-w-0 flex-1", children: [
|
|
2610
|
+
title && /* @__PURE__ */ jsx17("h1", { className: "text-h2 text-ods-text-primary truncate", title, children: title }),
|
|
2611
|
+
subtitle && /* @__PURE__ */ jsx17("p", { className: "text-h6 text-ods-text-secondary truncate", title: subtitle, children: subtitle })
|
|
3650
2612
|
] })
|
|
3651
|
-
] }) : title && /* @__PURE__ */
|
|
2613
|
+
] }) : title && /* @__PURE__ */ jsx17("h1", { className: "text-h2 text-ods-text-primary", children: title })
|
|
3652
2614
|
] }),
|
|
3653
|
-
(hasActions || hasMenuActions || selector) && /* @__PURE__ */
|
|
2615
|
+
(hasActions || hasMenuActions || selector) && /* @__PURE__ */ jsx17("div", { className: "flex gap-2 items-center shrink-0", children: /* @__PURE__ */ jsx17(
|
|
3654
2616
|
PageActions,
|
|
3655
2617
|
{
|
|
3656
2618
|
variant: actionsVariant,
|
|
@@ -3666,7 +2628,7 @@ function TitleBlock({
|
|
|
3666
2628
|
|
|
3667
2629
|
// src/components/layout/page-layout.tsx
|
|
3668
2630
|
init_cn();
|
|
3669
|
-
import { jsx as
|
|
2631
|
+
import { jsx as jsx18, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
3670
2632
|
function PageLayout({
|
|
3671
2633
|
children,
|
|
3672
2634
|
title,
|
|
@@ -3685,8 +2647,8 @@ function PageLayout({
|
|
|
3685
2647
|
const hasActions = actions && actions.length > 0;
|
|
3686
2648
|
const needsBottomPadding = hasActions && actionsVariant === "primary-buttons";
|
|
3687
2649
|
const hasHeader = showHeader && (title || subtitle || image || backButton || hasActions || selector);
|
|
3688
|
-
return /* @__PURE__ */
|
|
3689
|
-
hasHeader && /* @__PURE__ */
|
|
2650
|
+
return /* @__PURE__ */ jsxs14("div", { className: cn("flex flex-col w-full", className), children: [
|
|
2651
|
+
hasHeader && /* @__PURE__ */ jsx18(
|
|
3690
2652
|
TitleBlock,
|
|
3691
2653
|
{
|
|
3692
2654
|
title,
|
|
@@ -3700,78 +2662,31 @@ function PageLayout({
|
|
|
3700
2662
|
variant: headerVariant
|
|
3701
2663
|
}
|
|
3702
2664
|
),
|
|
3703
|
-
/* @__PURE__ */
|
|
2665
|
+
/* @__PURE__ */ jsx18("div", { className: cn("flex flex-col flex-1 gap-[var(--spacing-system-l)]", needsBottomPadding && "pb-28 md:pb-0", contentClassName), children })
|
|
3704
2666
|
] });
|
|
3705
2667
|
}
|
|
3706
2668
|
|
|
3707
2669
|
// src/components/layout/article-detail-layout.tsx
|
|
3708
2670
|
init_cn();
|
|
3709
|
-
import { jsx as
|
|
2671
|
+
import { jsx as jsx19, jsxs as jsxs15 } from "react/jsx-runtime";
|
|
3710
2672
|
function PageShell({ children, schemas, contentClassName }) {
|
|
3711
|
-
return /* @__PURE__ */
|
|
2673
|
+
return /* @__PURE__ */ jsxs15("main", { className: "bg-ods-bg min-h-screen", children: [
|
|
3712
2674
|
schemas,
|
|
3713
|
-
/* @__PURE__ */
|
|
2675
|
+
/* @__PURE__ */ jsx19("div", { className: cn("page-shell-content max-w-[1920px] mx-auto", contentClassName), children })
|
|
3714
2676
|
] });
|
|
3715
2677
|
}
|
|
3716
2678
|
function ArticleDetailLayout({ children, schemas, contentClassName }) {
|
|
3717
|
-
return /* @__PURE__ */
|
|
2679
|
+
return /* @__PURE__ */ jsxs15("main", { className: "bg-ods-bg min-h-screen", children: [
|
|
3718
2680
|
schemas,
|
|
3719
|
-
/* @__PURE__ */
|
|
2681
|
+
/* @__PURE__ */ jsx19("div", { className: cn("max-w-[1280px] mx-auto px-6 md:px-20 py-6 md:py-10", contentClassName), children })
|
|
3720
2682
|
] });
|
|
3721
2683
|
}
|
|
3722
2684
|
|
|
3723
|
-
// src/utils/content-href.ts
|
|
3724
|
-
var DEFAULT_CONTENT_SUFFIXES = {
|
|
3725
|
-
onboarding_guide: "onboarding-guides",
|
|
3726
|
-
product_release: "releases",
|
|
3727
|
-
blog_post: "blog",
|
|
3728
|
-
case_study: "case-studies",
|
|
3729
|
-
customer_interview: "interviews",
|
|
3730
|
-
investor_update: "investor-updates",
|
|
3731
|
-
webinar: "webinars",
|
|
3732
|
-
podcast: "podcasts",
|
|
3733
|
-
event: "events",
|
|
3734
|
-
// Author profile pages (`/authors/<slug>`) — identified by the profile
|
|
3735
|
-
// slug. Mirrors the hub's `PUBLIC_URL_PATHS.author`, which derives from
|
|
3736
|
-
// `AUTHORS_PATH` in the hub's `lib/utils/breadcrumbs.ts` (the hub-side
|
|
3737
|
-
// SSOT for the segment).
|
|
3738
|
-
author: "authors"
|
|
3739
|
-
};
|
|
3740
|
-
function lastPathSegment(url) {
|
|
3741
|
-
try {
|
|
3742
|
-
const pathname = new URL(url, "https://_.local").pathname;
|
|
3743
|
-
const segs = pathname.split("/").filter(Boolean);
|
|
3744
|
-
return segs.length > 0 ? segs[segs.length - 1] : null;
|
|
3745
|
-
} catch {
|
|
3746
|
-
return null;
|
|
3747
|
-
}
|
|
3748
|
-
}
|
|
3749
|
-
function makeComposeContentUrl(opts) {
|
|
3750
|
-
const suffixes = opts.suffixes ?? DEFAULT_CONTENT_SUFFIXES;
|
|
3751
|
-
return ({ type, identifier, externalUrl, targetPlatform }) => {
|
|
3752
|
-
const override = opts.overrides && Object.prototype.hasOwnProperty.call(opts.overrides, type) ? opts.overrides[type] : void 0;
|
|
3753
|
-
if (override) return override(identifier);
|
|
3754
|
-
const seg = (Object.prototype.hasOwnProperty.call(suffixes, type) ? suffixes[type] : void 0) ?? type;
|
|
3755
|
-
if (opts.hostedTypes.has(type)) {
|
|
3756
|
-
const recovered = externalUrl ? lastPathSegment(externalUrl) : null;
|
|
3757
|
-
const slug = recovered && recovered !== seg ? recovered : identifier;
|
|
3758
|
-
return { href: `/${seg}/${slug}`, targetPlatform: null };
|
|
3759
|
-
}
|
|
3760
|
-
return externalUrl ? { href: externalUrl, targetPlatform: targetPlatform ?? null } : { href: `${opts.contentOrigin}/${seg}/${identifier}`, targetPlatform: null };
|
|
3761
|
-
};
|
|
3762
|
-
}
|
|
3763
|
-
function buildDefaultHref(basePath, slug) {
|
|
3764
|
-
return { href: `${basePath}/${slug}`, targetPlatform: null };
|
|
3765
|
-
}
|
|
3766
|
-
function resolveContentHref(composeContentUrl, args) {
|
|
3767
|
-
return composeContentUrl ? composeContentUrl({ type: args.type, identifier: args.slug, platforms: args.platforms }) : buildDefaultHref(args.basePath, args.slug);
|
|
3768
|
-
}
|
|
3769
|
-
|
|
3770
2685
|
// src/components/ui/error-state.tsx
|
|
3771
2686
|
init_button();
|
|
3772
2687
|
init_cn();
|
|
3773
2688
|
import { AlertTriangle, RefreshCw, Home } from "lucide-react";
|
|
3774
|
-
import { jsx as
|
|
2689
|
+
import { jsx as jsx20, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
3775
2690
|
function ErrorState({
|
|
3776
2691
|
title = "Error",
|
|
3777
2692
|
message,
|
|
@@ -3810,36 +2725,36 @@ function ErrorState({
|
|
|
3810
2725
|
}
|
|
3811
2726
|
};
|
|
3812
2727
|
const styles = getVariantStyles();
|
|
3813
|
-
return /* @__PURE__ */
|
|
2728
|
+
return /* @__PURE__ */ jsx20("div", { className: cn("p-6", containerClassName), children: /* @__PURE__ */ jsx20("div", { className: cn(
|
|
3814
2729
|
"rounded-lg p-4 border",
|
|
3815
2730
|
styles.bg,
|
|
3816
2731
|
styles.border,
|
|
3817
2732
|
className
|
|
3818
|
-
), children: /* @__PURE__ */
|
|
3819
|
-
showIcon && /* @__PURE__ */
|
|
3820
|
-
/* @__PURE__ */
|
|
3821
|
-
/* @__PURE__ */
|
|
3822
|
-
/* @__PURE__ */
|
|
3823
|
-
(showRetry || showHome) && /* @__PURE__ */
|
|
3824
|
-
showRetry && onRetry && /* @__PURE__ */
|
|
2733
|
+
), children: /* @__PURE__ */ jsxs16("div", { className: "flex items-start gap-3", children: [
|
|
2734
|
+
showIcon && /* @__PURE__ */ jsx20(AlertTriangle, { className: cn("h-5 w-5 mt-0.5 flex-shrink-0", styles.icon) }),
|
|
2735
|
+
/* @__PURE__ */ jsxs16("div", { className: "flex-1", children: [
|
|
2736
|
+
/* @__PURE__ */ jsx20("h3", { className: cn("font-semibold mb-1", styles.text), children: title }),
|
|
2737
|
+
/* @__PURE__ */ jsx20("p", { className: cn("text-sm", styles.text), children: message }),
|
|
2738
|
+
(showRetry || showHome) && /* @__PURE__ */ jsxs16("div", { className: "flex gap-2 mt-3", children: [
|
|
2739
|
+
showRetry && onRetry && /* @__PURE__ */ jsx20(
|
|
3825
2740
|
Button,
|
|
3826
2741
|
{
|
|
3827
2742
|
onClick: onRetry,
|
|
3828
2743
|
variant: "outline",
|
|
3829
2744
|
size: "small-legacy",
|
|
3830
2745
|
className: "h-8",
|
|
3831
|
-
leftIcon: /* @__PURE__ */
|
|
2746
|
+
leftIcon: /* @__PURE__ */ jsx20(RefreshCw, { className: "h-4 w-4" }),
|
|
3832
2747
|
children: "Try Again"
|
|
3833
2748
|
}
|
|
3834
2749
|
),
|
|
3835
|
-
showHome && onHome && /* @__PURE__ */
|
|
2750
|
+
showHome && onHome && /* @__PURE__ */ jsx20(
|
|
3836
2751
|
Button,
|
|
3837
2752
|
{
|
|
3838
2753
|
onClick: onHome,
|
|
3839
2754
|
variant: "outline",
|
|
3840
2755
|
size: "small-legacy",
|
|
3841
2756
|
className: "h-8",
|
|
3842
|
-
leftIcon: /* @__PURE__ */
|
|
2757
|
+
leftIcon: /* @__PURE__ */ jsx20(Home, { className: "h-4 w-4" }),
|
|
3843
2758
|
children: "Go Home"
|
|
3844
2759
|
}
|
|
3845
2760
|
)
|
|
@@ -3848,7 +2763,7 @@ function ErrorState({
|
|
|
3848
2763
|
] }) }) });
|
|
3849
2764
|
}
|
|
3850
2765
|
function PageError({ message, onRetry, onHome }) {
|
|
3851
|
-
return /* @__PURE__ */
|
|
2766
|
+
return /* @__PURE__ */ jsx20(
|
|
3852
2767
|
ErrorState,
|
|
3853
2768
|
{
|
|
3854
2769
|
title: "Page Error",
|
|
@@ -3862,7 +2777,7 @@ function PageError({ message, onRetry, onHome }) {
|
|
|
3862
2777
|
);
|
|
3863
2778
|
}
|
|
3864
2779
|
function LoadError({ message, onRetry }) {
|
|
3865
|
-
return /* @__PURE__ */
|
|
2780
|
+
return /* @__PURE__ */ jsx20(
|
|
3866
2781
|
ErrorState,
|
|
3867
2782
|
{
|
|
3868
2783
|
title: "Loading Error",
|
|
@@ -3874,7 +2789,7 @@ function LoadError({ message, onRetry }) {
|
|
|
3874
2789
|
);
|
|
3875
2790
|
}
|
|
3876
2791
|
function NotFoundError({ message = "The requested item was not found", onHome }) {
|
|
3877
|
-
return /* @__PURE__ */
|
|
2792
|
+
return /* @__PURE__ */ jsx20(
|
|
3878
2793
|
ErrorState,
|
|
3879
2794
|
{
|
|
3880
2795
|
title: "Not Found",
|
|
@@ -3888,7 +2803,7 @@ function NotFoundError({ message = "The requested item was not found", onHome })
|
|
|
3888
2803
|
|
|
3889
2804
|
// src/components/features/entity-tag-badges.tsx
|
|
3890
2805
|
import Link from "next/link";
|
|
3891
|
-
import { jsx as
|
|
2806
|
+
import { jsx as jsx21, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
3892
2807
|
var TAG_BADGE_CLASS = "bg-ods-card border border-ods-border";
|
|
3893
2808
|
var BADGE_CLASS = TAG_BADGE_CLASS;
|
|
3894
2809
|
function EntityTagBadges({ tags, basePath, max, className }) {
|
|
@@ -3897,12 +2812,12 @@ function EntityTagBadges({ tags, basePath, max, className }) {
|
|
|
3897
2812
|
const visibleLimit = max == null ? items.length : Math.max(0, max);
|
|
3898
2813
|
const shown = items.slice(0, visibleLimit);
|
|
3899
2814
|
const overflow = items.length - shown.length;
|
|
3900
|
-
return /* @__PURE__ */
|
|
2815
|
+
return /* @__PURE__ */ jsxs17("div", { className: `flex flex-wrap items-center gap-2 w-full ${className || ""}`, children: [
|
|
3901
2816
|
shown.map((tag) => {
|
|
3902
2817
|
const key = tag.tag_id ?? tag.id ?? tag.slug ?? tag.name;
|
|
3903
2818
|
const label = (tag.name || "").toUpperCase();
|
|
3904
2819
|
if (basePath && tag.slug) {
|
|
3905
|
-
return /* @__PURE__ */
|
|
2820
|
+
return /* @__PURE__ */ jsx21(Link, { href: `${basePath}?tags=${tag.slug}`, className: "inline-flex", children: /* @__PURE__ */ jsx21(
|
|
3906
2821
|
StatusBadge,
|
|
3907
2822
|
{
|
|
3908
2823
|
text: label,
|
|
@@ -3911,9 +2826,9 @@ function EntityTagBadges({ tags, basePath, max, className }) {
|
|
|
3911
2826
|
}
|
|
3912
2827
|
) }, key);
|
|
3913
2828
|
}
|
|
3914
|
-
return /* @__PURE__ */
|
|
2829
|
+
return /* @__PURE__ */ jsx21(StatusBadge, { text: label, variant: "card", className: BADGE_CLASS }, key);
|
|
3915
2830
|
}),
|
|
3916
|
-
overflow > 0 && /* @__PURE__ */
|
|
2831
|
+
overflow > 0 && /* @__PURE__ */ jsx21(StatusBadge, { text: `+${overflow}`, variant: "card", className: `${BADGE_CLASS} text-ods-text-secondary` })
|
|
3917
2832
|
] });
|
|
3918
2833
|
}
|
|
3919
2834
|
|
|
@@ -3985,403 +2900,10 @@ function getCaptionsUrl(entityType, entityId, srtContent) {
|
|
|
3985
2900
|
return `/api/captions/${entityType}/${entityId}?v=${hash}`;
|
|
3986
2901
|
}
|
|
3987
2902
|
|
|
3988
|
-
// src/components/ui/search-input.tsx
|
|
3989
|
-
init_cn();
|
|
3990
|
-
import * as PopoverPrimitive from "@radix-ui/react-popover";
|
|
3991
|
-
import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area";
|
|
3992
|
-
import * as React13 from "react";
|
|
3993
|
-
import { jsx as jsx25, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
3994
|
-
var containerStyles = cn(
|
|
3995
|
-
// Layout & spacing — matches lib Input component
|
|
3996
|
-
"flex items-center gap-2 rounded-[6px] border px-3 h-11 md:h-12 cursor-text",
|
|
3997
|
-
"has-[:focus-visible]:outline-none",
|
|
3998
|
-
"group",
|
|
3999
|
-
"transition-colors duration-200",
|
|
4000
|
-
// Theme palette — matches lib Input component
|
|
4001
|
-
"bg-ods-card border-ods-border has-[:focus]:border-ods-accent"
|
|
4002
|
-
);
|
|
4003
|
-
var innerInputStyles = cn(
|
|
4004
|
-
"flex-1 min-w-[60px] bg-transparent border-none outline-none",
|
|
4005
|
-
"text-h4",
|
|
4006
|
-
"text-ods-text-primary placeholder:text-ods-text-secondary",
|
|
4007
|
-
"disabled:cursor-not-allowed",
|
|
4008
|
-
"touch-manipulation"
|
|
4009
|
-
);
|
|
4010
|
-
function chipVariantToTagVariant(variant) {
|
|
4011
|
-
switch (variant) {
|
|
4012
|
-
case "selected":
|
|
4013
|
-
return "primary";
|
|
4014
|
-
// Content tags render with the unified badge skin (ods-card + ods-border,
|
|
4015
|
-
// mono uppercase) — identical to the public EntityTagBadges display.
|
|
4016
|
-
case "tag":
|
|
4017
|
-
return "badge";
|
|
4018
|
-
case "category":
|
|
4019
|
-
case "subcategory":
|
|
4020
|
-
default:
|
|
4021
|
-
return "outline";
|
|
4022
|
-
}
|
|
4023
|
-
}
|
|
4024
|
-
function SearchInput({
|
|
4025
|
-
placeholder = "Search...",
|
|
4026
|
-
value,
|
|
4027
|
-
defaultValue = "",
|
|
4028
|
-
onChange,
|
|
4029
|
-
onSubmit,
|
|
4030
|
-
results = [],
|
|
4031
|
-
isLoading = false,
|
|
4032
|
-
onResultSelect,
|
|
4033
|
-
debounceMs = 300,
|
|
4034
|
-
renderResult,
|
|
4035
|
-
groupBy,
|
|
4036
|
-
emptyResultsText = "No results found",
|
|
4037
|
-
showDropdown: showDropdownProp,
|
|
4038
|
-
filterChips = [],
|
|
4039
|
-
onFilterRemove,
|
|
4040
|
-
startAdornment,
|
|
4041
|
-
endAdornment,
|
|
4042
|
-
className,
|
|
4043
|
-
dropdownClassName,
|
|
4044
|
-
minQueryLength = 2,
|
|
4045
|
-
limitTags = "auto",
|
|
4046
|
-
getLimitTagsText = (more) => `+${more}`
|
|
4047
|
-
}) {
|
|
4048
|
-
const [internalValue, setInternalValue] = React13.useState(defaultValue);
|
|
4049
|
-
const currentValue = onChange ? value ?? "" : internalValue;
|
|
4050
|
-
const debouncedValue = useDebounce(currentValue, debounceMs);
|
|
4051
|
-
const [isOpen, setIsOpen] = React13.useState(false);
|
|
4052
|
-
const [highlightedIndex, setHighlightedIndex] = React13.useState(-1);
|
|
4053
|
-
const containerRef = React13.useRef(null);
|
|
4054
|
-
const currentPlaceholder = filterChips.length > 0 ? "Add filter..." : placeholder;
|
|
4055
|
-
const {
|
|
4056
|
-
visibleCount: rawVisibleCount,
|
|
4057
|
-
middleRef,
|
|
4058
|
-
measureRef,
|
|
4059
|
-
textMeasureRef,
|
|
4060
|
-
badgeRef,
|
|
4061
|
-
inputRef
|
|
4062
|
-
} = useAutoLimitTags({
|
|
4063
|
-
count: filterChips.length,
|
|
4064
|
-
limitTags,
|
|
4065
|
-
// When chips exist, pass empty placeholder so the hook only reserves input minWidth,
|
|
4066
|
-
// not the full placeholder text width — gives more room for chips on narrow screens
|
|
4067
|
-
placeholder: filterChips.length > 0 ? "" : placeholder
|
|
4068
|
-
});
|
|
4069
|
-
const visibleCount = filterChips.length > 0 ? Math.max(1, rawVisibleCount) : rawVisibleCount;
|
|
4070
|
-
const hiddenTagsRef = React13.useRef(null);
|
|
4071
|
-
const hiddenTagsPopupRef = React13.useRef(null);
|
|
4072
|
-
const [showHiddenTags, setShowHiddenTags] = React13.useState(false);
|
|
4073
|
-
React13.useEffect(() => {
|
|
4074
|
-
if (!showHiddenTags) return;
|
|
4075
|
-
const handleClick = (e) => {
|
|
4076
|
-
const target = e.target;
|
|
4077
|
-
if (!hiddenTagsRef.current?.contains(target) && !hiddenTagsPopupRef.current?.contains(target)) {
|
|
4078
|
-
setShowHiddenTags(false);
|
|
4079
|
-
}
|
|
4080
|
-
};
|
|
4081
|
-
document.addEventListener("mousedown", handleClick);
|
|
4082
|
-
return () => document.removeEventListener("mousedown", handleClick);
|
|
4083
|
-
}, [showHiddenTags]);
|
|
4084
|
-
const hiddenCount = filterChips.length - visibleCount;
|
|
4085
|
-
const visibleChips = filterChips.slice(0, visibleCount);
|
|
4086
|
-
const hiddenChips = filterChips.slice(visibleCount);
|
|
4087
|
-
const { flatResults, groups } = React13.useMemo(() => {
|
|
4088
|
-
if (!groupBy) return { flatResults: results, groups: null };
|
|
4089
|
-
const grouped = /* @__PURE__ */ new Map();
|
|
4090
|
-
for (const r of results) {
|
|
4091
|
-
const key = groupBy(r);
|
|
4092
|
-
const arr = grouped.get(key);
|
|
4093
|
-
if (arr) {
|
|
4094
|
-
arr.push(r);
|
|
4095
|
-
} else {
|
|
4096
|
-
grouped.set(key, [r]);
|
|
4097
|
-
}
|
|
4098
|
-
}
|
|
4099
|
-
return { flatResults: results, groups: grouped };
|
|
4100
|
-
}, [results, groupBy]);
|
|
4101
|
-
const meetsMinQuery = debouncedValue.length >= minQueryLength;
|
|
4102
|
-
const autoShow = meetsMinQuery;
|
|
4103
|
-
const dropdownVisible = showDropdownProp ?? (isOpen && autoShow);
|
|
4104
|
-
React13.useEffect(() => {
|
|
4105
|
-
setHighlightedIndex(-1);
|
|
4106
|
-
}, [flatResults.length]);
|
|
4107
|
-
const handleChange = (e) => {
|
|
4108
|
-
const newVal = e.target.value;
|
|
4109
|
-
if (onChange) {
|
|
4110
|
-
onChange(newVal);
|
|
4111
|
-
} else {
|
|
4112
|
-
setInternalValue(newVal);
|
|
4113
|
-
}
|
|
4114
|
-
if (!isOpen) setIsOpen(true);
|
|
4115
|
-
setHighlightedIndex(-1);
|
|
4116
|
-
};
|
|
4117
|
-
const handleClear = (e) => {
|
|
4118
|
-
e.stopPropagation();
|
|
4119
|
-
e.preventDefault();
|
|
4120
|
-
if (onChange) {
|
|
4121
|
-
onChange("");
|
|
4122
|
-
} else {
|
|
4123
|
-
setInternalValue("");
|
|
4124
|
-
}
|
|
4125
|
-
inputRef.current?.focus();
|
|
4126
|
-
};
|
|
4127
|
-
const handleResultClick = (result, e) => {
|
|
4128
|
-
onResultSelect?.(
|
|
4129
|
-
result,
|
|
4130
|
-
e ? {
|
|
4131
|
-
metaKey: e.metaKey,
|
|
4132
|
-
ctrlKey: e.ctrlKey,
|
|
4133
|
-
shiftKey: e.shiftKey,
|
|
4134
|
-
altKey: e.altKey,
|
|
4135
|
-
button: e.button
|
|
4136
|
-
} : void 0
|
|
4137
|
-
);
|
|
4138
|
-
setIsOpen(false);
|
|
4139
|
-
};
|
|
4140
|
-
const handleKeyDown = (e) => {
|
|
4141
|
-
switch (e.key) {
|
|
4142
|
-
case "ArrowDown":
|
|
4143
|
-
e.preventDefault();
|
|
4144
|
-
if (!isOpen) setIsOpen(true);
|
|
4145
|
-
setHighlightedIndex(
|
|
4146
|
-
(prev) => prev < flatResults.length - 1 ? prev + 1 : 0
|
|
4147
|
-
);
|
|
4148
|
-
break;
|
|
4149
|
-
case "ArrowUp":
|
|
4150
|
-
e.preventDefault();
|
|
4151
|
-
setHighlightedIndex(
|
|
4152
|
-
(prev) => prev > 0 ? prev - 1 : flatResults.length - 1
|
|
4153
|
-
);
|
|
4154
|
-
break;
|
|
4155
|
-
case "Enter":
|
|
4156
|
-
e.preventDefault();
|
|
4157
|
-
if (highlightedIndex >= 0 && flatResults[highlightedIndex]) {
|
|
4158
|
-
handleResultClick(flatResults[highlightedIndex]);
|
|
4159
|
-
} else {
|
|
4160
|
-
onSubmit?.(currentValue);
|
|
4161
|
-
}
|
|
4162
|
-
break;
|
|
4163
|
-
case "Escape":
|
|
4164
|
-
setIsOpen(false);
|
|
4165
|
-
setHighlightedIndex(-1);
|
|
4166
|
-
break;
|
|
4167
|
-
case "Backspace":
|
|
4168
|
-
if (!currentValue && filterChips.length > 0 && onFilterRemove) {
|
|
4169
|
-
onFilterRemove(filterChips[filterChips.length - 1].id);
|
|
4170
|
-
}
|
|
4171
|
-
break;
|
|
4172
|
-
}
|
|
4173
|
-
};
|
|
4174
|
-
const handleOpenChange = (open) => {
|
|
4175
|
-
setIsOpen(open);
|
|
4176
|
-
};
|
|
4177
|
-
const defaultRenderResult = (result, isHighlighted) => /* @__PURE__ */ jsxs21("div", { className: "flex items-center gap-3 w-full min-w-0", children: [
|
|
4178
|
-
result.icon && /* @__PURE__ */ jsx25("span", { className: "flex-shrink-0 text-ods-text-secondary [&_svg]:size-4", children: result.icon }),
|
|
4179
|
-
/* @__PURE__ */ jsxs21("div", { className: "min-w-0 flex-1", children: [
|
|
4180
|
-
/* @__PURE__ */ jsx25("div", { className: cn(
|
|
4181
|
-
"text-sm font-medium leading-5 truncate",
|
|
4182
|
-
isHighlighted ? "text-ods-accent" : "text-ods-text-primary"
|
|
4183
|
-
), title: result.title, children: result.title }),
|
|
4184
|
-
result.description && /* @__PURE__ */ jsx25("div", { className: "text-xs leading-4 text-ods-text-secondary truncate mt-0.5", title: result.description, children: result.description })
|
|
4185
|
-
] }),
|
|
4186
|
-
result.type && /* @__PURE__ */ jsx25("span", { className: "flex-shrink-0 text-[11px] font-medium text-ods-text-muted uppercase tracking-wider", children: result.type })
|
|
4187
|
-
] });
|
|
4188
|
-
const renderRow = (result, index) => {
|
|
4189
|
-
const isHighlighted = index === highlightedIndex;
|
|
4190
|
-
return /* @__PURE__ */ jsx25(
|
|
4191
|
-
"div",
|
|
4192
|
-
{
|
|
4193
|
-
role: "option",
|
|
4194
|
-
"aria-selected": isHighlighted,
|
|
4195
|
-
className: cn(
|
|
4196
|
-
"flex items-center min-h-10 px-3 cursor-pointer transition-colors border-b border-ods-border last:border-b-0",
|
|
4197
|
-
isHighlighted && "bg-ods-bg-hover",
|
|
4198
|
-
!isHighlighted && "hover:bg-ods-bg-hover"
|
|
4199
|
-
),
|
|
4200
|
-
onClick: (e) => handleResultClick(result, e),
|
|
4201
|
-
onMouseEnter: () => setHighlightedIndex(index),
|
|
4202
|
-
children: renderResult ? renderResult(result, isHighlighted) : defaultRenderResult(result, isHighlighted)
|
|
4203
|
-
},
|
|
4204
|
-
result.id
|
|
4205
|
-
);
|
|
4206
|
-
};
|
|
4207
|
-
const renderDropdownContent = () => {
|
|
4208
|
-
if (isLoading) {
|
|
4209
|
-
return /* @__PURE__ */ jsx25("div", { className: "px-4 py-3 text-ods-text-secondary text-[14px]", children: "Loading..." });
|
|
4210
|
-
}
|
|
4211
|
-
if (flatResults.length === 0) {
|
|
4212
|
-
return /* @__PURE__ */ jsx25("div", { className: "px-4 py-3 text-ods-text-secondary text-[14px]", children: emptyResultsText });
|
|
4213
|
-
}
|
|
4214
|
-
if (groups) {
|
|
4215
|
-
let globalIndex = 0;
|
|
4216
|
-
return Array.from(groups.entries()).map(([groupLabel, groupResults]) => /* @__PURE__ */ jsxs21("div", { children: [
|
|
4217
|
-
/* @__PURE__ */ jsx25("div", { className: "px-4 py-2 text-[12px] font-semibold text-ods-text-secondary uppercase tracking-wide bg-ods-bg", children: groupLabel }),
|
|
4218
|
-
groupResults.map((result) => {
|
|
4219
|
-
const idx = globalIndex++;
|
|
4220
|
-
return renderRow(result, idx);
|
|
4221
|
-
})
|
|
4222
|
-
] }, groupLabel));
|
|
4223
|
-
}
|
|
4224
|
-
return flatResults.map((result, index) => renderRow(result, index));
|
|
4225
|
-
};
|
|
4226
|
-
const hasValue = currentValue.length > 0;
|
|
4227
|
-
return /* @__PURE__ */ jsxs21("div", { className: cn("relative", className), ref: containerRef, children: [
|
|
4228
|
-
/* @__PURE__ */ jsxs21(PopoverPrimitive.Root, { open: dropdownVisible, onOpenChange: handleOpenChange, modal: false, children: [
|
|
4229
|
-
/* @__PURE__ */ jsx25(PopoverPrimitive.Anchor, { asChild: true, children: /* @__PURE__ */ jsxs21(
|
|
4230
|
-
"div",
|
|
4231
|
-
{
|
|
4232
|
-
className: cn(
|
|
4233
|
-
containerStyles,
|
|
4234
|
-
"hover:bg-ods-bg-hover hover:border-ods-border-hover active:bg-ods-bg-active active:border-ods-border-active",
|
|
4235
|
-
dropdownVisible && "!border-ods-accent"
|
|
4236
|
-
),
|
|
4237
|
-
onClick: () => {
|
|
4238
|
-
inputRef.current?.focus();
|
|
4239
|
-
setIsOpen(true);
|
|
4240
|
-
},
|
|
4241
|
-
children: [
|
|
4242
|
-
/* @__PURE__ */ jsx25("span", { className: "flex-shrink-0 text-ods-text-secondary transition-colors duration-200 group-has-[:focus]:text-ods-accent [&_svg]:size-4 md:[&_svg]:size-6", children: startAdornment !== void 0 ? startAdornment : /* @__PURE__ */ jsx25(SearchIcon, {}) }),
|
|
4243
|
-
/* @__PURE__ */ jsxs21("div", { ref: middleRef, className: "flex-1 flex items-center gap-2 min-w-0 overflow-hidden", children: [
|
|
4244
|
-
visibleChips.map((chip) => /* @__PURE__ */ jsx25(
|
|
4245
|
-
Tag,
|
|
4246
|
-
{
|
|
4247
|
-
variant: chipVariantToTagVariant(chip.variant),
|
|
4248
|
-
label: chip.label,
|
|
4249
|
-
labelClassName: "truncate max-w-[120px]",
|
|
4250
|
-
onClose: onFilterRemove ? () => onFilterRemove(chip.id) : void 0
|
|
4251
|
-
},
|
|
4252
|
-
chip.id
|
|
4253
|
-
)),
|
|
4254
|
-
hiddenCount > 0 && /* @__PURE__ */ jsx25("div", { ref: hiddenTagsRef, className: "shrink-0", children: /* @__PURE__ */ jsx25(
|
|
4255
|
-
"button",
|
|
4256
|
-
{
|
|
4257
|
-
ref: badgeRef,
|
|
4258
|
-
type: "button",
|
|
4259
|
-
onClick: (e) => {
|
|
4260
|
-
e.stopPropagation();
|
|
4261
|
-
setShowHiddenTags((prev) => !prev);
|
|
4262
|
-
},
|
|
4263
|
-
className: cn(
|
|
4264
|
-
"flex items-center h-8 px-2",
|
|
4265
|
-
"bg-ods-card border border-ods-border rounded-[6px]",
|
|
4266
|
-
"font-mono text-[14px] font-medium leading-5 text-ods-text-secondary uppercase tracking-[-0.28px]",
|
|
4267
|
-
"hover:bg-ods-bg-hover transition-colors cursor-pointer"
|
|
4268
|
-
),
|
|
4269
|
-
"aria-label": `${hiddenCount} more selected filters`,
|
|
4270
|
-
children: getLimitTagsText(hiddenCount)
|
|
4271
|
-
}
|
|
4272
|
-
) }),
|
|
4273
|
-
/* @__PURE__ */ jsx25(
|
|
4274
|
-
"input",
|
|
4275
|
-
{
|
|
4276
|
-
ref: inputRef,
|
|
4277
|
-
type: "text",
|
|
4278
|
-
value: currentValue,
|
|
4279
|
-
onChange: handleChange,
|
|
4280
|
-
onKeyDown: handleKeyDown,
|
|
4281
|
-
onFocus: () => {
|
|
4282
|
-
setIsOpen(true);
|
|
4283
|
-
setShowHiddenTags(false);
|
|
4284
|
-
},
|
|
4285
|
-
placeholder: currentPlaceholder,
|
|
4286
|
-
className: innerInputStyles
|
|
4287
|
-
}
|
|
4288
|
-
)
|
|
4289
|
-
] }),
|
|
4290
|
-
/* @__PURE__ */ jsxs21("div", { className: "flex items-center gap-1 shrink-0 ml-auto", children: [
|
|
4291
|
-
hasValue && /* @__PURE__ */ jsx25(
|
|
4292
|
-
"button",
|
|
4293
|
-
{
|
|
4294
|
-
type: "button",
|
|
4295
|
-
onClick: handleClear,
|
|
4296
|
-
className: "flex items-center justify-center hover:opacity-70 transition-opacity",
|
|
4297
|
-
"aria-label": "Clear search",
|
|
4298
|
-
children: /* @__PURE__ */ jsx25(XmarkCircleIcon, { className: "text-ods-text-secondary", size: 24 })
|
|
4299
|
-
}
|
|
4300
|
-
),
|
|
4301
|
-
endAdornment
|
|
4302
|
-
] })
|
|
4303
|
-
]
|
|
4304
|
-
}
|
|
4305
|
-
) }),
|
|
4306
|
-
/* @__PURE__ */ jsx25(
|
|
4307
|
-
PopoverPrimitive.Content,
|
|
4308
|
-
{
|
|
4309
|
-
className: cn(
|
|
4310
|
-
"z-50 w-[var(--radix-popover-trigger-width)] mt-1",
|
|
4311
|
-
"bg-ods-card border border-ods-border rounded-[6px] overflow-hidden shadow-lg",
|
|
4312
|
-
"data-[state=open]:animate-in data-[state=closed]:animate-out",
|
|
4313
|
-
"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
4314
|
-
"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
|
|
4315
|
-
"data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2",
|
|
4316
|
-
dropdownClassName
|
|
4317
|
-
),
|
|
4318
|
-
sideOffset: 4,
|
|
4319
|
-
align: "start",
|
|
4320
|
-
onOpenAutoFocus: (e) => {
|
|
4321
|
-
e.preventDefault();
|
|
4322
|
-
inputRef.current?.focus();
|
|
4323
|
-
},
|
|
4324
|
-
onInteractOutside: (e) => {
|
|
4325
|
-
if (containerRef.current?.contains(e.target)) {
|
|
4326
|
-
e.preventDefault();
|
|
4327
|
-
}
|
|
4328
|
-
},
|
|
4329
|
-
children: /* @__PURE__ */ jsxs21(ScrollAreaPrimitive.Root, { className: "overflow-hidden", children: [
|
|
4330
|
-
/* @__PURE__ */ jsx25(ScrollAreaPrimitive.Viewport, { className: "max-h-[320px] w-full", children: /* @__PURE__ */ jsx25("div", { role: "listbox", children: renderDropdownContent() }) }),
|
|
4331
|
-
/* @__PURE__ */ jsx25(ScrollAreaPrimitive.Scrollbar, { className: "hidden", orientation: "vertical", children: /* @__PURE__ */ jsx25(ScrollAreaPrimitive.Thumb, {}) })
|
|
4332
|
-
] })
|
|
4333
|
-
}
|
|
4334
|
-
)
|
|
4335
|
-
] }),
|
|
4336
|
-
showHiddenTags && hiddenCount > 0 && /* @__PURE__ */ jsx25(
|
|
4337
|
-
HiddenTagsPopup,
|
|
4338
|
-
{
|
|
4339
|
-
ref: hiddenTagsPopupRef,
|
|
4340
|
-
items: hiddenChips.map((chip) => ({ label: chip.label, value: chip.id })),
|
|
4341
|
-
style: {
|
|
4342
|
-
left: badgeRef.current ? badgeRef.current.getBoundingClientRect().left - (containerRef.current?.getBoundingClientRect().left ?? 0) : 0
|
|
4343
|
-
},
|
|
4344
|
-
onRemove: (value2) => {
|
|
4345
|
-
onFilterRemove?.(value2);
|
|
4346
|
-
if (hiddenCount <= 1) setShowHiddenTags(false);
|
|
4347
|
-
}
|
|
4348
|
-
}
|
|
4349
|
-
),
|
|
4350
|
-
/* @__PURE__ */ jsx25(
|
|
4351
|
-
"span",
|
|
4352
|
-
{
|
|
4353
|
-
ref: textMeasureRef,
|
|
4354
|
-
"aria-hidden": "true",
|
|
4355
|
-
className: "fixed -left-[9999px] top-0 pointer-events-none whitespace-nowrap text-ods-text-primary",
|
|
4356
|
-
children: currentPlaceholder
|
|
4357
|
-
}
|
|
4358
|
-
),
|
|
4359
|
-
/* @__PURE__ */ jsx25(
|
|
4360
|
-
"div",
|
|
4361
|
-
{
|
|
4362
|
-
ref: measureRef,
|
|
4363
|
-
"aria-hidden": "true",
|
|
4364
|
-
className: "fixed -left-[9999px] top-0 flex gap-2 pointer-events-none",
|
|
4365
|
-
children: filterChips.map((chip) => /* @__PURE__ */ jsx25(
|
|
4366
|
-
Tag,
|
|
4367
|
-
{
|
|
4368
|
-
variant: chipVariantToTagVariant(chip.variant),
|
|
4369
|
-
label: chip.label,
|
|
4370
|
-
labelClassName: "truncate max-w-[120px]",
|
|
4371
|
-
onClose: () => {
|
|
4372
|
-
}
|
|
4373
|
-
},
|
|
4374
|
-
`m-${chip.id}`
|
|
4375
|
-
))
|
|
4376
|
-
}
|
|
4377
|
-
)
|
|
4378
|
-
] });
|
|
4379
|
-
}
|
|
4380
|
-
|
|
4381
2903
|
// src/components/ui/filter-pill-row.tsx
|
|
4382
2904
|
init_button();
|
|
4383
2905
|
import { Filter } from "lucide-react";
|
|
4384
|
-
import { jsx as
|
|
2906
|
+
import { jsx as jsx22, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
4385
2907
|
function FilterPillRow({
|
|
4386
2908
|
label,
|
|
4387
2909
|
selectedValue,
|
|
@@ -4390,12 +2912,12 @@ function FilterPillRow({
|
|
|
4390
2912
|
countLabel,
|
|
4391
2913
|
children
|
|
4392
2914
|
}) {
|
|
4393
|
-
return /* @__PURE__ */
|
|
4394
|
-
/* @__PURE__ */
|
|
4395
|
-
/* @__PURE__ */
|
|
4396
|
-
/* @__PURE__ */
|
|
2915
|
+
return /* @__PURE__ */ jsxs18("div", { className: "flex flex-wrap items-center gap-3 p-4 bg-ods-card border border-ods-border rounded-lg", children: [
|
|
2916
|
+
/* @__PURE__ */ jsxs18("div", { className: "flex items-center gap-2", children: [
|
|
2917
|
+
/* @__PURE__ */ jsx22(Filter, { className: "h-4 w-4 text-ods-accent" }),
|
|
2918
|
+
/* @__PURE__ */ jsx22("span", { className: "text-h5 text-ods-text-secondary", children: label })
|
|
4397
2919
|
] }),
|
|
4398
|
-
children || options.map((opt) => /* @__PURE__ */
|
|
2920
|
+
children || options.map((opt) => /* @__PURE__ */ jsx22(
|
|
4399
2921
|
Button,
|
|
4400
2922
|
{
|
|
4401
2923
|
type: "button",
|
|
@@ -4407,14 +2929,11 @@ function FilterPillRow({
|
|
|
4407
2929
|
},
|
|
4408
2930
|
opt.value
|
|
4409
2931
|
)),
|
|
4410
|
-
countLabel && /* @__PURE__ */
|
|
2932
|
+
countLabel && /* @__PURE__ */ jsx22("div", { className: "ml-auto text-[12px] font-['DM_Sans'] text-ods-text-secondary shrink-0", children: countLabel })
|
|
4411
2933
|
] });
|
|
4412
2934
|
}
|
|
4413
2935
|
|
|
4414
2936
|
export {
|
|
4415
|
-
HiddenTagsPopup,
|
|
4416
|
-
tagVariants,
|
|
4417
|
-
Tag,
|
|
4418
2937
|
Card,
|
|
4419
2938
|
CardHeader,
|
|
4420
2939
|
CardTitle,
|
|
@@ -4429,65 +2948,20 @@ export {
|
|
|
4429
2948
|
statusBadgeVariants,
|
|
4430
2949
|
StatusBadge,
|
|
4431
2950
|
SimpleMarkdownRenderer,
|
|
4432
|
-
formatDate,
|
|
4433
|
-
formatNumber,
|
|
4434
|
-
formatPrice,
|
|
4435
|
-
formatBytes,
|
|
4436
|
-
formatBytesShort,
|
|
4437
|
-
formatLargeNumber,
|
|
4438
|
-
formatAbbreviatedNumber,
|
|
4439
|
-
getFirstLastInitials,
|
|
4440
|
-
nameInitials,
|
|
4441
|
-
formatDurationMMSS,
|
|
4442
|
-
formatDurationCompact,
|
|
4443
|
-
formatTimeWithTimezone,
|
|
4444
|
-
formatDurationFromRange,
|
|
4445
|
-
formatDateUTC,
|
|
4446
|
-
formatEntryMonthUTC,
|
|
4447
|
-
formatLegalDate,
|
|
4448
|
-
formatCurrency,
|
|
4449
|
-
formatPercent,
|
|
4450
|
-
formatWholeDollars,
|
|
4451
|
-
formatCompactMetric,
|
|
4452
|
-
getTrendColors,
|
|
4453
|
-
formatDateRange,
|
|
4454
|
-
formatDateTimeAt,
|
|
4455
|
-
formatDurationFromMs,
|
|
4456
|
-
formatDuration,
|
|
4457
|
-
formatUnderscoreText,
|
|
4458
|
-
stripHtml,
|
|
4459
|
-
formatClassification,
|
|
4460
|
-
formatPricingModel,
|
|
4461
|
-
formatBioText,
|
|
4462
2951
|
SquareAvatar,
|
|
4463
2952
|
useControllableState,
|
|
4464
2953
|
ActionsMenu,
|
|
4465
2954
|
ActionsMenuDropdown,
|
|
4466
|
-
getProxiedImageUrl,
|
|
4467
|
-
urlPathLooksLikeSvg,
|
|
4468
|
-
shouldProxyImage,
|
|
4469
|
-
generateImageSizes,
|
|
4470
|
-
isCrossOriginUrl,
|
|
4471
|
-
decideNewTab,
|
|
4472
2955
|
computeIsNewTab,
|
|
4473
2956
|
newTabAnchorAttrs,
|
|
4474
2957
|
buildAnchorProps,
|
|
4475
|
-
NEW_TAB_FEATURES,
|
|
4476
|
-
isModifierClick,
|
|
4477
|
-
stripSameOriginToPath,
|
|
4478
|
-
resolveHrefForRuntime,
|
|
4479
|
-
resolveExternalNavigation,
|
|
4480
2958
|
EMPTY_AUTHOR_PLACEHOLDER,
|
|
4481
2959
|
EntityMetadataValueCell,
|
|
4482
2960
|
EntityMetadataAuthorCell,
|
|
4483
2961
|
EntityAuthorCard,
|
|
4484
2962
|
BlogImagePlaceholder,
|
|
4485
|
-
fetchPriorityProp,
|
|
4486
2963
|
extractYouTubeId,
|
|
4487
2964
|
Video,
|
|
4488
|
-
PAGE_HEADING_CLASS,
|
|
4489
|
-
SECTION_HEADING_CLASS,
|
|
4490
|
-
PageHeading,
|
|
4491
2965
|
RATIO_GRID_CLASS,
|
|
4492
2966
|
RATIO_DISPLAY_GRID_CLASS,
|
|
4493
2967
|
RatioTabs,
|
|
@@ -4499,36 +2973,8 @@ export {
|
|
|
4499
2973
|
EntityVideoSection,
|
|
4500
2974
|
useEntityCardLink,
|
|
4501
2975
|
useEntityCardPlaceholder,
|
|
4502
|
-
COMPACT_CARD_OUTER,
|
|
4503
|
-
COMPACT_CARD_OUTER_STATIC,
|
|
4504
|
-
COMPACT_CARD_SKELETON_OUTER,
|
|
4505
|
-
COMPACT_CARD_IMAGE_SLOT,
|
|
4506
|
-
COMPACT_CARD_SKELETON_IMAGE_SLOT,
|
|
4507
|
-
COMPACT_CARD_ICON_SLOT,
|
|
4508
|
-
COMPACT_CARD_TEXT_COL,
|
|
4509
|
-
COMPACT_CARD_TITLE_ROW,
|
|
4510
|
-
COMPACT_CARD_META_ROW_BOX,
|
|
4511
|
-
COMPACT_CARD_TITLE,
|
|
4512
|
-
COMPACT_CARD_SUBTITLE,
|
|
4513
|
-
COMPACT_CARD_SUMMARY,
|
|
4514
|
-
COMPACT_CARD_META_ROW,
|
|
4515
|
-
COMPACT_CARD_ROW_FILLER,
|
|
4516
|
-
safeHref,
|
|
4517
2976
|
OnboardingGuideCardSkeleton,
|
|
4518
2977
|
OnboardingGuideCard,
|
|
4519
|
-
SOURCE_ICON_NAMES,
|
|
4520
|
-
getSourceIconName,
|
|
4521
|
-
SOURCE_LABELS_BY_TABLE,
|
|
4522
|
-
getSourceLabel,
|
|
4523
|
-
DEFAULT_DOCUMENT_TYPE_TO_TABLE_ID,
|
|
4524
|
-
defaultTableIdForDocumentType,
|
|
4525
|
-
ICON_REGISTRY,
|
|
4526
|
-
normalizeIconKey,
|
|
4527
|
-
getIconComponent,
|
|
4528
|
-
getDynamicIcon,
|
|
4529
|
-
sourceRowCtxFromRuntime,
|
|
4530
|
-
resolveSourceRowCTA,
|
|
4531
|
-
resolveSourceIcon,
|
|
4532
2978
|
PageActions,
|
|
4533
2979
|
usePageActionsBottomPadding,
|
|
4534
2980
|
BackButton,
|
|
@@ -4537,10 +2983,6 @@ export {
|
|
|
4537
2983
|
PageLayout,
|
|
4538
2984
|
PageShell,
|
|
4539
2985
|
ArticleDetailLayout,
|
|
4540
|
-
DEFAULT_CONTENT_SUFFIXES,
|
|
4541
|
-
makeComposeContentUrl,
|
|
4542
|
-
buildDefaultHref,
|
|
4543
|
-
resolveContentHref,
|
|
4544
2986
|
ErrorState,
|
|
4545
2987
|
PageError,
|
|
4546
2988
|
LoadError,
|
|
@@ -4552,7 +2994,6 @@ export {
|
|
|
4552
2994
|
useVideoOriginPreconnect,
|
|
4553
2995
|
useVideoWarmup,
|
|
4554
2996
|
getCaptionsUrl,
|
|
4555
|
-
SearchInput,
|
|
4556
2997
|
FilterPillRow
|
|
4557
2998
|
};
|
|
4558
|
-
//# sourceMappingURL=chunk-
|
|
2999
|
+
//# sourceMappingURL=chunk-R2KT5GDD.js.map
|