@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.
- package/COMPONENT_CATALOG.md +426 -58
- package/README.md +9 -7
- package/dist/core/index.cjs +1 -1
- package/dist/core/index.d.cts +2 -2
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.js +1 -1
- package/dist/docs/02-components/01-core.md +225 -26
- package/dist/docs/02-components/02-visuals.md +1 -1
- package/dist/docs/02-components/03-shells.md +203 -32
- package/dist/docs/02-components/04-surfaces.md +1 -1
- package/dist/docs/02-components/index.md +4 -4
- package/dist/{field-sidebar-Dz7J4ett.d.ts → field-sidebar-CJ4HxP8D.d.cts} +1 -1
- package/dist/{field-sidebar-D-rwuN_w.d.cts → field-sidebar-DnhpcT2A.d.ts} +1 -1
- package/dist/{field-sidebar-CxxSK4JO.cjs → field-sidebar-ePqFX6MN.cjs} +13 -12
- package/dist/{field-sidebar-CRdToHRO.js → field-sidebar-mSVCMAZp.js} +13 -12
- package/dist/id-registry.cjs +8 -0
- package/dist/id-registry.js +8 -0
- package/dist/id-registry.json +17 -0
- package/dist/index.cjs +756 -51
- package/dist/index.d.cts +196 -10
- package/dist/index.d.ts +196 -10
- package/dist/index.js +750 -53
- package/dist/{key-pad-menu-0KWOnELe.cjs → key-pad-menu-BgtSL3xe.cjs} +9 -6
- package/dist/{key-pad-menu-DMmbQ1jF.js → key-pad-menu-CqFI6la9.js} +9 -6
- package/dist/{key-pad-menu-BOVu97bj.d.cts → key-pad-menu-D6pYzaj-.d.cts} +12 -3
- package/dist/{key-pad-menu-NlZ9zNF8.d.ts → key-pad-menu-Yh7Fpb8m.d.ts} +12 -3
- package/dist/meta.cjs +430 -19
- package/dist/meta.js +430 -19
- package/dist/shells/index.cjs +1 -1
- package/dist/shells/index.d.cts +1 -1
- package/dist/shells/index.d.ts +1 -1
- package/dist/shells/index.js +1 -1
- package/dist/{text-truncate-eMzvU_7k.d.cts → text-truncate-Bbul-jMD.d.cts} +1 -30
- package/dist/{text-truncate-eMzvU_7k.d.ts → text-truncate-Bbul-jMD.d.ts} +1 -30
- package/dist/theme/server.d.cts +2 -2
- package/dist/theme/server.d.ts +2 -2
- 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-
|
|
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-
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
288
|
-
priority: _objectSpread2(_objectSpread2({}, defaultLabels$
|
|
289
|
-
status: _objectSpread2(_objectSpread2({}, defaultLabels$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
513
|
-
emptyMessage: (_customLabels$emptyMe = customLabels === null || customLabels === void 0 ? void 0 : customLabels.emptyMessage) !== null && _customLabels$emptyMe !== void 0 ? _customLabels$emptyMe : defaultLabels$
|
|
514
|
-
moreItems: (_customLabels$moreIte = customLabels === null || customLabels === void 0 ? void 0 : customLabels.moreItems) !== null && _customLabels$moreIte !== void 0 ? _customLabels$moreIte : defaultLabels$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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 };
|