@reopt-ai/opt-ui 1.12.1 → 1.12.2

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.
@@ -2,7 +2,7 @@
2
2
 
3
3
  <!-- DEPRECATED: Prefer dist/docs/02-components/ for per-layer reference. -->
4
4
  <!-- Auto-generated from ComponentMeta. Do not edit. -->
5
- <!-- Version: 1.12.0 -->
5
+ <!-- Version: 1.12.1 -->
6
6
 
7
7
  ## Quick Stats
8
8
 
@@ -2385,12 +2385,12 @@ const MyDashboard = createBlock<MyDashboardProps>(
2385
2385
 
2386
2386
  **Import:** `import { StatusDot } from "@reopt-ai/opt-ui"`
2387
2387
 
2388
- | Prop | Type | Required | Default | Description |
2389
- | ---------- | ---------------------------------------------------------------------- | -------- | --------- | -------------------------------------- |
2390
- | `tone` | `"neutral" \| "muted" \| "info" \| "success" \| "warning" \| "danger"` | | "neutral" | 점 색상 |
2391
- | `size` | `"sm" \| "md"` | | "md" | 점과 글자 크기 |
2392
- | `children` | `ReactNode` | Yes | | 상태 라벨. 필수 — 색은 상태가 아닙니다 |
2393
- | `hint` | `string` | | | 판정 기준 툴팁 |
2388
+ | Prop | Type | Required | Default | Description |
2389
+ | ---------- | ---------------------------------------------------------------------- | -------- | --------- | -------------------------------------------------------------------------------------- |
2390
+ | `tone` | `"neutral" \| "muted" \| "info" \| "success" \| "warning" \| "danger"` | | "neutral" | 점 색상 |
2391
+ | `size` | `"sm" \| "md"` | | "md" | 점과 글자 크기 |
2392
+ | `children` | `ReactNode` | Yes | | 상태 라벨. 필수 — 색은 상태가 아닙니다 |
2393
+ | `hint` | `string` | | | 판정 기준. 호버·키보드 포커스로 열리는 툴팁이며, 지정하면 이 항목이 탭 정지점이 됩니다 |
2394
2394
 
2395
2395
  #### CopyButton
2396
2396
 
package/README.md CHANGED
@@ -214,13 +214,18 @@ import {
214
214
  ```ts
215
215
  import { matchesQueryObject, parseQuery } from "@reopt-ai/opt-ui/query";
216
216
 
217
- const query = parseQuery("service:api -status:200 duration>250");
217
+ const query = parseQuery("service:api tags:checkout -status:200");
218
218
 
219
219
  const visibleRows = rows.filter((row) =>
220
220
  matchesQueryObject(query, row, { nested: "properties" }),
221
221
  );
222
222
  ```
223
223
 
224
+ 문자열·숫자 같은 단일 값과 `tags: ["checkout", "payment"]` 같은 배열 필드는
225
+ 같은 쿼리로 다룰 수 있습니다. `tags:checkout`과 `tags:*`는 배열 전체를 문자열로
226
+ 바꾸지 않고 각 원소를 비교하며, 빈 배열은 `tags:*`에 일치하지 않습니다. 필드가
227
+ 없는 bare term 검색도 문자열·숫자·불리언 배열 원소를 검색합니다.
228
+
224
229
  UI에서는 동일한 <code>Query</code>를 <code>QueryBar</code>에 전달하고,
225
230
  <code>LogTable</code>의 cell action을 <code>applyCellAction</code>으로 다시
226
231
  쿼리에 합칩니다. <code>FieldSidebar</code>의 값 분포 필터도 같은
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const require_text_truncate = require("../text-truncate-I1XLWmRa.cjs");
4
- const require_key_pad_menu = require("../key-pad-menu-SItoHPLu.cjs");
3
+ const require_text_truncate = require("../text-truncate-DsG5UAOY.cjs");
4
+ const require_key_pad_menu = require("../key-pad-menu-1YN221Oi.cjs");
5
5
  let _reopt_ai_opt_ui_primitives = require("@reopt-ai/opt-ui-primitives");
6
6
  exports.AccordionContent = require_key_pad_menu.AccordionContent;
7
7
  exports.AccordionItem = require_key_pad_menu.AccordionItem;
@@ -1,4 +1,4 @@
1
1
  "use client";
2
- import { $ as PopoverClose, $t as CompositeProvider, A as FormRadio, At as DialogBody, B as FormSubmit, Bt as SelectLabel, C as FormGroupLabel, Ct as ComboboxGroup, Dt as ComboboxPopover, E as FormLabel, Et as ComboboxItem, F as FormSelect, Ft as DialogHeader, G as useFormContext, Gt as TabList, Ht as SelectRoot, I as FormSelectItem, It as DialogHeading, J as DateRangePicker, Jt as DisclosureContent, K as useFormStore, Kt as TabPanel, L as FormSelectPopover, Lt as DialogPanel, M as FormRemove, Mt as DialogDisclosure, N as FormReset, Nt as DialogDismiss, O as FormProvider, Ot as ComboboxRoot, P as FormRoot, Pt as DialogFooter, Q as ColorPicker, Qt as CompositeItem, Rt as DialogRoot, S as FormGroup, St as ComboboxEmpty, T as FormInput, Tt as ComboboxInput, U as FormTextarea, Ut as SelectTrigger, V as FormSwitch, Vt as SelectPopover, Wt as Tab, X as IconPicker, Xt as DisclosureTrigger, Y as TagInput, Yt as DisclosureRoot, Zt as Composite, _ as FormControl, _n as SkeletonCard, _t as MenuRoot, at as ToolbarButton, b as FormError, bt as MenubarContainer, c as Checkbox, cn as Badge, ct as ToolbarSeparator, dt as TooltipProvider, en as CompositeRow, et as PopoverContent, ft as MenuButtonArrow, gn as SkeletonAvatar, gt as MenuPopover, h as FormCheckbox, hn as Skeleton, ht as MenuItemRadio, i as FieldToken, in as Input, it as NumberInput, j as FormRadioGroup, jt as DialogDescription, k as FormPush, kt as AlertDialogPanel, l as CheckboxGroup, ln as EmptyState, lt as Tooltip, mn as StatCard, mt as MenuItemCheckbox, n as Highlight, nn as Meter, nt as PopoverTrigger, o as resolveFieldType, on as Alert, or as Kbd, ot as ToolbarContainer, pt as MenuItem, q as DEFAULT_PRESETS, qt as TabsRoot, r as FIELD_TYPE_TOKENS, rt as Slider, s as Pagination, sn as Spinner, st as ToolbarRoot, t as TextTruncate, tn as CompositeZone, tt as PopoverRoot, un as Button, ut as TooltipAnchor, vn as SkeletonTable, vt as MenuSeparator, wt as ComboboxGroupLabel, x as FormField, xt as MenubarRoot, y as FormDescription, yn as SkeletonText, yt as MenuTrigger, zt as SelectItem } from "../text-truncate-DSuZECy0.js";
3
- import { $ as Identity, A as PageHeader, B as DropdownTrigger, C as Logo, D as Section, E as ResizablePanelGroup, F as RadioGroup, G as Textarea, H as StepBuilder, I as DropdownContent, J as CardContent, K as Switch, L as DropdownItem, M as BlockLayout, O as Container, P as Radio, Q as CardTitle, R as DropdownMenu, S as DrawerRoot, T as ResizablePanel, U as CircularProgress, V as ConditionBuilder, W as Progress, X as CardFooter, Y as CardDescription, Z as CardHeader, _ as getShaderFragment, a as THEME_PALETTES, at as AccordionItem, b as DrawerClose, c as ExpressionGroup, ct as Toggle, d as ShaderSurface, dt as Separator, et as Avatar, f as SHADER_OVERLAY_PARAM_KEYS, ft as Heading, g as SHADER_PRESET_IDS, h as SHADER_PRESETS, i as ColorPalettePicker, it as AccordionContent, j as createBlock, k as ScrollArea, l as Facet, lt as ToggleGroup, m as SHADER_PARAM_KEYS, n as InlineEdit, nt as DescriptionList, o as LiveRegion, ot as AccordionRoot, p as SHADER_PARAM_FALLBACK, pt as Text, q as Card, r as ColorPaletteDisplay, rt as Breadcrumb, s as Expression, st as AccordionTrigger, t as KeyPadMenu, tt as AvatarGroup, u as FacetGroup, ut as OtpField, v as getShaderPreset, w as ResizableHandle, x as DrawerPanel, y as VirtualList, z as DropdownSeparator } from "../key-pad-menu-Di2aRGbM.js";
2
+ import { $ as PopoverClose, $t as ToolbarButton, A as FormRadio, At as DialogPanel, B as FormSubmit, Bt as TabsRoot, C as FormGroupLabel, Ct as DialogBody, Dt as DialogFooter, E as FormLabel, Et as DialogDismiss, F as FormSelect, Ft as SelectRoot, G as useFormContext, Gt as CompositeItem, Ht as DisclosureRoot, I as FormSelectItem, It as SelectTrigger, J as DateRangePicker, Jt as CompositeZone, K as useFormStore, Kt as CompositeProvider, L as FormSelectPopover, Lt as Tab, M as FormRemove, Mt as SelectItem, N as FormReset, Nt as SelectLabel, O as FormProvider, Ot as DialogHeader, P as FormRoot, Pt as SelectPopover, Q as ColorPicker, Rt as TabList, S as FormGroup, St as AlertDialogPanel, T as FormInput, Tt as DialogDisclosure, U as FormTextarea, Ut as DisclosureTrigger, V as FormSwitch, Vt as DisclosureContent, Wt as Composite, X as IconPicker, Y as TagInput, Yt as Meter, Zt as Input, _ as FormControl, _n as SkeletonCard, _t as ComboboxGroupLabel, an as TooltipProvider, at as MenuButtonArrow, b as FormError, bt as ComboboxPopover, c as Checkbox, cn as Badge, ct as MenuItemRadio, dt as MenuSeparator, en as ToolbarContainer, et as PopoverContent, ft as MenuTrigger, gn as SkeletonAvatar, gt as ComboboxGroup, h as FormCheckbox, hn as Skeleton, ht as ComboboxEmpty, i as FieldToken, in as TooltipAnchor, it as NumberInput, j as FormRadioGroup, jt as DialogRoot, k as FormPush, kt as DialogHeading, l as CheckboxGroup, ln as EmptyState, lt as MenuPopover, mn as StatCard, mt as MenubarRoot, n as Highlight, nn as ToolbarSeparator, nt as PopoverTrigger, o as resolveFieldType, on as Alert, or as Kbd, ot as MenuItem, pt as MenubarContainer, q as DEFAULT_PRESETS, qt as CompositeRow, r as FIELD_TYPE_TOKENS, rn as Tooltip, rt as Slider, s as Pagination, sn as Spinner, st as MenuItemCheckbox, t as TextTruncate, tn as ToolbarRoot, tt as PopoverRoot, un as Button, ut as MenuRoot, vn as SkeletonTable, vt as ComboboxInput, wt as DialogDescription, x as FormField, xt as ComboboxRoot, y as FormDescription, yn as SkeletonText, yt as ComboboxItem, zt as TabPanel } from "../text-truncate-BFWd2cE_.js";
3
+ import { $ as Identity, A as PageHeader, B as DropdownTrigger, C as Logo, D as Section, E as ResizablePanelGroup, F as RadioGroup, G as Textarea, H as StepBuilder, I as DropdownContent, J as CardContent, K as Switch, L as DropdownItem, M as BlockLayout, O as Container, P as Radio, Q as CardTitle, R as DropdownMenu, S as DrawerRoot, T as ResizablePanel, U as CircularProgress, V as ConditionBuilder, W as Progress, X as CardFooter, Y as CardDescription, Z as CardHeader, _ as getShaderFragment, a as THEME_PALETTES, at as AccordionItem, b as DrawerClose, c as ExpressionGroup, ct as Toggle, d as ShaderSurface, dt as Separator, et as Avatar, f as SHADER_OVERLAY_PARAM_KEYS, ft as Heading, g as SHADER_PRESET_IDS, h as SHADER_PRESETS, i as ColorPalettePicker, it as AccordionContent, j as createBlock, k as ScrollArea, l as Facet, lt as ToggleGroup, m as SHADER_PARAM_KEYS, n as InlineEdit, nt as DescriptionList, o as LiveRegion, ot as AccordionRoot, p as SHADER_PARAM_FALLBACK, pt as Text, q as Card, r as ColorPaletteDisplay, rt as Breadcrumb, s as Expression, st as AccordionTrigger, t as KeyPadMenu, tt as AvatarGroup, u as FacetGroup, ut as OtpField, v as getShaderPreset, w as ResizableHandle, x as DrawerPanel, y as VirtualList, z as DropdownSeparator } from "../key-pad-menu-CUiQ-vKw.js";
4
4
  export { AccordionContent, AccordionItem, AccordionRoot, AccordionTrigger, Alert, AlertDialogPanel, Avatar, AvatarGroup, Badge, BlockLayout, BlockLayout as SurfaceLayout, Breadcrumb, Button, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, CheckboxGroup, CircularProgress, ColorPaletteDisplay, ColorPalettePicker, ColorPicker, ComboboxEmpty, ComboboxGroup, ComboboxGroupLabel, ComboboxInput, ComboboxItem, ComboboxPopover, ComboboxRoot, Composite, CompositeItem, CompositeProvider, CompositeRow, CompositeZone, ConditionBuilder, Container, DEFAULT_PRESETS, DateRangePicker, DescriptionList, DialogBody, DialogDescription, DialogDisclosure, DialogDismiss, DialogFooter, DialogHeader, DialogHeading, DialogPanel, DialogRoot, DisclosureContent, DisclosureRoot, DisclosureTrigger, DrawerClose, DrawerPanel, DrawerRoot, DropdownContent, DropdownItem, DropdownMenu, DropdownSeparator, DropdownTrigger, EmptyState, Expression, ExpressionGroup, FIELD_TYPE_TOKENS, Facet, FacetGroup, FieldToken, FormCheckbox, FormControl, FormDescription, FormError, FormField, FormGroup, FormGroupLabel, FormInput, FormLabel, FormProvider, FormPush, FormRadio, FormRadioGroup, FormRemove, FormReset, FormRoot, FormSelect, FormSelectItem, FormSelectPopover, FormSubmit, FormSwitch, FormTextarea, Heading, Highlight, IconPicker, Identity, InlineEdit, Input, Kbd, KeyPadMenu, LiveRegion, Logo, MenuButtonArrow, MenuItem, MenuItemCheckbox, MenuItemRadio, MenuPopover, MenuRoot, MenuSeparator, MenuTrigger, MenubarContainer, MenubarRoot, Meter, NumberInput, OtpField, PageHeader, Pagination, PopoverClose, PopoverContent, PopoverRoot, PopoverTrigger, Progress, Radio, RadioGroup, ResizableHandle, ResizablePanel, ResizablePanelGroup, SHADER_OVERLAY_PARAM_KEYS, SHADER_PARAM_FALLBACK, SHADER_PARAM_KEYS, SHADER_PRESETS, SHADER_PRESET_IDS, ScrollArea, Section, SelectItem, SelectLabel, SelectPopover, SelectRoot, SelectTrigger, Separator, ShaderSurface, Skeleton, SkeletonAvatar, SkeletonCard, SkeletonTable, SkeletonText, Slider, Spinner, StatCard, StepBuilder, Switch, THEME_PALETTES, Tab, TabList, TabPanel, TabsRoot, TagInput, Text, TextTruncate, Textarea, Toggle, ToggleGroup, ToolbarButton, ToolbarContainer, ToolbarRoot, ToolbarSeparator, Tooltip, TooltipAnchor, TooltipProvider, VirtualList, createBlock, createBlock as createSurface, getShaderFragment, getShaderPreset, resolveFieldType, useFormContext, useFormStore };
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  title: "Core Components"
3
3
  description: "74 Core layer components — props, examples, keyboard shortcuts."
4
- version: "1.12.0"
4
+ version: "1.12.1"
5
5
  generated: true
6
6
  ---
7
7
 
@@ -2272,12 +2272,12 @@ const MyDashboard = createBlock<MyDashboardProps>(
2272
2272
 
2273
2273
  **Import:** `import { StatusDot } from "@reopt-ai/opt-ui"`
2274
2274
 
2275
- | Prop | Type | Required | Default | Description |
2276
- | ---------- | ---------------------------------------------------------------------- | -------- | --------- | -------------------------------------- |
2277
- | `tone` | `"neutral" \| "muted" \| "info" \| "success" \| "warning" \| "danger"` | | "neutral" | 점 색상 |
2278
- | `size` | `"sm" \| "md"` | | "md" | 점과 글자 크기 |
2279
- | `children` | `ReactNode` | Yes | | 상태 라벨. 필수 — 색은 상태가 아닙니다 |
2280
- | `hint` | `string` | | | 판정 기준 툴팁 |
2275
+ | Prop | Type | Required | Default | Description |
2276
+ | ---------- | ---------------------------------------------------------------------- | -------- | --------- | -------------------------------------------------------------------------------------- |
2277
+ | `tone` | `"neutral" \| "muted" \| "info" \| "success" \| "warning" \| "danger"` | | "neutral" | 점 색상 |
2278
+ | `size` | `"sm" \| "md"` | | "md" | 점과 글자 크기 |
2279
+ | `children` | `ReactNode` | Yes | | 상태 라벨. 필수 — 색은 상태가 아닙니다 |
2280
+ | `hint` | `string` | | | 판정 기준. 호버·키보드 포커스로 열리는 툴팁이며, 지정하면 이 항목이 탭 정지점이 됩니다 |
2281
2281
 
2282
2282
  ### CopyButton
2283
2283
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  title: "Visual Components"
3
3
  description: "0 Visual layer components — props, examples, keyboard shortcuts."
4
- version: "1.12.0"
4
+ version: "1.12.1"
5
5
  generated: true
6
6
  ---
7
7
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  title: "Shell Components"
3
3
  description: "86 Shell layer components — props, examples, keyboard shortcuts."
4
- version: "1.12.0"
4
+ version: "1.12.1"
5
5
  generated: true
6
6
  ---
7
7
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  title: "Surface Components"
3
3
  description: "0 Surface layer components — props, examples, keyboard shortcuts."
4
- version: "1.12.0"
4
+ version: "1.12.1"
5
5
  generated: true
6
6
  ---
7
7
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  title: "Component Reference"
3
3
  description: "Complete reference for 160 @reopt-ai/opt-ui components across 4 layers."
4
- version: "1.12.0"
4
+ version: "1.12.1"
5
5
  generated: true
6
6
  ---
7
7
 
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { $n as OPT_TEXT_LABEL, $t as CompositeProvider, A as FormRadio$1, An as OPT_BADGE_RED, B as FormSubmit$1, Bn as OPT_FOCUS, Bt as SelectLabel$1, Dn as OPT_BADGE_BLUE, Dt as ComboboxPopover$1, E as FormLabel$1, En as OPT_ANIMATE_ENTER_EXIT, Et as ComboboxItem$1, F as FormSelect, Fn as OPT_DIVIDER, Gn as OPT_ITEM_BASE, Gt as TabList$1, Ht as SelectRoot$1, I as FormSelectItem, It as DialogHeading$1, Jt as DisclosureContent$1, K as useFormStore, Kn as OPT_SURFACE, Kt as TabPanel$1, L as FormSelectPopover, Ln as OPT_DOT_GREEN, Lt as DialogPanel$1, Mn as OPT_BORDER, Nn as OPT_DISCLOSURE_CONTENT, On as OPT_BADGE_GREEN, Ot as ComboboxRoot$1, P as FormRoot$1, Pn as OPT_DISCLOSURE_TRIGGER, Qt as CompositeItem, Rn as OPT_DOT_RED, Rt as DialogRoot$1, St as ComboboxEmpty, T as FormInput$1, Tt as ComboboxInput$1, U as FormTextarea, Un as OPT_INPUT, Ut as SelectTrigger$1, V as FormSwitch$1, Vn as OPT_FOCUS_VISIBLE, Vt as SelectPopover$1, Wt as Tab$1, Xn as OPT_TD, Xt as DisclosureTrigger$1, Y as TagInput, Yn as OPT_TABLE_ROW_ACTIVE, Yt as DisclosureRoot$1, Zn as OPT_TD_MUTED, Zt as Composite, _t as MenuRoot$1, ar as _objectWithoutProperties, at as ToolbarButton$1, b as FormError$1, bt as MenubarContainer$1, c as Checkbox, cn as Badge, ct as ToolbarSeparator$1, dt as TooltipProvider$1, en as CompositeRow, er as OPT_TEXT_PRIMARY, et as PopoverContent$1, ft as MenuButtonArrow$1, gt as MenuPopover$1, h as FormCheckbox$1, hn as Skeleton, ht as MenuItemRadio$1, i as FieldToken, in as Input, ir as _objectSpread2, j as FormRadioGroup$1, jn as OPT_BADGE_YELLOW, jt as DialogDescription$1, kn as OPT_BADGE_NEUTRAL, ln as EmptyState, lt as Tooltip$1, m as formatOptTime, mn as StatCard, mt as MenuItemCheckbox$1, n as Highlight, nn as Meter$1, nr as OPT_TEXT_TERTIARY, nt as PopoverTrigger$1, on as Alert, or as Kbd, ot as ToolbarContainer$1, pt as MenuItem$1, qn as OPT_SURFACE_POPOVER, qt as TabsRoot$1, rr as OPT_TH, s as Pagination, sn as Spinner, sr as cn, st as ToolbarRoot$1, t as TextTruncate, tr as OPT_TEXT_SECONDARY, tt as PopoverRoot$1, u as OPT_UI_DEFAULT_LOCALE, un as Button, ut as TooltipAnchor$1, vt as MenuSeparator$1, wn as OPT_ACTIVE_ITEM, xt as MenubarRoot$1, yt as MenuTrigger$1, zn as OPT_DOT_YELLOW, zt as SelectItem$1 } from "./text-truncate-DSuZECy0.js";
2
+ import { $n as OPT_TEXT_LABEL, $t as ToolbarButton$1, A as FormRadio$1, An as OPT_BADGE_RED, At as DialogPanel$1, B as FormSubmit$1, Bn as OPT_FOCUS, Bt as TabsRoot$1, Dn as OPT_BADGE_BLUE, E as FormLabel$1, En as OPT_ANIMATE_ENTER_EXIT, F as FormSelect, Fn as OPT_DIVIDER, Ft as SelectRoot$1, Gn as OPT_ITEM_BASE, Gt as CompositeItem, Ht as DisclosureRoot$1, I as FormSelectItem, It as SelectTrigger$1, K as useFormStore, Kn as OPT_SURFACE, Kt as CompositeProvider, L as FormSelectPopover, Ln as OPT_DOT_GREEN, Lt as Tab$1, Mn as OPT_BORDER, Mt as SelectItem$1, Nn as OPT_DISCLOSURE_CONTENT, Nt as SelectLabel$1, On as OPT_BADGE_GREEN, P as FormRoot$1, Pn as OPT_DISCLOSURE_TRIGGER, Pt as SelectPopover$1, Rn as OPT_DOT_RED, Rt as TabList$1, T as FormInput$1, U as FormTextarea, Un as OPT_INPUT, Ut as DisclosureTrigger$1, V as FormSwitch$1, Vn as OPT_FOCUS_VISIBLE, Vt as DisclosureContent$1, Wt as Composite, Xn as OPT_TD, Y as TagInput, Yn as OPT_TABLE_ROW_ACTIVE, Yt as Meter$1, Zn as OPT_TD_MUTED, Zt as Input, an as TooltipProvider$1, ar as _objectWithoutProperties, at as MenuButtonArrow$1, b as FormError$1, bt as ComboboxPopover$1, c as Checkbox, cn as Badge, ct as MenuItemRadio$1, dt as MenuSeparator$1, en as ToolbarContainer$1, er as OPT_TEXT_PRIMARY, et as PopoverContent$1, ft as MenuTrigger$1, h as FormCheckbox$1, hn as Skeleton, ht as ComboboxEmpty, i as FieldToken, in as TooltipAnchor$1, ir as _objectSpread2, j as FormRadioGroup$1, jn as OPT_BADGE_YELLOW, jt as DialogRoot$1, kn as OPT_BADGE_NEUTRAL, kt as DialogHeading$1, ln as EmptyState, lt as MenuPopover$1, m as formatOptTime, mn as StatCard, mt as MenubarRoot$1, n as Highlight, nn as ToolbarSeparator$1, nr as OPT_TEXT_TERTIARY, nt as PopoverTrigger$1, on as Alert, or as Kbd, ot as MenuItem$1, pt as MenubarContainer$1, qn as OPT_SURFACE_POPOVER, qt as CompositeRow, rn as Tooltip$1, rr as OPT_TH, s as Pagination, sn as Spinner, sr as cn, st as MenuItemCheckbox$1, t as TextTruncate, tn as ToolbarRoot$1, tr as OPT_TEXT_SECONDARY, tt as PopoverRoot$1, u as OPT_UI_DEFAULT_LOCALE, un as Button, ut as MenuRoot$1, vt as ComboboxInput$1, wn as OPT_ACTIVE_ITEM, wt as DialogDescription$1, xt as ComboboxRoot$1, yt as ComboboxItem$1, zn as OPT_DOT_YELLOW, zt as TabPanel$1 } from "./text-truncate-BFWd2cE_.js";
3
3
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
4
4
  import * as React from "react";
5
5
  import { Fragment as Fragment$1, createContext, forwardRef, memo, useCallback, useContext, useEffect, useId, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- const require_text_truncate = require("./text-truncate-I1XLWmRa.cjs");
2
+ const require_text_truncate = require("./text-truncate-DsG5UAOY.cjs");
3
3
  let react_jsx_runtime = require("react/jsx-runtime");
4
4
  let react = require("react");
5
5
  react = require_text_truncate.__toESM(react, 1);
package/dist/index.cjs CHANGED
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const require_text_truncate = require("./text-truncate-I1XLWmRa.cjs");
4
- const require_key_pad_menu = require("./key-pad-menu-SItoHPLu.cjs");
5
- const require_field_sidebar = require("./field-sidebar-oa6zOmcd.cjs");
3
+ const require_text_truncate = require("./text-truncate-DsG5UAOY.cjs");
4
+ const require_key_pad_menu = require("./key-pad-menu-1YN221Oi.cjs");
5
+ const require_field_sidebar = require("./field-sidebar-D0ITbhfJ.cjs");
6
6
  let react_jsx_runtime = require("react/jsx-runtime");
7
7
  let react = require("react");
8
8
  react = require_text_truncate.__toESM(react, 1);
@@ -149,6 +149,10 @@ const dotSize = {
149
149
  * The dot is decorative on purpose. It never carries meaning the text does not
150
150
  * also carry, so the component cannot be used to say something in colour alone.
151
151
  *
152
+ * Without a `hint` this renders one span and nothing else: a table repeats this
153
+ * on every row, and a tooltip's provider, listeners and floating context are
154
+ * not a cost worth paying hundreds of times for rows that have nothing to say.
155
+ *
152
156
  * @example
153
157
  * ```tsx
154
158
  * <StatusDot tone="warning" hint="7일 이상 수신되지 않음">비활성</StatusDot>
@@ -156,9 +160,9 @@ const dotSize = {
156
160
  */
157
161
  function StatusDot(_ref) {
158
162
  let { tone = "neutral", size = "md", hint, className, children } = _ref, props = require_text_truncate._objectWithoutProperties(_ref, _excluded$1);
159
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", require_text_truncate._objectSpread2(require_text_truncate._objectSpread2({
160
- className: require_text_truncate.cn("inline-flex items-center whitespace-nowrap", sizeStyles$2[size], textTone[tone], className),
161
- title: hint
163
+ const dot = /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", require_text_truncate._objectSpread2(require_text_truncate._objectSpread2({
164
+ className: require_text_truncate.cn("inline-flex items-center whitespace-nowrap", sizeStyles$2[size], textTone[tone], hint && "focus-visible:ring-ring rounded-sm outline-none focus-visible:ring-2", className),
165
+ tabIndex: hint ? 0 : void 0
162
166
  }, props), {}, {
163
167
  "data-opt-id": "N51AT",
164
168
  "data-opt-slug": "status-dot.StatusDot",
@@ -168,6 +172,8 @@ function StatusDot(_ref) {
168
172
  "aria-hidden": "true"
169
173
  }), children]
170
174
  }));
175
+ if (!hint) return dot;
176
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_text_truncate.TooltipProvider, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_text_truncate.TooltipAnchor, { render: dot }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_text_truncate.Tooltip, { children: hint })] });
171
177
  }
172
178
  //#endregion
173
179
  //#region src/core/copy-button.tsx
@@ -4478,6 +4484,19 @@ function toText(value) {
4478
4484
  if (typeof value === "number" || typeof value === "boolean") return String(value);
4479
4485
  return JSON.stringify(value);
4480
4486
  }
4487
+ /**
4488
+ * The values one field holds, as a list.
4489
+ *
4490
+ * A clause names a single value, so an array field has to be read element by
4491
+ * element: `tag:pay` asks whether *any* tag is `pay`, not whether the whole
4492
+ * list stringifies to it — and `toText` on an array produces `["pay","cart"]`,
4493
+ * which no user ever types. Scalars read as a list of one so both shapes take
4494
+ * the same path, and negation stays where it already is: `matchesQuery` flips
4495
+ * the result, so `-tag:pay` correctly means "no element matches".
4496
+ */
4497
+ function readValues(value) {
4498
+ return Array.isArray(value) ? value : [value];
4499
+ }
4481
4500
  function compare(left, right) {
4482
4501
  const leftNumber = typeof left === "number" ? left : Number(toText(left));
4483
4502
  const rightNumber = Number(right);
@@ -4488,9 +4507,9 @@ function matchesClause(clause, read, searchable) {
4488
4507
  if (clause.type === "term") return searchable().toLowerCase().includes(clause.value.toLowerCase());
4489
4508
  const value = read(clause.field);
4490
4509
  switch (clause.operator) {
4491
- case "exists": return value !== void 0 && value !== null && value !== "";
4492
- case "eq": return clause.values.some((candidate) => toText(value).toLowerCase() === candidate.toLowerCase());
4493
- case "contains": return clause.values.some((candidate) => toText(value).toLowerCase().includes(candidate.toLowerCase()));
4510
+ case "exists": return readValues(value).some((item) => item !== void 0 && item !== null && item !== "");
4511
+ case "eq": return clause.values.some((candidate) => readValues(value).some((item) => toText(item).toLowerCase() === candidate.toLowerCase()));
4512
+ case "contains": return clause.values.some((candidate) => readValues(value).some((item) => toText(item).toLowerCase().includes(candidate.toLowerCase())));
4494
4513
  case "gt":
4495
4514
  var _clause$values$;
4496
4515
  return compare(value, (_clause$values$ = clause.values[0]) !== null && _clause$values$ !== void 0 ? _clause$values$ : "") > 0;
@@ -4526,7 +4545,7 @@ function matchesQueryObject(query, row, options = {}) {
4526
4545
  let cached = null;
4527
4546
  const searchable = () => {
4528
4547
  var _cached;
4529
- (_cached = cached) !== null && _cached !== void 0 || (cached = [...Object.values(row).filter((value) => typeof value !== "object"), ...Object.values(nested !== null && nested !== void 0 ? nested : {})].map(toText).join(" "));
4548
+ (_cached = cached) !== null && _cached !== void 0 || (cached = [...Object.values(row).flatMap((value) => Array.isArray(value) ? value.filter((item) => typeof item !== "object") : typeof value === "object" ? [] : [value]), ...Object.values(nested !== null && nested !== void 0 ? nested : {})].map(toText).join(" "));
4530
4549
  return cached;
4531
4550
  };
4532
4551
  return matchesQuery(query, read, searchable);
package/dist/index.d.cts CHANGED
@@ -64,12 +64,13 @@ interface StatusDotProps extends Omit<ComponentPropsWithoutRef<"span">, "childre
64
64
  */
65
65
  children: ReactNode;
66
66
  /**
67
- * How the state was decided, as a `title`.
67
+ * How the state was decided.
68
68
  *
69
- * Mouse-only: a `title` does not open on keyboard focus and is unreachable on
70
- * touch. It is a bonus for the reader who hovers, never the only place a rule
71
- * lives if knowing the rule is required to act, put it in text beside the
72
- * status instead.
69
+ * Shown in a tooltip that opens on hover and on keyboard focus, so the rule
70
+ * is reachable without a pointer. Giving a hint makes the dot a tab stop
71
+ * the only way a keyboard reader can reach it so it is still a bonus for
72
+ * the curious rather than the only place a rule lives: if knowing the rule is
73
+ * required to act, put it in text beside the status instead.
73
74
  */
74
75
  hint?: string;
75
76
  }
@@ -84,6 +85,10 @@ interface StatusDotProps extends Omit<ComponentPropsWithoutRef<"span">, "childre
84
85
  * The dot is decorative on purpose. It never carries meaning the text does not
85
86
  * also carry, so the component cannot be used to say something in colour alone.
86
87
  *
88
+ * Without a `hint` this renders one span and nothing else: a table repeats this
89
+ * on every row, and a tooltip's provider, listeners and floating context are
90
+ * not a cost worth paying hundreds of times for rows that have nothing to say.
91
+ *
87
92
  * @example
88
93
  * ```tsx
89
94
  * <StatusDot tone="warning" hint="7일 이상 수신되지 않음">비활성</StatusDot>
package/dist/index.d.ts CHANGED
@@ -64,12 +64,13 @@ interface StatusDotProps extends Omit<ComponentPropsWithoutRef<"span">, "childre
64
64
  */
65
65
  children: ReactNode;
66
66
  /**
67
- * How the state was decided, as a `title`.
67
+ * How the state was decided.
68
68
  *
69
- * Mouse-only: a `title` does not open on keyboard focus and is unreachable on
70
- * touch. It is a bonus for the reader who hovers, never the only place a rule
71
- * lives if knowing the rule is required to act, put it in text beside the
72
- * status instead.
69
+ * Shown in a tooltip that opens on hover and on keyboard focus, so the rule
70
+ * is reachable without a pointer. Giving a hint makes the dot a tab stop
71
+ * the only way a keyboard reader can reach it so it is still a bonus for
72
+ * the curious rather than the only place a rule lives: if knowing the rule is
73
+ * required to act, put it in text beside the status instead.
73
74
  */
74
75
  hint?: string;
75
76
  }
@@ -84,6 +85,10 @@ interface StatusDotProps extends Omit<ComponentPropsWithoutRef<"span">, "childre
84
85
  * The dot is decorative on purpose. It never carries meaning the text does not
85
86
  * also carry, so the component cannot be used to say something in colour alone.
86
87
  *
88
+ * Without a `hint` this renders one span and nothing else: a table repeats this
89
+ * on every row, and a tooltip's provider, listeners and floating context are
90
+ * not a cost worth paying hundreds of times for rows that have nothing to say.
91
+ *
87
92
  * @example
88
93
  * ```tsx
89
94
  * <StatusDot tone="warning" hint="7일 이상 수신되지 않음">비활성</StatusDot>
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use client";
2
- import { $ as PopoverClose, $t as CompositeProvider, A as FormRadio, An as OPT_BADGE_RED, At as DialogBody, B as FormSubmit, Bn as OPT_FOCUS, Bt as SelectLabel, C as FormGroupLabel, Ct as ComboboxGroup, D as FormNumberInput, Dn as OPT_BADGE_BLUE, Dt as ComboboxPopover, E as FormLabel, Et as ComboboxItem, F as FormSelect, Ft as DialogHeader, G as useFormContext, Gt as TabList, H as FormTagInput, Hn as OPT_HOVER_ITEM, Ht as SelectRoot, I as FormSelectItem, In as OPT_DOT_GRAY, It as DialogHeading, J as DateRangePicker, Jt as DisclosureContent, K as useFormStore, Kt as TabPanel, L as FormSelectPopover, Ln as OPT_DOT_GREEN, Lt as DialogPanel, M as FormRemove, Mn as OPT_BORDER, Mt as DialogDisclosure, N as FormReset, Nt as DialogDismiss, O as FormProvider, On as OPT_BADGE_GREEN, Ot as ComboboxRoot, P as FormRoot, Pt as DialogFooter, Q as ColorPicker, Qt as CompositeItem, R as FormSlider, Rn as OPT_DOT_RED, Rt as DialogRoot, S as FormGroup, St as ComboboxEmpty, T as FormInput, Tt as ComboboxInput, U as FormTextarea, Un as OPT_INPUT, Ut as SelectTrigger, V as FormSwitch, Vn as OPT_FOCUS_VISIBLE, Vt as SelectPopover, W as useFieldValue, Wt as Tab, X as IconPicker, Xn as OPT_TD, Xt as DisclosureTrigger, Y as TagInput, Yt as DisclosureRoot, Z as getIconRegistryEntry, Zt as Composite, _ as FormControl, _n as SkeletonCard, _t as MenuRoot, a as FieldTokenLegend, an as useInputId, ar as _objectWithoutProperties, at as ToolbarButton, b as FormError, bn as useControlledState, bt as MenubarContainer, c as Checkbox, cn as Badge, ct as ToolbarSeparator, d as formatOptDateTime, dn as koBreadcrumbLabels, dt as TooltipProvider, en as CompositeRow, er as OPT_TEXT_PRIMARY, et as PopoverContent, f as formatOptNumber, fn as koComboboxLabels, ft as MenuButtonArrow, g as FormColorPicker, gn as SkeletonAvatar, gt as MenuPopover, h as FormCheckbox, hn as Skeleton, ht as MenuItemRadio, i as FieldToken, in as Input, ir as _objectSpread2, it as NumberInput, j as FormRadioGroup, jn as OPT_BADGE_YELLOW, jt as DialogDescription, k as FormPush, kn as OPT_BADGE_NEUTRAL, kt as AlertDialogPanel, l as CheckboxGroup, ln as EmptyState, lt as Tooltip, m as formatOptTime, mn as StatCard, mt as MenuItemCheckbox, n as Highlight, nn as Meter, nr as OPT_TEXT_TERTIARY, nt as PopoverTrigger, o as resolveFieldType, on as Alert, or as Kbd, ot as ToolbarContainer, p as formatOptShortDate, pn as koStarRatingLabels, pt as MenuItem, q as DEFAULT_PRESETS, qt as TabsRoot, r as FIELD_TYPE_TOKENS, rn as StarRating, rr as OPT_TH, rt as Slider, s as Pagination, sn as Spinner, sr as cn, st as ToolbarRoot, t as TextTruncate, tn as CompositeZone, tr as OPT_TEXT_SECONDARY, tt as PopoverRoot, un as Button, ut as TooltipAnchor, v as FormDateRangePicker, vn as SkeletonTable, vt as MenuSeparator, w as FormIconPicker, wt as ComboboxGroupLabel, x as FormField, xt as MenubarRoot, y as FormDescription, yn as SkeletonText, yt as MenuTrigger, z as FormStarRating, zn as OPT_DOT_YELLOW, zt as SelectItem } from "./text-truncate-DSuZECy0.js";
3
- import { $ as Identity, A as PageHeader, B as DropdownTrigger, C as Logo, D as Section, E as ResizablePanelGroup, F as RadioGroup, G as Textarea, H as StepBuilder, I as DropdownContent, J as CardContent, K as Switch, L as DropdownItem, M as BlockLayout, N as LoadingOverlay, O as Container, P as Radio, Q as CardTitle, R as DropdownMenu, S as DrawerRoot, T as ResizablePanel, U as CircularProgress, V as ConditionBuilder, W as Progress, X as CardFooter, Y as CardDescription, Z as CardHeader, _ as getShaderFragment, a as THEME_PALETTES, at as AccordionItem, b as DrawerClose, c as ExpressionGroup, ct as Toggle, d as ShaderSurface, dt as Separator, et as Avatar, f as SHADER_OVERLAY_PARAM_KEYS, ft as Heading, g as SHADER_PRESET_IDS, h as SHADER_PRESETS, i as ColorPalettePicker, it as AccordionContent, j as createBlock, k as ScrollArea, l as Facet, lt as ToggleGroup, m as SHADER_PARAM_KEYS, n as InlineEdit, nt as DescriptionList, o as LiveRegion, ot as AccordionRoot, p as SHADER_PARAM_FALLBACK, pt as Text, q as Card, r as ColorPaletteDisplay, rt as Breadcrumb, s as Expression, st as AccordionTrigger, t as KeyPadMenu, tt as AvatarGroup, u as FacetGroup, ut as OtpField, v as getShaderPreset, w as ResizableHandle, x as DrawerPanel, y as VirtualList, z as DropdownSeparator } from "./key-pad-menu-Di2aRGbM.js";
4
- import { $ as CommandGroup, A as ToastProvider, B as FaqAccordion, C as Flyout, D as KeyValueEditor, E as WorkflowCanvas, F as BranchSelect, G as StatusSelect, H as EditorToolbar, I as EnvPanel, J as CommandPaletteTrigger, K as SearchCombobox, L as ProjectSwitcher, M as useToast, N as DataTable, O as FailureList, P as DomainTable, Q as CommandEmpty, R as DeploymentTimeline, S as withoutField, T as EventTimeline, U as SidebarNav, V as ContentTabs, W as AppMenubar, X as Command, Y as CommandPalette, Z as CommandDialog, _ as fieldValues, a as TimeRangeControl, b as removeClause, c as describeClause, d as quoteValue, et as CommandInput, f as parseQuery, g as applyCellAction, h as addClause, i as DEFAULT_TIME_PRESETS, it as CommandShortcut, j as toast, k as NotificationToast, l as formatClause, m as EMPTY_QUERY, n as LogTable, nt as CommandList, o as useAutoRefresh, p as parseQueryWithDiagnostics, q as DashboardGrid, r as TimeSeriesPanel, rt as CommandSeparator, s as QueryBar, t as FieldSidebar, tt as CommandItem, u as formatQuery, v as isEmptyQuery, w as ScoreBreakdown, x as withFieldValue, y as queryFields, z as SettingsForm } from "./field-sidebar-zkkqC7__.js";
2
+ import { $ as PopoverClose, $t as ToolbarButton, A as FormRadio, An as OPT_BADGE_RED, At as DialogPanel, B as FormSubmit, Bn as OPT_FOCUS, Bt as TabsRoot, C as FormGroupLabel, Ct as DialogBody, D as FormNumberInput, Dn as OPT_BADGE_BLUE, Dt as DialogFooter, E as FormLabel, Et as DialogDismiss, F as FormSelect, Ft as SelectRoot, G as useFormContext, Gt as CompositeItem, H as FormTagInput, Hn as OPT_HOVER_ITEM, Ht as DisclosureRoot, I as FormSelectItem, In as OPT_DOT_GRAY, It as SelectTrigger, J as DateRangePicker, Jt as CompositeZone, K as useFormStore, Kt as CompositeProvider, L as FormSelectPopover, Ln as OPT_DOT_GREEN, Lt as Tab, M as FormRemove, Mn as OPT_BORDER, Mt as SelectItem, N as FormReset, Nt as SelectLabel, O as FormProvider, On as OPT_BADGE_GREEN, Ot as DialogHeader, P as FormRoot, Pt as SelectPopover, Q as ColorPicker, Qt as useInputId, R as FormSlider, Rn as OPT_DOT_RED, Rt as TabList, S as FormGroup, St as AlertDialogPanel, T as FormInput, Tt as DialogDisclosure, U as FormTextarea, Un as OPT_INPUT, Ut as DisclosureTrigger, V as FormSwitch, Vn as OPT_FOCUS_VISIBLE, Vt as DisclosureContent, W as useFieldValue, Wt as Composite, X as IconPicker, Xn as OPT_TD, Xt as StarRating, Y as TagInput, Yt as Meter, Z as getIconRegistryEntry, Zt as Input, _ as FormControl, _n as SkeletonCard, _t as ComboboxGroupLabel, a as FieldTokenLegend, an as TooltipProvider, ar as _objectWithoutProperties, at as MenuButtonArrow, b as FormError, bn as useControlledState, bt as ComboboxPopover, c as Checkbox, cn as Badge, ct as MenuItemRadio, d as formatOptDateTime, dn as koBreadcrumbLabels, dt as MenuSeparator, en as ToolbarContainer, er as OPT_TEXT_PRIMARY, et as PopoverContent, f as formatOptNumber, fn as koComboboxLabels, ft as MenuTrigger, g as FormColorPicker, gn as SkeletonAvatar, gt as ComboboxGroup, h as FormCheckbox, hn as Skeleton, ht as ComboboxEmpty, i as FieldToken, in as TooltipAnchor, ir as _objectSpread2, it as NumberInput, j as FormRadioGroup, jn as OPT_BADGE_YELLOW, jt as DialogRoot, k as FormPush, kn as OPT_BADGE_NEUTRAL, kt as DialogHeading, l as CheckboxGroup, ln as EmptyState, lt as MenuPopover, m as formatOptTime, mn as StatCard, mt as MenubarRoot, n as Highlight, nn as ToolbarSeparator, nr as OPT_TEXT_TERTIARY, nt as PopoverTrigger, o as resolveFieldType, on as Alert, or as Kbd, ot as MenuItem, p as formatOptShortDate, pn as koStarRatingLabels, pt as MenubarContainer, q as DEFAULT_PRESETS, qt as CompositeRow, r as FIELD_TYPE_TOKENS, rn as Tooltip, rr as OPT_TH, rt as Slider, s as Pagination, sn as Spinner, sr as cn, st as MenuItemCheckbox, t as TextTruncate, tn as ToolbarRoot, tr as OPT_TEXT_SECONDARY, tt as PopoverRoot, un as Button, ut as MenuRoot, v as FormDateRangePicker, vn as SkeletonTable, vt as ComboboxInput, w as FormIconPicker, wt as DialogDescription, x as FormField, xt as ComboboxRoot, y as FormDescription, yn as SkeletonText, yt as ComboboxItem, z as FormStarRating, zn as OPT_DOT_YELLOW, zt as TabPanel } from "./text-truncate-BFWd2cE_.js";
3
+ import { $ as Identity, A as PageHeader, B as DropdownTrigger, C as Logo, D as Section, E as ResizablePanelGroup, F as RadioGroup, G as Textarea, H as StepBuilder, I as DropdownContent, J as CardContent, K as Switch, L as DropdownItem, M as BlockLayout, N as LoadingOverlay, O as Container, P as Radio, Q as CardTitle, R as DropdownMenu, S as DrawerRoot, T as ResizablePanel, U as CircularProgress, V as ConditionBuilder, W as Progress, X as CardFooter, Y as CardDescription, Z as CardHeader, _ as getShaderFragment, a as THEME_PALETTES, at as AccordionItem, b as DrawerClose, c as ExpressionGroup, ct as Toggle, d as ShaderSurface, dt as Separator, et as Avatar, f as SHADER_OVERLAY_PARAM_KEYS, ft as Heading, g as SHADER_PRESET_IDS, h as SHADER_PRESETS, i as ColorPalettePicker, it as AccordionContent, j as createBlock, k as ScrollArea, l as Facet, lt as ToggleGroup, m as SHADER_PARAM_KEYS, n as InlineEdit, nt as DescriptionList, o as LiveRegion, ot as AccordionRoot, p as SHADER_PARAM_FALLBACK, pt as Text, q as Card, r as ColorPaletteDisplay, rt as Breadcrumb, s as Expression, st as AccordionTrigger, t as KeyPadMenu, tt as AvatarGroup, u as FacetGroup, ut as OtpField, v as getShaderPreset, w as ResizableHandle, x as DrawerPanel, y as VirtualList, z as DropdownSeparator } from "./key-pad-menu-CUiQ-vKw.js";
4
+ import { $ as CommandGroup, A as ToastProvider, B as FaqAccordion, C as Flyout, D as KeyValueEditor, E as WorkflowCanvas, F as BranchSelect, G as StatusSelect, H as EditorToolbar, I as EnvPanel, J as CommandPaletteTrigger, K as SearchCombobox, L as ProjectSwitcher, M as useToast, N as DataTable, O as FailureList, P as DomainTable, Q as CommandEmpty, R as DeploymentTimeline, S as withoutField, T as EventTimeline, U as SidebarNav, V as ContentTabs, W as AppMenubar, X as Command, Y as CommandPalette, Z as CommandDialog, _ as fieldValues, a as TimeRangeControl, b as removeClause, c as describeClause, d as quoteValue, et as CommandInput, f as parseQuery, g as applyCellAction, h as addClause, i as DEFAULT_TIME_PRESETS, it as CommandShortcut, j as toast, k as NotificationToast, l as formatClause, m as EMPTY_QUERY, n as LogTable, nt as CommandList, o as useAutoRefresh, p as parseQueryWithDiagnostics, q as DashboardGrid, r as TimeSeriesPanel, rt as CommandSeparator, s as QueryBar, t as FieldSidebar, tt as CommandItem, u as formatQuery, v as isEmptyQuery, w as ScoreBreakdown, x as withFieldValue, y as queryFields, z as SettingsForm } from "./field-sidebar-BXAXigMS.js";
5
5
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
6
  import * as React from "react";
7
7
  import { Component, createContext, useCallback, useContext, useEffect, useId, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
@@ -149,6 +149,10 @@ const dotSize = {
149
149
  * The dot is decorative on purpose. It never carries meaning the text does not
150
150
  * also carry, so the component cannot be used to say something in colour alone.
151
151
  *
152
+ * Without a `hint` this renders one span and nothing else: a table repeats this
153
+ * on every row, and a tooltip's provider, listeners and floating context are
154
+ * not a cost worth paying hundreds of times for rows that have nothing to say.
155
+ *
152
156
  * @example
153
157
  * ```tsx
154
158
  * <StatusDot tone="warning" hint="7일 이상 수신되지 않음">비활성</StatusDot>
@@ -156,9 +160,9 @@ const dotSize = {
156
160
  */
157
161
  function StatusDot(_ref) {
158
162
  let { tone = "neutral", size = "md", hint, className, children } = _ref, props = _objectWithoutProperties(_ref, _excluded$1);
159
- return /* @__PURE__ */ jsxs("span", _objectSpread2(_objectSpread2({
160
- className: cn("inline-flex items-center whitespace-nowrap", sizeStyles$2[size], textTone[tone], className),
161
- title: hint
163
+ const dot = /* @__PURE__ */ jsxs("span", _objectSpread2(_objectSpread2({
164
+ className: cn("inline-flex items-center whitespace-nowrap", sizeStyles$2[size], textTone[tone], hint && "focus-visible:ring-ring rounded-sm outline-none focus-visible:ring-2", className),
165
+ tabIndex: hint ? 0 : void 0
162
166
  }, props), {}, {
163
167
  "data-opt-id": "N51AT",
164
168
  "data-opt-slug": "status-dot.StatusDot",
@@ -168,6 +172,8 @@ function StatusDot(_ref) {
168
172
  "aria-hidden": "true"
169
173
  }), children]
170
174
  }));
175
+ if (!hint) return dot;
176
+ return /* @__PURE__ */ jsxs(TooltipProvider, { children: [/* @__PURE__ */ jsx(TooltipAnchor, { render: dot }), /* @__PURE__ */ jsx(Tooltip, { children: hint })] });
171
177
  }
172
178
  //#endregion
173
179
  //#region src/core/copy-button.tsx
@@ -4478,6 +4484,19 @@ function toText(value) {
4478
4484
  if (typeof value === "number" || typeof value === "boolean") return String(value);
4479
4485
  return JSON.stringify(value);
4480
4486
  }
4487
+ /**
4488
+ * The values one field holds, as a list.
4489
+ *
4490
+ * A clause names a single value, so an array field has to be read element by
4491
+ * element: `tag:pay` asks whether *any* tag is `pay`, not whether the whole
4492
+ * list stringifies to it — and `toText` on an array produces `["pay","cart"]`,
4493
+ * which no user ever types. Scalars read as a list of one so both shapes take
4494
+ * the same path, and negation stays where it already is: `matchesQuery` flips
4495
+ * the result, so `-tag:pay` correctly means "no element matches".
4496
+ */
4497
+ function readValues(value) {
4498
+ return Array.isArray(value) ? value : [value];
4499
+ }
4481
4500
  function compare(left, right) {
4482
4501
  const leftNumber = typeof left === "number" ? left : Number(toText(left));
4483
4502
  const rightNumber = Number(right);
@@ -4488,9 +4507,9 @@ function matchesClause(clause, read, searchable) {
4488
4507
  if (clause.type === "term") return searchable().toLowerCase().includes(clause.value.toLowerCase());
4489
4508
  const value = read(clause.field);
4490
4509
  switch (clause.operator) {
4491
- case "exists": return value !== void 0 && value !== null && value !== "";
4492
- case "eq": return clause.values.some((candidate) => toText(value).toLowerCase() === candidate.toLowerCase());
4493
- case "contains": return clause.values.some((candidate) => toText(value).toLowerCase().includes(candidate.toLowerCase()));
4510
+ case "exists": return readValues(value).some((item) => item !== void 0 && item !== null && item !== "");
4511
+ case "eq": return clause.values.some((candidate) => readValues(value).some((item) => toText(item).toLowerCase() === candidate.toLowerCase()));
4512
+ case "contains": return clause.values.some((candidate) => readValues(value).some((item) => toText(item).toLowerCase().includes(candidate.toLowerCase())));
4494
4513
  case "gt":
4495
4514
  var _clause$values$;
4496
4515
  return compare(value, (_clause$values$ = clause.values[0]) !== null && _clause$values$ !== void 0 ? _clause$values$ : "") > 0;
@@ -4526,7 +4545,7 @@ function matchesQueryObject(query, row, options = {}) {
4526
4545
  let cached = null;
4527
4546
  const searchable = () => {
4528
4547
  var _cached;
4529
- (_cached = cached) !== null && _cached !== void 0 || (cached = [...Object.values(row).filter((value) => typeof value !== "object"), ...Object.values(nested !== null && nested !== void 0 ? nested : {})].map(toText).join(" "));
4548
+ (_cached = cached) !== null && _cached !== void 0 || (cached = [...Object.values(row).flatMap((value) => Array.isArray(value) ? value.filter((item) => typeof item !== "object") : typeof value === "object" ? [] : [value]), ...Object.values(nested !== null && nested !== void 0 ? nested : {})].map(toText).join(" "));
4530
4549
  return cached;
4531
4550
  };
4532
4551
  return matchesQuery(query, read, searchable);
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- const require_text_truncate = require("./text-truncate-I1XLWmRa.cjs");
2
+ const require_text_truncate = require("./text-truncate-DsG5UAOY.cjs");
3
3
  let react_jsx_runtime = require("react/jsx-runtime");
4
4
  let react = require("react");
5
5
  react = require_text_truncate.__toESM(react, 1);
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { Bn as OPT_FOCUS, Cn as getDescribedBy, En as OPT_ANIMATE_ENTER_EXIT, Ht as SelectRoot$1, Kn as OPT_SURFACE, Mn as OPT_BORDER, Qn as OPT_TEXTAREA_SIZE, Sn as RequiredMark, Tn as OPT_ANIMATE_DRAWER, Un as OPT_INPUT, Ut as SelectTrigger$1, Vn as OPT_FOCUS_VISIBLE, Vt as SelectPopover$1, _t as MenuRoot$1, an as useInputId, ar as _objectWithoutProperties, bn as useControlledState, cn as Badge, dn as koBreadcrumbLabels, er as OPT_TEXT_PRIMARY, f as formatOptNumber, gt as MenuPopover$1, ir as _objectSpread2, nr as OPT_TEXT_TERTIARY, pt as MenuItem$1, sn as Spinner, sr as cn, tr as OPT_TEXT_SECONDARY, un as Button, vt as MenuSeparator$1, xn as FieldMessages, yt as MenuTrigger$1, zt as SelectItem$1 } from "./text-truncate-DSuZECy0.js";
2
+ import { Bn as OPT_FOCUS, Cn as getDescribedBy, En as OPT_ANIMATE_ENTER_EXIT, Ft as SelectRoot$1, It as SelectTrigger$1, Kn as OPT_SURFACE, Mn as OPT_BORDER, Mt as SelectItem$1, Pt as SelectPopover$1, Qn as OPT_TEXTAREA_SIZE, Qt as useInputId, Sn as RequiredMark, Tn as OPT_ANIMATE_DRAWER, Un as OPT_INPUT, Vn as OPT_FOCUS_VISIBLE, ar as _objectWithoutProperties, bn as useControlledState, cn as Badge, dn as koBreadcrumbLabels, dt as MenuSeparator$1, er as OPT_TEXT_PRIMARY, f as formatOptNumber, ft as MenuTrigger$1, ir as _objectSpread2, lt as MenuPopover$1, nr as OPT_TEXT_TERTIARY, ot as MenuItem$1, sn as Spinner, sr as cn, tr as OPT_TEXT_SECONDARY, un as Button, ut as MenuRoot$1, xn as FieldMessages } from "./text-truncate-BFWd2cE_.js";
3
3
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
4
4
  import * as React from "react";
5
5
  import { createContext, createElement, forwardRef, useCallback, useContext, useEffect, useId, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState } from "react";
package/dist/meta.cjs CHANGED
@@ -5067,11 +5067,11 @@ const MyDashboard = createBlock<MyDashboardProps>(
5067
5067
  {
5068
5068
  name: "hint",
5069
5069
  type: "string",
5070
- description: "판정 기준 툴팁"
5070
+ description: "판정 기준. 호버·키보드 포커스로 열리는 툴팁이며, 지정하면 이 항목이 탭 정지점이 됩니다"
5071
5071
  }
5072
5072
  ] },
5073
5073
  usage: {
5074
- bestPractices: ["표의 상태 컬럼처럼 행마다 반복되는 자리에 씁니다. 점은 장식이고 의미는 텍스트가 담습니다."],
5074
+ bestPractices: ["표의 상태 컬럼처럼 행마다 반복되는 자리에 씁니다. 점은 장식이고 의미는 텍스트가 담습니다.", "hint는 행마다 탭 정지점을 하나 늘립니다. 알아야 행동할 수 있는 규칙이면 툴팁이 아니라 상태 옆 텍스트에 씁니다."],
5075
5075
  avoid: ["사람이 붙인 라벨(태그, 카테고리)에는 Badge를 씁니다. StatusDot은 관측된 상태용입니다."]
5076
5076
  },
5077
5077
  testDescribe: "StatusDot"
package/dist/meta.js CHANGED
@@ -5066,11 +5066,11 @@ const MyDashboard = createBlock<MyDashboardProps>(
5066
5066
  {
5067
5067
  name: "hint",
5068
5068
  type: "string",
5069
- description: "판정 기준 툴팁"
5069
+ description: "판정 기준. 호버·키보드 포커스로 열리는 툴팁이며, 지정하면 이 항목이 탭 정지점이 됩니다"
5070
5070
  }
5071
5071
  ] },
5072
5072
  usage: {
5073
- bestPractices: ["표의 상태 컬럼처럼 행마다 반복되는 자리에 씁니다. 점은 장식이고 의미는 텍스트가 담습니다."],
5073
+ bestPractices: ["표의 상태 컬럼처럼 행마다 반복되는 자리에 씁니다. 점은 장식이고 의미는 텍스트가 담습니다.", "hint는 행마다 탭 정지점을 하나 늘립니다. 알아야 행동할 수 있는 규칙이면 툴팁이 아니라 상태 옆 텍스트에 씁니다."],
5074
5074
  avoid: ["사람이 붙인 라벨(태그, 카테고리)에는 Badge를 씁니다. StatusDot은 관측된 상태용입니다."]
5075
5075
  },
5076
5076
  testDescribe: "StatusDot"
package/dist/query.cjs CHANGED
@@ -115,7 +115,7 @@ function tokenize(input) {
115
115
  return tokens;
116
116
  }
117
117
  /** `(a or b)` → `["a", "b"]`; anything else is a single value. */
118
- function readValues(raw) {
118
+ function readValues$1(raw) {
119
119
  const trimmed = raw.trim();
120
120
  if (!trimmed.startsWith("(")) return [stripQuotes(trimmed)];
121
121
  return trimmed.replace(/^\(/, "").replace(/\)$/, "").split(/\s+or\s+/i).map((part) => stripQuotes(part.trim())).filter((part) => part.length > 0);
@@ -219,7 +219,7 @@ function parseQueryWithDiagnostics(input) {
219
219
  });
220
220
  continue;
221
221
  }
222
- const values = readValues(rawValue);
222
+ const values = readValues$1(rawValue);
223
223
  if (values.length === 0) {
224
224
  diagnostics.push({
225
225
  at: token.at,
@@ -313,6 +313,19 @@ function toText(value) {
313
313
  if (typeof value === "number" || typeof value === "boolean") return String(value);
314
314
  return JSON.stringify(value);
315
315
  }
316
+ /**
317
+ * The values one field holds, as a list.
318
+ *
319
+ * A clause names a single value, so an array field has to be read element by
320
+ * element: `tag:pay` asks whether *any* tag is `pay`, not whether the whole
321
+ * list stringifies to it — and `toText` on an array produces `["pay","cart"]`,
322
+ * which no user ever types. Scalars read as a list of one so both shapes take
323
+ * the same path, and negation stays where it already is: `matchesQuery` flips
324
+ * the result, so `-tag:pay` correctly means "no element matches".
325
+ */
326
+ function readValues(value) {
327
+ return Array.isArray(value) ? value : [value];
328
+ }
316
329
  function compare(left, right) {
317
330
  const leftNumber = typeof left === "number" ? left : Number(toText(left));
318
331
  const rightNumber = Number(right);
@@ -323,9 +336,9 @@ function matchesClause(clause, read, searchable) {
323
336
  if (clause.type === "term") return searchable().toLowerCase().includes(clause.value.toLowerCase());
324
337
  const value = read(clause.field);
325
338
  switch (clause.operator) {
326
- case "exists": return value !== void 0 && value !== null && value !== "";
327
- case "eq": return clause.values.some((candidate) => toText(value).toLowerCase() === candidate.toLowerCase());
328
- case "contains": return clause.values.some((candidate) => toText(value).toLowerCase().includes(candidate.toLowerCase()));
339
+ case "exists": return readValues(value).some((item) => item !== void 0 && item !== null && item !== "");
340
+ case "eq": return clause.values.some((candidate) => readValues(value).some((item) => toText(item).toLowerCase() === candidate.toLowerCase()));
341
+ case "contains": return clause.values.some((candidate) => readValues(value).some((item) => toText(item).toLowerCase().includes(candidate.toLowerCase())));
329
342
  case "gt":
330
343
  var _clause$values$;
331
344
  return compare(value, (_clause$values$ = clause.values[0]) !== null && _clause$values$ !== void 0 ? _clause$values$ : "") > 0;
@@ -361,7 +374,7 @@ function matchesQueryObject(query, row, options = {}) {
361
374
  let cached = null;
362
375
  const searchable = () => {
363
376
  var _cached;
364
- (_cached = cached) !== null && _cached !== void 0 || (cached = [...Object.values(row).filter((value) => typeof value !== "object"), ...Object.values(nested !== null && nested !== void 0 ? nested : {})].map(toText).join(" "));
377
+ (_cached = cached) !== null && _cached !== void 0 || (cached = [...Object.values(row).flatMap((value) => Array.isArray(value) ? value.filter((item) => typeof item !== "object") : typeof value === "object" ? [] : [value]), ...Object.values(nested !== null && nested !== void 0 ? nested : {})].map(toText).join(" "));
365
378
  return cached;
366
379
  };
367
380
  return matchesQuery(query, read, searchable);