@reopt-ai/opt-ui 1.13.0 → 1.14.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 (37) hide show
  1. package/COMPONENT_CATALOG.md +426 -58
  2. package/README.md +9 -7
  3. package/dist/core/index.cjs +1 -1
  4. package/dist/core/index.d.cts +2 -2
  5. package/dist/core/index.d.ts +2 -2
  6. package/dist/core/index.js +1 -1
  7. package/dist/docs/02-components/01-core.md +225 -26
  8. package/dist/docs/02-components/02-visuals.md +1 -1
  9. package/dist/docs/02-components/03-shells.md +203 -32
  10. package/dist/docs/02-components/04-surfaces.md +1 -1
  11. package/dist/docs/02-components/index.md +4 -4
  12. package/dist/{field-sidebar-Dz7J4ett.d.ts → field-sidebar-CJ4HxP8D.d.cts} +1 -1
  13. package/dist/{field-sidebar-D-rwuN_w.d.cts → field-sidebar-DnhpcT2A.d.ts} +1 -1
  14. package/dist/{field-sidebar-CxxSK4JO.cjs → field-sidebar-ePqFX6MN.cjs} +13 -12
  15. package/dist/{field-sidebar-CRdToHRO.js → field-sidebar-mSVCMAZp.js} +13 -12
  16. package/dist/id-registry.cjs +8 -0
  17. package/dist/id-registry.js +8 -0
  18. package/dist/id-registry.json +17 -0
  19. package/dist/index.cjs +756 -51
  20. package/dist/index.d.cts +196 -10
  21. package/dist/index.d.ts +196 -10
  22. package/dist/index.js +750 -53
  23. package/dist/{key-pad-menu-0KWOnELe.cjs → key-pad-menu-BgtSL3xe.cjs} +9 -6
  24. package/dist/{key-pad-menu-DMmbQ1jF.js → key-pad-menu-CqFI6la9.js} +9 -6
  25. package/dist/{key-pad-menu-BOVu97bj.d.cts → key-pad-menu-D6pYzaj-.d.cts} +12 -3
  26. package/dist/{key-pad-menu-NlZ9zNF8.d.ts → key-pad-menu-Yh7Fpb8m.d.ts} +12 -3
  27. package/dist/meta.cjs +430 -19
  28. package/dist/meta.js +430 -19
  29. package/dist/shells/index.cjs +1 -1
  30. package/dist/shells/index.d.cts +1 -1
  31. package/dist/shells/index.d.ts +1 -1
  32. package/dist/shells/index.js +1 -1
  33. package/dist/{text-truncate-eMzvU_7k.d.cts → text-truncate-Bbul-jMD.d.cts} +1 -30
  34. package/dist/{text-truncate-eMzvU_7k.d.ts → text-truncate-Bbul-jMD.d.ts} +1 -30
  35. package/dist/theme/server.d.cts +2 -2
  36. package/dist/theme/server.d.ts +2 -2
  37. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  "use client";
2
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-DMmbQ1jF.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-CRdToHRO.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";
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";
8
- import { Check, ChevronDown, CircleCheck, Copy, FilePen, GitMerge, MessageSquare, MoreHorizontal, Pencil, Rocket, Search, Sparkles, Trash2, User, X } from "lucide-react";
8
+ import { ArrowDown, ArrowUp, Check, ChevronDown, CircleCheck, Copy, FilePen, GitMerge, MessageSquare, MoreHorizontal, Pencil, Plus, Rocket, Search, Sparkles, Trash2, TriangleAlert, User, X } from "lucide-react";
9
9
  import { EventSparkline, MetricsCard, ReportWidget, TrendChart } from "@reopt-ai/opt-charts";
10
10
  import { matchSorter } from "match-sorter";
11
11
  import { usePathname } from "next/navigation";
@@ -92,7 +92,7 @@ const _excluded = [
92
92
  "disabled",
93
93
  "onClick"
94
94
  ];
95
- const defaultLabels$33 = {
95
+ const defaultLabels$34 = {
96
96
  copy: "복사",
97
97
  copied: "복사됨",
98
98
  failed: "복사할 수 없습니다"
@@ -139,7 +139,7 @@ const stateTone = {
139
139
  */
140
140
  function CopyButton(_ref) {
141
141
  let { value, variant = "icon", size = "md", feedbackDuration = 1500, onCopy, labels: customLabels, className, disabled, onClick } = _ref, props = _objectWithoutProperties(_ref, _excluded);
142
- const labels = _objectSpread2(_objectSpread2({}, defaultLabels$33), customLabels);
142
+ const labels = _objectSpread2(_objectSpread2({}, defaultLabels$34), customLabels);
143
143
  const [state, setState] = useState("idle");
144
144
  const timer = useRef(null);
145
145
  useEffect(() => () => {
@@ -264,7 +264,7 @@ function PageAside({ header, children, footer, widthClassName = "w-60", label, h
264
264
  PageAside.displayName = "PageAside";
265
265
  //#endregion
266
266
  //#region src/shells/task-list.tsx
267
- const defaultLabels$32 = {
267
+ const defaultLabels$33 = {
268
268
  title: "작업 목록",
269
269
  emptyMessage: "작업이 없습니다",
270
270
  completedOf: "{completed}/{total} 완료",
@@ -284,9 +284,9 @@ const defaultLabels$32 = {
284
284
  };
285
285
  /** Renders the task list component. */
286
286
  function TaskList({ tasks, title, onTaskClick, onTaskStatusChange, emptyMessage, showSubtasks = false, maxItems, labels: customLabels, className }) {
287
- const labels = _objectSpread2(_objectSpread2(_objectSpread2({}, defaultLabels$32), customLabels), {}, {
288
- priority: _objectSpread2(_objectSpread2({}, defaultLabels$32.priority), customLabels === null || customLabels === void 0 ? void 0 : customLabels.priority),
289
- status: _objectSpread2(_objectSpread2({}, defaultLabels$32.status), customLabels === null || customLabels === void 0 ? void 0 : customLabels.status)
287
+ const labels = _objectSpread2(_objectSpread2(_objectSpread2({}, defaultLabels$33), customLabels), {}, {
288
+ priority: _objectSpread2(_objectSpread2({}, defaultLabels$33.priority), customLabels === null || customLabels === void 0 ? void 0 : customLabels.priority),
289
+ status: _objectSpread2(_objectSpread2({}, defaultLabels$33.status), customLabels === null || customLabels === void 0 ? void 0 : customLabels.status)
290
290
  });
291
291
  const displayTitle = title !== null && title !== void 0 ? title : labels.title;
292
292
  const displayEmptyMessage = emptyMessage !== null && emptyMessage !== void 0 ? emptyMessage : labels.emptyMessage;
@@ -444,7 +444,7 @@ function TaskList({ tasks, title, onTaskClick, onTaskStatusChange, emptyMessage,
444
444
  }
445
445
  //#endregion
446
446
  //#region src/shells/activity-feed.tsx
447
- const defaultLabels$31 = {
447
+ const defaultLabels$32 = {
448
448
  title: "활동 피드",
449
449
  emptyMessage: "활동이 없습니다",
450
450
  moreItems: "{count}개 더 보기",
@@ -494,24 +494,24 @@ const variantBorder = {
494
494
  function ActivityFeed({ activities, title, maxItems, onActivityClick, onShowMore, emptyMessage, labels: customLabels, locale = "ko-KR", loading = false, layout = "list", renderActions, className }) {
495
495
  var _customLabels$timeAgo, _customLabels$timeAgo2, _customLabels$timeAgo3, _customLabels$timeAgo4, _customLabels$timeAgo5, _customLabels$timeAgo6, _customLabels$timeAgo7, _customLabels$timeAgo8, _customLabels$activit, _customLabels$activit2, _customLabels$activit3, _customLabels$activit4, _customLabels$activit5, _customLabels$activit6, _customLabels$activit7, _customLabels$activit8, _customLabels$activit9, _customLabels$activit10, _customLabels$activit11, _customLabels$activit12, _customLabels$activit13, _customLabels$activit14, _customLabels$title, _customLabels$emptyMe, _customLabels$moreIte;
496
496
  const mergedTimeAgo = {
497
- justNow: (_customLabels$timeAgo = customLabels === null || customLabels === void 0 || (_customLabels$timeAgo2 = customLabels.timeAgo) === null || _customLabels$timeAgo2 === void 0 ? void 0 : _customLabels$timeAgo2.justNow) !== null && _customLabels$timeAgo !== void 0 ? _customLabels$timeAgo : defaultLabels$31.timeAgo.justNow,
498
- minutesAgo: (_customLabels$timeAgo3 = customLabels === null || customLabels === void 0 || (_customLabels$timeAgo4 = customLabels.timeAgo) === null || _customLabels$timeAgo4 === void 0 ? void 0 : _customLabels$timeAgo4.minutesAgo) !== null && _customLabels$timeAgo3 !== void 0 ? _customLabels$timeAgo3 : defaultLabels$31.timeAgo.minutesAgo,
499
- hoursAgo: (_customLabels$timeAgo5 = customLabels === null || customLabels === void 0 || (_customLabels$timeAgo6 = customLabels.timeAgo) === null || _customLabels$timeAgo6 === void 0 ? void 0 : _customLabels$timeAgo6.hoursAgo) !== null && _customLabels$timeAgo5 !== void 0 ? _customLabels$timeAgo5 : defaultLabels$31.timeAgo.hoursAgo,
500
- daysAgo: (_customLabels$timeAgo7 = customLabels === null || customLabels === void 0 || (_customLabels$timeAgo8 = customLabels.timeAgo) === null || _customLabels$timeAgo8 === void 0 ? void 0 : _customLabels$timeAgo8.daysAgo) !== null && _customLabels$timeAgo7 !== void 0 ? _customLabels$timeAgo7 : defaultLabels$31.timeAgo.daysAgo
497
+ justNow: (_customLabels$timeAgo = customLabels === null || customLabels === void 0 || (_customLabels$timeAgo2 = customLabels.timeAgo) === null || _customLabels$timeAgo2 === void 0 ? void 0 : _customLabels$timeAgo2.justNow) !== null && _customLabels$timeAgo !== void 0 ? _customLabels$timeAgo : defaultLabels$32.timeAgo.justNow,
498
+ minutesAgo: (_customLabels$timeAgo3 = customLabels === null || customLabels === void 0 || (_customLabels$timeAgo4 = customLabels.timeAgo) === null || _customLabels$timeAgo4 === void 0 ? void 0 : _customLabels$timeAgo4.minutesAgo) !== null && _customLabels$timeAgo3 !== void 0 ? _customLabels$timeAgo3 : defaultLabels$32.timeAgo.minutesAgo,
499
+ hoursAgo: (_customLabels$timeAgo5 = customLabels === null || customLabels === void 0 || (_customLabels$timeAgo6 = customLabels.timeAgo) === null || _customLabels$timeAgo6 === void 0 ? void 0 : _customLabels$timeAgo6.hoursAgo) !== null && _customLabels$timeAgo5 !== void 0 ? _customLabels$timeAgo5 : defaultLabels$32.timeAgo.hoursAgo,
500
+ daysAgo: (_customLabels$timeAgo7 = customLabels === null || customLabels === void 0 || (_customLabels$timeAgo8 = customLabels.timeAgo) === null || _customLabels$timeAgo8 === void 0 ? void 0 : _customLabels$timeAgo8.daysAgo) !== null && _customLabels$timeAgo7 !== void 0 ? _customLabels$timeAgo7 : defaultLabels$32.timeAgo.daysAgo
501
501
  };
502
502
  const mergedActivityVerbs = {
503
- created: (_customLabels$activit = customLabels === null || customLabels === void 0 || (_customLabels$activit2 = customLabels.activityVerbs) === null || _customLabels$activit2 === void 0 ? void 0 : _customLabels$activit2.created) !== null && _customLabels$activit !== void 0 ? _customLabels$activit : defaultLabels$31.activityVerbs.created,
504
- updated: (_customLabels$activit3 = customLabels === null || customLabels === void 0 || (_customLabels$activit4 = customLabels.activityVerbs) === null || _customLabels$activit4 === void 0 ? void 0 : _customLabels$activit4.updated) !== null && _customLabels$activit3 !== void 0 ? _customLabels$activit3 : defaultLabels$31.activityVerbs.updated,
505
- completed: (_customLabels$activit5 = customLabels === null || customLabels === void 0 || (_customLabels$activit6 = customLabels.activityVerbs) === null || _customLabels$activit6 === void 0 ? void 0 : _customLabels$activit6.completed) !== null && _customLabels$activit5 !== void 0 ? _customLabels$activit5 : defaultLabels$31.activityVerbs.completed,
506
- commented: (_customLabels$activit7 = customLabels === null || customLabels === void 0 || (_customLabels$activit8 = customLabels.activityVerbs) === null || _customLabels$activit8 === void 0 ? void 0 : _customLabels$activit8.commented) !== null && _customLabels$activit7 !== void 0 ? _customLabels$activit7 : defaultLabels$31.activityVerbs.commented,
507
- assigned: (_customLabels$activit9 = customLabels === null || customLabels === void 0 || (_customLabels$activit10 = customLabels.activityVerbs) === null || _customLabels$activit10 === void 0 ? void 0 : _customLabels$activit10.assigned) !== null && _customLabels$activit9 !== void 0 ? _customLabels$activit9 : defaultLabels$31.activityVerbs.assigned,
508
- deployed: (_customLabels$activit11 = customLabels === null || customLabels === void 0 || (_customLabels$activit12 = customLabels.activityVerbs) === null || _customLabels$activit12 === void 0 ? void 0 : _customLabels$activit12.deployed) !== null && _customLabels$activit11 !== void 0 ? _customLabels$activit11 : defaultLabels$31.activityVerbs.deployed,
509
- merged: (_customLabels$activit13 = customLabels === null || customLabels === void 0 || (_customLabels$activit14 = customLabels.activityVerbs) === null || _customLabels$activit14 === void 0 ? void 0 : _customLabels$activit14.merged) !== null && _customLabels$activit13 !== void 0 ? _customLabels$activit13 : defaultLabels$31.activityVerbs.merged
503
+ created: (_customLabels$activit = customLabels === null || customLabels === void 0 || (_customLabels$activit2 = customLabels.activityVerbs) === null || _customLabels$activit2 === void 0 ? void 0 : _customLabels$activit2.created) !== null && _customLabels$activit !== void 0 ? _customLabels$activit : defaultLabels$32.activityVerbs.created,
504
+ updated: (_customLabels$activit3 = customLabels === null || customLabels === void 0 || (_customLabels$activit4 = customLabels.activityVerbs) === null || _customLabels$activit4 === void 0 ? void 0 : _customLabels$activit4.updated) !== null && _customLabels$activit3 !== void 0 ? _customLabels$activit3 : defaultLabels$32.activityVerbs.updated,
505
+ completed: (_customLabels$activit5 = customLabels === null || customLabels === void 0 || (_customLabels$activit6 = customLabels.activityVerbs) === null || _customLabels$activit6 === void 0 ? void 0 : _customLabels$activit6.completed) !== null && _customLabels$activit5 !== void 0 ? _customLabels$activit5 : defaultLabels$32.activityVerbs.completed,
506
+ commented: (_customLabels$activit7 = customLabels === null || customLabels === void 0 || (_customLabels$activit8 = customLabels.activityVerbs) === null || _customLabels$activit8 === void 0 ? void 0 : _customLabels$activit8.commented) !== null && _customLabels$activit7 !== void 0 ? _customLabels$activit7 : defaultLabels$32.activityVerbs.commented,
507
+ assigned: (_customLabels$activit9 = customLabels === null || customLabels === void 0 || (_customLabels$activit10 = customLabels.activityVerbs) === null || _customLabels$activit10 === void 0 ? void 0 : _customLabels$activit10.assigned) !== null && _customLabels$activit9 !== void 0 ? _customLabels$activit9 : defaultLabels$32.activityVerbs.assigned,
508
+ deployed: (_customLabels$activit11 = customLabels === null || customLabels === void 0 || (_customLabels$activit12 = customLabels.activityVerbs) === null || _customLabels$activit12 === void 0 ? void 0 : _customLabels$activit12.deployed) !== null && _customLabels$activit11 !== void 0 ? _customLabels$activit11 : defaultLabels$32.activityVerbs.deployed,
509
+ merged: (_customLabels$activit13 = customLabels === null || customLabels === void 0 || (_customLabels$activit14 = customLabels.activityVerbs) === null || _customLabels$activit14 === void 0 ? void 0 : _customLabels$activit14.merged) !== null && _customLabels$activit13 !== void 0 ? _customLabels$activit13 : defaultLabels$32.activityVerbs.merged
510
510
  };
511
511
  const labels = {
512
- title: (_customLabels$title = customLabels === null || customLabels === void 0 ? void 0 : customLabels.title) !== null && _customLabels$title !== void 0 ? _customLabels$title : defaultLabels$31.title,
513
- emptyMessage: (_customLabels$emptyMe = customLabels === null || customLabels === void 0 ? void 0 : customLabels.emptyMessage) !== null && _customLabels$emptyMe !== void 0 ? _customLabels$emptyMe : defaultLabels$31.emptyMessage,
514
- moreItems: (_customLabels$moreIte = customLabels === null || customLabels === void 0 ? void 0 : customLabels.moreItems) !== null && _customLabels$moreIte !== void 0 ? _customLabels$moreIte : defaultLabels$31.moreItems,
512
+ title: (_customLabels$title = customLabels === null || customLabels === void 0 ? void 0 : customLabels.title) !== null && _customLabels$title !== void 0 ? _customLabels$title : defaultLabels$32.title,
513
+ emptyMessage: (_customLabels$emptyMe = customLabels === null || customLabels === void 0 ? void 0 : customLabels.emptyMessage) !== null && _customLabels$emptyMe !== void 0 ? _customLabels$emptyMe : defaultLabels$32.emptyMessage,
514
+ moreItems: (_customLabels$moreIte = customLabels === null || customLabels === void 0 ? void 0 : customLabels.moreItems) !== null && _customLabels$moreIte !== void 0 ? _customLabels$moreIte : defaultLabels$32.moreItems,
515
515
  timeAgo: mergedTimeAgo,
516
516
  activityVerbs: mergedActivityVerbs
517
517
  };
@@ -639,13 +639,13 @@ function ActivityFeed({ activities, title, maxItems, onActivityClick, onShowMore
639
639
  ActivityFeed.displayName = "ActivityFeed";
640
640
  //#endregion
641
641
  //#region src/shells/filter-bar.tsx
642
- const defaultLabels$30 = {
642
+ const defaultLabels$31 = {
643
643
  clearAll: "필터 초기화",
644
644
  searchPlaceholder: "검색..."
645
645
  };
646
646
  /** Renders the filter bar component. */
647
647
  function FilterBar({ filters, onFilterChange, onDateRangeChange, onClearAll, labels: customLabels, presetActions, className }) {
648
- const labels = _objectSpread2(_objectSpread2({}, defaultLabels$30), customLabels);
648
+ const labels = _objectSpread2(_objectSpread2({}, defaultLabels$31), customLabels);
649
649
  const [searchValues, setSearchValues] = useState({});
650
650
  const [tagInputValues, setTagInputValues] = useState({});
651
651
  const [multiSelectOpen, setMultiSelectOpen] = useState({});
@@ -871,10 +871,10 @@ function matchesShortcut(event, shortcut) {
871
871
  if (requiresMeta && !event.metaKey) return false;
872
872
  return event.key.toLowerCase() === key;
873
873
  }
874
- const defaultLabels$29 = { title: "빠른 작업" };
874
+ const defaultLabels$30 = { title: "빠른 작업" };
875
875
  /** Renders the quick actions component. */
876
876
  function QuickActions({ actions, title, layout = "grid", columns = 3, showDescriptionInGrid = false, bindShortcuts = false, labels: customLabels, className }) {
877
- const labels = _objectSpread2(_objectSpread2({}, defaultLabels$29), customLabels);
877
+ const labels = _objectSpread2(_objectSpread2({}, defaultLabels$30), customLabels);
878
878
  const displayTitle = title !== null && title !== void 0 ? title : labels.title;
879
879
  const titleId = useId();
880
880
  useEffect(() => {
@@ -952,7 +952,7 @@ function QuickActions({ actions, title, layout = "grid", columns = 3, showDescri
952
952
  QuickActions.displayName = "QuickActions";
953
953
  //#endregion
954
954
  //#region src/shells/team-member-list.tsx
955
- const defaultLabels$28 = {
955
+ const defaultLabels$29 = {
956
956
  title: "팀원",
957
957
  emptyMessage: "팀원이 없습니다",
958
958
  onlineCount: "{online}/{total} 온라인",
@@ -973,7 +973,7 @@ const statusDot = {
973
973
  };
974
974
  /** Renders the team member list component. */
975
975
  function TeamMemberList({ members, title, layout = "list", maxDisplay, onMemberClick, onShowMore, emptyMessage, labels: customLabels, className }) {
976
- const labels = _objectSpread2(_objectSpread2(_objectSpread2({}, defaultLabels$28), customLabels), {}, { status: _objectSpread2(_objectSpread2({}, defaultLabels$28.status), customLabels === null || customLabels === void 0 ? void 0 : customLabels.status) });
976
+ const labels = _objectSpread2(_objectSpread2(_objectSpread2({}, defaultLabels$29), customLabels), {}, { status: _objectSpread2(_objectSpread2({}, defaultLabels$29.status), customLabels === null || customLabels === void 0 ? void 0 : customLabels.status) });
977
977
  const displayTitle = title !== null && title !== void 0 ? title : labels.title;
978
978
  const displayEmptyMessage = emptyMessage !== null && emptyMessage !== void 0 ? emptyMessage : labels.emptyMessage;
979
979
  const titleId = useId();
@@ -1873,7 +1873,7 @@ const COLOR_PRESETS = [
1873
1873
  "#f97316",
1874
1874
  "#14b8a6"
1875
1875
  ];
1876
- const defaultLabels$27 = {
1876
+ const defaultLabels$28 = {
1877
1877
  eventLabelPrefix: "Event",
1878
1878
  defaultAriaLabel: "Event icon"
1879
1879
  };
@@ -1904,7 +1904,7 @@ function getEventIconStyle(color) {
1904
1904
  /** Renders the event icon component. */
1905
1905
  function EventIcon({ icon, color, size = "md", className, labels: customLabels }) {
1906
1906
  var _iconEntry$label;
1907
- const labels = _objectSpread2(_objectSpread2({}, defaultLabels$27), customLabels);
1907
+ const labels = _objectSpread2(_objectSpread2({}, defaultLabels$28), customLabels);
1908
1908
  const sizes = SIZE_MAP[size];
1909
1909
  const resolvedColor = (color === null || color === void 0 ? void 0 : color.trim()) ? color : void 0;
1910
1910
  const iconEntry = typeof icon === "string" ? getIconRegistryEntry(icon) : void 0;
@@ -1996,14 +1996,14 @@ function ConnectionIndicator({ status, tone, label, showLabel = true, pulse, cla
1996
1996
  ConnectionIndicator.displayName = "ConnectionIndicator";
1997
1997
  //#endregion
1998
1998
  //#region src/shells/floating-action-bar.tsx
1999
- const defaultLabels$26 = {
1999
+ const defaultLabels$27 = {
2000
2000
  toolbarAriaLabel: "Actions",
2001
2001
  selectedLabel: (count) => `${count} selected`,
2002
2002
  dismissAriaLabel: "Dismiss"
2003
2003
  };
2004
2004
  /** Renders the floating action bar component. */
2005
2005
  function FloatingActionBar({ actions, selectedCount, onAction, onDismiss, className, labels: customLabels }) {
2006
- const labels = _objectSpread2(_objectSpread2({}, defaultLabels$26), customLabels);
2006
+ const labels = _objectSpread2(_objectSpread2({}, defaultLabels$27), customLabels);
2007
2007
  if (actions.length === 0) return null;
2008
2008
  return /* @__PURE__ */ jsxs("div", {
2009
2009
  role: "toolbar",
@@ -2040,7 +2040,7 @@ function FloatingActionBar({ actions, selectedCount, onAction, onDismiss, classN
2040
2040
  FloatingActionBar.displayName = "FloatingActionBar";
2041
2041
  //#endregion
2042
2042
  //#region src/shells/template-picker.tsx
2043
- const defaultLabels$25 = {
2043
+ const defaultLabels$26 = {
2044
2044
  ariaLabel: "Templates",
2045
2045
  defaultCategory: "General",
2046
2046
  searchPlaceholder: "Search templates...",
@@ -2048,7 +2048,7 @@ const defaultLabels$25 = {
2048
2048
  };
2049
2049
  /** Renders the template picker component. */
2050
2050
  function TemplatePicker({ templates, selected, onSelect, labels: customLabels, showSearch = false, className }) {
2051
- const labels = _objectSpread2(_objectSpread2({}, defaultLabels$25), customLabels);
2051
+ const labels = _objectSpread2(_objectSpread2({}, defaultLabels$26), customLabels);
2052
2052
  const [search, setSearch] = React.useState("");
2053
2053
  const filtered = React.useMemo(() => {
2054
2054
  if (!showSearch || !search) return templates;
@@ -2134,7 +2134,7 @@ function TemplatePicker({ templates, selected, onSelect, labels: customLabels, s
2134
2134
  TemplatePicker.displayName = "TemplatePicker";
2135
2135
  //#endregion
2136
2136
  //#region src/shells/code-snippet-viewer.tsx
2137
- const defaultLabels$24 = {
2137
+ const defaultLabels$25 = {
2138
2138
  copy: "Copy",
2139
2139
  copied: "Copied!",
2140
2140
  codeRegion: "Code snippet"
@@ -2172,7 +2172,7 @@ const syntaxThemeClasses = {
2172
2172
  /** Renders the code snippet viewer component. */
2173
2173
  function CodeSnippetViewer({ code, language = "text", title, showLineNumbers = true, showCopyButton = true, maxHeight = 400, syntaxTheme = "default", className, labels: customLabels }) {
2174
2174
  var _syntaxThemeClasses$s;
2175
- const labels = _objectSpread2(_objectSpread2({}, defaultLabels$24), customLabels);
2175
+ const labels = _objectSpread2(_objectSpread2({}, defaultLabels$25), customLabels);
2176
2176
  const [copied, setCopied] = React.useState(false);
2177
2177
  const lines = code.split("\n");
2178
2178
  const theme = (_syntaxThemeClasses$s = syntaxThemeClasses[syntaxTheme]) !== null && _syntaxThemeClasses$s !== void 0 ? _syntaxThemeClasses$s : syntaxThemeClasses.default;
@@ -2224,7 +2224,7 @@ function CodeSnippetViewer({ code, language = "text", title, showLineNumbers = t
2224
2224
  CodeSnippetViewer.displayName = "CodeSnippetViewer";
2225
2225
  //#endregion
2226
2226
  //#region src/shells/property-explorer.tsx
2227
- const defaultLabels$23 = {
2227
+ const defaultLabels$24 = {
2228
2228
  searchPlaceholder: "Search properties...",
2229
2229
  noPropertiesFound: "No properties found",
2230
2230
  edit: (property) => `${property} 편집`,
@@ -2232,7 +2232,7 @@ const defaultLabels$23 = {
2232
2232
  };
2233
2233
  /** Renders the property explorer component. */
2234
2234
  function PropertyExplorer({ groups, onSelect, onEdit, className, labels: customLabels }) {
2235
- const labels = _objectSpread2(_objectSpread2({}, defaultLabels$23), customLabels);
2235
+ const labels = _objectSpread2(_objectSpread2({}, defaultLabels$24), customLabels);
2236
2236
  const [search, setSearch] = React.useState("");
2237
2237
  const filtered = React.useMemo(() => {
2238
2238
  if (!search) return groups;
@@ -2518,7 +2518,7 @@ function skipBlockComment(text, from) {
2518
2518
  }
2519
2519
  //#endregion
2520
2520
  //#region src/shells/alert-builder.tsx
2521
- const defaultLabels$22 = {
2521
+ const defaultLabels$23 = {
2522
2522
  alertNameLabel: "Alert name",
2523
2523
  conditionsLabel: "Conditions",
2524
2524
  metricLabel: "Metric",
@@ -2589,7 +2589,7 @@ function AlertBuilder({ value, onChange, metrics = [
2589
2589
  ], labels: customLabels, className }) {
2590
2590
  const resolvedMetrics = eventOptions ? eventOptions.map((e) => e.id) : metrics;
2591
2591
  const metricLabelMap = eventOptions ? Object.fromEntries(eventOptions.map((e) => [e.id, e.name])) : null;
2592
- const labels = _objectSpread2(_objectSpread2({}, defaultLabels$22), customLabels);
2592
+ const labels = _objectSpread2(_objectSpread2({}, defaultLabels$23), customLabels);
2593
2593
  const alertNameId = React.useId();
2594
2594
  const conditionsId = React.useId();
2595
2595
  const checkFrequencyId = React.useId();
@@ -2744,7 +2744,7 @@ function AlertBuilder({ value, onChange, metrics = [
2744
2744
  AlertBuilder.displayName = "AlertBuilder";
2745
2745
  //#endregion
2746
2746
  //#region src/shells/event-meta-editor.tsx
2747
- const defaultLabels$21 = {
2747
+ const defaultLabels$22 = {
2748
2748
  icon: "Icon",
2749
2749
  color: "Color",
2750
2750
  name: "Event name",
@@ -2762,7 +2762,7 @@ const defaultLabels$21 = {
2762
2762
  };
2763
2763
  /** Renders the event meta editor component. */
2764
2764
  function EventMetaEditor({ value, onChange, icons, sections, footer, className, labels: customLabels }) {
2765
- const labels = _objectSpread2(_objectSpread2({}, defaultLabels$21), customLabels);
2765
+ const labels = _objectSpread2(_objectSpread2({}, defaultLabels$22), customLabels);
2766
2766
  const hasTags = value.tags.length > 0;
2767
2767
  const nameId = React.useId();
2768
2768
  const displayNameId = React.useId();
@@ -2885,10 +2885,10 @@ function EventMetaEditor({ value, onChange, icons, sections, footer, className,
2885
2885
  EventMetaEditor.displayName = "EventMetaEditor";
2886
2886
  //#endregion
2887
2887
  //#region src/shells/widget-grid.tsx
2888
- const defaultLabels$20 = { emptyMessage: "No widgets to display" };
2888
+ const defaultLabels$21 = { emptyMessage: "No widgets to display" };
2889
2889
  /** Renders the widget grid component. */
2890
2890
  function WidgetGrid({ widgets, cols = 12, rowHeight = 80, gap = 16, editable = false, onReorder, labels: customLabels, className }) {
2891
- const labels = _objectSpread2(_objectSpread2({}, defaultLabels$20), customLabels);
2891
+ const labels = _objectSpread2(_objectSpread2({}, defaultLabels$21), customLabels);
2892
2892
  const [dragIdx, setDragIdx] = React.useState(null);
2893
2893
  const [overIdx, setOverIdx] = React.useState(null);
2894
2894
  if (widgets.length === 0) return /* @__PURE__ */ jsx("div", {
@@ -2933,7 +2933,7 @@ function WidgetGrid({ widgets, cols = 12, rowHeight = 80, gap = 16, editable = f
2933
2933
  WidgetGrid.displayName = "WidgetGrid";
2934
2934
  //#endregion
2935
2935
  //#region src/shells/report-builder.tsx
2936
- const defaultLabels$19 = {
2936
+ const defaultLabels$20 = {
2937
2937
  stepsLabel: "Report steps",
2938
2938
  stepType: "Chart Type",
2939
2939
  stepConfig: "Data Config",
@@ -3009,7 +3009,7 @@ const STEPS = [
3009
3009
  ];
3010
3010
  /** Renders the report builder component. */
3011
3011
  function ReportBuilder({ chartTypes = DEFAULT_CHART_TYPES, dataSources = [], onSave, onCancel, configForm, styleForm, preview, onChartTypeChange, onDataSourceChange, onStepChange, selectedChartType: controlledChartType, selectedDataSource: controlledDataSource, labels: customLabels, className }) {
3012
- const labels = _objectSpread2(_objectSpread2({}, defaultLabels$19), customLabels);
3012
+ const labels = _objectSpread2(_objectSpread2({}, defaultLabels$20), customLabels);
3013
3013
  const [stepIndex, setStepIndex] = React.useState(0);
3014
3014
  const [internalChartType, setInternalChartType] = React.useState(null);
3015
3015
  const [internalDataSource, setInternalDataSource] = React.useState("");
@@ -3229,7 +3229,7 @@ function ReportBuilder({ chartTypes = DEFAULT_CHART_TYPES, dataSources = [], onS
3229
3229
  ReportBuilder.displayName = "ReportBuilder";
3230
3230
  //#endregion
3231
3231
  //#region src/shells/audit-timeline.tsx
3232
- const defaultLabels$18 = {
3232
+ const defaultLabels$19 = {
3233
3233
  title: "변경 이력",
3234
3234
  empty: "변경 이력이 없습니다",
3235
3235
  expand: "상세 보기",
@@ -3308,7 +3308,7 @@ function DiffTable({ changes, labels }) {
3308
3308
  }
3309
3309
  /** Renders the audit timeline component. */
3310
3310
  function AuditTimeline({ entries, labels: customLabels, className, onEntryClick }) {
3311
- const labels = _objectSpread2(_objectSpread2({}, defaultLabels$18), customLabels);
3311
+ const labels = _objectSpread2(_objectSpread2({}, defaultLabels$19), customLabels);
3312
3312
  const [expandedIds, setExpandedIds] = React.useState(/* @__PURE__ */ new Set());
3313
3313
  const toggleExpanded = React.useCallback((id) => {
3314
3314
  setExpandedIds((prev) => {
@@ -3431,7 +3431,7 @@ function AuditTimeline({ entries, labels: customLabels, className, onEntryClick
3431
3431
  AuditTimeline.displayName = "AuditTimeline";
3432
3432
  //#endregion
3433
3433
  //#region src/shells/segment-builder.tsx
3434
- const defaultLabels$17 = {
3434
+ const defaultLabels$18 = {
3435
3435
  match: "Match",
3436
3436
  ofTheFollowing: "of the following",
3437
3437
  groupLabel: "Segment group",
@@ -3552,7 +3552,7 @@ function SegmentBuilder({ groups, onChange, eventOptions = [
3552
3552
  "New Users",
3553
3553
  "Power Users"
3554
3554
  ], className, labels: customLabels }) {
3555
- const labels = _objectSpread2(_objectSpread2({}, defaultLabels$17), customLabels);
3555
+ const labels = _objectSpread2(_objectSpread2({}, defaultLabels$18), customLabels);
3556
3556
  const builderId = React.useId().replace(/:/g, "");
3557
3557
  const nextIdRef = React.useRef(1);
3558
3558
  const createId = React.useCallback(() => {
@@ -3764,6 +3764,703 @@ function SegmentBuilder({ groups, onChange, eventOptions = [
3764
3764
  }
3765
3765
  SegmentBuilder.displayName = "SegmentBuilder";
3766
3766
  //#endregion
3767
+ //#region src/shells/criteria-builder.tsx
3768
+ const defaultLabels$17 = {
3769
+ builder: "조건 빌더",
3770
+ rootLogicLegend: "그룹 결합 방식",
3771
+ matchAllGroups: "모든 그룹 일치",
3772
+ matchAnyGroup: "하나 이상 일치",
3773
+ groupLogicLegend: (letter) => `그룹 ${letter} 조건 결합 방식`,
3774
+ matchAllCriteria: "모두 충족",
3775
+ matchAnyCriteria: "하나 이상 충족",
3776
+ and: "그리고",
3777
+ or: "또는",
3778
+ groupLabel: (letter) => `그룹 ${letter}`,
3779
+ criterionLabel: (letter, index) => `조건 ${letter}.${index}`,
3780
+ actionLabel: (action, target) => `${action}: ${target}`,
3781
+ addCriterion: "조건 추가",
3782
+ addGroup: "그룹 추가",
3783
+ kindMenuTitle: "조건 유형",
3784
+ duplicateCriterion: "조건 복제",
3785
+ removeCriterion: "조건 제거",
3786
+ moveUp: "위로 이동",
3787
+ moveDown: "아래로 이동",
3788
+ negate: "제외",
3789
+ duplicateGroup: "그룹 복제",
3790
+ removeGroup: "그룹 제거",
3791
+ emptyGroup: "이 그룹에는 아직 조건이 없습니다.",
3792
+ unknownKind: (kind) => `알 수 없는 조건 유형 "${kind}"`,
3793
+ unknownKindDescription: "이 조건은 표시할 수 없습니다. 유형을 바꾸거나 제거하세요.",
3794
+ replaceKind: "유형 바꾸기",
3795
+ emptyTitle: "조건이 없습니다",
3796
+ emptyDescription: "첫 그룹을 추가해 누가 포함되는지 정의하세요.",
3797
+ emptyAction: "첫 조건 추가",
3798
+ keyboardHint: "조건 추가 · 그룹 추가",
3799
+ maxGroupsReached: (max) => `그룹은 최대 ${max}개까지 추가할 수 있습니다.`,
3800
+ maxCriteriaReached: (max) => `한 그룹에는 조건을 최대 ${max}개까지 추가할 수 있습니다.`
3801
+ };
3802
+ /** `A`, `B`, … `Z`, `AA`, `AB` — the badge a group wears. */
3803
+ function criteriaGroupLetter(index) {
3804
+ let n = Math.max(0, Math.floor(index));
3805
+ let out = "";
3806
+ do {
3807
+ out = String.fromCharCode(65 + n % 26) + out;
3808
+ n = Math.floor(n / 26) - 1;
3809
+ } while (n >= 0);
3810
+ return out;
3811
+ }
3812
+ function collectIds(value) {
3813
+ const ids = /* @__PURE__ */ new Set();
3814
+ for (const group of value.groups) {
3815
+ ids.add(group.id);
3816
+ for (const criterion of group.criteria) ids.add(criterion.id);
3817
+ }
3818
+ return ids;
3819
+ }
3820
+ function uniqueId(base, taken) {
3821
+ if (!taken.has(base)) return base;
3822
+ let n = 2;
3823
+ while (taken.has(`${base}-${n}`)) n += 1;
3824
+ return `${base}-${n}`;
3825
+ }
3826
+ function replaceGroup(value, groupIndex, next) {
3827
+ return _objectSpread2(_objectSpread2({}, value), {}, { groups: value.groups.map((group, i) => i === groupIndex ? next : group) });
3828
+ }
3829
+ /**
3830
+ * Moves one criterion a step up or down inside its group. Returns the same
3831
+ * value when the move is impossible, so a caller can `===` to know nothing
3832
+ * changed.
3833
+ */
3834
+ function criteriaBuilderMove(value, groupIndex, index, direction) {
3835
+ const group = value.groups[groupIndex];
3836
+ if (!group) return value;
3837
+ const target = direction === "up" ? index - 1 : index + 1;
3838
+ if (index < 0 || target < 0 || target >= group.criteria.length) return value;
3839
+ const criteria = [...group.criteria];
3840
+ const [moved] = criteria.splice(index, 1);
3841
+ criteria.splice(target, 0, moved);
3842
+ return replaceGroup(value, groupIndex, _objectSpread2(_objectSpread2({}, group), {}, { criteria }));
3843
+ }
3844
+ /**
3845
+ * Inserts a copy of one criterion *before* the original, so the copy takes the
3846
+ * original's place in the reading order and the original follows as the thing
3847
+ * to edit.
3848
+ */
3849
+ function criteriaBuilderDuplicate(value, groupIndex, index, clone) {
3850
+ const group = value.groups[groupIndex];
3851
+ const original = group === null || group === void 0 ? void 0 : group.criteria[index];
3852
+ if (!group || !original) return value;
3853
+ const criteria = [...group.criteria];
3854
+ criteria.splice(index, 0, clone(original));
3855
+ return replaceGroup(value, groupIndex, _objectSpread2(_objectSpread2({}, group), {}, { criteria }));
3856
+ }
3857
+ /** Removes one criterion. The group stays, even when it empties. */
3858
+ function criteriaBuilderRemove(value, groupIndex, index) {
3859
+ const group = value.groups[groupIndex];
3860
+ if (!group || index < 0 || index >= group.criteria.length) return value;
3861
+ return replaceGroup(value, groupIndex, _objectSpread2(_objectSpread2({}, group), {}, { criteria: group.criteria.filter((_, i) => i !== index) }));
3862
+ }
3863
+ /** Appends a criterion to a group, or inserts it at `at`. */
3864
+ function criteriaBuilderInsert(value, groupIndex, criterion, at) {
3865
+ const group = value.groups[groupIndex];
3866
+ if (!group) return value;
3867
+ const criteria = [...group.criteria];
3868
+ const position = at === void 0 ? criteria.length : Math.max(0, Math.min(at, criteria.length));
3869
+ criteria.splice(position, 0, criterion);
3870
+ return replaceGroup(value, groupIndex, _objectSpread2(_objectSpread2({}, group), {}, { criteria }));
3871
+ }
3872
+ /** Removes one group. */
3873
+ function criteriaBuilderRemoveGroup(value, groupIndex) {
3874
+ if (groupIndex < 0 || groupIndex >= value.groups.length) return value;
3875
+ return _objectSpread2(_objectSpread2({}, value), {}, { groups: value.groups.filter((_, i) => i !== groupIndex) });
3876
+ }
3877
+ /** Inserts a copy of one group — every criterion cloned — before the original. */
3878
+ function criteriaBuilderDuplicateGroup(value, groupIndex, groupId, clone) {
3879
+ const group = value.groups[groupIndex];
3880
+ if (!group) return value;
3881
+ const copy = {
3882
+ id: groupId,
3883
+ logic: group.logic,
3884
+ criteria: group.criteria.map(clone)
3885
+ };
3886
+ const groups = [...value.groups];
3887
+ groups.splice(groupIndex, 0, copy);
3888
+ return _objectSpread2(_objectSpread2({}, value), {}, { groups });
3889
+ }
3890
+ const EDITABLE_TARGET = "input, textarea, select, [contenteditable=\"\"], [contenteditable=\"true\"], [role=\"combobox\"], [role=\"textbox\"], [role=\"menu\"], [role=\"menuitem\"], [role=\"listbox\"], [role=\"option\"]";
3891
+ function isEditableTarget(target) {
3892
+ return target instanceof Element && target.closest(EDITABLE_TARGET) !== null;
3893
+ }
3894
+ function sectionKinds(kinds) {
3895
+ const sections = [];
3896
+ const byHeading = /* @__PURE__ */ new Map();
3897
+ for (const option of kinds) {
3898
+ let section = byHeading.get(option.group);
3899
+ if (!section) {
3900
+ section = {
3901
+ heading: option.group,
3902
+ entries: []
3903
+ };
3904
+ byHeading.set(option.group, section);
3905
+ sections.push(section);
3906
+ }
3907
+ section.entries.push({
3908
+ key: option.kind,
3909
+ kind: option.kind,
3910
+ negate: false,
3911
+ option
3912
+ });
3913
+ if (option.negatedLabel) section.entries.push({
3914
+ key: `${option.kind}:not`,
3915
+ kind: option.kind,
3916
+ negate: true,
3917
+ option
3918
+ });
3919
+ }
3920
+ return [...sections.filter((s) => s.heading === void 0), ...sections.filter((s) => s.heading !== void 0)];
3921
+ }
3922
+ function KindMenu({ kinds, menuLabel, triggerLabel, triggerAriaLabel, triggerIcon, disabled = false, disabledReason, variant = "ghost", onPick, addTarget }) {
3923
+ const sections = React.useMemo(() => sectionKinds(kinds), [kinds]);
3924
+ const trigger = /* @__PURE__ */ jsxs(DropdownTrigger, {
3925
+ disabled,
3926
+ "aria-label": triggerAriaLabel,
3927
+ title: disabled ? disabledReason : void 0,
3928
+ "data-criteria-add": addTarget,
3929
+ className: cn("inline-flex cursor-pointer items-center justify-center rounded-lg font-medium transition-colors", "h-[var(--opt-control-sm)] gap-[var(--opt-space-1-5)] px-[var(--opt-control-padding-sm)] text-xs", variant === "secondary" ? "border-border bg-surface text-text-primary hover:bg-bg-subtle active:bg-bg-muted border" : "text-text-secondary hover:bg-bg-subtle active:bg-bg-muted", "disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50", "[&_svg]:size-3.5", OPT_FOCUS_VISIBLE),
3930
+ children: [triggerIcon, triggerLabel]
3931
+ });
3932
+ return /* @__PURE__ */ jsxs(DropdownMenu, {
3933
+ animated: false,
3934
+ children: [trigger, /* @__PURE__ */ jsx(DropdownContent, {
3935
+ "aria-label": menuLabel,
3936
+ "aria-labelledby": void 0,
3937
+ className: "min-w-56",
3938
+ children: sections.map((section, si) => {
3939
+ var _section$heading;
3940
+ return /* @__PURE__ */ jsxs(React.Fragment, { children: [
3941
+ si > 0 && /* @__PURE__ */ jsx(DropdownSeparator, {}),
3942
+ section.heading !== void 0 && /* @__PURE__ */ jsx("div", {
3943
+ role: "presentation",
3944
+ className: "text-text-tertiary px-2 pt-1.5 pb-1 text-[11px] font-semibold tracking-wide uppercase",
3945
+ children: section.heading
3946
+ }),
3947
+ section.entries.map((entry) => /* @__PURE__ */ jsxs(DropdownItem, {
3948
+ onClick: () => onPick(entry.kind, entry.negate),
3949
+ className: "flex items-start gap-2",
3950
+ children: [entry.option.icon && /* @__PURE__ */ jsx("span", {
3951
+ className: "text-text-tertiary mt-0.5 shrink-0 [&_svg]:size-3.5",
3952
+ children: entry.option.icon
3953
+ }), /* @__PURE__ */ jsxs("span", {
3954
+ className: "flex min-w-0 flex-col",
3955
+ children: [/* @__PURE__ */ jsx("span", {
3956
+ className: cn("text-sm", entry.negate && "text-danger-fg"),
3957
+ children: entry.negate ? entry.option.negatedLabel : entry.option.label
3958
+ }), !entry.negate && entry.option.description && /* @__PURE__ */ jsx("span", {
3959
+ className: "text-text-tertiary text-xs",
3960
+ children: entry.option.description
3961
+ })]
3962
+ })]
3963
+ }, entry.key))
3964
+ ] }, (_section$heading = section.heading) !== null && _section$heading !== void 0 ? _section$heading : "__none");
3965
+ })
3966
+ })]
3967
+ });
3968
+ }
3969
+ function IconAction({ icon, label, onClick, disabled = false, danger = false }) {
3970
+ return /* @__PURE__ */ jsx("button", {
3971
+ type: "button",
3972
+ onClick,
3973
+ disabled,
3974
+ "aria-label": label,
3975
+ title: label,
3976
+ className: cn("inline-flex size-7 shrink-0 items-center justify-center rounded-md transition-colors [&_svg]:size-3.5", danger ? "text-text-tertiary hover:bg-danger-subtle hover:text-danger-fg" : "text-text-tertiary hover:bg-bg-muted hover:text-text-primary", "disabled:pointer-events-none disabled:opacity-40", OPT_FOCUS_VISIBLE),
3977
+ children: icon
3978
+ });
3979
+ }
3980
+ function LogicDivider({ label, emphasis }) {
3981
+ return /* @__PURE__ */ jsxs("div", {
3982
+ role: "separator",
3983
+ "aria-label": label,
3984
+ className: cn("flex items-center", emphasis === "root" ? "gap-group" : "gap-element"),
3985
+ children: [
3986
+ /* @__PURE__ */ jsx("span", { className: cn("h-px flex-1", emphasis === "root" ? "bg-border" : "bg-border-subtle") }),
3987
+ /* @__PURE__ */ jsx("span", {
3988
+ className: cn("text-[11px] font-semibold tracking-wide uppercase", emphasis === "root" ? "bg-bg-subtle text-text-secondary border-border rounded-full border px-2 py-0.5" : "text-text-tertiary"),
3989
+ children: label
3990
+ }),
3991
+ /* @__PURE__ */ jsx("span", { className: cn("h-px flex-1", emphasis === "root" ? "bg-border" : "bg-border-subtle") })
3992
+ ]
3993
+ });
3994
+ }
3995
+ function Lettermark({ letter }) {
3996
+ return /* @__PURE__ */ jsx("span", {
3997
+ "aria-hidden": "true",
3998
+ className: "bg-accent-subtle text-accent inline-flex size-6 shrink-0 items-center justify-center rounded-md text-xs font-semibold tabular-nums",
3999
+ children: letter
4000
+ });
4001
+ }
4002
+ /**
4003
+ * CriteriaBuilder — a two-level tree of criteria, edited as sentences.
4004
+ *
4005
+ * The builder owns what every criteria editor needs and nothing a particular
4006
+ * product does: groups and their AND/OR, the order of criteria, negation,
4007
+ * inline errors, the "add" menu, and the keyboard. The consumer owns the
4008
+ * criterion type and renders each one — usually as `Expression` chips whose
4009
+ * values open an editor — so the same shell serves a cohort of users, an
4010
+ * alert condition, or a feature-flag rollout without knowing which.
4011
+ *
4012
+ * Kinds the builder does not know render as an invalid row with a warning and
4013
+ * a replace/remove pair, never as some other kind's fields: a criterion saved
4014
+ * by a newer client should look broken, not silently different.
4015
+ *
4016
+ * @example
4017
+ * ```tsx
4018
+ * <CriteriaBuilder
4019
+ * value={value}
4020
+ * onChange={setValue}
4021
+ * kinds={[
4022
+ * { kind: "performed", label: "이벤트를 수행함", negatedLabel: "이벤트를 수행하지 않음" },
4023
+ * { kind: "property", label: "속성이 일치함" },
4024
+ * ]}
4025
+ * createCriterion={(kind, negate) => ({ id: nextId(), kind, negate, event: "" })}
4026
+ * renderCriterion={(c, api) => (
4027
+ * <ExpressionGroup>
4028
+ * <Expression description="이벤트" value={c.event} onClick={() => open(c.id)} />
4029
+ * </ExpressionGroup>
4030
+ * )}
4031
+ * />
4032
+ * ```
4033
+ */
4034
+ function CriteriaBuilder({ value, onChange, kinds, createCriterion, renderCriterion, cloneCriterion, createGroupId, errors, maxGroups = 10, maxCriteriaPerGroup = 20, allowNegation = true, disabled = false, aside, labels: customLabels, className, "aria-label": ariaLabel }) {
4035
+ const labels = React.useMemo(() => _objectSpread2(_objectSpread2({}, defaultLabels$17), customLabels), [customLabels]);
4036
+ const baseId = React.useId().replace(/:/g, "");
4037
+ const nextGroupRef = React.useRef(1);
4038
+ const rootRef = React.useRef(null);
4039
+ const [pendingOpen, setPendingOpen] = React.useState(null);
4040
+ const knownKinds = React.useMemo(() => new Set(kinds.map((k) => k.kind)), [kinds]);
4041
+ const groupsFull = value.groups.length >= maxGroups;
4042
+ const newGroupId = React.useCallback(() => {
4043
+ const taken = collectIds(value);
4044
+ if (createGroupId) return uniqueId(createGroupId(), taken);
4045
+ let id = "";
4046
+ do
4047
+ id = `group-${nextGroupRef.current++}`;
4048
+ while (taken.has(id));
4049
+ return id;
4050
+ }, [createGroupId, value]);
4051
+ const clone = React.useCallback((criterion, taken) => {
4052
+ if (cloneCriterion) return cloneCriterion(criterion);
4053
+ const id = uniqueId(`${criterion.id}-copy`, taken);
4054
+ taken.add(id);
4055
+ return _objectSpread2(_objectSpread2({}, criterion), {}, { id });
4056
+ }, [cloneCriterion]);
4057
+ const addGroup = React.useCallback(() => {
4058
+ if (disabled || groupsFull) return null;
4059
+ const id = newGroupId();
4060
+ onChange(_objectSpread2(_objectSpread2({}, value), {}, { groups: [...value.groups, {
4061
+ id,
4062
+ logic: "and",
4063
+ criteria: []
4064
+ }] }));
4065
+ return id;
4066
+ }, [
4067
+ disabled,
4068
+ groupsFull,
4069
+ newGroupId,
4070
+ onChange,
4071
+ value
4072
+ ]);
4073
+ const addCriterion = React.useCallback((groupIndex, kind, negate) => {
4074
+ const group = value.groups[groupIndex];
4075
+ if (!group || group.criteria.length >= maxCriteriaPerGroup) return;
4076
+ onChange(criteriaBuilderInsert(value, groupIndex, createCriterion(kind, negate)));
4077
+ }, [
4078
+ createCriterion,
4079
+ maxCriteriaPerGroup,
4080
+ onChange,
4081
+ value
4082
+ ]);
4083
+ const addFirst = React.useCallback((kind, negate) => {
4084
+ if (disabled) return;
4085
+ onChange(_objectSpread2(_objectSpread2({}, value), {}, { groups: [{
4086
+ id: newGroupId(),
4087
+ logic: "and",
4088
+ criteria: [createCriterion(kind, negate)]
4089
+ }] }));
4090
+ }, [
4091
+ createCriterion,
4092
+ disabled,
4093
+ newGroupId,
4094
+ onChange,
4095
+ value
4096
+ ]);
4097
+ const replaceCriterion = React.useCallback((groupIndex, index, kind, negate) => {
4098
+ const group = value.groups[groupIndex];
4099
+ const current = group === null || group === void 0 ? void 0 : group.criteria[index];
4100
+ if (!group || !current) return;
4101
+ const replacement = _objectSpread2(_objectSpread2({}, createCriterion(kind, negate)), {}, { id: current.id });
4102
+ onChange(replaceGroup(value, groupIndex, _objectSpread2(_objectSpread2({}, group), {}, { criteria: group.criteria.map((c, i) => i === index ? replacement : c) })));
4103
+ }, [
4104
+ createCriterion,
4105
+ onChange,
4106
+ value
4107
+ ]);
4108
+ const updateCriterion = React.useCallback((groupIndex, index, patch) => {
4109
+ const group = value.groups[groupIndex];
4110
+ if (!group) return;
4111
+ onChange(replaceGroup(value, groupIndex, _objectSpread2(_objectSpread2({}, group), {}, { criteria: group.criteria.map((c, i) => i === index ? _objectSpread2(_objectSpread2({}, c), patch) : c) })));
4112
+ }, [onChange, value]);
4113
+ const findAddTrigger = React.useCallback((groupId) => {
4114
+ var _rootRef$current$quer, _rootRef$current;
4115
+ return (_rootRef$current$quer = (_rootRef$current = rootRef.current) === null || _rootRef$current === void 0 ? void 0 : _rootRef$current.querySelector(`[data-criteria-add="${groupId.replace(/["\\]/g, "\\$&")}"]`)) !== null && _rootRef$current$quer !== void 0 ? _rootRef$current$quer : null;
4116
+ }, []);
4117
+ React.useEffect(() => {
4118
+ if (!pendingOpen) return;
4119
+ const trigger = findAddTrigger(pendingOpen);
4120
+ if (!trigger) return;
4121
+ setPendingOpen(null);
4122
+ trigger.focus();
4123
+ trigger.click();
4124
+ }, [
4125
+ findAddTrigger,
4126
+ pendingOpen,
4127
+ value
4128
+ ]);
4129
+ const handleKeyDown = React.useCallback((event) => {
4130
+ if (disabled || event.defaultPrevented) return;
4131
+ if (event.altKey || event.ctrlKey || event.metaKey) return;
4132
+ if (isEditableTarget(event.target)) return;
4133
+ const key = event.key.toLowerCase();
4134
+ if (key === "g") {
4135
+ const id = addGroup();
4136
+ if (id) {
4137
+ event.preventDefault();
4138
+ setPendingOpen(id);
4139
+ }
4140
+ return;
4141
+ }
4142
+ if (key === "a") {
4143
+ const host = event.target instanceof Element ? event.target.closest("[data-criteria-group]") : null;
4144
+ const groupId = host === null || host === void 0 ? void 0 : host.dataset.criteriaGroup;
4145
+ const trigger = groupId ? findAddTrigger(groupId) : null;
4146
+ if (trigger && !trigger.disabled) {
4147
+ event.preventDefault();
4148
+ trigger.focus();
4149
+ trigger.click();
4150
+ }
4151
+ }
4152
+ }, [
4153
+ addGroup,
4154
+ disabled,
4155
+ findAddTrigger
4156
+ ]);
4157
+ const rootLogicOptions = React.useMemo(() => [{
4158
+ value: "and",
4159
+ label: labels.matchAllGroups
4160
+ }, {
4161
+ value: "or",
4162
+ label: labels.matchAnyGroup
4163
+ }], [labels]);
4164
+ const groupLogicOptions = React.useMemo(() => [{
4165
+ value: "and",
4166
+ label: labels.matchAllCriteria
4167
+ }, {
4168
+ value: "or",
4169
+ label: labels.matchAnyCriteria
4170
+ }], [labels]);
4171
+ const isEmpty = value.groups.length === 0;
4172
+ return /* @__PURE__ */ jsxs("div", {
4173
+ ref: rootRef,
4174
+ role: "group",
4175
+ "aria-label": ariaLabel !== null && ariaLabel !== void 0 ? ariaLabel : labels.builder,
4176
+ className: cn("gap-section flex flex-col lg:flex-row", className),
4177
+ onKeyDown: handleKeyDown,
4178
+ "data-opt-id": "6F4JG",
4179
+ "data-opt-slug": "criteria-builder.CriteriaBuilder",
4180
+ children: [/* @__PURE__ */ jsx("div", {
4181
+ className: "gap-group flex min-w-0 flex-1 flex-col",
4182
+ children: isEmpty ? /* @__PURE__ */ jsx(EmptyState, {
4183
+ title: labels.emptyTitle,
4184
+ description: labels.emptyDescription,
4185
+ hasBorder: true,
4186
+ tone: "subdued",
4187
+ actions: /* @__PURE__ */ jsx(KindMenu, {
4188
+ kinds,
4189
+ menuLabel: labels.kindMenuTitle,
4190
+ triggerLabel: labels.emptyAction,
4191
+ triggerAriaLabel: labels.emptyAction,
4192
+ triggerIcon: /* @__PURE__ */ jsx(Plus, { "aria-hidden": "true" }),
4193
+ variant: "secondary",
4194
+ disabled,
4195
+ onPick: addFirst
4196
+ }),
4197
+ footer: /* @__PURE__ */ jsxs("span", {
4198
+ className: "gap-element inline-flex items-center",
4199
+ children: [
4200
+ /* @__PURE__ */ jsx(Kbd, {
4201
+ hint: true,
4202
+ children: "A"
4203
+ }),
4204
+ /* @__PURE__ */ jsx(Kbd, {
4205
+ hint: true,
4206
+ children: "G"
4207
+ }),
4208
+ /* @__PURE__ */ jsx("span", { children: labels.keyboardHint })
4209
+ ]
4210
+ })
4211
+ }) : /* @__PURE__ */ jsxs(Fragment, { children: [
4212
+ /* @__PURE__ */ jsxs("fieldset", {
4213
+ className: "gap-group m-0 flex min-w-0 flex-wrap items-center border-0 p-0",
4214
+ children: [
4215
+ /* @__PURE__ */ jsx("legend", {
4216
+ className: "sr-only",
4217
+ children: labels.rootLogicLegend
4218
+ }),
4219
+ /* @__PURE__ */ jsx(SegmentedControl, {
4220
+ "aria-label": labels.rootLogicLegend,
4221
+ size: "sm",
4222
+ options: rootLogicOptions,
4223
+ value: value.logic,
4224
+ onChange: (logic) => onChange(_objectSpread2(_objectSpread2({}, value), {}, { logic })),
4225
+ disabled
4226
+ }),
4227
+ /* @__PURE__ */ jsxs("span", {
4228
+ className: "text-text-tertiary gap-element hidden items-center text-xs sm:inline-flex",
4229
+ children: [
4230
+ /* @__PURE__ */ jsx(Kbd, {
4231
+ hint: true,
4232
+ children: "A"
4233
+ }),
4234
+ /* @__PURE__ */ jsx(Kbd, {
4235
+ hint: true,
4236
+ children: "G"
4237
+ }),
4238
+ labels.keyboardHint
4239
+ ]
4240
+ })
4241
+ ]
4242
+ }),
4243
+ value.groups.map((group, groupIndex) => {
4244
+ const letter = criteriaGroupLetter(groupIndex);
4245
+ const groupName = labels.groupLabel(letter);
4246
+ const groupLabelId = `${baseId}-${group.id}-label`;
4247
+ const groupError = errors === null || errors === void 0 ? void 0 : errors[group.id];
4248
+ const groupErrorId = `${baseId}-${group.id}-error`;
4249
+ const criteriaFull = group.criteria.length >= maxCriteriaPerGroup;
4250
+ return /* @__PURE__ */ jsxs(React.Fragment, { children: [groupIndex > 0 && /* @__PURE__ */ jsx(LogicDivider, {
4251
+ emphasis: "root",
4252
+ label: value.logic === "and" ? labels.and : labels.or
4253
+ }), /* @__PURE__ */ jsxs("div", {
4254
+ role: "group",
4255
+ "aria-labelledby": groupLabelId,
4256
+ "aria-describedby": groupError ? groupErrorId : void 0,
4257
+ "data-criteria-group": group.id,
4258
+ "data-invalid": groupError ? true : void 0,
4259
+ className: cn("bg-bg-subtle gap-element flex flex-col rounded-lg border p-3", groupError ? "border-danger/40" : "border-border"),
4260
+ children: [
4261
+ /* @__PURE__ */ jsx("span", {
4262
+ id: groupLabelId,
4263
+ className: "sr-only",
4264
+ children: groupName
4265
+ }),
4266
+ /* @__PURE__ */ jsxs("div", {
4267
+ className: "gap-element flex flex-wrap items-center justify-between",
4268
+ children: [/* @__PURE__ */ jsxs("div", {
4269
+ className: "gap-element flex items-center",
4270
+ children: [/* @__PURE__ */ jsx(Lettermark, { letter }), /* @__PURE__ */ jsxs("fieldset", {
4271
+ className: "m-0 border-0 p-0",
4272
+ children: [/* @__PURE__ */ jsx("legend", {
4273
+ className: "sr-only",
4274
+ children: labels.groupLogicLegend(letter)
4275
+ }), /* @__PURE__ */ jsx(SegmentedControl, {
4276
+ "aria-label": labels.groupLogicLegend(letter),
4277
+ size: "sm",
4278
+ options: groupLogicOptions,
4279
+ value: group.logic,
4280
+ onChange: (logic) => onChange(replaceGroup(value, groupIndex, _objectSpread2(_objectSpread2({}, group), {}, { logic }))),
4281
+ disabled
4282
+ })]
4283
+ })]
4284
+ }), /* @__PURE__ */ jsxs("div", {
4285
+ className: "flex items-center gap-0.5",
4286
+ children: [/* @__PURE__ */ jsx(IconAction, {
4287
+ icon: /* @__PURE__ */ jsx(Copy, { "aria-hidden": "true" }),
4288
+ label: labels.actionLabel(labels.duplicateGroup, groupName),
4289
+ disabled: disabled || groupsFull,
4290
+ onClick: () => {
4291
+ const taken = collectIds(value);
4292
+ const id = newGroupId();
4293
+ taken.add(id);
4294
+ onChange(criteriaBuilderDuplicateGroup(value, groupIndex, id, (c) => clone(c, taken)));
4295
+ }
4296
+ }), /* @__PURE__ */ jsx(IconAction, {
4297
+ icon: /* @__PURE__ */ jsx(Trash2, { "aria-hidden": "true" }),
4298
+ label: labels.actionLabel(labels.removeGroup, groupName),
4299
+ disabled,
4300
+ danger: true,
4301
+ onClick: () => onChange(criteriaBuilderRemoveGroup(value, groupIndex))
4302
+ })]
4303
+ })]
4304
+ }),
4305
+ group.criteria.length === 0 && /* @__PURE__ */ jsx("p", {
4306
+ className: "text-text-tertiary text-xs",
4307
+ children: labels.emptyGroup
4308
+ }),
4309
+ group.criteria.map((criterion, index) => {
4310
+ const criterionName = labels.criterionLabel(letter, index + 1);
4311
+ const rowLabelId = `${baseId}-${criterion.id}-label`;
4312
+ const error = errors === null || errors === void 0 ? void 0 : errors[criterion.id];
4313
+ const errorId = `${baseId}-${criterion.id}-error`;
4314
+ const known = knownKinds.has(criterion.kind);
4315
+ const negated = criterion.negate === true;
4316
+ const api = {
4317
+ update: (patch) => updateCriterion(groupIndex, index, patch),
4318
+ invalid: Boolean(error) || !known,
4319
+ error,
4320
+ disabled,
4321
+ groupIndex,
4322
+ index
4323
+ };
4324
+ return /* @__PURE__ */ jsxs(React.Fragment, { children: [index > 0 && /* @__PURE__ */ jsx(LogicDivider, {
4325
+ emphasis: "group",
4326
+ label: group.logic === "and" ? labels.and : labels.or
4327
+ }), /* @__PURE__ */ jsxs("div", {
4328
+ role: "group",
4329
+ "aria-labelledby": rowLabelId,
4330
+ "aria-describedby": error ? errorId : void 0,
4331
+ "data-criterion-kind": criterion.kind,
4332
+ "data-negated": negated || void 0,
4333
+ "data-invalid": error || !known ? true : void 0,
4334
+ className: cn("bg-surface gap-element flex flex-col rounded-md border p-2", error || !known ? "border-danger/40" : "border-border-subtle"),
4335
+ children: [
4336
+ /* @__PURE__ */ jsx("span", {
4337
+ id: rowLabelId,
4338
+ className: "sr-only",
4339
+ children: criterionName
4340
+ }),
4341
+ /* @__PURE__ */ jsxs("div", {
4342
+ className: "gap-element flex flex-wrap items-start",
4343
+ children: [
4344
+ allowNegation && known && /* @__PURE__ */ jsx("button", {
4345
+ type: "button",
4346
+ "aria-pressed": negated,
4347
+ "aria-label": labels.actionLabel(labels.negate, criterionName),
4348
+ disabled,
4349
+ onClick: () => updateCriterion(groupIndex, index, { negate: !negated }),
4350
+ className: cn("inline-flex h-7 shrink-0 items-center rounded-md border px-2 text-[11px] font-semibold tracking-wide uppercase transition-colors", negated ? "border-danger/40 bg-danger-subtle text-danger-fg" : "border-border bg-bg-subtle text-text-tertiary hover:text-text-secondary", "disabled:pointer-events-none disabled:opacity-50", "outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-ring-offset"),
4351
+ children: labels.negate
4352
+ }),
4353
+ /* @__PURE__ */ jsx("div", {
4354
+ className: "min-w-0 flex-1",
4355
+ children: known ? renderCriterion(criterion, api) : /* @__PURE__ */ jsx(Callout, {
4356
+ tone: "warning",
4357
+ size: "sm",
4358
+ title: labels.unknownKind(criterion.kind),
4359
+ icon: /* @__PURE__ */ jsx(TriangleAlert, { "aria-hidden": "true" }),
4360
+ action: /* @__PURE__ */ jsx(KindMenu, {
4361
+ kinds,
4362
+ menuLabel: labels.kindMenuTitle,
4363
+ triggerLabel: labels.replaceKind,
4364
+ triggerAriaLabel: labels.actionLabel(labels.replaceKind, criterionName),
4365
+ variant: "secondary",
4366
+ disabled,
4367
+ onPick: (kind, negate) => replaceCriterion(groupIndex, index, kind, negate)
4368
+ }),
4369
+ children: labels.unknownKindDescription
4370
+ })
4371
+ }),
4372
+ /* @__PURE__ */ jsxs("div", {
4373
+ className: "flex items-center gap-0.5",
4374
+ children: [
4375
+ /* @__PURE__ */ jsx(IconAction, {
4376
+ icon: /* @__PURE__ */ jsx(ArrowUp, { "aria-hidden": "true" }),
4377
+ label: labels.actionLabel(labels.moveUp, criterionName),
4378
+ disabled: disabled || index === 0,
4379
+ onClick: () => onChange(criteriaBuilderMove(value, groupIndex, index, "up"))
4380
+ }),
4381
+ /* @__PURE__ */ jsx(IconAction, {
4382
+ icon: /* @__PURE__ */ jsx(ArrowDown, { "aria-hidden": "true" }),
4383
+ label: labels.actionLabel(labels.moveDown, criterionName),
4384
+ disabled: disabled || index === group.criteria.length - 1,
4385
+ onClick: () => onChange(criteriaBuilderMove(value, groupIndex, index, "down"))
4386
+ }),
4387
+ /* @__PURE__ */ jsx(IconAction, {
4388
+ icon: /* @__PURE__ */ jsx(Copy, { "aria-hidden": "true" }),
4389
+ label: labels.actionLabel(labels.duplicateCriterion, criterionName),
4390
+ disabled: disabled || criteriaFull,
4391
+ onClick: () => onChange(criteriaBuilderDuplicate(value, groupIndex, index, (c) => clone(c, collectIds(value))))
4392
+ }),
4393
+ /* @__PURE__ */ jsx(IconAction, {
4394
+ icon: /* @__PURE__ */ jsx(Trash2, { "aria-hidden": "true" }),
4395
+ label: labels.actionLabel(labels.removeCriterion, criterionName),
4396
+ disabled,
4397
+ danger: true,
4398
+ onClick: () => onChange(criteriaBuilderRemove(value, groupIndex, index))
4399
+ })
4400
+ ]
4401
+ })
4402
+ ]
4403
+ }),
4404
+ error && /* @__PURE__ */ jsx("p", {
4405
+ id: errorId,
4406
+ className: "text-danger-fg text-xs",
4407
+ children: error
4408
+ })
4409
+ ]
4410
+ })] }, criterion.id);
4411
+ }),
4412
+ groupError && /* @__PURE__ */ jsx("p", {
4413
+ id: groupErrorId,
4414
+ className: "text-danger-fg text-xs",
4415
+ children: groupError
4416
+ }),
4417
+ /* @__PURE__ */ jsxs("div", {
4418
+ className: "gap-element flex flex-wrap items-center",
4419
+ children: [/* @__PURE__ */ jsx(KindMenu, {
4420
+ kinds,
4421
+ menuLabel: labels.kindMenuTitle,
4422
+ triggerLabel: labels.addCriterion,
4423
+ triggerAriaLabel: labels.actionLabel(labels.addCriterion, groupName),
4424
+ triggerIcon: /* @__PURE__ */ jsx(Plus, { "aria-hidden": "true" }),
4425
+ disabled: disabled || criteriaFull,
4426
+ disabledReason: labels.maxCriteriaReached(maxCriteriaPerGroup),
4427
+ onPick: (kind, negate) => addCriterion(groupIndex, kind, negate),
4428
+ addTarget: group.id
4429
+ }), criteriaFull && /* @__PURE__ */ jsx("span", {
4430
+ className: "text-text-tertiary text-xs",
4431
+ children: labels.maxCriteriaReached(maxCriteriaPerGroup)
4432
+ })]
4433
+ })
4434
+ ]
4435
+ })] }, group.id);
4436
+ }),
4437
+ /* @__PURE__ */ jsxs("div", {
4438
+ className: "gap-element flex flex-wrap items-center",
4439
+ children: [/* @__PURE__ */ jsx(Button, {
4440
+ variant: "secondary",
4441
+ size: "sm",
4442
+ leftIcon: /* @__PURE__ */ jsx(Plus, { "aria-hidden": "true" }),
4443
+ disabled: disabled || groupsFull,
4444
+ title: groupsFull ? labels.maxGroupsReached(maxGroups) : void 0,
4445
+ onClick: () => {
4446
+ const id = addGroup();
4447
+ if (id) setPendingOpen(id);
4448
+ },
4449
+ children: labels.addGroup
4450
+ }), groupsFull && /* @__PURE__ */ jsx("span", {
4451
+ className: "text-text-tertiary text-xs",
4452
+ children: labels.maxGroupsReached(maxGroups)
4453
+ })]
4454
+ })
4455
+ ] })
4456
+ }), aside !== void 0 && aside !== null && /* @__PURE__ */ jsx("aside", {
4457
+ className: "min-w-0 lg:w-72 lg:shrink-0",
4458
+ children: aside
4459
+ })]
4460
+ });
4461
+ }
4462
+ CriteriaBuilder.displayName = "CriteriaBuilder";
4463
+ //#endregion
3767
4464
  //#region src/shells/insights-panel.tsx
3768
4465
  const defaultLabels$16 = {
3769
4466
  title: "Insights",
@@ -8176,4 +8873,4 @@ const enStarRatingLabels = {
8176
8873
  };
8177
8874
  const enBreadcrumbLabels = { navAriaLabel: "Go to {label}" };
8178
8875
  //#endregion
8179
- 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, 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, 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 };
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 };