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