@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.
- package/COMPONENT_CATALOG.md +7 -7
- package/README.md +6 -1
- package/dist/core/index.cjs +2 -2
- package/dist/core/index.js +2 -2
- package/dist/docs/02-components/01-core.md +7 -7
- package/dist/docs/02-components/02-visuals.md +1 -1
- package/dist/docs/02-components/03-shells.md +1 -1
- package/dist/docs/02-components/04-surfaces.md +1 -1
- package/dist/docs/02-components/index.md +1 -1
- package/dist/{field-sidebar-zkkqC7__.js → field-sidebar-BXAXigMS.js} +1 -1
- package/dist/{field-sidebar-oa6zOmcd.cjs → field-sidebar-D0ITbhfJ.cjs} +1 -1
- package/dist/index.cjs +29 -10
- package/dist/index.d.cts +10 -5
- package/dist/index.d.ts +10 -5
- package/dist/index.js +29 -10
- package/dist/{key-pad-menu-SItoHPLu.cjs → key-pad-menu-1YN221Oi.cjs} +1 -1
- package/dist/{key-pad-menu-Di2aRGbM.js → key-pad-menu-CUiQ-vKw.js} +1 -1
- package/dist/meta.cjs +2 -2
- package/dist/meta.js +2 -2
- package/dist/query.cjs +19 -6
- package/dist/query.js +19 -6
- package/dist/shells/index.cjs +1 -1
- package/dist/shells/index.js +1 -1
- package/dist/{text-truncate-DSuZECy0.js → text-truncate-BFWd2cE_.js} +116 -116
- package/dist/{text-truncate-I1XLWmRa.cjs → text-truncate-DsG5UAOY.cjs} +115 -115
- package/package.json +1 -1
package/COMPONENT_CATALOG.md
CHANGED
|
@@ -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.
|
|
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
|
|
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>의 값 분포 필터도 같은
|
package/dist/core/index.cjs
CHANGED
|
@@ -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-
|
|
4
|
-
const require_key_pad_menu = require("../key-pad-menu-
|
|
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;
|
package/dist/core/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { $ as PopoverClose, $t as
|
|
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-
|
|
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.
|
|
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,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { $n as OPT_TEXT_LABEL, $t as
|
|
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-
|
|
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-
|
|
4
|
-
const require_key_pad_menu = require("./key-pad-menu-
|
|
5
|
-
const require_field_sidebar = require("./field-sidebar-
|
|
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
|
-
|
|
160
|
-
className: require_text_truncate.cn("inline-flex items-center whitespace-nowrap", sizeStyles$2[size], textTone[tone], className),
|
|
161
|
-
|
|
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 &&
|
|
4492
|
-
case "eq": return clause.values.some((candidate) =>
|
|
4493
|
-
case "contains": return clause.values.some((candidate) =>
|
|
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).
|
|
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
|
|
67
|
+
* How the state was decided.
|
|
68
68
|
*
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
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
|
|
67
|
+
* How the state was decided.
|
|
68
68
|
*
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
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
|
|
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-
|
|
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-
|
|
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
|
-
|
|
160
|
-
className: cn("inline-flex items-center whitespace-nowrap", sizeStyles$2[size], textTone[tone], className),
|
|
161
|
-
|
|
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 &&
|
|
4492
|
-
case "eq": return clause.values.some((candidate) =>
|
|
4493
|
-
case "contains": return clause.values.some((candidate) =>
|
|
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).
|
|
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-
|
|
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,
|
|
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 &&
|
|
327
|
-
case "eq": return clause.values.some((candidate) =>
|
|
328
|
-
case "contains": return clause.values.some((candidate) =>
|
|
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).
|
|
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);
|