@reopt-ai/opt-ui 1.14.0 → 1.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/COMPONENT_CATALOG.md +222 -69
  3. package/README.md +26 -0
  4. package/dist/core/index.cjs +4 -4
  5. package/dist/core/index.d.cts +2 -2
  6. package/dist/core/index.d.ts +2 -2
  7. package/dist/core/index.js +2 -2
  8. package/dist/docs/02-components/01-core.md +37 -33
  9. package/dist/docs/02-components/02-visuals.md +1 -1
  10. package/dist/docs/02-components/03-shells.md +191 -36
  11. package/dist/docs/02-components/04-surfaces.md +1 -1
  12. package/dist/docs/02-components/index.md +4 -4
  13. package/dist/id-registry.cjs +24 -0
  14. package/dist/id-registry.js +24 -0
  15. package/dist/id-registry.json +51 -0
  16. package/dist/index.cjs +445 -381
  17. package/dist/index.d.cts +16 -13
  18. package/dist/index.d.ts +16 -13
  19. package/dist/index.js +303 -245
  20. package/dist/{key-pad-menu-CqFI6la9.js → key-pad-menu-BCOeYvsH.js} +50 -61
  21. package/dist/{key-pad-menu-D6pYzaj-.d.cts → key-pad-menu-CaIsTHB2.d.cts} +12 -8
  22. package/dist/{key-pad-menu-BgtSL3xe.cjs → key-pad-menu-Jaqxhx9P.cjs} +48 -71
  23. package/dist/{key-pad-menu-Yh7Fpb8m.d.ts → key-pad-menu-odAEycIX.d.ts} +12 -8
  24. package/dist/meta.cjs +447 -7
  25. package/dist/meta.js +447 -7
  26. package/dist/{field-sidebar-mSVCMAZp.js → replay-player-layout-BVUNsUS1.js} +891 -191
  27. package/dist/{field-sidebar-ePqFX6MN.cjs → replay-player-layout-Cmzptq89.cjs} +931 -189
  28. package/dist/{field-sidebar-CJ4HxP8D.d.cts → replay-player-layout-DpqdfdQ6.d.ts} +246 -3
  29. package/dist/{field-sidebar-DnhpcT2A.d.ts → replay-player-layout-DuZW-gFF.d.cts} +246 -3
  30. package/dist/shells/index.cjs +58 -52
  31. package/dist/shells/index.d.cts +2 -2
  32. package/dist/shells/index.d.ts +2 -2
  33. package/dist/shells/index.js +2 -2
  34. package/dist/{text-truncate-Bd-0WkSP.js → text-truncate-B-8nJgnu.js} +200 -101
  35. package/dist/{text-truncate-Bbul-jMD.d.cts → text-truncate-DOxUijpB.d.cts} +2 -0
  36. package/dist/{text-truncate-Bbul-jMD.d.ts → text-truncate-DOxUijpB.d.ts} +2 -0
  37. package/dist/{text-truncate-BeYW6XZu.cjs → text-truncate-gQhpMy-Z.cjs} +214 -97
  38. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use client";
2
- import { $ as useFormContext, $n as OPT_HOVER_ITEM, $t as CompositeItem, A as FormGroup, An as SkeletonText, At as AlertDialogPanel, B as FormRemove, Bn as OPT_BADGE_NEUTRAL, Bt as SelectItem, C as FormCheckbox, Cn as koComboboxLabels, Ct as ComboboxEmpty, D as FormDescription, Dn as SkeletonAvatar, Dt as ComboboxItem, E as FormDateRangePicker, En as Skeleton, Et as ComboboxInput, F as FormNumberInput, Ft as DialogFooter, G as FormSelectPopover, Gt as Tab, H as FormRoot, Hn as OPT_BADGE_YELLOW, Ht as SelectPopover, I as FormProvider, It as DialogHeader, J as FormSubmit, Jn as OPT_DOT_GREEN, Jt as TabsRoot, K as FormSlider, Kt as TabList, L as FormPush, Lt as DialogHeading, M as FormIconPicker, Mt as DialogDescription, N as FormInput, Nt as DialogDisclosure, O as FormError, On as SkeletonCard, Ot as ComboboxPopover, P as FormLabel, Pt as DialogDismiss, Q as useFieldValue, Qn as OPT_FOCUS_VISIBLE, Qt as Composite, R as FormRadio, Rn as OPT_BADGE_BLUE, Rt as DialogPanel, S as formatOptTime, Sn as koBreadcrumbLabels, St as MenubarRoot, T as FormControl, Tn as StatCard, Tt as ComboboxGroupLabel, U as FormSelect, Un as OPT_BORDER, Ut as SelectRoot, V as FormReset, Vn as OPT_BADGE_RED, Vt as SelectLabel, W as FormSelectItem, Wt as SelectTrigger, X as FormTagInput, Xn as OPT_DOT_YELLOW, Xt as DisclosureRoot, Y as FormSwitch, Yn as OPT_DOT_RED, Yt as DisclosureContent, Z as FormTextarea, Zn as OPT_FOCUS, Zt as DisclosureTrigger, _ as DropdownTrigger, _n as Spinner, _r as cn, _t as MenuPopover, a as FieldTokenLegend, an as StarRating, at as getIconRegistryEntry, b as formatOptNumber, bn as EmptyState, bt as MenuTrigger, c as ResizableHandle, cn as useInputId, ct as PopoverContent, d as Checkbox, dn as ToolbarRoot, dr as OPT_TEXT_SECONDARY, dt as Slider, en as CompositeProvider, er as OPT_INPUT, et as useFormStore, f as CheckboxGroup, fn as ToolbarSeparator, fr as OPT_TEXT_TERTIARY, ft as NumberInput, g as DropdownSeparator, gn as Alert, gr as Kbd, gt as MenuItemRadio, h as DropdownMenu, hn as TooltipProvider, hr as _objectWithoutProperties, ht as MenuItemCheckbox, i as FieldToken, in as Textarea, it as IconPicker, j as FormGroupLabel, jn as useControlledState, jt as DialogBody, k as FormField, kn as SkeletonTable, kt as ComboboxRoot, l as ResizablePanel, ln as ToolbarButton, lt as PopoverRoot, m as DropdownItem, mn as TooltipAnchor, mr as _objectSpread2, mt as MenuItem, n as Highlight, nn as CompositeZone, nt as DateRangePicker, o as resolveFieldType, on as Switch, ot as ColorPicker, p as DropdownContent, pn as Tooltip, pr as OPT_TH, pt as MenuButtonArrow, q as FormStarRating, qn as OPT_DOT_GRAY, qt as TabPanel, r as FIELD_TYPE_TOKENS, rn as Meter, rt as TagInput, s as Pagination, sn as Input, sr as OPT_TD, st as PopoverClose, t as TextTruncate, tn as CompositeRow, tt as DEFAULT_PRESETS, u as ResizablePanelGroup, un as ToolbarContainer, ur as OPT_TEXT_PRIMARY, ut as PopoverTrigger, vn as Badge, vt as MenuRoot, w as FormColorPicker, wn as koStarRatingLabels, wt as ComboboxGroup, x as formatOptShortDate, xn as Button, xt as MenubarContainer, y as formatOptDateTime, yn as DescriptionList, yt as MenuSeparator, z as FormRadioGroup, zn as OPT_BADGE_GREEN, zt as DialogRoot } from "./text-truncate-Bd-0WkSP.js";
3
- import { $ as OtpField, A as LoadingOverlay, B as CardFooter, C as Logo, D as PageHeader, E as ScrollArea, F as CircularProgress, G as AvatarGroup, H as CardTitle, I as Progress, J as AccordionItem, K as Breadcrumb, L as Card, M as RadioGroup, N as ConditionBuilder, O as createBlock, P as StepBuilder, Q as ToggleGroup, R as CardContent, S as DrawerRoot, T as Container, U as Identity, V as CardHeader, W as Avatar, X as AccordionTrigger, Y as AccordionRoot, Z as Toggle, _ as getShaderFragment, a as THEME_PALETTES, b as DrawerClose, c as ExpressionGroup, d as ShaderSurface, et as Separator, f as SHADER_OVERLAY_PARAM_KEYS, g as SHADER_PRESET_IDS, h as SHADER_PRESETS, i as ColorPalettePicker, j as Radio, k as BlockLayout, l as Facet, m as SHADER_PARAM_KEYS, n as InlineEdit, nt as Text, o as LiveRegion, p as SHADER_PARAM_FALLBACK, q as AccordionContent, r as ColorPaletteDisplay, s as Expression, t as KeyPadMenu, tt as Heading, u as FacetGroup, v as getShaderPreset, w as Section, x as DrawerPanel, y as VirtualList, z as CardDescription } from "./key-pad-menu-CqFI6la9.js";
4
- import { $ as generatedTheme, $t as Command, A as useOptThemeController, At as KeyValueEditor, B as THEME_SPEC_STORAGE_KEY, Bt as ProjectSwitcher, C as ScoreBreakdown, Ct as QueryOutputPane, D as useOptTheme, Dt as formatQueryCell, E as OptThemeProvider, Et as QueryResultsTable, F as getCompoundTheme, Ft as useToast, G as isForceLightSpec, Gt as EditorToolbar, H as buildTokenCache, Ht as SettingsForm, I as readStoredTheme, It as DataTable, J as safeParseStoredTokens, Jt as StatusSelect, K as resolveDescriptor, Kt as SidebarNav, L as resolveThemeMode, Lt as DomainTable, M as FORCE_LIGHT_PRESETS, Mt as NotificationToast, N as coerceThemeMode, Nt as ToastProvider, O as useOptionalOptTheme, Ot as Flyout, P as createThemeBootScript, Pt as toast, Q as defineThemeOverrides, Qt as CommandPalette, R as GENERATED_THEME_ID_DEFAULT, Rt as BranchSelect, S as withoutField, St as numericResultColumns, T as SqlEditor, Tt as SchemaTree, U as computeGeneratedTokens, Ut as FaqAccordion, V as THEME_TOKENS_STORAGE_KEY, Vt as DeploymentTimeline, W as getCompoundIdForSpec, Wt as ContentTabs, X as serializeThemeRule, Xt as DashboardGrid, Y as serializeGeneratedTheme, Yt as SearchCombobox, Z as serializeTokenBody, Zt as CommandPaletteTrigger, _ as fieldValues, _t as VALUELESS_OPERATORS, a as TimeRangeControl, an as CommandList, at as THEME_PRESET_IDS, b as removeClause, bt as QueryResultChart, c as describeClause, cn as SegmentedControl, ct as isThemePresetId, d as quoteValue, dt as SaveQueryDialog, en as CommandDialog, et as isDescriptorSpec, f as parseQuery, ft as QueryHistoryList, g as applyCellAction, gt as QueryFiltersMenu, h as addClause, ht as EMPTY_QUERY_FILTERS, i as DEFAULT_TIME_PRESETS, in as CommandItem, it as FORCE_LIGHT_PRESET_IDS, j as ALL_COMPOUND_THEMES, jt as FailureList, k as OptThemeControllerContext, kt as WorkflowCanvas, l as formatClause, ln as Callout, lt as QueryWorkspace, m as EMPTY_QUERY, mt as isValidQueryVariableName, n as LogTable, nn as CommandGroup, nt as isPresetSpec, o as useAutoRefresh, on as CommandSeparator, ot as THEME_REGISTRY, p as parseQueryWithDiagnostics, pt as QueryVariablesMenu, q as safeParseStoredSpec, qt as AppMenubar, r as TimeSeriesPanel, rn as CommandInput, rt as presetTheme, s as QueryBar, sn as CommandShortcut, st as getThemeDescriptor, t as FieldSidebar, tn as CommandEmpty, tt as isGeneratedSpec, u as formatQuery, ut as useMediaQuery, v as isEmptyQuery, vt as countActiveQueryFilters, w as EventTimeline, wt as QueryToolbar, x as withFieldValue, xt as defaultQueryChartConfig, y as queryFields, yt as hasActiveQueryFilters, z as GLOBAL_THEME_STYLE_ID, zt as EnvPanel } from "./field-sidebar-mSVCMAZp.js";
2
+ import { $ as useFormContext, $n as OPT_DOT_YELLOW, $t as Composite, A as FormGroup, An as SkeletonTable, At as ComboboxRoot, B as FormRemove, Bt as DialogRoot, C as FormCheckbox, Cn as koBreadcrumbLabels, Ct as MenubarRoot, D as FormDescription, Dn as Skeleton, Dt as ComboboxInput, E as FormDateRangePicker, En as StatCard, Et as ComboboxGroupLabel, F as FormNumberInput, Ft as DialogDismiss, G as FormSelectPopover, Gn as OPT_BADGE_YELLOW, Gt as SelectTrigger, H as FormRoot, Hn as OPT_BADGE_GREEN, Ht as SelectLabel, I as FormProvider, It as DialogFooter, J as FormSubmit, Jt as TabPanel, K as FormSlider, Kn as OPT_BORDER, Kt as Tab, L as FormPush, Lt as DialogHeader, M as FormIconPicker, Mn as Toggle, Mt as DialogBody, N as FormInput, Nn as ToggleGroup, Nt as DialogDescription, O as FormError, On as SkeletonAvatar, Ot as ComboboxItem, P as FormLabel, Pn as useControlledState, Pt as DialogDisclosure, Q as useFieldValue, Qn as OPT_DOT_RED, Qt as DisclosureTrigger, R as FormRadio, Rt as DialogHeading, S as formatOptTime, Sn as Button, St as MenubarContainer, T as FormControl, Tn as koStarRatingLabels, Tt as ComboboxGroup, U as FormSelect, Un as OPT_BADGE_NEUTRAL, Ut as SelectPopover, V as FormReset, Vn as OPT_BADGE_BLUE, Vt as SelectItem, W as FormSelectItem, Wn as OPT_BADGE_RED, Wt as SelectRoot, X as FormTagInput, Xn as OPT_DOT_GRAY, Xt as DisclosureContent, Y as FormSwitch, Yt as TabsRoot, Z as FormTextarea, Zn as OPT_DOT_GREEN, Zt as DisclosureRoot, _ as DropdownTrigger, _n as Alert, _r as _objectSpread2, _t as MenuItemRadio, a as FieldTokenLegend, an as Textarea, at as IconPicker, b as formatOptNumber, bn as DescriptionList, br as cn, bt as MenuSeparator, c as ResizableHandle, cn as Input, ct as PopoverClose, d as Checkbox, dn as ToolbarContainer, dt as PopoverTrigger, en as CompositeItem, er as OPT_FOCUS, et as useFormStore, f as CheckboxGroup, fn as ToolbarRoot, ft as Slider, g as DropdownSeparator, gn as TooltipProvider, gr as OPT_TH, gt as MenuItemCheckbox, h as DropdownMenu, hn as TooltipAnchor, hr as OPT_TEXT_TERTIARY, ht as MenuItem, i as FieldToken, in as Meter, j as FormGroupLabel, jn as SkeletonText, jt as AlertDialogPanel, k as FormField, kn as SkeletonCard, kt as ComboboxPopover, l as ResizablePanel, ln as useInputId, lt as PopoverContent, m as DropdownItem, mn as Tooltip, mr as OPT_TEXT_SECONDARY, mt as MenuButtonArrow, n as Highlight, nn as CompositeRow, nr as OPT_HOVER_ITEM, nt as DateRangePicker, o as resolveFieldType, on as StarRating, ot as getIconRegistryEntry, p as DropdownContent, pn as ToolbarSeparator, pr as OPT_TEXT_PRIMARY, pt as NumberInput, q as FormStarRating, qt as TabList, r as FIELD_TYPE_TOKENS, rn as CompositeZone, rr as OPT_INPUT, rt as TagInput, s as Pagination, sn as Switch, st as ColorPicker, t as TextTruncate, tn as CompositeProvider, tr as OPT_FOCUS_VISIBLE, tt as DEFAULT_PRESETS, u as ResizablePanelGroup, un as ToolbarButton, ur as OPT_TD, ut as PopoverRoot, vn as Spinner, vr as _objectWithoutProperties, vt as MenuPopover, w as FormColorPicker, wn as koComboboxLabels, wt as ComboboxEmpty, x as formatOptShortDate, xn as EmptyState, xt as MenuTrigger, y as formatOptDateTime, yn as Badge, yr as Kbd, yt as MenuRoot, z as FormRadioGroup, zt as DialogPanel } from "./text-truncate-B-8nJgnu.js";
3
+ import { $ as Heading, A as LoadingOverlay, B as CardFooter, C as Logo, D as PageHeader, E as ScrollArea, F as CircularProgress, G as AvatarGroup, H as CardTitle, I as Progress, J as AccordionItem, K as Breadcrumb, L as Card, M as RadioGroup, N as ConditionBuilder, O as createBlock, P as StepBuilder, Q as Separator, R as CardContent, S as DrawerRoot, T as Container, U as Identity, V as CardHeader, W as Avatar, X as AccordionTrigger, Y as AccordionRoot, Z as OtpField, _ as getShaderFragment, a as THEME_PALETTES, b as DrawerClose, c as ExpressionGroup, d as ShaderSurface, et as Text, f as SHADER_OVERLAY_PARAM_KEYS, g as SHADER_PRESET_IDS, h as SHADER_PRESETS, i as ColorPalettePicker, j as Radio, k as BlockLayout, l as Facet, m as SHADER_PARAM_KEYS, n as InlineEdit, o as LiveRegion, p as SHADER_PARAM_FALLBACK, q as AccordionContent, r as ColorPaletteDisplay, s as Expression, t as KeyPadMenu, u as FacetGroup, v as getShaderPreset, w as Section, x as DrawerPanel, y as VirtualList, z as CardDescription } from "./key-pad-menu-BCOeYvsH.js";
4
+ import { $ as safeParseStoredSpec, $t as AppMenubar, A as EventTimeline, At as QueryToolbar, B as createThemeBootScript, Bt as toast, C as fieldValues, Ct as VALUELESS_OPERATORS, D as withFieldValue, Dt as defaultQueryChartConfig, E as removeClause, Et as QueryResultChart, F as OptThemeControllerContext, Ft as WorkflowCanvas, G as GLOBAL_THEME_STYLE_ID, Gt as EnvPanel, H as readStoredTheme, Ht as DataTable, I as useOptThemeController, It as KeyValueEditor, J as buildTokenCache, Jt as SettingsForm, K as THEME_SPEC_STORAGE_KEY, Kt as ProjectSwitcher, L as ALL_COMPOUND_THEMES, Lt as FailureList, M as OptThemeProvider, Mt as QueryResultsTable, N as useOptTheme, Nt as formatQueryCell, O as withoutField, Ot as numericResultColumns, P as useOptionalOptTheme, Pt as Flyout, Q as resolveDescriptor, Qt as SidebarNav, R as FORCE_LIGHT_PRESETS, Rt as NotificationToast, S as applyCellAction, St as QueryFiltersMenu, T as queryFields, Tt as hasActiveQueryFilters, U as resolveThemeMode, Ut as DomainTable, V as getCompoundTheme, Vt as useToast, W as GENERATED_THEME_ID_DEFAULT, Wt as BranchSelect, X as getCompoundIdForSpec, Xt as ContentTabs, Y as computeGeneratedTokens, Yt as FaqAccordion, Z as isForceLightSpec, Zt as EditorToolbar, _ as quoteValue, _t as SaveQueryDialog, a as ReplayScrubber, an as CommandPalette, at as generatedTheme, b as EMPTY_QUERY, bt as isValidQueryVariableName, c as LogTable, cn as CommandEmpty, ct as isPresetSpec, d as TimeRangeControl, dn as CommandItem, dt as THEME_PRESET_IDS, en as StatusSelect, et as safeParseStoredTokens, f as useAutoRefresh, fn as CommandList, ft as THEME_REGISTRY, g as formatQuery, gn as Callout, gt as useMediaQuery, h as formatClause, hn as SegmentedControl, ht as QueryWorkspace, i as formatReplayElapsed, in as CommandPaletteTrigger, it as defineThemeOverrides, j as SqlEditor, jt as SchemaTree, k as ScoreBreakdown, kt as QueryOutputPane, l as TimeSeriesPanel, ln as CommandGroup, lt as presetTheme, m as describeClause, mn as CommandShortcut, mt as isThemePresetId, n as replayShortcutKey, nn as useAsyncSearch, nt as serializeThemeRule, o as groupReplayMarkers, on as Command, ot as isDescriptorSpec, p as QueryBar, pn as CommandSeparator, pt as getThemeDescriptor, q as THEME_TOKENS_STORAGE_KEY, qt as DeploymentTimeline, r as ReplayTransport, rn as DashboardGrid, rt as serializeTokenBody, s as FieldSidebar, sn as CommandDialog, st as isGeneratedSpec, t as ReplayPlayerLayout, tn as SearchCombobox, tt as serializeGeneratedTheme, u as DEFAULT_TIME_PRESETS, un as CommandInput, ut as FORCE_LIGHT_PRESET_IDS, v as parseQuery, vt as QueryHistoryList, w as isEmptyQuery, wt as countActiveQueryFilters, x as addClause, xt as EMPTY_QUERY_FILTERS, y as parseQueryWithDiagnostics, yt as QueryVariablesMenu, z as coerceThemeMode, zt as ToastProvider } from "./replay-player-layout-BVUNsUS1.js";
5
5
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
6
  import * as React from "react";
7
7
  import { Component, useCallback, useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from "react";
@@ -1126,9 +1126,14 @@ function TeamMemberList({ members, title, layout = "list", maxDisplay, onMemberC
1126
1126
  //#region src/shells/auth-form.tsx
1127
1127
  /** Renders the auth form component. */
1128
1128
  function AuthForm({ defaultMode = "login", mode: controlledMode, onModeChange, showRememberMe = true, minPasswordLength = 8, onSubmit, renderExtraFields, labels = {}, ariaLabel }) {
1129
- var _labels$loginTitle, _labels$signupTitle, _labels$emailLabel, _labels$passwordLabel, _labels$confirmPasswo, _labels$rememberMeLab, _labels$loginButton, _labels$signupButton;
1129
+ var _labels$loginTitle, _labels$signupTitle, _labels$emailLabel, _labels$passwordLabel, _labels$confirmPasswo, _labels$rememberMeLab, _labels$loginButton, _labels$signupButton, _labels$submitError;
1130
1130
  const [uncontrolledMode, setUncontrolledMode] = useState(defaultMode);
1131
1131
  const [submitted, setSubmitted] = useState(false);
1132
+ useEffect(() => {
1133
+ if (!submitted) return;
1134
+ const timer = setTimeout(() => setSubmitted(false), 3e3);
1135
+ return () => clearTimeout(timer);
1136
+ }, [submitted]);
1132
1137
  const mode = controlledMode !== null && controlledMode !== void 0 ? controlledMode : uncontrolledMode;
1133
1138
  const handleModeChange = (newMode) => {
1134
1139
  if (controlledMode === void 0) setUncontrolledMode(newMode);
@@ -1167,13 +1172,13 @@ function AuthForm({ defaultMode = "login", mode: controlledMode, onModeChange, s
1167
1172
  }
1168
1173
  return errors;
1169
1174
  },
1170
- onSubmit: (values) => {
1171
- setSubmitted(true);
1172
- setTimeout(() => setSubmitted(false), 3e3);
1173
- if (onSubmit) onSubmit(_objectSpread2(_objectSpread2(_objectSpread2({
1175
+ onSubmit: async (values) => {
1176
+ setSubmitted(false);
1177
+ if (onSubmit) await onSubmit(_objectSpread2(_objectSpread2(_objectSpread2({
1174
1178
  email: values.email,
1175
1179
  password: values.password
1176
1180
  }, mode === "signup" ? { confirmPassword: values.confirmPassword } : {}), mode === "login" ? { rememberMe: values.rememberMe } : {}), {}, { mode }));
1181
+ setSubmitted(true);
1177
1182
  }
1178
1183
  });
1179
1184
  const loginTitle = (_labels$loginTitle = labels.loginTitle) !== null && _labels$loginTitle !== void 0 ? _labels$loginTitle : "로그인";
@@ -1188,11 +1193,13 @@ function AuthForm({ defaultMode = "login", mode: controlledMode, onModeChange, s
1188
1193
  children: [/* @__PURE__ */ jsx("button", {
1189
1194
  type: "button",
1190
1195
  className: `flex-1 rounded-l-lg px-4 py-2 text-sm font-medium transition-colors ${mode === "login" ? "bg-accent text-accent-fg" : "text-text-secondary hover:bg-bg-subtle"}`,
1196
+ disabled: form.isSubmitting(),
1191
1197
  onClick: () => handleModeChange("login"),
1192
1198
  children: loginTitle
1193
1199
  }), /* @__PURE__ */ jsx("button", {
1194
1200
  type: "button",
1195
1201
  className: `flex-1 rounded-r-lg px-4 py-2 text-sm font-medium transition-colors ${mode === "signup" ? "bg-accent text-accent-fg" : "text-text-secondary hover:bg-bg-subtle"}`,
1202
+ disabled: form.isSubmitting(),
1196
1203
  onClick: () => handleModeChange("signup"),
1197
1204
  children: signupTitle
1198
1205
  })]
@@ -1201,8 +1208,8 @@ function AuthForm({ defaultMode = "login", mode: controlledMode, onModeChange, s
1201
1208
  store: form,
1202
1209
  "aria-label": ariaLabel !== null && ariaLabel !== void 0 ? ariaLabel : mode === "login" ? "로그인 폼" : "회원가입 폼",
1203
1210
  children: [
1204
- /* @__PURE__ */ jsxs("div", {
1205
- className: "gap-element flex flex-col",
1211
+ /* @__PURE__ */ jsxs(FormField, {
1212
+ name: "email",
1206
1213
  children: [
1207
1214
  /* @__PURE__ */ jsx(FormLabel, {
1208
1215
  name: "email",
@@ -1217,8 +1224,8 @@ function AuthForm({ defaultMode = "login", mode: controlledMode, onModeChange, s
1217
1224
  ]
1218
1225
  }),
1219
1226
  renderExtraFields === null || renderExtraFields === void 0 ? void 0 : renderExtraFields(mode),
1220
- /* @__PURE__ */ jsxs("div", {
1221
- className: "gap-element flex flex-col",
1227
+ /* @__PURE__ */ jsxs(FormField, {
1228
+ name: "password",
1222
1229
  children: [
1223
1230
  /* @__PURE__ */ jsx(FormLabel, {
1224
1231
  name: "password",
@@ -1232,8 +1239,8 @@ function AuthForm({ defaultMode = "login", mode: controlledMode, onModeChange, s
1232
1239
  /* @__PURE__ */ jsx(FormError, { name: "password" })
1233
1240
  ]
1234
1241
  }),
1235
- mode === "signup" && /* @__PURE__ */ jsxs("div", {
1236
- className: "gap-element flex flex-col",
1242
+ mode === "signup" && /* @__PURE__ */ jsxs(FormField, {
1243
+ name: "confirmPassword",
1237
1244
  children: [
1238
1245
  /* @__PURE__ */ jsx(FormLabel, {
1239
1246
  name: "confirmPassword",
@@ -1263,7 +1270,13 @@ function AuthForm({ defaultMode = "login", mode: controlledMode, onModeChange, s
1263
1270
  })
1264
1271
  ]
1265
1272
  }),
1273
+ form.getSubmitError() !== void 0 && /* @__PURE__ */ jsx("div", {
1274
+ role: "alert",
1275
+ className: "border-danger bg-danger-subtle text-danger-fg rounded-lg border p-3 text-sm",
1276
+ children: (_labels$submitError = labels.submitError) !== null && _labels$submitError !== void 0 ? _labels$submitError : "처리에 실패했습니다. 다시 시도해주세요."
1277
+ }),
1266
1278
  submitted && /* @__PURE__ */ jsx("div", {
1279
+ role: "status",
1267
1280
  className: "border-success bg-success-subtle text-success-fg rounded-lg border p-3 text-sm",
1268
1281
  children: mode === "login" ? "로그인 성공!" : "회원가입 완료!"
1269
1282
  })
@@ -1274,11 +1287,16 @@ function AuthForm({ defaultMode = "login", mode: controlledMode, onModeChange, s
1274
1287
  //#region src/shells/dynamic-field-form.tsx
1275
1288
  /** Renders the dynamic field form component. */
1276
1289
  function DynamicFieldForm({ initialCount = 1, minFields = 1, maxFields, fieldType = "text", validateField, onSubmit, onFieldsChange, labels = {}, ariaLabel }) {
1277
- var _labels$itemLabel, _labels$itemPlacehold, _labels$removeAriaLab, _labels$addButton, _labels$submitButton;
1290
+ var _labels$itemLabel, _labels$itemPlacehold, _labels$removeAriaLab, _labels$addButton, _labels$submitButton, _labels$submitError;
1278
1291
  const initialFields = Array.from({ length: initialCount }, (_, i) => ({ id: i + 1 }));
1279
1292
  const [fields, setFields] = useState(initialFields);
1280
1293
  const [nextId, setNextId] = useState(initialCount + 1);
1281
1294
  const [submitted, setSubmitted] = useState(false);
1295
+ useEffect(() => {
1296
+ if (!submitted) return;
1297
+ const timer = setTimeout(() => setSubmitted(false), 3e3);
1298
+ return () => clearTimeout(timer);
1299
+ }, [submitted]);
1282
1300
  const [submittedValues, setSubmittedValues] = useState([]);
1283
1301
  const form = useFormStore({
1284
1302
  defaultValues: { items: Array.from({ length: initialCount }, () => "") },
@@ -1302,12 +1320,12 @@ function DynamicFieldForm({ initialCount = 1, minFields = 1, maxFields, fieldTyp
1302
1320
  }
1303
1321
  return errors;
1304
1322
  },
1305
- onSubmit: (values) => {
1323
+ onSubmit: async (values) => {
1324
+ setSubmitted(false);
1306
1325
  const items = [...values.items];
1326
+ await (onSubmit === null || onSubmit === void 0 ? void 0 : onSubmit(items));
1307
1327
  setSubmittedValues(items);
1308
1328
  setSubmitted(true);
1309
- setTimeout(() => setSubmitted(false), 3e3);
1310
- onSubmit === null || onSubmit === void 0 || onSubmit(items);
1311
1329
  }
1312
1330
  });
1313
1331
  const addField = () => {
@@ -1338,70 +1356,79 @@ function DynamicFieldForm({ initialCount = 1, minFields = 1, maxFields, fieldTyp
1338
1356
  className: "gap-group flex flex-col",
1339
1357
  "data-opt-id": "8RYG7",
1340
1358
  "data-opt-slug": "form-dynamic.DynamicFieldForm",
1341
- children: [/* @__PURE__ */ jsxs(FormRoot, {
1342
- store: form,
1343
- "aria-label": ariaLabel !== null && ariaLabel !== void 0 ? ariaLabel : "동적 필드 폼",
1344
- children: [
1345
- /* @__PURE__ */ jsx("div", {
1346
- className: "gap-group flex flex-col",
1347
- children: fields.map((field, displayIndex) => {
1348
- const fieldName = `items.${displayIndex}`;
1349
- return /* @__PURE__ */ jsxs("div", {
1350
- className: "gap-element flex flex-col",
1351
- children: [
1352
- /* @__PURE__ */ jsx(FormLabel, {
1353
- name: fieldName,
1354
- children: formatTemplate(itemLabel, displayIndex + 1)
1355
- }),
1356
- /* @__PURE__ */ jsxs("div", {
1357
- className: "gap-element flex",
1358
- children: [/* @__PURE__ */ jsx("div", {
1359
- className: "flex-1",
1360
- children: /* @__PURE__ */ jsx(FormInput, {
1361
- name: fieldName,
1362
- type: fieldType,
1363
- placeholder: formatTemplate(itemPlaceholder, displayIndex + 1)
1364
- })
1365
- }), /* @__PURE__ */ jsx("button", {
1366
- type: "button",
1367
- onClick: () => removeField(field.id),
1368
- disabled: fields.length <= minFields,
1369
- className: "border-border text-text-tertiary hover:border-danger hover:bg-danger-subtle hover:text-danger-fg inline-flex h-10 w-10 shrink-0 items-center justify-center rounded-lg border transition-colors disabled:cursor-not-allowed disabled:opacity-30",
1370
- "aria-label": formatTemplate(removeAriaLabel, displayIndex + 1),
1371
- children: "✕"
1372
- })]
1373
- }),
1374
- /* @__PURE__ */ jsx(FormError, { name: fieldName })
1375
- ]
1376
- }, field.id);
1359
+ children: [
1360
+ /* @__PURE__ */ jsxs(FormRoot, {
1361
+ store: form,
1362
+ "aria-label": ariaLabel !== null && ariaLabel !== void 0 ? ariaLabel : "동적 필드 폼",
1363
+ children: [
1364
+ /* @__PURE__ */ jsx("div", {
1365
+ className: "gap-group flex flex-col",
1366
+ children: fields.map((field, displayIndex) => {
1367
+ const fieldName = `items.${displayIndex}`;
1368
+ return /* @__PURE__ */ jsxs(FormField, {
1369
+ name: fieldName,
1370
+ children: [
1371
+ /* @__PURE__ */ jsx(FormLabel, {
1372
+ name: fieldName,
1373
+ children: formatTemplate(itemLabel, displayIndex + 1)
1374
+ }),
1375
+ /* @__PURE__ */ jsxs("div", {
1376
+ className: "gap-element flex",
1377
+ children: [/* @__PURE__ */ jsx("div", {
1378
+ className: "flex-1",
1379
+ children: /* @__PURE__ */ jsx(FormInput, {
1380
+ name: fieldName,
1381
+ type: fieldType,
1382
+ placeholder: formatTemplate(itemPlaceholder, displayIndex + 1)
1383
+ })
1384
+ }), /* @__PURE__ */ jsx("button", {
1385
+ type: "button",
1386
+ onClick: () => removeField(field.id),
1387
+ disabled: form.isSubmitting() || fields.length <= minFields,
1388
+ className: "border-border text-text-tertiary hover:border-danger hover:bg-danger-subtle hover:text-danger-fg inline-flex h-10 w-10 shrink-0 items-center justify-center rounded-lg border transition-colors disabled:cursor-not-allowed disabled:opacity-30",
1389
+ "aria-label": formatTemplate(removeAriaLabel, displayIndex + 1),
1390
+ children: "✕"
1391
+ })]
1392
+ }),
1393
+ /* @__PURE__ */ jsx(FormError, { name: fieldName })
1394
+ ]
1395
+ }, field.id);
1396
+ })
1397
+ }),
1398
+ /* @__PURE__ */ jsx("button", {
1399
+ type: "button",
1400
+ onClick: addField,
1401
+ disabled: form.isSubmitting() || maxFields !== void 0 && fields.length >= maxFields,
1402
+ className: "border-border text-text-secondary hover:border-accent hover:bg-accent-subtle hover:text-accent w-full rounded-lg border border-dashed px-4 py-2.5 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-30",
1403
+ children: (_labels$addButton = labels.addButton) !== null && _labels$addButton !== void 0 ? _labels$addButton : "+ 항목 추가"
1404
+ }),
1405
+ /* @__PURE__ */ jsx(FormSubmit, {
1406
+ disabled: form.isSubmitting(),
1407
+ children: (_labels$submitButton = labels.submitButton) !== null && _labels$submitButton !== void 0 ? _labels$submitButton : "제출"
1377
1408
  })
1378
- }),
1379
- /* @__PURE__ */ jsx("button", {
1380
- type: "button",
1381
- onClick: addField,
1382
- disabled: maxFields !== void 0 && fields.length >= maxFields,
1383
- className: "border-border text-text-secondary hover:border-accent hover:bg-accent-subtle hover:text-accent w-full rounded-lg border border-dashed px-4 py-2.5 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-30",
1384
- children: (_labels$addButton = labels.addButton) !== null && _labels$addButton !== void 0 ? _labels$addButton : "+ 항목 추가"
1385
- }),
1386
- /* @__PURE__ */ jsx(FormSubmit, {
1387
- disabled: form.isSubmitting(),
1388
- children: (_labels$submitButton = labels.submitButton) !== null && _labels$submitButton !== void 0 ? _labels$submitButton : "제출"
1389
- })
1390
- ]
1391
- }), submitted && submittedValues.length > 0 && /* @__PURE__ */ jsxs("div", {
1392
- className: "border-success bg-success-subtle rounded-lg border p-3",
1393
- children: [/* @__PURE__ */ jsx("p", {
1394
- className: "text-success-fg mb-2 text-sm font-medium",
1395
- children: "제출된 값:"
1396
- }), /* @__PURE__ */ jsx("ul", {
1397
- className: "text-success-fg gap-element flex flex-col text-sm",
1398
- children: submittedValues.map((val, i) => /* @__PURE__ */ jsxs("li", { children: [
1399
- formatTemplate(itemLabel, i + 1),
1400
- ": ",
1401
- /* @__PURE__ */ jsx("strong", { children: val })
1402
- ] }, i))
1403
- })]
1404
- })]
1409
+ ]
1410
+ }),
1411
+ form.getSubmitError() !== void 0 && /* @__PURE__ */ jsx("div", {
1412
+ role: "alert",
1413
+ className: "border-danger bg-danger-subtle text-danger-fg rounded-lg border p-3 text-sm",
1414
+ children: (_labels$submitError = labels.submitError) !== null && _labels$submitError !== void 0 ? _labels$submitError : "처리에 실패했습니다. 다시 시도해주세요."
1415
+ }),
1416
+ submitted && submittedValues.length > 0 && /* @__PURE__ */ jsxs("div", {
1417
+ role: "status",
1418
+ className: "border-success bg-success-subtle rounded-lg border p-3",
1419
+ children: [/* @__PURE__ */ jsx("p", {
1420
+ className: "text-success-fg mb-2 text-sm font-medium",
1421
+ children: "제출된 값:"
1422
+ }), /* @__PURE__ */ jsx("ul", {
1423
+ className: "text-success-fg gap-element flex flex-col text-sm",
1424
+ children: submittedValues.map((val, i) => /* @__PURE__ */ jsxs("li", { children: [
1425
+ formatTemplate(itemLabel, i + 1),
1426
+ ": ",
1427
+ /* @__PURE__ */ jsx("strong", { children: val })
1428
+ ] }, i))
1429
+ })]
1430
+ })
1431
+ ]
1405
1432
  });
1406
1433
  }
1407
1434
  //#endregion
@@ -1413,10 +1440,16 @@ function formatFileSize(bytes) {
1413
1440
  }
1414
1441
  /** Renders the file upload form component. */
1415
1442
  function FileUploadForm({ accept = "image/*,.pdf,.doc,.docx", showPreview = true, showFileInfo = true, showDescription = true, descriptionRows = 3, titleRequired = true, maxFileSize, onSubmit, onFileChange, onPreview, columnMapping, labels = {}, ariaLabel }) {
1416
- var _labels$titleLabel, _labels$titlePlacehol, _labels$descriptionLa, _labels$descriptionPl, _labels$fileLabel, _labels$columnMapping, _labels$submitButton, _labels$successMessag;
1443
+ var _labels$titleLabel, _labels$titlePlacehol, _labels$descriptionLa, _labels$descriptionPl, _labels$fileLabel, _labels$columnMapping, _labels$submitButton, _labels$submitError, _labels$successMessag;
1444
+ const fileId = useId();
1417
1445
  const [selectedFile, setSelectedFile] = useState(null);
1418
1446
  const [preview, setPreview] = useState(null);
1419
1447
  const [submitted, setSubmitted] = useState(false);
1448
+ useEffect(() => {
1449
+ if (!submitted) return;
1450
+ const timer = setTimeout(() => setSubmitted(false), 3e3);
1451
+ return () => clearTimeout(timer);
1452
+ }, [submitted]);
1420
1453
  const [fileSizeError, setFileSizeError] = useState(null);
1421
1454
  const form = useFormStore({
1422
1455
  defaultValues: {
@@ -1434,14 +1467,14 @@ function FileUploadForm({ accept = "image/*,.pdf,.doc,.docx", showPreview = true
1434
1467
  }
1435
1468
  return errors;
1436
1469
  },
1437
- onSubmit: (values) => {
1438
- setSubmitted(true);
1439
- setTimeout(() => setSubmitted(false), 3e3);
1440
- if (onSubmit) onSubmit({
1470
+ onSubmit: async (values) => {
1471
+ setSubmitted(false);
1472
+ if (onSubmit) await onSubmit({
1441
1473
  title: values.title,
1442
1474
  description: values.description,
1443
1475
  file: selectedFile
1444
1476
  });
1477
+ setSubmitted(true);
1445
1478
  }
1446
1479
  });
1447
1480
  const handleFileChange = (e) => {
@@ -1473,111 +1506,128 @@ function FileUploadForm({ accept = "image/*,.pdf,.doc,.docx", showPreview = true
1473
1506
  className: "gap-group flex flex-col",
1474
1507
  "data-opt-id": "4E3MD",
1475
1508
  "data-opt-slug": "form-upload.FileUploadForm",
1476
- children: [/* @__PURE__ */ jsxs(FormRoot, {
1477
- store: form,
1478
- "aria-label": ariaLabel !== null && ariaLabel !== void 0 ? ariaLabel : "파일 업로드 폼",
1479
- children: [
1480
- /* @__PURE__ */ jsxs("div", {
1481
- className: "gap-element flex flex-col",
1482
- children: [
1483
- /* @__PURE__ */ jsx(FormLabel, {
1484
- name: "title",
1485
- children: (_labels$titleLabel = labels.titleLabel) !== null && _labels$titleLabel !== void 0 ? _labels$titleLabel : "제목"
1486
- }),
1487
- /* @__PURE__ */ jsx(FormInput, {
1488
- name: "title",
1489
- placeholder: (_labels$titlePlacehol = labels.titlePlaceholder) !== null && _labels$titlePlacehol !== void 0 ? _labels$titlePlacehol : "파일 제목을 입력하세요"
1490
- }),
1491
- /* @__PURE__ */ jsx(FormError, { name: "title" })
1492
- ]
1493
- }),
1494
- showDescription && /* @__PURE__ */ jsxs("div", {
1495
- className: "gap-element flex flex-col",
1496
- children: [/* @__PURE__ */ jsx(FormLabel, {
1497
- name: "description",
1498
- children: (_labels$descriptionLa = labels.descriptionLabel) !== null && _labels$descriptionLa !== void 0 ? _labels$descriptionLa : "설명"
1499
- }), /* @__PURE__ */ jsx(FormTextarea, {
1500
- name: "description",
1501
- placeholder: (_labels$descriptionPl = labels.descriptionPlaceholder) !== null && _labels$descriptionPl !== void 0 ? _labels$descriptionPl : "파일에 대한 설명을 입력하세요",
1502
- rows: descriptionRows,
1503
- resize: "none"
1504
- })]
1505
- }),
1506
- /* @__PURE__ */ jsxs("div", {
1507
- className: "gap-element flex flex-col",
1508
- children: [
1509
- /* @__PURE__ */ jsx("label", {
1510
- className: "text-text-primary text-sm font-medium",
1511
- children: (_labels$fileLabel = labels.fileLabel) !== null && _labels$fileLabel !== void 0 ? _labels$fileLabel : "파일 선택"
1512
- }),
1513
- /* @__PURE__ */ jsx("div", {
1514
- className: "relative",
1515
- children: /* @__PURE__ */ jsx("input", {
1516
- type: "file",
1517
- onChange: handleFileChange,
1518
- accept,
1519
- className: "border-border bg-surface text-text-primary file:bg-accent-subtle file:text-accent hover:file:bg-accent-subtle block w-full cursor-pointer rounded-lg border px-4 py-2.5 text-sm file:mr-4 file:cursor-pointer file:rounded-md file:border-0 file:px-3 file:py-1 file:text-sm file:font-medium"
1520
- })
1521
- }),
1522
- fileSizeError && /* @__PURE__ */ jsx("p", {
1523
- className: "text-danger-fg text-xs",
1524
- children: fileSizeError
1525
- })
1526
- ]
1527
- }),
1528
- selectedFile && showFileInfo && /* @__PURE__ */ jsx("div", {
1529
- className: "border-border-subtle rounded-lg border p-4",
1530
- children: /* @__PURE__ */ jsxs("div", {
1531
- className: "gap-element flex flex-col",
1509
+ children: [
1510
+ /* @__PURE__ */ jsxs(FormRoot, {
1511
+ store: form,
1512
+ "aria-label": ariaLabel !== null && ariaLabel !== void 0 ? ariaLabel : "파일 업로드 폼",
1513
+ children: [
1514
+ /* @__PURE__ */ jsxs(FormField, {
1515
+ name: "title",
1532
1516
  children: [
1533
- /* @__PURE__ */ jsxs("div", {
1534
- className: "flex items-center justify-between text-sm",
1535
- children: [/* @__PURE__ */ jsx("span", {
1536
- className: "text-text-primary font-medium",
1537
- children: selectedFile.name
1538
- }), /* @__PURE__ */ jsx("span", {
1539
- className: "text-text-tertiary",
1540
- children: formatFileSize(selectedFile.size)
1541
- })]
1517
+ /* @__PURE__ */ jsx(FormLabel, {
1518
+ name: "title",
1519
+ children: (_labels$titleLabel = labels.titleLabel) !== null && _labels$titleLabel !== void 0 ? _labels$titleLabel : "제목"
1542
1520
  }),
1543
- /* @__PURE__ */ jsxs("div", {
1544
- className: "text-text-tertiary text-xs",
1545
- children: ["타입: ", selectedFile.type || " 없음"]
1521
+ /* @__PURE__ */ jsx(FormInput, {
1522
+ name: "title",
1523
+ placeholder: (_labels$titlePlacehol = labels.titlePlaceholder) !== null && _labels$titlePlacehol !== void 0 ? _labels$titlePlacehol : "파일 제목을 입력하세요"
1524
+ }),
1525
+ /* @__PURE__ */ jsx(FormError, { name: "title" })
1526
+ ]
1527
+ }),
1528
+ showDescription && /* @__PURE__ */ jsxs(FormField, {
1529
+ name: "description",
1530
+ children: [/* @__PURE__ */ jsx(FormLabel, {
1531
+ name: "description",
1532
+ children: (_labels$descriptionLa = labels.descriptionLabel) !== null && _labels$descriptionLa !== void 0 ? _labels$descriptionLa : "설명"
1533
+ }), /* @__PURE__ */ jsx(FormTextarea, {
1534
+ name: "description",
1535
+ placeholder: (_labels$descriptionPl = labels.descriptionPlaceholder) !== null && _labels$descriptionPl !== void 0 ? _labels$descriptionPl : "파일에 대한 설명을 입력하세요",
1536
+ rows: descriptionRows,
1537
+ resize: "none"
1538
+ })]
1539
+ }),
1540
+ /* @__PURE__ */ jsxs(FormField, {
1541
+ name: "file",
1542
+ children: [
1543
+ /* @__PURE__ */ jsx("label", {
1544
+ htmlFor: fileId,
1545
+ className: "text-text-primary text-sm font-medium",
1546
+ children: (_labels$fileLabel = labels.fileLabel) !== null && _labels$fileLabel !== void 0 ? _labels$fileLabel : "파일 선택"
1546
1547
  }),
1547
- showPreview && preview && /* @__PURE__ */ jsx("div", {
1548
- className: "border-border-subtle overflow-hidden rounded-lg border",
1549
- children: /* @__PURE__ */ jsx("img", {
1550
- src: preview,
1551
- alt: "미리보기",
1552
- className: "max-h-48 w-full object-contain"
1548
+ /* @__PURE__ */ jsx("div", {
1549
+ className: "relative",
1550
+ children: /* @__PURE__ */ jsx("input", {
1551
+ id: fileId,
1552
+ type: "file",
1553
+ disabled: form.isSubmitting(),
1554
+ "aria-invalid": Boolean(fileSizeError),
1555
+ "aria-describedby": fileSizeError ? `${fileId}-error` : void 0,
1556
+ onChange: handleFileChange,
1557
+ accept,
1558
+ className: "border-border bg-surface text-text-primary file:bg-accent-subtle file:text-accent hover:file:bg-accent-subtle block w-full cursor-pointer rounded-lg border px-4 py-2.5 text-sm file:mr-4 file:cursor-pointer file:rounded-md file:border-0 file:px-3 file:py-1 file:text-sm file:font-medium"
1553
1559
  })
1560
+ }),
1561
+ fileSizeError && /* @__PURE__ */ jsx("p", {
1562
+ id: `${fileId}-error`,
1563
+ role: "alert",
1564
+ className: "text-danger-fg text-xs",
1565
+ children: fileSizeError
1554
1566
  })
1555
1567
  ]
1568
+ }),
1569
+ selectedFile && showFileInfo && /* @__PURE__ */ jsx("div", {
1570
+ className: "border-border-subtle rounded-lg border p-4",
1571
+ children: /* @__PURE__ */ jsxs("div", {
1572
+ className: "gap-element flex flex-col",
1573
+ children: [
1574
+ /* @__PURE__ */ jsxs("div", {
1575
+ className: "flex items-center justify-between text-sm",
1576
+ children: [/* @__PURE__ */ jsx("span", {
1577
+ className: "text-text-primary font-medium",
1578
+ children: selectedFile.name
1579
+ }), /* @__PURE__ */ jsx("span", {
1580
+ className: "text-text-tertiary",
1581
+ children: formatFileSize(selectedFile.size)
1582
+ })]
1583
+ }),
1584
+ /* @__PURE__ */ jsxs("div", {
1585
+ className: "text-text-tertiary text-xs",
1586
+ children: ["타입: ", selectedFile.type || "알 수 없음"]
1587
+ }),
1588
+ showPreview && preview && /* @__PURE__ */ jsx("div", {
1589
+ className: "border-border-subtle overflow-hidden rounded-lg border",
1590
+ children: /* @__PURE__ */ jsx("img", {
1591
+ src: preview,
1592
+ alt: "미리보기",
1593
+ className: "max-h-48 w-full object-contain"
1594
+ })
1595
+ })
1596
+ ]
1597
+ })
1598
+ }),
1599
+ columnMapping && selectedFile && /* @__PURE__ */ jsx("div", {
1600
+ className: "gap-element flex flex-col",
1601
+ "aria-label": (_labels$columnMapping = labels.columnMappingLabel) !== null && _labels$columnMapping !== void 0 ? _labels$columnMapping : "Column mapping",
1602
+ children: columnMapping
1603
+ }),
1604
+ /* @__PURE__ */ jsx(FormSubmit, {
1605
+ disabled: form.isSubmitting(),
1606
+ children: (_labels$submitButton = labels.submitButton) !== null && _labels$submitButton !== void 0 ? _labels$submitButton : "업로드"
1556
1607
  })
1557
- }),
1558
- columnMapping && selectedFile && /* @__PURE__ */ jsx("div", {
1559
- className: "gap-element flex flex-col",
1560
- "aria-label": (_labels$columnMapping = labels.columnMappingLabel) !== null && _labels$columnMapping !== void 0 ? _labels$columnMapping : "Column mapping",
1561
- children: columnMapping
1562
- }),
1563
- /* @__PURE__ */ jsx(FormSubmit, {
1564
- disabled: form.isSubmitting(),
1565
- children: (_labels$submitButton = labels.submitButton) !== null && _labels$submitButton !== void 0 ? _labels$submitButton : "업로드"
1566
- })
1567
- ]
1568
- }), submitted && /* @__PURE__ */ jsx("div", {
1569
- className: "border-success bg-success-subtle text-success-fg rounded-lg border p-3 text-sm",
1570
- children: (_labels$successMessag = labels.successMessage) !== null && _labels$successMessag !== void 0 ? _labels$successMessag : "업로드가 완료되었습니다!"
1571
- })]
1608
+ ]
1609
+ }),
1610
+ form.getSubmitError() !== void 0 && /* @__PURE__ */ jsx("div", {
1611
+ role: "alert",
1612
+ className: "border-danger bg-danger-subtle text-danger-fg rounded-lg border p-3 text-sm",
1613
+ children: (_labels$submitError = labels.submitError) !== null && _labels$submitError !== void 0 ? _labels$submitError : "처리에 실패했습니다. 다시 시도해주세요."
1614
+ }),
1615
+ submitted && /* @__PURE__ */ jsx("div", {
1616
+ role: "status",
1617
+ className: "border-success bg-success-subtle text-success-fg rounded-lg border p-3 text-sm",
1618
+ children: (_labels$successMessag = labels.successMessage) !== null && _labels$successMessag !== void 0 ? _labels$successMessag : "업로드가 완료되었습니다!"
1619
+ })
1620
+ ]
1572
1621
  });
1573
1622
  }
1574
1623
  //#endregion
1575
1624
  //#region src/shells/wizard-form.tsx
1576
1625
  /** Renders the wizard form component. */
1577
1626
  function WizardForm({ fields, steps, showReview = true, onSubmit, onStepChange, resetOnSuccess = false, labels = {}, ariaLabel }) {
1578
- var _labels$reviewTitle, _labels$stepsLabel, _labels$reviewTitle2, _labels$backButton, _labels$submitButton, _labels$nextButton, _labels$successMessag, _labels$resetLink;
1627
+ var _labels$reviewTitle, _labels$stepsLabel, _labels$reviewTitle2, _labels$backButton, _labels$submitButton, _labels$nextButton, _labels$submitError, _labels$successMessag, _labels$resetLink;
1579
1628
  const [currentStep, setCurrentStep] = useState(0);
1580
1629
  const [submitted, setSubmitted] = useState(false);
1630
+ const formId = useId();
1581
1631
  const totalSteps = showReview ? steps.length + 1 : steps.length;
1582
1632
  const isReviewStep = showReview && currentStep === steps.length;
1583
1633
  const isLastStep = currentStep === totalSteps - 1;
@@ -1611,22 +1661,31 @@ function WizardForm({ fields, steps, showReview = true, onSubmit, onStepChange,
1611
1661
  }
1612
1662
  return errors;
1613
1663
  },
1614
- onSubmit: (values) => {
1664
+ onSubmit: async (values) => {
1615
1665
  if (!isLastStep) {
1616
1666
  const next = currentStep + 1;
1617
1667
  setCurrentStep(next);
1618
1668
  onStepChange === null || onStepChange === void 0 || onStepChange(next);
1619
1669
  } else {
1670
+ setSubmitted(false);
1671
+ await (onSubmit === null || onSubmit === void 0 ? void 0 : onSubmit(values));
1620
1672
  setSubmitted(true);
1621
- onSubmit === null || onSubmit === void 0 || onSubmit(values);
1622
- if (resetOnSuccess) setTimeout(() => {
1623
- setCurrentStep(0);
1624
- setSubmitted(false);
1625
- form.reset();
1626
- }, 3e3);
1627
1673
  }
1628
1674
  }
1629
1675
  });
1676
+ useEffect(() => {
1677
+ if (!submitted || !resetOnSuccess) return;
1678
+ const timer = setTimeout(() => {
1679
+ setCurrentStep(0);
1680
+ setSubmitted(false);
1681
+ form.reset();
1682
+ }, 3e3);
1683
+ return () => clearTimeout(timer);
1684
+ }, [
1685
+ submitted,
1686
+ resetOnSuccess,
1687
+ form
1688
+ ]);
1630
1689
  const handleBack = () => {
1631
1690
  if (currentStep > 0) {
1632
1691
  const prev = currentStep - 1;
@@ -1664,8 +1723,8 @@ function WizardForm({ fields, steps, showReview = true, onSubmit, onStepChange,
1664
1723
  ]
1665
1724
  }, field.name);
1666
1725
  }
1667
- if (field.type === "checkbox") return /* @__PURE__ */ jsxs("div", {
1668
- className: "gap-element flex flex-col",
1726
+ if (field.type === "checkbox") return /* @__PURE__ */ jsxs(FormField, {
1727
+ name: field.name,
1669
1728
  children: [/* @__PURE__ */ jsxs("label", {
1670
1729
  className: "text-text-primary gap-element flex items-center text-sm",
1671
1730
  children: [/* @__PURE__ */ jsx(FormCheckbox, { name: field.name }), /* @__PURE__ */ jsx("span", { children: field.label })]
@@ -1673,13 +1732,10 @@ function WizardForm({ fields, steps, showReview = true, onSubmit, onStepChange,
1673
1732
  }, field.name);
1674
1733
  if (field.type === "textarea") {
1675
1734
  var _field$rows, _field$resize;
1676
- return /* @__PURE__ */ jsxs("div", {
1677
- className: "gap-element flex flex-col",
1735
+ return /* @__PURE__ */ jsxs(FormField, {
1736
+ name: field.name,
1678
1737
  children: [
1679
- /* @__PURE__ */ jsx(FormLabel, {
1680
- name: field.name,
1681
- children: field.label
1682
- }),
1738
+ /* @__PURE__ */ jsx(FormLabel, { children: field.label }),
1683
1739
  /* @__PURE__ */ jsx(FormTextarea, {
1684
1740
  name: field.name,
1685
1741
  placeholder: field.placeholder,
@@ -1692,22 +1748,28 @@ function WizardForm({ fields, steps, showReview = true, onSubmit, onStepChange,
1692
1748
  }
1693
1749
  if (field.type === "select") {
1694
1750
  var _field$options2;
1695
- return /* @__PURE__ */ jsxs("div", {
1696
- className: "gap-element flex flex-col",
1751
+ return /* @__PURE__ */ jsxs(FormField, {
1752
+ name: field.name,
1697
1753
  children: [
1698
1754
  /* @__PURE__ */ jsx(FormLabel, {
1699
- name: field.name,
1755
+ htmlFor: `${formId}-${field.name}`,
1700
1756
  children: field.label
1701
1757
  }),
1702
1758
  /* @__PURE__ */ jsx(FormSelect, {
1703
1759
  name: field.name,
1760
+ id: `${formId}-${field.name}`,
1761
+ "aria-label": field.label,
1762
+ "aria-describedby": form.getError(field.name) && form.getFieldTouched(field.name) ? `${formId}-${field.name}-error` : void 0,
1704
1763
  placeholder: field.placeholder,
1705
1764
  children: /* @__PURE__ */ jsx(FormSelectPopover, { children: (_field$options2 = field.options) === null || _field$options2 === void 0 ? void 0 : _field$options2.map((option) => /* @__PURE__ */ jsx(FormSelectItem, {
1706
1765
  value: option.value,
1707
1766
  children: option.label
1708
1767
  }, option.value)) })
1709
1768
  }),
1710
- /* @__PURE__ */ jsx(FormError, { name: field.name })
1769
+ /* @__PURE__ */ jsx(FormError, {
1770
+ name: field.name,
1771
+ id: `${formId}-${field.name}-error`
1772
+ })
1711
1773
  ]
1712
1774
  }, field.name);
1713
1775
  }
@@ -1724,13 +1786,10 @@ function WizardForm({ fields, steps, showReview = true, onSubmit, onStepChange,
1724
1786
  })]
1725
1787
  })]
1726
1788
  }, field.name);
1727
- return /* @__PURE__ */ jsxs("div", {
1728
- className: "gap-element flex flex-col",
1789
+ return /* @__PURE__ */ jsxs(FormField, {
1790
+ name: field.name,
1729
1791
  children: [
1730
- /* @__PURE__ */ jsx(FormLabel, {
1731
- name: field.name,
1732
- children: field.label
1733
- }),
1792
+ /* @__PURE__ */ jsx(FormLabel, { children: field.label }),
1734
1793
  /* @__PURE__ */ jsx(FormInput, {
1735
1794
  name: field.name,
1736
1795
  type: (_field$type = field.type) !== null && _field$type !== void 0 ? _field$type : "text",
@@ -1814,13 +1873,20 @@ function WizardForm({ fields, steps, showReview = true, onSubmit, onStepChange,
1814
1873
  children: [currentStep > 0 ? /* @__PURE__ */ jsx("button", {
1815
1874
  type: "button",
1816
1875
  onClick: handleBack,
1876
+ disabled: form.isSubmitting(),
1817
1877
  className: "border-border text-text-primary hover:bg-bg-subtle rounded-lg border px-4 py-2 text-sm font-medium",
1818
1878
  children: (_labels$backButton = labels.backButton) !== null && _labels$backButton !== void 0 ? _labels$backButton : "이전"
1819
1879
  }) : /* @__PURE__ */ jsx("div", {}), /* @__PURE__ */ jsx(FormSubmit, { children: isLastStep ? (_labels$submitButton = labels.submitButton) !== null && _labels$submitButton !== void 0 ? _labels$submitButton : "제출" : (_labels$nextButton = labels.nextButton) !== null && _labels$nextButton !== void 0 ? _labels$nextButton : "다음" })]
1820
1880
  })
1821
1881
  ]
1822
1882
  }),
1883
+ form.getSubmitError() !== void 0 && /* @__PURE__ */ jsx("div", {
1884
+ role: "alert",
1885
+ className: "border-danger bg-danger-subtle text-danger-fg rounded-lg border p-3 text-sm",
1886
+ children: (_labels$submitError = labels.submitError) !== null && _labels$submitError !== void 0 ? _labels$submitError : "처리에 실패했습니다. 다시 시도해주세요."
1887
+ }),
1823
1888
  submitted && /* @__PURE__ */ jsxs("div", {
1889
+ role: "status",
1824
1890
  className: "border-success bg-success-subtle rounded-lg border p-4 text-center",
1825
1891
  children: [/* @__PURE__ */ jsx("p", {
1826
1892
  className: "text-success-fg text-sm font-medium",
@@ -6173,64 +6239,56 @@ ConfirmDialog.displayName = "ConfirmDialog";
6173
6239
  function AsyncCombobox({ onSearch, debounceMs = 300, loadingText, minChars = 1, placeholder, onSelect, labels: customLabels, className }) {
6174
6240
  const labels = _objectSpread2({
6175
6241
  input: placeholder !== null && placeholder !== void 0 ? placeholder : "Search",
6242
+ error: "Search failed. Please try again.",
6243
+ retry: "Retry",
6176
6244
  loading: loadingText !== null && loadingText !== void 0 ? loadingText : "Loading…",
6177
6245
  noResults: "No results",
6178
6246
  placeholder: placeholder !== null && placeholder !== void 0 ? placeholder : "Search…"
6179
6247
  }, customLabels);
6180
6248
  const [query, setQuery] = React.useState("");
6181
- const [results, setResults] = React.useState([]);
6182
- const [loading, setLoading] = React.useState(false);
6183
- const timerRef = React.useRef(void 0);
6184
- const searchGenerationRef = React.useRef(0);
6185
- const handleInput = React.useCallback((event) => {
6186
- searchGenerationRef.current += 1;
6249
+ const inputRef = React.useRef(null);
6250
+ const { results, loading, failed, retry, invalidate } = useAsyncSearch({
6251
+ query,
6252
+ search: onSearch,
6253
+ enabled: query.length >= minChars,
6254
+ debounceMs
6255
+ });
6256
+ const handleInput = (event) => {
6257
+ inputRef.current = event.currentTarget;
6258
+ invalidate();
6187
6259
  setQuery(event.currentTarget.value);
6188
- }, []);
6189
- const handleValueChange = React.useCallback((value) => {
6190
- searchGenerationRef.current += 1;
6191
- if (timerRef.current) clearTimeout(timerRef.current);
6192
- setLoading(false);
6193
- setResults([]);
6260
+ };
6261
+ const handleValueChange = (value) => {
6262
+ invalidate();
6194
6263
  onSelect === null || onSelect === void 0 || onSelect(value);
6195
- }, [onSelect]);
6196
- React.useEffect(() => {
6197
- const generation = ++searchGenerationRef.current;
6198
- if (timerRef.current) clearTimeout(timerRef.current);
6199
- if (query.length < minChars) {
6200
- setResults([]);
6201
- setLoading(false);
6202
- return;
6203
- }
6204
- setLoading(true);
6205
- timerRef.current = setTimeout(async () => {
6206
- try {
6207
- const items = await onSearch(query);
6208
- if (searchGenerationRef.current !== generation) return;
6209
- setResults(items);
6210
- } finally {
6211
- if (searchGenerationRef.current === generation) setLoading(false);
6212
- }
6213
- }, debounceMs);
6214
- return () => {
6215
- if (timerRef.current) clearTimeout(timerRef.current);
6216
- };
6217
- }, [
6218
- query,
6219
- minChars,
6220
- debounceMs,
6221
- onSearch
6222
- ]);
6264
+ };
6223
6265
  return /* @__PURE__ */ jsxs(ComboboxRoot, {
6224
6266
  onValueChange: handleValueChange,
6225
6267
  "data-opt-id": "KAKTV",
6226
6268
  "data-opt-slug": "async-combobox.AsyncCombobox",
6227
- children: [/* @__PURE__ */ jsx(ComboboxInput, {
6269
+ children: [/* @__PURE__ */ jsx(ComboboxInput, _objectSpread2({
6228
6270
  className: cn(className),
6229
6271
  "aria-label": labels.input,
6230
6272
  "aria-busy": loading || void 0,
6231
6273
  placeholder: labels.placeholder,
6232
6274
  onInput: handleInput
6233
- }), /* @__PURE__ */ jsx(ComboboxPopover, { children: loading ? /* @__PURE__ */ jsxs("div", {
6275
+ }, failed ? {
6276
+ "aria-expanded": false,
6277
+ "aria-controls": void 0
6278
+ } : {})), /* @__PURE__ */ jsx(ComboboxPopover, _objectSpread2(_objectSpread2({}, failed ? { role: "presentation" } : {}), {}, { children: failed ? /* @__PURE__ */ jsxs("div", {
6279
+ role: "alert",
6280
+ className: "gap-element flex flex-col px-3 py-2 text-sm",
6281
+ children: [/* @__PURE__ */ jsx("span", { children: labels.error }), /* @__PURE__ */ jsx(Button, {
6282
+ variant: "secondary",
6283
+ size: "sm",
6284
+ onClick: () => {
6285
+ var _inputRef$current;
6286
+ retry();
6287
+ (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 || _inputRef$current.focus();
6288
+ },
6289
+ children: labels.retry
6290
+ })]
6291
+ }) : loading ? /* @__PURE__ */ jsxs("div", {
6234
6292
  className: "text-text-secondary gap-element flex items-center px-3 py-2 text-sm",
6235
6293
  role: "status",
6236
6294
  "aria-live": "polite",
@@ -6242,7 +6300,7 @@ function AsyncCombobox({ onSearch, debounceMs = 300, loadingText, minChars = 1,
6242
6300
  }) : results.length === 0 ? /* @__PURE__ */ jsx(ComboboxEmpty, { children: labels.noResults }) : results.map((item) => /* @__PURE__ */ jsx(ComboboxItem, {
6243
6301
  value: item,
6244
6302
  children: item
6245
- }, item)) })]
6303
+ }, item)) }))]
6246
6304
  });
6247
6305
  }
6248
6306
  //#endregion
@@ -8873,4 +8931,4 @@ const enStarRatingLabels = {
8873
8931
  };
8874
8932
  const enBreadcrumbLabels = { navAriaLabel: "Go to {label}" };
8875
8933
  //#endregion
8876
- export { ALL_COMPOUND_THEMES, AccordionContent, AccordionItem, AccordionRoot, AccordionTrigger, ActivityFeed, Alert, AlertBuilder, AlertDialogPanel, AppMenubar, AppShell, AsyncCombobox, AuditLog, AuditTimeline, AuthForm, Avatar, AvatarGroup, Badge, BlockLayout, BlockLayout as SurfaceLayout, BranchSelect, Breadcrumb, BulkActions, Button, COLOR_PRESETS, Callout, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CatalogCellControls, CatalogFrame, CatalogRowActions, ChatInput, ChatMessageList, ChatSidebar, Checkbox, CheckboxGroup, CircularProgress, CodeDiffViewer, CodeSnippetViewer, ColorPaletteDisplay, ColorPalettePicker, ColorPicker, ColumnToggler, ComboboxEmpty, ComboboxGroup, ComboboxGroupLabel, ComboboxInput, ComboboxItem, ComboboxPopover, ComboboxRoot, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandPalette, CommandPaletteTrigger, CommandSeparator, CommandShortcut, ComparisonSelector, Composite, CompositeItem, CompositeProvider, CompositeRow, CompositeZone, ConditionBuilder, ConfirmDialog, ConnectionIndicator, Container, ContentTabs, CopyButton, CriteriaBuilder, DEFAULT_PRESETS, DEFAULT_TIME_PRESETS, DashboardGrid, DataImportWizard, DataTable, DateRangePicker, DeploymentTimeline, DescriptionList, DesignGuidePanel, DialogBody, DialogDescription, DialogDisclosure, DialogDismiss, DialogFooter, DialogHeader, DialogHeading, DialogPanel, DialogRoot, DisclosureContent, DisclosureRoot, DisclosureTrigger, DomainTable, DrawerClose, DrawerPanel, DrawerRoot, DropdownContent, DropdownItem, DropdownMenu, DropdownSeparator, DropdownTrigger, DynamicFieldForm, EMPTY_QUERY, EMPTY_QUERY_FILTERS, EditorToolbar, EmptyState, EnvPanel, ErrorBoundary, EventIcon, EventMetaEditor, EventSparkline, EventTimeline, ExportButton, Expression, ExpressionGroup, FIELD_TYPE_TOKENS, FORCE_LIGHT_PRESETS, FORCE_LIGHT_PRESET_IDS, Facet, FacetGroup, FailureList, FaqAccordion, FeatureFlagPanel, FieldSidebar, FieldToken, FieldTokenLegend, FileUploadForm, FilterBar, FloatingActionBar, Flyout, FormCheckbox, FormColorPicker, FormControl, FormDateRangePicker, FormDescription, FormError, FormField, FormGroup, FormGroupLabel, FormIconPicker, FormInput, FormLabel, FormNumberInput, FormProvider, FormPush, FormRadio, FormRadioGroup, FormRemove, FormReset, FormRoot, FormSelect, FormSelectItem, FormSelectPopover, FormSlider, FormStarRating, FormSubmit, FormSwitch, FormTagInput, FormTextarea, GENERATED_THEME_ID_DEFAULT, GLOBAL_THEME_STYLE_ID, Heading, Highlight, IconPicker, Identity, InlineEdit, InlineEditTable, Input, InsightsPanel, InspectorLayout, KanbanBoard, Kbd, KeyPadMenu, KeyValueEditor, LiveRegion, LoadingOverlay, LogTable, Logo, MegaMenu, MenuButtonArrow, MenuItem, MenuItemCheckbox, MenuItemRadio, MenuPopover, MenuRoot, MenuSeparator, MenuTrigger, MenubarContainer, MenubarRoot, Meter, MetricsCard, NotificationCenter, NotificationToast, NumberInput, OPT_TEXT_PRIMARY, OPT_TEXT_SECONDARY, OptThemeControllerContext, OptThemeProvider, OtpField, POPULAR_ICONS, PageAside, PageHeader, Pagination, PopoverClose, PopoverContent, PopoverRoot, PopoverTrigger, Progress, ProjectSwitcher, PromptTemplate, PropertyExplorer, QueryBar, QueryFilterBar, QueryFiltersMenu, QueryHistoryList, QueryOutputPane, QueryResultChart, QueryResultsTable, QueryToolbar, QueryVariablesMenu, QueryWorkspace, QuickActions, Radio, RadioGroup, ReportBuilder, ReportWidget, ResizableHandle, ResizablePanel, ResizablePanelGroup, RichTextEditor, RouteFocusManager, SHADER_OVERLAY_PARAM_KEYS, SHADER_PARAM_FALLBACK, SHADER_PARAM_KEYS, SHADER_PRESETS, SHADER_PRESET_IDS, SaveQueryDialog, SavedFilters, SchemaTree, ScoreBreakdown, ScrollArea, SearchCombobox, Section, SegmentBuilder, SegmentedControl, SelectItem, SelectLabel, SelectPopover, SelectRoot, SelectTrigger, Separator, SettingsForm, ShaderSurface, Sidebar, SidebarNav, Skeleton, SkeletonAvatar, SkeletonCard, SkeletonTable, SkeletonText, Slider, SpatialNavProvider, Spinner, SqlEditor, StarRating, StatCard, StatusDot, StatusSelect, StepBuilder, SummaryRow, Switch, THEME_PALETTES, THEME_PRESET_IDS, THEME_REGISTRY, THEME_SPEC_STORAGE_KEY, THEME_TOKENS_STORAGE_KEY, Tab, TabList, TabPanel, TabsRoot, TagInput, TaskList, TeamMemberList, TemplatePicker, Text, TextTruncate, Textarea, ThemeSwitcher, TimeRangeControl, TimeRangeSelector, TimeSeriesPanel, ToastProvider, Toggle, ToggleGroup, ToolbarButton, ToolbarContainer, ToolbarRoot, ToolbarSeparator, Tooltip, TooltipAnchor, TooltipProvider, TreeTable, TrendChart, VALUELESS_OPERATORS, VerticalTabs, VirtualList, WebhookConfig, WidgetGrid, WizardForm, WorkflowCanvas, addClause, applyCellAction, buildTokenCache, cn, coerceThemeMode, computeGeneratedTokens, computeSpatialTargets, countActiveQueryFilters, createBlock, createBlock as createSurface, createThemeBootScript, criteriaBuilderDuplicate, criteriaBuilderDuplicateGroup, criteriaBuilderInsert, criteriaBuilderMove, criteriaBuilderRemove, criteriaBuilderRemoveGroup, criteriaGroupLetter, defaultQueryChartConfig, defineThemeOverrides, describeClause, enBreadcrumbLabels, enComboboxLabels, enStarRatingLabels, fieldValues, formatClause, formatOptDateTime, formatOptNumber, formatOptShortDate, formatOptTime, formatQuery, formatQueryCell, generatedTheme, getCompoundIdForSpec, getCompoundTheme, getShaderFragment, getShaderPreset, getThemeDescriptor, getTrappedContextRole, hasActiveQuery, hasActiveQueryFilters, isDescriptorSpec, isEmptyQuery, isForceLightSpec, isGeneratedSpec, isPresetSpec, isThemePresetId, isValidQueryVariableName, koBreadcrumbLabels, koComboboxLabels, koStarRatingLabels, matchesQuery, matchesQueryObject, numericResultColumns, parseQuery, parseQueryWithDiagnostics, presetTheme, queryFields, quoteValue, readStoredTheme, removeClause, replaceSqlPlaceholder, resolveDescriptor, resolveFieldType, resolveThemeMode, safeParseStoredSpec, safeParseStoredTokens, schemaValidator, serializeGeneratedTheme, serializeThemeRule, serializeTokenBody, shouldSkipArrow, splitSqlStatements, sqlPlaceholderNames, sqlStatementAtOffset, sqlUsesPlaceholder, toast, useAutoRefresh, useControlledState, useFieldValue, useFormContext, useFormStore, useInputId, useOptTheme, useOptThemeController, useOptionalOptTheme, useSidebar, useToast, withFieldValue, withoutField };
8934
+ export { ALL_COMPOUND_THEMES, AccordionContent, AccordionItem, AccordionRoot, AccordionTrigger, ActivityFeed, Alert, AlertBuilder, AlertDialogPanel, AppMenubar, AppShell, AsyncCombobox, AuditLog, AuditTimeline, AuthForm, Avatar, AvatarGroup, Badge, BlockLayout, BlockLayout as SurfaceLayout, BranchSelect, Breadcrumb, BulkActions, Button, COLOR_PRESETS, Callout, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CatalogCellControls, CatalogFrame, CatalogRowActions, ChatInput, ChatMessageList, ChatSidebar, Checkbox, CheckboxGroup, CircularProgress, CodeDiffViewer, CodeSnippetViewer, ColorPaletteDisplay, ColorPalettePicker, ColorPicker, ColumnToggler, ComboboxEmpty, ComboboxGroup, ComboboxGroupLabel, ComboboxInput, ComboboxItem, ComboboxPopover, ComboboxRoot, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandPalette, CommandPaletteTrigger, CommandSeparator, CommandShortcut, ComparisonSelector, Composite, CompositeItem, CompositeProvider, CompositeRow, CompositeZone, ConditionBuilder, ConfirmDialog, ConnectionIndicator, Container, ContentTabs, CopyButton, CriteriaBuilder, DEFAULT_PRESETS, DEFAULT_TIME_PRESETS, DashboardGrid, DataImportWizard, DataTable, DateRangePicker, DeploymentTimeline, DescriptionList, DesignGuidePanel, DialogBody, DialogDescription, DialogDisclosure, DialogDismiss, DialogFooter, DialogHeader, DialogHeading, DialogPanel, DialogRoot, DisclosureContent, DisclosureRoot, DisclosureTrigger, DomainTable, DrawerClose, DrawerPanel, DrawerRoot, DropdownContent, DropdownItem, DropdownMenu, DropdownSeparator, DropdownTrigger, DynamicFieldForm, EMPTY_QUERY, EMPTY_QUERY_FILTERS, EditorToolbar, EmptyState, EnvPanel, ErrorBoundary, EventIcon, EventMetaEditor, EventSparkline, EventTimeline, ExportButton, Expression, ExpressionGroup, FIELD_TYPE_TOKENS, FORCE_LIGHT_PRESETS, FORCE_LIGHT_PRESET_IDS, Facet, FacetGroup, FailureList, FaqAccordion, FeatureFlagPanel, FieldSidebar, FieldToken, FieldTokenLegend, FileUploadForm, FilterBar, FloatingActionBar, Flyout, FormCheckbox, FormColorPicker, FormControl, FormDateRangePicker, FormDescription, FormError, FormField, FormGroup, FormGroupLabel, FormIconPicker, FormInput, FormLabel, FormNumberInput, FormProvider, FormPush, FormRadio, FormRadioGroup, FormRemove, FormReset, FormRoot, FormSelect, FormSelectItem, FormSelectPopover, FormSlider, FormStarRating, FormSubmit, FormSwitch, FormTagInput, FormTextarea, GENERATED_THEME_ID_DEFAULT, GLOBAL_THEME_STYLE_ID, Heading, Highlight, IconPicker, Identity, InlineEdit, InlineEditTable, Input, InsightsPanel, InspectorLayout, KanbanBoard, Kbd, KeyPadMenu, KeyValueEditor, LiveRegion, LoadingOverlay, LogTable, Logo, MegaMenu, MenuButtonArrow, MenuItem, MenuItemCheckbox, MenuItemRadio, MenuPopover, MenuRoot, MenuSeparator, MenuTrigger, MenubarContainer, MenubarRoot, Meter, MetricsCard, NotificationCenter, NotificationToast, NumberInput, OPT_TEXT_PRIMARY, OPT_TEXT_SECONDARY, OptThemeControllerContext, OptThemeProvider, OtpField, POPULAR_ICONS, PageAside, PageHeader, Pagination, PopoverClose, PopoverContent, PopoverRoot, PopoverTrigger, Progress, ProjectSwitcher, PromptTemplate, PropertyExplorer, QueryBar, QueryFilterBar, QueryFiltersMenu, QueryHistoryList, QueryOutputPane, QueryResultChart, QueryResultsTable, QueryToolbar, QueryVariablesMenu, QueryWorkspace, QuickActions, Radio, RadioGroup, ReplayPlayerLayout, ReplayScrubber, ReplayTransport, ReportBuilder, ReportWidget, ResizableHandle, ResizablePanel, ResizablePanelGroup, RichTextEditor, RouteFocusManager, SHADER_OVERLAY_PARAM_KEYS, SHADER_PARAM_FALLBACK, SHADER_PARAM_KEYS, SHADER_PRESETS, SHADER_PRESET_IDS, SaveQueryDialog, SavedFilters, SchemaTree, ScoreBreakdown, ScrollArea, SearchCombobox, Section, SegmentBuilder, SegmentedControl, SelectItem, SelectLabel, SelectPopover, SelectRoot, SelectTrigger, Separator, SettingsForm, ShaderSurface, Sidebar, SidebarNav, Skeleton, SkeletonAvatar, SkeletonCard, SkeletonTable, SkeletonText, Slider, SpatialNavProvider, Spinner, SqlEditor, StarRating, StatCard, StatusDot, StatusSelect, StepBuilder, SummaryRow, Switch, THEME_PALETTES, THEME_PRESET_IDS, THEME_REGISTRY, THEME_SPEC_STORAGE_KEY, THEME_TOKENS_STORAGE_KEY, Tab, TabList, TabPanel, TabsRoot, TagInput, TaskList, TeamMemberList, TemplatePicker, Text, TextTruncate, Textarea, ThemeSwitcher, TimeRangeControl, TimeRangeSelector, TimeSeriesPanel, ToastProvider, Toggle, ToggleGroup, ToolbarButton, ToolbarContainer, ToolbarRoot, ToolbarSeparator, Tooltip, TooltipAnchor, TooltipProvider, TreeTable, TrendChart, VALUELESS_OPERATORS, VerticalTabs, VirtualList, WebhookConfig, WidgetGrid, WizardForm, WorkflowCanvas, addClause, applyCellAction, buildTokenCache, cn, coerceThemeMode, computeGeneratedTokens, computeSpatialTargets, countActiveQueryFilters, createBlock, createBlock as createSurface, createThemeBootScript, criteriaBuilderDuplicate, criteriaBuilderDuplicateGroup, criteriaBuilderInsert, criteriaBuilderMove, criteriaBuilderRemove, criteriaBuilderRemoveGroup, criteriaGroupLetter, defaultQueryChartConfig, defineThemeOverrides, describeClause, enBreadcrumbLabels, enComboboxLabels, enStarRatingLabels, fieldValues, formatClause, formatOptDateTime, formatOptNumber, formatOptShortDate, formatOptTime, formatQuery, formatQueryCell, formatReplayElapsed, generatedTheme, getCompoundIdForSpec, getCompoundTheme, getShaderFragment, getShaderPreset, getThemeDescriptor, getTrappedContextRole, groupReplayMarkers, hasActiveQuery, hasActiveQueryFilters, isDescriptorSpec, isEmptyQuery, isForceLightSpec, isGeneratedSpec, isPresetSpec, isThemePresetId, isValidQueryVariableName, koBreadcrumbLabels, koComboboxLabels, koStarRatingLabels, matchesQuery, matchesQueryObject, numericResultColumns, parseQuery, parseQueryWithDiagnostics, presetTheme, queryFields, quoteValue, readStoredTheme, removeClause, replaceSqlPlaceholder, replayShortcutKey, resolveDescriptor, resolveFieldType, resolveThemeMode, safeParseStoredSpec, safeParseStoredTokens, schemaValidator, serializeGeneratedTheme, serializeThemeRule, serializeTokenBody, shouldSkipArrow, splitSqlStatements, sqlPlaceholderNames, sqlStatementAtOffset, sqlUsesPlaceholder, toast, useAutoRefresh, useControlledState, useFieldValue, useFormContext, useFormStore, useInputId, useOptTheme, useOptThemeController, useOptionalOptTheme, useSidebar, useToast, withFieldValue, withoutField };