@opengeni/react 3.7.0-canary.3 → 3.7.0-canary.4

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.
@@ -0,0 +1,220 @@
1
+ import {
2
+ BillingClassMark,
3
+ PickerNavRow,
4
+ defaultModelPolicyPickerMessages,
5
+ effectiveRows
6
+ } from "./chunk-JT33KZZN.js";
7
+ import {
8
+ coerceReasoningEffortForModel,
9
+ effortOptionsForModel,
10
+ findPickerRow,
11
+ groupPickerRowsByBillingClass,
12
+ labelReasoningEffort,
13
+ payerSummaryForModel,
14
+ runnableLatencyModesForModel
15
+ } from "./chunk-WMGF4Z7X.js";
16
+ import {
17
+ cn
18
+ } from "./chunk-22KP6LR5.js";
19
+
20
+ // src/components/model-policy-picker-menu.tsx
21
+ import { CheckIcon, SearchIcon, ZapIcon } from "lucide-react";
22
+ import { useRef, useState } from "react";
23
+ import { Popover } from "radix-ui";
24
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
25
+ function ModelPolicyPickerMenu(props) {
26
+ const messages = { ...defaultModelPolicyPickerMessages, ...props.messages };
27
+ const [query, setQuery] = useState("");
28
+ const rows = effectiveRows(props);
29
+ const selected = findPickerRow(rows, props.model);
30
+ const words = query.toLowerCase().trim().split(/\s+/).filter(Boolean);
31
+ const filtered = rows.filter((row) => {
32
+ const text = `${row.label} ${row.id} ${row.providerLabel} ${row.billingClassLabel} ${payerSummaryForModel(row.catalog)}`.toLowerCase();
33
+ return words.every((word) => text.includes(word));
34
+ });
35
+ const groups = groupPickerRowsByBillingClass(filtered).map((group) => ({
36
+ ...group,
37
+ rows: group.rows.filter((row) => words.length > 0 || row.id !== selected?.id)
38
+ })).filter((group) => group.rows.length > 0);
39
+ const choose = (row) => {
40
+ if (!row.selectable || props.disabled) return;
41
+ if (row.id !== props.model) props.onModelChange(row.id);
42
+ const effort = coerceReasoningEffortForModel(row.catalog, props.effort);
43
+ props.onEffortChange(effort);
44
+ if (props.latencyMode !== "standard" && !runnableLatencyModesForModel(row.catalog).includes(props.latencyMode)) {
45
+ props.onLatencyModeChange("standard");
46
+ }
47
+ props.onOpenChange?.(false);
48
+ };
49
+ const modelRow = (row) => /* @__PURE__ */ jsx(
50
+ PickerNavRow,
51
+ {
52
+ label: row.label,
53
+ hint: `${props.messages?.billingHints?.[row.billingClass] ?? payerSummaryForModel(row.catalog)}${row.unavailableReason ? ` \xB7 ${row.unavailableReason}` : ""}`,
54
+ disabled: props.disabled || !row.selectable,
55
+ title: row.unavailableReason ?? void 0,
56
+ active: row.id === props.model,
57
+ showChevron: false,
58
+ trailing: row.id === props.model ? /* @__PURE__ */ jsx(CheckIcon, { className: "size-3.5", "aria-label": messages.selected }) : null,
59
+ testId: `model-picker-choice-${row.id}`,
60
+ onClick: () => choose(row)
61
+ },
62
+ row.id
63
+ );
64
+ return /* @__PURE__ */ jsxs(
65
+ "div",
66
+ {
67
+ "data-testid": "model-picker-menu",
68
+ className: "flex min-h-0 flex-col",
69
+ onKeyDown: (event) => {
70
+ if (!(event.target instanceof HTMLButtonElement) || !["ArrowDown", "ArrowUp", "Home", "End"].includes(event.key))
71
+ return;
72
+ const buttons = Array.from(
73
+ event.currentTarget.querySelectorAll(
74
+ '[data-testid^="model-picker-choice-"]:not(:disabled)'
75
+ )
76
+ );
77
+ const index = buttons.indexOf(event.target);
78
+ if (index < 0) return;
79
+ event.preventDefault();
80
+ const next = event.key === "Home" ? 0 : event.key === "End" ? buttons.length - 1 : (index + (event.key === "ArrowDown" ? 1 : -1) + buttons.length) % buttons.length;
81
+ buttons[next]?.focus();
82
+ },
83
+ children: [
84
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 border-b border-og-border px-2 py-2", children: [
85
+ /* @__PURE__ */ jsx(SearchIcon, { className: "size-4 shrink-0 text-og-fg-subtle", "aria-hidden": true }),
86
+ /* @__PURE__ */ jsx(
87
+ "input",
88
+ {
89
+ "aria-label": messages.searchLabel,
90
+ placeholder: messages.searchPlaceholder,
91
+ value: query,
92
+ onChange: (event) => setQuery(event.target.value),
93
+ onKeyDown: (event) => {
94
+ if (event.key !== "Escape" && event.key !== "Tab") event.stopPropagation();
95
+ if (event.key === "ArrowDown") {
96
+ event.preventDefault();
97
+ event.currentTarget.closest('[data-testid="model-picker-menu"]')?.querySelector("button:not(:disabled)")?.focus();
98
+ }
99
+ },
100
+ className: "h-8 min-w-0 flex-1 bg-transparent text-og-menu text-og-fg outline-hidden placeholder:text-og-fg-subtle"
101
+ }
102
+ )
103
+ ] }),
104
+ props.error ? /* @__PURE__ */ jsx("p", { className: "px-2 py-2 text-og-control text-og-status-failed", role: "alert", children: props.error }) : null,
105
+ /* @__PURE__ */ jsx(
106
+ "div",
107
+ {
108
+ className: "min-h-0 flex-1 overflow-y-auto overscroll-contain py-1",
109
+ "data-testid": "model-picker-models",
110
+ children: props.loading ? /* @__PURE__ */ jsx("p", { className: "px-2 py-3 text-og-control text-og-fg-subtle", children: messages.loading }) : /* @__PURE__ */ jsxs(Fragment, { children: [
111
+ selected && words.length === 0 ? /* @__PURE__ */ jsxs("div", { className: "border-b border-og-border/60 pb-1 mb-1", children: [
112
+ /* @__PURE__ */ jsx("p", { className: "px-2.5 py-1.5 text-og-control text-og-fg-subtle", children: messages.currentModel }),
113
+ modelRow(selected)
114
+ ] }) : null,
115
+ groups.map((group) => /* @__PURE__ */ jsxs("section", { "aria-label": group.label, className: "py-1", children: [
116
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 px-2.5 py-1.5 text-og-control font-medium text-og-fg-subtle", children: [
117
+ /* @__PURE__ */ jsx(BillingClassMark, { billingClass: group.billingClass, "aria-label": "" }),
118
+ group.label
119
+ ] }),
120
+ group.rows.map(modelRow)
121
+ ] }, group.billingClass)),
122
+ filtered.length === 0 ? /* @__PURE__ */ jsx("p", { className: "px-2 py-4 text-og-control text-og-fg-subtle", children: words.length ? messages.noMatches : messages.noModels }) : null
123
+ ] })
124
+ }
125
+ ),
126
+ selected ? /* @__PURE__ */ jsxs("div", { className: "border-t border-og-border px-2 py-2", children: [
127
+ selected.catalog.capabilities?.inputModalities.includes("image") === false ? /* @__PURE__ */ jsx("p", { className: "pb-1.5 text-og-control leading-relaxed text-og-fg-subtle", children: messages.unsupportedAttachments }) : null,
128
+ /* @__PURE__ */ jsx(ModelThinkingControls, { ...props })
129
+ ] }) : null
130
+ ]
131
+ }
132
+ );
133
+ }
134
+ function ModelThinkingControls(props) {
135
+ const selected = findPickerRow(effectiveRows(props), props.model);
136
+ if (!selected) return null;
137
+ const efforts = effortOptionsForModel(selected.catalog);
138
+ const messages = { ...defaultModelPolicyPickerMessages, ...props.messages };
139
+ const supportsFast = runnableLatencyModesForModel(selected.catalog).includes("fast");
140
+ return /* @__PURE__ */ jsxs(
141
+ "div",
142
+ {
143
+ className: "flex items-center gap-2 text-og-control text-og-fg-muted",
144
+ "data-testid": "model-picker-reasoning",
145
+ children: [
146
+ /* @__PURE__ */ jsxs("label", { className: "flex min-h-9 items-center gap-2", children: [
147
+ messages.thinking,
148
+ /* @__PURE__ */ jsx(
149
+ "select",
150
+ {
151
+ "aria-label": messages.thinkingEffort,
152
+ value: coerceReasoningEffortForModel(selected.catalog, props.effort),
153
+ disabled: props.disabled || !selected.selectable || efforts.length < 2,
154
+ onChange: (event) => props.onEffortChange(event.target.value),
155
+ className: "rounded-og-sm bg-og-surface-2 px-2 py-1.5 text-og-fg outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent/40 disabled:opacity-50",
156
+ children: efforts.map((effort) => /* @__PURE__ */ jsx("option", { value: effort, children: labelReasoningEffort(effort) }, effort))
157
+ }
158
+ )
159
+ ] }),
160
+ supportsFast && props.allowLatencyMode !== false ? /* @__PURE__ */ jsxs(
161
+ "button",
162
+ {
163
+ type: "button",
164
+ "data-testid": "model-picker-fast",
165
+ disabled: props.disabled || !selected.selectable,
166
+ "aria-pressed": props.latencyMode === "fast",
167
+ title: `${messages.fast} \xB7 ${messages.fastRateHint}`,
168
+ onClick: () => props.onLatencyModeChange(props.latencyMode === "fast" ? "standard" : "fast"),
169
+ className: "ml-auto flex min-h-9 items-center gap-1.5 rounded-og-sm px-2 hover:bg-og-surface-2 focus-visible:ring-2 focus-visible:ring-og-accent/40 disabled:opacity-50",
170
+ children: [
171
+ /* @__PURE__ */ jsx(ZapIcon, { className: cn("size-3.5", props.latencyMode === "fast" && "fill-current") }),
172
+ messages.fast,
173
+ " ",
174
+ /* @__PURE__ */ jsx("span", { className: "text-og-fg-subtle", children: messages.fastRateHint })
175
+ ]
176
+ }
177
+ ) : null
178
+ ]
179
+ }
180
+ );
181
+ }
182
+ function ModelPolicyPickerPopover(props) {
183
+ const outside = useRef(false);
184
+ const messages = { ...defaultModelPolicyPickerMessages, ...props.messages };
185
+ return /* @__PURE__ */ jsxs(Popover.Root, { open: true, onOpenChange: (open) => props.onOpenChange?.(open), children: [
186
+ /* @__PURE__ */ jsx(Popover.Anchor, { virtualRef: props.anchor }),
187
+ /* @__PURE__ */ jsx(Popover.Portal, { children: /* @__PURE__ */ jsx(
188
+ Popover.Content,
189
+ {
190
+ id: props.contentId,
191
+ "aria-label": messages.label,
192
+ align: "start",
193
+ side: props.menuSide ?? "bottom",
194
+ sideOffset: 8,
195
+ collisionPadding: 12,
196
+ onInteractOutside: (event) => {
197
+ if (props.anchor.current?.contains(event.target)) event.preventDefault();
198
+ else outside.current = true;
199
+ },
200
+ onCloseAutoFocus: (event) => {
201
+ event.preventDefault();
202
+ if (!outside.current) props.anchor.current?.focus();
203
+ },
204
+ className: cn(
205
+ "og-root og-model-policy-menu z-50 flex max-h-[min(32rem,var(--radix-popover-content-available-height))] w-[22rem] max-w-[calc(100vw-16px)] flex-col overflow-hidden rounded-og-lg border border-og-border bg-og-surface-1 p-[var(--og-model-picker-menu-padding)] text-og-fg shadow-og-lg",
206
+ props.contentClassName
207
+ ),
208
+ style: { ...props.portalStyle, ...props.contentStyle },
209
+ "data-testid": "model-picker-content",
210
+ children: /* @__PURE__ */ jsx(ModelPolicyPickerMenu, { ...props })
211
+ }
212
+ ) })
213
+ ] });
214
+ }
215
+
216
+ export {
217
+ ModelPolicyPickerMenu,
218
+ ModelPolicyPickerPopover
219
+ };
220
+ //# sourceMappingURL=chunk-KWEZ4MPF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/model-policy-picker-menu.tsx"],"sourcesContent":["import type { ClientModel, ReasoningEffort } from \"@opengeni/sdk\";\nimport { CheckIcon, SearchIcon, ZapIcon } from \"lucide-react\";\nimport { useRef, useState, type RefObject, type CSSProperties } from \"react\";\nimport { Popover } from \"radix-ui\";\nimport { cn } from \"../lib/cn\";\nimport {\n coerceReasoningEffortForModel,\n effortOptionsForModel,\n findPickerRow,\n groupPickerRowsByBillingClass,\n labelReasoningEffort,\n payerSummaryForModel,\n runnableLatencyModesForModel,\n type PickerModelRow,\n} from \"../model-policy\";\nimport {\n BillingClassMark,\n defaultModelPolicyPickerMessages,\n effectiveRows,\n PickerNavRow,\n type ModelPolicyPickerProps,\n} from \"./model-policy-picker\";\ntype ClientPickerModelRow = PickerModelRow<ClientModel>;\n\n/** Model selection stays flat; reasoning never becomes a navigation destination. */\nexport function ModelPolicyPickerMenu(props: ModelPolicyPickerProps) {\n const messages = { ...defaultModelPolicyPickerMessages, ...props.messages };\n const [query, setQuery] = useState(\"\");\n const rows = effectiveRows(props);\n const selected = findPickerRow(rows, props.model);\n const words = query.toLowerCase().trim().split(/\\s+/).filter(Boolean);\n const filtered = rows.filter((row) => {\n const text =\n `${row.label} ${row.id} ${row.providerLabel} ${row.billingClassLabel} ${payerSummaryForModel(row.catalog)}`.toLowerCase();\n return words.every((word) => text.includes(word));\n });\n const groups = groupPickerRowsByBillingClass(filtered)\n .map((group) => ({\n ...group,\n rows: group.rows.filter((row) => words.length > 0 || row.id !== selected?.id),\n }))\n .filter((group) => group.rows.length > 0);\n const choose = (row: ClientPickerModelRow) => {\n if (!row.selectable || props.disabled) return;\n if (row.id !== props.model) props.onModelChange(row.id);\n const effort = coerceReasoningEffortForModel(row.catalog, props.effort);\n // Hosts may commit the combined model/effort draft through this callback.\n props.onEffortChange(effort);\n if (\n props.latencyMode !== \"standard\" &&\n !runnableLatencyModesForModel(row.catalog).includes(props.latencyMode)\n ) {\n props.onLatencyModeChange(\"standard\");\n }\n props.onOpenChange?.(false);\n };\n const modelRow = (row: ClientPickerModelRow) => (\n <PickerNavRow\n key={row.id}\n label={row.label}\n hint={`${props.messages?.billingHints?.[row.billingClass] ?? payerSummaryForModel(row.catalog)}${row.unavailableReason ? ` · ${row.unavailableReason}` : \"\"}`}\n disabled={props.disabled || !row.selectable}\n title={row.unavailableReason ?? undefined}\n active={row.id === props.model}\n showChevron={false}\n trailing={\n row.id === props.model ? (\n <CheckIcon className=\"size-3.5\" aria-label={messages.selected} />\n ) : null\n }\n testId={`model-picker-choice-${row.id}`}\n onClick={() => choose(row)}\n />\n );\n return (\n <div\n data-testid=\"model-picker-menu\"\n className=\"flex min-h-0 flex-col\"\n onKeyDown={(event) => {\n if (\n !(event.target instanceof HTMLButtonElement) ||\n ![\"ArrowDown\", \"ArrowUp\", \"Home\", \"End\"].includes(event.key)\n )\n return;\n const buttons = Array.from(\n event.currentTarget.querySelectorAll<HTMLButtonElement>(\n '[data-testid^=\"model-picker-choice-\"]:not(:disabled)',\n ),\n );\n const index = buttons.indexOf(event.target);\n if (index < 0) return;\n event.preventDefault();\n const next =\n event.key === \"Home\"\n ? 0\n : event.key === \"End\"\n ? buttons.length - 1\n : (index + (event.key === \"ArrowDown\" ? 1 : -1) + buttons.length) % buttons.length;\n buttons[next]?.focus();\n }}\n >\n <div className=\"flex items-center gap-2 border-b border-og-border px-2 py-2\">\n <SearchIcon className=\"size-4 shrink-0 text-og-fg-subtle\" aria-hidden />\n <input\n aria-label={messages.searchLabel}\n placeholder={messages.searchPlaceholder}\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={(event) => {\n if (event.key !== \"Escape\" && event.key !== \"Tab\") event.stopPropagation();\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n event.currentTarget\n .closest('[data-testid=\"model-picker-menu\"]')\n ?.querySelector<HTMLButtonElement>(\"button:not(:disabled)\")\n ?.focus();\n }\n }}\n className=\"h-8 min-w-0 flex-1 bg-transparent text-og-menu text-og-fg outline-hidden placeholder:text-og-fg-subtle\"\n />\n </div>\n {props.error ? (\n <p className=\"px-2 py-2 text-og-control text-og-status-failed\" role=\"alert\">\n {props.error}\n </p>\n ) : null}\n <div\n className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain py-1\"\n data-testid=\"model-picker-models\"\n >\n {props.loading ? (\n <p className=\"px-2 py-3 text-og-control text-og-fg-subtle\">{messages.loading}</p>\n ) : (\n <>\n {selected && words.length === 0 ? (\n <div className=\"border-b border-og-border/60 pb-1 mb-1\">\n <p className=\"px-2.5 py-1.5 text-og-control text-og-fg-subtle\">\n {messages.currentModel}\n </p>\n {modelRow(selected)}\n </div>\n ) : null}\n {groups.map((group) => (\n <section key={group.billingClass} aria-label={group.label} className=\"py-1\">\n <div className=\"flex items-center gap-2 px-2.5 py-1.5 text-og-control font-medium text-og-fg-subtle\">\n <BillingClassMark billingClass={group.billingClass} aria-label=\"\" />\n {group.label}\n </div>\n {group.rows.map(modelRow)}\n </section>\n ))}\n {filtered.length === 0 ? (\n <p className=\"px-2 py-4 text-og-control text-og-fg-subtle\">\n {words.length ? messages.noMatches : messages.noModels}\n </p>\n ) : null}\n </>\n )}\n </div>\n {selected ? (\n <div className=\"border-t border-og-border px-2 py-2\">\n {selected.catalog.capabilities?.inputModalities.includes(\"image\") === false ? (\n <p className=\"pb-1.5 text-og-control leading-relaxed text-og-fg-subtle\">\n {messages.unsupportedAttachments}\n </p>\n ) : null}\n <ModelThinkingControls {...props} />\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction ModelThinkingControls(props: ModelPolicyPickerProps) {\n const selected = findPickerRow(effectiveRows(props), props.model);\n if (!selected) return null;\n const efforts = effortOptionsForModel(selected.catalog);\n const messages = { ...defaultModelPolicyPickerMessages, ...props.messages };\n const supportsFast = runnableLatencyModesForModel(selected.catalog).includes(\"fast\");\n return (\n <div\n className=\"flex items-center gap-2 text-og-control text-og-fg-muted\"\n data-testid=\"model-picker-reasoning\"\n >\n <label className=\"flex min-h-9 items-center gap-2\">\n {messages.thinking}\n <select\n aria-label={messages.thinkingEffort}\n value={coerceReasoningEffortForModel(selected.catalog, props.effort)}\n disabled={props.disabled || !selected.selectable || efforts.length < 2}\n onChange={(event) => props.onEffortChange(event.target.value as ReasoningEffort)}\n className=\"rounded-og-sm bg-og-surface-2 px-2 py-1.5 text-og-fg outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent/40 disabled:opacity-50\"\n >\n {efforts.map((effort) => (\n <option key={effort} value={effort}>\n {labelReasoningEffort(effort)}\n </option>\n ))}\n </select>\n </label>\n {supportsFast && props.allowLatencyMode !== false ? (\n <button\n type=\"button\"\n data-testid=\"model-picker-fast\"\n disabled={props.disabled || !selected.selectable}\n aria-pressed={props.latencyMode === \"fast\"}\n title={`${messages.fast} · ${messages.fastRateHint}`}\n onClick={() =>\n props.onLatencyModeChange(props.latencyMode === \"fast\" ? \"standard\" : \"fast\")\n }\n className=\"ml-auto flex min-h-9 items-center gap-1.5 rounded-og-sm px-2 hover:bg-og-surface-2 focus-visible:ring-2 focus-visible:ring-og-accent/40 disabled:opacity-50\"\n >\n <ZapIcon className={cn(\"size-3.5\", props.latencyMode === \"fast\" && \"fill-current\")} />\n {messages.fast} <span className=\"text-og-fg-subtle\">{messages.fastRateHint}</span>\n </button>\n ) : null}\n </div>\n );\n}\n\nexport function ModelPolicyPickerPopover(\n props: ModelPolicyPickerProps & {\n anchor: RefObject<HTMLButtonElement | null>;\n contentId: string;\n portalStyle: CSSProperties;\n },\n) {\n const outside = useRef(false);\n const messages = { ...defaultModelPolicyPickerMessages, ...props.messages };\n return (\n <Popover.Root open onOpenChange={(open) => props.onOpenChange?.(open)}>\n <Popover.Anchor virtualRef={props.anchor} />\n <Popover.Portal>\n <Popover.Content\n id={props.contentId}\n aria-label={messages.label}\n align=\"start\"\n side={props.menuSide ?? \"bottom\"}\n sideOffset={8}\n collisionPadding={12}\n onInteractOutside={(event) => {\n if (props.anchor.current?.contains(event.target as Node)) event.preventDefault();\n else outside.current = true;\n }}\n onCloseAutoFocus={(event) => {\n event.preventDefault();\n if (!outside.current) props.anchor.current?.focus();\n }}\n className={cn(\n \"og-root og-model-policy-menu z-50 flex max-h-[min(32rem,var(--radix-popover-content-available-height))] w-[22rem] max-w-[calc(100vw-16px)] flex-col overflow-hidden rounded-og-lg border border-og-border bg-og-surface-1 p-[var(--og-model-picker-menu-padding)] text-og-fg shadow-og-lg\",\n props.contentClassName,\n )}\n style={{ ...props.portalStyle, ...props.contentStyle }}\n data-testid=\"model-picker-content\"\n >\n <ModelPolicyPickerMenu {...props} />\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n );\n}\n"],"mappings":"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","names":[]}
@@ -38,7 +38,7 @@ import {
38
38
  } from "./chunk-3IY6UZI6.js";
39
39
  import {
40
40
  ModelPolicyPicker
41
- } from "./chunk-4JFUT22W.js";
41
+ } from "./chunk-JT33KZZN.js";
42
42
  import {
43
43
  buildTimeline,
44
44
  groupTimeline,
@@ -9176,7 +9176,10 @@ function Conversation({
9176
9176
  return /* @__PURE__ */ jsxs14(
9177
9177
  "div",
9178
9178
  {
9179
- className: cn("og-root flex min-h-0 min-w-0 flex-col gap-2 overflow-hidden", className),
9179
+ className: cn(
9180
+ "og-root flex min-h-0 min-w-0 flex-col gap-2 overflow-hidden bg-og-bg text-og-fg",
9181
+ className
9182
+ ),
9180
9183
  ref: region,
9181
9184
  style: { height },
9182
9185
  "data-og-conversation": "",
@@ -10678,4 +10681,4 @@ export {
10678
10681
  SessionChrome,
10679
10682
  SessionCommandsPanel
10680
10683
  };
10681
- //# sourceMappingURL=chunk-2ZICNIGZ.js.map
10684
+ //# sourceMappingURL=chunk-LUYB4SRW.js.map