@skygraph/vue 0.0.0-placeholder.0 → 0.5.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/LICENSE +21 -0
- package/README.md +115 -6
- package/dist/index.cjs +23 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +7717 -0
- package/dist/index.js +16181 -0
- package/dist/index.js.map +1 -0
- package/dist/style.css +1 -0
- package/package.json +78 -18
- package/index.js +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/composables/useForm.ts","../src/composables/useField.ts","../src/composables/useFieldArray.ts","../src/composables/useWatch.ts","../src/composables/useComputed.ts","../src/composables/useTable.ts","../src/composables/useTree.ts","../src/composables/useGraph.ts","../src/composables/useFocusTrap.ts","../src/composables/useRovingTabIndex.ts","../src/composables/useListNavigation.ts","../src/composables/useVirtualScroll.ts","../src/composables/useHistory.ts","../src/components/ui/Input.vue","../src/components/ui/Checkbox.vue","../src/components/ui/Select.vue","../src/components/ui/ConfigProvider.vue","../src/components/ui/Pagination.vue","../src/components/ui/Spin.vue","../src/components/complex/Table/types.ts","../src/components/complex/Table/Table.vue","../src/components/complex/Tree/TreeNodeRow.vue","../src/components/complex/Tree/types.ts","../src/components/complex/Tree/Tree.vue","../src/components/complex/List/List.vue","../src/components/complex/VirtualList/VirtualList.vue","../src/components/complex/DataGrid/DataGrid.vue","../src/composables/useChartSize.ts","../src/utils/print/printElement.ts","../src/components/complex/Charts/types.ts","../src/components/complex/Charts/ChartLegend.vue","../src/components/complex/Charts/ChartAxes.vue","../src/components/complex/Charts/ChartCrosshair.vue","../src/components/complex/Charts/ChartBrush.vue","../src/components/complex/Charts/LineChart.vue","../src/components/complex/Charts/BarChart.vue","../src/components/complex/Charts/AreaChart.vue","../src/components/complex/Charts/PieChart.vue","../src/components/complex/Charts/ChartHoverToolbar.vue","../src/components/complex/Charts/download.ts","../src/components/complex/Charts/chartActions.ts","../src/components/complex/Charts/contextMenu.ts","../src/components/complex/Diagram/Diagram.vue","../src/components/complex/Dashboard/Dashboard.vue","../src/components/complex/Dashboard/DashboardEditor.vue","../src/components/complex/Gantt/Gantt.vue","../src/components/complex/Timeline/EventTimeline.vue","../src/components/complex/ResourceCalendar/ResourceCalendar.vue","../src/components/complex/Form/context.ts","../src/components/complex/Form/providerContext.ts","../src/components/complex/Form/Form.vue","../src/components/complex/Form/Field.vue","../src/components/complex/Form/FormList.vue","../src/components/complex/Form/FormProvider.vue","../src/components/complex/SchemaForm/AutoField.vue","../src/components/ui/Button.vue","../src/adapters/jsonSchemaAdapter.ts","../src/components/complex/SchemaForm/SchemaForm.vue","../src/components/complex/SchemaForm/SubmitButton.vue","../src/components/complex/SchemaFormEditor/palette.ts","../src/components/complex/SchemaFormEditor/SchemaFormEditorPalette.vue","../src/components/complex/SchemaFormEditor/adapters/jsonSchema.ts","../src/components/complex/SchemaFormEditor/SchemaFormEditorCanvas.vue","../src/components/complex/SchemaFormEditor/SchemaFormEditorInspector.vue","../src/components/complex/SchemaFormEditor/SchemaFormEditorSchemaView.vue","../src/components/complex/SchemaFormEditor/useSchemaEditor.ts","../src/components/complex/SchemaFormEditor/SchemaFormEditor.vue","../src/adapters/zodAdapter.ts","../src/components/devtools/HistoryPanel.vue","../src/components/ui/InputPassword.vue","../src/components/ui/SearchInput.vue","../src/components/ui/TagInput.vue","../src/components/ui/PinInput.vue","../src/components/ui/InlineEdit.vue","../src/components/ui/InputGroup.vue","../src/components/ui/InputNumber.vue","../src/components/ui/Textarea.vue","../src/components/ui/Radio.vue","../src/components/ui/Switch.vue","../src/components/ui/Slider.vue","../src/components/ui/Rate.vue","../src/components/ui/AutoComplete.vue","../src/components/ui/ColorPicker.vue","../src/components/ui/DatePicker.vue","../src/components/ui/RangePicker.vue","../src/components/ui/TimePicker.vue","../src/components/ui/TimeRangePicker.vue","../src/components/ui/Calendar.vue","../src/components/ui/Upload.vue","../src/components/ui/Cascader.vue","../src/components/ui/TreeSelect.vue","../src/components/ui/Transfer.vue","../src/components/ui/Mentions.vue","../src/components/ui/Transition.vue","../src/components/ui/Modal.vue","../src/components/ui/Drawer.vue","../src/components/ui/Notification.vue","../src/components/ui/Popconfirm.vue","../src/components/ui/Tooltip.vue","../src/components/ui/Progress.vue","../src/components/ui/Result.vue","../src/components/ui/Empty.vue","../src/components/ui/Skeleton.vue","../src/components/ui/Tabs.vue","../src/components/ui/Menu.vue","../src/components/ui/Breadcrumb.vue","../src/components/ui/Dropdown.vue","../src/components/ui/Steps.vue","../src/components/ui/Segmented.vue","../src/components/ui/Badge.vue","../src/components/ui/Tag.vue","../src/components/ui/Avatar.vue","../src/components/ui/Carousel.vue","../src/components/ui/Timeline.vue","../src/components/ui/Descriptions.vue","../src/components/ui/Collapse.vue","../src/locales/en_US.ts","../src/locales/ru_RU.ts","../src/locales/zh_CN.ts","../src/locales/de_DE.ts","../src/locales/fr_FR.ts","../src/locales/es_ES.ts"],"sourcesContent":["import { ref, computed, onScopeDispose, type Ref, type ComputedRef } from 'vue'\nimport { createCore, createForm } from '@skygraph/core'\nimport type {\n Core,\n FormEngine,\n FormOptions,\n FormState,\n ValidationResult,\n} from '@skygraph/core'\n\nexport interface UseFormOptions extends FormOptions {\n onSubmit?: (values: Record<string, unknown>) => void | Promise<void>\n onSubmitInvalid?: (errors: Record<string, string[]>) => void\n}\n\nexport interface UseFormReturn {\n /** Underlying Core instance backing the form. */\n core: Core\n /** Engine instance — call `register`, `setValue`, etc. directly when needed. */\n form: FormEngine\n /** Reactive snapshot of `getFieldsValue()`. Updates on every form write. */\n values: Ref<Record<string, unknown>>\n /** Reactive snapshot of full form state (`isDirty` / `isValid` / `isSubmitting` / `isValidating`). */\n formState: Ref<FormState>\n /** Convenience computed: whether the form is currently submitting. */\n isSubmitting: ComputedRef<boolean>\n /** Convenience computed: whether the form is currently validating. */\n isValidating: ComputedRef<boolean>\n /** Convenience computed: whether the form has any dirty fields. */\n isDirty: ComputedRef<boolean>\n /** Convenience computed: whether the form has no validation errors. */\n isValid: ComputedRef<boolean>\n submit: () => Promise<void>\n reset: (values?: Record<string, unknown>) => void\n setFieldValue: (name: string, value: unknown) => void\n setFieldsValue: (values: Record<string, unknown>) => void\n getFieldValue: (name: string) => unknown\n getFieldsValue: () => Record<string, unknown>\n validateFields: (name?: string) => Promise<ValidationResult>\n}\n\n/**\n * Vue 3 composable parallel to React's `useForm`.\n *\n * Creates a Core + FormEngine pair, exposes reactive `values` / `formState`\n * refs that update on every relevant write, and forwards the engine's\n * mutation API as plain methods.\n *\n * Re-renders are wired through a Core middleware that schedules a single\n * microtask per write batch to refresh both reactive refs.\n */\nexport function useForm(options?: UseFormOptions): UseFormReturn {\n const core = createCore()\n const form = createForm(core, options)\n\n // `getFieldsValue()` only returns *registered* fields. To make `values`\n // useful even before any `<SgField>` mounts (and in unit tests that talk\n // directly to the engine), we union the engine's known fields with the\n // initial `defaultValues` keys.\n const knownKeys = new Set<string>(Object.keys(options?.defaultValues ?? {}))\n const collectValues = (): Record<string, unknown> => {\n const result: Record<string, unknown> = { ...form.getFieldsValue() }\n for (const key of knownKeys) {\n if (!(key in result)) {\n const v = core.get(key)\n if (v !== undefined) result[key] = v\n }\n }\n return result\n }\n\n const values = ref<Record<string, unknown>>(collectValues()) as Ref<Record<string, unknown>>\n const formState = ref<FormState>({ ...form.getFormState() }) as Ref<FormState>\n\n let scheduled = false\n const refreshNow = () => {\n values.value = collectValues()\n formState.value = { ...form.getFormState() }\n }\n const scheduleRefresh = () => {\n if (scheduled) return\n scheduled = true\n queueMicrotask(() => {\n scheduled = false\n refreshNow()\n })\n }\n\n const removeMiddleware = core.use((event, next) => {\n next(event)\n // Track every top-level write as a possibly-known key.\n if (event.path && !event.path.startsWith('$')) {\n knownKeys.add(event.path)\n }\n scheduleRefresh()\n })\n\n onScopeDispose(() => {\n removeMiddleware()\n })\n\n const submit = async () => {\n // `isSubmitting` lives in FormEngine closure (not in Core store),\n // so middleware can't surface the flip. Optimistically reflect it.\n formState.value = { ...formState.value, isSubmitting: true }\n try {\n await form.submit(async () => {\n // Pass all known values — including unregistered defaultValues —\n // to the user-supplied submit handler. This matches what\n // `useForm.values` exposes reactively.\n await options?.onSubmit?.(collectValues())\n })\n } finally {\n refreshNow()\n }\n\n if (!form.getFormState().isValid && options?.onSubmitInvalid) {\n const result = await form.validate()\n options.onSubmitInvalid(result.errors)\n }\n }\n\n const reset = (vals?: Record<string, unknown>) => {\n // FormEngine.reset only restores *registered* fields. To make `useForm`\n // useful even before any field component mounts, we additionally\n // restore values for every known key (defaultValues + previously seen\n // top-level writes).\n form.reset(vals)\n if (vals) {\n for (const [k, v] of Object.entries(vals)) {\n knownKeys.add(k)\n core.set(k, v)\n }\n } else if (options?.defaultValues) {\n for (const [k, v] of Object.entries(options.defaultValues)) {\n core.set(k, v)\n }\n }\n refreshNow()\n }\n\n const setFieldValue = (name: string, value: unknown) => {\n form.setValue(name, value)\n }\n\n const setFieldsValue = (vals: Record<string, unknown>) => {\n form.setFieldsValue(vals)\n }\n\n const getFieldValue = (name: string) => form.getValue(name)\n const getFieldsValue = () => collectValues()\n const validateFields = (name?: string) => form.validate(name)\n\n return {\n core,\n form,\n values,\n formState,\n isSubmitting: computed(() => formState.value.isSubmitting),\n isValidating: computed(() => formState.value.isValidating),\n isDirty: computed(() => formState.value.isDirty),\n isValid: computed(() => formState.value.isValid),\n submit,\n reset,\n setFieldValue,\n setFieldsValue,\n getFieldValue,\n getFieldsValue,\n validateFields,\n }\n}\n","import { ref, computed, onScopeDispose, type Ref, type ComputedRef } from 'vue'\nimport type { Core, FieldMeta, FormEngine } from '@skygraph/core'\n\n// `FieldStatus` is not part of `@skygraph/core` public root export (it lives\n// only in `./form` subpath); duplicate the literal union here to avoid forcing\n// every consumer to import a subpath.\nexport type FieldStatus = 'success' | 'warning' | 'error' | 'validating' | undefined\n\nexport interface UseFieldReturn {\n /** Reactive current field value. */\n value: Ref<unknown>\n /** Reactive list of error messages. */\n errors: Ref<string[]>\n /** Reactive list of warning messages. */\n warnings: Ref<string[]>\n /** First error message or `null`. */\n error: ComputedRef<string | null>\n /** Whether the field has been blurred at least once. */\n touched: Ref<boolean>\n /** Whether the field value differs from its initial value. */\n dirty: Ref<boolean>\n /** Whether async validation is currently running. */\n validating: Ref<boolean>\n /** Derived status badge: `success` / `warning` / `error` / `validating` / `undefined`. */\n status: ComputedRef<FieldStatus>\n /** Mutation helper: write a new value. */\n onChange: (value: unknown) => void\n /** Mutation helper: notify the engine that the field lost focus. */\n onBlur: () => void\n /** Snapshot of the underlying meta record (errors/warnings/touched/...). */\n meta: Ref<FieldMeta>\n}\n\n/**\n * Vue 3 composable parallel to React's `useField`.\n *\n * Subscribes to the field's value path and meta paths under\n * `$meta.<name>.*`, exposing each as a Vue ref. Returns mutation helpers\n * (`onChange`, `onBlur`) that route through the FormEngine.\n */\nexport function useField(core: Core, form: FormEngine, name: string): UseFieldReturn {\n const value = ref<unknown>(form.getValue(name))\n const meta = ref<FieldMeta>({ ...form.getFieldState(name) }) as Ref<FieldMeta>\n const errors = ref<string[]>([...meta.value.errors])\n const warnings = ref<string[]>([...meta.value.warnings])\n const touched = ref<boolean>(meta.value.touched)\n const dirty = ref<boolean>(meta.value.dirty)\n const validating = ref<boolean>(meta.value.validating)\n\n const refreshMeta = () => {\n const m = form.getFieldState(name)\n meta.value = { ...m }\n errors.value = [...m.errors]\n warnings.value = [...m.warnings]\n touched.value = m.touched\n dirty.value = m.dirty\n validating.value = m.validating\n }\n\n const unsubs: Array<() => void> = []\n\n unsubs.push(\n core.subscribe(name, (v) => {\n value.value = v\n }),\n )\n for (const key of ['errors', 'warnings', 'touched', 'dirty', 'validating'] as const) {\n unsubs.push(\n core.subscribe(`$meta.${name}.${key}`, () => {\n refreshMeta()\n }),\n )\n }\n\n onScopeDispose(() => {\n for (const u of unsubs) u()\n })\n\n const onChange = (v: unknown) => {\n form.setValue(name, v)\n }\n const onBlur = () => {\n form.onFieldBlur(name)\n }\n\n return {\n value,\n errors,\n warnings,\n error: computed(() => errors.value[0] ?? null),\n touched,\n dirty,\n validating,\n status: computed<FieldStatus>(() => {\n if (validating.value) return 'validating'\n if (errors.value.length > 0) return 'error'\n if (warnings.value.length > 0) return 'warning'\n return undefined\n }),\n onChange,\n onBlur,\n meta,\n }\n}\n","import { ref, computed, type ComputedRef } from 'vue'\r\nimport type { FormEngine } from '@skygraph/core'\r\n\r\nexport interface UseFieldArrayReturn {\r\n /** Reactive list of `{ key, index }` pairs — stable React-like keys for v-for. */\r\n fields: ComputedRef<{ key: string; index: number }[]>\r\n /** Append a new item at the end of the list. */\r\n append: (defaultValue?: unknown) => void\r\n /** Remove the item at `index`. */\r\n remove: (index: number) => void\r\n /** Move the item at `from` to position `to`. */\r\n move: (from: number, to: number) => void\r\n /** Replace the entire list with `values`. */\r\n replace: (values: unknown[]) => void\r\n}\r\n\r\n/**\r\n * Vue 3 composable parallel to React's `useFieldArray`.\r\n *\r\n * Tracks stable per-row keys for an array field at `name` and exposes\r\n * mutation helpers that go through the FormEngine list operations.\r\n */\r\nexport function useFieldArray(form: FormEngine, name: string): UseFieldArrayReturn {\r\n let counter = 0\r\n const genKey = () => `fa_${name}_${++counter}`\r\n\r\n const initial = form.getListValue(name)\r\n const keys = ref<string[]>(initial.map(() => genKey()))\r\n\r\n const fields = computed(() =>\r\n keys.value.map((key, index) => ({ key, index })),\r\n )\r\n\r\n const append = (defaultValue?: unknown) => {\r\n form.listAdd(name, defaultValue)\r\n keys.value = [...keys.value, genKey()]\r\n }\r\n\r\n const remove = (index: number) => {\r\n form.listRemove(name, index)\r\n keys.value = keys.value.filter((_, i) => i !== index)\r\n }\r\n\r\n const move = (from: number, to: number) => {\r\n form.listMove(name, from, to)\r\n const next = [...keys.value]\r\n const [item] = next.splice(from, 1)\r\n next.splice(to, 0, item)\r\n keys.value = next\r\n }\r\n\r\n const replace = (values: unknown[]) => {\r\n const currentLen = form.getListValue(name).length\r\n for (let i = currentLen - 1; i >= 0; i--) {\r\n form.listRemove(name, i)\r\n }\r\n const newKeys: string[] = []\r\n for (const v of values) {\r\n form.listAdd(name, v)\r\n newKeys.push(genKey())\r\n }\r\n keys.value = newKeys\r\n }\r\n\r\n return { fields, append, remove, move, replace }\r\n}\r\n","import { ref, onScopeDispose, type Ref } from 'vue'\r\nimport type { Core } from '@skygraph/core'\r\n\r\n/**\r\n * Vue 3 composable parallel to React's `useWatch`.\r\n *\r\n * Returns a reactive ref tracking the value of `name` in the given Core\r\n * instance. Updates whenever someone writes to that path.\r\n */\r\nexport function useWatch<T = unknown>(core: Core, name: string): Ref<T> {\r\n const value = ref<T>(core.get(name) as T) as Ref<T>\r\n\r\n const unsub = core.subscribe(name, (v) => {\r\n value.value = v as T\r\n })\r\n\r\n onScopeDispose(() => {\r\n unsub()\r\n })\r\n\r\n return value\r\n}\r\n","import type { Ref } from 'vue'\nimport type { Core } from '@skygraph/core'\nimport { useWatch } from './useWatch'\n\n/**\n * Reactive slice of a {@link Core} path — mirrors React's `useComputed`.\n *\n * Behavior matches {@link useWatch}; the name exists for cross-framework parity.\n */\nexport function useComputed<T = unknown>(core: Core, path: string): Ref<T> {\n return useWatch<T>(core, path)\n}\n","import { ref, isRef, onScopeDispose, watch, type Ref } from 'vue'\nimport { createCore, createTable } from '@skygraph/core'\nimport type {\n ColumnFilter,\n Core,\n RowId,\n SortConfig,\n SortDirection,\n TableEngine,\n TableOptions,\n TableState,\n} from '@skygraph/core'\n\nexport type TableRow = { id: RowId; data: Record<string, unknown> }\n\nexport interface UseTableOptions extends TableOptions {\n /** Optional initial row data; when provided as a `Ref`, swapping the ref\n * resets the engine and reloads rows. */\n data?: TableRow[] | Ref<TableRow[]>\n}\n\nexport type FilterFn = (row: Record<string, unknown>) => boolean\n\nexport interface UseTableReturn {\n core: Core\n table: TableEngine\n visibleRows: Ref<TableRow[]>\n tableState: Ref<TableState>\n pinnedColumns: Ref<{ left: string[]; right: string[] }>\n columnWidths: Ref<Record<string, number>>\n setSort: (column: string, direction: SortDirection) => void\n setSorts: (sorts: SortConfig[]) => void\n clearSort: () => void\n addFilter: (filter: ColumnFilter) => void\n removeFilter: (column: string) => void\n clearFilters: () => void\n setFilterFn: (fn: FilterFn | null) => void\n setPage: (page: number) => void\n nextPage: () => void\n prevPage: () => void\n pinColumn: (column: string, side: 'left' | 'right' | null) => void\n clearPinned: () => void\n setColumnWidth: (column: string, width: number) => void\n clearColumnWidths: () => void\n refresh: () => void\n}\n\n/**\n * Vue 3 composable parallel to React's `useTable`.\n */\nexport function useTable(options?: UseTableOptions): UseTableReturn {\n const core = createCore()\n const table = createTable(core, options)\n\n const initialData: TableRow[] | undefined = options?.data\n ? isRef(options.data)\n ? options.data.value\n : (options.data as TableRow[])\n : undefined\n\n if (initialData) {\n table.addRows(initialData)\n }\n\n const visibleRows = ref(table.getVisibleRows()) as Ref<TableRow[]>\n const tableState = ref(table.getTableState()) as Ref<TableState>\n const pinnedColumns = ref(table.getPinnedColumns()) as Ref<{\n left: string[]\n right: string[]\n }>\n const columnWidths = ref(table.getColumnWidths()) as Ref<Record<string, number>>\n\n const refresh = () => {\n visibleRows.value = table.getVisibleRows()\n tableState.value = table.getTableState()\n pinnedColumns.value = table.getPinnedColumns()\n columnWidths.value = table.getColumnWidths()\n }\n\n // If consumer passes a Ref<data[]>, watch for swaps and reload.\n if (options?.data && isRef(options.data)) {\n const dataRef = options.data\n const stop = watch(dataRef, (next) => {\n table.reset()\n if (next) table.addRows(next)\n refresh()\n })\n onScopeDispose(() => stop())\n }\n\n const setSort = (column: string, direction: SortDirection) => {\n table.setSort(column, direction)\n refresh()\n }\n const setSorts = (sorts: SortConfig[]) => {\n table.setSorts(sorts)\n refresh()\n }\n const clearSort = () => {\n table.clearSort()\n refresh()\n }\n const addFilter = (filter: ColumnFilter) => {\n table.addFilter(filter)\n refresh()\n }\n const removeFilter = (column: string) => {\n table.removeFilter(column)\n refresh()\n }\n const clearFilters = () => {\n table.clearFilters()\n refresh()\n }\n const setFilterFn = (fn: FilterFn | null) => {\n table.setFilterFn(fn)\n refresh()\n }\n const setPage = (page: number) => {\n table.setPage(page)\n refresh()\n }\n const nextPage = () => {\n table.nextPage()\n refresh()\n }\n const prevPage = () => {\n table.prevPage()\n refresh()\n }\n const pinColumn = (column: string, side: 'left' | 'right' | null) => {\n table.pinColumn(column, side)\n pinnedColumns.value = table.getPinnedColumns()\n }\n const clearPinned = () => {\n table.clearPinned()\n pinnedColumns.value = table.getPinnedColumns()\n }\n const setColumnWidth = (column: string, width: number) => {\n table.setColumnWidth(column, width)\n columnWidths.value = table.getColumnWidths()\n }\n const clearColumnWidths = () => {\n table.clearColumnWidths()\n columnWidths.value = table.getColumnWidths()\n }\n\n return {\n core,\n table,\n visibleRows,\n tableState,\n pinnedColumns,\n columnWidths,\n setSort,\n setSorts,\n clearSort,\n addFilter,\n removeFilter,\n clearFilters,\n setFilterFn,\n setPage,\n nextPage,\n prevPage,\n pinColumn,\n clearPinned,\n setColumnWidth,\n clearColumnWidths,\n refresh,\n }\n}\n","import { ref, type Ref } from 'vue'\nimport { createCore, createTree } from '@skygraph/core'\nimport type {\n Core,\n TreeEngine,\n TreeEngineOptions,\n TreeKey,\n TreeNodeData,\n TreeState,\n} from '@skygraph/core'\n\nexport interface UseTreeOptions extends TreeEngineOptions {\n data?: TreeNodeData[]\n}\n\nexport interface UseTreeReturn {\n core: Core\n tree: TreeEngine\n treeState: Ref<TreeState>\n flatNodes: Ref<ReturnType<TreeEngine['getFlatNodes']>>\n expand: (key: TreeKey) => void\n collapse: (key: TreeKey) => void\n toggleExpand: (key: TreeKey) => void\n setExpandedKeys: (keys: TreeKey[]) => void\n expandAll: () => void\n collapseAll: () => void\n expandToLevel: (level: number) => void\n check: (key: TreeKey) => void\n uncheck: (key: TreeKey) => void\n toggleCheck: (key: TreeKey) => void\n setCheckedKeys: (keys: TreeKey[]) => void\n checkAll: () => void\n uncheckAll: () => void\n select: (key: TreeKey, multiple?: boolean) => void\n deselect: (key: TreeKey) => void\n setSelectedKeys: (keys: TreeKey[]) => void\n markLoading: (key: TreeKey) => void\n markLoaded: (key: TreeKey) => void\n addChildren: (parentKey: TreeKey, children: TreeNodeData[]) => void\n moveNode: (\n dragKey: TreeKey,\n dropKey: TreeKey,\n position: -1 | 0 | 1,\n ) => TreeNodeData[] | null\n filterNodes: (predicate: ((node: TreeNodeData) => boolean) | null) => void\n getNodePath: (key: TreeKey) => TreeKey[]\n refresh: () => void\n}\n\n/**\n * Vue 3 composable parallel to React's `useTree`.\n */\nexport function useTree(options?: UseTreeOptions): UseTreeReturn {\n const core = createCore()\n const tree = createTree(core, options)\n if (options?.data) {\n tree.setData(options.data)\n }\n\n const treeState = ref(tree.getState()) as Ref<TreeState>\n const flatNodes = ref(tree.getFlatNodes()) as Ref<ReturnType<TreeEngine['getFlatNodes']>>\n\n const refresh = () => {\n treeState.value = tree.getState()\n flatNodes.value = tree.getFlatNodes()\n }\n\n const expand = (key: TreeKey) => {\n tree.expand(key)\n refresh()\n }\n const collapse = (key: TreeKey) => {\n tree.collapse(key)\n refresh()\n }\n const toggleExpand = (key: TreeKey) => {\n tree.toggleExpand(key)\n refresh()\n }\n const setExpandedKeys = (keys: TreeKey[]) => {\n tree.setExpandedKeys(keys)\n refresh()\n }\n const expandAll = () => {\n tree.expandAll()\n refresh()\n }\n const collapseAll = () => {\n tree.collapseAll()\n refresh()\n }\n const expandToLevel = (level: number) => {\n tree.expandAll()\n const allFlat = tree.getFlatNodes()\n const keys: TreeKey[] = []\n for (const item of allFlat) {\n if (item.depth < level && !item.isLeaf) keys.push(item.key)\n }\n tree.setExpandedKeys(keys)\n refresh()\n }\n const check = (key: TreeKey) => {\n tree.check(key)\n refresh()\n }\n const uncheck = (key: TreeKey) => {\n tree.uncheck(key)\n refresh()\n }\n const toggleCheck = (key: TreeKey) => {\n tree.toggleCheck(key)\n refresh()\n }\n const setCheckedKeys = (keys: TreeKey[]) => {\n tree.setCheckedKeys(keys)\n refresh()\n }\n const checkAll = () => {\n tree.setCheckedKeys(tree.getAllKeys())\n refresh()\n }\n const uncheckAll = () => {\n tree.setCheckedKeys([])\n refresh()\n }\n const select = (key: TreeKey, multiple?: boolean) => {\n tree.select(key, multiple)\n refresh()\n }\n const deselect = (key: TreeKey) => {\n tree.deselect(key)\n refresh()\n }\n const setSelectedKeys = (keys: TreeKey[]) => {\n tree.setSelectedKeys(keys)\n refresh()\n }\n const markLoading = (key: TreeKey) => {\n tree.markLoading(key)\n refresh()\n }\n const markLoaded = (key: TreeKey) => {\n tree.markLoaded(key)\n refresh()\n }\n const addChildren = (parentKey: TreeKey, children: TreeNodeData[]) => {\n tree.addChildren(parentKey, children)\n refresh()\n }\n const moveNode = (\n dragKey: TreeKey,\n dropKey: TreeKey,\n position: -1 | 0 | 1,\n ): TreeNodeData[] | null => {\n const result = tree.moveNode(dragKey, dropKey, position)\n refresh()\n return result\n }\n const filterNodes = (predicate: ((node: TreeNodeData) => boolean) | null) => {\n tree.filterNodes(predicate)\n refresh()\n }\n const getNodePath = (key: TreeKey): TreeKey[] => {\n const path: TreeKey[] = []\n let current: TreeKey | null = key\n while (current !== null) {\n path.unshift(current)\n current = tree.getParentKey(current)\n }\n return path\n }\n\n return {\n core,\n tree,\n treeState,\n flatNodes,\n expand,\n collapse,\n toggleExpand,\n setExpandedKeys,\n expandAll,\n collapseAll,\n expandToLevel,\n check,\n uncheck,\n toggleCheck,\n setCheckedKeys,\n checkAll,\n uncheckAll,\n select,\n deselect,\n setSelectedKeys,\n markLoading,\n markLoaded,\n addChildren,\n moveNode,\n filterNodes,\n getNodePath,\n refresh,\n }\n}\n","import { ref, onScopeDispose, type Ref } from 'vue'\nimport { createCore, createGraph } from '@skygraph/core'\nimport type { Core, GraphEngine, GraphEngineOptions, GraphState } from '@skygraph/core'\n\nexport interface UseGraphOptions extends GraphEngineOptions {\n /** Bring your own Core instance (for cross-engine coordination). */\n core?: Core\n}\n\nexport interface UseGraphReturn {\n /** Underlying engine — call mutating methods on this. */\n graph: GraphEngine\n /** Reactive snapshot of nodes / edges / edgesByNode. */\n state: Ref<GraphState>\n /** The Core instance backing the engine (own or borrowed). */\n core: Core\n}\n\n/**\n * Vue 3 composable parallel to React's `useGraph`.\n *\n * Subscribes to graph commits via `graph.subscribe(cb)` and refreshes the\n * snapshot ref on every commit.\n */\nexport function useGraph(options: UseGraphOptions = {}): UseGraphReturn {\n const { core: externalCore, ...graphOptions } = options\n const core = externalCore ?? createCore()\n const graph = createGraph(core, graphOptions)\n\n const state = ref(graph.getState()) as Ref<GraphState>\n\n const unsubscribe = graph.subscribe(() => {\n state.value = graph.getState()\n })\n\n onScopeDispose(() => {\n unsubscribe()\n })\n\n return { graph, state, core }\n}\n","import { ref, watch, onMounted, onScopeDispose, type Ref } from 'vue'\r\n\r\nconst FOCUSABLE_SELECTOR = [\r\n 'a[href]',\r\n 'button:not([disabled])',\r\n 'input:not([disabled]):not([type=\"hidden\"])',\r\n 'select:not([disabled])',\r\n 'textarea:not([disabled])',\r\n '[tabindex]:not([tabindex=\"-1\"])',\r\n '[contenteditable=\"true\"]',\r\n].join(', ')\r\n\r\nfunction isHidden(el: HTMLElement): boolean {\r\n if (el.hasAttribute('aria-hidden') && el.getAttribute('aria-hidden') === 'true') return true\r\n if (el.hasAttribute('hidden')) return true\r\n // `offsetParent === null` is unreliable in headless DOM environments\r\n // (jsdom) where layout is never computed. Walk the tree and look only for\r\n // explicit display/visibility states which jsdom does honour.\r\n let cur: HTMLElement | null = el\r\n while (cur) {\r\n const style = (cur.ownerDocument?.defaultView ?? globalThis).getComputedStyle?.(cur)\r\n if (style && (style.display === 'none' || style.visibility === 'hidden')) return true\r\n cur = cur.parentElement\r\n }\r\n return false\r\n}\r\n\r\nfunction queryFocusable(container: HTMLElement): HTMLElement[] {\r\n return Array.from(container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)).filter(\r\n (el) => !isHidden(el),\r\n )\r\n}\r\n\r\n/**\r\n * Vue 3 composable parallel to React's `useFocusTrap`.\r\n *\r\n * Returns a template ref to bind to a container element. While `active.value`\r\n * is `true`, Tab/Shift+Tab cycle focus inside the container, and focus is\r\n * restored to the previously-focused element when the trap deactivates.\r\n */\r\nexport function useFocusTrap(active: Ref<boolean> | (() => boolean)) {\r\n const containerRef = ref<HTMLElement | null>(null)\r\n\r\n let previousFocus: HTMLElement | null = null\r\n let attachedEl: HTMLElement | null = null\r\n\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (e.key !== 'Tab') return\r\n const container = attachedEl\r\n if (!container) return\r\n\r\n const list = queryFocusable(container)\r\n if (list.length === 0) {\r\n e.preventDefault()\r\n container.focus()\r\n return\r\n }\r\n\r\n const first = list[0]\r\n const last = list[list.length - 1]\r\n const activeEl = document.activeElement as HTMLElement | null\r\n\r\n if (e.shiftKey) {\r\n if (activeEl === first || !container.contains(activeEl)) {\r\n e.preventDefault()\r\n last.focus()\r\n }\r\n } else {\r\n if (activeEl === last || !container.contains(activeEl)) {\r\n e.preventDefault()\r\n first.focus()\r\n }\r\n }\r\n }\r\n\r\n const detach = () => {\r\n if (!attachedEl) return\r\n attachedEl.removeEventListener('keydown', handleKeyDown)\r\n attachedEl = null\r\n if (previousFocus && typeof previousFocus.focus === 'function') {\r\n previousFocus.focus()\r\n previousFocus = null\r\n }\r\n }\r\n\r\n const attach = (el: HTMLElement) => {\r\n if (attachedEl === el) return\r\n detach()\r\n attachedEl = el\r\n previousFocus = document.activeElement as HTMLElement | null\r\n el.addEventListener('keydown', handleKeyDown)\r\n\r\n if (typeof requestAnimationFrame !== 'undefined') {\r\n requestAnimationFrame(() => {\r\n const focusable = queryFocusable(el)\r\n if (focusable.length > 0) {\r\n focusable[0].focus()\r\n } else {\r\n if (!el.hasAttribute('tabindex')) el.setAttribute('tabindex', '-1')\r\n el.focus()\r\n }\r\n })\r\n }\r\n }\r\n\r\n const isActive = () => (typeof active === 'function' ? active() : active.value)\r\n\r\n const sync = () => {\r\n if (isActive() && containerRef.value) {\r\n attach(containerRef.value)\r\n } else {\r\n detach()\r\n }\r\n }\r\n\r\n // Use `flush: 'sync'` so the listener attaches the moment the template ref\r\n // resolves to a DOM element. With `flush: 'post'` the watch defers until\r\n // the next render flush, which can be after a synchronous keydown dispatch\r\n // in tests and miss the event entirely. `onMounted` provides a backup hook\r\n // for cases where the ref is bound before the watcher tracks it.\r\n watch([containerRef, () => isActive()], sync, { flush: 'sync' })\r\n onMounted(sync)\r\n\r\n onScopeDispose(() => {\r\n detach()\r\n })\r\n\r\n return containerRef\r\n}\r\n","import { ref, isRef, type Ref, type ComputedRef } from 'vue'\r\n\r\nexport interface RovingTabIndexOptions {\r\n orientation?: 'vertical' | 'horizontal' | 'both'\r\n loop?: boolean\r\n}\r\n\r\nexport interface RovingItemProps {\r\n /**\r\n * Vue template-ref callback. Accepts the wider `Element | ComponentPublic\r\n * Instance | null` shape Vue's runtime passes to ref-fn callbacks; we cast\r\n * down to `HTMLElement` internally.\r\n */\r\n ref: (el: unknown) => void\r\n tabindex: 0 | -1\r\n onFocus: () => void\r\n onKeydown: (e: KeyboardEvent) => void\r\n}\r\n\r\nexport interface UseRovingTabIndexReturn {\r\n activeIndex: Ref<number>\r\n setActiveIndex: (index: number) => void\r\n getItemProps: (index: number) => RovingItemProps\r\n handleKeyDown: (e: KeyboardEvent) => void\r\n}\r\n\r\n/**\r\n * Vue 3 composable parallel to React's `useRovingTabIndex`.\r\n *\r\n * Implements roving tabindex pattern over a fixed-size collection of items:\r\n * one item has `tabindex=\"0\"`, the rest have `tabindex=\"-1\"`. Arrow keys move\r\n * focus and the active index. `getItemProps(index)` returns the props to spread\r\n * on each item (ref, tabindex, onFocus, onKeydown).\r\n */\r\nexport function useRovingTabIndex(\r\n itemCount: number | Ref<number> | ComputedRef<number>,\r\n options: RovingTabIndexOptions = {},\r\n): UseRovingTabIndexReturn {\r\n const { orientation = 'vertical', loop = true } = options\r\n const activeIndex = ref(0)\r\n const items: (HTMLElement | null)[] = []\r\n\r\n const getCount = () => (isRef(itemCount) ? itemCount.value : itemCount)\r\n\r\n const setItemRef = (index: number) => (el: unknown) => {\r\n items[index] = el as HTMLElement | null\r\n }\r\n\r\n const focusItem = (index: number) => {\r\n activeIndex.value = index\r\n items[index]?.focus()\r\n }\r\n\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n const count = getCount()\r\n let nextIndex = activeIndex.value\r\n\r\n const isNext =\r\n (orientation !== 'horizontal' && e.key === 'ArrowDown') ||\r\n (orientation !== 'vertical' && e.key === 'ArrowRight')\r\n\r\n const isPrev =\r\n (orientation !== 'horizontal' && e.key === 'ArrowUp') ||\r\n (orientation !== 'vertical' && e.key === 'ArrowLeft')\r\n\r\n if (isNext) {\r\n e.preventDefault()\r\n nextIndex = activeIndex.value + 1\r\n if (nextIndex >= count) {\r\n nextIndex = loop ? 0 : count - 1\r\n }\r\n } else if (isPrev) {\r\n e.preventDefault()\r\n nextIndex = activeIndex.value - 1\r\n if (nextIndex < 0) {\r\n nextIndex = loop ? count - 1 : 0\r\n }\r\n } else if (e.key === 'Home') {\r\n e.preventDefault()\r\n nextIndex = 0\r\n } else if (e.key === 'End') {\r\n e.preventDefault()\r\n nextIndex = count - 1\r\n } else {\r\n return\r\n }\r\n\r\n focusItem(nextIndex)\r\n }\r\n\r\n const getItemProps = (index: number): RovingItemProps => ({\r\n ref: setItemRef(index),\r\n tabindex: index === activeIndex.value ? 0 : -1,\r\n onFocus: () => {\r\n activeIndex.value = index\r\n },\r\n onKeydown: handleKeyDown,\r\n })\r\n\r\n return {\r\n activeIndex,\r\n setActiveIndex: focusItem,\r\n getItemProps,\r\n handleKeyDown,\r\n }\r\n}\r\n","import { ref, isRef, type Ref, type ComputedRef } from 'vue'\r\n\r\nexport interface ListNavigationOptions {\r\n itemCount: number | Ref<number> | ComputedRef<number>\r\n loop?: boolean\r\n onSelect?: (index: number) => void\r\n typeaheadTimeout?: number\r\n}\r\n\r\nexport interface UseListNavigationReturn {\r\n activeIndex: Ref<number>\r\n setActiveIndex: (index: number) => void\r\n setItemRef: (index: number) => (el: HTMLElement | null) => void\r\n setLabels: (labels: string[]) => void\r\n handleKeyDown: (e: KeyboardEvent) => void\r\n}\r\n\r\n/**\r\n * Vue 3 composable parallel to React's `useListNavigation`.\r\n *\r\n * Adds full keyboard navigation to a list-like structure: arrow / Home / End\r\n * navigation, Enter / Space activation, Escape to clear, and typeahead jump.\r\n */\r\nexport function useListNavigation(options: ListNavigationOptions): UseListNavigationReturn {\r\n const { itemCount, loop = true, onSelect, typeaheadTimeout = 500 } = options\r\n const activeIndex = ref(-1)\r\n const items: (HTMLElement | null)[] = []\r\n const labels: string[] = []\r\n let typeahead = ''\r\n let typeaheadTimer: ReturnType<typeof setTimeout> | undefined\r\n\r\n const getCount = () => (isRef(itemCount) ? itemCount.value : itemCount)\r\n\r\n const setItemRef = (index: number) => (el: HTMLElement | null) => {\r\n items[index] = el\r\n }\r\n\r\n const setLabels = (next: string[]) => {\r\n labels.length = 0\r\n labels.push(...next)\r\n }\r\n\r\n const focusItem = (index: number) => {\r\n const count = getCount()\r\n if (index < 0 || index >= count) return\r\n activeIndex.value = index\r\n items[index]?.focus()\r\n }\r\n\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n const count = getCount()\r\n switch (e.key) {\r\n case 'ArrowDown': {\r\n e.preventDefault()\r\n let next = activeIndex.value + 1\r\n if (next >= count) next = loop ? 0 : count - 1\r\n focusItem(next)\r\n break\r\n }\r\n case 'ArrowUp': {\r\n e.preventDefault()\r\n let prev = activeIndex.value - 1\r\n if (prev < 0) prev = loop ? count - 1 : 0\r\n focusItem(prev)\r\n break\r\n }\r\n case 'Home': {\r\n e.preventDefault()\r\n focusItem(0)\r\n break\r\n }\r\n case 'End': {\r\n e.preventDefault()\r\n focusItem(count - 1)\r\n break\r\n }\r\n case 'Enter':\r\n case ' ': {\r\n e.preventDefault()\r\n if (activeIndex.value >= 0) {\r\n onSelect?.(activeIndex.value)\r\n }\r\n break\r\n }\r\n case 'Escape': {\r\n e.preventDefault()\r\n activeIndex.value = -1\r\n break\r\n }\r\n default: {\r\n if (e.key.length === 1 && !e.ctrlKey && !e.metaKey) {\r\n if (typeaheadTimer) clearTimeout(typeaheadTimer)\r\n typeahead += e.key.toLowerCase()\r\n typeaheadTimer = setTimeout(() => {\r\n typeahead = ''\r\n }, typeaheadTimeout)\r\n\r\n const query = typeahead\r\n const startIndex = activeIndex.value >= 0 ? activeIndex.value + 1 : 0\r\n for (let i = 0; i < count; i++) {\r\n const idx = (startIndex + i) % count\r\n const label = labels[idx]?.toLowerCase() ?? ''\r\n if (label.startsWith(query)) {\r\n focusItem(idx)\r\n break\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return {\r\n activeIndex,\r\n setActiveIndex: focusItem,\r\n setItemRef,\r\n setLabels,\r\n handleKeyDown,\r\n }\r\n}\r\n","import { ref, watch, isRef, onMounted, onScopeDispose, type Ref } from 'vue'\r\nimport { createVirtual } from '@skygraph/core'\r\nimport type { VirtualEngine, VirtualRange } from '@skygraph/core'\r\n\r\nexport interface UseVirtualScrollOptions {\r\n itemCount: number | Ref<number>\r\n itemHeight: number | ((index: number) => number) | Ref<number | ((index: number) => number)>\r\n overscan?: number | Ref<number>\r\n}\r\n\r\nexport interface UseVirtualScrollReturn {\r\n range: Ref<VirtualRange>\r\n containerRef: Ref<HTMLElement | null>\r\n scrollToIndex: (index: number, align?: 'start' | 'center' | 'end') => void\r\n engine: VirtualEngine\r\n}\r\n\r\nfunction unwrap<T>(v: T | Ref<T>): T {\r\n return isRef(v) ? (v.value as T) : (v as T)\r\n}\r\n\r\n/**\r\n * Vue 3 composable parallel to React's `useVirtualScroll`.\r\n *\r\n * Wraps a `VirtualEngine` and tracks the visible row range as the container scrolls.\r\n * `containerRef` should be bound to the scrolling element via `:ref`.\r\n */\r\nexport function useVirtualScroll(options: UseVirtualScrollOptions): UseVirtualScrollReturn {\r\n const initialItemCount = unwrap(options.itemCount)\r\n const initialItemHeight = unwrap(options.itemHeight)\r\n const initialOverscan = options.overscan !== undefined ? unwrap(options.overscan) : undefined\r\n\r\n const engine = createVirtual({\r\n itemCount: initialItemCount,\r\n itemHeight: initialItemHeight,\r\n overscan: initialOverscan,\r\n })\r\n\r\n const containerRef = ref<HTMLElement | null>(null)\r\n const range = ref<VirtualRange>(engine.getRange(0, 0))\r\n\r\n const recalc = () => {\r\n const el = containerRef.value\r\n if (!el) {\r\n range.value = engine.getRange(0, 0)\r\n return\r\n }\r\n range.value = engine.getRange(el.scrollTop, el.clientHeight)\r\n }\r\n\r\n const scrollToIndex = (index: number, align: 'start' | 'center' | 'end' = 'start') => {\r\n const el = containerRef.value\r\n if (!el) return\r\n el.scrollTop = engine.scrollToIndex(index, el.clientHeight, align)\r\n }\r\n\r\n watch(\r\n () => unwrap(options.itemCount),\r\n (count) => {\r\n engine.setItemCount(count)\r\n recalc()\r\n },\r\n )\r\n\r\n watch(\r\n () => unwrap(options.itemHeight),\r\n (h) => {\r\n engine.setItemHeight(h)\r\n recalc()\r\n },\r\n )\r\n\r\n let ro: ResizeObserver | null = null\r\n let scrollHandler: (() => void) | null = null\r\n let attachedEl: HTMLElement | null = null\r\n\r\n const attach = (el: HTMLElement | null) => {\r\n if (attachedEl === el) return\r\n if (attachedEl) {\r\n if (scrollHandler) attachedEl.removeEventListener('scroll', scrollHandler)\r\n ro?.disconnect()\r\n ro = null\r\n }\r\n attachedEl = el\r\n if (!el) return\r\n scrollHandler = () => recalc()\r\n el.addEventListener('scroll', scrollHandler, { passive: true })\r\n if (typeof ResizeObserver !== 'undefined') {\r\n ro = new ResizeObserver(() => recalc())\r\n ro.observe(el)\r\n }\r\n recalc()\r\n }\r\n\r\n watch(containerRef, (el) => attach(el), { flush: 'post' })\r\n\r\n onMounted(() => {\r\n attach(containerRef.value)\r\n })\r\n\r\n onScopeDispose(() => {\r\n attach(null)\r\n })\r\n\r\n return { range, containerRef, scrollToIndex, engine }\r\n}\r\n","import { ref, computed, onScopeDispose, type Ref, type ComputedRef } from 'vue'\r\nimport { createHistory } from '@skygraph/core'\r\nimport type { Core, HistoryPlugin, HistoryOptions } from '@skygraph/core'\r\n\r\nexport interface UseHistoryReturn {\r\n history: HistoryPlugin\r\n canUndo: ComputedRef<boolean>\r\n canRedo: ComputedRef<boolean>\r\n cursor: ComputedRef<number>\r\n entries: Ref<HistoryPlugin['entries']>\r\n undo: () => void\r\n redo: () => void\r\n jumpTo: (index: number) => void\r\n clear: () => void\r\n}\r\n\r\n/**\r\n * Vue 3 composable parallel to React's `useHistory`.\r\n *\r\n * Wraps a `HistoryPlugin` and exposes `canUndo` / `canRedo` / `cursor` /\r\n * `entries` reactively. Mutating methods (`undo`, `redo`, `jumpTo`, `clear`)\r\n * trigger a refresh of the reactive snapshots. Subscribes to Core writes\r\n * via middleware so any external write that creates a history entry also\r\n * surfaces in the snapshot.\r\n */\r\nexport function useHistory(core: Core, options?: HistoryOptions): UseHistoryReturn {\r\n const history = createHistory(core, options)\r\n\r\n const cursor = ref(history.cursor)\r\n const entries = ref<HistoryPlugin['entries']>([...history.entries])\r\n\r\n const refresh = () => {\r\n cursor.value = history.cursor\r\n entries.value = [...history.entries]\r\n }\r\n\r\n // Track Core writes so externally-driven history entries refresh the\r\n // reactive snapshots without an explicit user call. Schedule via microtask\r\n // so we observe the post-commit state of the plugin.\r\n let scheduled = false\r\n const scheduleRefresh = () => {\r\n if (scheduled) return\r\n scheduled = true\r\n queueMicrotask(() => {\r\n scheduled = false\r\n refresh()\r\n })\r\n }\r\n\r\n const removeMiddleware = core.use((event, next) => {\r\n next(event)\r\n scheduleRefresh()\r\n })\r\n\r\n const undo = () => {\r\n history.undo()\r\n refresh()\r\n }\r\n\r\n const redo = () => {\r\n history.redo()\r\n refresh()\r\n }\r\n\r\n const jumpTo = (index: number) => {\r\n history.jumpTo(index)\r\n refresh()\r\n }\r\n\r\n const clear = () => {\r\n history.clear()\r\n refresh()\r\n }\r\n\r\n onScopeDispose(() => {\r\n removeMiddleware()\r\n history.destroy()\r\n })\r\n\r\n return {\r\n history,\r\n canUndo: computed(() => cursor.value >= 0),\r\n canRedo: computed(() => cursor.value < entries.value.length - 1),\r\n cursor: computed(() => cursor.value),\r\n entries,\r\n undo,\r\n redo,\r\n jumpTo,\r\n clear,\r\n }\r\n}\r\n","<script setup lang=\"ts\">\nimport { computed, useSlots } from 'vue'\n\nexport interface InputProps {\n /** v-model value (Vue idiom) — alias for `value`. */\n modelValue?: string\n /** Compat alias for `modelValue` — emits `change` like React's onChange. */\n value?: string\n /** Placeholder text when the field is empty. */\n placeholder?: string\n /** Native input type. */\n type?: 'text' | 'email' | 'password' | 'number'\n /** Size token. */\n size?: 'small' | 'middle' | 'large'\n /** Disables editing. */\n disabled?: boolean\n /** Marks the field as read-only. */\n readOnly?: boolean\n /** Optional input id forwarded to the underlying `<input>`. */\n id?: string\n /** Whether to render a clear button. */\n allowClear?: boolean\n /** Validation status badge. */\n status?: 'error' | 'warning'\n /** Strips built-in styling. */\n unstyled?: boolean\n /** Shows a loading spinner. */\n loading?: boolean\n}\n\nconst props = withDefaults(defineProps<InputProps>(), {\n modelValue: '',\n type: 'text',\n size: 'middle',\n disabled: false,\n readOnly: false,\n allowClear: false,\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: string): void\n (e: 'change', value: string): void\n (e: 'focus', evt: FocusEvent): void\n (e: 'blur', evt: FocusEvent): void\n (e: 'clear'): void\n}>()\n\ndefineSlots<{\n prefix(props: Record<string, never>): unknown\n suffix(props: Record<string, never>): unknown\n}>()\n\nconst currentValue = computed(() => props.value ?? props.modelValue ?? '')\n\nconst wrapperClasses = computed(() =>\n props.unstyled\n ? ''\n : [\n 'sg-input-wrapper',\n `sg-input-wrapper-${props.size}`,\n props.loading ? 'sg-input-wrapper-loading' : '',\n props.readOnly ? 'sg-input-wrapper-readonly' : '',\n props.status ? `sg-input-wrapper-status-${props.status}` : '',\n ]\n .filter(Boolean)\n .join(' '),\n)\n\nconst inputClasses = computed(() =>\n props.unstyled\n ? ''\n : [\n 'sg-input',\n `sg-input-${props.size}`,\n props.readOnly ? 'sg-input-readonly' : '',\n props.status ? `sg-input-status-${props.status}` : '',\n ]\n .filter(Boolean)\n .join(' '),\n)\n\nfunction onInput(e: Event) {\n const target = e.target as HTMLInputElement\n emit('update:modelValue', target.value)\n emit('change', target.value)\n}\n\nfunction onFocus(e: FocusEvent) {\n emit('focus', e)\n}\n\nfunction onBlur(e: FocusEvent) {\n emit('blur', e)\n}\n\nfunction clear() {\n emit('update:modelValue', '')\n emit('change', '')\n emit('clear')\n}\n\nconst showClear = computed(\n () => props.allowClear && !props.disabled && !props.readOnly && !!currentValue.value,\n)\n\nconst slots = useSlots()\nconst hasPrefix = computed(() => Boolean(slots.prefix))\nconst hasSuffix = computed(() => Boolean(slots.suffix))\n</script>\n\n<template>\n <span :class=\"wrapperClasses\">\n <span v-if=\"hasPrefix\" class=\"sg-input-prefix\">\n <slot name=\"prefix\" />\n </span>\n <input\n :id=\"id\"\n :type=\"type\"\n :class=\"inputClasses\"\n :value=\"currentValue\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled || loading\"\n :readonly=\"readOnly\"\n :aria-readonly=\"readOnly || undefined\"\n :aria-invalid=\"status === 'error' || undefined\"\n @input=\"onInput\"\n @focus=\"onFocus\"\n @blur=\"onBlur\"\n />\n <button v-if=\"showClear\" type=\"button\" class=\"sg-input-clear\" aria-label=\"Clear\" @click=\"clear\">\n ×\n </button>\n <span v-if=\"loading && !unstyled\" class=\"sg-spin sg-spin-small\" aria-hidden=\"true\" />\n <span v-if=\"hasSuffix\" class=\"sg-input-suffix\">\n <slot name=\"suffix\" />\n </span>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, onMounted, ref, useSlots, watch } from 'vue'\n\nexport interface CheckboxProps {\n /** v-model binding (Vue idiom). */\n modelValue?: boolean\n /** Compat alias — controls the checked state. */\n checked?: boolean\n /** Initial checked state when uncontrolled. */\n defaultChecked?: boolean\n /** Renders the native checkbox in indeterminate state. */\n indeterminate?: boolean\n /** Disables interaction. */\n disabled?: boolean\n /** Shows a loading spinner and disables interaction. */\n loading?: boolean\n /** Strips built-in styling. */\n unstyled?: boolean\n}\n\n// All controlled boolean inputs default to `undefined` so the\n// `props.modelValue ?? props.checked ?? props.defaultChecked` chain in\n// `internal` / `current` can correctly distinguish \"consumer did not bind\n// this prop\" from \"consumer explicitly passed `false`\". Without explicit\n// `undefined` defaults Vue normalises optional boolean props to `false`\n// at runtime and `??` collapses every variant to that fallback.\nconst props = withDefaults(defineProps<CheckboxProps>(), {\n modelValue: undefined,\n checked: undefined,\n defaultChecked: undefined,\n indeterminate: undefined,\n disabled: false,\n loading: false,\n unstyled: false,\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', checked: boolean): void\n (e: 'change', checked: boolean): void\n}>()\n\ndefineSlots<{\n default(props: Record<string, never>): unknown\n}>()\n\nconst internal = ref<boolean>(props.modelValue ?? props.checked ?? props.defaultChecked ?? false)\n\nwatch(\n () => props.modelValue ?? props.checked,\n (v) => {\n if (v !== undefined) internal.value = v\n },\n)\n\nconst current = computed(() => props.modelValue ?? props.checked ?? internal.value)\n\nconst inputRef = ref<HTMLInputElement | null>(null)\n\n// Vue 3 compiles `:checked=\"current\"` into an attribute mutation rather than a\n// DOM property assignment, so `<input type=\"checkbox\" checked=\"false\">` paints\n// as *checked* (any value of the attribute is truthy in HTML). Mirror the\n// React reference behaviour by pushing the boolean through the DOM property\n// instead. The first sync runs in `onMounted` (the ref is null during setup),\n// subsequent updates piggyback on a normal watcher.\nfunction syncCheckbox() {\n const el = inputRef.value\n if (!el) return\n const next = !!current.value\n if (el.checked !== next) el.checked = next\n el.indeterminate = props.indeterminate ?? false\n}\n\nonMounted(syncCheckbox)\nwatch([() => current.value, () => props.indeterminate], () => syncCheckbox(), {\n flush: 'post',\n})\n\nfunction onChange(e: Event) {\n const v = (e.target as HTMLInputElement).checked\n internal.value = v\n emit('update:modelValue', v)\n emit('change', v)\n}\n\nconst wrapperClass = computed(() =>\n props.unstyled\n ? ''\n : [\n 'sg-checkbox',\n props.disabled || props.loading ? 'sg-checkbox-disabled' : '',\n props.loading ? 'sg-checkbox-loading' : '',\n ]\n .filter(Boolean)\n .join(' '),\n)\n\nconst slots = useSlots()\nconst hasDefaultSlot = computed(() => slots.default !== undefined)\n</script>\n\n<template>\n <label :class=\"wrapperClass\">\n <input\n ref=\"inputRef\"\n type=\"checkbox\"\n :class=\"unstyled ? '' : 'sg-checkbox-input'\"\n :aria-checked=\"current\"\n :checked=\"current\"\n :disabled=\"disabled || loading\"\n @change=\"onChange\"\n />\n <span v-if=\"hasDefaultSlot\" :class=\"unstyled ? '' : 'sg-checkbox-label'\">\n <slot />\n </span>\n <span v-if=\"loading && !unstyled\" class=\"sg-spin sg-spin-small\" aria-hidden=\"true\" />\n </label>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch, onBeforeUnmount, onMounted } from 'vue'\n\nlet selectUid = 0\nfunction genId() {\n return `sg-select-${++selectUid}`\n}\n\nexport interface SelectOption {\n label: string\n value: string | number\n disabled?: boolean\n loading?: boolean\n}\n\nexport interface SelectProps {\n /** v-model binding (single-mode value or array for multiple). */\n modelValue?: string | number | (string | number)[]\n /** Compat alias for `modelValue`. */\n value?: string | number | (string | number)[]\n /** Initial value when uncontrolled. */\n defaultValue?: string | number | (string | number)[]\n /** Options shown in the dropdown or native select. */\n options: SelectOption[]\n /** Text shown when nothing is selected. */\n placeholder?: string\n /** Multi-select mode. */\n multiple?: boolean\n /** Disables editing. */\n disabled?: boolean\n /** Shows a loading spinner and disables interaction. */\n loading?: boolean\n /** Size token. */\n size?: 'small' | 'middle' | 'large'\n /** Strips built-in styling (renders native <select>). */\n unstyled?: boolean\n}\n\nconst props = withDefaults(defineProps<SelectProps>(), {\n placeholder: 'Select...',\n multiple: false,\n disabled: false,\n loading: false,\n size: 'middle',\n})\nconst listboxId = genId()\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: string | number | (string | number)[]): void\n (e: 'change', value: string | number | (string | number)[]): void\n (e: 'blur'): void\n}>()\n\nconst open = ref(false)\nconst wrapperRef = ref<HTMLDivElement | null>(null)\n\nfunction getInitial(): string | number | (string | number)[] {\n if (props.modelValue !== undefined) return props.modelValue\n if (props.value !== undefined) return props.value\n if (props.defaultValue !== undefined) return props.defaultValue\n return props.multiple ? [] : ''\n}\n\nconst internal = ref<string | number | (string | number)[]>(getInitial())\n\nwatch(\n () => props.modelValue ?? props.value,\n (v) => {\n if (v !== undefined) internal.value = v as typeof internal.value\n },\n)\n\nconst current = computed<string | number | (string | number)[]>(\n () => props.modelValue ?? props.value ?? internal.value,\n)\n\nconst currentSingle = computed(() =>\n props.multiple ? undefined : (current.value as string | number | undefined),\n)\nconst currentMultiple = computed<(string | number)[]>(() =>\n props.multiple ? ((current.value as (string | number)[]) ?? []) : [],\n)\n\nconst selectedOption = computed(() =>\n props.multiple ? undefined : props.options.find((o) => o.value === currentSingle.value),\n)\nconst selectedOptions = computed(() =>\n props.multiple ? props.options.filter((o) => currentMultiple.value.includes(o.value)) : [],\n)\n\nfunction emitValue(v: typeof internal.value) {\n internal.value = v\n emit('update:modelValue', v)\n emit('change', v)\n}\n\nfunction handleSelect(opt: SelectOption) {\n if (opt.disabled || opt.loading) return\n if (props.multiple) {\n const exists = currentMultiple.value.includes(opt.value)\n const next = exists\n ? currentMultiple.value.filter((v) => v !== opt.value)\n : [...currentMultiple.value, opt.value]\n emitValue(next)\n } else {\n emitValue(opt.value)\n open.value = false\n }\n}\n\nfunction handleRemoveTag(val: string | number, e: Event) {\n e.stopPropagation()\n if (props.disabled || props.loading) return\n emitValue(currentMultiple.value.filter((v) => v !== val))\n}\n\nconst isDisabled = computed(() => props.disabled || props.loading)\n\nfunction isOptionSelected(opt: SelectOption) {\n return props.multiple\n ? currentMultiple.value.includes(opt.value)\n : opt.value === currentSingle.value\n}\n\nfunction handleOutside(e: MouseEvent) {\n if (wrapperRef.value && !wrapperRef.value.contains(e.target as Node)) {\n open.value = false\n }\n}\n\nonMounted(() => document.addEventListener('mousedown', handleOutside))\nonBeforeUnmount(() => document.removeEventListener('mousedown', handleOutside))\n\nconst wrapperClass = computed(() =>\n [\n 'sg-select',\n `sg-select-${props.size}`,\n props.multiple ? 'sg-select-multiple' : '',\n open.value ? 'sg-select-open' : '',\n isDisabled.value ? 'sg-select-disabled' : '',\n props.loading ? 'sg-select-loading' : '',\n ]\n .filter(Boolean)\n .join(' '),\n)\n\nfunction onNativeChange(e: Event) {\n const target = e.target as HTMLSelectElement\n if (props.multiple) {\n const picked = Array.from(target.selectedOptions).map((o) => {\n const v = o.value\n const num = Number(v)\n return props.options.some((opt) => opt.value === num) ? num : v\n })\n emitValue(picked)\n } else {\n const v = target.value\n const num = Number(v)\n const final = props.options.some((o) => o.value === num) ? num : v\n emitValue(final)\n }\n}\n</script>\n\n<template>\n <select\n v-if=\"unstyled\"\n :multiple=\"multiple\"\n :value=\"multiple ? (currentMultiple as unknown as string) : (currentSingle as string)\"\n :disabled=\"isDisabled\"\n @change=\"onNativeChange\"\n @blur=\"emit('blur')\"\n >\n <option v-if=\"!multiple && !selectedOption\" value=\"\">{{ placeholder }}</option>\n <option v-for=\"opt in options\" :key=\"opt.value\" :value=\"opt.value\" :disabled=\"opt.disabled\">\n {{ opt.label }}\n </option>\n </select>\n <div v-else ref=\"wrapperRef\" :class=\"wrapperClass\" @blur=\"emit('blur')\">\n <div\n class=\"sg-select-selector\"\n role=\"combobox\"\n :aria-expanded=\"open\"\n aria-haspopup=\"listbox\"\n :aria-controls=\"listboxId\"\n :aria-multiselectable=\"multiple || undefined\"\n :aria-disabled=\"isDisabled || undefined\"\n :tabindex=\"isDisabled ? -1 : 0\"\n @click=\"!isDisabled && (open = !open)\"\n >\n <template v-if=\"multiple\">\n <span v-if=\"selectedOptions.length === 0\" class=\"sg-select-placeholder\">{{\n placeholder\n }}</span>\n <span v-else class=\"sg-select-tags\">\n <span v-for=\"opt in selectedOptions\" :key=\"opt.value\" class=\"sg-select-tag\">\n <span class=\"sg-select-tag-label\">{{ opt.label }}</span>\n <button\n type=\"button\"\n class=\"sg-select-tag-remove\"\n :aria-label=\"`Remove ${opt.label}`\"\n tabindex=\"-1\"\n @click=\"(e) => handleRemoveTag(opt.value, e)\"\n >\n ×\n </button>\n </span>\n </span>\n </template>\n <template v-else>\n <span :class=\"selectedOption ? 'sg-select-selection-item' : 'sg-select-placeholder'\">\n {{ selectedOption?.label ?? placeholder }}\n </span>\n </template>\n <span v-if=\"loading && !unstyled\" class=\"sg-spin sg-spin-small\" aria-hidden=\"true\" />\n <span v-else class=\"sg-select-arrow\">{{ open ? '▲' : '▼' }}</span>\n </div>\n <div\n v-if=\"open\"\n :id=\"listboxId\"\n class=\"sg-select-dropdown\"\n role=\"listbox\"\n :aria-multiselectable=\"multiple || undefined\"\n >\n <div\n v-for=\"opt in options\"\n :key=\"opt.value\"\n role=\"option\"\n :aria-selected=\"isOptionSelected(opt)\"\n :class=\"[\n 'sg-select-option',\n isOptionSelected(opt) ? 'sg-select-option-selected' : '',\n opt.disabled || opt.loading ? 'sg-select-option-disabled' : '',\n opt.loading ? 'sg-select-option-loading' : '',\n ]\"\n @click=\"handleSelect(opt)\"\n >\n <span>{{ opt.label }}</span>\n <span v-if=\"opt.loading && !unstyled\" class=\"sg-spin sg-spin-small\" aria-hidden=\"true\" />\n </div>\n </div>\n </div>\n</template>\n","<script lang=\"ts\">\r\nimport { computed, inject, provide, type ComputedRef, type InjectionKey } from 'vue'\r\nimport type { SizeType, SgLocale } from '../../types'\r\n\r\n/**\r\n * Global Skygraph component configuration merged through Vue provide/inject.\r\n *\r\n * По `prefixCls`: сознательно НЕ входит в публичный API до реализации\r\n * (вариант A в `docs/styling-plan.md`). На практике все корневые классы\r\n * имеют стабильный префикс `.sg-*`; если нужна изоляция — используйте\r\n * отдельный контейнер со своими токенами.\r\n */\r\nexport interface SgConfig {\r\n /** Default size token for nested components. */\r\n size?: SizeType\r\n /** Disables interactions for nested components when true. */\r\n disabled?: boolean\r\n /** Enables bordered styling for nested components when true. */\r\n bordered?: boolean\r\n /** Locale messages shallow-merged with the parent provider when set. */\r\n locale?: SgLocale\r\n}\r\n\r\nexport const sgConfigKey = Symbol('sg-config') as InjectionKey<ComputedRef<SgConfig>>\r\n\r\nconst EMPTY: SgConfig = {}\r\nconst EMPTY_REF = computed(() => EMPTY)\r\n\r\n/**\r\n * Returns a `ComputedRef` of the merged `SgConfig` from the nearest ancestor\r\n * `ConfigProvider`. Always reactive: re-reads `.value` when ancestors update.\r\n */\r\nexport function useConfig(): ComputedRef<SgConfig> {\r\n const ref = inject(sgConfigKey, undefined)\r\n return ref ?? EMPTY_REF\r\n}\r\n\r\n/**\r\n * Resolves effective `size` and `disabled` from props, context, and explicit defaults.\r\n */\r\nexport function useConfigWithDefaults(\r\n props: { size?: SizeType; disabled?: boolean },\r\n defaults: { size?: SizeType; disabled?: boolean; bordered?: boolean } = {},\r\n): { resolvedSize: ComputedRef<SizeType>; resolvedDisabled: ComputedRef<boolean> } {\r\n const cfgRef = inject(sgConfigKey, undefined)\r\n const resolvedSize = computed<SizeType>(\r\n () => props.size ?? cfgRef?.value.size ?? defaults.size ?? 'middle',\r\n )\r\n const resolvedDisabled = computed<boolean>(\r\n () => props.disabled ?? cfgRef?.value.disabled ?? defaults.disabled ?? false,\r\n )\r\n return { resolvedSize, resolvedDisabled }\r\n}\r\n</script>\r\n\r\n<script setup lang=\"ts\">\r\nimport type { PropType } from 'vue'\r\n\r\nexport interface ConfigProviderProps {\r\n /** Default size token for nested components. */\r\n size?: SizeType\r\n /** Disables interactions for nested components when true. */\r\n disabled?: boolean\r\n /** Enables bordered styling for nested components when true. */\r\n bordered?: boolean\r\n /** Locale messages shallow-merged with the parent provider when set. */\r\n locale?: SgLocale\r\n}\r\n\r\nconst props = defineProps({\r\n size: { type: String as PropType<SizeType>, default: undefined },\r\n disabled: { type: Boolean, default: undefined },\r\n bordered: { type: Boolean, default: undefined },\r\n locale: { type: Object as PropType<SgLocale>, default: undefined },\r\n})\r\n\r\ndefineSlots<{\r\n default(props: Record<string, never>): unknown\r\n}>()\r\n\r\nconst parentRef = inject(sgConfigKey, undefined)\r\n\r\nconst merged = computed<SgConfig>(() => {\r\n const parent = parentRef?.value ?? EMPTY\r\n return {\r\n size: props.size ?? parent.size,\r\n disabled: props.disabled ?? parent.disabled,\r\n bordered: props.bordered ?? parent.bordered,\r\n locale: props.locale\r\n ? parent.locale\r\n ? { ...parent.locale, ...props.locale }\r\n : props.locale\r\n : parent.locale,\r\n }\r\n})\r\n\r\nprovide(sgConfigKey, merged)\r\n</script>\r\n\r\n<template>\r\n <slot />\r\n</template>\r\n","<script setup lang=\"ts\">\nimport { computed, ref, type PropType } from 'vue'\nimport { useConfigWithDefaults, useConfig } from './ConfigProvider.vue'\n\nexport interface PaginationProps {\n /** Current page number (1-based). */\n current: number\n /** Total number of records. */\n total: number\n /** Items per page. @default 10 */\n pageSize?: number\n /** Whether the total count is displayed. */\n showTotal?: boolean\n /** Disables all controls. */\n disabled?: boolean\n /** Renders prev/next with current/total only. */\n simple?: boolean\n /** Shows a select to change pageSize. */\n showSizeChanger?: boolean\n /** Options for the page size select. @default [10, 20, 50, 100] */\n pageSizeOptions?: number[]\n /** Shows a quick jump input. */\n showQuickJumper?: boolean\n /** Strips built-in styles when true. */\n unstyled?: boolean\n}\n\nconst props = defineProps({\n current: { type: Number, required: true },\n total: { type: Number, required: true },\n pageSize: { type: Number, default: 10 },\n showTotal: { type: Boolean, default: false },\n disabled: { type: Boolean, default: undefined },\n simple: { type: Boolean, default: false },\n showSizeChanger: { type: Boolean, default: false },\n pageSizeOptions: {\n type: Array as PropType<number[]>,\n default: () => [10, 20, 50, 100],\n },\n showQuickJumper: { type: Boolean, default: false },\n unstyled: { type: Boolean, default: false },\n})\n\nconst emit = defineEmits<{\n (e: 'change', page: number): void\n (e: 'pageSizeChange', size: number): void\n}>()\n\nconst { resolvedDisabled } = useConfigWithDefaults({ disabled: undefined }, {})\nconst disabled = computed(() => props.disabled ?? resolvedDisabled.value)\nconst cfg = useConfig()\nconst totalPrefix = computed(() => cfg.value.locale?.pagination?.totalPrefix ?? 'Total')\nconst itemsPerPageLabel = computed(() => cfg.value.locale?.pagination?.itemsPerPage ?? '/ page')\nconst jumpLabel = computed(() => cfg.value.locale?.pagination?.jump ?? 'Go to')\n\nconst jumpValue = ref('')\n\nconst totalPages = computed(() => Math.max(1, Math.ceil(props.total / props.pageSize)))\nconst safeCurrent = computed(() => Math.min(Math.max(1, props.current), totalPages.value))\n\nfunction go(page: number) {\n if (disabled.value || page < 1 || page > totalPages.value || page === safeCurrent.value) {\n return\n }\n emit('change', page)\n}\n\nfunction handleJump() {\n const num = parseInt(jumpValue.value, 10)\n if (!Number.isNaN(num)) {\n go(num)\n }\n jumpValue.value = ''\n}\n\n/**\n * Build a 7-slot page strip so the control width stays stable when the\n * user jumps between pages. Layouts:\n * • near start: [1] [2] [3] [4] [5] [...] [N]\n * • middle: [1] [...] [c-1] [c] [c+1] [...] [N]\n * • near end: [1] [...] [N-4] [N-3] [N-2] [N-1] [N]\n * Totals < 8 are rendered as a contiguous range — the strip is already\n * narrow enough that prev/next jumps cannot shift the surrounding layout.\n */\nfunction buildPages(current: number, total: number): (number | '...')[] {\n if (total <= 7) return Array.from({ length: total }, (_, i) => i + 1)\n if (current <= 4) {\n return [1, 2, 3, 4, 5, '...', total]\n }\n if (current >= total - 3) {\n return [1, '...', total - 4, total - 3, total - 2, total - 1, total]\n }\n return [1, '...', current - 1, current, current + 1, '...', total]\n}\n\nconst pages = computed(() => buildPages(safeCurrent.value, totalPages.value))\n\nconst rootClasses = computed(() =>\n ['sg-pagination', disabled.value ? 'sg-pagination-disabled' : ''].filter(Boolean).join(' '),\n)\n\nconst simpleClasses = computed(() =>\n ['sg-pagination', 'sg-pagination-simple', disabled.value ? 'sg-pagination-disabled' : '']\n .filter(Boolean)\n .join(' '),\n)\n</script>\n\n<template>\n <nav v-if=\"unstyled\" aria-label=\"Pagination\">\n <button type=\"button\" :disabled=\"safeCurrent <= 1\" @click=\"go(safeCurrent - 1)\">‹</button>\n <template v-for=\"(p, i) in pages\" :key=\"`p${i}-${p}`\">\n <span v-if=\"p === '...'\">…</span>\n <button\n v-else\n type=\"button\"\n :aria-current=\"p === safeCurrent ? 'page' : undefined\"\n @click=\"go(p as number)\"\n >\n {{ p }}\n </button>\n </template>\n <button type=\"button\" :disabled=\"safeCurrent >= totalPages\" @click=\"go(safeCurrent + 1)\">\n ›\n </button>\n </nav>\n <nav v-else-if=\"simple\" :class=\"simpleClasses\" aria-label=\"Pagination\">\n <button\n type=\"button\"\n class=\"sg-pagination-item sg-pagination-prev\"\n :disabled=\"safeCurrent <= 1\"\n @click=\"go(safeCurrent - 1)\"\n >\n ‹\n </button>\n <span class=\"sg-pagination-simple-pager\">{{ safeCurrent }} / {{ totalPages }}</span>\n <button\n type=\"button\"\n class=\"sg-pagination-item sg-pagination-next\"\n :disabled=\"safeCurrent >= totalPages\"\n @click=\"go(safeCurrent + 1)\"\n >\n ›\n </button>\n </nav>\n <nav v-else :class=\"rootClasses\" aria-label=\"Pagination\">\n <span v-if=\"showTotal\" class=\"sg-pagination-total\">{{ totalPrefix }} {{ total }}</span>\n <button\n type=\"button\"\n class=\"sg-pagination-item sg-pagination-prev\"\n :disabled=\"safeCurrent <= 1\"\n @click=\"go(safeCurrent - 1)\"\n >\n ‹\n </button>\n <template v-for=\"(p, i) in pages\" :key=\"`p${i}-${p}`\">\n <span v-if=\"p === '...'\" class=\"sg-pagination-ellipsis\">…</span>\n <button\n v-else\n type=\"button\"\n :class=\"`sg-pagination-item${p === safeCurrent ? ' sg-pagination-item-active' : ''}`\"\n :aria-current=\"p === safeCurrent ? 'page' : undefined\"\n @click=\"go(p as number)\"\n >\n {{ p }}\n </button>\n </template>\n <button\n type=\"button\"\n class=\"sg-pagination-item sg-pagination-next\"\n :disabled=\"safeCurrent >= totalPages\"\n @click=\"go(safeCurrent + 1)\"\n >\n ›\n </button>\n <select\n v-if=\"showSizeChanger\"\n class=\"sg-pagination-size-changer\"\n :value=\"pageSize\"\n :disabled=\"disabled\"\n @change=\"emit('pageSizeChange', Number(($event.target as HTMLSelectElement).value))\"\n >\n <option v-for=\"opt in pageSizeOptions\" :key=\"opt\" :value=\"opt\">\n {{ opt }} {{ itemsPerPageLabel }}\n </option>\n </select>\n <span v-if=\"showQuickJumper\" class=\"sg-pagination-quick-jumper\">\n {{ jumpLabel }}\n <input\n type=\"text\"\n class=\"sg-pagination-jumper-input\"\n :value=\"jumpValue\"\n :disabled=\"disabled\"\n @input=\"jumpValue = ($event.target as HTMLInputElement).value\"\n @keydown.enter=\"handleJump\"\n @blur=\"handleJump\"\n />\n </span>\n </nav>\n</template>\n","<script setup lang=\"ts\">\r\nimport { computed, onBeforeUnmount, ref, useSlots, watch } from 'vue'\r\nimport { useConfigWithDefaults } from './ConfigProvider.vue'\r\nimport type { SizeType } from '../../types'\r\n\r\nexport interface SpinProps {\r\n /** When `true`, shows the loading state (subject to `delay`). @default true */\r\n spinning?: boolean\r\n /** Component size variant. */\r\n size?: SizeType\r\n /** Milliseconds to wait before showing the spinner after `spinning` becomes true. */\r\n delay?: number\r\n /** Optional text below the indicator. */\r\n tip?: string\r\n /** When `true`, covers the viewport instead of inline or wrapping children. */\r\n fullscreen?: boolean\r\n /** Strips built-in styles when true. */\r\n unstyled?: boolean\r\n}\r\n\r\nconst props = withDefaults(defineProps<SpinProps>(), {\r\n spinning: true,\r\n fullscreen: false,\r\n})\r\n\r\ndefineSlots<{\r\n default(props: Record<string, never>): unknown\r\n indicator(props: Record<string, never>): unknown\r\n}>()\r\n\r\nconst { resolvedSize } = useConfigWithDefaults({ size: undefined }, {})\r\nconst realSize = computed<SizeType>(() => props.size ?? resolvedSize.value)\r\n\r\nconst visible = ref(props.delay ? false : props.spinning)\r\nlet timer: ReturnType<typeof setTimeout> | undefined\r\n\r\nwatch(\r\n () => [props.spinning, props.delay] as const,\r\n ([s, d]) => {\r\n if (timer) clearTimeout(timer)\r\n if (!d) {\r\n visible.value = !!s\r\n return\r\n }\r\n if (s) {\r\n timer = setTimeout(() => {\r\n visible.value = true\r\n }, d)\r\n } else {\r\n visible.value = false\r\n }\r\n },\r\n { immediate: true },\r\n)\r\n\r\nonBeforeUnmount(() => {\r\n if (timer) clearTimeout(timer)\r\n})\r\n\r\nconst spinSizeClass = computed(() => (realSize.value === 'middle' ? 'default' : realSize.value))\r\nconst spinClasses = computed(() =>\r\n props.unstyled ? '' : `sg-spin sg-spin-${spinSizeClass.value}`,\r\n)\r\n\r\nconst slots = useSlots()\r\nconst hasChildren = computed(() => Boolean(slots.default))\r\nconst hasIndicator = computed(() => Boolean(slots.indicator))\r\n</script>\r\n\r\n<template>\r\n <template v-if=\"!visible && !hasChildren\" />\r\n <template v-else-if=\"!visible && hasChildren\">\r\n <slot />\r\n </template>\r\n <div v-else-if=\"fullscreen\" :class=\"unstyled ? '' : 'sg-spin-fullscreen'\">\r\n <div :class=\"unstyled ? '' : 'sg-spin-fullscreen-inner'\">\r\n <slot v-if=\"hasIndicator\" name=\"indicator\" />\r\n <span\r\n v-else\r\n :class=\"spinClasses\"\r\n role=\"status\"\r\n aria-live=\"polite\"\r\n aria-label=\"Loading\"\r\n />\r\n <div v-if=\"tip\" :class=\"unstyled ? '' : 'sg-spin-tip'\">{{ tip }}</div>\r\n </div>\r\n </div>\r\n <span v-else-if=\"!hasChildren\" :class=\"unstyled ? '' : 'sg-spin-standalone'\">\r\n <slot v-if=\"hasIndicator\" name=\"indicator\" />\r\n <span\r\n v-else\r\n :class=\"spinClasses\"\r\n role=\"status\"\r\n aria-live=\"polite\"\r\n aria-label=\"Loading\"\r\n />\r\n <div v-if=\"tip\" :class=\"unstyled ? '' : 'sg-spin-tip'\">{{ tip }}</div>\r\n </span>\r\n <div v-else :class=\"unstyled ? '' : 'sg-spin-container'\">\r\n <div :class=\"unstyled ? '' : 'sg-spin-overlay'\">\r\n <slot v-if=\"hasIndicator\" name=\"indicator\" />\r\n <span\r\n v-else\r\n :class=\"spinClasses\"\r\n role=\"status\"\r\n aria-live=\"polite\"\r\n aria-label=\"Loading\"\r\n />\r\n <div v-if=\"tip\" :class=\"unstyled ? '' : 'sg-spin-tip'\">{{ tip }}</div>\r\n </div>\r\n <div :class=\"visible && !unstyled ? 'sg-spin-blur' : ''\">\r\n <slot />\r\n </div>\r\n </div>\r\n</template>\r\n","import type { ColumnFilter, RowId, SortConfig, SortDirection, FilterOperator } from '@skygraph/core'\n\nexport type { RowId, SortDirection, SortConfig, ColumnFilter, FilterOperator }\n\nexport type TableSlot =\n | 'root'\n | 'toolbar'\n | 'scroll'\n | 'grid'\n | 'headerRow'\n | 'headerCell'\n | 'row'\n | 'bodyCell'\n | 'empty'\n | 'pagination'\n | 'footer'\n\nexport type TableClassNames = Partial<Record<TableSlot, string>>\nexport type TableStyles = Partial<Record<TableSlot, Record<string, string | number>>>\n\nexport interface TableLocale {\n emptyText?: string\n filterReset?: string\n filterConfirm?: string\n filterAll?: string\n searchPlaceholder?: string\n sortAsc?: string\n sortDesc?: string\n filterIcon?: string\n loadingText?: string\n totalRows?: (count: number) => string\n selectedRows?: (count: number) => string\n expandIcon?: string\n}\n\nexport const DEFAULT_TABLE_LOCALE: Required<TableLocale> = {\n emptyText: 'No data',\n filterReset: 'Reset',\n filterConfirm: 'OK',\n filterAll: 'All',\n searchPlaceholder: 'Search...',\n sortAsc: '▲',\n sortDesc: '▼',\n filterIcon: '▾',\n loadingText: 'Loading…',\n totalRows: (count) => `${count} rows`,\n selectedRows: (count) => `${count} selected`,\n expandIcon: '›',\n}\n\n/** Cell merge span metadata from `onCell`. */\nexport interface CellSpan {\n rowSpan?: number\n colSpan?: number\n}\n\n/** Built-in footer aggregate operation identifiers. */\nexport type AggregateType = 'sum' | 'avg' | 'count' | 'min' | 'max'\n\n/** Props passed to a custom column filter dropdown slot. */\nexport interface FilterDropdownSlotProps {\n /** Active filter value(s) for this column. */\n selectedKeys: unknown[]\n /** Updates the selected keys before commit. */\n setSelectedKeys: (keys: unknown[]) => void\n /** Applies the current selection and closes the dropdown. */\n confirm: () => void\n /** Clears the active filter. */\n clearFilters: () => void\n /** Closes the dropdown without applying. */\n close: () => void\n}\n\nexport interface TableColumn {\n /** Unique column key matching row data fields. */\n key: string\n /** Header label. */\n title: string\n /** Default column width in pixels. */\n width?: number\n /** Minimum width when resizing. */\n minWidth?: number\n /** Enables click-to-sort on this column. */\n sortable?: boolean\n /** Enables column resizing via drag handle on the header. */\n resizable?: boolean\n /** Allows in-cell editing when `onCellEdit` is set on the table. */\n editable?: boolean\n /** Sticky column position. */\n fixed?: 'left' | 'right'\n /** Cell text alignment. */\n align?: 'left' | 'center' | 'right'\n /** Hides the column when true. */\n hidden?: boolean\n /** Preset filter options. */\n filters?: Array<{ text: string; value: unknown }>\n /** Predicate to test if a row matches a filter value. */\n onFilter?: (value: unknown, row: Record<string, unknown>) => boolean\n /** When false, filter mode is single-select radio. @default true */\n filterMultiple?: boolean\n /** Returns rowspan/colspan for the cell at this row index. */\n onCell?: (row: Record<string, unknown>, rowIndex: number) => CellSpan\n /** Child columns for grouped headers. */\n children?: TableColumn[]\n /** Footer aggregate for this column. */\n aggregate?: AggregateType | ((values: unknown[]) => unknown)\n}\n\n/** Selection config — mirrors React. */\nexport interface RowSelectionConfig {\n selectedKeys: RowId[]\n onChange?: (keys: RowId[], rows: Array<Record<string, unknown>>) => void\n type?: 'checkbox' | 'radio'\n}\n\n/** Expandable row configuration. */\nexport interface ExpandableConfig {\n /** Renders content below the row when expanded. */\n expandedRowRender: (row: Record<string, unknown>, id: RowId) => unknown\n /** Controlled expanded row keys. */\n expandedKeys?: RowId[]\n /** Keys expanded on first mount when `expandedKeys` is not controlled. */\n defaultExpandedRowKeys?: RowId[]\n /** Fires when a row expand state toggles. */\n onExpand?: (expanded: boolean, id: RowId) => void\n /** Limits which rows show an expand control. */\n rowExpandable?: (row: Record<string, unknown>) => boolean\n}\n\n/** Tree-shaped row data options. */\nexport interface TreeConfig {\n /** Row field holding nested rows (default `children`). */\n childrenColumnName?: string\n /** Pixels per tree depth level. */\n indentSize?: number\n /** Starts with all tree nodes expanded. */\n defaultExpandAllRows?: boolean\n}\n\n/** One cell in a custom summary row. */\nexport interface SummaryCell {\n content: unknown\n colSpan?: number\n align?: 'left' | 'center' | 'right'\n}\n\n/** Virtual scroll configuration. */\nexport interface VirtualConfig {\n /**\n * Row height. Number — fixed; function — dynamic estimate. Defaults to 40.\n */\n rowHeight?: number | ((row: Record<string, unknown>, id: RowId) => number)\n /** Estimate callback used for unknown row heights. */\n estimateRowHeight?: (row: Record<string, unknown>, id: RowId) => number\n /** Number of rows to render outside the visible window. @default 6 */\n overscan?: number\n /** Viewport height; defaults to scroll container height. */\n height?: number | string\n}\n\nexport interface TableProps {\n /** Column definitions (leaf and/or grouped). */\n columns: TableColumn[]\n /** Dataset rows. */\n data: Array<{ id: RowId; data: Record<string, unknown> }>\n /** Page size for built-in pagination; omit to render all rows on a single page. */\n pageSize?: number\n /** Row selection state. */\n rowSelection?: RowSelectionConfig\n /** Expandable row config (per-row inline content + expand button). */\n expandable?: ExpandableConfig\n /** Tree-shaped data config (renders `data.children` as nested rows). */\n tree?: TreeConfig\n /** Outlined table borders. @default false */\n bordered?: boolean\n /** Density preset. @default 'middle' */\n size?: 'small' | 'middle' | 'large'\n /** Sticky header while scrolling vertically. */\n sticky?: boolean\n /** Locale strings. */\n locale?: TableLocale\n /** Row class name. */\n rowClassName?: string | ((row: Record<string, unknown>, id: RowId) => string)\n /** Toolbar search across visible columns. */\n searchable?: boolean\n /** Controlled global search query. */\n searchValue?: string\n /** When false, disables pagination block even if `pageSize` is set. @default true */\n showPagination?: boolean\n /** Render without Skygraph styles. */\n unstyled?: boolean\n /** Public class names per slot. */\n classNames?: TableClassNames\n /** Public inline styles per slot. */\n styles?: TableStyles\n /** Loading overlay. @default false */\n loading?: boolean\n /** Horizontal and/or vertical scroll constraints. */\n scroll?: { x?: number | string; y?: number | string }\n /** Custom summary rows below the body. */\n summary?: (data: Array<{ id: RowId; data: Record<string, unknown> }>) => SummaryCell[][]\n /** Commits inline cell edit values. */\n onCellEdit?: (id: RowId, column: string, value: unknown) => void\n /**\n * Virtualises the body for big datasets.\n * - `true` — fixed 40px row height.\n * - object — see `VirtualConfig`.\n */\n virtual?: boolean | VirtualConfig\n /** Shows aggregate footer row. */\n footer?: boolean\n /** Zebra striping on body rows. */\n striped?: boolean\n /** Row hover highlight; set false to disable. @default true */\n highlightOnHover?: boolean\n}\n","<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch, useSlots } from 'vue'\nimport { createVirtual, type VirtualEngine } from '@skygraph/core'\nimport { useTable } from '../../../composables/useTable'\nimport SgInput from '../../ui/Input.vue'\nimport SgCheckbox from '../../ui/Checkbox.vue'\nimport SgSelect from '../../ui/Select.vue'\nimport SgPagination from '../../ui/Pagination.vue'\nimport SgSpin from '../../ui/Spin.vue'\nimport {\n DEFAULT_TABLE_LOCALE,\n type TableProps,\n type TableColumn,\n type RowId,\n type SortDirection,\n type FilterDropdownSlotProps,\n type SummaryCell,\n} from './types'\n\nconst props = withDefaults(defineProps<TableProps>(), {\n bordered: false,\n size: 'middle',\n sticky: false,\n searchable: false,\n showPagination: true,\n unstyled: false,\n loading: false,\n highlightOnHover: true,\n})\n\nconst emit = defineEmits<{\n (e: 'rowClick', id: RowId, data: Record<string, unknown>): void\n (e: 'pageChange', page: number): void\n (e: 'sortChange', column: string, direction: SortDirection | null): void\n (e: 'cellEdit', id: RowId, column: string, value: unknown): void\n (e: 'expand', expanded: boolean, id: RowId): void\n}>()\n\ndefineSlots<{\n toolbar(props: Record<string, never>): unknown\n empty(props: Record<string, never>): unknown\n cell(props: {\n column: TableColumn\n row: Record<string, unknown>\n id: RowId\n value: unknown\n }): unknown\n expandedRow(props: { row: Record<string, unknown>; id: RowId }): unknown\n filterDropdown(props: FilterDropdownSlotProps & { column: TableColumn }): unknown\n}>()\n\nconst slots = useSlots()\n\nconst localeFull = computed(() => ({ ...DEFAULT_TABLE_LOCALE, ...props.locale }))\nconst sCls = computed(() => props.classNames ?? {})\nconst sSty = computed(() => props.styles ?? {})\n\n/* -------------------------------------------------------------------------- */\n/* Column flattening + header grid */\n/* -------------------------------------------------------------------------- */\n\ninterface HeaderCellShape {\n col: TableColumn\n colSpan: number\n rowSpan: number\n}\n\nfunction colDepth(c: TableColumn): number {\n if (!c.children || c.children.length === 0) return 1\n return 1 + Math.max(...c.children.map(colDepth))\n}\n\nfunction colLeafCount(c: TableColumn): number {\n if (!c.children || c.children.length === 0) return c.hidden ? 0 : 1\n return c.children.reduce((sum, ch) => sum + colLeafCount(ch), 0)\n}\n\nconst hasColumnGroups = computed(() =>\n props.columns.some((c) => c.children && c.children.length > 0),\n)\n\nconst headerDepth = computed(() =>\n props.columns.length === 0 ? 1 : Math.max(...props.columns.map(colDepth)),\n)\n\nconst leafColumns = computed<TableColumn[]>(() => {\n const out: TableColumn[] = []\n const visit = (c: TableColumn) => {\n if (c.hidden) return\n if (!c.children || c.children.length === 0) out.push(c)\n else c.children.forEach(visit)\n }\n props.columns.forEach(visit)\n return out\n})\n\nconst headerRows = computed<HeaderCellShape[][]>(() => {\n const depth = headerDepth.value\n const rows: HeaderCellShape[][] = Array.from({ length: depth }, () => [])\n const visit = (c: TableColumn, level: number) => {\n if (c.hidden) return\n const hasChildren = !!(c.children && c.children.length > 0)\n if (hasChildren) {\n const span = colLeafCount(c)\n if (span > 0) {\n rows[level].push({ col: c, colSpan: span, rowSpan: 1 })\n c.children!.forEach((ch) => visit(ch, level + 1))\n }\n } else {\n rows[level].push({ col: c, colSpan: 1, rowSpan: depth - level })\n }\n }\n props.columns.forEach((c) => visit(c, 0))\n return rows\n})\n\nconst columns = computed(() => leafColumns.value)\n\n/* -------------------------------------------------------------------------- */\n/* Engine wiring */\n/* -------------------------------------------------------------------------- */\n\nconst {\n table,\n visibleRows,\n tableState,\n setSort,\n clearSort,\n addFilter,\n clearFilters,\n setPage,\n setFilterFn,\n refresh,\n columnWidths,\n setColumnWidth,\n} = useTable({\n pageSize: props.pageSize,\n data: props.data,\n})\n\nwatch(\n () => props.pageSize,\n (next) => {\n if (next !== undefined) {\n table.setPageSize(next)\n refresh()\n }\n },\n)\n\nwatch(\n () => props.data,\n (next) => {\n table.reset()\n if (next) table.addRows(next)\n // In virtual mode the engine renders the full dataset — pagination\n // must be bypassed even if the consumer forgot to lift `pageSize`.\n if (props.virtual && props.pageSize === undefined && next) {\n table.setPageSize(next.length || 1)\n }\n refresh()\n },\n)\n\n// Mirror the data-watch on initial mount so virtual demos that don't set\n// pageSize still see the whole dataset (otherwise visibleRows defaults\n// to the engine's 50-row page and the virtual scroller measures off\n// 50 instead of N rows).\nwatch(\n () => [props.virtual, props.data?.length],\n () => {\n if (props.virtual && props.pageSize === undefined && props.data) {\n table.setPageSize(props.data.length || 1)\n refresh()\n }\n },\n { immediate: true },\n)\n\n/* -------------------------------------------------------------------------- */\n/* Global search */\n/* -------------------------------------------------------------------------- */\n\nconst internalSearch = ref('')\n\nconst searchQuery = computed<string>({\n get: () => (props.searchValue !== undefined ? props.searchValue : internalSearch.value),\n set: (v) => {\n if (props.searchValue === undefined) internalSearch.value = v\n },\n})\n\n/* -------------------------------------------------------------------------- */\n/* Sorting */\n/* -------------------------------------------------------------------------- */\n\nconst currentSort = computed(() => tableState.value.sorts[0] ?? null)\n\nfunction handleSortClick(column: TableColumn) {\n if (!column.sortable) return\n const cur = currentSort.value\n let next: SortDirection | null = 'asc'\n if (cur && cur.column === column.key) {\n if (cur.direction === 'asc') next = 'desc'\n else if (cur.direction === 'desc') next = null\n }\n if (next === null) clearSort()\n else setSort(column.key, next)\n emit('sortChange', column.key, next)\n}\n\n/* -------------------------------------------------------------------------- */\n/* Selection */\n/* -------------------------------------------------------------------------- */\n\nconst internalSelected = ref<RowId[]>([])\nconst selectedKeys = computed<RowId[]>(\n () => props.rowSelection?.selectedKeys ?? internalSelected.value,\n)\nconst selectedSet = computed<Set<RowId>>(() => new Set(selectedKeys.value))\n\nfunction toggleRowSelected(id: RowId) {\n if (!props.rowSelection) return\n let next: RowId[]\n if (props.rowSelection.type === 'radio') {\n next = selectedSet.value.has(id) ? [] : [id]\n } else {\n next = selectedSet.value.has(id)\n ? selectedKeys.value.filter((k) => k !== id)\n : [...selectedKeys.value, id]\n }\n internalSelected.value = next\n const rows = props.data.filter((r) => next.includes(r.id)).map((r) => r.data)\n props.rowSelection.onChange?.(next, rows)\n}\n\nconst allCurrentPageSelected = computed(() => {\n if (visibleRows.value.length === 0) return false\n return visibleRows.value.every((r) => selectedSet.value.has(r.id))\n})\n\nconst someCurrentPageSelected = computed(\n () => !allCurrentPageSelected.value && visibleRows.value.some((r) => selectedSet.value.has(r.id)),\n)\n\nfunction toggleSelectAll() {\n if (!props.rowSelection) return\n const ids = visibleRows.value.map((r) => r.id)\n let next: RowId[]\n if (allCurrentPageSelected.value) {\n next = selectedKeys.value.filter((k) => !ids.includes(k))\n } else {\n const set = new Set(selectedKeys.value)\n for (const id of ids) set.add(id)\n next = Array.from(set)\n }\n internalSelected.value = next\n const rows = props.data.filter((r) => next.includes(r.id)).map((r) => r.data)\n props.rowSelection.onChange?.(next, rows)\n}\n\n/* -------------------------------------------------------------------------- */\n/* Tree mode */\n/* -------------------------------------------------------------------------- */\n\ninterface FlatRow {\n id: RowId\n data: Record<string, unknown>\n depth: number\n hasChildren: boolean\n}\n\nconst treeChildField = computed(() => props.tree?.childrenColumnName ?? 'children')\nconst treeIndent = computed(() => props.tree?.indentSize ?? 16)\n\nconst treeExpanded = ref<Set<RowId>>(new Set())\n\nfunction collectAllTreeIds(rows: Array<{ id: RowId; data: Record<string, unknown> }>) {\n const out = new Set<RowId>()\n const visit = (list: Array<{ id: RowId; data: Record<string, unknown> }>) => {\n for (const r of list) {\n const children = r.data[treeChildField.value] as\n | Array<{ id: RowId; data: Record<string, unknown> }>\n | undefined\n if (children && children.length > 0) {\n out.add(r.id)\n visit(children)\n }\n }\n }\n visit(rows)\n return out\n}\n\nfunction initTreeExpanded() {\n if (props.tree?.defaultExpandAllRows) {\n treeExpanded.value = collectAllTreeIds(props.data ?? [])\n } else {\n treeExpanded.value = new Set()\n }\n}\nonMounted(initTreeExpanded)\nwatch(() => props.tree?.defaultExpandAllRows, initTreeExpanded)\nwatch(\n () => props.data,\n () => initTreeExpanded(),\n)\n\nfunction toggleTreeRow(id: RowId) {\n const next = new Set(treeExpanded.value)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n treeExpanded.value = next\n}\n\nconst flatRows = computed<FlatRow[]>(() => {\n if (!props.tree) {\n return visibleRows.value.map((r) => ({\n id: r.id,\n data: r.data,\n depth: 0,\n hasChildren: false,\n }))\n }\n const out: FlatRow[] = []\n const childField = treeChildField.value\n const visit = (rows: Array<{ id: RowId; data: Record<string, unknown> }>, depth: number) => {\n for (const r of rows) {\n const children = r.data[childField] as\n | Array<{ id: RowId; data: Record<string, unknown> }>\n | undefined\n const has = !!(children && children.length > 0)\n out.push({ id: r.id, data: r.data, depth, hasChildren: has })\n if (has && treeExpanded.value.has(r.id)) {\n visit(children!, depth + 1)\n }\n }\n }\n visit(visibleRows.value, 0)\n return out\n})\n\n/* -------------------------------------------------------------------------- */\n/* Expandable rows */\n/* -------------------------------------------------------------------------- */\n\nconst internalExpanded = ref<Set<RowId>>(new Set())\n\nonMounted(() => {\n const exp = props.expandable\n if (exp?.defaultExpandedRowKeys) {\n internalExpanded.value = new Set(exp.defaultExpandedRowKeys)\n }\n})\n\nconst expandedSet = computed<Set<RowId>>(() => {\n const exp = props.expandable\n if (exp?.expandedKeys) return new Set(exp.expandedKeys)\n return internalExpanded.value\n})\n\nfunction toggleExpand(id: RowId) {\n const exp = props.expandable\n if (!exp) return\n const wasExpanded = expandedSet.value.has(id)\n if (exp.expandedKeys === undefined) {\n const next = new Set(internalExpanded.value)\n if (wasExpanded) next.delete(id)\n else next.add(id)\n internalExpanded.value = next\n }\n exp.onExpand?.(!wasExpanded, id)\n emit('expand', !wasExpanded, id)\n}\n\nfunction isRowExpandable(row: Record<string, unknown>): boolean {\n const exp = props.expandable\n if (!exp) return false\n return exp.rowExpandable ? exp.rowExpandable(row) : true\n}\n\n/* -------------------------------------------------------------------------- */\n/* Per-column filters */\n/* -------------------------------------------------------------------------- */\n\nconst activeFilters = ref<Map<string, unknown[]>>(new Map())\nconst openFilterDropdown = ref<string | null>(null)\n\nfunction rebuildFilters() {\n const colsWith = columns.value.filter((c) => c.onFilter && activeFilters.value.get(c.key)?.length)\n const hasSearch = props.searchable && searchQuery.value.length > 0\n if (colsWith.length === 0 && !hasSearch) {\n setFilterFn(null)\n return\n }\n const lower = hasSearch ? searchQuery.value.toLowerCase() : ''\n setFilterFn((row) => {\n for (const col of colsWith) {\n const vals = activeFilters.value.get(col.key)!\n const fn = col.onFilter!\n if (!vals.some((v) => fn(v, row))) return false\n }\n if (hasSearch) {\n const match = columns.value.some((c) => {\n const v = row[c.key]\n return v != null && String(v).toLowerCase().includes(lower)\n })\n if (!match) return false\n }\n return true\n })\n}\n\nwatch(\n searchQuery,\n () => {\n rebuildFilters()\n refresh()\n },\n { immediate: true },\n)\n\nfunction applyColumnFilter(column: TableColumn, values: unknown[]) {\n if (!values || values.length === 0) {\n activeFilters.value.delete(column.key)\n if (!column.onFilter) table.removeFilter(column.key)\n } else {\n activeFilters.value.set(column.key, values)\n if (!column.onFilter) {\n addFilter({ column: column.key, value: values[0], operator: 'eq' })\n }\n }\n activeFilters.value = new Map(activeFilters.value)\n rebuildFilters()\n refresh()\n}\n\nfunction toggleFilterDropdown(key: string) {\n openFilterDropdown.value = openFilterDropdown.value === key ? null : key\n}\nfunction closeFilterDropdown() {\n openFilterDropdown.value = null\n}\n\nconst filterDropdownRefs = ref<Map<string, HTMLElement>>(new Map())\nfunction setFilterDropdownRef(key: string, el: Element | null) {\n if (el) filterDropdownRefs.value.set(key, el as HTMLElement)\n else filterDropdownRefs.value.delete(key)\n}\n\nfunction onDocClick(ev: MouseEvent) {\n if (!openFilterDropdown.value) return\n const el = filterDropdownRefs.value.get(openFilterDropdown.value)\n if (el && el.contains(ev.target as Node)) return\n closeFilterDropdown()\n}\nonMounted(() => document.addEventListener('mousedown', onDocClick))\nonBeforeUnmount(() => document.removeEventListener('mousedown', onDocClick))\n\n/* -------------------------------------------------------------------------- */\n/* Resizable columns */\n/* -------------------------------------------------------------------------- */\n\nconst resizing = ref<{ key: string; startX: number; startW: number } | null>(null)\n\nfunction onResizeStart(col: TableColumn, ev: MouseEvent) {\n ev.preventDefault()\n ev.stopPropagation()\n const startW = columnWidths.value[col.key] ?? col.width ?? 150\n resizing.value = { key: col.key, startX: ev.clientX, startW }\n document.addEventListener('mousemove', onResizeMove)\n document.addEventListener('mouseup', onResizeEnd)\n}\n\nfunction onResizeMove(ev: MouseEvent) {\n const r = resizing.value\n if (!r) return\n const min = props.columns.find((c) => c.key === r.key)?.minWidth ?? 50\n const next = Math.max(min, r.startW + (ev.clientX - r.startX))\n setColumnWidth(r.key, next)\n}\n\nfunction onResizeEnd() {\n resizing.value = null\n document.removeEventListener('mousemove', onResizeMove)\n document.removeEventListener('mouseup', onResizeEnd)\n}\n\n/* -------------------------------------------------------------------------- */\n/* Editable cells */\n/* -------------------------------------------------------------------------- */\n\nconst editingCell = ref<{ id: RowId; key: string } | null>(null)\nconst editingValue = ref<string>('')\n\nfunction startEdit(id: RowId, key: string, value: unknown) {\n editingCell.value = { id, key }\n editingValue.value = value == null ? '' : String(value)\n void nextTick(() => {\n const input = document.querySelector<HTMLInputElement>('.sg-table-edit-input')\n input?.focus()\n input?.select()\n })\n}\n\nfunction commitEdit() {\n if (!editingCell.value) return\n const { id, key } = editingCell.value\n emit('cellEdit', id, key, editingValue.value)\n props.onCellEdit?.(id, key, editingValue.value)\n editingCell.value = null\n}\n\nfunction cancelEdit() {\n editingCell.value = null\n}\n\n/* -------------------------------------------------------------------------- */\n/* Layout: grid template + fixed offsets */\n/* -------------------------------------------------------------------------- */\n\nconst DEFAULT_COL_WIDTH = 150\nconst MIN_COL_WIDTH = 50\nconst EXPAND_COL_WIDTH = 40\nconst SELECTION_COL_WIDTH = 48\n\nfunction colWidthPx(col: TableColumn): number {\n return columnWidths.value[col.key] ?? col.width ?? DEFAULT_COL_WIDTH\n}\n\nconst hasScrollX = computed(() => props.scroll?.x != null)\n\nconst hasAutoColumns = computed(() =>\n columns.value.some((c) => !c.fixed && columnWidths.value[c.key] == null && c.width == null),\n)\n\nconst shouldFlexExplicitWidths = computed(() => !hasScrollX.value && !hasAutoColumns.value)\n\nfunction colTrack(col: TableColumn): string {\n const resized = columnWidths.value[col.key] != null\n const w = columnWidths.value[col.key] ?? col.width ?? DEFAULT_COL_WIDTH\n if (hasScrollX.value) {\n return col.fixed || resized ? `${w}px` : `${w}px`\n }\n if (col.fixed || resized) return `${w}px`\n if (col.width == null) return `minmax(${MIN_COL_WIDTH}px, 1fr)`\n if (shouldFlexExplicitWidths.value) return `minmax(${MIN_COL_WIDTH}px, ${w}fr)`\n return `minmax(${MIN_COL_WIDTH}px, ${w}px)`\n}\n\nconst totalLeadingCols = computed(() => (props.expandable ? 1 : 0) + (props.rowSelection ? 1 : 0))\n\nconst totalCols = computed(() => totalLeadingCols.value + columns.value.length)\n\nconst gridTemplate = computed(() => {\n const parts: string[] = []\n if (props.expandable) parts.push(`${EXPAND_COL_WIDTH}px`)\n if (props.rowSelection) parts.push(`${SELECTION_COL_WIDTH}px`)\n for (const col of columns.value) parts.push(colTrack(col))\n return parts.join(' ')\n})\n\ninterface FixedOffsets {\n left: Record<string, number>\n right: Record<string, number>\n}\n\nconst fixedOffsets = computed<FixedOffsets>(() => {\n const left: Record<string, number> = {}\n const right: Record<string, number> = {}\n let leftSum = 0\n if (props.expandable) leftSum += EXPAND_COL_WIDTH\n if (props.rowSelection) leftSum += SELECTION_COL_WIDTH\n for (const col of columns.value) {\n if (col.fixed === 'left') {\n left[col.key] = leftSum\n leftSum += colWidthPx(col)\n }\n }\n let rightSum = 0\n for (const col of [...columns.value].reverse()) {\n if (col.fixed === 'right') {\n right[col.key] = rightSum\n rightSum += colWidthPx(col)\n }\n }\n return { left, right }\n})\n\nfunction fixedStyle(col: TableColumn, isHeader = false): Record<string, string | number> {\n const out: Record<string, string | number> = {}\n if (col.align) out.textAlign = col.align\n if (col.fixed === 'left') {\n out.position = 'sticky'\n out.left = `${fixedOffsets.value.left[col.key] ?? 0}px`\n out.zIndex = isHeader ? 4 : 2\n }\n if (col.fixed === 'right') {\n out.position = 'sticky'\n out.right = `${fixedOffsets.value.right[col.key] ?? 0}px`\n out.zIndex = isHeader ? 4 : 2\n }\n return out\n}\n\n/* -------------------------------------------------------------------------- */\n/* Pagination */\n/* -------------------------------------------------------------------------- */\n\nconst totalPages = computed(() => tableState.value.totalPages)\n\nfunction gotoPage(page: number) {\n if (page < 1 || page > totalPages.value) return\n setPage(page)\n emit('pageChange', page)\n}\n\n/* -------------------------------------------------------------------------- */\n/* Summary / footer aggregates */\n/* -------------------------------------------------------------------------- */\n\nconst summaryRows = computed<SummaryCell[][]>(() =>\n props.summary ? props.summary(visibleRows.value) : [],\n)\n\nfunction aggregateValue(col: TableColumn): unknown {\n if (!col.aggregate) return null\n const values = visibleRows.value.map((r) => r.data[col.key])\n if (typeof col.aggregate === 'function') return col.aggregate(values)\n const nums = values.map(Number).filter((n) => !Number.isNaN(n))\n if (nums.length === 0) return col.aggregate === 'count' ? values.length : '-'\n switch (col.aggregate) {\n case 'sum':\n return Math.round(nums.reduce((a, b) => a + b, 0) * 100) / 100\n case 'avg':\n return Math.round((nums.reduce((a, b) => a + b, 0) / nums.length) * 100) / 100\n case 'count':\n return values.length\n case 'min':\n return Math.min(...nums)\n case 'max':\n return Math.max(...nums)\n }\n return null\n}\n\n/* -------------------------------------------------------------------------- */\n/* Virtual scroll (engine-driven, same grid as non-virtual) */\n/* -------------------------------------------------------------------------- */\n\ntype VirtualRowHeightFn = (row: Record<string, unknown>, id: RowId) => number\n\nconst virtualConfig = computed(() => {\n if (!props.virtual) return null\n const v = props.virtual\n const isObj = typeof v === 'object'\n return {\n rowHeight: (isObj ? (v.rowHeight ?? 40) : 40) as number | VirtualRowHeightFn,\n estimateRowHeight: isObj ? v.estimateRowHeight : undefined,\n overscan: isObj ? (v.overscan ?? 5) : 5,\n height: isObj ? v.height : undefined,\n }\n})\n\nconst virtualEngine = ref<VirtualEngine | null>(null)\nconst scrollEl = ref<HTMLElement | null>(null)\nconst scrollTop = ref(0)\nconst viewportHeight = ref(0)\nconst virtualVersion = ref(0)\n\nfunction buildEstimate(\n rh: number | VirtualRowHeightFn,\n est: VirtualRowHeightFn | undefined,\n rows: FlatRow[],\n): number | ((index: number) => number) {\n if (typeof rh === 'number' && est == null) return rh\n const fallback = typeof rh === 'number' ? rh : 40\n const fn: VirtualRowHeightFn | undefined = est ?? (typeof rh === 'function' ? rh : undefined)\n if (!fn) return fallback\n return (index: number) => {\n const r = rows[index]\n if (!r) return fallback\n const v = fn(r.data, r.id)\n return Number.isFinite(v) && v >= 0 ? v : fallback\n }\n}\n\nfunction ensureVirtualEngine() {\n if (!virtualConfig.value) {\n virtualEngine.value = null\n return\n }\n if (!virtualEngine.value) {\n const eng = createVirtual({\n itemCount: flatRows.value.length,\n itemHeight: buildEstimate(\n virtualConfig.value.rowHeight,\n virtualConfig.value.estimateRowHeight,\n flatRows.value,\n ),\n overscan: virtualConfig.value.overscan,\n })\n eng.subscribe(() => {\n virtualVersion.value++\n })\n virtualEngine.value = eng\n }\n}\n\nwatch(virtualConfig, ensureVirtualEngine, { immediate: true })\n\nwatch(\n [flatRows, virtualConfig],\n () => {\n const eng = virtualEngine.value\n const cfg = virtualConfig.value\n if (!eng || !cfg) return\n eng.setItemCount(flatRows.value.length)\n eng.setItemHeight(buildEstimate(cfg.rowHeight, cfg.estimateRowHeight, flatRows.value))\n // Declarative mode: pre-prime engine with all row heights so totalHeight is accurate.\n if (typeof cfg.rowHeight === 'function') {\n const fn = cfg.rowHeight\n for (let i = 0; i < flatRows.value.length; i++) {\n const r = flatRows.value[i]\n if (!r) continue\n const h = fn(r.data, r.id)\n if (Number.isFinite(h) && h >= 0) eng.setMeasuredHeight(i, Math.round(h))\n }\n }\n },\n { deep: false },\n)\n\nfunction onVirtualScroll(ev: Event) {\n scrollTop.value = (ev.target as HTMLElement).scrollTop\n}\n\nfunction syncViewport() {\n const el = scrollEl.value\n if (!el) return\n viewportHeight.value = el.clientHeight\n scrollTop.value = el.scrollTop\n}\n\nonMounted(() => {\n if (!virtualConfig.value) return\n syncViewport()\n const el = scrollEl.value\n if (!el) return\n const ro = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(syncViewport) : null\n ro?.observe(el)\n onBeforeUnmount(() => ro?.disconnect())\n})\n\ninterface VirtualRange {\n startIndex: number\n endIndex: number\n visibleRows: FlatRow[]\n topPad: number\n bottomPad: number\n}\n\nconst virtualRange = computed<VirtualRange | null>(() => {\n // touch virtualVersion to re-run when engine notifies measurements\n void virtualVersion.value\n const eng = virtualEngine.value\n if (!eng || !virtualConfig.value) return null\n const range = eng.getRange(scrollTop.value, viewportHeight.value || 400)\n const visible = flatRows.value.slice(range.startIndex, range.endIndex + 1)\n let visibleSize = 0\n for (let i = 0; i < visible.length; i++) {\n visibleSize += eng.getItemSize(range.startIndex + i)\n }\n const bottom = Math.max(0, range.totalHeight - range.offsetTop - visibleSize)\n return {\n startIndex: range.startIndex,\n endIndex: range.endIndex,\n visibleRows: visible,\n topPad: range.offsetTop,\n bottomPad: bottom,\n }\n})\n\nconst bodyRows = computed<FlatRow[]>(() =>\n virtualRange.value ? virtualRange.value.visibleRows : flatRows.value,\n)\n\nconst rowIndexOffset = computed(() => (virtualRange.value ? virtualRange.value.startIndex : 0))\n\n/* -------------------------------------------------------------------------- */\n/* Layout classes */\n/* -------------------------------------------------------------------------- */\n\nfunction rowClassFor(row: FlatRow, absIndex: number): string {\n const extra =\n typeof props.rowClassName === 'function'\n ? props.rowClassName(row.data, row.id)\n : (props.rowClassName ?? '')\n const selected = selectedSet.value.has(row.id) ? 'sg-table-row-selected' : ''\n const striped = props.striped && absIndex % 2 === 1 ? 'sg-table-row-striped' : ''\n return ['sg-table-row', 'sg-table-row-clickable', selected, striped, extra, sCls.value.row ?? '']\n .filter(Boolean)\n .join(' ')\n}\n\nfunction handleRowClick(row: FlatRow) {\n emit('rowClick', row.id, row.data)\n}\n\nconst wrapperClass = computed(() => {\n if (props.unstyled) return ''\n return [\n 'sg-table-wrapper',\n `sg-table-${props.size}`,\n props.bordered ? 'sg-table-bordered' : '',\n props.sticky || virtualConfig.value ? 'sg-table-sticky' : '',\n props.loading ? 'sg-table-loading' : '',\n props.striped ? 'sg-table-striped' : '',\n props.highlightOnHover === false ? '' : 'sg-table-hoverable',\n sCls.value.root ?? '',\n ]\n .filter(Boolean)\n .join(' ')\n})\n\nconst scrollClass = computed(() =>\n ['sg-table-scroll', props.scroll?.x ? 'sg-table-scroll-x' : '', sCls.value.scroll]\n .filter(Boolean)\n .join(' '),\n)\n\nconst scrollStyle = computed<Record<string, string | number>>(() => {\n const out: Record<string, string | number> = { ...(sSty.value.scroll ?? {}) }\n if (props.scroll?.x) out.overflowX = 'auto'\n if (virtualConfig.value) {\n out.overflowY = 'auto'\n const h = virtualConfig.value.height ?? props.scroll?.y ?? 400\n out.height = typeof h === 'number' ? `${h}px` : h\n } else if (props.scroll?.y) {\n out.overflowY = 'auto'\n out.maxHeight = typeof props.scroll.y === 'number' ? `${props.scroll.y}px` : props.scroll.y\n }\n return out\n})\n\nconst gridStyle = computed<Record<string, string | number>>(() => {\n const out: Record<string, string | number> = {\n gridTemplateColumns: gridTemplate.value,\n ...(sSty.value.grid ?? {}),\n }\n if (props.scroll?.x) {\n out.minWidth = typeof props.scroll.x === 'number' ? `${props.scroll.x}px` : props.scroll.x\n }\n return out\n})\n\nconst hasToolbar = computed(() => props.searchable || !!slots.toolbar)\n\nconst spacerColumn = computed(() => `1 / ${totalCols.value + 1}`)\n\ndefineExpose({\n table,\n refresh,\n clearAll: () => {\n clearSort()\n clearFilters()\n activeFilters.value.clear()\n internalSearch.value = ''\n },\n})\n</script>\n\n<template>\n <div :class=\"wrapperClass || undefined\" :style=\"sSty.root\">\n <!-- Toolbar -->\n <div\n v-if=\"hasToolbar\"\n :class=\"['sg-table-toolbar', sCls.toolbar].filter(Boolean).join(' ') || undefined\"\n :style=\"sSty.toolbar\"\n >\n <SgInput\n v-if=\"searchable\"\n v-model=\"searchQuery\"\n size=\"small\"\n class=\"sg-table-search-input\"\n :placeholder=\"localeFull.searchPlaceholder\"\n :aria-label=\"localeFull.searchPlaceholder\"\n allow-clear\n :style=\"{ maxWidth: '240px' }\"\n />\n <div class=\"sg-table-toolbar-right\">\n <slot name=\"toolbar\" />\n </div>\n </div>\n\n <!-- Scroll viewport (owns vertical scroll for virtual / scroll.y) -->\n <div\n ref=\"scrollEl\"\n :class=\"scrollClass || undefined\"\n :style=\"scrollStyle\"\n :aria-busy=\"loading || undefined\"\n @scroll=\"onVirtualScroll\"\n >\n <div\n :class=\"['sg-table-grid', sCls.grid].filter(Boolean).join(' ') || undefined\"\n :style=\"gridStyle\"\n role=\"table\"\n >\n <!-- Header rows -->\n <template v-for=\"(headerRow, rowIdx) in headerRows\" :key=\"`hdr-${rowIdx}`\">\n <div\n :class=\"['sg-table-header-row', sCls.headerRow].filter(Boolean).join(' ') || undefined\"\n role=\"row\"\n :style=\"{ display: 'contents', ...(sSty.headerRow ?? {}) }\"\n >\n <!-- Expand placeholder header (first header row) -->\n <div\n v-if=\"rowIdx === 0 && expandable\"\n class=\"sg-table-th sg-table-cell-expand\"\n role=\"columnheader\"\n :style=\"hasColumnGroups ? { gridRow: `span ${headerDepth}` } : {}\"\n />\n <!-- Selection placeholder header (first header row) -->\n <div\n v-if=\"rowIdx === 0 && rowSelection\"\n class=\"sg-table-th sg-table-cell-selection\"\n role=\"columnheader\"\n :style=\"hasColumnGroups ? { gridRow: `span ${headerDepth}` } : {}\"\n >\n <SgCheckbox\n v-if=\"rowSelection.type !== 'radio'\"\n :checked=\"allCurrentPageSelected\"\n :indeterminate=\"someCurrentPageSelected\"\n aria-label=\"Select all\"\n @change=\"toggleSelectAll\"\n />\n </div>\n <template v-for=\"cell in headerRow\" :key=\"`${rowIdx}-${cell.col.key}`\">\n <div\n :class=\"\n [\n 'sg-table-th',\n cell.col.children && cell.col.children.length > 0\n ? 'sg-table-th-group'\n : cell.col.sortable\n ? 'sg-table-th-sortable'\n : '',\n cell.col.fixed ? 'sg-table-cell-fixed' : '',\n cell.col.fixed ? `sg-table-cell-fixed-${cell.col.fixed}` : '',\n sCls.headerCell,\n ]\n .filter(Boolean)\n .join(' ') || undefined\n \"\n :style=\"{\n ...(!(cell.col.children && cell.col.children.length > 0)\n ? fixedStyle(cell.col, true)\n : {}),\n ...(cell.colSpan > 1 ? { gridColumn: `span ${cell.colSpan}` } : {}),\n ...(cell.rowSpan > 1 ? { gridRow: `span ${cell.rowSpan}` } : {}),\n ...(sSty.headerCell ?? {}),\n }\"\n role=\"columnheader\"\n :aria-sort=\"\n currentSort && currentSort.column === cell.col.key\n ? currentSort.direction === 'asc'\n ? 'ascending'\n : 'descending'\n : cell.col.sortable\n ? 'none'\n : undefined\n \"\n @click=\"\n !(cell.col.children && cell.col.children.length > 0) && handleSortClick(cell.col)\n \"\n >\n <span class=\"sg-table-th-content\">\n <span>{{ cell.col.title }}</span>\n <span\n v-if=\"cell.col.sortable && !(cell.col.children && cell.col.children.length > 0)\"\n class=\"sg-table-sort-arrows\"\n >\n <span\n class=\"sg-table-sort-asc\"\n :class=\"{\n 'sg-table-sort-current':\n currentSort &&\n currentSort.column === cell.col.key &&\n currentSort.direction === 'asc',\n }\"\n >{{ localeFull.sortAsc }}</span\n >\n <span\n class=\"sg-table-sort-desc\"\n :class=\"{\n 'sg-table-sort-current':\n currentSort &&\n currentSort.column === cell.col.key &&\n currentSort.direction === 'desc',\n }\"\n >{{ localeFull.sortDesc }}</span\n >\n </span>\n </span>\n\n <!-- preset filters: icon trigger + popup with SgSelect (single-value) -->\n <span\n v-if=\"\n cell.col.filters &&\n cell.col.filters.length > 0 &&\n !slots.filterDropdown &&\n !(cell.col.children && cell.col.children.length > 0)\n \"\n class=\"sg-table-filter-trigger\"\n :class=\"{\n 'sg-table-filter-active':\n activeFilters.get(cell.col.key) &&\n activeFilters.get(cell.col.key)!.length > 0,\n }\"\n role=\"button\"\n :aria-label=\"`Filter ${cell.col.title}`\"\n @click.stop=\"toggleFilterDropdown(cell.col.key)\"\n >▾</span\n >\n <div\n v-if=\"\n cell.col.filters &&\n cell.col.filters.length > 0 &&\n !slots.filterDropdown &&\n !(cell.col.children && cell.col.children.length > 0)\n \"\n v-show=\"openFilterDropdown === cell.col.key\"\n :ref=\"(el) => setFilterDropdownRef(cell.col.key, el as Element | null)\"\n class=\"sg-table-filter-dropdown\"\n @click.stop\n >\n <SgSelect\n size=\"small\"\n class=\"sg-table-filter-select\"\n :placeholder=\"localeFull.filterAll\"\n :options=\"[\n { label: localeFull.filterAll, value: '' },\n ...cell.col.filters.map((f) => ({\n label: String(f.text),\n value: String(f.value),\n })),\n ]\"\n :aria-label=\"`Filter ${cell.col.title}`\"\n @change=\"\n (v) => {\n applyColumnFilter(cell.col, v ? [v] : [])\n closeFilterDropdown()\n }\n \"\n />\n </div>\n\n <!-- custom filter via slot -->\n <span\n v-if=\"\n slots.filterDropdown && !(cell.col.children && cell.col.children.length > 0)\n \"\n class=\"sg-table-filter-trigger\"\n :class=\"{\n 'sg-table-filter-active':\n activeFilters.get(cell.col.key) &&\n activeFilters.get(cell.col.key)!.length > 0,\n }\"\n @click.stop=\"toggleFilterDropdown(cell.col.key)\"\n >▾</span\n >\n <div\n v-if=\"slots.filterDropdown && openFilterDropdown === cell.col.key\"\n :ref=\"(el) => setFilterDropdownRef(cell.col.key, el as Element | null)\"\n class=\"sg-table-filter-dropdown\"\n @click.stop\n >\n <slot\n name=\"filterDropdown\"\n :column=\"cell.col\"\n :selected-keys=\"activeFilters.get(cell.col.key) ?? []\"\n :set-selected-keys=\"(keys: unknown[]) => activeFilters.set(cell.col.key, keys)\"\n :confirm=\"\n () => {\n applyColumnFilter(cell.col, activeFilters.get(cell.col.key) ?? [])\n closeFilterDropdown()\n }\n \"\n :clear-filters=\"\n () => {\n applyColumnFilter(cell.col, [])\n closeFilterDropdown()\n }\n \"\n :close=\"closeFilterDropdown\"\n />\n </div>\n\n <div\n v-if=\"cell.col.resizable && !(cell.col.children && cell.col.children.length > 0)\"\n class=\"sg-table-resize-handle\"\n @click.stop\n @mousedown=\"(ev) => onResizeStart(cell.col, ev)\"\n />\n </div>\n </template>\n </div>\n </template>\n\n <!-- Empty state -->\n <div\n v-if=\"flatRows.length === 0\"\n class=\"sg-table-row sg-table-row-empty\"\n role=\"row\"\n style=\"display: contents\"\n >\n <div\n :class=\"\n ['sg-table-td', 'sg-table-empty', sCls.empty].filter(Boolean).join(' ') || undefined\n \"\n :style=\"{ gridColumn: spacerColumn, ...(sSty.empty ?? {}) }\"\n role=\"cell\"\n >\n <slot name=\"empty\">{{ localeFull.emptyText }}</slot>\n </div>\n </div>\n\n <!-- Virtual top spacer -->\n <div\n v-if=\"virtualRange && virtualRange.topPad > 0\"\n :style=\"{ gridColumn: spacerColumn, height: `${virtualRange.topPad}px` }\"\n role=\"presentation\"\n aria-hidden=\"true\"\n />\n\n <!-- Body rows -->\n <template v-for=\"(row, localIdx) in bodyRows\" :key=\"String(row.id)\">\n <div\n :class=\"rowClassFor(row, rowIndexOffset + localIdx) || undefined\"\n role=\"row\"\n :data-sg-virtual-row-index=\"virtualRange ? rowIndexOffset + localIdx : undefined\"\n style=\"display: contents\"\n @click=\"handleRowClick(row)\"\n >\n <!-- Expand cell -->\n <div v-if=\"expandable\" class=\"sg-table-td sg-table-cell-expand\" role=\"cell\" @click.stop>\n <button\n v-if=\"isRowExpandable(row.data)\"\n type=\"button\"\n class=\"sg-table-expand-btn\"\n :class=\"{ 'sg-table-expand-open': expandedSet.has(row.id) }\"\n :aria-expanded=\"expandedSet.has(row.id)\"\n :aria-label=\"expandedSet.has(row.id) ? 'Collapse row' : 'Expand row'\"\n @click=\"toggleExpand(row.id)\"\n >\n {{ localeFull.expandIcon }}\n </button>\n </div>\n\n <!-- Selection cell -->\n <div\n v-if=\"rowSelection\"\n class=\"sg-table-td sg-table-cell-selection\"\n role=\"cell\"\n @click.stop\n >\n <SgCheckbox\n v-if=\"rowSelection.type !== 'radio'\"\n :checked=\"selectedSet.has(row.id)\"\n :aria-label=\"`Select row ${String(row.id)}`\"\n @change=\"() => toggleRowSelected(row.id)\"\n />\n <input\n v-else\n type=\"radio\"\n class=\"sg-table-row-radio\"\n :checked=\"selectedSet.has(row.id)\"\n name=\"sg-table-row-radio\"\n :aria-label=\"`Select row ${String(row.id)}`\"\n @change=\"() => toggleRowSelected(row.id)\"\n />\n </div>\n\n <!-- Data cells -->\n <div\n v-for=\"(col, cIdx) in columns\"\n :key=\"col.key\"\n :class=\"\n [\n 'sg-table-td',\n col.fixed ? 'sg-table-cell-fixed' : '',\n col.fixed ? `sg-table-cell-fixed-${col.fixed}` : '',\n col.editable ? 'sg-table-td-editable' : '',\n sCls.bodyCell,\n ]\n .filter(Boolean)\n .join(' ') || undefined\n \"\n :style=\"{\n ...fixedStyle(col),\n ...(cIdx === 0 && tree && row.depth > 0\n ? { paddingLeft: `${row.depth * treeIndent + 8}px` }\n : {}),\n ...(sSty.bodyCell ?? {}),\n }\"\n role=\"cell\"\n @dblclick=\"\n col.editable && onCellEdit ? startEdit(row.id, col.key, row.data[col.key]) : null\n \"\n >\n <!-- Tree expand toggle (first data column only) -->\n <button\n v-if=\"cIdx === 0 && tree && row.hasChildren\"\n type=\"button\"\n class=\"sg-table-expand-btn\"\n :class=\"{ 'sg-table-expand-open': treeExpanded.has(row.id) }\"\n :aria-label=\"treeExpanded.has(row.id) ? 'Collapse' : 'Expand'\"\n @click.stop=\"toggleTreeRow(row.id)\"\n >\n {{ localeFull.expandIcon }}\n </button>\n\n <span\n v-if=\"editingCell && editingCell.id === row.id && editingCell.key === col.key\"\n class=\"sg-table-cell-content\"\n @click.stop\n >\n <input\n v-model=\"editingValue\"\n class=\"sg-table-edit-input\"\n @keydown.enter=\"commitEdit\"\n @keydown.esc=\"cancelEdit\"\n @blur=\"commitEdit\"\n />\n </span>\n <span v-else class=\"sg-table-cell-content\">\n <slot\n name=\"cell\"\n :column=\"col\"\n :row=\"row.data\"\n :id=\"row.id\"\n :value=\"row.data[col.key]\"\n >\n {{ row.data[col.key] }}\n </slot>\n </span>\n </div>\n </div>\n\n <!-- Expanded row body -->\n <div\n v-if=\"expandable && expandedSet.has(row.id)\"\n class=\"sg-table-row sg-table-row-expanded-wrapper\"\n role=\"row\"\n style=\"display: contents\"\n >\n <div\n class=\"sg-table-td sg-table-expanded-row\"\n :style=\"{ gridColumn: spacerColumn }\"\n role=\"cell\"\n >\n <slot name=\"expandedRow\" :row=\"row.data\" :id=\"row.id\">\n <component :is=\"expandable.expandedRowRender(row.data, row.id) as any\" />\n </slot>\n </div>\n </div>\n </template>\n\n <!-- Virtual bottom spacer -->\n <div\n v-if=\"virtualRange && virtualRange.bottomPad > 0\"\n :style=\"{ gridColumn: spacerColumn, height: `${virtualRange.bottomPad}px` }\"\n role=\"presentation\"\n aria-hidden=\"true\"\n />\n\n <!-- Footer (column aggregates) -->\n <div\n v-if=\"footer && visibleRows.length > 0\"\n :class=\"['sg-table-footer-row', sCls.footer].filter(Boolean).join(' ') || undefined\"\n role=\"row\"\n :style=\"{ display: 'contents', ...(sSty.footer ?? {}) }\"\n >\n <div v-if=\"expandable\" class=\"sg-table-td sg-table-footer-cell\" role=\"cell\" />\n <div v-if=\"rowSelection\" class=\"sg-table-td sg-table-footer-cell\" role=\"cell\" />\n <div\n v-for=\"col in columns\"\n :key=\"`f-${col.key}`\"\n class=\"sg-table-td sg-table-footer-cell\"\n role=\"cell\"\n :style=\"fixedStyle(col)\"\n >\n <span v-if=\"col.aggregate\" class=\"sg-table-aggregate-value\">{{\n aggregateValue(col)\n }}</span>\n </div>\n </div>\n\n <!-- Summary rows (custom) -->\n <template v-for=\"(srow, srIdx) in summaryRows\" :key=\"`sum-${srIdx}`\">\n <div class=\"sg-table-summary-row\" role=\"row\" style=\"display: contents\">\n <div v-if=\"expandable\" class=\"sg-table-td sg-table-summary-cell\" role=\"cell\" />\n <div v-if=\"rowSelection\" class=\"sg-table-td sg-table-summary-cell\" role=\"cell\" />\n <div\n v-for=\"(scell, sIdx) in srow\"\n :key=\"`sc-${srIdx}-${sIdx}`\"\n class=\"sg-table-td sg-table-summary-cell\"\n role=\"cell\"\n :style=\"{\n ...(scell.colSpan && scell.colSpan > 1\n ? { gridColumn: `span ${scell.colSpan}` }\n : {}),\n ...(scell.align ? { textAlign: scell.align } : {}),\n }\"\n >\n <component\n :is=\"scell.content as any\"\n v-if=\"scell.content && typeof scell.content === 'object'\"\n />\n <template v-else>{{ scell.content }}</template>\n </div>\n </div>\n </template>\n </div>\n </div>\n\n <!-- Loading overlay -->\n <div v-if=\"loading && !unstyled\" class=\"sg-table-loading-mask\" role=\"status\" aria-live=\"polite\">\n <SgSpin size=\"large\" :aria-label=\"localeFull.loadingText\" />\n </div>\n\n <!-- Pagination -->\n <div\n v-if=\"showPagination && totalPages > 1 && !virtualConfig\"\n :class=\"['sg-table-pagination', sCls.pagination].filter(Boolean).join(' ') || undefined\"\n :style=\"sSty.pagination\"\n >\n <span class=\"sg-table-pagination-total\">\n {{ localeFull.totalRows(tableState.totalRows) }}\n </span>\n <SgPagination\n class=\"sg-table-pagination-controls\"\n :current=\"tableState.page\"\n :total=\"tableState.totalRows\"\n :page-size=\"pageSize ?? tableState.totalRows\"\n @change=\"gotoPage\"\n />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch, nextTick } from 'vue'\nimport type { TreeKey, TreeNodeData, TreeLocale, TreeNodeAction, TreeNodeStatus } from './types'\n\ninterface TreeNodeRowProps {\n node: TreeNodeData\n nodeKey: TreeKey\n depth: number\n isLeaf: boolean\n indentSize: number\n\n expanded: boolean\n checked: boolean\n halfChecked: boolean\n selected: boolean\n loading: boolean\n disabled: boolean\n focused: boolean\n\n checkable: boolean\n selectable: boolean\n blockNode: boolean\n directory: boolean\n animated: boolean\n\n draggable: boolean\n dropPosition: -1 | 0 | 1 | null\n dragKey: TreeKey | null\n\n searchValue: string\n\n t: Required<TreeLocale>\n\n status?: TreeNodeStatus\n actions?: TreeNodeAction[]\n editable?: boolean\n\n unstyled?: boolean\n}\n\nconst props = defineProps<TreeNodeRowProps>()\n\nconst emit = defineEmits<{\n (e: 'expand', key: TreeKey): void\n (e: 'check', key: TreeKey): void\n (e: 'select', key: TreeKey): void\n (e: 'dragStart', evt: DragEvent, key: TreeKey): void\n (e: 'dragOver', evt: DragEvent, key: TreeKey): void\n (e: 'dragLeave', evt: DragEvent, key: TreeKey): void\n (e: 'dragEnd', evt: DragEvent, key: TreeKey): void\n (e: 'drop', evt: DragEvent, key: TreeKey): void\n (e: 'rightClick', evt: MouseEvent, node: TreeNodeData): void\n (e: 'loadData', node: TreeNodeData): void\n (e: 'focusNode', key: TreeKey | null): void\n (e: 'edit', key: TreeKey, value: string, oldValue: string): void\n (e: 'editCancel', key: TreeKey): void\n}>()\n\nconst rowEl = ref<HTMLDivElement | null>(null)\n\nwatch(\n () => props.focused,\n async (f) => {\n if (f && rowEl.value) {\n await nextTick()\n rowEl.value.scrollIntoView?.({ block: 'nearest' })\n }\n },\n)\n\nfunction handleSwitcherClick(e: MouseEvent) {\n e.stopPropagation()\n if (props.isLeaf) return\n if (!props.expanded && props.loading) return\n emit('expand', props.nodeKey)\n if (!props.expanded && !props.isLeaf) {\n emit('loadData', props.node)\n }\n}\n\nfunction handleCheckChange(e: Event) {\n e.stopPropagation()\n if (props.disabled || props.node.disableCheckbox) return\n emit('check', props.nodeKey)\n}\n\nfunction handleSelect() {\n if (props.disabled || props.node.selectable === false) return\n if (!props.selectable) return\n emit('select', props.nodeKey)\n if (props.directory && !props.isLeaf) {\n emit('expand', props.nodeKey)\n }\n}\n\nfunction handleClick() {\n emit('focusNode', props.nodeKey)\n handleSelect()\n}\n\nfunction handleContextMenu(e: MouseEvent) {\n e.preventDefault()\n emit('rightClick', e, props.node)\n}\n\nconst titleText = computed(() => String(props.node.title ?? props.nodeKey))\n\nconst highlight = computed<{ before: string; match: string; after: string } | null>(() => {\n const sv = props.searchValue\n if (!sv) return null\n const text = titleText.value\n const idx = text.toLowerCase().indexOf(sv.toLowerCase())\n if (idx === -1) return null\n return {\n before: text.slice(0, idx),\n match: text.slice(idx, idx + sv.length),\n after: text.slice(idx + sv.length),\n }\n})\n\nconst isDragging = computed(() => props.dragKey === props.nodeKey)\nconst isEditing = ref(false)\nconst editInput = ref<HTMLInputElement | null>(null)\nconst editingText = ref('')\n\nconst visibleActions = computed(() =>\n (props.actions ?? []).filter((a) => (a.visible ? a.visible(props.node) : true)),\n)\nconst statusClass = computed(() =>\n props.status && props.status !== 'default' ? `sg-tree-node-status-${props.status}` : '',\n)\n\nconst rowClass = computed(() => {\n if (props.unstyled) return ''\n return [\n 'sg-tree-node',\n props.selected ? 'sg-tree-node-selected' : '',\n props.disabled ? 'sg-tree-node-disabled' : '',\n props.isLeaf ? 'sg-tree-node-leaf' : '',\n props.expanded ? 'sg-tree-node-expanded' : '',\n props.draggable ? 'sg-tree-node-draggable' : '',\n isDragging.value ? 'sg-tree-node-dragging' : '',\n props.dropPosition === 0 ? 'sg-tree-node-drop-inner' : '',\n props.dropPosition === -1 ? 'sg-tree-node-drop-before' : '',\n props.dropPosition === 1 ? 'sg-tree-node-drop-after' : '',\n props.blockNode ? 'sg-tree-node-block' : '',\n props.directory ? 'sg-tree-node-directory' : '',\n props.focused ? 'sg-tree-node-focused' : '',\n isEditing.value ? 'sg-tree-node-editing' : '',\n statusClass.value,\n ]\n .filter(Boolean)\n .join(' ')\n})\n\nfunction startEdit() {\n if (!props.editable || props.disabled) return\n editingText.value = titleText.value\n isEditing.value = true\n nextTick(() => {\n editInput.value?.focus()\n editInput.value?.select()\n })\n}\n\nfunction commitEdit() {\n if (!isEditing.value) return\n const next = editingText.value.trim()\n const prev = titleText.value\n isEditing.value = false\n if (next && next !== prev) {\n emit('edit', props.nodeKey, next, prev)\n }\n}\n\nfunction cancelEdit() {\n if (!isEditing.value) return\n isEditing.value = false\n emit('editCancel', props.nodeKey)\n}\n\nfunction handleEditKey(e: KeyboardEvent) {\n if (e.key === 'Enter') {\n e.preventDefault()\n commitEdit()\n } else if (e.key === 'Escape') {\n e.preventDefault()\n cancelEdit()\n }\n}\n\nfunction actionDisabled(action: TreeNodeAction): boolean {\n if (typeof action.disabled === 'function') return !!action.disabled(props.node)\n return !!action.disabled\n}\n\nfunction handleActionClick(e: MouseEvent, action: TreeNodeAction) {\n e.stopPropagation()\n if (actionDisabled(action)) return\n action.onClick(props.node, props.nodeKey)\n}\n\nfunction onDragStart(e: DragEvent) {\n if (!props.draggable) return\n emit('dragStart', e, props.nodeKey)\n}\n\nfunction onDragOver(e: DragEvent) {\n if (!props.draggable) return\n e.preventDefault()\n emit('dragOver', e, props.nodeKey)\n}\n\nfunction onDragLeave(e: DragEvent) {\n if (!props.draggable) return\n emit('dragLeave', e, props.nodeKey)\n}\n\nfunction onDragEnd(e: DragEvent) {\n if (!props.draggable) return\n emit('dragEnd', e, props.nodeKey)\n}\n\nfunction onDrop(e: DragEvent) {\n if (!props.draggable) return\n e.preventDefault()\n emit('drop', e, props.nodeKey)\n}\n\nconst ariaExpanded = computed<boolean | undefined>(() =>\n props.isLeaf ? undefined : props.expanded,\n)\nconst ariaChecked = computed<boolean | undefined>(() =>\n props.checkable ? props.checked : undefined,\n)\n\nconst indentPx = computed(() => `${props.depth * props.indentSize}px`)\n</script>\n\n<template>\n <div\n ref=\"rowEl\"\n :class=\"rowClass || undefined\"\n :style=\"{ paddingLeft: indentPx }\"\n role=\"treeitem\"\n :aria-expanded=\"ariaExpanded\"\n :aria-selected=\"selected\"\n :aria-checked=\"ariaChecked\"\n :aria-level=\"depth + 1\"\n :data-key=\"nodeKey\"\n :draggable=\"draggable\"\n @dragstart=\"onDragStart\"\n @dragover=\"onDragOver\"\n @dragleave=\"onDragLeave\"\n @dragend=\"onDragEnd\"\n @drop=\"onDrop\"\n @contextmenu=\"handleContextMenu\"\n @click=\"handleClick\"\n >\n <span\n v-if=\"!isLeaf\"\n :class=\"\n [\n 'sg-tree-switcher',\n expanded ? 'sg-tree-switcher-open' : 'sg-tree-switcher-close',\n loading ? 'sg-tree-switcher-loading' : '',\n ]\n .filter(Boolean)\n .join(' ')\n \"\n @click=\"handleSwitcherClick\"\n >\n <svg\n v-if=\"!loading\"\n :class=\"\n ['sg-tree-switcher-arrow', expanded ? 'sg-tree-switcher-arrow-open' : '']\n .filter(Boolean)\n .join(' ')\n \"\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n >\n <path\n d=\"M3 2L7 5L3 8\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n <span v-else class=\"sg-spin sg-spin-small\" aria-hidden=\"true\" />\n </span>\n <span v-else class=\"sg-tree-switcher sg-tree-switcher-noop\" />\n\n <input\n v-if=\"checkable && node.checkable !== false\"\n type=\"checkbox\"\n class=\"sg-tree-checkbox sg-checkbox-input\"\n :checked=\"checked\"\n :disabled=\"disabled || node.disableCheckbox\"\n :data-indeterminate=\"halfChecked || undefined\"\n @click.stop\n @change=\"handleCheckChange\"\n />\n\n <span v-if=\"directory\" class=\"sg-tree-icon\">{{ expanded ? '📂' : '📁' }}</span>\n\n <span\n v-if=\"!isEditing\"\n :class=\"\n ['sg-tree-title', selectable ? 'sg-tree-title-selectable' : ''].filter(Boolean).join(' ')\n \"\n @dblclick=\"startEdit\"\n >\n <template v-if=\"highlight\">\n {{ highlight.before }}<span class=\"sg-tree-highlight\">{{ highlight.match }}</span\n >{{ highlight.after }}\n </template>\n <template v-else>{{ titleText }}</template>\n </span>\n <input\n v-else\n ref=\"editInput\"\n v-model=\"editingText\"\n class=\"sg-tree-edit-input\"\n type=\"text\"\n @click.stop\n @keydown.stop=\"handleEditKey\"\n @blur=\"commitEdit\"\n />\n\n <span v-if=\"visibleActions.length > 0\" class=\"sg-tree-actions\" @click.stop>\n <button\n v-for=\"action in visibleActions\"\n :key=\"action.key\"\n type=\"button\"\n :class=\"\n [\n 'sg-tree-action-btn',\n action.danger ? 'sg-tree-action-danger' : '',\n actionDisabled(action) ? 'sg-tree-action-disabled' : '',\n ]\n .filter(Boolean)\n .join(' ')\n \"\n :title=\"action.title\"\n :aria-label=\"action.title\"\n :disabled=\"actionDisabled(action)\"\n @click=\"handleActionClick($event, action)\"\n >\n {{ action.icon }}\n </button>\n </span>\n </div>\n</template>\n","import type { TreeKey, TreeNodeData, TreeFieldNames } from '@skygraph/core'\n\nexport type { TreeKey, TreeNodeData, TreeFieldNames }\n\nexport interface CheckInfo {\n checked: boolean\n node: TreeNodeData\n checkedNodes: TreeNodeData[]\n halfCheckedKeys: TreeKey[]\n}\n\nexport interface SelectInfo {\n selected: boolean\n node: TreeNodeData\n selectedNodes: TreeNodeData[]\n}\n\nexport interface ExpandInfo {\n expanded: boolean\n node: TreeNodeData\n}\n\nexport interface DragInfo {\n event: DragEvent\n node: TreeNodeData\n}\n\nexport interface DropInfo {\n event: DragEvent\n node: TreeNodeData\n dragNode: TreeNodeData\n dropPosition: -1 | 0 | 1\n}\n\nexport interface EditInfo {\n key: TreeKey\n node: TreeNodeData\n value: string\n oldValue: string\n}\n\nexport type TreeNodeStatus = 'default' | 'success' | 'warning' | 'error' | 'info'\n\nexport interface TreeNodeAction {\n /** Action identifier (also a Vue list key). */\n key: string\n /** Button icon (string or VNode-compatible render). */\n icon?: string\n /** Tooltip / aria-label text. */\n title?: string\n /** Click handler receiving the node and key. */\n onClick: (node: TreeNodeData, key: TreeKey) => void\n /** Hides the action for nodes where this returns false. */\n visible?: (node: TreeNodeData) => boolean\n /** Disables the action per node (boolean or predicate). */\n disabled?: boolean | ((node: TreeNodeData) => boolean)\n /** Destructive styling. */\n danger?: boolean\n}\n\nexport interface TreeLocale {\n emptyText?: string\n loadingText?: string\n searchPlaceholder?: string\n expandAllText?: string\n collapseAllText?: string\n checkAllText?: string\n uncheckAllText?: string\n}\n\nexport const DEFAULT_TREE_LOCALE: Required<TreeLocale> = {\n emptyText: 'No data',\n loadingText: 'Loading...',\n searchPlaceholder: 'Search...',\n expandAllText: 'Expand All',\n collapseAllText: 'Collapse All',\n checkAllText: 'Check All',\n uncheckAllText: 'Uncheck All',\n}\n\nexport const DEFAULT_INDENT = 24\nexport const NODE_HEIGHT = 28\n\nexport interface TreeProps {\n /** Hierarchical data with keys and optional children. */\n treeData: TreeNodeData[]\n /** Renames `title`, `key`, `children`, and other field accessors. */\n fieldNames?: TreeFieldNames\n\n /** Shows checkboxes on nodes. @default false */\n checkable?: boolean\n /** When true, parent and child checks are independent. @default false */\n checkStrictly?: boolean\n /** Controlled checked keys. */\n checkedKeys?: TreeKey[]\n /** Initial checked keys in uncontrolled mode. */\n defaultCheckedKeys?: TreeKey[]\n\n /** Allows clicking titles to select nodes. @default true */\n selectable?: boolean\n /** Allows multiple selected nodes. @default false */\n multiple?: boolean\n /** Controlled selected keys. */\n selectedKeys?: TreeKey[]\n /** Initial selected keys in uncontrolled mode. */\n defaultSelectedKeys?: TreeKey[]\n\n /** Controlled expanded keys. */\n expandedKeys?: TreeKey[]\n /** Initial expanded keys in uncontrolled mode. */\n defaultExpandedKeys?: TreeKey[]\n /** Expands every parent on first render when uncontrolled. @default false */\n defaultExpandAll?: boolean\n /** Expands ancestors of the focused or matched node when filtering. @default false */\n autoExpandParent?: boolean\n\n /** Enables drag handles per node or per node predicate. @default false */\n draggable?: boolean | ((node: TreeNodeData) => boolean)\n /** Validates whether a drop is allowed. */\n allowDrop?: (info: {\n dragNode: TreeNodeData\n dropNode: TreeNodeData\n dropPosition: -1 | 0 | 1\n }) => boolean\n\n /** Loads children asynchronously. */\n loadData?: (node: TreeNodeData) => Promise<void>\n\n /** Makes the whole row clickable for selection. @default false */\n blockNode?: boolean\n /** Fixed viewport height enabling internal virtual scroll. */\n height?: number\n /** Uses windowed rendering when `height` is set and the list is large. @default true */\n virtual?: boolean\n /** Disables all interactions. @default false */\n disabled?: boolean\n /** Horizontal indent per depth level in pixels. @default 24 */\n indentSize?: number\n\n /** Directory-style selection expands folders on click. @default false */\n directory?: boolean\n\n /** Shows the toolbar search field. @default false */\n showSearch?: boolean\n /** Controlled filter text. */\n searchValue?: string\n /** Initial filter text when uncontrolled. @default '' */\n defaultSearchValue?: string\n /** Predicate to include nodes while searching. */\n filterTreeNode?: (node: TreeNodeData, searchValue: string) => boolean\n /** Highlights matched text in titles. @default true */\n highlightSearch?: boolean\n\n /** Enables built-in keyboard navigation helpers. @default true */\n keyboard?: boolean\n\n /** Shows toolbar with expand/collapse/check-all controls. @default false */\n showToolbar?: boolean\n /** Enables expand/collapse animations. @default true */\n animated?: boolean\n\n /** Focuses a node on mount when supported. @default false */\n autoFocus?: boolean\n\n /** Scrolls the given key into view when it changes. */\n scrollToKey?: TreeKey\n\n /** Overrides default locale strings. */\n locale?: TreeLocale\n\n /** Renders semantic tree without Skygraph styles. */\n unstyled?: boolean\n\n /** Maps a node to a status color variant (paints status dot + left border). */\n nodeStatus?: (node: TreeNodeData) => TreeNodeStatus\n /** Inline action buttons on node rows, rendered on hover. */\n actions?: TreeNodeAction[]\n /** Enables inline title editing per node or predicate. @default false */\n editable?: boolean | ((node: TreeNodeData) => boolean)\n /** Renders guide lines between levels. @default false */\n showLine?: boolean\n}\n","<script setup lang=\"ts\">\nimport { computed, ref, watch, onMounted, useTemplateRef } from 'vue'\nimport { useTree } from '../../../composables/useTree'\nimport TreeNodeRow from './TreeNodeRow.vue'\nimport {\n DEFAULT_INDENT,\n DEFAULT_TREE_LOCALE,\n NODE_HEIGHT,\n type TreeProps,\n type TreeKey,\n type TreeNodeData,\n type ExpandInfo,\n type CheckInfo,\n type SelectInfo,\n type DragInfo,\n type DropInfo,\n} from './types'\n\nconst props = withDefaults(defineProps<TreeProps>(), {\n checkable: false,\n checkStrictly: false,\n selectable: true,\n multiple: false,\n defaultExpandAll: false,\n autoExpandParent: false,\n draggable: false,\n blockNode: false,\n virtual: true,\n disabled: false,\n indentSize: DEFAULT_INDENT,\n directory: false,\n showSearch: false,\n defaultSearchValue: '',\n highlightSearch: true,\n keyboard: true,\n showToolbar: false,\n animated: true,\n autoFocus: false,\n unstyled: false,\n})\n\nconst emit = defineEmits<{\n (e: 'check', keys: TreeKey[], info: CheckInfo): void\n (e: 'select', keys: TreeKey[], info: SelectInfo): void\n (e: 'expand', keys: TreeKey[], info: ExpandInfo): void\n (e: 'search', value: string): void\n (e: 'dragStart', info: DragInfo): void\n (e: 'dragOver', info: DragInfo): void\n (e: 'dragLeave', info: DragInfo): void\n (e: 'dragEnd', info: DragInfo): void\n (e: 'drop', info: DropInfo): void\n (e: 'rightClick', info: { event: MouseEvent; node: TreeNodeData }): void\n (e: 'focus', key: TreeKey): void\n (e: 'update:expandedKeys', keys: TreeKey[]): void\n (e: 'update:checkedKeys', keys: TreeKey[]): void\n (e: 'update:selectedKeys', keys: TreeKey[]): void\n (e: 'update:searchValue', value: string): void\n (e: 'edit', info: import('./types').EditInfo): void\n (e: 'editCancel', key: TreeKey): void\n}>()\n\nconst localeFull = computed(() => ({ ...DEFAULT_TREE_LOCALE, ...props.locale }))\n\nconst {\n tree,\n treeState,\n flatNodes,\n toggleExpand,\n setExpandedKeys,\n expandAll,\n collapseAll,\n toggleCheck,\n setCheckedKeys,\n select: selectKey,\n setSelectedKeys,\n markLoading,\n markLoaded,\n moveNode,\n filterNodes,\n refresh,\n} = useTree({\n data: props.treeData,\n fieldNames: props.fieldNames,\n checkStrictly: props.checkStrictly,\n defaultExpandAll: props.defaultExpandAll,\n defaultExpandedKeys: props.defaultExpandedKeys,\n defaultCheckedKeys: props.defaultCheckedKeys,\n defaultSelectedKeys: props.defaultSelectedKeys,\n})\n\n// Keep tree data in sync with prop changes\nwatch(\n () => props.treeData,\n (next, prev) => {\n if (next === prev) return\n tree.setData(next)\n refresh()\n },\n)\n\nwatch(\n () => props.expandedKeys,\n (next) => {\n if (next !== undefined) setExpandedKeys(next)\n },\n)\nwatch(\n () => props.checkedKeys,\n (next) => {\n if (next !== undefined) setCheckedKeys(next)\n },\n)\nwatch(\n () => props.selectedKeys,\n (next) => {\n if (next !== undefined) setSelectedKeys(next)\n },\n)\n\nconst internalSearchValue = ref(props.defaultSearchValue)\nconst searchValue = computed(() => props.searchValue ?? internalSearchValue.value)\n\nfunction applySearch(value: string) {\n if (props.searchValue === undefined) {\n internalSearchValue.value = value\n }\n emit('search', value)\n emit('update:searchValue', value)\n\n if (!value) {\n filterNodes(null)\n return\n }\n const predicate = props.filterTreeNode\n ? (node: TreeNodeData) => props.filterTreeNode!(node, value)\n : (node: TreeNodeData) => {\n const title = String(node.title ?? '')\n return title.toLowerCase().includes(value.toLowerCase())\n }\n filterNodes(predicate)\n\n if (props.autoExpandParent) {\n const filtered = tree.getFilteredKeys()\n if (filtered) setExpandedKeys(filtered)\n }\n}\n\nwatch(\n () => props.searchValue,\n (next) => {\n if (next !== undefined && next !== internalSearchValue.value) {\n applySearch(next)\n }\n },\n)\n\nconst focusedKeyInternal = ref<TreeKey | null>(null)\nconst focusedKey = computed(() => focusedKeyInternal.value)\n\nfunction setFocusedKey(key: TreeKey | null) {\n focusedKeyInternal.value = key\n if (key !== null) emit('focus', key)\n}\n\nonMounted(() => {\n if (props.autoFocus && flatNodes.value.length > 0 && focusedKeyInternal.value === null) {\n setFocusedKey(flatNodes.value[0].key)\n }\n})\n\nconst dragKey = ref<TreeKey | null>(null)\nconst dropKey = ref<TreeKey | null>(null)\nconst dropPosition = ref<-1 | 0 | 1>(0)\n\nfunction handleExpand(key: TreeKey) {\n toggleExpand(key)\n const node = tree.getNode(key)\n if (!node) return\n const newKeys = tree.getState().expandedKeys\n emit('expand', newKeys, { expanded: newKeys.includes(key), node })\n emit('update:expandedKeys', newKeys)\n}\n\nfunction handleCheck(key: TreeKey) {\n toggleCheck(key)\n const node = tree.getNode(key)\n if (!node) return\n const state = tree.getState()\n const checkedNodes = state.checkedKeys\n .map((ck) => tree.getNode(ck))\n .filter(Boolean) as TreeNodeData[]\n emit('check', state.checkedKeys, {\n checked: state.checkedKeys.includes(key),\n node,\n checkedNodes,\n halfCheckedKeys: state.halfCheckedKeys,\n })\n emit('update:checkedKeys', state.checkedKeys)\n}\n\nfunction handleSelect(key: TreeKey) {\n selectKey(key, props.multiple)\n const node = tree.getNode(key)\n if (!node) return\n const state = tree.getState()\n const selectedNodes = state.selectedKeys\n .map((sk) => tree.getNode(sk))\n .filter(Boolean) as TreeNodeData[]\n emit('select', state.selectedKeys, {\n selected: state.selectedKeys.includes(key),\n node,\n selectedNodes,\n })\n emit('update:selectedKeys', state.selectedKeys)\n}\n\nfunction handleLoadData(node: TreeNodeData) {\n if (!props.loadData) return\n const key = node.key\n if (treeState.value.loadedKeys.includes(key) || treeState.value.loadingKeys.includes(key)) return\n markLoading(key)\n void props.loadData(node).then(() => {\n markLoaded(key)\n })\n}\n\nfunction handleDragStart(e: DragEvent, key: TreeKey) {\n dragKey.value = key\n if (e.dataTransfer) e.dataTransfer.effectAllowed = 'move'\n const node = tree.getNode(key)\n if (node) emit('dragStart', { event: e, node })\n}\n\nfunction handleDragOver(e: DragEvent, key: TreeKey) {\n e.preventDefault()\n dropKey.value = key\n const target = e.currentTarget as HTMLElement\n const rect = target.getBoundingClientRect()\n const y = e.clientY - rect.top\n const h = rect.height\n let pos: -1 | 0 | 1 = 0\n if (y < h * 0.25) pos = -1\n else if (y > h * 0.75) pos = 1\n dropPosition.value = pos\n const node = tree.getNode(key)\n if (node) emit('dragOver', { event: e, node })\n}\n\nfunction handleDragLeave(e: DragEvent, key: TreeKey) {\n dropKey.value = null\n const node = tree.getNode(key)\n if (node) emit('dragLeave', { event: e, node })\n}\n\nfunction handleDragEnd(e: DragEvent, key: TreeKey) {\n dragKey.value = null\n dropKey.value = null\n const node = tree.getNode(key)\n if (node) emit('dragEnd', { event: e, node })\n}\n\nfunction handleDrop(e: DragEvent, key: TreeKey) {\n e.preventDefault()\n if (dragKey.value === null || dragKey.value === key) {\n dragKey.value = null\n dropKey.value = null\n return\n }\n const dragNode = tree.getNode(dragKey.value)\n const dropNode = tree.getNode(key)\n if (!dragNode || !dropNode) return\n\n if (\n props.allowDrop &&\n !props.allowDrop({ dragNode, dropNode, dropPosition: dropPosition.value })\n ) {\n dragKey.value = null\n dropKey.value = null\n return\n }\n\n moveNode(dragKey.value, key, dropPosition.value)\n emit('drop', { event: e, node: dropNode, dragNode, dropPosition: dropPosition.value })\n\n dragKey.value = null\n dropKey.value = null\n}\n\nfunction handleRightClick(evt: MouseEvent, node: TreeNodeData) {\n emit('rightClick', { event: evt, node })\n}\n\nfunction isDraggable(node: TreeNodeData): boolean {\n if (typeof props.draggable === 'function') return props.draggable(node)\n return !!props.draggable\n}\n\nfunction isEditable(node: TreeNodeData): boolean {\n if (typeof props.editable === 'function') return props.editable(node)\n return !!props.editable\n}\n\nfunction nodeStatusFor(node: TreeNodeData): import('./types').TreeNodeStatus | undefined {\n return props.nodeStatus ? props.nodeStatus(node) : undefined\n}\n\nfunction handleEdit(key: TreeKey, value: string, oldValue: string) {\n const node = tree.getNode(key)\n if (!node) return\n emit('edit', { key, node, value, oldValue })\n}\n\nfunction handleEditCancel(key: TreeKey) {\n emit('editCancel', key)\n}\n\nconst containerRef = useTemplateRef<HTMLDivElement>('containerEl')\nconst treeRef = useTemplateRef<HTMLDivElement>('treeEl')\nconst scrollTop = ref(0)\nconst itemHeight = NODE_HEIGHT\n\nfunction scrollToFocused(key: TreeKey) {\n const index = flatNodes.value.findIndex((item) => item.key === key)\n if (index === -1) return\n const el = containerRef.value ?? treeRef.value\n if (!el) return\n const targetTop = index * itemHeight\n const { scrollTop: st, clientHeight: ch } = el\n if (targetTop < st) {\n el.scrollTop = targetTop\n } else if (targetTop + itemHeight > st + ch) {\n el.scrollTop = targetTop + itemHeight - ch\n }\n}\n\nfunction focusNode(index: number) {\n if (index >= 0 && index < flatNodes.value.length) {\n const key = flatNodes.value[index].key\n setFocusedKey(key)\n scrollToFocused(key)\n }\n}\n\nfunction handleKeyDown(e: KeyboardEvent) {\n if (!props.keyboard || props.disabled) return\n const flat = flatNodes.value\n const currentIndex = flat.findIndex((item) => item.key === focusedKey.value)\n if (currentIndex === -1 && flat.length === 0) return\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n focusNode(currentIndex === -1 ? 0 : Math.min(currentIndex + 1, flat.length - 1))\n break\n case 'ArrowUp':\n e.preventDefault()\n focusNode(currentIndex === -1 ? 0 : Math.max(currentIndex - 1, 0))\n break\n case 'ArrowRight': {\n e.preventDefault()\n if (currentIndex === -1) break\n const item = flat[currentIndex]\n if (!item.isLeaf && !treeState.value.expandedKeys.includes(item.key)) {\n handleExpand(item.key)\n } else if (!item.isLeaf && treeState.value.expandedKeys.includes(item.key)) {\n focusNode(currentIndex + 1)\n }\n break\n }\n case 'ArrowLeft': {\n e.preventDefault()\n if (currentIndex === -1) break\n const item = flat[currentIndex]\n if (!item.isLeaf && treeState.value.expandedKeys.includes(item.key)) {\n handleExpand(item.key)\n } else if (item.parentKey !== null && item.parentKey !== undefined) {\n const parentIndex = flat.findIndex((n) => n.key === item.parentKey)\n if (parentIndex !== -1) focusNode(parentIndex)\n }\n break\n }\n case 'Home':\n e.preventDefault()\n focusNode(0)\n break\n case 'End':\n e.preventDefault()\n focusNode(flat.length - 1)\n break\n case 'Enter': {\n e.preventDefault()\n if (currentIndex === -1) break\n const item = flat[currentIndex]\n if (props.selectable) handleSelect(item.key)\n break\n }\n case ' ': {\n e.preventDefault()\n if (currentIndex === -1) break\n const item = flat[currentIndex]\n if (props.checkable) handleCheck(item.key)\n else if (!item.isLeaf) handleExpand(item.key)\n break\n }\n case '*':\n e.preventDefault()\n expandAll()\n break\n }\n}\n\nfunction handleScroll() {\n if (containerRef.value) {\n scrollTop.value = containerRef.value.scrollTop\n }\n}\n\nconst useVirtual = computed(\n () => props.virtual && props.height !== undefined && flatNodes.value.length > 50,\n)\n\nconst VIRTUAL_OVERSCAN = 5\n\nconst visibleSlice = computed<{ nodes: typeof flatNodes.value; startIndex: number }>(() => {\n if (!useVirtual.value || !props.height) {\n return { nodes: flatNodes.value, startIndex: 0 }\n }\n const rawStart = Math.floor(scrollTop.value / itemHeight)\n const startIndex = Math.max(0, rawStart - VIRTUAL_OVERSCAN)\n const visibleCount = Math.ceil(props.height / itemHeight) + VIRTUAL_OVERSCAN * 2\n const endIndex = Math.min(flatNodes.value.length, startIndex + visibleCount)\n return { nodes: flatNodes.value.slice(startIndex, endIndex), startIndex }\n})\n\nconst virtualOffset = computed(() => visibleSlice.value.startIndex * itemHeight)\nconst totalHeight = computed(() => flatNodes.value.length * itemHeight)\nconst virtualBottomPad = computed(() =>\n Math.max(\n 0,\n totalHeight.value - virtualOffset.value - visibleSlice.value.nodes.length * itemHeight,\n ),\n)\n\nwatch(\n () => props.scrollToKey,\n (key) => {\n if (key === undefined) return\n const exists = flatNodes.value.findIndex((item) => item.key === key)\n if (exists !== -1) {\n scrollToFocused(key)\n setFocusedKey(key)\n }\n },\n)\n\nfunction handleExpandAll() {\n expandAll()\n emit('expand', tree.getState().expandedKeys, {\n expanded: true,\n node: props.treeData[0],\n })\n}\n\nfunction handleCollapseAll() {\n collapseAll()\n emit('expand', [], { expanded: false, node: props.treeData[0] })\n}\n\nfunction handleCheckAll() {\n const keys = tree.getAllKeys()\n setCheckedKeys(keys)\n const nodes = keys.map((k) => tree.getNode(k)).filter(Boolean) as TreeNodeData[]\n emit('check', keys, { checked: true, node: nodes[0], checkedNodes: nodes, halfCheckedKeys: [] })\n}\n\nfunction handleUncheckAll() {\n setCheckedKeys([])\n emit('check', [], {\n checked: false,\n node: props.treeData[0],\n checkedNodes: [],\n halfCheckedKeys: [],\n })\n}\n\nconst wrapperClass = computed(() => {\n if (props.unstyled) return ''\n return [\n 'sg-tree',\n props.blockNode ? 'sg-tree-block-node' : '',\n props.directory ? 'sg-tree-directory' : '',\n props.disabled ? 'sg-tree-disabled' : '',\n props.animated ? 'sg-tree-animated' : '',\n props.showLine ? 'sg-tree-show-line' : '',\n ]\n .filter(Boolean)\n .join(' ')\n})\n\ndefineExpose({\n expandAll: handleExpandAll,\n collapseAll: handleCollapseAll,\n checkAll: handleCheckAll,\n uncheckAll: handleUncheckAll,\n scrollToKey: scrollToFocused,\n})\n</script>\n\n<template>\n <div :class=\"wrapperClass || undefined\" role=\"tree\">\n <div v-if=\"showSearch\" class=\"sg-tree-search\">\n <input\n class=\"sg-tree-search-input\"\n type=\"text\"\n :value=\"searchValue\"\n :placeholder=\"localeFull.searchPlaceholder\"\n :aria-label=\"localeFull.searchPlaceholder\"\n @input=\"(e: Event) => applySearch((e.target as HTMLInputElement).value)\"\n />\n <button\n v-if=\"searchValue\"\n type=\"button\"\n class=\"sg-tree-search-clear\"\n aria-label=\"Clear search\"\n @click=\"applySearch('')\"\n >\n ×\n </button>\n </div>\n\n <div v-if=\"showToolbar\" class=\"sg-tree-toolbar\">\n <div class=\"sg-tree-toolbar-actions\">\n <button\n type=\"button\"\n class=\"sg-tree-toolbar-btn\"\n :title=\"localeFull.expandAllText\"\n @click=\"handleExpandAll\"\n >\n ⊞\n </button>\n <button\n type=\"button\"\n class=\"sg-tree-toolbar-btn\"\n :title=\"localeFull.collapseAllText\"\n @click=\"handleCollapseAll\"\n >\n ⊟\n </button>\n <template v-if=\"checkable\">\n <span class=\"sg-tree-toolbar-divider\" />\n <button\n type=\"button\"\n class=\"sg-tree-toolbar-btn\"\n :title=\"localeFull.checkAllText\"\n @click=\"handleCheckAll\"\n >\n ☑\n </button>\n <button\n type=\"button\"\n class=\"sg-tree-toolbar-btn\"\n :title=\"localeFull.uncheckAllText\"\n @click=\"handleUncheckAll\"\n >\n ☐\n </button>\n </template>\n </div>\n </div>\n\n <div v-if=\"flatNodes.length === 0\" class=\"sg-tree-empty\">{{ localeFull.emptyText }}</div>\n\n <div\n v-else-if=\"useVirtual && height\"\n ref=\"containerEl\"\n class=\"sg-tree-virtual-container\"\n :style=\"{ height: `${height}px`, overflow: 'auto' }\"\n tabindex=\"0\"\n role=\"tree\"\n @scroll=\"handleScroll\"\n @keydown=\"handleKeyDown\"\n >\n <div\n :style=\"{\n paddingTop: `${virtualOffset}px`,\n paddingBottom: `${virtualBottomPad}px`,\n boxSizing: 'border-box',\n }\"\n >\n <TreeNodeRow\n v-for=\"item in visibleSlice.nodes\"\n :key=\"item.key\"\n :node=\"item.node\"\n :node-key=\"item.key\"\n :depth=\"item.depth\"\n :is-leaf=\"item.isLeaf\"\n :indent-size=\"indentSize\"\n :expanded=\"treeState.expandedKeys.includes(item.key)\"\n :checked=\"treeState.checkedKeys.includes(item.key)\"\n :half-checked=\"treeState.halfCheckedKeys.includes(item.key)\"\n :selected=\"treeState.selectedKeys.includes(item.key)\"\n :loading=\"treeState.loadingKeys.includes(item.key)\"\n :disabled=\"disabled || !!item.node.disabled\"\n :focused=\"focusedKey === item.key\"\n :checkable=\"checkable\"\n :selectable=\"selectable\"\n :block-node=\"blockNode\"\n :directory=\"directory\"\n :animated=\"animated\"\n :draggable=\"isDraggable(item.node)\"\n :drop-position=\"dropKey === item.key ? dropPosition : null\"\n :drag-key=\"dragKey\"\n :search-value=\"highlightSearch ? searchValue : ''\"\n :t=\"localeFull\"\n :status=\"nodeStatusFor(item.node)\"\n :actions=\"actions\"\n :editable=\"isEditable(item.node)\"\n :unstyled=\"unstyled\"\n @expand=\"handleExpand\"\n @check=\"handleCheck\"\n @select=\"handleSelect\"\n @drag-start=\"handleDragStart\"\n @drag-over=\"handleDragOver\"\n @drag-leave=\"handleDragLeave\"\n @drag-end=\"handleDragEnd\"\n @drop=\"handleDrop\"\n @right-click=\"handleRightClick\"\n @load-data=\"handleLoadData\"\n @focus-node=\"setFocusedKey\"\n @edit=\"handleEdit\"\n @edit-cancel=\"handleEditCancel\"\n />\n </div>\n </div>\n\n <div v-else ref=\"treeEl\" tabindex=\"0\" role=\"tree\" @keydown=\"handleKeyDown\">\n <TreeNodeRow\n v-for=\"item in flatNodes\"\n :key=\"item.key\"\n :node=\"item.node\"\n :node-key=\"item.key\"\n :depth=\"item.depth\"\n :is-leaf=\"item.isLeaf\"\n :indent-size=\"indentSize\"\n :expanded=\"treeState.expandedKeys.includes(item.key)\"\n :checked=\"treeState.checkedKeys.includes(item.key)\"\n :half-checked=\"treeState.halfCheckedKeys.includes(item.key)\"\n :selected=\"treeState.selectedKeys.includes(item.key)\"\n :loading=\"treeState.loadingKeys.includes(item.key)\"\n :disabled=\"disabled || !!item.node.disabled\"\n :focused=\"focusedKey === item.key\"\n :checkable=\"checkable\"\n :selectable=\"selectable\"\n :block-node=\"blockNode\"\n :directory=\"directory\"\n :animated=\"animated\"\n :draggable=\"isDraggable(item.node)\"\n :drop-position=\"dropKey === item.key ? dropPosition : null\"\n :drag-key=\"dragKey\"\n :search-value=\"highlightSearch ? searchValue : ''\"\n :t=\"localeFull\"\n :status=\"nodeStatusFor(item.node)\"\n :actions=\"actions\"\n :editable=\"isEditable(item.node)\"\n :unstyled=\"unstyled\"\n @expand=\"handleExpand\"\n @check=\"handleCheck\"\n @select=\"handleSelect\"\n @drag-start=\"handleDragStart\"\n @drag-over=\"handleDragOver\"\n @drag-leave=\"handleDragLeave\"\n @drag-end=\"handleDragEnd\"\n @drop=\"handleDrop\"\n @right-click=\"handleRightClick\"\n @load-data=\"handleLoadData\"\n @focus-node=\"setFocusedKey\"\n @edit=\"handleEdit\"\n @edit-cancel=\"handleEditCancel\"\n />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\nimport { computed, ref, useSlots } from 'vue'\nimport type { ListProps, ListClassNames, ListStyles } from './types'\n\nconst props = withDefaults(defineProps<ListProps<T>>(), {\n loading: false,\n pagination: false,\n size: 'default',\n split: true,\n bordered: false,\n unstyled: false,\n selectable: false,\n multiSelect: false,\n draggable: false,\n hoverable: true,\n defaultSelectedKeys: () => [],\n})\n\nconst emit = defineEmits<{\n /** Fires when selection changes. */\n (e: 'selectionChange', keys: number[], items: T[]): void\n /** Fires after items are reordered via drag. */\n (e: 'reorder', fromIndex: number, toIndex: number): void\n /** Fires on row click. */\n (e: 'itemClick', item: T, index: number): void\n /** Fires when pagination changes. */\n (e: 'pageChange', page: number, pageSize: number): void\n}>()\n\ndefineSlots<{\n default(props: { item: T; index: number }): unknown\n header(props: Record<string, never>): unknown\n footer(props: Record<string, never>): unknown\n loadMore(props: Record<string, never>): unknown\n}>()\n\nconst slots = useSlots()\n\nconst sCls = computed<ListClassNames>(() => props.classNames ?? {})\nconst sSty = computed<ListStyles>(() => props.styles ?? {})\n\nconst internalPage = ref(1)\nconst internalSelectedKeys = ref<number[]>(props.defaultSelectedKeys ?? [])\nconst dragIndex = ref<number | null>(null)\nconst dropIndex = ref<number | null>(null)\nconst scrollTop = ref(0)\nconst virtualEl = ref<HTMLDivElement | null>(null)\n\nconst selectedKeys = computed<number[]>(() => props.selectedKeys ?? internalSelectedKeys.value)\n\nconst pageSize = computed(() =>\n props.pagination ? (props.pagination.pageSize ?? 10) : props.dataSource.length,\n)\nconst currentPage = computed(() =>\n props.pagination ? (props.pagination.current ?? internalPage.value) : 1,\n)\nconst total = computed(() =>\n props.pagination ? (props.pagination.total ?? props.dataSource.length) : props.dataSource.length,\n)\n\nconst paginatedData = computed(() => {\n if (!props.pagination) return props.dataSource\n const start = (currentPage.value - 1) * pageSize.value\n return props.dataSource.slice(start, start + pageSize.value)\n})\n\nconst pageCount = computed(() => Math.max(1, Math.ceil(total.value / pageSize.value)))\n\nfunction changePage(page: number) {\n if (page < 1 || page > pageCount.value) return\n internalPage.value = page\n if (props.pagination) {\n props.pagination.onChange?.(page, pageSize.value)\n }\n emit('pageChange', page, pageSize.value)\n}\n\nfunction handleItemClick(item: T, index: number, e: MouseEvent) {\n emit('itemClick', item, index)\n if (!props.selectable) return\n\n let next: number[]\n if (props.multiSelect && (e.ctrlKey || e.metaKey)) {\n next = selectedKeys.value.includes(index)\n ? selectedKeys.value.filter((k) => k !== index)\n : [...selectedKeys.value, index]\n } else {\n next = selectedKeys.value.includes(index) ? [] : [index]\n }\n\n internalSelectedKeys.value = next\n emit(\n 'selectionChange',\n next,\n next.map((k) => props.dataSource[k]),\n )\n}\n\nfunction handleDragStart(e: DragEvent, index: number) {\n if (!props.draggable) return\n dragIndex.value = index\n if (e.dataTransfer) e.dataTransfer.effectAllowed = 'move'\n}\n\nfunction handleDragOver(e: DragEvent, index: number) {\n if (!props.draggable || dragIndex.value === null) return\n e.preventDefault()\n dropIndex.value = index\n}\n\nfunction handleDrop(e: DragEvent, index: number) {\n e.preventDefault()\n if (dragIndex.value === null || dragIndex.value === index) {\n dragIndex.value = null\n dropIndex.value = null\n return\n }\n emit('reorder', dragIndex.value, index)\n dragIndex.value = null\n dropIndex.value = null\n}\n\nfunction handleDragEnd() {\n dragIndex.value = null\n dropIndex.value = null\n}\n\nfunction handleVirtualScroll() {\n if (virtualEl.value) {\n scrollTop.value = virtualEl.value.scrollTop\n }\n}\n\nconst emptyText = computed(() => props.locale?.emptyText ?? 'No Data')\n\nconst gridStyle = computed<Record<string, string | number> | undefined>(() => {\n if (!props.grid) return undefined\n const cols = props.grid.column ?? 1\n const style: Record<string, string | number> = {\n '--sg-list-grid-base-columns': `repeat(${cols}, 1fr)`,\n }\n if (props.grid.gutter !== undefined) style.gap = `${props.grid.gutter}px`\n return style\n})\n\nconst gridResponsiveClass = computed(() => {\n const grid = props.grid\n if (!grid) return ''\n const parts: string[] = []\n if (grid.xs) parts.push(`sg-list-grid-xs-${grid.xs}`)\n if (grid.sm) parts.push(`sg-list-grid-sm-${grid.sm}`)\n if (grid.md) parts.push(`sg-list-grid-md-${grid.md}`)\n if (grid.lg) parts.push(`sg-list-grid-lg-${grid.lg}`)\n return parts.join(' ')\n})\n\ninterface VirtualSlice {\n startIndex: number\n endIndex: number\n offsetTop: number\n totalHeight: number\n}\n\nconst virtualSlice = computed<VirtualSlice | null>(() => {\n if (!props.virtual) return null\n const { itemHeight, height, overscan = 5 } = props.virtual\n const totalHeight = paginatedData.value.length * itemHeight\n const startIndex = Math.max(0, Math.floor(scrollTop.value / itemHeight) - overscan)\n const visibleCount = Math.ceil(height / itemHeight) + overscan * 2\n const endIndex = Math.min(paginatedData.value.length, startIndex + visibleCount)\n const offsetTop = startIndex * itemHeight\n return { startIndex, endIndex, offsetTop, totalHeight }\n})\n\nfunction rowCls(item: T, index: number): string {\n const isSelected = props.selectable && selectedKeys.value.includes(index)\n const isDragging = dragIndex.value === index\n const isDropTarget = dropIndex.value === index && dragIndex.value !== index\n const extra =\n typeof props.rowClassName === 'function'\n ? props.rowClassName(item, index)\n : (props.rowClassName ?? '')\n\n return [\n 'sg-list-item',\n props.selectable ? 'sg-list-item-selectable' : '',\n isSelected ? 'sg-list-item-selected' : '',\n props.hoverable ? 'sg-list-item-hoverable' : '',\n isDragging ? 'sg-list-item-dragging' : '',\n isDropTarget ? 'sg-list-item-drop-target' : '',\n sCls.value.item ?? '',\n extra,\n ]\n .filter(Boolean)\n .join(' ')\n}\n\nconst wrapperClass = computed(() => {\n if (props.unstyled) return ''\n return [\n 'sg-list',\n `sg-list-${props.size}`,\n props.split ? 'sg-list-split' : '',\n props.bordered ? 'sg-list-bordered' : '',\n props.loading ? 'sg-list-loading' : '',\n props.grid ? 'sg-list-grid' : '',\n props.selectable ? 'sg-list-selectable' : '',\n props.draggable ? 'sg-list-draggable' : '',\n gridResponsiveClass.value,\n sCls.value.root ?? '',\n ]\n .filter(Boolean)\n .join(' ')\n})\n\nconst itemsContainerClass = computed(() =>\n ['sg-list-items', sCls.value.items ?? ''].filter(Boolean).join(' '),\n)\n\ndefineExpose({\n /** Currently selected item indices (uncontrolled mode). */\n selectedKeys: internalSelectedKeys,\n /** Programmatically change the page. */\n changePage,\n})\n</script>\n\n<template>\n <div :class=\"wrapperClass\" :style=\"sSty.root\">\n <div\n v-if=\"slots.header || header\"\n :class=\"['sg-list-header', sCls.header].filter(Boolean).join(' ') || undefined\"\n :style=\"sSty.header\"\n >\n <slot name=\"header\">{{ header }}</slot>\n </div>\n\n <div v-if=\"loading\" class=\"sg-list-loading-indicator\" role=\"status\" aria-live=\"polite\">\n <span v-if=\"!unstyled\" class=\"sg-spin sg-spin-default\" aria-label=\"Loading\" />\n </div>\n\n <div\n v-else-if=\"paginatedData.length === 0\"\n :class=\"['sg-list-empty', sCls.empty].filter(Boolean).join(' ') || undefined\"\n :style=\"sSty.empty\"\n >\n {{ emptyText }}\n </div>\n\n <div\n v-else-if=\"virtual && virtualSlice\"\n ref=\"virtualEl\"\n class=\"sg-list-virtual-container\"\n :style=\"{ height: `${virtual.height}px`, overflow: 'auto' }\"\n @scroll=\"handleVirtualScroll\"\n >\n <div :style=\"{ height: `${virtualSlice.totalHeight}px`, position: 'relative' }\">\n <div\n :style=\"{ position: 'absolute', top: `${virtualSlice.offsetTop}px`, left: 0, right: 0 }\"\n >\n <div\n v-for=\"(item, i) in paginatedData.slice(virtualSlice.startIndex, virtualSlice.endIndex)\"\n :key=\"virtualSlice.startIndex + i\"\n :class=\"rowCls(item, virtualSlice.startIndex + i) || undefined\"\n :style=\"sSty.item\"\n :draggable=\"draggable\"\n @click=\"(e: MouseEvent) => handleItemClick(item, virtualSlice!.startIndex + i, e)\"\n @dragstart=\"(e: DragEvent) => handleDragStart(e, virtualSlice!.startIndex + i)\"\n @dragover=\"(e: DragEvent) => handleDragOver(e, virtualSlice!.startIndex + i)\"\n @drop=\"(e: DragEvent) => handleDrop(e, virtualSlice!.startIndex + i)\"\n @dragend=\"handleDragEnd\"\n @dragleave=\"dropIndex = null\"\n >\n <span v-if=\"draggable\" class=\"sg-list-drag-handle\">⠿</span>\n <slot :item=\"item\" :index=\"virtualSlice.startIndex + i\" />\n </div>\n </div>\n </div>\n </div>\n\n <div\n v-else\n :class=\"grid || sCls.items ? itemsContainerClass : undefined\"\n :style=\"grid ? { ...gridStyle, ...sSty.items } : sSty.items\"\n >\n <div\n v-for=\"(item, i) in paginatedData\"\n :key=\"i\"\n :class=\"rowCls(item, i) || undefined\"\n :style=\"sSty.item\"\n :draggable=\"draggable\"\n @click=\"(e: MouseEvent) => handleItemClick(item, i, e)\"\n @dragstart=\"(e: DragEvent) => handleDragStart(e, i)\"\n @dragover=\"(e: DragEvent) => handleDragOver(e, i)\"\n @drop=\"(e: DragEvent) => handleDrop(e, i)\"\n @dragend=\"handleDragEnd\"\n @dragleave=\"dropIndex = null\"\n >\n <span v-if=\"draggable\" class=\"sg-list-drag-handle\">⠿</span>\n <slot :item=\"item\" :index=\"i\" />\n </div>\n </div>\n\n <div v-if=\"slots.loadMore\" class=\"sg-list-load-more\">\n <slot name=\"loadMore\" />\n </div>\n\n <div\n v-if=\"pagination\"\n :class=\"['sg-list-pagination', sCls.pagination].filter(Boolean).join(' ') || undefined\"\n :style=\"sSty.pagination\"\n >\n <button\n type=\"button\"\n class=\"sg-list-pagination-prev\"\n :disabled=\"currentPage <= 1\"\n @click=\"changePage(currentPage - 1)\"\n >\n ‹\n </button>\n <span class=\"sg-list-pagination-info\">{{ currentPage }} / {{ pageCount }}</span>\n <button\n type=\"button\"\n class=\"sg-list-pagination-next\"\n :disabled=\"currentPage >= pageCount\"\n @click=\"changePage(currentPage + 1)\"\n >\n ›\n </button>\n </div>\n\n <div\n v-if=\"slots.footer || footer\"\n :class=\"['sg-list-footer', sCls.footer].filter(Boolean).join(' ') || undefined\"\n :style=\"sSty.footer\"\n >\n <slot name=\"footer\">{{ footer }}</slot>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\" generic=\"T\">\r\nimport { computed } from 'vue'\r\nimport { useVirtualScroll } from '../../../composables/useVirtualScroll'\r\nimport type { VirtualItem } from '@skygraph/core'\r\n\r\nexport interface VirtualListProps<T> {\r\n /** Full dataset; only visible indices are rendered. */\r\n data: T[]\r\n /** Fixed row height or per-index height resolver in pixels. */\r\n itemHeight: number | ((index: number) => number)\r\n /** Extra rows rendered above and below the viewport. */\r\n overscan?: number\r\n /** Optional class on the scroll container. */\r\n className?: string\r\n /** Optional inline style on the scroll container. */\r\n containerStyle?: Record<string, string | number>\r\n /** Resolves a stable Vue key for each item; defaults to row index. */\r\n itemKey?: (item: T, index: number) => string | number\r\n}\r\n\r\nconst props = withDefaults(defineProps<VirtualListProps<T>>(), {\r\n overscan: undefined,\r\n className: undefined,\r\n containerStyle: undefined,\r\n itemKey: undefined,\r\n})\r\n\r\ndefineSlots<{\r\n /** Renders one item with absolute positioning styles applied by the list. */\r\n item(props: { item: T; index: number; style: Record<string, string | number> }): unknown\r\n}>()\r\n\r\nconst itemCount = computed(() => props.data.length)\r\nconst itemHeight = computed(() => props.itemHeight)\r\n\r\nconst { range, containerRef, scrollToIndex } = useVirtualScroll({\r\n itemCount,\r\n itemHeight,\r\n overscan: computed(() => props.overscan ?? 5),\r\n})\r\n\r\ndefineExpose({\r\n /** Scrolls the viewport so the item at `index` is visible. */\r\n scrollToIndex,\r\n})\r\n\r\nconst visibleItems = computed(() => {\r\n const items = range.value.visibleItems\r\n return items.map((vi: VirtualItem) => {\r\n const item = props.data[vi.index]\r\n const key = props.itemKey ? props.itemKey(item, vi.index) : vi.index\r\n const style: Record<string, string | number> = {\r\n position: 'absolute',\r\n top: `${vi.offsetTop}px`,\r\n left: '0',\r\n right: '0',\r\n height: `${vi.height}px`,\r\n }\r\n return { vi, item, key, style }\r\n })\r\n})\r\n</script>\r\n\r\n<template>\r\n <div\r\n ref=\"containerRef\"\r\n :class=\"className\"\r\n :style=\"{ overflow: 'auto', position: 'relative', ...containerStyle }\"\r\n >\r\n <div :style=\"{ height: `${range.totalHeight}px`, position: 'relative' }\">\r\n <template v-for=\"entry in visibleItems\" :key=\"entry.key\">\r\n <slot name=\"item\" :item=\"entry.item\" :index=\"entry.vi.index\" :style=\"entry.style\" />\r\n </template>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { computed, ref, watch } from 'vue'\r\nimport { useVirtualScroll } from '../../../composables/useVirtualScroll'\r\nimport type {\r\n CellPosition,\r\n CellValue,\r\n DataGridColumn,\r\n DataGridProps,\r\n DataGridSummaryRow,\r\n} from './types'\r\n\r\ntype Row = Record<string, unknown>\r\n\r\nconst props = withDefaults(defineProps<DataGridProps<Row>>(), {\r\n rowHeight: 36,\r\n headerHeight: 40,\r\n width: '100%',\r\n height: 400,\r\n striped: false,\r\n highlightOnHover: true,\r\n rowSelection: false,\r\n showRowNumber: false,\r\n overscan: 5,\r\n loading: false,\r\n emptyText: 'No data',\r\n})\r\n\r\nconst emit = defineEmits<{\r\n (e: 'cell-edit', payload: { rowIndex: number; columnKey: string; value: CellValue }): void\r\n (e: 'sort', payload: { column: string; direction: 'asc' | 'desc' }): void\r\n (e: 'row-click', payload: { row: Row; rowIndex: number }): void\r\n (e: 'row-double-click', payload: { row: Row; rowIndex: number }): void\r\n (e: 'selected-rows-change', payload: Set<string | number>): void\r\n}>()\r\n\r\nconst SELECTION_COL_WIDTH = 40\r\nconst ROW_NUMBER_COL_WIDTH = 48\r\n\r\nconst orderedColumns = computed(() => {\r\n const left = props.columns.filter((c) => c.frozen === 'left')\r\n const middle = props.columns.filter((c) => !c.frozen)\r\n const right = props.columns.filter((c) => c.frozen === 'right')\r\n return [...left, ...middle, ...right]\r\n})\r\n\r\nconst totalContentHeight = computed(() => props.data.length * props.rowHeight)\r\n\r\nconst itemCount = computed(() => props.data.length)\r\nconst itemHeight = computed(() => props.rowHeight)\r\nconst overscan = computed(() => props.overscan ?? 5)\r\nconst { range, containerRef, scrollToIndex } = useVirtualScroll({\r\n itemCount,\r\n itemHeight,\r\n overscan,\r\n})\r\n\r\nconst activeCell = ref<CellPosition | null>(null)\r\nconst editingCell = ref<CellPosition | null>(null)\r\nconst draftValue = ref<CellValue>(null)\r\n\r\nconst internalSelected = ref<Set<string | number>>(new Set(props.selectedRows ?? []))\r\nwatch(\r\n () => props.selectedRows,\r\n (next) => {\r\n internalSelected.value = new Set(next ?? [])\r\n },\r\n)\r\n\r\nconst visibleRows = computed(() => {\r\n const items = range.value.visibleItems\r\n return items.map((vi) => ({ row: props.data[vi.index] as Row, index: vi.index, offsetTop: vi.offsetTop, height: vi.height }))\r\n})\r\n\r\nconst resolveRowKey = (row: Row, index: number): string | number => {\r\n if (typeof props.rowKey === 'function') return props.rowKey(row, index)\r\n const v = row[props.rowKey as string]\r\n return (v as string | number) ?? index\r\n}\r\n\r\nconst resolveCellValue = (row: Row, col: DataGridColumn<Row>): CellValue => {\r\n if (col.formula) return col.formula(row)\r\n return row[col.key] as CellValue\r\n}\r\n\r\nconst isEditableCell = (col: DataGridColumn<Row>, row: Row, rowIndex: number): boolean => {\r\n if (typeof col.editable === 'function') return col.editable(row, rowIndex)\r\n return Boolean(col.editable)\r\n}\r\n\r\nconst handleHeaderClick = (col: DataGridColumn<Row>) => {\r\n if (!col.sortable) return\r\n const nextDir: 'asc' | 'desc' =\r\n props.sortColumn === col.key && props.sortDirection === 'asc' ? 'desc' : 'asc'\r\n emit('sort', { column: col.key, direction: nextDir })\r\n}\r\n\r\nconst handleCellClick = (rowIndex: number, colIndex: number) => {\r\n activeCell.value = { row: rowIndex, col: colIndex }\r\n}\r\n\r\nconst handleCellDoubleClick = (\r\n rowIndex: number,\r\n colIndex: number,\r\n col: DataGridColumn<Row>,\r\n row: Row,\r\n) => {\r\n if (!isEditableCell(col, row, rowIndex)) return\r\n editingCell.value = { row: rowIndex, col: colIndex }\r\n draftValue.value = resolveCellValue(row, col)\r\n}\r\n\r\nconst commitEdit = () => {\r\n const cell = editingCell.value\r\n if (!cell) return\r\n const col = orderedColumns.value[cell.col]\r\n emit('cell-edit', { rowIndex: cell.row, columnKey: col.key, value: draftValue.value })\r\n editingCell.value = null\r\n}\r\n\r\nconst cancelEdit = () => {\r\n editingCell.value = null\r\n}\r\n\r\nconst handleEditorKeydown = (e: KeyboardEvent) => {\r\n if (e.key === 'Enter') commitEdit()\r\n else if (e.key === 'Escape') cancelEdit()\r\n}\r\n\r\nconst handleRowClick = (row: Row, rowIndex: number) => {\r\n emit('row-click', { row, rowIndex })\r\n}\r\nconst handleRowDblClick = (row: Row, rowIndex: number) => {\r\n emit('row-double-click', { row, rowIndex })\r\n}\r\n\r\nconst toggleRowSelection = (row: Row, rowIndex: number) => {\r\n const key = resolveRowKey(row, rowIndex)\r\n const next = new Set(internalSelected.value)\r\n if (next.has(key)) next.delete(key)\r\n else next.add(key)\r\n internalSelected.value = next\r\n emit('selected-rows-change', next)\r\n}\r\n\r\nconst allSelected = computed(() => {\r\n if (props.data.length === 0) return false\r\n return props.data.every((row, i) => internalSelected.value.has(resolveRowKey(row, i)))\r\n})\r\n\r\nconst toggleSelectAll = () => {\r\n if (allSelected.value) {\r\n internalSelected.value = new Set()\r\n } else {\r\n internalSelected.value = new Set(props.data.map((row, i) => resolveRowKey(row, i)))\r\n }\r\n emit('selected-rows-change', internalSelected.value)\r\n}\r\n\r\nconst summaryRows = computed<DataGridSummaryRow<Row>[]>(() => props.summaryRows ?? [])\r\n\r\ndefineExpose({\r\n scrollToRow: scrollToIndex,\r\n getActiveCell: () => activeCell.value,\r\n setActiveCell: (pos: CellPosition | null) => {\r\n activeCell.value = pos\r\n },\r\n})\r\n</script>\r\n\r\n<template>\r\n <div\r\n :class=\"['sg-datagrid', props.className]\"\r\n :style=\"{\r\n width: typeof props.width === 'number' ? `${props.width}px` : props.width,\r\n height: typeof props.height === 'number' ? `${props.height}px` : props.height,\r\n position: 'relative',\r\n overflow: 'hidden',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n }\"\r\n >\r\n <div\r\n class=\"sg-datagrid-header\"\r\n :style=\"{ height: `${props.headerHeight}px`, display: 'flex', flexShrink: 0 }\"\r\n >\r\n <div\r\n v-if=\"props.rowSelection\"\r\n class=\"sg-datagrid-header-cell sg-datagrid-selection-cell\"\r\n :style=\"{ width: `${SELECTION_COL_WIDTH}px`, flexShrink: 0 }\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n :checked=\"allSelected\"\r\n aria-label=\"Select all rows\"\r\n @change=\"toggleSelectAll\"\r\n />\r\n </div>\r\n <div\r\n v-if=\"props.showRowNumber\"\r\n class=\"sg-datagrid-header-cell sg-datagrid-row-number-cell\"\r\n :style=\"{ width: `${ROW_NUMBER_COL_WIDTH}px`, flexShrink: 0 }\"\r\n >\r\n #\r\n </div>\r\n <div\r\n v-for=\"(col, ci) in orderedColumns\"\r\n :key=\"col.key\"\r\n :class=\"[\r\n 'sg-datagrid-header-cell',\r\n col.headerClassName,\r\n col.sortable && 'sg-datagrid-header-cell--sortable',\r\n props.sortColumn === col.key && props.sortDirection === 'asc' && 'sg-datagrid-header-cell--asc',\r\n props.sortColumn === col.key && props.sortDirection === 'desc' && 'sg-datagrid-header-cell--desc',\r\n ]\"\r\n :style=\"{\r\n width: col.width ? `${col.width}px` : '120px',\r\n minWidth: col.minWidth ? `${col.minWidth}px` : undefined,\r\n maxWidth: col.maxWidth ? `${col.maxWidth}px` : undefined,\r\n textAlign: col.align ?? 'left',\r\n }\"\r\n :data-col-index=\"ci\"\r\n @click=\"handleHeaderClick(col)\"\r\n >\r\n <span>{{ col.title ?? col.key }}</span>\r\n <span\r\n v-if=\"col.sortable && props.sortColumn === col.key\"\r\n class=\"sg-datagrid-header-cell-sort-indicator\"\r\n >\r\n {{ props.sortDirection === 'asc' ? '▲' : '▼' }}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div\r\n v-if=\"props.loading\"\r\n class=\"sg-datagrid-loading\"\r\n :style=\"{\r\n position: 'absolute',\r\n inset: 0,\r\n background: 'rgba(255,255,255,0.7)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n zIndex: 10,\r\n }\"\r\n >\r\n <span>Loading…</span>\r\n </div>\r\n\r\n <div\r\n v-if=\"!props.loading && props.data.length === 0\"\r\n class=\"sg-datagrid-empty\"\r\n :style=\"{ flex: 1, display: 'flex', alignItems: 'center', justifyContent: 'center' }\"\r\n >\r\n {{ props.emptyText }}\r\n </div>\r\n\r\n <div\r\n v-show=\"props.data.length > 0\"\r\n ref=\"containerRef\"\r\n class=\"sg-datagrid-body\"\r\n :style=\"{ flex: 1, overflowY: 'auto', overflowX: 'auto' }\"\r\n >\r\n <div :style=\"{ height: `${totalContentHeight}px`, position: 'relative' }\">\r\n <div\r\n v-for=\"entry in visibleRows\"\r\n :key=\"resolveRowKey(entry.row, entry.index)\"\r\n class=\"sg-datagrid-row\"\r\n :class=\"[\r\n props.striped && (entry.index % 2 === 0 ? 'sg-datagrid-row--even' : 'sg-datagrid-row--odd'),\r\n props.highlightOnHover && 'sg-datagrid-row--hoverable',\r\n internalSelected.has(resolveRowKey(entry.row, entry.index)) && 'sg-datagrid-row--selected',\r\n ]\"\r\n :style=\"{\r\n position: 'absolute',\r\n top: `${entry.offsetTop}px`,\r\n left: 0,\r\n right: 0,\r\n height: `${entry.height}px`,\r\n display: 'flex',\r\n }\"\r\n :data-row-index=\"entry.index\"\r\n @click=\"handleRowClick(entry.row, entry.index)\"\r\n @dblclick=\"handleRowDblClick(entry.row, entry.index)\"\r\n >\r\n <div\r\n v-if=\"props.rowSelection\"\r\n class=\"sg-datagrid-cell sg-datagrid-selection-cell\"\r\n :style=\"{ width: `${SELECTION_COL_WIDTH}px`, flexShrink: 0 }\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n :checked=\"internalSelected.has(resolveRowKey(entry.row, entry.index))\"\r\n aria-label=\"Select row\"\r\n @click.stop\r\n @change=\"toggleRowSelection(entry.row, entry.index)\"\r\n />\r\n </div>\r\n <div\r\n v-if=\"props.showRowNumber\"\r\n class=\"sg-datagrid-cell sg-datagrid-row-number-cell\"\r\n :style=\"{ width: `${ROW_NUMBER_COL_WIDTH}px`, flexShrink: 0 }\"\r\n >\r\n {{ entry.index + 1 }}\r\n </div>\r\n <div\r\n v-for=\"(col, ci) in orderedColumns\"\r\n :key=\"col.key\"\r\n :class=\"[\r\n 'sg-datagrid-cell',\r\n col.className,\r\n activeCell && activeCell.row === entry.index && activeCell.col === ci && 'sg-datagrid-cell--active',\r\n editingCell && editingCell.row === entry.index && editingCell.col === ci && 'sg-datagrid-cell--editing',\r\n ]\"\r\n :style=\"{\r\n width: col.width ? `${col.width}px` : '120px',\r\n minWidth: col.minWidth ? `${col.minWidth}px` : undefined,\r\n maxWidth: col.maxWidth ? `${col.maxWidth}px` : undefined,\r\n textAlign: col.align ?? 'left',\r\n }\"\r\n :data-row-index=\"entry.index\"\r\n :data-col-index=\"ci\"\r\n :data-col-key=\"col.key\"\r\n @click.stop=\"handleCellClick(entry.index, ci)\"\r\n @dblclick.stop=\"handleCellDoubleClick(entry.index, ci, col, entry.row)\"\r\n >\r\n <input\r\n v-if=\"editingCell && editingCell.row === entry.index && editingCell.col === ci\"\r\n :value=\"draftValue == null ? '' : String(draftValue)\"\r\n autofocus\r\n :style=\"{\r\n width: '100%',\r\n height: '100%',\r\n border: 'none',\r\n outline: 'none',\r\n padding: '0 8px',\r\n background: 'transparent',\r\n font: 'inherit',\r\n }\"\r\n @input=\"(e) => (draftValue = (e.target as HTMLInputElement).value)\"\r\n @blur=\"commitEdit\"\r\n @keydown=\"handleEditorKeydown\"\r\n />\r\n <span v-else>{{ resolveCellValue(entry.row, col) ?? '' }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div v-if=\"summaryRows.length > 0\" class=\"sg-datagrid-summary\">\r\n <div\r\n v-for=\"(s, si) in summaryRows\"\r\n :key=\"si\"\r\n class=\"sg-datagrid-summary-row\"\r\n :class=\"s.className\"\r\n :style=\"{ display: 'flex' }\"\r\n >\r\n <div\r\n v-if=\"props.rowSelection\"\r\n class=\"sg-datagrid-summary-cell\"\r\n :style=\"{ width: `${SELECTION_COL_WIDTH}px`, flexShrink: 0 }\"\r\n />\r\n <div\r\n v-if=\"props.showRowNumber\"\r\n class=\"sg-datagrid-summary-cell\"\r\n :style=\"{ width: `${ROW_NUMBER_COL_WIDTH}px`, flexShrink: 0 }\"\r\n />\r\n <div\r\n v-for=\"col in orderedColumns\"\r\n :key=\"col.key\"\r\n class=\"sg-datagrid-summary-cell\"\r\n :style=\"{\r\n width: col.width ? `${col.width}px` : '120px',\r\n textAlign: col.align ?? 'left',\r\n }\"\r\n >\r\n {{ s.render(col.key, props.data) ?? '' }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n","import { ref, watchEffect, onScopeDispose, type Ref } from 'vue'\r\n\r\n/** Measured DOM size in CSS pixels. */\r\nexport interface ChartSize {\r\n width: number\r\n height: number\r\n}\r\n\r\n/**\r\n * Vue 3 composable parallel to React's `useChartSize`.\r\n *\r\n * Tracks a target element's size via `ResizeObserver`, returning a reactive\r\n * `ChartSize`. Falls back to the supplied size in SSR / jsdom or before the\r\n * first RO callback. Rounds output to whole pixels to avoid sub-pixel\r\n * resize-loops at fractional zoom levels.\r\n */\r\nexport function useChartSize(\r\n target: Ref<Element | null>,\r\n fallback: ChartSize,\r\n): { size: Ref<ChartSize> } {\r\n const size = ref<ChartSize>({ ...fallback })\r\n let lastApplied: ChartSize = { ...fallback }\r\n let ro: ResizeObserver | null = null\r\n let observedEl: Element | null = null\r\n\r\n const apply = (w: number, h: number) => {\r\n if (!Number.isFinite(w) || !Number.isFinite(h)) return\r\n if (w <= 0 || h <= 0) return\r\n const next: ChartSize = { width: Math.round(w), height: Math.round(h) }\r\n if (lastApplied.width === next.width && lastApplied.height === next.height) return\r\n lastApplied = next\r\n size.value = next\r\n }\r\n\r\n const detach = () => {\r\n if (ro) {\r\n ro.disconnect()\r\n ro = null\r\n }\r\n observedEl = null\r\n }\r\n\r\n const attach = (el: Element | null) => {\r\n if (observedEl === el) return\r\n detach()\r\n if (!el) return\r\n observedEl = el\r\n\r\n if (typeof ResizeObserver === 'undefined') {\r\n const r = el.getBoundingClientRect()\r\n apply(r.width, r.height)\r\n return\r\n }\r\n\r\n ro = new ResizeObserver((entries) => {\r\n const entry = entries[0]\r\n if (!entry) return\r\n const cr = entry.contentRect\r\n apply(cr.width, cr.height)\r\n })\r\n\r\n const r = el.getBoundingClientRect()\r\n apply(r.width, r.height)\r\n ro.observe(el)\r\n }\r\n\r\n watchEffect(() => {\r\n attach(target.value)\r\n })\r\n\r\n onScopeDispose(() => detach())\r\n\r\n return { size }\r\n}\r\n","import type { PrintOptions } from './types'\r\n\r\n/**\r\n * Build the `@page` CSS rule for the print popup.\r\n * Vanilla TS port from `@skygraph/react/utils/print/printElement`.\r\n */\r\nexport function buildPageRule(opts: PrintOptions = {}): string {\r\n const orientation = opts.orientation ?? 'portrait'\r\n const pageSize = opts.pageSize ?? 'A4'\r\n const margins = opts.margins ?? '1cm'\r\n return `@page { size: ${pageSize} ${orientation}; margin: ${margins}; }`\r\n}\r\n\r\n/**\r\n * Compose the popup HTML document. Identical to the React utility so behaviour\r\n * stays interchangeable across frameworks.\r\n */\r\nexport function buildPrintHtml(\r\n fragment: string,\r\n opts: PrintOptions = {},\r\n documentRef: Document | null = typeof document !== 'undefined' ? document : null,\r\n): string {\r\n const styles =\r\n documentRef === null\r\n ? ''\r\n : Array.from(documentRef.querySelectorAll('style, link[rel=\"stylesheet\"]'))\r\n .map((el) => el.outerHTML)\r\n .join('\\n')\r\n\r\n const pageRule = buildPageRule(opts)\r\n const scale = opts.scale && opts.scale !== 1 ? opts.scale : null\r\n const title = escapeHtml(opts.fileName ?? 'SkyGraph print')\r\n const customStyles = opts.customStyles ?? ''\r\n\r\n const wrapperOpen = scale\r\n ? `<div class=\"sg-print-root\" style=\"transform: scale(${scale}); transform-origin: 0 0;\">`\r\n : `<div class=\"sg-print-root\">`\r\n\r\n return `<!DOCTYPE html>\r\n<html>\r\n<head>\r\n<meta charset=\"utf-8\" />\r\n<title>${title}</title>\r\n${styles}\r\n<style>\r\n ${pageRule}\r\n html, body { margin: 0; padding: 0; background: #fff; }\r\n body { padding: 0; }\r\n .sg-print-root { width: 100%; }\r\n ${customStyles}\r\n</style>\r\n</head>\r\n<body>\r\n${wrapperOpen}\r\n${fragment}\r\n</div>\r\n</body>\r\n</html>`\r\n}\r\n\r\nfunction escapeHtml(s: string): string {\r\n return s\r\n .replace(/&/g, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\"/g, '"')\r\n .replace(/'/g, ''')\r\n}\r\n\r\n/**\r\n * Open a popup window, inject SkyGraph styles + the node's `outerHTML`, and\r\n * trigger `window.print()`. Returns the popup window or `null` if blocked.\r\n */\r\nexport function printElement(node: Element | null, opts: PrintOptions = {}): Window | null {\r\n if (!node) return null\r\n if (typeof window === 'undefined') return null\r\n\r\n const popup = window.open('', '_blank')\r\n if (!popup) return null\r\n\r\n const html = buildPrintHtml(node.outerHTML, opts)\r\n popup.document.open()\r\n popup.document.write(html)\r\n popup.document.close()\r\n popup.focus()\r\n\r\n if (opts.skipPrint) return popup\r\n\r\n const trigger = () => {\r\n try {\r\n popup.print()\r\n } catch {\r\n // Print might be blocked; popup stays open for the user.\r\n }\r\n if (!opts.keepOpen) {\r\n try {\r\n popup.close()\r\n } catch {\r\n // Already closed.\r\n }\r\n }\r\n }\r\n\r\n if (popup.document.readyState === 'complete') {\r\n setTimeout(trigger, 0)\r\n } else {\r\n popup.addEventListener('load', () => setTimeout(trigger, 0), { once: true })\r\n setTimeout(trigger, 300)\r\n }\r\n\r\n return popup\r\n}\r\n","/**\r\n * Vue Charts — type definitions parallel to React's chart contract.\r\n *\r\n * Trimmed compared to React: drops ChartActionsProp, context menu handlers,\r\n * crosshair / brush specific options. Common props (categories / series /\r\n * width / height / legend / animate / xAxis / yAxis / padding) match exactly.\r\n */\r\nimport type { CSSProperties } from 'vue'\r\n\r\nexport type ChartCategory = string | number\r\nexport type ChartValue = number | null\r\n\r\nexport interface ChartSeries {\r\n id: string\r\n label: string\r\n color?: string\r\n values: readonly ChartValue[]\r\n}\r\n\r\nexport interface XAxisOptions {\r\n tickCount?: number\r\n tickFormatter?: (category: ChartCategory, index: number) => string\r\n label?: string\r\n}\r\n\r\nexport interface YAxisOptions {\r\n tickCount?: number\r\n tickFormatter?: (value: number) => string\r\n label?: string\r\n gridLines?: boolean\r\n}\r\n\r\nexport type ChartAnimation = boolean | { duration?: number }\r\n\r\nexport const DEFAULT_CHART_ANIMATION_MS = 600\r\n\r\nexport function resolveChartAnimation(animate: ChartAnimation | undefined): {\r\n enabled: boolean\r\n duration: number\r\n} {\r\n if (animate === false) return { enabled: false, duration: 0 }\r\n if (animate === undefined || animate === true) {\r\n return { enabled: true, duration: DEFAULT_CHART_ANIMATION_MS }\r\n }\r\n return {\r\n enabled: true,\r\n duration: animate.duration ?? DEFAULT_CHART_ANIMATION_MS,\r\n }\r\n}\r\n\r\nexport interface BaseChartProps {\r\n categories: readonly ChartCategory[]\r\n series: readonly ChartSeries[]\r\n width?: number | string\r\n height?: number\r\n className?: string\r\n style?: CSSProperties\r\n unstyled?: boolean\r\n padding?: number | readonly [number, number, number, number]\r\n legend?: boolean\r\n animate?: ChartAnimation\r\n xAxis?: XAxisOptions\r\n yAxis?: YAxisOptions\r\n /** Base file name (without extension) for print. */\r\n fileName?: string\r\n}\r\n\r\nexport const DEFAULT_PALETTE = [\r\n 'var(--sg-color-primary)',\r\n 'var(--sg-color-success)',\r\n 'var(--sg-color-warning)',\r\n 'var(--sg-color-error)',\r\n 'var(--sg-blue-4)',\r\n 'var(--sg-orange-5)',\r\n 'var(--sg-green-5)',\r\n 'var(--sg-red-5)',\r\n] as const\r\n\r\nexport function colorForSeries(series: ChartSeries, index: number): string {\r\n return series.color ?? DEFAULT_PALETTE[index % DEFAULT_PALETTE.length]!\r\n}\r\n\r\nexport function normalizePadding(\r\n p: BaseChartProps['padding'],\r\n): [number, number, number, number] {\r\n if (p === undefined) return [16, 16, 24, 32]\r\n if (typeof p === 'number') return [p, p, p, p]\r\n return [...p]\r\n}\r\n\r\nexport function chartBounds(\r\n values: readonly (readonly ChartValue[])[],\r\n): { min: number; max: number } {\r\n let min = Infinity\r\n let max = -Infinity\r\n for (const row of values) {\r\n for (const v of row) {\r\n if (v === null || v === undefined) continue\r\n if (v < min) min = v\r\n if (v > max) max = v\r\n }\r\n }\r\n if (!Number.isFinite(min) || !Number.isFinite(max)) {\r\n min = 0\r\n max = 1\r\n }\r\n if (min === max) {\r\n min -= 1\r\n max += 1\r\n }\r\n return { min, max }\r\n}\r\n\r\nexport interface ChartExpose {\r\n print: (opts?: { fileName?: string }) => void\r\n exportSvg: (fileName?: string) => void\r\n}\r\n","<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport { colorForSeries, type ChartSeries } from './types'\r\n\r\ninterface Props {\r\n series: readonly ChartSeries[]\r\n unstyled?: boolean\r\n className?: string\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), { unstyled: false })\r\n\r\nconst items = computed(() =>\r\n props.series.map((s, i) => ({ id: s.id, label: s.label, color: colorForSeries(s, i) })),\r\n)\r\n</script>\r\n\r\n<template>\r\n <div\r\n :class=\"[!props.unstyled && 'sg-chart-legend', props.className]\"\r\n role=\"list\"\r\n aria-label=\"Chart legend\"\r\n >\r\n <span\r\n v-for=\"item in items\"\r\n :key=\"item.id\"\r\n class=\"sg-chart-legend-item\"\r\n role=\"listitem\"\r\n :data-series-id=\"item.id\"\r\n >\r\n <span class=\"sg-chart-legend-swatch\" :style=\"{ background: item.color }\" />\r\n <span class=\"sg-chart-legend-label\">{{ item.label }}</span>\r\n </span>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport type { ChartCategory, XAxisOptions, YAxisOptions } from './types'\r\n\r\ninterface Props {\r\n /** Plot-area top-left X in user space. */\r\n x: number\r\n /** Plot-area top-left Y in user space. */\r\n y: number\r\n /** Plot-area width. */\r\n plotW: number\r\n /** Plot-area height. */\r\n plotH: number\r\n categories: readonly ChartCategory[]\r\n /** Min/max for the Y axis. */\r\n yMin: number\r\n yMax: number\r\n xAxis?: XAxisOptions\r\n yAxis?: YAxisOptions\r\n unstyled?: boolean\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), { unstyled: false })\r\n\r\nconst formatY = (v: number) =>\r\n props.yAxis?.tickFormatter ? props.yAxis.tickFormatter(v) : String(Math.round(v * 100) / 100)\r\n\r\nconst formatX = (c: ChartCategory, i: number) =>\r\n props.xAxis?.tickFormatter ? props.xAxis.tickFormatter(c, i) : String(c)\r\n\r\nconst yTicks = computed(() => {\r\n const count = Math.max(2, props.yAxis?.tickCount ?? 5)\r\n const arr: { value: number; y: number }[] = []\r\n for (let i = 0; i < count; i++) {\r\n const t = i / (count - 1)\r\n const value = props.yMin + (props.yMax - props.yMin) * (1 - t)\r\n arr.push({ value, y: props.y + props.plotH * t })\r\n }\r\n return arr\r\n})\r\n\r\nconst xTicks = computed(() => {\r\n if (props.categories.length === 0) return []\r\n const tickCount = Math.min(\r\n props.categories.length,\r\n Math.max(2, props.xAxis?.tickCount ?? props.categories.length),\r\n )\r\n const arr: { label: string; x: number }[] = []\r\n for (let i = 0; i < tickCount; i++) {\r\n const idx =\r\n tickCount === 1\r\n ? 0\r\n : Math.round((i * (props.categories.length - 1)) / (tickCount - 1))\r\n const t = props.categories.length === 1 ? 0 : idx / (props.categories.length - 1)\r\n arr.push({\r\n label: formatX(props.categories[idx], idx),\r\n x: props.x + props.plotW * t,\r\n })\r\n }\r\n return arr\r\n})\r\n</script>\r\n\r\n<template>\r\n <g :class=\"!props.unstyled && 'sg-chart-axes'\">\r\n <g v-if=\"props.yAxis\" class=\"sg-chart-axis sg-chart-axis-y\">\r\n <line\r\n v-for=\"(t, i) in yTicks\"\r\n :key=\"`yg-${i}`\"\r\n v-show=\"props.yAxis?.gridLines\"\r\n :x1=\"props.x\"\r\n :y1=\"t.y\"\r\n :x2=\"props.x + props.plotW\"\r\n :y2=\"t.y\"\r\n class=\"sg-chart-axis-grid\"\r\n stroke=\"currentColor\"\r\n stroke-opacity=\"0.1\"\r\n vector-effect=\"non-scaling-stroke\"\r\n />\r\n <text\r\n v-for=\"(t, i) in yTicks\"\r\n :key=\"`yt-${i}`\"\r\n :x=\"props.x - 6\"\r\n :y=\"t.y + 4\"\r\n text-anchor=\"end\"\r\n class=\"sg-chart-axis-label\"\r\n font-size=\"10\"\r\n fill=\"currentColor\"\r\n >\r\n {{ formatY(t.value) }}\r\n </text>\r\n <text\r\n v-if=\"props.yAxis?.label\"\r\n :x=\"props.x - 28\"\r\n :y=\"props.y + props.plotH / 2\"\r\n :transform=\"`rotate(-90, ${props.x - 28}, ${props.y + props.plotH / 2})`\"\r\n text-anchor=\"middle\"\r\n class=\"sg-chart-axis-title\"\r\n font-size=\"11\"\r\n fill=\"currentColor\"\r\n >\r\n {{ props.yAxis.label }}\r\n </text>\r\n </g>\r\n <g v-if=\"props.xAxis\" class=\"sg-chart-axis sg-chart-axis-x\">\r\n <text\r\n v-for=\"(t, i) in xTicks\"\r\n :key=\"`xt-${i}`\"\r\n :x=\"t.x\"\r\n :y=\"props.y + props.plotH + 14\"\r\n text-anchor=\"middle\"\r\n class=\"sg-chart-axis-label\"\r\n font-size=\"10\"\r\n fill=\"currentColor\"\r\n >\r\n {{ t.label }}\r\n </text>\r\n <text\r\n v-if=\"props.xAxis?.label\"\r\n :x=\"props.x + props.plotW / 2\"\r\n :y=\"props.y + props.plotH + 28\"\r\n text-anchor=\"middle\"\r\n class=\"sg-chart-axis-title\"\r\n font-size=\"11\"\r\n fill=\"currentColor\"\r\n >\r\n {{ props.xAxis.label }}\r\n </text>\r\n </g>\r\n </g>\r\n</template>\r\n","<script setup lang=\"ts\">\n/**\n * Shared SVG overlay for chart crosshair / hover tooltip — Vue port of\n * React's `ChartCrosshair`.\n *\n * Pure presentational: no state, no listeners. The parent chart owns the\n * mouse logic and decides when this component renders.\n *\n * DOM and `sg-chart-crosshair-*` class set match the React adapter\n * one-to-one. See CHARTER §9 (API parity).\n */\nimport { computed } from 'vue'\nimport type { ChartCategory } from './types'\n\n/** One labelled value displayed in the crosshair tooltip column. */\nexport interface ChartCrosshairPoint {\n /** Series label (matches `ChartSeries.label`). */\n label: string\n /** Numeric value at the hovered category. */\n value: number\n /** Resolved series colour (CSS value). */\n color: string\n /** Y coordinate (plot user-space) for the dot marker. */\n y: number\n}\n\nexport interface ChartCrosshairProps {\n /** X coordinate of the vertical line (plot user-space). */\n x: number\n /** Top-left X of the plot area (used for tooltip horizontal clamping). */\n plotX: number\n /** Top-left Y of the plot area (top of the vertical line). */\n plotY: number\n /** Plot height (length of the vertical line). */\n plotH: number\n /** Plot width (used for tooltip clamping). */\n plotW: number\n /** Hovered category — shown as the tooltip header. */\n category: ChartCategory\n /** Per-series snapshot of value + dot position at the hovered X. */\n points: readonly ChartCrosshairPoint[]\n /** Drop the default `sg-chart-crosshair-*` class names. */\n unstyled?: boolean\n /** Optional formatter for numeric values shown in the tooltip. */\n valueFormatter?: (value: number) => string\n}\n\nconst props = defineProps<ChartCrosshairProps>()\n\nconst TIP_WIDTH = 140\nconst TIP_LINE_HEIGHT = 14\nconst TIP_PADDING = 6\nconst TIP_GAP = 10\n\nfunction defaultValueFormatter(value: number): string {\n if (Number.isInteger(value)) return String(value)\n if (Math.abs(value) >= 100) return value.toFixed(0)\n return value.toFixed(2).replace(/\\.?0+$/, '')\n}\n\nconst fmt = computed(() => props.valueFormatter ?? defaultValueFormatter)\n\nconst cls = (suffix: string) => (props.unstyled ? undefined : `sg-chart-crosshair-${suffix}`)\n\nconst tipMetrics = computed(() => {\n const headerHeight = TIP_LINE_HEIGHT + 2\n const tipHeight = TIP_PADDING * 2 + headerHeight + props.points.length * TIP_LINE_HEIGHT\n const wantRight = props.x + TIP_GAP + TIP_WIDTH <= props.plotX + props.plotW\n const tipX = wantRight ? props.x + TIP_GAP : props.x - TIP_GAP - TIP_WIDTH\n const tipY = Math.max(\n props.plotY,\n Math.min(props.plotY + props.plotH - tipHeight, props.plotY + 4),\n )\n return { tipX, tipY, tipHeight, headerHeight }\n})\n\nfunction rowY(i: number): number {\n return tipMetrics.value.tipY + TIP_PADDING + tipMetrics.value.headerHeight + i * TIP_LINE_HEIGHT\n}\n</script>\n\n<template>\n <g\n :class=\"props.unstyled ? undefined : 'sg-chart-crosshair'\"\n data-sg-chart-crosshair=\"\"\n pointer-events=\"none\"\n >\n <line\n :class=\"cls('line')\"\n data-sg-chart-crosshair-line=\"\"\n :x1=\"props.x\"\n :x2=\"props.x\"\n :y1=\"props.plotY\"\n :y2=\"props.plotY + props.plotH\"\n stroke=\"var(--sg-color-text-secondary)\"\n :stroke-width=\"1\"\n stroke-dasharray=\"3 3\"\n :opacity=\"0.7\"\n />\n\n <circle\n v-for=\"(p, i) in props.points\"\n :key=\"`dot-${i}`\"\n :class=\"cls('dot')\"\n data-sg-chart-crosshair-dot=\"\"\n :cx=\"props.x\"\n :cy=\"p.y\"\n :r=\"3.5\"\n :fill=\"p.color\"\n stroke=\"var(--sg-color-bg, #fff)\"\n :stroke-width=\"1.5\"\n />\n\n <g :class=\"cls('tooltip')\" data-sg-chart-crosshair-tooltip=\"\">\n <rect\n :class=\"cls('tooltip-bg')\"\n :x=\"tipMetrics.tipX\"\n :y=\"tipMetrics.tipY\"\n :width=\"TIP_WIDTH\"\n :height=\"tipMetrics.tipHeight\"\n :rx=\"4\"\n :ry=\"4\"\n fill=\"var(--sg-color-bg, #fff)\"\n stroke=\"var(--sg-color-border)\"\n :stroke-width=\"1\"\n />\n <text\n :class=\"cls('tooltip-title')\"\n :x=\"tipMetrics.tipX + TIP_PADDING\"\n :y=\"tipMetrics.tipY + TIP_PADDING + TIP_LINE_HEIGHT - 3\"\n :font-size=\"11\"\n :font-weight=\"600\"\n fill=\"var(--sg-color-text)\"\n >\n {{ String(props.category) }}\n </text>\n <template v-for=\"(p, i) in props.points\" :key=\"`row-${i}`\">\n <rect\n :x=\"tipMetrics.tipX + TIP_PADDING\"\n :y=\"rowY(i) + 2\"\n :width=\"8\"\n :height=\"8\"\n :rx=\"1\"\n :fill=\"p.color\"\n />\n <text\n :class=\"cls('tooltip-label')\"\n :x=\"tipMetrics.tipX + TIP_PADDING + 12\"\n :y=\"rowY(i) + TIP_LINE_HEIGHT - 3\"\n :font-size=\"11\"\n fill=\"var(--sg-color-text-secondary)\"\n >\n {{ p.label }}\n </text>\n <text\n :class=\"cls('tooltip-value')\"\n :x=\"tipMetrics.tipX + TIP_WIDTH - TIP_PADDING\"\n :y=\"rowY(i) + TIP_LINE_HEIGHT - 3\"\n :font-size=\"11\"\n :font-weight=\"500\"\n fill=\"var(--sg-color-text)\"\n text-anchor=\"end\"\n >\n {{ fmt(p.value) }}\n </text>\n </template>\n </g>\n </g>\n</template>\n","<script lang=\"ts\">\n/**\n * Brushing overlay — Vue port of React's `ChartBrush`.\n *\n * Drag inside the plot area to pick a `[from, to]` range in category-index\n * space. Double-click to reset to `null`. Owns transient drag-state but\n * publishes the final range through `update:range` (v-model compatible) and\n * the `change` event — parent decides whether to use controlled (`range`\n * prop) or uncontrolled mode.\n *\n * DOM and `sg-chart-brush-*` classes match the React adapter 1:1.\n *\n * Note: types + `resolveBrushConfig` live in this regular `<script>` block so\n * they can be re-exported alongside the SFC default export — Vue's\n * `<script setup>` forbids runtime ES exports.\n */\n\n/** Selection range expressed as inclusive category indices. */\nexport interface ChartBrushRange {\n /** Start index — always `<= to`. */\n from: number\n /** End index — always `>= from`. */\n to: number\n}\n\n/**\n * Brushing config object — same shape as React, accepted by chart wrappers\n * via their `brush` prop.\n */\nexport interface ChartBrushConfig {\n /** Controlled range. `null` means nothing is selected. */\n range?: ChartBrushRange | null\n /** Initial range in uncontrolled mode. */\n defaultRange?: ChartBrushRange | null\n /** Fires on `pointerup` after drag and on dblclick (reset → `null`). */\n onRangeChange?: (range: ChartBrushRange | null) => void\n /** Selection fill colour. */\n fill?: string\n /** Disable interactions while still rendering the controlled range. */\n disabled?: boolean\n}\n\n/** Resolve a `brush` prop into a `ChartBrushConfig | null`. */\nexport function resolveBrushConfig(\n brush: boolean | ChartBrushConfig | undefined,\n): ChartBrushConfig | null {\n if (brush == null || brush === false) return null\n if (brush === true) return {}\n return brush\n}\n\nexport interface ChartBrushProps {\n /** Plot left edge in SVG user-space. */\n plotX: number\n /** Plot top edge in SVG user-space. */\n plotY: number\n /** Plot width. */\n plotW: number\n /** Plot height. */\n plotH: number\n /** Number of categories along X — used to map `x → index`. */\n categoryCount: number\n /** Current selection (controlled). `null` means nothing is selected. */\n range: ChartBrushRange | null\n /** Drop the default `sg-chart-brush-*` class names. */\n unstyled?: boolean\n /** Selection fill colour. */\n fill?: string\n /** Disable interactions while still rendering the visual. */\n disabled?: boolean\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport type { CSSProperties } from 'vue'\n\nconst props = defineProps<ChartBrushProps>()\n\nconst emit = defineEmits<{\n /** Emitted with the new range on pointerup or `null` on dblclick reset. */\n (e: 'update:range', range: ChartBrushRange | null): void\n /** Mirror of `update:range` for callers that prefer a non-v-model name. */\n (e: 'change', range: ChartBrushRange | null): void\n}>()\n\nconst DEFAULT_FILL = 'var(--sg-color-primary)'\n\nconst drag = ref<{ startIdx: number; endIdx: number } | null>(null)\nconst overlayRef = ref<SVGRectElement | null>(null)\n\nconst cls = (suffix: string) => (props.unstyled ? undefined : `sg-chart-brush-${suffix}`)\n\nfunction xToCategoryIndex(localX: number, plotX: number, plotW: number, count: number): number {\n if (count <= 0) return 0\n if (count === 1) return 0\n if (!Number.isFinite(localX) || !Number.isFinite(plotW) || plotW <= 0) return 0\n const step = plotW / (count - 1)\n if (step <= 0 || !Number.isFinite(step)) return 0\n const raw = Math.round((localX - plotX) / step)\n if (!Number.isFinite(raw)) return 0\n return Math.max(0, Math.min(count - 1, raw))\n}\n\nfunction categoryIndexToX(idx: number, plotX: number, plotW: number, count: number): number {\n if (count <= 1) return plotX\n const step = plotW / (count - 1)\n return plotX + idx * step\n}\n\nfunction clientToCategoryIndex(clientX: number): number | null {\n const overlay = overlayRef.value\n const svg = overlay?.ownerSVGElement\n if (!svg) return null\n const r = svg.getBoundingClientRect()\n if (!r.width || !Number.isFinite(r.width)) return null\n // jsdom doesn't reliably implement `svg.viewBox.baseVal`; read the raw\n // attribute and fall back to 600 (our standard SVG-chart viewBox width).\n let viewW = 600\n try {\n const vb = svg.viewBox?.baseVal\n if (vb && vb.width > 0) viewW = vb.width\n else {\n const attr = svg.getAttribute('viewBox')\n if (attr) {\n const parts = attr.trim().split(/\\s+/)\n const w = Number.parseFloat(parts[2] ?? '')\n if (Number.isFinite(w) && w > 0) viewW = w\n }\n }\n } catch {\n // ignore — keep 600.\n }\n const localX = ((clientX - r.left) / r.width) * viewW\n return xToCategoryIndex(localX, props.plotX, props.plotW, props.categoryCount)\n}\n\nfunction safeSetCapture(el: SVGRectElement, id: number) {\n try {\n el.setPointerCapture?.(id)\n } catch {\n // jsdom / older browsers — ignored.\n }\n}\n\nfunction safeReleaseCapture(el: SVGRectElement, id: number) {\n try {\n el.releasePointerCapture?.(id)\n } catch {\n // ignore\n }\n}\n\nfunction publish(next: ChartBrushRange | null) {\n emit('update:range', next)\n emit('change', next)\n}\n\nfunction handlePointerDown(e: PointerEvent) {\n if (props.disabled || props.categoryCount === 0) return\n const idx = clientToCategoryIndex(e.clientX)\n if (idx === null) return\n e.preventDefault()\n safeSetCapture(e.currentTarget as SVGRectElement, e.pointerId)\n drag.value = { startIdx: idx, endIdx: idx }\n}\n\nfunction handlePointerMove(e: PointerEvent) {\n if (!drag.value) return\n const idx = clientToCategoryIndex(e.clientX)\n if (idx === null) return\n drag.value = { ...drag.value, endIdx: idx }\n}\n\nfunction handlePointerUp(e: PointerEvent) {\n if (!drag.value) return\n safeReleaseCapture(e.currentTarget as SVGRectElement, e.pointerId)\n const idx = clientToCategoryIndex(e.clientX)\n const finalEnd = idx ?? drag.value.endIdx\n const from = Math.min(drag.value.startIdx, finalEnd)\n const to = Math.max(drag.value.startIdx, finalEnd)\n publish({ from, to })\n drag.value = null\n}\n\nfunction handlePointerCancel(e: PointerEvent) {\n if (!drag.value) return\n safeReleaseCapture(e.currentTarget as SVGRectElement, e.pointerId)\n drag.value = null\n}\n\nfunction handleDoubleClick(e: MouseEvent) {\n if (props.disabled) return\n e.preventDefault()\n publish(null)\n}\n\nconst liveSelection = computed<ChartBrushRange | null>(() => {\n if (drag.value) {\n const from = Math.min(drag.value.startIdx, drag.value.endIdx)\n const to = Math.max(drag.value.startIdx, drag.value.endIdx)\n return { from, to }\n }\n if (props.range) {\n const from = Math.min(props.range.from, props.range.to)\n const to = Math.max(props.range.from, props.range.to)\n return {\n from: Math.max(0, Math.min(props.categoryCount - 1, from)),\n to: Math.max(0, Math.min(props.categoryCount - 1, to)),\n }\n }\n return null\n})\n\nconst selectionRect = computed(() => {\n const sel = liveSelection.value\n if (!sel) return null\n const x1 = categoryIndexToX(sel.from, props.plotX, props.plotW, props.categoryCount)\n const x2 = categoryIndexToX(sel.to, props.plotX, props.plotW, props.categoryCount)\n const left = Math.min(x1, x2)\n const right = Math.max(x1, x2)\n // 2px minimum width — keeps a single-point selection visible.\n const w = Math.max(2, right - left)\n return { left, w }\n})\n\nconst fillColor = computed(() => props.fill ?? DEFAULT_FILL)\nconst overlayStyle = computed<CSSProperties>(() =>\n props.disabled ? { cursor: 'not-allowed' } : { cursor: 'crosshair' },\n)\n</script>\n\n<template>\n <g :class=\"props.unstyled ? undefined : 'sg-chart-brush'\" data-sg-chart-brush=\"\">\n <rect\n ref=\"overlayRef\"\n :class=\"cls('overlay')\"\n data-sg-chart-brush-overlay=\"\"\n :x=\"props.plotX\"\n :y=\"props.plotY\"\n :width=\"Math.max(0, props.plotW)\"\n :height=\"Math.max(0, props.plotH)\"\n fill=\"transparent\"\n :style=\"overlayStyle\"\n @pointerdown=\"handlePointerDown\"\n @pointermove=\"handlePointerMove\"\n @pointerup=\"handlePointerUp\"\n @pointercancel=\"handlePointerCancel\"\n @dblclick=\"handleDoubleClick\"\n />\n <rect\n v-if=\"selectionRect\"\n :class=\"cls('selection')\"\n data-sg-chart-brush-selection=\"\"\n :x=\"selectionRect.left\"\n :y=\"props.plotY\"\n :width=\"selectionRect.w\"\n :height=\"Math.max(0, props.plotH)\"\n :fill=\"fillColor\"\n :fill-opacity=\"0.15\"\n :stroke=\"fillColor\"\n :stroke-opacity=\"0.5\"\n :stroke-width=\"1\"\n pointer-events=\"none\"\n />\n </g>\n</template>\n","<script setup lang=\"ts\">\nimport { ref, computed } from 'vue'\nimport { useChartSize } from '../../../composables/useChartSize'\nimport { printElement } from '../../../utils/print'\nimport {\n chartBounds,\n colorForSeries,\n normalizePadding,\n resolveChartAnimation,\n type BaseChartProps,\n} from './types'\nimport ChartLegend from './ChartLegend.vue'\nimport ChartAxes from './ChartAxes.vue'\nimport ChartCrosshair, { type ChartCrosshairPoint } from './ChartCrosshair.vue'\nimport ChartBrush, {\n resolveBrushConfig,\n type ChartBrushConfig,\n type ChartBrushRange,\n} from './ChartBrush.vue'\n\n/**\n * Crosshair behaviour toggle for {@link LineChart}. When `true`, a vertical\n * guide line + per-series tooltip appears on hover.\n */\nexport type LineChartCrosshair =\n | boolean\n | {\n /** Custom formatter for tooltip numeric values. */\n valueFormatter?: (value: number) => string\n }\n\ninterface LineChartProps extends BaseChartProps {\n markers?: boolean\n strokeWidth?: number\n /**\n * Hover crosshair with vertical guide line and per-series tooltip.\n * @default false\n */\n crosshair?: LineChartCrosshair\n /**\n * Brush for drag-selecting an X range. `true` — uncontrolled with empty\n * starting value; object — `ChartBrushConfig`. See `ChartBrush`.\n */\n brush?: boolean | ChartBrushConfig\n}\n\nconst props = withDefaults(defineProps<LineChartProps>(), {\n width: '100%',\n height: 200,\n unstyled: false,\n markers: true,\n strokeWidth: 2,\n legend: false,\n fileName: 'chart',\n crosshair: false,\n})\n\nconst rootRef = ref<HTMLDivElement | null>(null)\nconst svgRef = ref<SVGSVGElement | null>(null)\nconst fallbackW = computed(() =>\n typeof props.width === 'number' && Number.isFinite(props.width) ? props.width : 600,\n)\nconst fallbackH = computed(() =>\n typeof props.height === 'number' && Number.isFinite(props.height) ? props.height : 200,\n)\nconst { size } = useChartSize(svgRef, { width: fallbackW.value, height: fallbackH.value })\n\nconst padding = computed(() => normalizePadding(props.padding))\nconst viewW = computed(() => size.value.width)\nconst viewH = computed(() => size.value.height)\nconst plotX = computed(() => padding.value[3])\nconst plotY = computed(() => padding.value[0])\nconst plotW = computed(() => Math.max(0, viewW.value - padding.value[3] - padding.value[1]))\nconst plotH = computed(() => Math.max(0, viewH.value - padding.value[0] - padding.value[2]))\n\nconst bounds = computed(() => chartBounds(props.series.map((s) => s.values)))\nconst animation = computed(() => resolveChartAnimation(props.animate))\n\nconst xCoord = (i: number) => {\n const n = props.categories.length\n if (n <= 1) return plotX.value\n return plotX.value + (plotW.value * i) / (n - 1)\n}\n\nconst yCoord = (v: number) => {\n const { min, max } = bounds.value\n if (max === min) return plotY.value + plotH.value / 2\n return plotY.value + plotH.value * (1 - (v - min) / (max - min))\n}\n\nconst lineSegments = computed(() =>\n props.series.map((s, i) => {\n const color = colorForSeries(s, i)\n const segments: string[] = []\n let current: string[] = []\n s.values.forEach((v, idx) => {\n if (v === null || v === undefined) {\n if (current.length > 0) {\n segments.push(current.join(' '))\n current = []\n }\n } else {\n const cmd = current.length === 0 ? 'M' : 'L'\n current.push(`${cmd}${xCoord(idx)},${yCoord(v)}`)\n }\n })\n if (current.length > 0) segments.push(current.join(' '))\n return { id: s.id, color, label: s.label, segments }\n }),\n)\n\nconst markerPoints = computed(() =>\n props.series.flatMap((s, i) => {\n const color = colorForSeries(s, i)\n return s.values\n .map((v, idx) =>\n v == null ? null : { id: `${s.id}-${idx}`, color, x: xCoord(idx), y: yCoord(v) },\n )\n .filter(Boolean) as { id: string; color: string; x: number; y: number }[]\n }),\n)\n\nconst crosshairEnabled = computed(() => props.crosshair !== false && props.categories.length > 0)\nconst crosshairFmt = computed(() =>\n typeof props.crosshair === 'object' && props.crosshair !== null\n ? props.crosshair.valueFormatter\n : undefined,\n)\nconst hoverIdx = ref<number | null>(null)\n\nfunction handleSvgMouseMove(e: MouseEvent) {\n if (!crosshairEnabled.value) return\n const svg = e.currentTarget as SVGSVGElement\n const rect = svg.getBoundingClientRect()\n if (rect.width === 0) return\n const localX = ((e.clientX - rect.left) / rect.width) * viewW.value\n const n = props.categories.length\n if (n === 1) {\n hoverIdx.value = 0\n return\n }\n const xStep = plotW.value / (n - 1)\n if (xStep <= 0) {\n hoverIdx.value = null\n return\n }\n const rawIdx = Math.round((localX - plotX.value) / xStep)\n if (rawIdx < 0 || rawIdx >= n) {\n hoverIdx.value = null\n return\n }\n hoverIdx.value = rawIdx\n}\n\nfunction handleSvgMouseLeave() {\n if (crosshairEnabled.value) hoverIdx.value = null\n}\n\nconst crosshairPoints = computed<ChartCrosshairPoint[]>(() => {\n const idx = hoverIdx.value\n if (idx === null) return []\n const out: ChartCrosshairPoint[] = []\n props.series.forEach((s, sIdx) => {\n const v = s.values[idx]\n if (v === null || v === undefined) return\n out.push({\n label: s.label,\n value: v,\n color: colorForSeries(s, sIdx),\n y: yCoord(v),\n })\n })\n return out\n})\n\nconst brushConfig = computed(() => resolveBrushConfig(props.brush))\nconst isBrushControlled = computed(() => brushConfig.value != null && 'range' in brushConfig.value)\nconst internalBrushRange = ref<ChartBrushRange | null>(brushConfig.value?.defaultRange ?? null)\nconst effectiveBrushRange = computed<ChartBrushRange | null>(() =>\n isBrushControlled.value ? (brushConfig.value!.range ?? null) : internalBrushRange.value,\n)\nfunction handleBrushChange(next: ChartBrushRange | null) {\n if (!isBrushControlled.value) internalBrushRange.value = next\n brushConfig.value?.onRangeChange?.(next)\n}\n\ndefineExpose({\n print: (opts: { fileName?: string } = {}) => {\n const el = rootRef.value\n if (!el) return\n printElement(el, { fileName: opts.fileName ?? props.fileName ?? 'chart' })\n },\n exportSvg: () => {\n const svg = svgRef.value\n if (!svg) return null\n return new XMLSerializer().serializeToString(svg)\n },\n})\n</script>\n\n<template>\n <div\n ref=\"rootRef\"\n :class=\"[!props.unstyled && 'sg-chart sg-chart-line', props.className]\"\n :style=\"{\n width: typeof props.width === 'number' ? `${props.width}px` : props.width,\n }\"\n :data-animate=\"animation.enabled ? 'on' : 'off'\"\n >\n <svg\n ref=\"svgRef\"\n :viewBox=\"`0 0 ${viewW} ${viewH}`\"\n :width=\"typeof props.width === 'number' ? props.width : '100%'\"\n :height=\"props.height\"\n role=\"img\"\n aria-label=\"Line chart\"\n @mousemove=\"crosshairEnabled ? handleSvgMouseMove($event) : undefined\"\n @mouseleave=\"crosshairEnabled ? handleSvgMouseLeave() : undefined\"\n >\n <ChartAxes\n :x=\"plotX\"\n :y=\"plotY\"\n :plotW=\"plotW\"\n :plotH=\"plotH\"\n :categories=\"props.categories\"\n :yMin=\"bounds.min\"\n :yMax=\"bounds.max\"\n :xAxis=\"props.xAxis\"\n :yAxis=\"props.yAxis\"\n :unstyled=\"props.unstyled\"\n />\n <g class=\"sg-chart-line-paths\">\n <template v-for=\"ln in lineSegments\" :key=\"ln.id\">\n <path\n v-for=\"(seg, si) in ln.segments\"\n :key=\"`${ln.id}-${si}`\"\n :d=\"seg\"\n :stroke=\"ln.color\"\n :stroke-width=\"props.strokeWidth\"\n fill=\"none\"\n vector-effect=\"non-scaling-stroke\"\n :data-series-id=\"ln.id\"\n />\n </template>\n </g>\n <g v-if=\"props.markers\" class=\"sg-chart-line-markers\">\n <circle v-for=\"m in markerPoints\" :key=\"m.id\" :cx=\"m.x\" :cy=\"m.y\" r=\"3\" :fill=\"m.color\" />\n </g>\n <ChartCrosshair\n v-if=\"crosshairEnabled && hoverIdx !== null && crosshairPoints.length > 0\"\n :x=\"xCoord(hoverIdx)\"\n :plot-x=\"plotX\"\n :plot-y=\"plotY\"\n :plot-h=\"plotH\"\n :plot-w=\"plotW\"\n :category=\"props.categories[hoverIdx]\"\n :points=\"crosshairPoints\"\n :unstyled=\"props.unstyled\"\n :value-formatter=\"crosshairFmt\"\n />\n <ChartBrush\n v-if=\"brushConfig\"\n :plot-x=\"plotX\"\n :plot-y=\"plotY\"\n :plot-w=\"plotW\"\n :plot-h=\"plotH\"\n :category-count=\"props.categories.length\"\n :range=\"effectiveBrushRange\"\n :unstyled=\"props.unstyled\"\n :fill=\"brushConfig.fill\"\n :disabled=\"brushConfig.disabled\"\n @change=\"handleBrushChange\"\n />\n </svg>\n <ChartLegend v-if=\"props.legend\" :series=\"props.series\" :unstyled=\"props.unstyled\" />\n </div>\n</template>\n","<script setup lang=\"ts\">\r\nimport { ref, computed } from 'vue'\r\nimport { useChartSize } from '../../../composables/useChartSize'\r\nimport { printElement } from '../../../utils/print'\r\nimport {\r\n chartBounds,\r\n colorForSeries,\r\n normalizePadding,\r\n resolveChartAnimation,\r\n type BaseChartProps,\r\n} from './types'\r\nimport ChartLegend from './ChartLegend.vue'\r\nimport ChartAxes from './ChartAxes.vue'\r\n\r\ninterface BarChartProps extends BaseChartProps {\r\n /** Stack series instead of grouping them side-by-side. @default false */\r\n stacked?: boolean\r\n /** Bar corner radius. @default 0 */\r\n cornerRadius?: number\r\n}\r\n\r\nconst props = withDefaults(defineProps<BarChartProps>(), {\r\n width: '100%',\r\n height: 200,\r\n unstyled: false,\r\n legend: false,\r\n stacked: false,\r\n cornerRadius: 0,\r\n fileName: 'chart',\r\n})\r\n\r\nconst rootRef = ref<HTMLDivElement | null>(null)\r\nconst svgRef = ref<SVGSVGElement | null>(null)\r\nconst fallbackW = computed(() =>\r\n typeof props.width === 'number' && Number.isFinite(props.width) ? props.width : 600,\r\n)\r\nconst fallbackH = computed(() =>\r\n typeof props.height === 'number' && Number.isFinite(props.height) ? props.height : 200,\r\n)\r\nconst { size } = useChartSize(svgRef, { width: fallbackW.value, height: fallbackH.value })\r\nconst padding = computed(() => normalizePadding(props.padding))\r\n\r\nconst viewW = computed(() => size.value.width)\r\nconst viewH = computed(() => size.value.height)\r\nconst plotX = computed(() => padding.value[3])\r\nconst plotY = computed(() => padding.value[0])\r\nconst plotW = computed(() => Math.max(0, viewW.value - padding.value[3] - padding.value[1]))\r\nconst plotH = computed(() => Math.max(0, viewH.value - padding.value[0] - padding.value[2]))\r\n\r\nconst animation = computed(() => resolveChartAnimation(props.animate))\r\n\r\nconst seriesValues = computed(() => props.series.map((s) => s.values))\r\n\r\nconst stackedTotals = computed(() => {\r\n if (!props.stacked) return null\r\n const totals: number[] = props.categories.map((_, i) => {\r\n let sum = 0\r\n for (const sv of seriesValues.value) {\r\n const v = sv[i]\r\n if (v != null) sum += v\r\n }\r\n return sum\r\n })\r\n return totals\r\n})\r\n\r\nconst bounds = computed(() => {\r\n if (props.stacked && stackedTotals.value) {\r\n const max = Math.max(0, ...stackedTotals.value)\r\n return { min: 0, max: max === 0 ? 1 : max }\r\n }\r\n const { min, max } = chartBounds(seriesValues.value)\r\n return { min: Math.min(0, min), max: Math.max(0, max) }\r\n})\r\n\r\nconst yCoord = (v: number) => {\r\n const { min, max } = bounds.value\r\n if (max === min) return plotY.value + plotH.value / 2\r\n return plotY.value + plotH.value * (1 - (v - min) / (max - min))\r\n}\r\n\r\nconst bars = computed(() => {\r\n const cats = props.categories.length\r\n if (cats === 0) return []\r\n const groupWidth = plotW.value / cats\r\n const innerPad = 0.1\r\n const groupBox = groupWidth * (1 - innerPad)\r\n const groupOffset = (groupWidth - groupBox) / 2\r\n\r\n const result: Array<{\r\n seriesId: string\r\n label: string\r\n color: string\r\n x: number\r\n y: number\r\n width: number\r\n height: number\r\n rx: number\r\n categoryIndex: number\r\n }> = []\r\n\r\n if (props.stacked) {\r\n for (let ci = 0; ci < cats; ci++) {\r\n let acc = 0\r\n for (let si = 0; si < props.series.length; si++) {\r\n const s = props.series[si]\r\n const v = s.values[ci]\r\n if (v == null) continue\r\n const baseY = yCoord(acc)\r\n const topY = yCoord(acc + v)\r\n const x = plotX.value + ci * groupWidth + groupOffset\r\n const w = groupBox\r\n const yTop = Math.min(baseY, topY)\r\n const h = Math.abs(baseY - topY)\r\n result.push({\r\n seriesId: s.id,\r\n label: s.label,\r\n color: colorForSeries(s, si),\r\n x,\r\n y: yTop,\r\n width: w,\r\n height: h,\r\n rx: props.cornerRadius,\r\n categoryIndex: ci,\r\n })\r\n acc += v\r\n }\r\n }\r\n } else {\r\n const seriesCount = Math.max(1, props.series.length)\r\n const barWidth = groupBox / seriesCount\r\n for (let ci = 0; ci < cats; ci++) {\r\n for (let si = 0; si < props.series.length; si++) {\r\n const s = props.series[si]\r\n const v = s.values[ci]\r\n if (v == null) continue\r\n const x = plotX.value + ci * groupWidth + groupOffset + si * barWidth\r\n const baseY = yCoord(0)\r\n const topY = yCoord(v)\r\n const yTop = Math.min(baseY, topY)\r\n const h = Math.abs(baseY - topY)\r\n result.push({\r\n seriesId: s.id,\r\n label: s.label,\r\n color: colorForSeries(s, si),\r\n x,\r\n y: yTop,\r\n width: barWidth * 0.95,\r\n height: h,\r\n rx: props.cornerRadius,\r\n categoryIndex: ci,\r\n })\r\n }\r\n }\r\n }\r\n return result\r\n})\r\n\r\ndefineExpose({\r\n print: (opts: { fileName?: string } = {}) => {\r\n const el = rootRef.value\r\n if (!el) return\r\n printElement(el, { fileName: opts.fileName ?? props.fileName ?? 'chart' })\r\n },\r\n exportSvg: () => {\r\n const svg = svgRef.value\r\n if (!svg) return null\r\n return new XMLSerializer().serializeToString(svg)\r\n },\r\n})\r\n</script>\r\n\r\n<template>\r\n <div\r\n ref=\"rootRef\"\r\n :class=\"[!props.unstyled && 'sg-chart sg-chart-bar', props.className]\"\r\n :style=\"{ width: typeof props.width === 'number' ? `${props.width}px` : props.width }\"\r\n :data-animate=\"animation.enabled ? 'on' : 'off'\"\r\n >\r\n <svg\r\n ref=\"svgRef\"\r\n :viewBox=\"`0 0 ${viewW} ${viewH}`\"\r\n :width=\"typeof props.width === 'number' ? props.width : '100%'\"\r\n :height=\"props.height\"\r\n role=\"img\"\r\n aria-label=\"Bar chart\"\r\n >\r\n <ChartAxes\r\n :x=\"plotX\"\r\n :y=\"plotY\"\r\n :plotW=\"plotW\"\r\n :plotH=\"plotH\"\r\n :categories=\"props.categories\"\r\n :yMin=\"bounds.min\"\r\n :yMax=\"bounds.max\"\r\n :xAxis=\"props.xAxis\"\r\n :yAxis=\"props.yAxis\"\r\n :unstyled=\"props.unstyled\"\r\n />\r\n <g class=\"sg-chart-bars\">\r\n <rect\r\n v-for=\"(b, i) in bars\"\r\n :key=\"`${b.seriesId}-${b.categoryIndex}-${i}`\"\r\n :x=\"b.x\"\r\n :y=\"b.y\"\r\n :width=\"b.width\"\r\n :height=\"b.height\"\r\n :rx=\"b.rx\"\r\n :ry=\"b.rx\"\r\n :fill=\"b.color\"\r\n :data-series-id=\"b.seriesId\"\r\n >\r\n <title>{{ b.label }}: {{ props.series[b.seriesId === b.seriesId ? 0 : 0]?.values[b.categoryIndex] }}</title>\r\n </rect>\r\n </g>\r\n </svg>\r\n <ChartLegend v-if=\"props.legend\" :series=\"props.series\" :unstyled=\"props.unstyled\" />\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\nimport { ref, computed } from 'vue'\nimport { useChartSize } from '../../../composables/useChartSize'\nimport { printElement } from '../../../utils/print'\nimport {\n chartBounds,\n colorForSeries,\n normalizePadding,\n resolveChartAnimation,\n type BaseChartProps,\n} from './types'\nimport ChartLegend from './ChartLegend.vue'\nimport ChartAxes from './ChartAxes.vue'\nimport ChartBrush, {\n resolveBrushConfig,\n type ChartBrushConfig,\n type ChartBrushRange,\n} from './ChartBrush.vue'\n\ninterface AreaChartProps extends BaseChartProps {\n /** Stack series cumulatively. @default false */\n stacked?: boolean\n /** Fill opacity 0..1. @default 0.3 */\n fillOpacity?: number\n /** Stroke width. @default 2 */\n strokeWidth?: number\n /**\n * Brush for drag-selecting an X range. `true` — uncontrolled with empty\n * starting value; object — `ChartBrushConfig`.\n */\n brush?: boolean | ChartBrushConfig\n}\n\nconst props = withDefaults(defineProps<AreaChartProps>(), {\n width: '100%',\n height: 200,\n unstyled: false,\n legend: false,\n stacked: false,\n fillOpacity: 0.3,\n strokeWidth: 2,\n fileName: 'chart',\n})\n\nconst rootRef = ref<HTMLDivElement | null>(null)\nconst svgRef = ref<SVGSVGElement | null>(null)\nconst fallbackW = computed(() =>\n typeof props.width === 'number' && Number.isFinite(props.width) ? props.width : 600,\n)\nconst fallbackH = computed(() =>\n typeof props.height === 'number' && Number.isFinite(props.height) ? props.height : 200,\n)\nconst { size } = useChartSize(svgRef, { width: fallbackW.value, height: fallbackH.value })\nconst padding = computed(() => normalizePadding(props.padding))\n\nconst viewW = computed(() => size.value.width)\nconst viewH = computed(() => size.value.height)\nconst plotX = computed(() => padding.value[3])\nconst plotY = computed(() => padding.value[0])\nconst plotW = computed(() => Math.max(0, viewW.value - padding.value[3] - padding.value[1]))\nconst plotH = computed(() => Math.max(0, viewH.value - padding.value[0] - padding.value[2]))\n\nconst animation = computed(() => resolveChartAnimation(props.animate))\n\nconst stackedValues = computed(() => {\n if (!props.stacked) return null\n const stacks: number[][] = props.series.map(() => props.categories.map(() => 0))\n for (let ci = 0; ci < props.categories.length; ci++) {\n let acc = 0\n for (let si = 0; si < props.series.length; si++) {\n const v = props.series[si].values[ci]\n if (v == null) {\n stacks[si][ci] = acc\n } else {\n acc += v\n stacks[si][ci] = acc\n }\n }\n }\n return stacks\n})\n\nconst bounds = computed(() => {\n if (props.stacked && stackedValues.value) {\n const last = stackedValues.value[stackedValues.value.length - 1]\n const max = Math.max(0, ...last)\n return { min: 0, max: max === 0 ? 1 : max }\n }\n const { min, max } = chartBounds(props.series.map((s) => s.values))\n return { min: Math.min(0, min), max: Math.max(0, max) }\n})\n\nconst xCoord = (i: number) => {\n const n = props.categories.length\n if (n <= 1) return plotX.value\n return plotX.value + (plotW.value * i) / (n - 1)\n}\n\nconst yCoord = (v: number) => {\n const { min, max } = bounds.value\n if (max === min) return plotY.value + plotH.value / 2\n return plotY.value + plotH.value * (1 - (v - min) / (max - min))\n}\n\nconst baselineY = computed(() => yCoord(0))\n\nconst areaPaths = computed(() =>\n props.series.map((s, si) => {\n const color = colorForSeries(s, si)\n const upper: { x: number; y: number }[] = []\n const lower: { x: number; y: number }[] = []\n\n for (let ci = 0; ci < props.categories.length; ci++) {\n let topV: number | null\n let bottomY = baselineY.value\n if (props.stacked && stackedValues.value) {\n const cur = stackedValues.value[si][ci]\n const prev = si > 0 ? stackedValues.value[si - 1][ci] : 0\n topV = cur\n bottomY = yCoord(prev)\n } else {\n topV = s.values[ci] ?? null\n }\n if (topV == null) continue\n upper.push({ x: xCoord(ci), y: yCoord(topV) })\n lower.push({ x: xCoord(ci), y: bottomY })\n }\n if (upper.length === 0) return { id: s.id, color, label: s.label, areaPath: '', linePath: '' }\n const linePath = upper.map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x},${p.y}`).join(' ')\n const reversedLower = [...lower].reverse()\n const areaPath = `${linePath} ${reversedLower.map((p) => `L${p.x},${p.y}`).join(' ')} Z`\n return { id: s.id, color, label: s.label, areaPath, linePath }\n }),\n)\n\nconst brushConfig = computed(() => resolveBrushConfig(props.brush))\nconst isBrushControlled = computed(() => brushConfig.value != null && 'range' in brushConfig.value)\nconst internalBrushRange = ref<ChartBrushRange | null>(brushConfig.value?.defaultRange ?? null)\nconst effectiveBrushRange = computed<ChartBrushRange | null>(() =>\n isBrushControlled.value ? (brushConfig.value!.range ?? null) : internalBrushRange.value,\n)\nfunction handleBrushChange(next: ChartBrushRange | null) {\n if (!isBrushControlled.value) internalBrushRange.value = next\n brushConfig.value?.onRangeChange?.(next)\n}\n\ndefineExpose({\n print: (opts: { fileName?: string } = {}) => {\n const el = rootRef.value\n if (!el) return\n printElement(el, { fileName: opts.fileName ?? props.fileName ?? 'chart' })\n },\n exportSvg: () => {\n const svg = svgRef.value\n if (!svg) return null\n return new XMLSerializer().serializeToString(svg)\n },\n})\n</script>\n\n<template>\n <div\n ref=\"rootRef\"\n :class=\"[!props.unstyled && 'sg-chart sg-chart-area', props.className]\"\n :style=\"{ width: typeof props.width === 'number' ? `${props.width}px` : props.width }\"\n :data-animate=\"animation.enabled ? 'on' : 'off'\"\n >\n <svg\n ref=\"svgRef\"\n :viewBox=\"`0 0 ${viewW} ${viewH}`\"\n :width=\"typeof props.width === 'number' ? props.width : '100%'\"\n :height=\"props.height\"\n role=\"img\"\n aria-label=\"Area chart\"\n >\n <ChartAxes\n :x=\"plotX\"\n :y=\"plotY\"\n :plotW=\"plotW\"\n :plotH=\"plotH\"\n :categories=\"props.categories\"\n :yMin=\"bounds.min\"\n :yMax=\"bounds.max\"\n :xAxis=\"props.xAxis\"\n :yAxis=\"props.yAxis\"\n :unstyled=\"props.unstyled\"\n />\n <g class=\"sg-chart-area-paths\">\n <path\n v-for=\"a in areaPaths\"\n :key=\"`${a.id}-area`\"\n :d=\"a.areaPath\"\n :fill=\"a.color\"\n :fill-opacity=\"props.fillOpacity\"\n :data-series-id=\"a.id\"\n />\n <path\n v-for=\"a in areaPaths\"\n :key=\"`${a.id}-line`\"\n :d=\"a.linePath\"\n :stroke=\"a.color\"\n :stroke-width=\"props.strokeWidth\"\n fill=\"none\"\n vector-effect=\"non-scaling-stroke\"\n />\n </g>\n <ChartBrush\n v-if=\"brushConfig\"\n :plot-x=\"plotX\"\n :plot-y=\"plotY\"\n :plot-w=\"plotW\"\n :plot-h=\"plotH\"\n :category-count=\"props.categories.length\"\n :range=\"effectiveBrushRange\"\n :unstyled=\"props.unstyled\"\n :fill=\"brushConfig.fill\"\n :disabled=\"brushConfig.disabled\"\n @change=\"handleBrushChange\"\n />\n </svg>\n <ChartLegend v-if=\"props.legend\" :series=\"props.series\" :unstyled=\"props.unstyled\" />\n </div>\n</template>\n","<script setup lang=\"ts\">\r\nimport { ref, computed } from 'vue'\r\nimport { useChartSize } from '../../../composables/useChartSize'\r\nimport { printElement } from '../../../utils/print'\r\nimport {\r\n colorForSeries,\r\n resolveChartAnimation,\r\n type BaseChartProps,\r\n} from './types'\r\nimport ChartLegend from './ChartLegend.vue'\r\n\r\ninterface PieChartProps extends Omit<BaseChartProps, 'xAxis' | 'yAxis' | 'padding'> {\r\n /** Inner radius for donut effect, 0..1 fraction of outer radius. @default 0 */\r\n innerRadius?: number\r\n /** Render slice labels inside slices. @default false */\r\n labels?: boolean\r\n}\r\n\r\nconst props = withDefaults(defineProps<PieChartProps>(), {\r\n width: '100%',\r\n height: 240,\r\n unstyled: false,\r\n legend: false,\r\n innerRadius: 0,\r\n labels: false,\r\n fileName: 'chart',\r\n})\r\n\r\nconst rootRef = ref<HTMLDivElement | null>(null)\r\nconst svgRef = ref<SVGSVGElement | null>(null)\r\nconst fallbackW = computed(() =>\r\n typeof props.width === 'number' && Number.isFinite(props.width) ? props.width : 320,\r\n)\r\nconst fallbackH = computed(() =>\r\n typeof props.height === 'number' && Number.isFinite(props.height) ? props.height : 240,\r\n)\r\nconst { size } = useChartSize(svgRef, { width: fallbackW.value, height: fallbackH.value })\r\n\r\nconst viewW = computed(() => size.value.width)\r\nconst viewH = computed(() => size.value.height)\r\nconst cx = computed(() => viewW.value / 2)\r\nconst cy = computed(() => viewH.value / 2)\r\nconst radius = computed(() => Math.max(0, Math.min(viewW.value, viewH.value) / 2 - 8))\r\nconst innerR = computed(() => Math.max(0, Math.min(0.95, props.innerRadius)) * radius.value)\r\n\r\nconst animation = computed(() => resolveChartAnimation(props.animate))\r\n\r\ninterface Slice {\r\n id: string\r\n label: string\r\n color: string\r\n value: number\r\n start: number\r\n end: number\r\n midAngle: number\r\n path: string\r\n}\r\n\r\nconst total = computed(() => {\r\n let sum = 0\r\n for (const s of props.series) {\r\n const first = s.values[0]\r\n if (first != null && first > 0) sum += first\r\n }\r\n return sum\r\n})\r\n\r\nfunction describeSlice(start: number, end: number): string {\r\n const r = radius.value\r\n const ir = innerR.value\r\n const x1 = cx.value + Math.cos(start) * r\r\n const y1 = cy.value + Math.sin(start) * r\r\n const x2 = cx.value + Math.cos(end) * r\r\n const y2 = cy.value + Math.sin(end) * r\r\n const largeArc = end - start > Math.PI ? 1 : 0\r\n if (ir <= 0) {\r\n return `M${cx.value},${cy.value} L${x1},${y1} A${r},${r} 0 ${largeArc} 1 ${x2},${y2} Z`\r\n }\r\n const ix1 = cx.value + Math.cos(end) * ir\r\n const iy1 = cy.value + Math.sin(end) * ir\r\n const ix2 = cx.value + Math.cos(start) * ir\r\n const iy2 = cy.value + Math.sin(start) * ir\r\n return [\r\n `M${x1},${y1}`,\r\n `A${r},${r} 0 ${largeArc} 1 ${x2},${y2}`,\r\n `L${ix1},${iy1}`,\r\n `A${ir},${ir} 0 ${largeArc} 0 ${ix2},${iy2}`,\r\n 'Z',\r\n ].join(' ')\r\n}\r\n\r\nconst slices = computed<Slice[]>(() => {\r\n const t = total.value\r\n if (t === 0) return []\r\n let acc = -Math.PI / 2\r\n const result: Slice[] = []\r\n for (let i = 0; i < props.series.length; i++) {\r\n const s = props.series[i]\r\n const v = s.values[0] ?? 0\r\n if (!v || v <= 0) continue\r\n const span = (v / t) * Math.PI * 2\r\n const start = acc\r\n const end = acc + span\r\n result.push({\r\n id: s.id,\r\n label: s.label,\r\n value: v,\r\n color: colorForSeries(s, i),\r\n start,\r\n end,\r\n midAngle: start + span / 2,\r\n path: describeSlice(start, end),\r\n })\r\n acc = end\r\n }\r\n return result\r\n})\r\n\r\ndefineExpose({\r\n print: (opts: { fileName?: string } = {}) => {\r\n const el = rootRef.value\r\n if (!el) return\r\n printElement(el, { fileName: opts.fileName ?? props.fileName ?? 'chart' })\r\n },\r\n exportSvg: () => {\r\n const svg = svgRef.value\r\n if (!svg) return null\r\n return new XMLSerializer().serializeToString(svg)\r\n },\r\n})\r\n</script>\r\n\r\n<template>\r\n <div\r\n ref=\"rootRef\"\r\n :class=\"[!props.unstyled && 'sg-chart sg-chart-pie', props.className]\"\r\n :style=\"{ width: typeof props.width === 'number' ? `${props.width}px` : props.width }\"\r\n :data-animate=\"animation.enabled ? 'on' : 'off'\"\r\n >\r\n <svg\r\n ref=\"svgRef\"\r\n :viewBox=\"`0 0 ${viewW} ${viewH}`\"\r\n :width=\"typeof props.width === 'number' ? props.width : '100%'\"\r\n :height=\"props.height\"\r\n role=\"img\"\r\n aria-label=\"Pie chart\"\r\n >\r\n <g class=\"sg-chart-pie-slices\">\r\n <path\r\n v-for=\"s in slices\"\r\n :key=\"s.id\"\r\n :d=\"s.path\"\r\n :fill=\"s.color\"\r\n :data-series-id=\"s.id\"\r\n >\r\n <title>{{ s.label }}: {{ s.value }}</title>\r\n </path>\r\n <text\r\n v-for=\"s in slices\"\r\n v-if=\"props.labels\"\r\n :key=\"`${s.id}-label`\"\r\n :x=\"cx + Math.cos(s.midAngle) * (radius * 0.7)\"\r\n :y=\"cy + Math.sin(s.midAngle) * (radius * 0.7)\"\r\n text-anchor=\"middle\"\r\n dominant-baseline=\"middle\"\r\n font-size=\"11\"\r\n fill=\"#fff\"\r\n >\r\n {{ Math.round((s.value / total) * 100) }}%\r\n </text>\r\n </g>\r\n </svg>\r\n <ChartLegend v-if=\"props.legend\" :series=\"props.series\" :unstyled=\"props.unstyled\" />\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\n/**\n * Floating chart-toolbar overlay — Vue port of React's `ChartHoverToolbar`.\n *\n * Same visual contract: positioned at the chart's top-right, animated by\n * the parent through `data-sg-toolbar=\"visible|hidden\"`. The wrapper has\n * `pointer-events: none`, buttons re-enable `pointer-events: auto`.\n *\n * Action icons cross the framework boundary as Vue VNodes / functional\n * components instead of `ReactNode`. The default factory `defaultChartActions`\n * (below) returns the same set of actions (`print`, `downloadSvg`,\n * `downloadPng`, optional `resetBrush`) using `h(...)` for the icons —\n * see `decisions/T-Vue-Charts.md` D1.\n */\nimport { computed, type CSSProperties } from 'vue'\nimport type { ChartAction } from './chartActions'\n\nexport interface ChartHoverToolbarProps {\n /** Whether the toolbar is currently visible (parent toggles on hover/focus). */\n visible: boolean\n /** Buttons to render. */\n actions: readonly ChartAction[]\n /** Base file name (no extension) for export / print actions. */\n fileName?: string\n /** Returns the chart's current `<svg>` element (called per click). */\n getSvg: () => SVGSVGElement | null\n /** Reset the chart's brush (only set when brush is active). */\n brushReset?: () => void\n /** Toggle the chart legend (userland decides when to provide it). */\n toggleLegend?: () => void\n /** Drop the default `sg-chart-toolbar*` classes. */\n unstyled?: boolean\n /** Optional inline style on the wrapper. */\n style?: CSSProperties\n}\n\nconst props = defineProps<ChartHoverToolbarProps>()\n\nconst visibleActions = computed(() => props.actions.filter((a) => !a.hidden))\n\nfunction onButtonClick(a: ChartAction, e: MouseEvent) {\n e.stopPropagation()\n const svg = props.getSvg()\n if (!svg) return\n a.onClick({\n svg,\n fileName: props.fileName,\n brushReset: props.brushReset,\n toggleLegend: props.toggleLegend,\n })\n}\n</script>\n\n<template>\n <div\n v-if=\"visibleActions.length > 0\"\n :class=\"props.unstyled ? undefined : 'sg-chart-toolbar'\"\n :style=\"props.style\"\n data-sg-chart-toolbar=\"\"\n :data-sg-toolbar=\"props.visible ? 'visible' : 'hidden'\"\n role=\"toolbar\"\n aria-label=\"Chart actions\"\n :aria-hidden=\"props.visible ? undefined : true\"\n >\n <button\n v-for=\"a in visibleActions\"\n :key=\"a.id\"\n type=\"button\"\n :class=\"props.unstyled ? undefined : 'sg-chart-toolbar-button'\"\n :data-sg-action=\"a.id\"\n :aria-label=\"a.label\"\n :title=\"a.label\"\n :tabindex=\"props.visible ? 0 : -1\"\n @click=\"(e) => onButtonClick(a, e)\"\n >\n <component :is=\"a.icon\" />\n </button>\n </div>\n</template>\n","/**\n * SVG-chart export utilities — Vue port of React's `chartExport.ts`.\n *\n * 1:1 with `packages/react/src/components/complex/Charts/chartExport.ts`.\n * Pure DOM, no React, no Vue — works in any browser-like environment that\n * provides `XMLSerializer`, `URL.createObjectURL`, `Image`, and `<canvas>`.\n *\n * Same exports, same names, same shapes — see CHARTER §9 (API parity).\n */\n\nconst SVG_NS = 'http://www.w3.org/2000/svg'\nconst XLINK_NS = 'http://www.w3.org/1999/xlink'\n\n/** Output PNG size in CSS pixels. */\nexport interface PngSize {\n /** Width in CSS pixels. */\n width: number\n /** Height in CSS pixels. */\n height: number\n}\n\n/** Options accepted by `downloadSvgAsPng`. */\nexport interface DownloadPngOptions {\n /** File name (with or without `.png` suffix). @default 'chart.png' */\n fileName?: string\n /**\n * Pixel-density multiplier. Defaults to `window.devicePixelRatio` (or `2`\n * when there is no `window`). The file gets `width × scale` pixels but\n * still displays at `width` CSS pixels.\n */\n scale?: number\n /** Background fill. Default is `transparent`. */\n background?: string\n}\n\n/**\n * Serialise an `<svg>` element to a string with inline `width` / `height`\n * and explicit XML namespaces. The original element is **not** mutated —\n * we work off a deep clone.\n */\nexport function serializeSvg(svg: SVGSVGElement, size?: PngSize): string {\n const clone = svg.cloneNode(true) as SVGSVGElement\n if (!clone.getAttribute('xmlns')) clone.setAttribute('xmlns', SVG_NS)\n if (!clone.getAttribute('xmlns:xlink')) clone.setAttribute('xmlns:xlink', XLINK_NS)\n if (size) {\n clone.setAttribute('width', String(size.width))\n clone.setAttribute('height', String(size.height))\n }\n return new XMLSerializer().serializeToString(clone)\n}\n\n/** Trigger a download of `blob` as `fileName` via a hidden `<a>` element. */\nexport function triggerDownload(blob: Blob, fileName: string): void {\n if (typeof document === 'undefined' || typeof URL === 'undefined') return\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = fileName\n // Some browsers require the anchor to be in the DOM before `click()`.\n a.style.display = 'none'\n document.body.appendChild(a)\n a.click()\n document.body.removeChild(a)\n // Defer revoke so in-flight requests can still resolve the URL.\n setTimeout(() => {\n try {\n URL.revokeObjectURL(url)\n } catch {\n // ignore\n }\n }, 100)\n}\n\nfunction ensureExt(name: string, ext: string): string {\n return name.endsWith(`.${ext}`) ? name : `${name}.${ext}`\n}\n\n/** Measure an SVG: real DOM size → viewBox → fallback (`600 × 400`). */\nexport function measureSvg(svg: SVGSVGElement): PngSize {\n const r = svg.getBoundingClientRect?.()\n let width = r && r.width > 0 ? r.width : 0\n let height = r && r.height > 0 ? r.height : 0\n if (width <= 0 || height <= 0) {\n const vb = svg.viewBox?.baseVal\n if (vb && vb.width > 0 && vb.height > 0) {\n width = vb.width\n height = vb.height\n } else {\n const attr = svg.getAttribute('viewBox')\n if (attr) {\n const parts = attr.trim().split(/\\s+/)\n const w = Number.parseFloat(parts[2] ?? '')\n const h = Number.parseFloat(parts[3] ?? '')\n if (Number.isFinite(w) && w > 0) width = w\n if (Number.isFinite(h) && h > 0) height = h\n }\n }\n }\n if (!(width > 0)) width = 600\n if (!(height > 0)) height = 400\n return { width: Math.round(width), height: Math.round(height) }\n}\n\n/**\n * Download the current SVG chart as a `.svg` file with explicit\n * `width` / `height` attributes so it opens cleanly in any viewer.\n */\nexport function downloadSvg(svg: SVGSVGElement, fileName = 'chart.svg'): void {\n const size = measureSvg(svg)\n const xml = serializeSvg(svg, size)\n const blob = new Blob([xml], { type: 'image/svg+xml;charset=utf-8' })\n triggerDownload(blob, ensureExt(fileName, 'svg'))\n}\n\n/**\n * Convert an SVG chart to PNG via a browser `<canvas>` and download it.\n *\n * Strategy:\n * 1. Serialise SVG → object-URL.\n * 2. Decode through an `Image` (the browser rasterises the SVG).\n * 3. Draw onto a `<canvas>` with devicePixelRatio scale.\n * 4. `canvas.toBlob('image/png')` → trigger download.\n */\nexport function downloadSvgAsPng(\n svg: SVGSVGElement,\n fileNameOrOpts: string | DownloadPngOptions = 'chart.png',\n): Promise<void> {\n const opts: DownloadPngOptions =\n typeof fileNameOrOpts === 'string' ? { fileName: fileNameOrOpts } : fileNameOrOpts\n const fileName = ensureExt(opts.fileName ?? 'chart.png', 'png')\n const size = measureSvg(svg)\n const scale = opts.scale ?? (typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 2)\n const xml = serializeSvg(svg, size)\n const blob = new Blob([xml], { type: 'image/svg+xml;charset=utf-8' })\n const url = URL.createObjectURL(blob)\n\n return new Promise<void>((resolve, reject) => {\n const img = new Image()\n img.decoding = 'async'\n img.onload = () => {\n try {\n const canvas = document.createElement('canvas')\n canvas.width = Math.max(1, Math.round(size.width * scale))\n canvas.height = Math.max(1, Math.round(size.height * scale))\n const ctx = canvas.getContext('2d')\n if (!ctx) {\n URL.revokeObjectURL(url)\n reject(new Error('Canvas 2D context unavailable'))\n return\n }\n ctx.scale(scale, scale)\n if (opts.background) {\n ctx.fillStyle = opts.background\n ctx.fillRect(0, 0, size.width, size.height)\n }\n ctx.drawImage(img, 0, 0, size.width, size.height)\n URL.revokeObjectURL(url)\n canvas.toBlob((pngBlob) => {\n if (!pngBlob) {\n reject(new Error('canvas.toBlob produced null'))\n return\n }\n triggerDownload(pngBlob, fileName)\n resolve()\n }, 'image/png')\n } catch (err) {\n URL.revokeObjectURL(url)\n reject(err instanceof Error ? err : new Error(String(err)))\n }\n }\n img.onerror = () => {\n URL.revokeObjectURL(url)\n reject(new Error('SVG image decoding failed'))\n }\n img.src = url\n })\n}\n","/**\n * Chart-action types + default action factory — Vue side.\n *\n * Mirrors `defaultChartActions` / `ChartAction` from the React adapter.\n * Icons cross the boundary as Vue VNodes (built via `h(...)`) instead of\n * `ReactNode`; everything else (ids, labels, click contracts) is identical.\n */\nimport { h, type VNode } from 'vue'\nimport { downloadSvg, downloadSvgAsPng } from './download'\nimport { printElement } from '../../../utils/print'\n\n/**\n * Context handed to `ChartAction.onClick`. Identical to React's\n * `ChartActionContext`.\n */\nexport interface ChartActionContext {\n /** Current SVG element of the chart. */\n svg: SVGSVGElement\n /** Base file name without extension (used for print / SVG / PNG). */\n fileName?: string\n /** Reset the active brush — only set when the chart has brush enabled. */\n brushReset?: () => void\n /** Toggle the legend — userland-provided. */\n toggleLegend?: () => void\n}\n\n/**\n * Declarative description of one toolbar button. The Vue equivalent of\n * `ReactNode` for the icon is a `VNode` (or any component-like value\n * accepted by `<component :is>`).\n */\nexport interface ChartAction {\n /** Unique id (lands in `data-sg-action`). */\n id: string\n /** Icon — Vue VNode (typically built with `h('svg', ...)`). */\n icon: VNode\n /** `aria-label` / `title`. */\n label: string\n /** Click handler — receives the action context. */\n onClick: (ctx: ChartActionContext) => void\n /** Hide the button without removing it from the array. */\n hidden?: boolean\n}\n\n/**\n * Accepted shapes for the chart-level `actions` prop:\n *\n * - `false` / `undefined` — no toolbar is rendered.\n * - `true` — the default set is used (`print` + SVG + PNG + `resetBrush`\n * when brush is active).\n * - `ChartAction[]` — caller-supplied set.\n */\nexport type ChartActionsProp = boolean | readonly ChartAction[]\n\n/**\n * Inline-SVG icon factory matching React's `IconStroke`. 16×16,\n * `currentColor`, 1.5px stroke, no fill.\n */\nfunction iconStroke(d: string, extra?: VNode | VNode[]): VNode {\n const children: (VNode | VNode[])[] = [h('path', { d })]\n if (extra) children.push(extra)\n return h(\n 'svg',\n {\n width: 16,\n height: 16,\n viewBox: '0 0 16 16',\n fill: 'none',\n stroke: 'currentColor',\n 'stroke-width': 1.5,\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n 'aria-hidden': 'true',\n },\n children,\n )\n}\n\nconst PRINT_ICON = (): VNode =>\n iconStroke('M4 6V2.5h8V6', [\n h('rect', { x: 3, y: 6, width: 10, height: 6, rx: 1 }),\n h('path', { d: 'M4.5 10h7v3.5h-7z' }),\n ])\n\nconst SVG_ICON = (): VNode =>\n iconStroke('M3 8.5v3.25A1.25 1.25 0 0 0 4.25 13h7.5A1.25 1.25 0 0 0 13 11.75V8.5', [\n h('path', { d: 'M8 2.5v7' }),\n h('path', { d: 'M5 6.5l3 3 3-3' }),\n ])\n\nconst PNG_ICON = (): VNode =>\n iconStroke('M2.5 3.5h11v9h-11z', [\n h('circle', { cx: 5.5, cy: 6.5, r: 0.9 }),\n h('path', { d: 'M2.5 11l3-3 2.5 2.5L10.5 8l3 3' }),\n ])\n\nconst RESET_ICON = (): VNode => iconStroke('M3 8a5 5 0 1 0 1.5-3.5', h('path', { d: 'M3 3v3h3' }))\n\n/**\n * Default toolbar actions (sugar for `actions={true}`). Same id / label\n * choice as React.\n */\nexport function defaultChartActions(opts: {\n /** Forwarded to `printElement` as `fileName`. */\n fileName?: string\n /** Adds the `resetBrush` button if provided. */\n brushReset?: () => void\n}): ChartAction[] {\n const list: ChartAction[] = [\n {\n id: 'print',\n label: 'Print',\n icon: PRINT_ICON(),\n onClick: ({ svg }) => {\n printElement(svg, opts.fileName ? { fileName: opts.fileName } : {})\n },\n },\n {\n id: 'downloadSvg',\n label: 'Download SVG',\n icon: SVG_ICON(),\n onClick: ({ svg, fileName }) => {\n downloadSvg(svg, `${fileName ?? 'chart'}.svg`)\n },\n },\n {\n id: 'downloadPng',\n label: 'Download PNG',\n icon: PNG_ICON(),\n onClick: ({ svg, fileName }) => {\n // Swallow decoding errors — the user simply gets no file; throwing\n // here would crash the chart.\n downloadSvgAsPng(svg, `${fileName ?? 'chart'}.png`).catch(() => {})\n },\n },\n ]\n if (opts.brushReset) {\n list.push({\n id: 'resetBrush',\n label: 'Reset zoom',\n icon: RESET_ICON(),\n onClick: ({ brushReset }) => brushReset?.(),\n })\n }\n return list\n}\n\n/**\n * Resolve the chart-level `actions` prop:\n *\n * - `false` / `undefined` → `null` (toolbar must not render)\n * - `true` → the default set (with optional `resetBrush` when `opts.brushReset` is set)\n * - `ChartAction[]` → returned as-is\n */\nexport function resolveChartActions(\n actions: ChartActionsProp | undefined,\n opts: { fileName?: string; brushReset?: () => void },\n): readonly ChartAction[] | null {\n if (!actions) return null\n if (actions === true) return defaultChartActions(opts)\n return actions\n}\n","/**\n * Chart context-menu factory utilities — Vue port of React's\n * `chartContextMenu.ts`. Same exports, same shapes, same suppression\n * contracts, but typed against the native DOM `MouseEvent` (Vue templates\n * receive the original DOM event, no React synthetic-event layer).\n */\n\n/**\n * Payload for series-level context menus (right-click on a line segment,\n * marker, bar, slice, or area path).\n */\nexport interface ChartSeriesContextMenuPayload {\n /** The original `ChartSeries.id` (or pie slice id). */\n seriesId: string\n /** Index of the series in the `series` array (0-based). For pies — the slice index. */\n seriesIndex: number\n /** X-axis category index (0-based). Undefined for chart-level pie events. */\n valueIndex?: number\n /** Numeric value at this point (when applicable). */\n value?: number\n}\n\n/**\n * Payload for chart-level context menus (right-click on empty plot area,\n * axes, or grid).\n */\nexport interface ChartContextMenuPayload {\n /** X in CSS pixels relative to the SVG. */\n x: number\n /** Y in CSS pixels relative to the SVG. */\n y: number\n /** X in SVG user-space (same as x for non-stretched SVGs). */\n plotX: number\n /** Y in SVG user-space. */\n plotY: number\n}\n\n/** Series context-menu callback signature. */\nexport type ChartSeriesContextMenuHandler = (\n event: MouseEvent,\n payload: ChartSeriesContextMenuPayload,\n) => void\n\n/** Chart-level context-menu callback signature. */\nexport type ChartContextMenuHandler = (event: MouseEvent, payload: ChartContextMenuPayload) => void\n\n/**\n * Build an `oncontextmenu` handler for a series visual (line segment /\n * marker / bar / area path / pie slice).\n *\n * - If `handler` is undefined, returns `undefined` (native browser menu\n * stays open).\n * - Otherwise calls `event.preventDefault()` + `event.stopPropagation()`\n * so the chart-level handler doesn't double-fire and the native menu\n * is suppressed.\n */\nexport function makeSeriesContextMenuHandler(\n handler: ChartSeriesContextMenuHandler | undefined,\n payload: ChartSeriesContextMenuPayload,\n): ((e: MouseEvent) => void) | undefined {\n if (!handler) return undefined\n return (e) => {\n e.preventDefault()\n e.stopPropagation()\n handler(e, payload)\n }\n}\n\n/**\n * Build an `oncontextmenu` handler for the SVG root (chart-level). If the\n * caller doesn't want a custom menu, returns `undefined` — the browser's\n * native menu stays untouched.\n */\nexport function makeChartContextMenuHandler(\n handler: ChartContextMenuHandler | undefined,\n): ((e: MouseEvent) => void) | undefined {\n if (!handler) return undefined\n return (e) => {\n e.preventDefault()\n const svg = e.currentTarget as SVGSVGElement | null\n if (!svg) return\n const rect = svg.getBoundingClientRect()\n const x = e.clientX - rect.left\n const y = e.clientY - rect.top\n // CSS-pixel → SVG user-space via the viewBox. For non-stretched SVGs\n // (our chart layout) the coordinates coincide.\n let plotX = x\n let plotY = y\n const vb = svg.viewBox?.baseVal\n if (vb && vb.width > 0 && vb.height > 0 && rect.width > 0 && rect.height > 0) {\n plotX = (x / rect.width) * vb.width\n plotY = (y / rect.height) * vb.height\n }\n handler(e, { x, y, plotX, plotY })\n }\n}\n","<script setup lang=\"ts\">\n/**\n * `<SgDiagram>` — Vue port of `@skygraph/react` `Diagram`. DOM, class\n * names, props and emitted events are kept 1:1 with the React component\n * (`packages/react/src/components/complex/Diagram/Diagram.tsx`) so a\n * consumer can swap frameworks without rewriting the surrounding code.\n *\n * For backwards compatibility with the v0 Vue API, the following props /\n * events still work as aliases (see `decisions/T-Diagram-Polish.md` D2):\n *\n * | Legacy | Modern (React parity) |\n * |-------------------------|------------------------------------------|\n * | `:draggable-nodes` | `:draggable` |\n * | `:pan-zoom` | `:panable` + `:zoomable` |\n * | `:selected-node-ids` | `:selection` |\n * | `@selection-change` | (still emitted, now also `selectionChange`) |\n */\nimport { computed, getCurrentInstance, onBeforeUnmount, ref, watch } from 'vue'\nimport {\n getBezierPath,\n nearestSide,\n pointsToPath,\n pointsToRoundedPath,\n routeOrthogonal,\n type AABB,\n type Anchor,\n type AnchorId,\n type EdgeEndpoint,\n type GraphEdge,\n type GraphEngine,\n type GraphNode,\n type NodeId,\n type Point,\n type Side,\n} from '@skygraph/core'\nimport { printElement } from '../../../utils/print'\nimport type { PrintOptions } from '../../../utils/print'\nimport type {\n DiagramCanvasContextPoint,\n DiagramDropPoint,\n DiagramEdgeAction,\n DiagramNodeAction,\n DiagramProps,\n} from './types'\n\nconst props = withDefaults(defineProps<DiagramProps>(), {\n width: '100%',\n height: 400,\n unstyled: false,\n // Defaults below match React (`Diagram.tsx`).\n draggable: false,\n zoomable: false,\n panable: false,\n routeAroundNodes: false,\n selectionMode: 'single',\n fileName: 'diagram',\n edgeArrows: true,\n // Legacy aliases default to undefined so we can detect \"explicitly set\".\n})\n\n/** Default corner radius for rounded orthogonal corners. */\nconst ORTHOGONAL_CORNER_RADIUS = 8\n/** Movement threshold (CSS px) before a pointer interaction counts as a drag. */\nconst DRAG_THRESHOLD_PX = 0.5\n\nconst emit = defineEmits<{\n (e: 'node-click', payload: { id: NodeId; node: GraphNode; event: MouseEvent }): void\n (e: 'selection-change', ids: NodeId[]): void\n (e: 'selectionChange', ids: NodeId[]): void\n (e: 'drop-node', point: DiagramDropPoint): void\n (e: 'dropNode', point: DiagramDropPoint): void\n (e: 'node-context-menu', payload: { event: MouseEvent; node: GraphNode }): void\n (e: 'edge-context-menu', payload: { event: MouseEvent; edge: GraphEdge }): void\n (e: 'canvas-context-menu', payload: { event: MouseEvent; point: DiagramCanvasContextPoint }): void\n}>()\n\ndefineSlots<{\n node?(props: { node: GraphNode }): unknown\n}>()\n\nconst rootRef = ref<HTMLDivElement | null>(null)\nconst canvasRef = ref<HTMLDivElement | null>(null)\n\n// ─── Legacy → modern prop reconciliation ───────────────────────────────────\nconst effectiveDraggable = computed<boolean | ((id: NodeId, x: number, y: number) => void)>(() => {\n if (typeof props.draggable === 'function') return props.draggable\n if (props.draggable) return true\n if (props.draggableNodes) return true\n return false\n})\nconst effectivePanable = computed<boolean>(() => props.panable || !!props.panZoom)\nconst effectiveZoomable = computed<boolean>(() => props.zoomable || !!props.panZoom)\n\n// ─── Selection (controlled / uncontrolled) ────────────────────────────────\nconst isControlled = computed(\n () => props.selection !== undefined || props.selectedNodeIds !== undefined,\n)\nconst controlledIds = computed<readonly NodeId[]>(\n () => (props.selection ?? props.selectedNodeIds ?? []) as readonly NodeId[],\n)\nconst internalSelection = ref<readonly NodeId[]>(props.defaultSelection ?? [])\nconst currentSelection = computed<readonly NodeId[]>(() =>\n isControlled.value ? controlledIds.value : internalSelection.value,\n)\nconst selectionSet = computed(() => new Set(currentSelection.value))\n\nfunction commitSelection(next: readonly NodeId[]) {\n if (selectionsEqual(currentSelection.value, next)) return\n const arr: NodeId[] = Array.isArray(next) ? (next as NodeId[]) : Array.from(next)\n if (!isControlled.value) internalSelection.value = arr\n emit('selection-change', arr)\n emit('selectionChange', arr)\n}\n\nfunction selectionsEqual(a: readonly NodeId[], b: readonly NodeId[]): boolean {\n if (a === b) return true\n if (a.length !== b.length) return false\n const sa = new Set(a)\n for (const id of b) if (!sa.has(id)) return false\n return true\n}\n\n// Drop dropped/removed ids from the internal selection.\nwatch(\n () => props.state,\n (s) => {\n if (isControlled.value) return\n const filtered = internalSelection.value.filter((id) => s.nodes.has(id))\n if (filtered.length !== internalSelection.value.length) {\n internalSelection.value = filtered\n emit('selection-change', filtered as NodeId[])\n emit('selectionChange', filtered as NodeId[])\n }\n },\n)\n\n// ─── View (pan / zoom) ─────────────────────────────────────────────────────\nconst view = ref({ panX: 0, panY: 0, zoom: 1 })\n\n// ─── Graph snapshots ──────────────────────────────────────────────────────\nconst nodes = computed<GraphNode[]>(() => Array.from(props.state.nodes.values()))\nconst edges = computed<GraphEdge[]>(() => Array.from(props.state.edges.values()))\n\nconst allBounds = computed<AABB[]>(() => nodes.value.map((n) => props.graph.boundsOf(n.id)))\nconst boundsById = computed<Map<NodeId, AABB>>(() => {\n const m = new Map<NodeId, AABB>()\n nodes.value.forEach((n, i) => m.set(n.id, allBounds.value[i]!))\n return m\n})\n\n// ─── Edge geometry ─────────────────────────────────────────────────────────\n\nfunction localOriginOffset(node: GraphNode): { x: number; y: number } {\n const o = node.outline\n if (o.kind === 'ellipse') return { x: -o.rx, y: -o.ry }\n return { x: 0, y: 0 }\n}\n\nfunction resolveAnchor(\n g: GraphEngine,\n nodeId: NodeId,\n refer: AnchorId | { s: number },\n): Anchor | null {\n const anchors = g.anchorsOf(nodeId)\n if (typeof refer === 'string') {\n return anchors.find((a) => a.id === refer) ?? null\n }\n let best: Anchor | null = null\n let bestDiff = Infinity\n for (const a of anchors) {\n const diff = Math.abs(a.s - refer.s)\n if (diff < bestDiff) {\n bestDiff = diff\n best = a\n }\n }\n return best\n}\n\nfunction endpointWorldPoint(g: GraphEngine, ep: EdgeEndpoint): Point | null {\n const node = g.getNode(ep.node)\n if (!node) return null\n const a = resolveAnchor(g, ep.node, ep.anchor)\n if (!a) return null\n const b = g.boundsOf(ep.node)\n const off = localOriginOffset(node)\n return [b.x + (a.point[0] - off.x), b.y + (a.point[1] - off.y)]\n}\n\nfunction buildEdgePath(\n edge: GraphEdge,\n start: Point,\n end: Point,\n obstacles: readonly AABB[] | undefined,\n sourceBounds: AABB | undefined,\n targetBounds: AABB | undefined,\n): string {\n switch (edge.routing) {\n case 'orthogonal': {\n const pts = routeOrthogonal(start, end, {\n obstacles,\n gridSize: props.routingOptions?.gridSize,\n inflate: props.routingOptions?.inflate,\n maxNodes: props.routingOptions?.maxNodes,\n sourceBounds,\n targetBounds,\n })\n return pointsToRoundedPath(\n pts,\n props.routingOptions?.cornerRadius ?? ORTHOGONAL_CORNER_RADIUS,\n )\n }\n case 'bezier': {\n const sourceSide: Side = sourceBounds ? nearestSide(sourceBounds, end) : 'right'\n const targetSide: Side = targetBounds ? nearestSide(targetBounds, start) : 'left'\n return getBezierPath({\n source: start,\n sourceSide,\n target: end,\n targetSide,\n curvature: props.routingOptions?.curvature,\n })\n }\n case 'manual': {\n const wp = edge.waypoints ?? []\n return pointsToPath([start, ...wp, end])\n }\n case 'straight':\n default:\n return `M ${start[0]} ${start[1]} L ${end[0]} ${end[1]}`\n }\n}\n\ninterface RenderedEdge {\n id: string\n d: string\n routing: GraphEdge['routing']\n mid: { x: number; y: number } | null\n raw: GraphEdge\n}\n\nconst renderedEdges = computed<RenderedEdge[]>(() => {\n const map = boundsById.value\n const out: RenderedEdge[] = []\n for (const edge of edges.value) {\n const a = endpointWorldPoint(props.graph, edge.from)\n const b = endpointWorldPoint(props.graph, edge.to)\n if (!a || !b) continue\n let obstacles: AABB[] | undefined\n if (props.routeAroundNodes && edge.routing === 'orthogonal') {\n const skip = new Set<NodeId>([edge.from.node, edge.to.node])\n obstacles = []\n for (const [id, bb] of map) {\n if (!skip.has(id)) obstacles.push(bb)\n }\n }\n const needsBounds = edge.routing === 'orthogonal' || edge.routing === 'bezier'\n const sb = needsBounds ? map.get(edge.from.node) : undefined\n const tb = needsBounds ? map.get(edge.to.node) : undefined\n out.push({\n id: String(edge.id),\n d: buildEdgePath(edge, a, b, obstacles, sb, tb),\n routing: edge.routing,\n mid: { x: (a[0] + b[0]) / 2, y: (a[1] + b[1]) / 2 },\n raw: edge,\n })\n }\n return out\n})\n\n// ─── Drag state (Pointer Events) ──────────────────────────────────────────\n//\n// Pointer Events replaced the old `mousedown` + window-mousemove dance\n// for parity with React. The win for Vue is the same: touchscreens,\n// trackpads and pen tablets all funnel through one code path, and\n// `setPointerCapture` guarantees pointermove / pointerup keep firing\n// even after the cursor exits the wrapper.\ninterface DragSession {\n primaryId: NodeId\n pointerId: number\n target: HTMLElement\n startX: number\n startY: number\n startZoom: number\n members: Array<{ id: NodeId; x0: number; y0: number }>\n moved: boolean\n}\nlet dragRef: DragSession | null = null\nconst draggingId = ref<NodeId | null>(null)\n\nfunction applyMove(id: NodeId, x: number, y: number) {\n let nx = x\n let ny = y\n if (props.snapToGrid && props.snapToGrid > 0) {\n nx = Math.round(nx / props.snapToGrid) * props.snapToGrid\n ny = Math.round(ny / props.snapToGrid) * props.snapToGrid\n }\n const d = effectiveDraggable.value\n if (typeof d === 'function') d(id, nx, ny)\n else props.graph.moveNode(id, nx, ny)\n}\n\nfunction beginDrag(\n primaryId: NodeId,\n members: Array<{ id: NodeId; x0: number; y0: number }>,\n e: PointerEvent,\n) {\n const target = e.currentTarget as HTMLElement\n try {\n target.setPointerCapture(e.pointerId)\n } catch {\n // Best-effort — proceed without capture if the browser refuses.\n }\n dragRef = {\n primaryId,\n pointerId: e.pointerId,\n target,\n startX: e.clientX,\n startY: e.clientY,\n startZoom: view.value.zoom || 1,\n members,\n moved: false,\n }\n draggingId.value = primaryId\n}\n\nfunction onNodePointerMove(e: PointerEvent) {\n if (!dragRef || dragRef.pointerId !== e.pointerId) return\n const dx = (e.clientX - dragRef.startX) / dragRef.startZoom\n const dy = (e.clientY - dragRef.startY) / dragRef.startZoom\n if (!dragRef.moved && (Math.abs(dx) > DRAG_THRESHOLD_PX || Math.abs(dy) > DRAG_THRESHOLD_PX)) {\n dragRef.moved = true\n }\n if (dragRef.members.length > 1) {\n props.graph.transaction(() => {\n for (const m of dragRef!.members) applyMove(m.id, m.x0 + dx, m.y0 + dy)\n })\n } else {\n const m = dragRef.members[0]!\n applyMove(m.id, m.x0 + dx, m.y0 + dy)\n }\n}\n\nfunction endNodeDrag(e: PointerEvent) {\n if (!dragRef || dragRef.pointerId !== e.pointerId) return\n try {\n dragRef.target.releasePointerCapture(dragRef.pointerId)\n } catch {\n // Pointer might already be released — ignore.\n }\n dragRef = null\n draggingId.value = null\n}\n\nfunction toggleSelection(arr: readonly NodeId[], id: NodeId): NodeId[] {\n const idx = arr.indexOf(id)\n if (idx === -1) return [...arr, id]\n const next = arr.slice()\n next.splice(idx, 1)\n return next as NodeId[]\n}\n\nfunction onNodePointerDown(e: PointerEvent, node: GraphNode) {\n if (e.button !== 0) return\n const multiCapable = props.selectionMode !== 'single'\n const isCtrl = e.ctrlKey || e.metaKey\n\n if (multiCapable && isCtrl) {\n e.preventDefault()\n e.stopPropagation()\n commitSelection(toggleSelection(currentSelection.value, node.id))\n return\n }\n\n if (multiCapable) {\n if (!selectionSet.value.has(node.id)) commitSelection([node.id])\n }\n\n if (!effectiveDraggable.value) return\n e.preventDefault()\n e.stopPropagation()\n\n const groupIds =\n multiCapable && selectionSet.value.has(node.id)\n ? Array.from(new Set([node.id, ...currentSelection.value]))\n : [node.id]\n const members = groupIds\n .map((mid) => {\n const n = props.graph.getNode(mid)\n return n ? { id: mid, x0: n.transform.x, y0: n.transform.y } : null\n })\n .filter((m): m is { id: NodeId; x0: number; y0: number } => m !== null)\n\n beginDrag(node.id, members, e)\n}\n\nfunction onNodeClick(e: MouseEvent, node: GraphNode) {\n e.stopPropagation()\n emit('node-click', { id: node.id, node, event: e })\n if (props.selectionMode === 'single') {\n commitSelection([node.id])\n return\n }\n if (props.selectionMode === 'multi' && (e.ctrlKey || e.metaKey || e.shiftKey)) {\n commitSelection(toggleSelection(currentSelection.value, node.id))\n return\n }\n commitSelection([node.id])\n}\n\n// ─── Wheel: zoom / pan ─────────────────────────────────────────────────────\nfunction onWheel(e: WheelEvent) {\n if (!effectiveZoomable.value && !effectivePanable.value) return\n if (effectiveZoomable.value && (e.ctrlKey || e.metaKey)) {\n e.preventDefault()\n const factor = e.deltaY < 0 ? 1.1 : 1 / 1.1\n view.value = {\n ...view.value,\n zoom: Math.max(0.1, Math.min(10, view.value.zoom * factor)),\n }\n return\n }\n if (effectivePanable.value) {\n e.preventDefault()\n view.value = {\n ...view.value,\n panX: view.value.panX - e.deltaX,\n panY: view.value.panY - e.deltaY,\n }\n }\n}\n\n// ─── Lasso ────────────────────────────────────────────────────────────────\ninterface ScreenRect {\n x: number\n y: number\n w: number\n h: number\n}\nconst lasso = ref<ScreenRect | null>(null)\nlet lassoRef: {\n startX: number\n startY: number\n initial: readonly NodeId[]\n additive: boolean\n} | null = null\n\nfunction rectFromCorners(x0: number, y0: number, x1: number, y1: number): ScreenRect {\n return { x: Math.min(x0, x1), y: Math.min(y0, y1), w: Math.abs(x1 - x0), h: Math.abs(y1 - y0) }\n}\n\nfunction screenRectToWorld(r: ScreenRect): ScreenRect {\n const z = view.value.zoom || 1\n return {\n x: (r.x - view.value.panX) / z,\n y: (r.y - view.value.panY) / z,\n w: r.w / z,\n h: r.h / z,\n }\n}\n\nfunction aabbIntersects(a: AABB, b: ScreenRect): boolean {\n if (a.x + a.w < b.x) return false\n if (b.x + b.w < a.x) return false\n if (a.y + a.h < b.y) return false\n if (b.y + b.h < a.y) return false\n return true\n}\n\nfunction nodesInBox(world: ScreenRect): NodeId[] {\n const out: NodeId[] = []\n for (const [id, bb] of boundsById.value) {\n if (aabbIntersects(bb, world)) out.push(id)\n }\n return out\n}\n\n// Wrapper pointer session (lasso OR middle-button pan). One session\n// at a time — both originate from the wrapper's `pointerdown`.\ntype WrapperSession =\n | { kind: 'lasso'; pointerId: number }\n | { kind: 'pan'; pointerId: number; startX: number; startY: number; panX: number; panY: number }\nlet wrapperSession: WrapperSession | null = null\n\nfunction startLasso(e: PointerEvent) {\n const rect = rootRef.value?.getBoundingClientRect()\n if (!rect) return\n const sx = e.clientX - rect.left\n const sy = e.clientY - rect.top\n e.preventDefault()\n try {\n ;(e.currentTarget as HTMLElement).setPointerCapture(e.pointerId)\n } catch {\n // best-effort\n }\n lassoRef = {\n startX: sx,\n startY: sy,\n initial: currentSelection.value,\n additive: e.shiftKey || e.ctrlKey || e.metaKey,\n }\n wrapperSession = { kind: 'lasso', pointerId: e.pointerId }\n lasso.value = { x: sx, y: sy, w: 0, h: 0 }\n}\n\nfunction startPan(e: PointerEvent) {\n e.preventDefault()\n try {\n ;(e.currentTarget as HTMLElement).setPointerCapture(e.pointerId)\n } catch {\n // best-effort\n }\n wrapperSession = {\n kind: 'pan',\n pointerId: e.pointerId,\n startX: e.clientX,\n startY: e.clientY,\n panX: view.value.panX,\n panY: view.value.panY,\n }\n}\n\n// ─── Wrapper pointerdown: middle-pan / lasso / clear-selection ────────────\nfunction onWrapperPointerDown(e: PointerEvent) {\n if (effectivePanable.value && e.button === 1) {\n startPan(e)\n return\n }\n\n if (e.button !== 0) return\n\n // Don't lasso when starting on a node.\n if ((e.target as HTMLElement).closest('[data-node-id]')) return\n\n if (props.selectionMode === 'lasso') {\n startLasso(e)\n return\n }\n if (props.selectionMode === 'multi' && currentSelection.value.length > 0) {\n if (!(e.shiftKey || e.ctrlKey || e.metaKey)) commitSelection([])\n }\n}\n\nfunction onWrapperPointerMove(e: PointerEvent) {\n if (!wrapperSession || wrapperSession.pointerId !== e.pointerId) return\n if (wrapperSession.kind === 'pan') {\n const s = wrapperSession\n view.value = {\n ...view.value,\n panX: s.panX + (e.clientX - s.startX),\n panY: s.panY + (e.clientY - s.startY),\n }\n return\n }\n const r = rootRef.value?.getBoundingClientRect()\n if (!r || !lassoRef) return\n const cx = e.clientX - r.left\n const cy = e.clientY - r.top\n const screen = rectFromCorners(lassoRef.startX, lassoRef.startY, cx, cy)\n lasso.value = screen\n const world = screenRectToWorld(screen)\n const hits = nodesInBox(world)\n const next = lassoRef.additive ? Array.from(new Set([...lassoRef.initial, ...hits])) : hits\n commitSelection(next)\n}\n\nfunction onWrapperPointerUp(e: PointerEvent) {\n if (!wrapperSession || wrapperSession.pointerId !== e.pointerId) return\n try {\n ;(e.currentTarget as HTMLElement).releasePointerCapture(wrapperSession.pointerId)\n } catch {\n // best-effort\n }\n if (wrapperSession.kind === 'lasso') {\n lassoRef = null\n lasso.value = null\n }\n wrapperSession = null\n}\n\n// ─── Canvas click — clear selection on empty space (single mode) ──────────\nfunction onCanvasClick(e: MouseEvent) {\n if ((e.target as HTMLElement).closest('[data-node-id]')) return\n if (props.selectionMode === 'single' && currentSelection.value.length > 0) {\n commitSelection([])\n }\n}\n\n// ─── DnD (palette → canvas) ───────────────────────────────────────────────\n// `dropEnabled` mirrors React's `dropEnabled = !!onDropNode` — we inspect\n// the current Vue instance's attrs (`onDrop-node` is the kebab-cased\n// listener, `onDropNode` is the camel form) so the canvas only goes into\n// \"drop target\" mode when the parent actually listens.\nconst __instance = getCurrentInstance()\nconst dropEnabled = computed(() => {\n const attrs = __instance?.vnode?.props ?? {}\n return Boolean(\n (attrs as Record<string, unknown>)['onDrop-node'] ||\n (attrs as Record<string, unknown>).onDropNode,\n )\n})\n\nconst acceptedTypes = computed<readonly string[] | null>(() => {\n if (props.dropTypes === '*' || props.dropTypes === null) return null\n if (props.dropTypes === undefined) return ['application/x-sg-node']\n return props.dropTypes\n})\n\nfunction dragHasAcceptedType(e: DragEvent): boolean {\n if (!acceptedTypes.value) return true\n const types = e.dataTransfer?.types\n if (!types || types.length === 0) return false\n for (const t of acceptedTypes.value) {\n for (let i = 0; i < types.length; i++) {\n if (types[i] === t) return true\n }\n }\n return false\n}\n\nfunction onDragOver(e: DragEvent) {\n if (!dragHasAcceptedType(e)) return\n e.preventDefault()\n if (e.dataTransfer) e.dataTransfer.dropEffect = 'copy'\n}\n\nfunction onDrop(e: DragEvent) {\n if (!dragHasAcceptedType(e)) return\n e.preventDefault()\n const rect = rootRef.value?.getBoundingClientRect()\n if (!rect) return\n const sx = e.clientX - rect.left\n const sy = e.clientY - rect.top\n const wx = (sx - view.value.panX) / (view.value.zoom || 1)\n const wy = (sy - view.value.panY) / (view.value.zoom || 1)\n const payload: DiagramDropPoint = {\n x: wx,\n y: wy,\n screenX: e.clientX,\n screenY: e.clientY,\n dataTransfer: e.dataTransfer,\n }\n emit('drop-node', payload)\n emit('dropNode', payload)\n}\n\n// ─── Context menu ─────────────────────────────────────────────────────────\nfunction onWrapperContextMenu(e: MouseEvent) {\n // Always stop the bubble from a node so the canvas handler doesn't fire\n // with a node-as-target.\n if ((e.target as HTMLElement).closest('[data-node-id]')) return\n e.preventDefault()\n const rect = rootRef.value?.getBoundingClientRect()\n if (!rect) return\n const sx = e.clientX - rect.left\n const sy = e.clientY - rect.top\n const wx = (sx - view.value.panX) / (view.value.zoom || 1)\n const wy = (sy - view.value.panY) / (view.value.zoom || 1)\n emit('canvas-context-menu', {\n event: e,\n point: { x: wx, y: wy, screenX: e.clientX, screenY: e.clientY },\n })\n}\n\nfunction onNodeContextMenu(e: MouseEvent, node: GraphNode) {\n e.stopPropagation()\n e.preventDefault()\n emit('node-context-menu', { event: e, node })\n}\n\nfunction onEdgeContextMenu(e: MouseEvent, edge: GraphEdge) {\n e.stopPropagation()\n e.preventDefault()\n emit('edge-context-menu', { event: e, edge })\n}\n\n// ─── Hover overlays (nodes / edges) ───────────────────────────────────────\nconst HOVER_SHOW_DELAY_MS = 200\nconst HOVER_HIDE_GRACE_MS = 150\nconst hoveredNode = ref<NodeId | null>(null)\nconst hoveredEdge = ref<string | null>(null)\nlet nodeHoverShowTimer: number | null = null\nlet nodeHoverHideTimer: number | null = null\nlet edgeHoverShowTimer: number | null = null\nlet edgeHoverHideTimer: number | null = null\n\nfunction clearTimer(handle: number | null) {\n if (handle != null) window.clearTimeout(handle)\n}\n\nfunction showNodeHover(id: NodeId) {\n if (nodeHoverHideTimer != null) {\n clearTimer(nodeHoverHideTimer)\n nodeHoverHideTimer = null\n }\n if (hoveredNode.value === id) return\n if (nodeHoverShowTimer != null) clearTimer(nodeHoverShowTimer)\n nodeHoverShowTimer = window.setTimeout(() => {\n hoveredNode.value = id\n nodeHoverShowTimer = null\n }, HOVER_SHOW_DELAY_MS)\n}\nfunction hideNodeHover() {\n if (nodeHoverShowTimer != null) {\n clearTimer(nodeHoverShowTimer)\n nodeHoverShowTimer = null\n }\n if (nodeHoverHideTimer != null) clearTimer(nodeHoverHideTimer)\n nodeHoverHideTimer = window.setTimeout(() => {\n hoveredNode.value = null\n nodeHoverHideTimer = null\n }, HOVER_HIDE_GRACE_MS)\n}\nfunction showEdgeHover(id: string) {\n if (edgeHoverHideTimer != null) {\n clearTimer(edgeHoverHideTimer)\n edgeHoverHideTimer = null\n }\n if (hoveredEdge.value === id) return\n if (edgeHoverShowTimer != null) clearTimer(edgeHoverShowTimer)\n edgeHoverShowTimer = window.setTimeout(() => {\n hoveredEdge.value = id\n edgeHoverShowTimer = null\n }, HOVER_SHOW_DELAY_MS)\n}\nfunction hideEdgeHover() {\n if (edgeHoverShowTimer != null) {\n clearTimer(edgeHoverShowTimer)\n edgeHoverShowTimer = null\n }\n if (edgeHoverHideTimer != null) clearTimer(edgeHoverHideTimer)\n edgeHoverHideTimer = window.setTimeout(() => {\n hoveredEdge.value = null\n edgeHoverHideTimer = null\n }, HOVER_HIDE_GRACE_MS)\n}\nonBeforeUnmount(() => {\n clearTimer(nodeHoverShowTimer)\n clearTimer(nodeHoverHideTimer)\n clearTimer(edgeHoverShowTimer)\n clearTimer(edgeHoverHideTimer)\n // Release any pointer captures still in flight — without this a\n // mid-drag unmount could leave the captured pointer attached to the\n // detached element until the next click anywhere on the page.\n if (dragRef) {\n try {\n dragRef.target.releasePointerCapture(dragRef.pointerId)\n } catch {\n // pointer might already be gone\n }\n dragRef = null\n }\n wrapperSession = null\n})\n\nconst hasNodeActions = computed(() => (props.nodeActions?.length ?? 0) > 0)\nconst hasEdgeActions = computed(() => (props.edgeActions?.length ?? 0) > 0)\nconst edgesInteractive = computed(() => hasEdgeActions.value)\n\nconst hoveredNodeRecord = computed<GraphNode | null>(() =>\n hoveredNode.value != null ? (props.state.nodes.get(hoveredNode.value) ?? null) : null,\n)\nconst hoveredNodeBounds = computed<AABB | null>(() =>\n hoveredNode.value != null ? (boundsById.value.get(hoveredNode.value) ?? null) : null,\n)\nconst hoveredEdgeRecord = computed<GraphEdge | null>(() =>\n hoveredEdge.value != null ? (props.state.edges.get(hoveredEdge.value) ?? null) : null,\n)\nconst hoveredEdgeMid = computed<{ x: number; y: number } | null>(() => {\n if (!hoveredEdgeRecord.value) return null\n const a = endpointWorldPoint(props.graph, hoveredEdgeRecord.value.from)\n const b = endpointWorldPoint(props.graph, hoveredEdgeRecord.value.to)\n if (!a || !b) return null\n return { x: (a[0] + b[0]) / 2, y: (a[1] + b[1]) / 2 }\n})\n\n// ─── Canvas bounds (SVG sizing) ───────────────────────────────────────────\nconst canvasBounds = computed(() => {\n if (allBounds.value.length === 0) return { x: 0, y: 0, w: 0, h: 0 }\n let x0 = Infinity\n let y0 = Infinity\n let x1 = -Infinity\n let y1 = -Infinity\n for (const b of allBounds.value) {\n if (b.x < x0) x0 = b.x\n if (b.y < y0) y0 = b.y\n if (b.x + b.w > x1) x1 = b.x + b.w\n if (b.y + b.h > y1) y1 = b.y + b.h\n }\n return { x: x0, y: y0, w: x1 - x0, h: y1 - y0 }\n})\n\nconst wrapperClass = computed(() =>\n props.unstyled\n ? [props.className].filter(Boolean)\n : ['sg-diagram', props.snapToGrid ? 'sg-diagram-grid' : '', props.className].filter(Boolean),\n)\n\nconst wrapperStyle = computed(() => {\n const base: Record<string, string | number> = {\n position: 'relative',\n width: typeof props.width === 'number' ? `${props.width}px` : props.width,\n height: typeof props.height === 'number' ? `${props.height}px` : props.height,\n overflow: 'hidden',\n }\n if (props.snapToGrid) {\n base['--sg-grid-size' as keyof typeof base] = `${props.snapToGrid * view.value.zoom}px`\n base.backgroundPosition = `${view.value.panX}px ${view.value.panY}px`\n }\n return { ...base, ...(props.style ?? {}) }\n})\n\nconst canvasStyle = computed(() => ({\n position: 'absolute' as const,\n top: 0,\n left: 0,\n transform: `translate(${view.value.panX}px, ${view.value.panY}px) scale(${view.value.zoom})`,\n transformOrigin: '0 0',\n width: '100%',\n height: '100%',\n}))\n\nfunction nodeClassFor(node: GraphNode): string[] {\n if (props.unstyled) return []\n const isSelected = selectionSet.value.has(node.id)\n const isDragging = draggingId.value === node.id\n return [\n 'sg-diagram-node',\n `sg-diagram-node-${node.outline.kind}`,\n effectiveDraggable.value ? 'sg-diagram-node-draggable' : '',\n isSelected ? 'sg-diagram-node-selected' : '',\n // Legacy class kept for backward-compat with v0 selectors.\n isSelected ? 'sg-diagram-node--selected' : '',\n isDragging ? 'sg-diagram-node-dragging' : '',\n ].filter(Boolean)\n}\n\nfunction nodeStyleFor(node: GraphNode): Record<string, string | number | undefined> {\n const b = boundsById.value.get(node.id)\n if (!b) return {}\n const isDragging = draggingId.value === node.id\n return {\n position: 'absolute',\n left: `${b.x}px`,\n top: `${b.y}px`,\n width: `${b.w}px`,\n height: `${b.h}px`,\n cursor: effectiveDraggable.value ? (isDragging ? 'grabbing' : 'grab') : undefined,\n userSelect: effectiveDraggable.value ? 'none' : undefined,\n }\n}\n\nfunction visibleNodeActions(node: GraphNode): readonly DiagramNodeAction[] {\n return (props.nodeActions ?? []).filter((a) => !a.hidden?.(node))\n}\n\nfunction visibleEdgeActions(edge: GraphEdge): readonly DiagramEdgeAction[] {\n return (props.edgeActions ?? []).filter((a) => !a.hidden?.(edge))\n}\n\ndefineExpose({\n print: (opts?: PrintOptions) => {\n if (!rootRef.value) return\n printElement(rootRef.value, {\n ...opts,\n fileName: opts?.fileName ?? props.fileName ?? 'diagram',\n })\n },\n})\n</script>\n\n<template>\n <div\n ref=\"rootRef\"\n :class=\"wrapperClass\"\n :style=\"wrapperStyle\"\n :data-selection-mode=\"props.selectionMode\"\n :data-sg-drop=\"dropEnabled ? 'true' : undefined\"\n role=\"application\"\n aria-label=\"Diagram\"\n @wheel=\"effectiveZoomable || effectivePanable ? onWheel($event) : undefined\"\n @pointerdown=\"onWrapperPointerDown\"\n @pointermove=\"onWrapperPointerMove\"\n @pointerup=\"onWrapperPointerUp\"\n @pointercancel=\"onWrapperPointerUp\"\n @lostpointercapture=\"onWrapperPointerUp\"\n @contextmenu=\"onWrapperContextMenu\"\n @dragover=\"dropEnabled ? onDragOver($event) : undefined\"\n @drop=\"dropEnabled ? onDrop($event) : undefined\"\n >\n <div\n ref=\"canvasRef\"\n :class=\"props.unstyled ? undefined : 'sg-diagram-canvas'\"\n :style=\"canvasStyle\"\n :data-zoom=\"view.zoom\"\n :data-pan-x=\"view.panX\"\n :data-pan-y=\"view.panY\"\n @click=\"onCanvasClick\"\n >\n <svg\n :class=\"props.unstyled ? undefined : 'sg-diagram-edges'\"\n :width=\"Math.max(canvasBounds.w + canvasBounds.x, 0) || '100%'\"\n :height=\"Math.max(canvasBounds.h + canvasBounds.y, 0) || '100%'\"\n :style=\"{\n position: 'absolute',\n inset: 0,\n pointerEvents: 'none',\n }\"\n aria-hidden=\"true\"\n >\n <!--\n Marker defs — one regular and one slightly enlarged arrow for the\n hover state. We always render them when `edgeArrows` is on (cheap;\n zero render cost otherwise) and let CSS swap the marker-end\n attribute on the path. `context-stroke` inherits the edge stroke\n colour automatically when supported.\n -->\n <defs v-if=\"props.edgeArrows\">\n <marker\n id=\"sg-diagram-arrow\"\n viewBox=\"0 0 10 10\"\n refX=\"9\"\n refY=\"5\"\n markerWidth=\"7\"\n markerHeight=\"7\"\n orient=\"auto-start-reverse\"\n markerUnits=\"userSpaceOnUse\"\n >\n <path d=\"M 0 0 L 10 5 L 0 10 Z\" fill=\"context-stroke\" class=\"sg-diagram-arrow-fill\" />\n </marker>\n <marker\n id=\"sg-diagram-arrow-hover\"\n viewBox=\"0 0 10 10\"\n refX=\"9\"\n refY=\"5\"\n markerWidth=\"8\"\n markerHeight=\"8\"\n orient=\"auto-start-reverse\"\n markerUnits=\"userSpaceOnUse\"\n >\n <path d=\"M 0 0 L 10 5 L 0 10 Z\" fill=\"context-stroke\" class=\"sg-diagram-arrow-fill\" />\n </marker>\n </defs>\n <template v-for=\"ep in renderedEdges\" :key=\"ep.id\">\n <g v-if=\"edgesInteractive\" :data-edge-id=\"ep.id\">\n <path\n :d=\"ep.d\"\n class=\"sg-diagram-edge-hit\"\n fill=\"none\"\n stroke=\"transparent\"\n :stroke-width=\"16\"\n data-edge-hit=\"true\"\n :style=\"{ pointerEvents: 'stroke', cursor: 'context-menu' }\"\n @contextmenu=\"onEdgeContextMenu($event, ep.raw)\"\n @mouseenter=\"showEdgeHover(ep.id)\"\n @mouseleave=\"hideEdgeHover()\"\n />\n <path\n :d=\"ep.d\"\n :class=\"`sg-diagram-edge sg-diagram-edge-${ep.routing}`\"\n fill=\"none\"\n :data-edge-id=\"ep.id\"\n :marker-end=\"props.edgeArrows ? 'url(#sg-diagram-arrow)' : undefined\"\n :style=\"{ pointerEvents: 'none' }\"\n />\n </g>\n <path\n v-else\n :d=\"ep.d\"\n :class=\"`sg-diagram-edge sg-diagram-edge-${ep.routing}`\"\n fill=\"none\"\n :data-edge-id=\"ep.id\"\n :marker-end=\"props.edgeArrows ? 'url(#sg-diagram-arrow)' : undefined\"\n />\n </template>\n </svg>\n\n <div\n v-for=\"node in nodes\"\n :key=\"node.id\"\n :data-node-id=\"node.id\"\n :data-selected=\"selectionSet.has(node.id) ? 'true' : undefined\"\n :data-sg-dragging=\"draggingId === node.id ? 'true' : undefined\"\n :class=\"nodeClassFor(node)\"\n :style=\"nodeStyleFor(node)\"\n @pointerdown=\"onNodePointerDown($event, node)\"\n @pointermove=\"effectiveDraggable ? onNodePointerMove($event) : undefined\"\n @pointerup=\"effectiveDraggable ? endNodeDrag($event) : undefined\"\n @pointercancel=\"effectiveDraggable ? endNodeDrag($event) : undefined\"\n @lostpointercapture=\"effectiveDraggable ? endNodeDrag($event) : undefined\"\n @click=\"onNodeClick($event, node)\"\n @contextmenu=\"onNodeContextMenu($event, node)\"\n @mouseenter=\"hasNodeActions ? showNodeHover(node.id) : undefined\"\n @mouseleave=\"hasNodeActions ? hideNodeHover() : undefined\"\n >\n <slot name=\"node\" :node=\"node\">{{ node.id }}</slot>\n </div>\n </div>\n\n <!-- Hover overlays — screen-space (constant size regardless of zoom). -->\n <div\n v-if=\"hasNodeActions && hoveredNodeRecord && hoveredNodeBounds\"\n :class=\"props.unstyled ? undefined : 'sg-diagram-hover-actions'\"\n :data-node-id=\"String(hoveredNodeRecord.id)\"\n :style=\"{\n position: 'absolute',\n left: `${view.panX + (hoveredNodeBounds.x + hoveredNodeBounds.w / 2) * view.zoom}px`,\n top: `${view.panY + hoveredNodeBounds.y * view.zoom}px`,\n transform: 'translate(-50%, calc(-100% - 8px))',\n pointerEvents: 'auto',\n zIndex: 5,\n }\"\n @mouseenter=\"showNodeHover(hoveredNodeRecord.id)\"\n @mouseleave=\"hideNodeHover()\"\n >\n <button\n v-for=\"action in visibleNodeActions(hoveredNodeRecord)\"\n :key=\"action.id\"\n type=\"button\"\n :data-action-id=\"action.id\"\n :class=\"props.unstyled ? undefined : 'sg-diagram-hover-action'\"\n :aria-label=\"action.label ?? action.id\"\n :title=\"action.label\"\n @mousedown.stop\n @click.stop=\"action.onClick(hoveredNodeRecord!, $event)\"\n >\n <template v-if=\"action.icon\">{{ action.icon }}</template>\n <template v-else>{{ action.label ?? action.id }}</template>\n </button>\n </div>\n\n <div\n v-if=\"hasEdgeActions && hoveredEdgeRecord && hoveredEdgeMid\"\n :class=\"props.unstyled ? undefined : 'sg-diagram-hover-actions'\"\n :data-edge-id=\"String(hoveredEdgeRecord.id)\"\n :style=\"{\n position: 'absolute',\n left: `${view.panX + hoveredEdgeMid.x * view.zoom}px`,\n top: `${view.panY + hoveredEdgeMid.y * view.zoom}px`,\n transform: 'translate(-50%, -50%)',\n pointerEvents: 'auto',\n zIndex: 5,\n }\"\n @mouseenter=\"showEdgeHover(String(hoveredEdgeRecord.id))\"\n @mouseleave=\"hideEdgeHover()\"\n >\n <button\n v-for=\"action in visibleEdgeActions(hoveredEdgeRecord)\"\n :key=\"action.id\"\n type=\"button\"\n :data-action-id=\"action.id\"\n :class=\"props.unstyled ? undefined : 'sg-diagram-hover-action'\"\n :aria-label=\"action.label ?? action.id\"\n :title=\"action.label\"\n @mousedown.stop\n @click.stop=\"action.onClick(hoveredEdgeRecord!, $event)\"\n >\n <template v-if=\"action.icon\">{{ action.icon }}</template>\n <template v-else>{{ action.label ?? action.id }}</template>\n </button>\n </div>\n\n <!-- Lasso rubber band. -->\n <div\n v-if=\"lasso\"\n :class=\"props.unstyled ? undefined : 'sg-diagram-lasso'\"\n :style=\"{\n position: 'absolute',\n left: `${lasso.x}px`,\n top: `${lasso.y}px`,\n width: `${lasso.w}px`,\n height: `${lasso.h}px`,\n pointerEvents: 'none',\n }\"\n />\n </div>\n</template>\n","<script setup lang=\"ts\">\r\nimport { computed, ref } from 'vue'\r\nimport { printElement } from '../../../utils/print'\r\nimport type { DashboardProps, DashboardStyle, DashboardWidget } from './types'\r\n\r\nconst props = withDefaults(defineProps<DashboardProps>(), {\r\n columns: 12,\r\n rowHeight: 80,\r\n gap: 8,\r\n unstyled: false,\r\n})\r\n\r\ndefineSlots<{\r\n widget(props: { widget: DashboardWidget }): unknown\r\n}>()\r\n\r\nconst rootRef = ref<HTMLDivElement | null>(null)\r\n\r\nconst gridStyle = computed<DashboardStyle>(() => ({\r\n display: 'grid',\r\n gridTemplateColumns: `repeat(${props.columns}, 1fr)`,\r\n gridAutoRows: `${props.rowHeight}px`,\r\n gap: `${props.gap}px`,\r\n ...(props.style ?? {}),\r\n}))\r\n\r\nconst widgetStyle = (w: DashboardWidget): DashboardStyle => ({\r\n gridColumnStart: w.x,\r\n gridColumnEnd: `span ${w.w ?? 1}`,\r\n gridRowStart: w.y,\r\n gridRowEnd: `span ${w.h ?? 1}`,\r\n ...(w.style ?? {}),\r\n})\r\n\r\ndefineExpose({\r\n print: (opts: { fileName?: string } = {}) => {\r\n if (!rootRef.value) return\r\n printElement(rootRef.value, { fileName: opts.fileName ?? 'dashboard' })\r\n },\r\n})\r\n</script>\r\n\r\n<template>\r\n <div\r\n ref=\"rootRef\"\r\n :class=\"[!props.unstyled && 'sg-dashboard', props.className]\"\r\n :style=\"gridStyle\"\r\n role=\"region\"\r\n aria-label=\"Dashboard\"\r\n >\r\n <div\r\n v-for=\"widget in props.widgets\"\r\n :key=\"widget.id\"\r\n :data-widget-id=\"widget.id\"\r\n :class=\"[!props.unstyled && 'sg-dashboard-widget', widget.className]\"\r\n :style=\"widgetStyle(widget)\"\r\n >\r\n <div v-if=\"widget.title\" :class=\"!props.unstyled ? 'sg-dashboard-widget-header' : undefined\">\r\n {{ widget.title }}\r\n </div>\r\n <div :class=\"!props.unstyled ? 'sg-dashboard-widget-body' : undefined\">\r\n <slot name=\"widget\" :widget=\"widget\" />\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { computed, ref } from 'vue'\r\nimport { printElement } from '../../../utils/print'\r\nimport type { DashboardEditorProps, DashboardStyle, DashboardWidget } from './types'\r\n\r\nconst props = withDefaults(defineProps<DashboardEditorProps>(), {\r\n columns: 12,\r\n rowHeight: 80,\r\n gap: 8,\r\n unstyled: false,\r\n draggable: true,\r\n resizable: true,\r\n minW: 1,\r\n minH: 1,\r\n})\r\n\r\nconst emit = defineEmits<{\r\n (e: 'layout-change', widgets: DashboardWidget[]): void\r\n}>()\r\n\r\ndefineSlots<{\r\n widget(props: { widget: DashboardWidget }): unknown\r\n}>()\r\n\r\nconst rootRef = ref<HTMLDivElement | null>(null)\r\nconst internal = ref<DashboardWidget[]>(props.widgets.map((w) => ({ ...w })))\r\n\r\nconst widgets = computed(() => internal.value)\r\n\r\nconst gridStyle = computed<DashboardStyle>(() => ({\r\n display: 'grid',\r\n gridTemplateColumns: `repeat(${props.columns}, 1fr)`,\r\n gridAutoRows: `${props.rowHeight}px`,\r\n gap: `${props.gap}px`,\r\n ...(props.style ?? {}),\r\n}))\r\n\r\nconst widgetStyle = (w: DashboardWidget): DashboardStyle => ({\r\n gridColumnStart: w.x,\r\n gridColumnEnd: `span ${w.w ?? 1}`,\r\n gridRowStart: w.y,\r\n gridRowEnd: `span ${w.h ?? 1}`,\r\n ...(w.style ?? {}),\r\n})\r\n\r\ninterface DragSession {\r\n type: 'move' | 'resize'\r\n id: string\r\n startX: number\r\n startY: number\r\n origin: DashboardWidget\r\n}\r\n\r\nlet dragSession: DragSession | null = null\r\n\r\nconst cellSize = () => {\r\n const root = rootRef.value\r\n if (!root) return { cw: 0, ch: props.rowHeight + props.gap }\r\n const w = root.clientWidth - props.gap * (props.columns - 1)\r\n const cw = w / props.columns + props.gap\r\n return { cw, ch: props.rowHeight + props.gap }\r\n}\r\n\r\nconst onHeaderPointerDown = (e: PointerEvent, w: DashboardWidget) => {\r\n if (!props.draggable) return\r\n ;(e.target as HTMLElement).setPointerCapture?.(e.pointerId)\r\n dragSession = {\r\n type: 'move',\r\n id: w.id,\r\n startX: e.clientX,\r\n startY: e.clientY,\r\n origin: { ...w },\r\n }\r\n}\r\n\r\nconst onResizePointerDown = (e: PointerEvent, w: DashboardWidget) => {\r\n if (!props.resizable) return\r\n e.stopPropagation()\r\n ;(e.target as HTMLElement).setPointerCapture?.(e.pointerId)\r\n dragSession = {\r\n type: 'resize',\r\n id: w.id,\r\n startX: e.clientX,\r\n startY: e.clientY,\r\n origin: { ...w },\r\n }\r\n}\r\n\r\nconst onPointerMove = (e: PointerEvent) => {\r\n const ds = dragSession\r\n if (!ds) return\r\n const { cw, ch } = cellSize()\r\n if (cw === 0) return\r\n const dx = Math.round((e.clientX - ds.startX) / cw)\r\n const dy = Math.round((e.clientY - ds.startY) / ch)\r\n\r\n internal.value = internal.value.map((w) => {\r\n if (w.id !== ds.id) return w\r\n if (ds.type === 'move') {\r\n const nextX = Math.max(1, ds.origin.x + dx)\r\n const nextY = Math.max(1, ds.origin.y + dy)\r\n return { ...w, x: Math.min(props.columns - (w.w ?? 1) + 1, nextX), y: nextY }\r\n }\r\n return {\r\n ...w,\r\n w: Math.max(props.minW, (ds.origin.w ?? 1) + dx),\r\n h: Math.max(props.minH, (ds.origin.h ?? 1) + dy),\r\n }\r\n })\r\n}\r\n\r\nconst onPointerUp = () => {\r\n if (dragSession) {\r\n emit('layout-change', internal.value.map((w) => ({ ...w })))\r\n }\r\n dragSession = null\r\n}\r\n\r\ndefineExpose({\r\n print: (opts: { fileName?: string } = {}) => {\r\n if (!rootRef.value) return\r\n printElement(rootRef.value, { fileName: opts.fileName ?? 'dashboard' })\r\n },\r\n getLayout: () => internal.value.map((w) => ({ ...w })),\r\n})\r\n</script>\r\n\r\n<template>\r\n <div\r\n ref=\"rootRef\"\r\n :class=\"[!props.unstyled && 'sg-dashboard sg-dashboard-editor', props.className]\"\r\n :style=\"gridStyle\"\r\n role=\"region\"\r\n aria-label=\"Dashboard editor\"\r\n @pointermove=\"onPointerMove\"\r\n @pointerup=\"onPointerUp\"\r\n >\r\n <div\r\n v-for=\"widget in widgets\"\r\n :key=\"widget.id\"\r\n :data-widget-id=\"widget.id\"\r\n :class=\"[!props.unstyled && 'sg-dashboard-widget', widget.className]\"\r\n :style=\"widgetStyle(widget)\"\r\n >\r\n <div\r\n :class=\"!props.unstyled ? 'sg-dashboard-widget-header' : undefined\"\r\n :style=\"{ cursor: props.draggable ? 'move' : 'default' }\"\r\n @pointerdown=\"(e) => onHeaderPointerDown(e, widget)\"\r\n >\r\n {{ widget.title ?? widget.id }}\r\n </div>\r\n <div :class=\"!props.unstyled ? 'sg-dashboard-widget-body' : undefined\">\r\n <slot name=\"widget\" :widget=\"widget\" />\r\n </div>\r\n <div\r\n v-if=\"props.resizable\"\r\n class=\"sg-dashboard-resize-handle\"\r\n :style=\"{\r\n position: 'absolute',\r\n right: 0,\r\n bottom: 0,\r\n width: '12px',\r\n height: '12px',\r\n cursor: 'se-resize',\r\n }\"\r\n @pointerdown=\"(e) => onResizePointerDown(e, widget)\"\r\n />\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport type { GanttProps, GanttResource, GanttScale, GanttTask } from './types'\n\nconst props = withDefaults(defineProps<GanttProps>(), {\n scale: 'day',\n rowHeight: 32,\n columnWidth: 40,\n sidebarWidth: 200,\n draggable: false,\n resizable: false,\n unstyled: false,\n})\n\nconst emit = defineEmits<{\n (e: 'task-change', task: GanttTask): void\n}>()\n\nconst MS_PER_DAY = 24 * 60 * 60 * 1000\n\nconst stepMs = (scale: GanttScale): number => {\n switch (scale) {\n case 'day':\n return MS_PER_DAY\n case 'week':\n return MS_PER_DAY * 7\n case 'month':\n return MS_PER_DAY * 30\n case 'quarter':\n return MS_PER_DAY * 90\n }\n}\n\nconst toMs = (d: Date | number): number => (d instanceof Date ? d.getTime() : d)\n\nconst computedRange = computed(() => {\n if (props.range) return { from: props.range.from.getTime(), to: props.range.to.getTime() }\n if (props.tasks.length === 0) {\n const now = Date.now()\n return { from: now, to: now + MS_PER_DAY * 7 }\n }\n let min = Infinity\n let max = -Infinity\n for (const t of props.tasks) {\n const s = toMs(t.start)\n const e = toMs(t.end)\n if (s < min) min = s\n if (e > max) max = e\n }\n const step = stepMs(props.scale)\n return { from: min - step, to: max + step }\n})\n\nconst totalMs = computed(() => computedRange.value.to - computedRange.value.from)\n\nconst rows = computed<{ key: string; label: string; tasks: GanttTask[] }[]>(() => {\n if (!props.resources || props.resources.length === 0) {\n return props.tasks.map((t) => ({ key: t.id, label: t.name, tasks: [t] }))\n }\n return props.resources.map((res: GanttResource) => ({\n key: res.id,\n label: res.name,\n tasks: props.tasks.filter((t) => t.resourceId === res.id),\n }))\n})\n\nconst totalSteps = computed(() => Math.max(1, Math.ceil(totalMs.value / stepMs(props.scale))))\nconst ganttWidth = computed(() => totalSteps.value * props.columnWidth)\n\nconst headerTicks = computed(() => {\n const arr: { x: number; label: string }[] = []\n const step = stepMs(props.scale)\n for (let i = 0; i <= totalSteps.value; i++) {\n const t = computedRange.value.from + i * step\n const d = new Date(t)\n let label = ''\n switch (props.scale) {\n case 'day':\n label = `${d.getUTCDate()}`\n break\n case 'week':\n label = `W${Math.ceil((d.getUTCDate() + 6) / 7)}`\n break\n case 'month':\n label = `${String(d.getUTCMonth() + 1).padStart(2, '0')}`\n break\n case 'quarter':\n label = `Q${Math.ceil((d.getUTCMonth() + 1) / 3)}`\n break\n }\n arr.push({ x: i * props.columnWidth, label })\n }\n return arr\n})\n\nconst taskBarStyle = (task: GanttTask) => {\n const start = toMs(task.start)\n const end = toMs(task.end)\n const x = ((start - computedRange.value.from) / totalMs.value) * ganttWidth.value\n const width = Math.max(8, ((end - start) / totalMs.value) * ganttWidth.value)\n return {\n left: `${x}px`,\n width: `${width}px`,\n background: task.color ?? 'var(--sg-color-primary, #1677ff)',\n }\n}\n\ninterface DragSession {\n type: 'move' | 'resize'\n taskId: string\n startX: number\n origin: { start: number; end: number }\n}\n\nlet dragSession: DragSession | null = null\n\nconst onBarPointerDown = (e: PointerEvent, task: GanttTask) => {\n if (!props.draggable) return\n ;(e.target as HTMLElement).setPointerCapture?.(e.pointerId)\n dragSession = {\n type: 'move',\n taskId: task.id,\n startX: e.clientX,\n origin: { start: toMs(task.start), end: toMs(task.end) },\n }\n}\n\nconst onResizePointerDown = (e: PointerEvent, task: GanttTask) => {\n if (!props.resizable) return\n e.stopPropagation()\n ;(e.target as HTMLElement).setPointerCapture?.(e.pointerId)\n dragSession = {\n type: 'resize',\n taskId: task.id,\n startX: e.clientX,\n origin: { start: toMs(task.start), end: toMs(task.end) },\n }\n}\n\nconst onPointerMove = (e: PointerEvent) => {\n const ds = dragSession\n if (!ds) return\n const dxPx = e.clientX - ds.startX\n const dxMs = (dxPx / ganttWidth.value) * totalMs.value\n const step = stepMs(props.scale)\n const snappedDx = Math.round(dxMs / step) * step\n const task = props.tasks.find((t) => t.id === ds.taskId)\n if (!task) return\n const next: GanttTask =\n ds.type === 'move'\n ? { ...task, start: ds.origin.start + snappedDx, end: ds.origin.end + snappedDx }\n : { ...task, end: Math.max(ds.origin.start + step, ds.origin.end + snappedDx) }\n emit('task-change', next)\n}\n\nconst onPointerUp = () => {\n dragSession = null\n}\n\nconst containerRef = ref<HTMLDivElement | null>(null)\n\ndefineExpose({ containerRef })\n</script>\n\n<template>\n <div\n ref=\"containerRef\"\n :class=\"[!props.unstyled && 'sg-gantt', props.className]\"\n :style=\"{ display: 'flex', overflow: 'auto', ...(props.style ?? {}) }\"\n role=\"grid\"\n aria-label=\"Gantt chart\"\n @pointermove=\"onPointerMove\"\n @pointerup=\"onPointerUp\"\n >\n <div class=\"sg-gantt-sidebar\" :style=\"{ width: `${props.sidebarWidth}px`, flexShrink: 0 }\">\n <div\n :class=\"!props.unstyled ? 'sg-gantt-sidebar-header' : undefined\"\n :style=\"{ height: `${props.rowHeight}px` }\"\n />\n <div\n v-for=\"row in rows\"\n :key=\"row.key\"\n :class=\"!props.unstyled ? 'sg-gantt-sidebar-row' : undefined\"\n :style=\"{ height: `${props.rowHeight}px` }\"\n >\n {{ row.label }}\n </div>\n </div>\n <div class=\"sg-gantt-body\" :style=\"{ position: 'relative', flex: 1 }\">\n <div\n :class=\"!props.unstyled ? 'sg-gantt-header' : undefined\"\n :style=\"{\n height: `${props.rowHeight}px`,\n width: `${ganttWidth}px`,\n position: 'relative',\n borderBottom: '1px solid #e0e0e0',\n }\"\n >\n <div\n v-for=\"(t, i) in headerTicks\"\n :key=\"i\"\n :style=\"{\n position: 'absolute',\n left: `${t.x}px`,\n top: 0,\n bottom: 0,\n width: `${props.columnWidth}px`,\n borderLeft: '1px solid #e0e0e0',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: '10px',\n color: '#888',\n }\"\n >\n {{ t.label }}\n </div>\n </div>\n <div\n v-for=\"row in rows\"\n :key=\"row.key\"\n :data-row-key=\"row.key\"\n :class=\"!props.unstyled ? 'sg-gantt-row' : undefined\"\n :style=\"{\n position: 'relative',\n height: `${props.rowHeight}px`,\n width: `${ganttWidth}px`,\n borderBottom: '1px solid #f0f0f0',\n }\"\n >\n <div\n v-for=\"task in row.tasks\"\n :key=\"task.id\"\n :data-task-id=\"task.id\"\n :class=\"!props.unstyled ? 'sg-gantt-bar' : undefined\"\n :style=\"{\n position: 'absolute',\n top: '4px',\n height: `${props.rowHeight - 8}px`,\n borderRadius: '4px',\n color: '#fff',\n padding: '0 6px',\n fontSize: '11px',\n display: 'flex',\n alignItems: 'center',\n cursor: props.draggable ? 'move' : 'default',\n ...taskBarStyle(task),\n }\"\n @pointerdown=\"(e) => onBarPointerDown(e, task)\"\n >\n <span class=\"sg-gantt-bar-label\">{{ task.name }}</span>\n <div\n v-if=\"props.resizable\"\n class=\"sg-gantt-bar-resize\"\n :style=\"{\n position: 'absolute',\n right: 0,\n top: 0,\n bottom: 0,\n width: '6px',\n cursor: 'ew-resize',\n }\"\n @pointerdown=\"(e) => onResizePointerDown(e, task)\"\n />\n <div\n v-if=\"task.progress !== undefined\"\n class=\"sg-gantt-bar-progress\"\n :style=\"{\n position: 'absolute',\n left: 0,\n top: 0,\n bottom: 0,\n width: `${(task.progress ?? 0) * 100}%`,\n background: 'rgba(255,255,255,0.3)',\n pointerEvents: 'none',\n }\"\n />\n </div>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\r\nimport { computed, type CSSProperties } from 'vue'\r\nimport type { EventTimelineProps, TimelineEvent, TimelineGroupBy } from './types'\r\n\r\nconst props = withDefaults(defineProps<EventTimelineProps>(), {\r\n orientation: 'vertical',\r\n unstyled: false,\r\n})\r\n\r\ndefineSlots<{\r\n marker(props: { event: TimelineEvent }): unknown\r\n event(props: { event: TimelineEvent }): unknown\r\n}>()\r\n\r\nfunction toMs(v: Date | number): number {\r\n return v instanceof Date ? v.getTime() : v\r\n}\r\n\r\nfunction bucketKey(timeMs: number, groupBy: TimelineGroupBy): string {\r\n const d = new Date(timeMs)\r\n const y = d.getUTCFullYear()\r\n const m = d.getUTCMonth() + 1\r\n const day = d.getUTCDate()\r\n switch (groupBy) {\r\n case 'day':\r\n return `${y}-${String(m).padStart(2, '0')}-${String(day).padStart(2, '0')}`\r\n case 'month':\r\n return `${y}-${String(m).padStart(2, '0')}`\r\n case 'year':\r\n return `${y}`\r\n }\r\n}\r\n\r\nfunction bucketLabel(timeMs: number, groupBy: TimelineGroupBy): string {\r\n const d = new Date(timeMs)\r\n const y = d.getUTCFullYear()\r\n const m = String(d.getUTCMonth() + 1).padStart(2, '0')\r\n const day = String(d.getUTCDate()).padStart(2, '0')\r\n switch (groupBy) {\r\n case 'day':\r\n return `${day}.${m}.${y}`\r\n case 'month':\r\n return `${m}.${y}`\r\n case 'year':\r\n return `${y}`\r\n }\r\n}\r\n\r\nconst sorted = computed(() => [...props.events].sort((a, b) => toMs(a.date) - toMs(b.date)))\r\n\r\ninterface Group {\r\n key: string\r\n label: string\r\n events: TimelineEvent[]\r\n}\r\n\r\nconst groups = computed<Group[]>(() => {\r\n if (!props.groupBy) return [{ key: 'all', label: '', events: sorted.value }]\r\n const out: Group[] = []\r\n let current: Group | null = null\r\n for (const ev of sorted.value) {\r\n const key = bucketKey(toMs(ev.date), props.groupBy)\r\n if (!current || current.key !== key) {\r\n current = { key, label: bucketLabel(toMs(ev.date), props.groupBy), events: [] }\r\n out.push(current)\r\n }\r\n current.events.push(ev)\r\n }\r\n return out\r\n})\r\n\r\nconst wrapperClass = computed(() => {\r\n if (props.unstyled) return [props.className].filter(Boolean).join(' ')\r\n return ['sg-event-timeline', `sg-event-timeline-${props.orientation}`, props.className]\r\n .filter(Boolean)\r\n .join(' ')\r\n})\r\n\r\nconst wrapperStyle = computed<CSSProperties>(() => ({\r\n display: 'flex',\r\n flexDirection: props.orientation === 'horizontal' ? 'row' : 'column',\r\n ...(props.style ?? {}),\r\n}))\r\n</script>\r\n\r\n<template>\r\n <div\r\n :class=\"wrapperClass\"\r\n :style=\"wrapperStyle\"\r\n role=\"list\"\r\n aria-label=\"Timeline\"\r\n :data-orientation=\"props.orientation\"\r\n :data-group-by=\"props.groupBy ?? 'none'\"\r\n >\r\n <template v-for=\"group in groups\" :key=\"group.key\">\r\n <div\r\n v-if=\"props.groupBy\"\r\n :class=\"props.unstyled ? undefined : 'sg-event-timeline-group'\"\r\n :data-group-key=\"group.key\"\r\n >\r\n {{ group.label }}\r\n </div>\r\n <div\r\n v-for=\"ev in group.events\"\r\n :key=\"ev.id\"\r\n :class=\"props.unstyled ? undefined : 'sg-event-timeline-item'\"\r\n role=\"listitem\"\r\n :data-event-id=\"ev.id\"\r\n :data-event-time=\"ev.date instanceof Date ? ev.date.getTime() : ev.date\"\r\n >\r\n <div :class=\"props.unstyled ? undefined : 'sg-event-timeline-marker'\">\r\n <slot name=\"marker\" :event=\"ev\">\r\n <span\r\n :class=\"props.unstyled ? undefined : 'sg-event-timeline-dot'\"\r\n :style=\"ev.color ? { background: ev.color } : undefined\"\r\n aria-hidden=\"true\"\r\n />\r\n </slot>\r\n </div>\r\n <div :class=\"props.unstyled ? undefined : 'sg-event-timeline-content'\">\r\n <slot name=\"event\" :event=\"ev\">\r\n <div :class=\"props.unstyled ? undefined : 'sg-event-timeline-title'\">\r\n {{ ev.title }}\r\n </div>\r\n <div\r\n v-if=\"ev.description !== undefined\"\r\n :class=\"props.unstyled ? undefined : 'sg-event-timeline-description'\"\r\n >\r\n {{ ev.description }}\r\n </div>\r\n </slot>\r\n </div>\r\n </div>\r\n </template>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport type { Assignment, CalendarScale, ResourceCalendarProps } from './types'\n\nconst props = withDefaults(defineProps<ResourceCalendarProps>(), {\n scale: 'week',\n columnWidth: 120,\n rowHeight: 56,\n sidebarWidth: 200,\n draggable: false,\n resizable: false,\n unstyled: false,\n})\n\nconst emit = defineEmits<{\n (e: 'assignment-change', next: Assignment): void\n (e: 'assignmentChange', next: Assignment): void\n (e: 'conflict', conflicts: Array<{ a: Assignment; b: Assignment }>): void\n}>()\n\nconst MS_PER_DAY = 24 * 60 * 60 * 1000\n\nconst stepMs = (scale: CalendarScale): number => {\n switch (scale) {\n case 'day':\n return MS_PER_DAY\n case 'week':\n return MS_PER_DAY * 7\n case 'month':\n return MS_PER_DAY * 30\n }\n}\n\nconst toMs = (d: Date | number) => (d instanceof Date ? d.getTime() : d)\n\nfunction alignDown(t: number, step: number): number {\n return Math.floor(t / step) * step\n}\nfunction alignUp(t: number, step: number): number {\n return Math.ceil(t / step) * step\n}\n\nconst computedRange = computed(() => {\n const step = stepMs(props.scale)\n\n // Scan the live assignments so the timeline can grow past `props.range`\n // when the user drag-resizes a bar past the right-hand edge. Without this\n // the bar would render off-screen and leave the user without any visual\n // feedback for the resize.\n let assignmentMin = Infinity\n let assignmentMax = -Infinity\n for (const a of props.assignments) {\n const s = toMs(a.start)\n const e = toMs(a.end)\n if (s < assignmentMin) assignmentMin = s\n if (e > assignmentMax) assignmentMax = e\n }\n\n if (props.range) {\n const rangeFrom = props.range.from.getTime()\n const rangeTo = props.range.to.getTime()\n if (props.assignments.length === 0) {\n return { from: rangeFrom, to: rangeTo }\n }\n // `range` is treated as the *minimum* viewport — assignments may pull\n // the visible window further in either direction (aligned to step so\n // the column grid stays whole).\n return {\n from: alignDown(Math.min(rangeFrom, assignmentMin), step),\n to: alignUp(Math.max(rangeTo, assignmentMax), step),\n }\n }\n\n if (props.assignments.length === 0) {\n const now = Date.now()\n return { from: alignDown(now, step), to: alignUp(now + step * 4, step) }\n }\n return {\n from: alignDown(assignmentMin - step, step),\n to: alignUp(assignmentMax + step, step),\n }\n})\n\nconst totalMs = computed(() => computedRange.value.to - computedRange.value.from)\nconst stepValue = computed(() => stepMs(props.scale))\nconst totalSteps = computed(() => Math.max(1, Math.ceil(totalMs.value / stepValue.value)))\nconst pxPerMs = computed(() => props.columnWidth / stepValue.value)\nconst totalWidth = computed(() => totalMs.value * pxPerMs.value)\n\nconst headerHeight = computed(() => Math.max(28, Math.round(props.rowHeight * 0.6)))\nconst gridHeight = computed(() => props.resources.length * props.rowHeight)\nconst totalHeight = computed(() => gridHeight.value + headerHeight.value)\n\nfunction formatTick(timeMs: number, scale: CalendarScale): string {\n const d = new Date(timeMs)\n switch (scale) {\n case 'day': {\n const dd = String(d.getUTCDate()).padStart(2, '0')\n const mm = String(d.getUTCMonth() + 1).padStart(2, '0')\n return `${dd}.${mm}`\n }\n case 'week': {\n const dd = String(d.getUTCDate()).padStart(2, '0')\n const mm = String(d.getUTCMonth() + 1).padStart(2, '0')\n return `W ${dd}.${mm}`\n }\n case 'month': {\n const mm = String(d.getUTCMonth() + 1).padStart(2, '0')\n return `${mm}.${d.getUTCFullYear()}`\n }\n }\n}\n\nconst ticks = computed(() => {\n const arr: Array<{ x: number; label: string; time: number }> = []\n const step = stepValue.value\n for (let i = 0; i < totalSteps.value; i++) {\n const t = computedRange.value.from + i * step\n arr.push({\n x: i * props.columnWidth,\n label: formatTick(t, props.scale),\n time: t,\n })\n }\n return arr\n})\n\nconst rowIndexById = computed(() => {\n const m = new Map<string, number>()\n props.resources.forEach((r, i) => m.set(r.id, i))\n return m\n})\n\nconst conflictingIds = computed(() => {\n const ids = new Set<string>()\n const byResource = new Map<string, Assignment[]>()\n for (const a of props.assignments) {\n const list = byResource.get(a.resourceId) ?? []\n list.push(a)\n byResource.set(a.resourceId, list)\n }\n for (const list of byResource.values()) {\n for (let i = 0; i < list.length; i++) {\n for (let j = i + 1; j < list.length; j++) {\n const aS = toMs(list[i].start)\n const aE = toMs(list[i].end)\n const bS = toMs(list[j].start)\n const bE = toMs(list[j].end)\n if (aS < bE && bS < aE) {\n ids.add(list[i].id)\n ids.add(list[j].id)\n }\n }\n }\n }\n return ids\n})\n\nconst assignmentRects = computed(() => {\n return props.assignments\n .map((a) => {\n const row = rowIndexById.value.get(a.resourceId)\n if (row === undefined) return null\n const startMs = toMs(a.start)\n const endMs = toMs(a.end)\n const x = (startMs - computedRange.value.from) * pxPerMs.value\n const w = Math.max(2, (endMs - startMs) * pxPerMs.value)\n const y = row * props.rowHeight\n return { assignment: a, x, y, w, h: props.rowHeight, row }\n })\n .filter((r): r is NonNullable<typeof r> => r !== null)\n})\n\nfunction statusOf(a: Assignment): string {\n if (conflictingIds.value.has(a.id)) return 'conflict'\n return a.status ?? 'tentative'\n}\n\nfunction blockClass(a: Assignment): string {\n if (props.unstyled) return ''\n return [\n 'sg-rcal-assignment',\n `sg-rcal-assignment-${statusOf(a)}`,\n props.draggable ? 'sg-rcal-assignment-draggable' : '',\n props.resizable ? 'sg-rcal-assignment-resizable' : '',\n ]\n .filter(Boolean)\n .join(' ')\n}\n\nfunction colorOverrideFor(a: Assignment): string | undefined {\n if (statusOf(a) === 'conflict') return undefined\n return props.resources.find((r) => r.id === a.resourceId)?.color\n}\n\ninterface DragSession {\n kind: 'move' | 'resize-start' | 'resize-end'\n id: string\n startClientX: number\n origStart: number\n origEnd: number\n}\n\nconst drag = ref<DragSession | null>(null)\n\nfunction startInteraction(\n e: PointerEvent,\n a: Assignment,\n kind: 'move' | 'resize-start' | 'resize-end',\n) {\n if (e.button !== 0) return\n if (kind === 'move' && !props.draggable) return\n if (kind !== 'move' && !props.resizable) return\n e.preventDefault()\n e.stopPropagation()\n ;(e.target as HTMLElement).setPointerCapture?.(e.pointerId)\n drag.value = {\n kind,\n id: a.id,\n startClientX: e.clientX,\n origStart: toMs(a.start),\n origEnd: toMs(a.end),\n }\n}\n\nfunction onPointerMove(e: PointerEvent) {\n const d = drag.value\n if (!d) return\n const a = props.assignments.find((x) => x.id === d.id)\n if (!a) return\n const dxPx = e.clientX - d.startClientX\n const dxMs = dxPx / pxPerMs.value\n const step = stepValue.value\n const snappedDx = Math.round(dxMs / step) * step\n let nextStart = d.origStart\n let nextEnd = d.origEnd\n if (d.kind === 'move') {\n nextStart = d.origStart + snappedDx\n nextEnd = d.origEnd + snappedDx\n } else if (d.kind === 'resize-end') {\n nextEnd = Math.max(d.origStart + step, d.origEnd + snappedDx)\n } else {\n nextStart = Math.min(d.origEnd - step, d.origStart + snappedDx)\n }\n const next: Assignment = { ...a, start: nextStart, end: nextEnd }\n emit('assignment-change', next)\n emit('assignmentChange', next)\n}\n\nfunction onPointerUp() {\n drag.value = null\n}\n\nfunction onAssignmentKeyDown(e: KeyboardEvent, a: Assignment) {\n if (!props.draggable && !props.resizable) return\n const step = stepValue.value\n const startMs = toMs(a.start)\n const endMs = toMs(a.end)\n if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') {\n const dir = e.key === 'ArrowLeft' ? -1 : 1\n e.preventDefault()\n let next: Assignment\n if (e.shiftKey && props.resizable) {\n next = { ...a, start: startMs, end: Math.max(startMs + step, endMs + dir * step) }\n } else if (props.draggable) {\n next = { ...a, start: startMs + dir * step, end: endMs + dir * step }\n } else {\n return\n }\n emit('assignment-change', next)\n emit('assignmentChange', next)\n }\n}\n\nconst wrapperClass = computed(() => {\n if (props.unstyled) return props.className ?? ''\n return ['sg-rcal', props.className].filter(Boolean).join(' ')\n})\n\nconst wrapperStyle = computed(() => ({\n display: 'grid',\n gridTemplateColumns: `${props.sidebarWidth}px 1fr`,\n width: '100%',\n overflow: 'auto',\n height: `${totalHeight.value}px`,\n ...(props.style ?? {}),\n}))\n</script>\n\n<template>\n <div\n :class=\"wrapperClass\"\n :style=\"wrapperStyle\"\n role=\"region\"\n aria-label=\"Resource calendar\"\n :data-scale=\"scale\"\n :data-conflict-count=\"conflictingIds.size\"\n @pointermove=\"onPointerMove\"\n @pointerup=\"onPointerUp\"\n >\n <!-- Sidebar -->\n <div :class=\"unstyled ? undefined : 'sg-rcal-sidebar'\" :style=\"{ width: `${sidebarWidth}px` }\">\n <div\n :class=\"unstyled ? undefined : 'sg-rcal-sidebar-header'\"\n :style=\"{ height: `${headerHeight}px` }\"\n />\n <div\n v-for=\"(r, i) in resources\"\n :key=\"r.id\"\n :class=\"unstyled ? undefined : 'sg-rcal-sidebar-row'\"\n :style=\"{ height: `${rowHeight}px` }\"\n role=\"row\"\n :aria-label=\"`Resource ${r.name}`\"\n :data-row-index=\"i\"\n :data-resource-id=\"r.id\"\n >\n <span\n :class=\"unstyled ? undefined : 'sg-rcal-sidebar-marker'\"\n :style=\"r.color ? { background: r.color } : undefined\"\n data-role=\"marker\"\n aria-hidden=\"true\"\n />\n <span :class=\"unstyled ? undefined : 'sg-rcal-sidebar-name'\">{{ r.name }}</span>\n <span\n v-if=\"r.capacityPerSlot !== undefined\"\n :class=\"unstyled ? undefined : 'sg-rcal-sidebar-capacity'\"\n :aria-label=\"`capacity ${r.capacityPerSlot} per slot`\"\n >×{{ r.capacityPerSlot }}</span\n >\n </div>\n </div>\n\n <!-- Main pane -->\n <div\n :class=\"unstyled ? undefined : 'sg-rcal-main'\"\n :style=\"{ position: 'relative', width: `${totalWidth}px`, minWidth: '100%' }\"\n >\n <div\n :class=\"unstyled ? undefined : 'sg-rcal-header'\"\n :style=\"{ position: 'relative', height: `${headerHeight}px`, width: `${totalWidth}px` }\"\n >\n <div\n v-for=\"t in ticks\"\n :key=\"t.time\"\n :class=\"unstyled ? undefined : 'sg-rcal-tick'\"\n :style=\"{\n position: 'absolute',\n left: `${t.x}px`,\n top: 0,\n width: `${columnWidth}px`,\n height: `${headerHeight}px`,\n }\"\n :data-tick-time=\"t.time\"\n >\n {{ t.label }}\n </div>\n </div>\n\n <div\n :class=\"unstyled ? undefined : 'sg-rcal-grid'\"\n :style=\"{\n position: 'relative',\n width: `${totalWidth}px`,\n height: `${gridHeight}px`,\n }\"\n :data-conflict-count=\"conflictingIds.size\"\n >\n <!-- Row backgrounds -->\n <div\n v-for=\"(r, i) in resources\"\n :key=\"r.id\"\n :class=\"unstyled ? undefined : 'sg-rcal-row'\"\n :style=\"{\n position: 'absolute',\n left: 0,\n top: `${i * rowHeight}px`,\n width: `${totalWidth}px`,\n height: `${rowHeight}px`,\n }\"\n :data-row-index=\"i\"\n :data-resource-id=\"r.id\"\n >\n <div\n v-for=\"t in ticks\"\n :key=\"t.time\"\n :class=\"unstyled ? undefined : 'sg-rcal-slot'\"\n :style=\"{\n position: 'absolute',\n left: `${t.x}px`,\n top: 0,\n width: `${columnWidth}px`,\n height: `${rowHeight}px`,\n }\"\n :data-slot-time=\"t.time\"\n />\n </div>\n\n <!-- Assignment blocks -->\n <div\n v-for=\"rect in assignmentRects\"\n :key=\"rect.assignment.id\"\n :class=\"blockClass(rect.assignment)\"\n :style=\"{\n position: 'absolute',\n left: `${rect.x}px`,\n top: `${rect.y + 4}px`,\n width: `${rect.w}px`,\n height: `${rect.h - 8}px`,\n background: colorOverrideFor(rect.assignment),\n cursor: draggable ? 'grab' : undefined,\n userSelect: draggable || resizable ? 'none' : undefined,\n }\"\n role=\"button\"\n tabindex=\"0\"\n :aria-label=\"`${rect.assignment.title}${statusOf(rect.assignment) === 'conflict' ? ' (conflict)' : ''}`\"\n :data-assignment-id=\"rect.assignment.id\"\n :data-status=\"statusOf(rect.assignment)\"\n :data-resource-id=\"rect.assignment.resourceId\"\n @pointerdown=\"draggable ? startInteraction($event, rect.assignment, 'move') : undefined\"\n @keydown=\"(e: KeyboardEvent) => onAssignmentKeyDown(e, rect.assignment)\"\n >\n <div\n v-if=\"resizable\"\n :class=\"unstyled ? undefined : 'sg-rcal-assignment-resize-start'\"\n role=\"button\"\n aria-label=\"Resize start\"\n tabindex=\"-1\"\n data-role=\"resize-handle-start\"\n :style=\"{\n position: 'absolute',\n left: 0,\n top: 0,\n bottom: 0,\n width: '6px',\n cursor: 'ew-resize',\n }\"\n @pointerdown=\"(e: PointerEvent) => startInteraction(e, rect.assignment, 'resize-start')\"\n />\n <span\n :class=\"unstyled ? undefined : 'sg-rcal-assignment-title'\"\n :style=\"{ position: 'relative', zIndex: 1 }\"\n >{{ rect.assignment.title }}</span\n >\n <div\n v-if=\"resizable\"\n :class=\"unstyled ? undefined : 'sg-rcal-assignment-resize-end'\"\n role=\"button\"\n aria-label=\"Resize end\"\n tabindex=\"-1\"\n data-role=\"resize-handle-end\"\n :style=\"{\n position: 'absolute',\n right: 0,\n top: 0,\n bottom: 0,\n width: '6px',\n cursor: 'ew-resize',\n }\"\n @pointerdown=\"(e: PointerEvent) => startInteraction(e, rect.assignment, 'resize-end')\"\n />\n </div>\n </div>\n </div>\n </div>\n</template>\n","import type { InjectionKey, VNode } from 'vue'\r\nimport type { Core, FormEngine } from '@skygraph/core'\r\nimport type { UseFormReturn } from '../../../composables/useForm'\r\n\r\nexport interface FormContextValue {\r\n core: Core\r\n form: FormEngine\r\n formApi: UseFormReturn\r\n layout: 'horizontal' | 'vertical' | 'inline'\r\n size: 'small' | 'middle' | 'large'\r\n disabled: boolean\r\n colon?: boolean\r\n requiredMark?: boolean | 'optional'\r\n labelCol?: { span?: number; offset?: number }\r\n wrapperCol?: { span?: number; offset?: number }\r\n labelAlign?: 'left' | 'right'\r\n preserve?: boolean\r\n feedbackIcons?: {\r\n success?: VNode | string\r\n warning?: VNode | string\r\n error?: VNode | string\r\n validating?: VNode | string\r\n }\r\n}\r\n\r\nexport const formContextKey = Symbol('sg-form-context') as InjectionKey<FormContextValue>\r\n","import type { InjectionKey } from 'vue'\r\nimport type { FormEngine } from '@skygraph/core'\r\n\r\nexport interface FormProviderContextValue {\r\n registerForm: (name: string, form: FormEngine) => void\r\n unregisterForm: (name: string) => void\r\n onFormFinish?: (\r\n name: string,\r\n info: { values: Record<string, unknown>; forms: Record<string, FormEngine> },\r\n ) => void\r\n onFormChange?: (\r\n name: string,\r\n info: { changedFields: string[]; forms: Record<string, FormEngine> },\r\n ) => void\r\n forms: Record<string, FormEngine>\r\n}\r\n\r\nexport const formProviderContextKey = Symbol(\r\n 'sg-form-provider-context',\r\n) as InjectionKey<FormProviderContextValue>\r\n","<script setup lang=\"ts\">\r\nimport { computed, inject, onMounted, onBeforeUnmount, provide, ref } from 'vue'\r\nimport { useForm, type UseFormReturn, type UseFormOptions } from '../../../composables/useForm'\r\nimport { formContextKey } from './context'\r\nimport { formProviderContextKey } from './providerContext'\r\nimport type { ValidationMode } from '@skygraph/core'\r\n\r\nexport interface FormProps {\r\n /** Pre-existing form instance from `useForm()`. When provided, the\r\n * internal one is not created. */\r\n form?: UseFormReturn\r\n /** `name` attribute on the native `<form>` element. */\r\n name?: string\r\n /** Initial field values; passed straight to the underlying engine. */\r\n defaultValues?: Record<string, unknown>\r\n /** Antd-style alias for `defaultValues`. */\r\n initialValues?: Record<string, unknown>\r\n /** Layout of label / control. */\r\n layout?: 'horizontal' | 'vertical' | 'inline'\r\n /** Field/control size for context consumers. */\r\n size?: 'small' | 'middle' | 'large'\r\n /** Disables fields that read this value from form context. */\r\n disabled?: boolean\r\n /** When `true`, appends a colon after labels that support it. */\r\n colon?: boolean\r\n /** How required fields are marked. */\r\n requiredMark?: boolean | 'optional'\r\n /** Label column grid for horizontal layout. */\r\n labelCol?: { span?: number; offset?: number }\r\n /** Wrapper column grid for horizontal layout. */\r\n wrapperCol?: { span?: number; offset?: number }\r\n /** Text alignment for the label column. */\r\n labelAlign?: 'left' | 'right'\r\n /** Validation mode forwarded to the engine. */\r\n validateOn?: ValidationMode\r\n /** After submit, scroll the first invalid field into view. */\r\n scrollToFirstError?: boolean\r\n /** Keeps unmounted field values in the form store. */\r\n preserve?: boolean\r\n}\r\n\r\nconst props = withDefaults(defineProps<FormProps>(), {\r\n layout: 'vertical',\r\n size: 'middle',\r\n disabled: false,\r\n})\r\n\r\nconst emit = defineEmits<{\r\n (e: 'submit', payload: { values: Record<string, unknown>; valid: boolean }): void\r\n (e: 'finish', values: Record<string, unknown>): void\r\n (e: 'finishFailed', errors: Record<string, string[]>): void\r\n (e: 'valuesChange', values: Record<string, unknown>): void\r\n}>()\r\n\r\ndefineSlots<{\r\n default(props: { form: UseFormReturn }): unknown\r\n}>()\r\n\r\nconst formOptions = computed<UseFormOptions>(() => ({\r\n defaultValues: props.defaultValues ?? props.initialValues,\r\n validateOn: props.validateOn,\r\n onValuesChange: (_changed, all) => {\r\n emit('valuesChange', all)\r\n },\r\n}))\r\n\r\nconst internalForm = props.form ?? useForm(formOptions.value)\r\nconst formApi = internalForm\r\n\r\nconst formRef = ref<HTMLFormElement | null>(null)\r\n\r\nconst classes = computed(() =>\r\n [\r\n 'sg-form',\r\n `sg-form-${props.layout}`,\r\n `sg-form-${props.size}`,\r\n props.disabled ? 'sg-form-disabled' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' '),\r\n)\r\n\r\nprovide(formContextKey, {\r\n core: formApi.core,\r\n form: formApi.form,\r\n formApi,\r\n layout: props.layout,\r\n size: props.size,\r\n disabled: props.disabled,\r\n colon: props.colon,\r\n requiredMark: props.requiredMark,\r\n labelCol: props.labelCol,\r\n wrapperCol: props.wrapperCol,\r\n labelAlign: props.labelAlign,\r\n preserve: props.preserve,\r\n})\r\n\r\nconst provider = inject(formProviderContextKey, null)\r\nonMounted(() => {\r\n if (provider && props.name) {\r\n provider.registerForm(props.name, formApi.form)\r\n }\r\n})\r\nonBeforeUnmount(() => {\r\n if (provider && props.name) {\r\n provider.unregisterForm(props.name)\r\n }\r\n})\r\n\r\nasync function handleSubmit(e: Event) {\r\n e.preventDefault()\r\n await formApi.submit()\r\n const result = await formApi.validateFields()\r\n const values = formApi.getFieldsValue()\r\n\r\n emit('submit', { values, valid: result.valid })\r\n\r\n if (result.valid) {\r\n emit('finish', values)\r\n if (provider && props.name) {\r\n provider.onFormFinish?.(props.name, { values, forms: provider.forms })\r\n }\r\n } else {\r\n emit('finishFailed', result.errors)\r\n if (props.scrollToFirstError && formRef.value) {\r\n const firstErrorField = Object.keys(result.errors)[0]\r\n if (firstErrorField) {\r\n const el =\r\n formRef.value.querySelector(`[data-field-name=\"${firstErrorField}\"]`) ??\r\n formRef.value.querySelector(`[name=\"${firstErrorField}\"]`)\r\n if (el && 'scrollIntoView' in el) {\r\n (el as Element).scrollIntoView({ behavior: 'smooth', block: 'center' })\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\ndefineExpose({\r\n formApi,\r\n submit: () => formApi.submit(),\r\n reset: (values?: Record<string, unknown>) => formApi.reset(values),\r\n validate: () => formApi.validateFields(),\r\n getFieldsValue: () => formApi.getFieldsValue(),\r\n setFieldsValue: (values: Record<string, unknown>) => formApi.setFieldsValue(values),\r\n})\r\n</script>\r\n\r\n<template>\r\n <form\r\n ref=\"formRef\"\r\n :name=\"name\"\r\n :class=\"classes\"\r\n novalidate\r\n @submit=\"handleSubmit\"\r\n >\r\n <slot :form=\"formApi\" />\r\n </form>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { computed, inject, onBeforeUnmount, useSlots, watch } from 'vue'\r\nimport { useField } from '../../../composables/useField'\r\nimport { formContextKey } from './context'\r\nimport type { Rule, ValidationMode } from '@skygraph/core'\r\n\r\nexport interface FieldProps {\r\n /** Path of this field in the form store (required). */\r\n name: string\r\n /** Visible label text. */\r\n label?: string\r\n /** Validation rules. */\r\n rules?: Rule[]\r\n /** Warning rules — produce warnings without failing validation. */\r\n warningRules?: Rule[]\r\n /** When `true`, prepends a required rule in addition to `rules`. */\r\n required?: boolean\r\n /** Re-validates this field when any listed field changes. */\r\n dependencies?: string[]\r\n /** Events that trigger validation. */\r\n trigger?: ValidationMode | ValidationMode[]\r\n /** Helper text shown below the control when there are no errors / warnings. */\r\n help?: string\r\n /** Supplementary content below the control area. */\r\n extra?: string\r\n /** When `true`, value is preserved on unregister. */\r\n preserve?: boolean\r\n /** When `true`, the field renders nothing. */\r\n hidden?: boolean\r\n /** Disables the control; falls back to form context `disabled`. */\r\n disabled?: boolean\r\n /** Manual validation status badge. */\r\n validateStatus?: 'success' | 'warning' | 'error' | 'validating'\r\n /** Renders only the control without layout chrome. */\r\n noStyle?: boolean\r\n /** Maps raw change values before committing to the store. */\r\n normalize?: (value: unknown, prevValue: unknown) => unknown\r\n /** Stops after the first failing rule when validating. */\r\n validateFirst?: boolean\r\n /** Tooltip title wrapping the label text. */\r\n tooltip?: string\r\n /** Overrides form `labelCol` for this field in horizontal layout. */\r\n labelCol?: { span?: number; offset?: number }\r\n /** Overrides form `wrapperCol` for this field in horizontal layout. */\r\n wrapperCol?: { span?: number; offset?: number }\r\n}\r\n\r\nconst props = withDefaults(defineProps<FieldProps>(), {\r\n rules: () => [],\r\n required: false,\r\n hidden: false,\r\n noStyle: false,\r\n})\r\n\r\ndefineSlots<{\r\n default(props: {\r\n value: unknown\r\n onChange: (v: unknown) => void\r\n onBlur: () => void\r\n errors: string[]\r\n error: string | null\r\n warnings: string[]\r\n touched: boolean\r\n dirty: boolean\r\n validating: boolean\r\n status: string | undefined\r\n }): unknown\r\n label(props: Record<string, never>): unknown\r\n}>()\r\n\r\nconst injected = inject(formContextKey, null)\r\nif (!injected) {\r\n throw new Error('[skygraph/vue] <SgField> must be used inside an <SgForm>')\r\n}\r\nconst ctx = injected\r\n\r\nconst field = useField(ctx.core, ctx.form, props.name)\r\n\r\nconst disabled = computed(() => props.disabled ?? ctx.disabled)\r\n\r\nlet prevValue: unknown = field.value.value\r\nconst wrappedOnChange = (v: unknown) => {\r\n if (props.normalize) {\r\n const normalized = props.normalize(v, prevValue)\r\n prevValue = normalized\r\n field.onChange(normalized)\r\n } else {\r\n prevValue = v\r\n field.onChange(v)\r\n }\r\n}\r\n\r\nfunction registerField() {\r\n const allRules: Rule[] = [...(props.rules ?? [])]\r\n if (props.required) {\r\n allRules.unshift({ required: true })\r\n }\r\n ctx.form.register(props.name, {\r\n rules: allRules,\r\n warningRules: props.warningRules,\r\n dependencies: props.dependencies,\r\n validateOn: Array.isArray(props.trigger) ? props.trigger[0] : props.trigger,\r\n validateFirst: props.validateFirst,\r\n label: props.label,\r\n preserve: props.preserve ?? ctx.preserve,\r\n })\r\n}\r\n\r\nregisterField()\r\n\r\nwatch(\r\n () => [props.rules, props.required, props.warningRules, props.dependencies],\r\n () => {\r\n registerField()\r\n },\r\n { deep: true },\r\n)\r\n\r\nonBeforeUnmount(() => {\r\n ctx.form.unregister(props.name)\r\n})\r\n\r\nconst hasErrors = computed(() => field.errors.value.length > 0)\r\nconst hasWarnings = computed(() => field.warnings.value.length > 0)\r\nconst effectiveStatus = computed(() => props.validateStatus ?? field.status.value)\r\n\r\nconst fieldClasses = computed(() =>\r\n [\r\n 'sg-field',\r\n ctx.layout === 'horizontal' ? 'sg-field-horizontal' : '',\r\n hasErrors.value ? 'sg-field-has-error' : '',\r\n hasWarnings.value && !hasErrors.value ? 'sg-field-has-warning' : '',\r\n effectiveStatus.value ? `sg-field-status-${effectiveStatus.value}` : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' '),\r\n)\r\n\r\nconst slots = useSlots()\r\nconst hasLabelSlot = computed(() => Boolean(slots.label))\r\n</script>\r\n\r\n<template>\r\n <template v-if=\"!hidden\">\r\n <template v-if=\"noStyle\">\r\n <slot\r\n :value=\"field.value.value\"\r\n :on-change=\"wrappedOnChange\"\r\n :on-blur=\"field.onBlur\"\r\n :errors=\"field.errors.value\"\r\n :error=\"field.error.value\"\r\n :warnings=\"field.warnings.value\"\r\n :touched=\"field.touched.value\"\r\n :dirty=\"field.dirty.value\"\r\n :validating=\"field.validating.value\"\r\n :status=\"effectiveStatus\"\r\n />\r\n </template>\r\n <div v-else :class=\"fieldClasses\" :data-field-name=\"name\">\r\n <label v-if=\"label || hasLabelSlot\" class=\"sg-field-label\">\r\n <slot name=\"label\">{{ label }}</slot>\r\n <span v-if=\"required\" class=\"sg-field-required\">*</span>\r\n <template v-if=\"ctx.colon\">:</template>\r\n </label>\r\n <div class=\"sg-field-control\">\r\n <slot\r\n :value=\"field.value.value\"\r\n :on-change=\"wrappedOnChange\"\r\n :on-blur=\"field.onBlur\"\r\n :errors=\"field.errors.value\"\r\n :error=\"field.error.value\"\r\n :warnings=\"field.warnings.value\"\r\n :touched=\"field.touched.value\"\r\n :dirty=\"field.dirty.value\"\r\n :validating=\"field.validating.value\"\r\n :status=\"effectiveStatus\"\r\n >\r\n <input\r\n class=\"sg-input\"\r\n type=\"text\"\r\n :value=\"(field.value.value as string) ?? ''\"\r\n :disabled=\"disabled\"\r\n @input=\"(e) => wrappedOnChange((e.target as HTMLInputElement).value)\"\r\n @blur=\"field.onBlur\"\r\n />\r\n </slot>\r\n </div>\r\n <div v-if=\"hasErrors\" class=\"sg-field-error\" role=\"alert\">\r\n <div v-for=\"(err, i) in field.errors.value\" :key=\"i\">{{ err }}</div>\r\n </div>\r\n <div v-else-if=\"hasWarnings\" class=\"sg-field-warning\">\r\n <div v-for=\"(w, i) in field.warnings.value\" :key=\"i\">{{ w }}</div>\r\n </div>\r\n <div v-else-if=\"help\" class=\"sg-field-help\">{{ help }}</div>\r\n <div v-if=\"extra\" class=\"sg-field-extra\">{{ extra }}</div>\r\n </div>\r\n </template>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { computed, inject, onMounted, ref, watch } from 'vue'\r\nimport { formContextKey } from './context'\r\nimport type { FormListOperation } from '@skygraph/core'\r\n\r\nlet listUid = 0\r\nfunction genKey(): string {\r\n return `fl_${++listUid}`\r\n}\r\n\r\nexport interface FormListField {\r\n /** Stable key for v-for reconciliation. */\r\n key: string\r\n /** Zero-based index in the list value array. */\r\n index: number\r\n}\r\n\r\nexport interface FormListProps {\r\n /** Field path in the form store holding the array value. */\r\n name: string\r\n /** Seeds the store when the path is unset on first mount. */\r\n initialValue?: unknown[]\r\n}\r\n\r\nconst props = defineProps<FormListProps>()\r\n\r\ndefineSlots<{\r\n default(props: {\r\n fields: FormListField[]\r\n operation: FormListOperation\r\n meta: { errors: string[] }\r\n }): unknown\r\n}>()\r\n\r\nconst injected = inject(formContextKey, null)\r\nif (!injected) {\r\n throw new Error('[skygraph/vue] <SgFormList> must be used inside an <SgForm>')\r\n}\r\nconst ctx = injected\r\n\r\nonMounted(() => {\r\n if (props.initialValue && !Array.isArray(ctx.core.get(props.name))) {\r\n ctx.core.set(props.name, props.initialValue)\r\n }\r\n})\r\n\r\nconst items = ref<unknown[]>(\r\n Array.isArray(ctx.core.get(props.name)) ? (ctx.core.get(props.name) as unknown[]) : [],\r\n)\r\nconst keys = ref<string[]>(items.value.map(() => genKey()))\r\n\r\nconst unsub = ctx.core.subscribe(props.name, (v) => {\r\n const arr = Array.isArray(v) ? v : []\r\n items.value = arr\r\n})\r\n\r\nwatch(items, (newItems) => {\r\n if (newItems.length > keys.value.length) {\r\n const diff = newItems.length - keys.value.length\r\n keys.value = [...keys.value, ...Array.from({ length: diff }, () => genKey())]\r\n } else if (newItems.length < keys.value.length) {\r\n keys.value = keys.value.slice(0, newItems.length)\r\n }\r\n})\r\n\r\nconst fields = computed<FormListField[]>(() =>\r\n keys.value.slice(0, items.value.length).map((key, index) => ({ key, index })),\r\n)\r\n\r\nconst add = (defaultValue?: unknown, insertIndex?: number) => {\r\n ctx.form.listAdd(props.name, defaultValue, insertIndex)\r\n const k = genKey()\r\n if (insertIndex !== undefined && insertIndex >= 0 && insertIndex <= keys.value.length) {\r\n const next = [...keys.value]\r\n next.splice(insertIndex, 0, k)\r\n keys.value = next\r\n } else {\r\n keys.value = [...keys.value, k]\r\n }\r\n}\r\n\r\nconst remove = (index: number | number[]) => {\r\n ctx.form.listRemove(props.name, index)\r\n if (Array.isArray(index)) {\r\n const indices = new Set(index)\r\n keys.value = keys.value.filter((_, i) => !indices.has(i))\r\n } else {\r\n keys.value = keys.value.filter((_, i) => i !== index)\r\n }\r\n}\r\n\r\nconst move = (from: number, to: number) => {\r\n ctx.form.listMove(props.name, from, to)\r\n const next = [...keys.value]\r\n const [item] = next.splice(from, 1)\r\n next.splice(to, 0, item)\r\n keys.value = next\r\n}\r\n\r\nconst replace = (values: unknown[]) => {\r\n ctx.form.listReplace(props.name, values)\r\n keys.value = values.map(() => genKey())\r\n}\r\n\r\nconst operation: FormListOperation = { add, remove, move, replace }\r\n\r\nconst meta = computed(() => ({ errors: ctx.form.getFieldErrors(props.name) }))\r\n\r\nimport { onBeforeUnmount } from 'vue'\r\nonBeforeUnmount(() => unsub())\r\n</script>\r\n\r\n<template>\r\n <slot :fields=\"fields\" :operation=\"operation\" :meta=\"meta\" />\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { provide } from 'vue'\r\nimport { formProviderContextKey } from './providerContext'\r\nimport type { FormEngine } from '@skygraph/core'\r\n\r\nexport interface FormProviderProps {\r\n /** Tree of forms and other UI that may register with this provider. */\r\n}\r\n\r\ndefineProps<FormProviderProps>()\r\n\r\nconst emit = defineEmits<{\r\n (\r\n e: 'formFinish',\r\n name: string,\r\n info: { values: Record<string, unknown>; forms: Record<string, FormEngine> },\r\n ): void\r\n (\r\n e: 'formChange',\r\n name: string,\r\n info: { changedFields: string[]; forms: Record<string, FormEngine> },\r\n ): void\r\n}>()\r\n\r\ndefineSlots<{\r\n default(props: Record<string, never>): unknown\r\n}>()\r\n\r\nconst forms: Record<string, FormEngine> = {}\r\n\r\nprovide(formProviderContextKey, {\r\n registerForm: (name, form) => {\r\n forms[name] = form\r\n },\r\n unregisterForm: (name) => {\r\n delete forms[name]\r\n },\r\n onFormFinish: (name, info) => emit('formFinish', name, info),\r\n onFormChange: (name, info) => emit('formChange', name, info),\r\n forms,\r\n})\r\n\r\ndefineExpose({ forms })\r\n</script>\r\n\r\n<template>\r\n <slot />\r\n</template>\r\n","<script setup lang=\"ts\">\nimport { computed, inject } from 'vue'\nimport { formContextKey } from '../Form/context'\n\nexport type FieldType =\n | 'string'\n | 'number'\n | 'boolean'\n | 'email'\n | 'url'\n | 'date'\n | 'time'\n | 'textarea'\n | 'select'\n | 'multiselect'\n | 'password'\n | 'color'\n | 'slider'\n | 'rate'\n | 'file'\n | 'switch'\n | 'radio'\n\nexport interface AutoFieldOption {\n label: string\n value: string | number\n}\n\nexport interface AutoFieldProps {\n name: string\n label?: string\n type?: FieldType\n options?: AutoFieldOption[]\n placeholder?: string\n min?: number\n max?: number\n step?: number\n accept?: string\n multiple?: boolean\n disabled?: boolean\n}\n\nconst props = defineProps<AutoFieldProps>()\n\nconst injected = inject(formContextKey, null)\nif (!injected) {\n throw new Error('[skygraph/vue] <SgAutoField> must be used inside an <SgForm>')\n}\nconst ctx = injected\n\nconst value = computed(() => ctx.form.getValue(props.name))\nconst meta = computed(() => ctx.form.getFieldState(props.name))\n\nconst inferredType = computed<FieldType>(() => {\n if (props.type) return props.type\n if (props.options && props.options.length > 0) return 'select'\n const v = value.value\n if (typeof v === 'boolean') return 'boolean'\n if (typeof v === 'number') return 'number'\n if (typeof v === 'string') {\n if (v.includes('@')) return 'email'\n if (v.startsWith('http')) return 'url'\n }\n return 'string'\n})\n\nconst handleChange = (newValue: unknown) => {\n ctx.form.setValue(props.name, newValue)\n}\n\nconst isDisabled = computed(() => props.disabled ?? ctx.disabled)\n\nconst hasErrors = computed(() => meta.value.errors.length > 0)\nconst hasWarnings = computed(() => meta.value.warnings.length > 0)\nconst errorId = computed(() => `${props.name}-error`)\n\nconst fieldStateClass = computed(() => ({\n 'sg-autofield-input-error': hasErrors.value,\n 'sg-autofield-input-warning': !hasErrors.value && hasWarnings.value,\n}))\n</script>\n\n<style>\n/*\n * AutoField inputs use plain HTML elements (no `SgInput` wrapping) so they\n * stay framework-agnostic and round-trip native form behaviour. Painting\n * them through `<style>` blocks keeps the CSS scoped to the SchemaForm\n * package while still mirroring the React reference (`AutoField.tsx`\n * inline `inputStyle`).\n */\n.sg-autofield-input {\n width: 100%;\n padding: 6px 12px;\n border: 1px solid var(--sg-color-border, #d9d9d9);\n border-radius: var(--sg-border-radius, 6px);\n background: var(--sg-color-bg-container, #fff);\n color: var(--sg-color-text);\n font-size: 14px;\n font-family: inherit;\n line-height: 1.4;\n box-sizing: border-box;\n outline: none;\n transition: border-color var(--sg-transition-duration) var(--sg-transition-timing);\n}\n\n.sg-autofield-input:disabled {\n background: var(--sg-color-bg-disabled, #f5f5f5);\n color: var(--sg-color-text-disabled);\n cursor: not-allowed;\n}\n\n.sg-autofield-input:focus,\n.sg-autofield-input:focus-visible {\n border-color: var(--sg-color-primary);\n box-shadow: 0 0 0 2px var(--sg-color-primary-bg);\n}\n\n.sg-autofield-input-error {\n border-color: var(--sg-color-error, #ff4d4f);\n}\n\n.sg-autofield-input-warning {\n border-color: var(--sg-color-warning, #faad14);\n}\n\n.sg-autofield-input-textarea {\n min-height: 80px;\n resize: vertical;\n}\n\n.sg-autofield-input-color {\n width: 48px;\n height: 32px;\n padding: 2px;\n}\n</style>\n\n<template>\n <div class=\"sg-autofield\">\n <label\n v-if=\"inferredType !== 'boolean' && inferredType !== 'switch' && label\"\n style=\"font-weight: 500; font-size: 14px\"\n >\n {{ label }}\n </label>\n <template v-if=\"inferredType === 'boolean' || inferredType === 'switch'\">\n <label style=\"display: flex; align-items: center; gap: 8px; cursor: pointer\">\n <input\n type=\"checkbox\"\n :checked=\"!!value\"\n :disabled=\"isDisabled\"\n :role=\"inferredType === 'switch' ? 'switch' : undefined\"\n @change=\"(e) => handleChange((e.target as HTMLInputElement).checked)\"\n />\n {{ label }}\n </label>\n </template>\n <input\n v-else-if=\"inferredType === 'number'\"\n type=\"number\"\n class=\"sg-autofield-input\"\n :class=\"fieldStateClass\"\n :value=\"value == null ? '' : String(value)\"\n :placeholder=\"placeholder\"\n :disabled=\"isDisabled\"\n :min=\"min\"\n :max=\"max\"\n :step=\"step\"\n :aria-invalid=\"hasErrors || undefined\"\n :aria-describedby=\"hasErrors ? errorId : undefined\"\n @input=\"\n (e) => {\n const raw = (e.target as HTMLInputElement).value\n handleChange(raw === '' ? null : Number(raw))\n }\n \"\n @blur=\"ctx.form.onFieldBlur(name)\"\n />\n <textarea\n v-else-if=\"inferredType === 'textarea'\"\n class=\"sg-autofield-input sg-autofield-input-textarea\"\n :class=\"fieldStateClass\"\n :value=\"value == null ? '' : String(value)\"\n :placeholder=\"placeholder\"\n :disabled=\"isDisabled\"\n :aria-invalid=\"hasErrors || undefined\"\n :aria-describedby=\"hasErrors ? errorId : undefined\"\n @input=\"(e) => handleChange((e.target as HTMLTextAreaElement).value)\"\n @blur=\"ctx.form.onFieldBlur(name)\"\n />\n <select\n v-else-if=\"inferredType === 'select'\"\n class=\"sg-autofield-input\"\n :class=\"fieldStateClass\"\n :value=\"value == null ? '' : String(value)\"\n :disabled=\"isDisabled\"\n :aria-invalid=\"hasErrors || undefined\"\n :aria-describedby=\"hasErrors ? errorId : undefined\"\n @change=\"(e) => handleChange((e.target as HTMLSelectElement).value)\"\n >\n <option value=\"\">{{ placeholder ?? '-- Select --' }}</option>\n <option v-for=\"opt in options\" :key=\"opt.value\" :value=\"opt.value\">\n {{ opt.label }}\n </option>\n </select>\n <select\n v-else-if=\"inferredType === 'multiselect'\"\n multiple\n class=\"sg-autofield-input\"\n :class=\"fieldStateClass\"\n :value=\"Array.isArray(value) ? (value as (string | number)[]).map(String) : []\"\n :disabled=\"isDisabled\"\n :aria-invalid=\"hasErrors || undefined\"\n @change=\"\n (e) => {\n const sel = Array.from((e.target as HTMLSelectElement).selectedOptions, (o) => o.value)\n handleChange(sel)\n }\n \"\n >\n <option v-for=\"opt in options\" :key=\"opt.value\" :value=\"opt.value\">\n {{ opt.label }}\n </option>\n </select>\n <div\n v-else-if=\"inferredType === 'radio'\"\n role=\"radiogroup\"\n style=\"display: flex; gap: 12px; flex-wrap: wrap\"\n >\n <label\n v-for=\"opt in options\"\n :key=\"opt.value\"\n style=\"display: flex; align-items: center; gap: 4px; cursor: pointer\"\n >\n <input\n type=\"radio\"\n :name=\"name\"\n :value=\"opt.value\"\n :checked=\"value === opt.value\"\n :disabled=\"isDisabled\"\n @change=\"handleChange(opt.value)\"\n />\n {{ opt.label }}\n </label>\n </div>\n <input\n v-else-if=\"inferredType === 'date'\"\n type=\"date\"\n class=\"sg-autofield-input\"\n :class=\"fieldStateClass\"\n :value=\"value == null ? '' : String(value)\"\n :disabled=\"isDisabled\"\n :aria-invalid=\"hasErrors || undefined\"\n @input=\"(e) => handleChange((e.target as HTMLInputElement).value)\"\n />\n <input\n v-else-if=\"inferredType === 'time'\"\n type=\"time\"\n class=\"sg-autofield-input\"\n :class=\"fieldStateClass\"\n :value=\"value == null ? '' : String(value)\"\n :disabled=\"isDisabled\"\n :aria-invalid=\"hasErrors || undefined\"\n @input=\"(e) => handleChange((e.target as HTMLInputElement).value)\"\n />\n <input\n v-else-if=\"inferredType === 'password'\"\n type=\"password\"\n class=\"sg-autofield-input\"\n :class=\"fieldStateClass\"\n :value=\"value == null ? '' : String(value)\"\n :placeholder=\"placeholder\"\n :disabled=\"isDisabled\"\n :aria-invalid=\"hasErrors || undefined\"\n @input=\"(e) => handleChange((e.target as HTMLInputElement).value)\"\n @blur=\"ctx.form.onFieldBlur(name)\"\n />\n <input\n v-else-if=\"inferredType === 'color'\"\n type=\"color\"\n class=\"sg-autofield-input sg-autofield-input-color\"\n :value=\"value == null ? '#000000' : String(value)\"\n :disabled=\"isDisabled\"\n @input=\"(e) => handleChange((e.target as HTMLInputElement).value)\"\n />\n <div v-else-if=\"inferredType === 'slider'\" style=\"display: flex; align-items: center; gap: 8px\">\n <input\n type=\"range\"\n :value=\"value == null ? (min ?? 0) : Number(value)\"\n :min=\"min ?? 0\"\n :max=\"max ?? 100\"\n :step=\"step ?? 1\"\n :disabled=\"isDisabled\"\n style=\"flex: 1\"\n @input=\"(e) => handleChange(Number((e.target as HTMLInputElement).value))\"\n />\n <span style=\"min-width: 32px; text-align: right; font-size: 14px\">{{\n String(value ?? min ?? 0)\n }}</span>\n </div>\n <div v-else-if=\"inferredType === 'rate'\" style=\"display: flex; gap: 2px\">\n <button\n v-for=\"i in max ?? 5\"\n :key=\"i\"\n type=\"button\"\n :disabled=\"isDisabled\"\n :aria-label=\"`${i} star${i !== 1 ? 's' : ''}`\"\n :style=\"{\n background: 'none',\n border: 'none',\n cursor: isDisabled ? 'default' : 'pointer',\n fontSize: '20px',\n color:\n i <= (typeof value === 'number' ? value : 0)\n ? 'var(--sg-warning, #faad14)'\n : 'var(--sg-border, #d9d9d9)',\n padding: 0,\n }\"\n @click=\"!isDisabled && handleChange(i)\"\n >\n ★\n </button>\n </div>\n <input\n v-else-if=\"inferredType === 'file'\"\n type=\"file\"\n class=\"sg-autofield-input\"\n :class=\"fieldStateClass\"\n :accept=\"accept\"\n :multiple=\"multiple\"\n :disabled=\"isDisabled\"\n @change=\"\n (e) => {\n const files = (e.target as HTMLInputElement).files\n if (files) handleChange(multiple ? Array.from(files) : (files[0] ?? null))\n }\n \"\n />\n <input\n v-else\n :type=\"inferredType === 'email' ? 'email' : inferredType === 'url' ? 'url' : 'text'\"\n class=\"sg-autofield-input\"\n :class=\"fieldStateClass\"\n :value=\"value == null ? '' : String(value)\"\n :placeholder=\"placeholder\"\n :disabled=\"isDisabled\"\n :aria-invalid=\"hasErrors || undefined\"\n :aria-describedby=\"hasErrors ? errorId : undefined\"\n @input=\"(e) => handleChange((e.target as HTMLInputElement).value)\"\n @blur=\"ctx.form.onFieldBlur(name)\"\n />\n <span\n v-if=\"hasErrors\"\n :id=\"errorId\"\n role=\"alert\"\n style=\"color: var(--sg-error, #ff4d4f); font-size: 12px\"\n >\n {{ meta.errors.join('; ') }}\n </span>\n <span v-else-if=\"hasWarnings\" style=\"color: var(--sg-warning, #faad14); font-size: 12px\">\n {{ meta.warnings.join('; ') }}\n </span>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, type PropType } from 'vue'\nimport { useConfigWithDefaults } from './ConfigProvider.vue'\nimport type { SizeType } from '../../types'\n\nexport interface ButtonProps {\n /** Visual style variant. */\n type?: 'default' | 'primary' | 'dashed' | 'text' | 'link'\n /** Size token. */\n size?: SizeType\n /** Native HTML button type attribute. */\n htmlType?: 'button' | 'submit' | 'reset'\n /** Visually flags a destructive action. */\n danger?: boolean\n /** Stretches the button to fill its parent container. */\n block?: boolean\n /** Disables the button. */\n disabled?: boolean\n /** Shows a loading spinner and disables interaction. */\n loading?: boolean\n /** Strips built-in styles when true. */\n unstyled?: boolean\n}\n\nconst props = defineProps({\n type: {\n type: String as PropType<'default' | 'primary' | 'dashed' | 'text' | 'link'>,\n default: 'default',\n },\n size: { type: String as PropType<SizeType>, default: undefined },\n htmlType: {\n type: String as PropType<'button' | 'submit' | 'reset'>,\n default: 'button',\n },\n danger: { type: Boolean, default: false },\n block: { type: Boolean, default: false },\n disabled: { type: Boolean, default: undefined },\n loading: { type: Boolean, default: false },\n unstyled: { type: Boolean, default: false },\n})\n\nconst emit = defineEmits<{\n (e: 'click', evt: MouseEvent): void\n}>()\n\ndefineSlots<{\n default(props: Record<string, never>): unknown\n icon(props: Record<string, never>): unknown\n}>()\n\nconst { resolvedSize, resolvedDisabled } = useConfigWithDefaults(\n { size: undefined, disabled: undefined },\n {},\n)\n\nconst realSize = computed<SizeType>(() => props.size ?? resolvedSize.value)\nconst realDisabled = computed<boolean>(() => props.disabled ?? resolvedDisabled.value)\n\nconst classes = computed(() => {\n if (props.unstyled) return ''\n return [\n 'sg-button',\n `sg-button-${props.type}`,\n `sg-button-${realSize.value}`,\n props.danger ? 'sg-button-danger' : '',\n props.block ? 'sg-button-block' : '',\n props.loading ? 'sg-button-loading' : '',\n ]\n .filter(Boolean)\n .join(' ')\n})\n\nconst isDisabled = computed(() => realDisabled.value || props.loading)\n\nfunction handleClick(evt: MouseEvent) {\n if (isDisabled.value) {\n evt.preventDefault()\n evt.stopPropagation()\n return\n }\n emit('click', evt)\n}\n</script>\n\n<template>\n <button\n :type=\"htmlType\"\n :class=\"classes\"\n :disabled=\"isDisabled\"\n :aria-disabled=\"isDisabled\"\n :aria-busy=\"loading || undefined\"\n @click=\"handleClick\"\n >\n <span v-if=\"loading && !unstyled\" class=\"sg-spin sg-spin-small\" aria-hidden=\"true\" />\n <slot name=\"icon\" />\n <slot />\n </button>\n</template>\n","import type { Rule } from '@skygraph/core'\r\nimport type { FieldType, AutoFieldOption } from '../components/complex/SchemaForm/AutoField.vue'\r\n\r\nexport interface JSONSchemaProperty {\r\n type?: string\r\n title?: string\r\n description?: string\r\n default?: unknown\r\n enum?: unknown[]\r\n enumNames?: string[]\r\n minimum?: number\r\n maximum?: number\r\n minLength?: number\r\n maxLength?: number\r\n pattern?: string\r\n format?: string\r\n items?: JSONSchemaProperty\r\n required?: string[]\r\n properties?: Record<string, JSONSchemaProperty>\r\n oneOf?: Array<{ const: unknown; title?: string }>\r\n}\r\n\r\nexport interface JSONSchema extends JSONSchemaProperty {\r\n $schema?: string\r\n}\r\n\r\nexport interface AutoFieldConfig {\r\n name: string\r\n label?: string\r\n type: FieldType\r\n placeholder?: string\r\n options?: AutoFieldOption[]\r\n min?: number\r\n max?: number\r\n step?: number\r\n}\r\n\r\nfunction jsonTypeToFieldType(schema: JSONSchemaProperty): FieldType {\r\n if (schema.enum || schema.oneOf) return 'select'\r\n if (schema.format === 'email') return 'email'\r\n if (schema.format === 'uri' || schema.format === 'url') return 'url'\r\n if (schema.format === 'date') return 'date'\r\n if (schema.format === 'time') return 'time'\r\n if (schema.format === 'password') return 'password'\r\n if (schema.format === 'color') return 'color'\r\n\r\n switch (schema.type) {\r\n case 'number':\r\n case 'integer':\r\n return 'number'\r\n case 'boolean':\r\n return 'boolean'\r\n case 'array':\r\n return 'multiselect'\r\n default:\r\n if (schema.maxLength && schema.maxLength > 200) return 'textarea'\r\n return 'string'\r\n }\r\n}\r\n\r\nfunction buildOptions(schema: JSONSchemaProperty): AutoFieldOption[] | undefined {\r\n if (schema.oneOf) {\r\n return schema.oneOf.map((item) => ({\r\n value: item.const as string | number,\r\n label: item.title ?? String(item.const),\r\n }))\r\n }\r\n if (schema.enum) {\r\n return schema.enum.map((val, i) => ({\r\n value: val as string | number,\r\n label: schema.enumNames?.[i] ?? String(val),\r\n }))\r\n }\r\n return undefined\r\n}\r\n\r\nexport function jsonSchemaToFields(schema: JSONSchema): AutoFieldConfig[] {\r\n const result: AutoFieldConfig[] = []\r\n const props = schema.properties ?? {}\r\n for (const [name, prop] of Object.entries(props)) {\r\n result.push({\r\n name,\r\n label: prop.title ?? name,\r\n type: jsonTypeToFieldType(prop),\r\n placeholder: prop.description,\r\n options: buildOptions(prop),\r\n min: prop.minimum,\r\n max: prop.maximum,\r\n })\r\n }\r\n return result\r\n}\r\n\r\nexport function jsonSchemaToRules(schema: JSONSchema): Record<string, Rule[]> {\r\n const result: Record<string, Rule[]> = {}\r\n const props = schema.properties ?? {}\r\n const requiredFields = new Set(schema.required ?? [])\r\n\r\n for (const [name, prop] of Object.entries(props)) {\r\n const rules: Rule[] = []\r\n if (requiredFields.has(name)) {\r\n rules.push({ required: true, message: `${prop.title ?? name} is required` })\r\n }\r\n if (prop.type === 'string') {\r\n if (prop.minLength !== undefined) {\r\n rules.push({ min: prop.minLength, message: `Minimum ${prop.minLength} characters` })\r\n }\r\n if (prop.maxLength !== undefined) {\r\n rules.push({ max: prop.maxLength, message: `Maximum ${prop.maxLength} characters` })\r\n }\r\n if (prop.pattern) {\r\n rules.push({ pattern: new RegExp(prop.pattern), message: 'Invalid format' })\r\n }\r\n }\r\n if (prop.type === 'number' || prop.type === 'integer') {\r\n if (prop.minimum !== undefined) rules.push({ min: prop.minimum, type: 'number' })\r\n if (prop.maximum !== undefined) rules.push({ max: prop.maximum, type: 'number' })\r\n }\r\n if (prop.format === 'email') rules.push({ type: 'email' })\r\n if (prop.format === 'uri' || prop.format === 'url') rules.push({ type: 'url' })\r\n if (rules.length > 0) result[name] = rules\r\n }\r\n\r\n return result\r\n}\r\n\r\nexport function jsonSchemaToDefaults(schema: JSONSchema): Record<string, unknown> {\r\n const result: Record<string, unknown> = {}\r\n const props = schema.properties ?? {}\r\n for (const [name, prop] of Object.entries(props)) {\r\n if (prop.default !== undefined) {\r\n result[name] = prop.default\r\n }\r\n }\r\n return result\r\n}\r\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport SgForm from '../Form/Form.vue'\nimport SgField from '../Form/Field.vue'\nimport SgAutoField from './AutoField.vue'\nimport SgButton from '../../ui/Button.vue'\nimport { useForm, type UseFormReturn } from '../../../composables/useForm'\nimport {\n jsonSchemaToFields,\n jsonSchemaToRules,\n jsonSchemaToDefaults,\n type JSONSchema,\n} from '../../../adapters/jsonSchemaAdapter'\n\nexport interface SchemaFormProps {\n /** JSON Schema object. */\n schema: JSONSchema\n /** External form instance; otherwise an internal `useForm` is created with schema defaults. */\n form?: UseFormReturn\n /** Layout passed through to the inner Form. */\n layout?: 'horizontal' | 'vertical' | 'inline'\n /** Field/control size for context consumers. */\n size?: 'small' | 'middle' | 'large'\n /** Disables generated controls and the inner Form. */\n disabled?: boolean\n /** Label column grid for horizontal layout. */\n labelCol?: { span?: number; offset?: number }\n /** Wrapper column grid for horizontal layout. */\n wrapperCol?: { span?: number; offset?: number }\n /** Label for the default submit button when slot is empty. */\n submitText?: string\n}\n\nconst props = withDefaults(defineProps<SchemaFormProps>(), {\n layout: 'vertical',\n size: 'middle',\n disabled: false,\n submitText: 'Submit',\n})\n\nconst emit = defineEmits<{\n (e: 'submit', values: Record<string, unknown>): void\n}>()\n\ndefineSlots<{\n default(props: Record<string, never>): unknown\n}>()\n\nconst fields = computed(() => jsonSchemaToFields(props.schema))\nconst rulesMap = computed(() => jsonSchemaToRules(props.schema))\nconst defaults = computed(() => jsonSchemaToDefaults(props.schema))\n\nconst internalForm = useForm({\n defaultValues: defaults.value,\n onSubmit: (values) => emit('submit', values),\n})\nconst formInstance = computed(() => props.form ?? internalForm)\n</script>\n\n<template>\n <SgForm\n :form=\"formInstance\"\n :layout=\"layout\"\n :size=\"size\"\n :disabled=\"disabled\"\n :label-col=\"labelCol\"\n :wrapper-col=\"wrapperCol\"\n >\n <SgField\n v-for=\"fieldConfig in fields\"\n :key=\"fieldConfig.name\"\n :name=\"fieldConfig.name\"\n :label=\"fieldConfig.label\"\n :rules=\"rulesMap[fieldConfig.name]\"\n >\n <SgAutoField\n :name=\"fieldConfig.name\"\n :type=\"fieldConfig.type\"\n :options=\"fieldConfig.options\"\n :placeholder=\"fieldConfig.placeholder\"\n :min=\"fieldConfig.min\"\n :max=\"fieldConfig.max\"\n :disabled=\"disabled\"\n />\n </SgField>\n <slot>\n <SgButton type=\"primary\" html-type=\"submit\">{{ submitText }}</SgButton>\n </slot>\n </SgForm>\n</template>\n","<script setup lang=\"ts\">\nimport SgButton from '../../ui/Button.vue'\n\nexport interface SubmitButtonProps {\n /** Disables the button. */\n disabled?: boolean\n /** Shows a loading state on the button. */\n loading?: boolean\n /** Strips built-in button styles on the underlying button. */\n unstyled?: boolean\n}\n\nwithDefaults(defineProps<SubmitButtonProps>(), {\n disabled: false,\n loading: false,\n unstyled: false,\n})\n\ndefineSlots<{\n default(props: Record<string, never>): unknown\n}>()\n</script>\n\n<template>\n <SgButton\n type=\"primary\"\n htmlType=\"submit\"\n :disabled=\"disabled\"\n :loading=\"loading\"\n :unstyled=\"unstyled\"\n >\n <slot>Submit</slot>\n </SgButton>\n</template>\n","import type { FieldType } from '../SchemaForm/AutoField.vue'\r\n\r\nexport interface PaletteItem {\r\n type: FieldType\r\n label: string\r\n hint?: string\r\n glyph?: string\r\n}\r\n\r\nexport const DEFAULT_PALETTE_ITEMS: PaletteItem[] = [\r\n { type: 'string', label: 'Input', hint: 'Single-line text', glyph: 'T' },\r\n { type: 'textarea', label: 'Textarea', hint: 'Multi-line text', glyph: '¶' },\r\n { type: 'number', label: 'Number', hint: 'Numeric input', glyph: '#' },\r\n { type: 'select', label: 'Select', hint: 'Dropdown choice', glyph: '▾' },\r\n { type: 'radio', label: 'Radio', hint: 'Single choice', glyph: '◉' },\r\n { type: 'boolean', label: 'Checkbox', hint: 'Boolean toggle', glyph: '☐' },\r\n { type: 'switch', label: 'Switch', hint: 'On / off toggle', glyph: '⌨' },\r\n { type: 'date', label: 'Date', hint: 'Calendar picker', glyph: '📅' },\r\n { type: 'time', label: 'Time', hint: 'Clock picker', glyph: '🕒' },\r\n { type: 'slider', label: 'Slider', hint: 'Numeric range', glyph: '═' },\r\n { type: 'rate', label: 'Rate', hint: 'Star rating', glyph: '★' },\r\n { type: 'color', label: 'Color', hint: 'Color picker', glyph: '◐' },\r\n { type: 'email', label: 'Email', hint: 'Email input', glyph: '@' },\r\n { type: 'url', label: 'URL', hint: 'Link input', glyph: '↗' },\r\n { type: 'password', label: 'Password', hint: 'Masked input', glyph: '✱' },\r\n { type: 'file', label: 'File', hint: 'File upload', glyph: '⇪' },\r\n]\r\n\r\nexport const PALETTE_DATA_TYPE = 'application/x-sg-sfe-palette-type'\r\n","<script setup lang=\"ts\">\r\nimport type { FieldType } from '../SchemaForm/AutoField.vue'\r\nimport { DEFAULT_PALETTE_ITEMS, PALETTE_DATA_TYPE, type PaletteItem } from './palette'\r\n\r\nexport interface SchemaFormEditorPaletteProps {\r\n items?: PaletteItem[]\r\n}\r\n\r\nconst props = withDefaults(defineProps<SchemaFormEditorPaletteProps>(), {\r\n items: () => DEFAULT_PALETTE_ITEMS,\r\n})\r\n\r\nconst emit = defineEmits<{\r\n (e: 'itemActivate', type: FieldType): void\r\n}>()\r\n\r\nfunction handleDragStart(type: FieldType, e: DragEvent) {\r\n if (e.dataTransfer) {\r\n e.dataTransfer.setData(PALETTE_DATA_TYPE, type)\r\n e.dataTransfer.setData('text/plain', type)\r\n e.dataTransfer.effectAllowed = 'copy'\r\n }\r\n}\r\n\r\nfunction handleClick(type: FieldType) {\r\n emit('itemActivate', type)\r\n}\r\n\r\nfunction handleKeyDown(type: FieldType, e: KeyboardEvent) {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault()\r\n emit('itemActivate', type)\r\n }\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"sg-sfe-palette\" data-testid=\"sfe-palette\">\r\n <div class=\"sg-sfe-palette-title\">Fields</div>\r\n <div class=\"sg-sfe-palette-list\">\r\n <div\r\n v-for=\"item in props.items\"\r\n :key=\"item.type\"\r\n class=\"sg-sfe-palette-item\"\r\n :data-palette-type=\"item.type\"\r\n draggable=\"true\"\r\n tabindex=\"0\"\r\n role=\"button\"\r\n @dragstart=\"(e) => handleDragStart(item.type, e)\"\r\n @click=\"handleClick(item.type)\"\r\n @keydown=\"(e) => handleKeyDown(item.type, e)\"\r\n >\r\n <span class=\"sg-sfe-palette-item-glyph\" aria-hidden=\"true\">{{ item.glyph ?? '·' }}</span>\r\n <span class=\"sg-sfe-palette-item-body\">\r\n <span class=\"sg-sfe-palette-item-label\">{{ item.label }}</span>\r\n <span v-if=\"item.hint\" class=\"sg-sfe-palette-item-hint\">{{ item.hint }}</span>\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n","import type { JSONSchema, JSONSchemaProperty } from '../../../../adapters/jsonSchemaAdapter'\r\nimport type { FieldType } from '../../SchemaForm/AutoField.vue'\r\nimport type { EditorField, EditorSchema } from '../types'\r\n\r\nlet idCounter = 0\r\nfunction nextId(prefix = 'fld'): string {\r\n idCounter++\r\n return `${prefix}_${Date.now().toString(36)}_${idCounter}`\r\n}\r\n\r\nfunction fieldTypeToJsonSchemaType(\r\n type: FieldType,\r\n): { type: JSONSchemaProperty['type']; format?: string } {\r\n switch (type) {\r\n case 'string':\r\n case 'textarea':\r\n return { type: 'string' }\r\n case 'email':\r\n return { type: 'string', format: 'email' }\r\n case 'url':\r\n return { type: 'string', format: 'url' }\r\n case 'date':\r\n return { type: 'string', format: 'date' }\r\n case 'time':\r\n return { type: 'string', format: 'time' }\r\n case 'password':\r\n return { type: 'string', format: 'password' }\r\n case 'color':\r\n return { type: 'string', format: 'color' }\r\n case 'number':\r\n case 'slider':\r\n case 'rate':\r\n return { type: 'number' }\r\n case 'boolean':\r\n case 'switch':\r\n return { type: 'boolean' }\r\n case 'select':\r\n case 'radio':\r\n return { type: 'string' }\r\n case 'multiselect':\r\n return { type: 'array' }\r\n case 'file':\r\n return { type: 'string' }\r\n default:\r\n return { type: 'string' }\r\n }\r\n}\r\n\r\nfunction jsonSchemaPropertyToFieldType(prop: JSONSchemaProperty): FieldType {\r\n if (prop.enum || prop.oneOf) return 'select'\r\n if (prop.format === 'email') return 'email'\r\n if (prop.format === 'uri' || prop.format === 'url') return 'url'\r\n if (prop.format === 'date') return 'date'\r\n if (prop.format === 'time') return 'time'\r\n if (prop.format === 'password') return 'password'\r\n if (prop.format === 'color') return 'color'\r\n\r\n switch (prop.type) {\r\n case 'number':\r\n case 'integer':\r\n return 'number'\r\n case 'boolean':\r\n return 'boolean'\r\n case 'array':\r\n return 'multiselect'\r\n default:\r\n if (prop.maxLength && prop.maxLength > 200) return 'textarea'\r\n return 'string'\r\n }\r\n}\r\n\r\nexport function createEmptyEditorSchema(): EditorSchema {\r\n return { fields: [] }\r\n}\r\n\r\nexport function jsonSchemaToEditorSchema(schema: JSONSchema): EditorSchema {\r\n const props = schema.properties ?? {}\r\n const required = new Set(schema.required ?? [])\r\n\r\n const fields: EditorField[] = []\r\n for (const [name, prop] of Object.entries(props)) {\r\n const ftype = jsonSchemaPropertyToFieldType(prop)\r\n fields.push({\r\n id: nextId('imp'),\r\n name,\r\n label: prop.title ?? name,\r\n type: ftype,\r\n required: required.has(name),\r\n min: prop.minimum ?? prop.minLength,\r\n max: prop.maximum ?? prop.maxLength,\r\n pattern: prop.pattern,\r\n defaultValue: prop.default,\r\n helpText: prop.description,\r\n placeholder: undefined,\r\n options:\r\n prop.oneOf?.map((o) => ({\r\n value: o.const as string | number,\r\n label: o.title ?? String(o.const),\r\n })) ??\r\n prop.enum?.map((v, i) => ({\r\n value: v as string | number,\r\n label: prop.enumNames?.[i] ?? String(v),\r\n })),\r\n })\r\n }\r\n\r\n return {\r\n title: schema.title,\r\n description: schema.description,\r\n fields,\r\n }\r\n}\r\n\r\nfunction editorFieldToProperty(field: EditorField): JSONSchemaProperty {\r\n const { type, format } = fieldTypeToJsonSchemaType(field.type)\r\n const prop: JSONSchemaProperty = { type }\r\n if (format) prop.format = format\r\n if (field.label && field.label !== field.name) prop.title = field.label\r\n if (field.helpText) prop.description = field.helpText\r\n if (field.defaultValue !== undefined) prop.default = field.defaultValue\r\n\r\n if (type === 'string') {\r\n if (field.min !== undefined) prop.minLength = field.min\r\n if (field.max !== undefined) prop.maxLength = field.max\r\n if (field.pattern) prop.pattern = field.pattern\r\n } else if (type === 'number' || type === 'integer') {\r\n if (field.min !== undefined) prop.minimum = field.min\r\n if (field.max !== undefined) prop.maximum = field.max\r\n }\r\n\r\n if (field.options && field.options.length > 0) {\r\n prop.enum = field.options.map((o) => o.value)\r\n prop.enumNames = field.options.map((o) => o.label)\r\n }\r\n\r\n if (field.type === 'textarea' && prop.maxLength === undefined) {\r\n prop.maxLength = 1000\r\n }\r\n\r\n return prop\r\n}\r\n\r\nexport function editorSchemaToJsonSchema(editor: EditorSchema): JSONSchema {\r\n const properties: Record<string, JSONSchemaProperty> = {}\r\n const required: string[] = []\r\n for (const field of editor.fields) {\r\n properties[field.name] = editorFieldToProperty(field)\r\n if (field.required) required.push(field.name)\r\n }\r\n const out: JSONSchema = {\r\n type: 'object',\r\n properties,\r\n }\r\n if (required.length > 0) out.required = required\r\n if (editor.title) out.title = editor.title\r\n if (editor.description) out.description = editor.description\r\n return out\r\n}\r\n\r\nexport function createFieldFromPaletteType(type: FieldType, existingNames: string[]): EditorField {\r\n const baseName = `field${existingNames.length + 1}`\r\n let name = baseName\r\n let suffix = 1\r\n while (existingNames.includes(name)) {\r\n suffix++\r\n name = `${baseName}_${suffix}`\r\n }\r\n\r\n const baseLabel = type.charAt(0).toUpperCase() + type.slice(1)\r\n const field: EditorField = {\r\n id: nextId('new'),\r\n name,\r\n label: baseLabel,\r\n type,\r\n }\r\n\r\n if (type === 'select' || type === 'radio') {\r\n field.options = [\r\n { value: 'option1', label: 'Option 1' },\r\n { value: 'option2', label: 'Option 2' },\r\n ]\r\n }\r\n if (type === 'number' || type === 'slider') {\r\n field.min = 0\r\n field.max = 100\r\n }\r\n if (type === 'rate') {\r\n field.max = 5\r\n }\r\n\r\n return field\r\n}\r\n","<script setup lang=\"ts\">\r\nimport { computed, ref } from 'vue'\r\nimport SgForm from '../Form/Form.vue'\r\nimport SgField from '../Form/Field.vue'\r\nimport SgAutoField from '../SchemaForm/AutoField.vue'\r\nimport { useForm } from '../../../composables/useForm'\r\nimport { editorSchemaToJsonSchema, createFieldFromPaletteType } from './adapters/jsonSchema'\r\nimport { jsonSchemaToRules, jsonSchemaToDefaults } from '../../../adapters/jsonSchemaAdapter'\r\nimport { PALETTE_DATA_TYPE } from './palette'\r\nimport type { SchemaEditorStore } from './useSchemaEditor'\r\nimport type { FieldType } from '../SchemaForm/AutoField.vue'\r\n\r\nexport interface SchemaFormEditorCanvasProps {\r\n store: SchemaEditorStore\r\n emptyText?: string\r\n}\r\n\r\nconst props = withDefaults(defineProps<SchemaFormEditorCanvasProps>(), {\r\n emptyText: 'Drop a field here',\r\n})\r\n\r\nconst fields = computed(() => props.store.state.value.schema.fields)\r\nconst isEmpty = computed(() => fields.value.length === 0)\r\n\r\nconst jsonSchema = computed(() => editorSchemaToJsonSchema(props.store.state.value.schema))\r\nconst rulesMap = computed(() => jsonSchemaToRules(jsonSchema.value))\r\nconst defaults = computed(() => jsonSchemaToDefaults(jsonSchema.value))\r\n\r\nconst dropIndicator = ref<number | null>(null)\r\nconst draggingId = ref<string | null>(null)\r\n\r\nconst form = useForm({ defaultValues: defaults.value })\r\n\r\nfunction handleDragOver(e: DragEvent) {\r\n if (\r\n e.dataTransfer?.types.includes(PALETTE_DATA_TYPE) ||\r\n e.dataTransfer?.types.includes('text/plain') ||\r\n draggingId.value !== null\r\n ) {\r\n e.preventDefault()\r\n if (e.dataTransfer) {\r\n e.dataTransfer.dropEffect = draggingId.value ? 'move' : 'copy'\r\n }\r\n }\r\n}\r\n\r\nfunction handleDrop(e: DragEvent, beforeIndex: number) {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n dropIndicator.value = null\r\n\r\n if (draggingId.value) {\r\n const id = draggingId.value\r\n const fromIdx = fields.value.findIndex((f) => f.id === id)\r\n draggingId.value = null\r\n if (fromIdx === -1) return\r\n let target = beforeIndex\r\n if (target > fromIdx) target -= 1\r\n if (target === fromIdx) return\r\n props.store.moveField(id, target)\r\n return\r\n }\r\n\r\n let type: FieldType | null = null\r\n const fromPalette = e.dataTransfer?.getData(PALETTE_DATA_TYPE)\r\n if (fromPalette) {\r\n type = fromPalette as FieldType\r\n } else {\r\n const txt = e.dataTransfer?.getData('text/plain')\r\n if (txt) type = txt as FieldType\r\n }\r\n if (!type) return\r\n\r\n const existingNames = fields.value.map((f) => f.name)\r\n const newField = createFieldFromPaletteType(type, existingNames)\r\n props.store.addField(newField, beforeIndex)\r\n}\r\n\r\nfunction handleEmptyClick() {\r\n props.store.setSelectedId(null)\r\n}\r\n\r\nfunction handleFieldClick(id: string, e: MouseEvent) {\r\n e.stopPropagation()\r\n props.store.setSelectedId(id)\r\n}\r\n\r\nfunction handleFieldDragStart(id: string, e: DragEvent) {\r\n e.stopPropagation()\r\n if (e.dataTransfer) {\r\n e.dataTransfer.effectAllowed = 'move'\r\n e.dataTransfer.setData('text/plain', id)\r\n }\r\n draggingId.value = id\r\n}\r\n\r\nfunction handleFieldDragEnd() {\r\n draggingId.value = null\r\n dropIndicator.value = null\r\n}\r\n\r\nfunction handleFieldDragOver(index: number, e: DragEvent) {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n dropIndicator.value = index\r\n}\r\n\r\nfunction handleFieldDragLeave() {\r\n dropIndicator.value = null\r\n}\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"sg-sfe-canvas\"\r\n data-testid=\"sfe-canvas\"\r\n :data-empty=\"isEmpty ? 'true' : 'false'\"\r\n @dragover=\"handleDragOver\"\r\n @drop=\"(e) => handleDrop(e, fields.length)\"\r\n >\r\n <div\r\n v-if=\"isEmpty\"\r\n class=\"sg-sfe-canvas-empty\"\r\n data-testid=\"sfe-canvas-empty\"\r\n @click=\"handleEmptyClick\"\r\n >\r\n {{ emptyText }}\r\n </div>\r\n <SgForm v-else :form=\"form\" layout=\"vertical\" class=\"sg-sfe-canvas-form\">\r\n <template v-for=\"(field, idx) in fields\" :key=\"field.id\">\r\n <div\r\n v-if=\"dropIndicator === idx\"\r\n class=\"sg-sfe-canvas-drop-indicator\"\r\n data-testid=\"sfe-drop-indicator\"\r\n />\r\n <div\r\n :class=\"[\r\n 'sg-sfe-canvas-field',\r\n field.id === store.state.value.selectedId ? 'sg-sfe-canvas-field-selected' : '',\r\n ]\"\r\n data-testid=\"sfe-canvas-field\"\r\n :data-field-id=\"field.id\"\r\n :data-field-name=\"field.name\"\r\n draggable=\"true\"\r\n @click=\"(e) => handleFieldClick(field.id, e)\"\r\n @dragstart=\"(e) => handleFieldDragStart(field.id, e)\"\r\n @dragend=\"handleFieldDragEnd\"\r\n @dragover=\"(e) => handleFieldDragOver(idx, e)\"\r\n @dragleave=\"handleFieldDragLeave\"\r\n @drop=\"(e) => handleDrop(e, idx)\"\r\n >\r\n <div\r\n v-if=\"field.id === store.state.value.selectedId\"\r\n class=\"sg-sfe-canvas-field-toolbar\"\r\n data-testid=\"sfe-field-toolbar\"\r\n @click.stop\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"sg-sfe-canvas-field-toolbar-btn\"\r\n data-testid=\"sfe-action-up\"\r\n aria-label=\"Move field up\"\r\n @click=\"store.moveFieldUp(field.id)\"\r\n >↑</button>\r\n <button\r\n type=\"button\"\r\n class=\"sg-sfe-canvas-field-toolbar-btn\"\r\n data-testid=\"sfe-action-down\"\r\n aria-label=\"Move field down\"\r\n @click=\"store.moveFieldDown(field.id)\"\r\n >↓</button>\r\n <button\r\n type=\"button\"\r\n class=\"sg-sfe-canvas-field-toolbar-btn\"\r\n data-testid=\"sfe-action-duplicate\"\r\n aria-label=\"Duplicate field\"\r\n @click=\"store.duplicateField(field.id)\"\r\n >⎘</button>\r\n <button\r\n type=\"button\"\r\n class=\"sg-sfe-canvas-field-toolbar-btn sg-sfe-canvas-field-toolbar-btn-danger\"\r\n data-testid=\"sfe-action-delete\"\r\n aria-label=\"Delete field\"\r\n @click=\"store.removeField(field.id)\"\r\n >×</button>\r\n </div>\r\n <div class=\"sg-sfe-canvas-field-inner\">\r\n <SgField :name=\"field.name\" :label=\"field.label\" :rules=\"rulesMap[field.name]\">\r\n <template #default>\r\n <SgAutoField\r\n :name=\"field.name\"\r\n :type=\"field.type\"\r\n :options=\"field.options\"\r\n :placeholder=\"field.placeholder\"\r\n :min=\"field.min\"\r\n :max=\"field.max\"\r\n />\r\n </template>\r\n </SgField>\r\n <span v-if=\"field.helpText\" class=\"sg-sfe-canvas-field-help\">{{ field.helpText }}</span>\r\n </div>\r\n </div>\r\n </template>\r\n <div\r\n v-if=\"dropIndicator === fields.length\"\r\n class=\"sg-sfe-canvas-drop-indicator\"\r\n data-testid=\"sfe-drop-indicator\"\r\n />\r\n </SgForm>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport type { SchemaEditorStore } from './useSchemaEditor'\r\nimport type { EditorField } from './types'\r\nimport type { AutoFieldOption, FieldType } from '../SchemaForm/AutoField.vue'\r\n\r\nexport interface SchemaFormEditorInspectorProps {\r\n store: SchemaEditorStore\r\n}\r\n\r\nconst props = defineProps<SchemaFormEditorInspectorProps>()\r\n\r\nconst TYPES_WITH_OPTIONS: FieldType[] = ['select', 'radio', 'multiselect']\r\nconst TYPES_WITH_NUMERIC_RANGE: FieldType[] = ['number', 'slider', 'rate']\r\nconst TYPES_WITH_LENGTH_RANGE: FieldType[] = ['string', 'textarea', 'password', 'email', 'url']\r\n\r\nconst selected = computed<EditorField | null>(() => {\r\n const id = props.store.state.value.selectedId\r\n if (!id) return null\r\n return props.store.state.value.schema.fields.find((f) => f.id === id) ?? null\r\n})\r\n\r\nconst isOptionsType = computed(() => selected.value && TYPES_WITH_OPTIONS.includes(selected.value.type))\r\nconst isNumericType = computed(() => selected.value && TYPES_WITH_NUMERIC_RANGE.includes(selected.value.type))\r\nconst isLengthType = computed(() => selected.value && TYPES_WITH_LENGTH_RANGE.includes(selected.value.type))\r\nconst isBooleanType = computed(\r\n () => selected.value && (selected.value.type === 'boolean' || selected.value.type === 'switch'),\r\n)\r\n\r\nfunction patch(p: Partial<EditorField>) {\r\n if (!selected.value) return\r\n props.store.updateField(selected.value.id, p)\r\n}\r\n\r\nfunction defaultDisplay(): string {\r\n if (!selected.value || selected.value.defaultValue === undefined) return ''\r\n return String(selected.value.defaultValue)\r\n}\r\n\r\nfunction handleDefaultInput(raw: string) {\r\n if (raw === '') return patch({ defaultValue: undefined })\r\n if (isBooleanType.value) return patch({ defaultValue: raw === 'true' })\r\n if (isNumericType.value) {\r\n const n = Number(raw)\r\n return patch({ defaultValue: Number.isFinite(n) ? n : raw })\r\n }\r\n patch({ defaultValue: raw })\r\n}\r\n\r\nfunction updateOption(idx: number, p: Partial<AutoFieldOption>) {\r\n if (!selected.value) return\r\n const copy = (selected.value.options ?? []).map((o) => ({ ...o }))\r\n copy[idx] = { ...copy[idx]!, ...p }\r\n patch({ options: copy })\r\n}\r\n\r\nfunction removeOption(idx: number) {\r\n if (!selected.value) return\r\n const copy = (selected.value.options ?? []).slice()\r\n copy.splice(idx, 1)\r\n patch({ options: copy })\r\n}\r\n\r\nfunction addOption() {\r\n if (!selected.value) return\r\n const list = selected.value.options ?? []\r\n const next: AutoFieldOption = {\r\n value: `option${list.length + 1}`,\r\n label: `Option ${list.length + 1}`,\r\n }\r\n patch({ options: [...list, next] })\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"sg-sfe-inspector\" data-testid=\"sfe-inspector\">\r\n <div v-if=\"!selected\" class=\"sg-sfe-inspector-empty\" data-testid=\"sfe-inspector-empty\">\r\n Select a field on the canvas to edit its properties.\r\n </div>\r\n <template v-else>\r\n <div class=\"sg-sfe-inspector-title\">Field properties</div>\r\n\r\n <div class=\"sg-sfe-inspector-row\" data-testid=\"sfe-inspector-row\">\r\n <label class=\"sg-sfe-inspector-row-label\">Name</label>\r\n <div class=\"sg-sfe-inspector-row-control\">\r\n <input\r\n class=\"sg-sfe-inspector-input\"\r\n data-testid=\"sfe-inspector-name\"\r\n :value=\"selected.name\"\r\n @input=\"(e) => patch({ name: (e.target as HTMLInputElement).value })\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div class=\"sg-sfe-inspector-row\" data-testid=\"sfe-inspector-row\">\r\n <label class=\"sg-sfe-inspector-row-label\">Label</label>\r\n <div class=\"sg-sfe-inspector-row-control\">\r\n <input\r\n class=\"sg-sfe-inspector-input\"\r\n data-testid=\"sfe-inspector-label\"\r\n :value=\"selected.label\"\r\n @input=\"(e) => patch({ label: (e.target as HTMLInputElement).value })\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div class=\"sg-sfe-inspector-row\" data-testid=\"sfe-inspector-row\">\r\n <label class=\"sg-sfe-inspector-row-label\">Type</label>\r\n <div class=\"sg-sfe-inspector-row-control\">\r\n <input\r\n class=\"sg-sfe-inspector-input\"\r\n data-testid=\"sfe-inspector-type\"\r\n :value=\"selected.type\"\r\n readonly\r\n aria-readonly=\"true\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div class=\"sg-sfe-inspector-row\" data-testid=\"sfe-inspector-row\">\r\n <label class=\"sg-sfe-inspector-row-label\">Required</label>\r\n <div class=\"sg-sfe-inspector-row-control\">\r\n <label class=\"sg-sfe-inspector-checkbox\">\r\n <input\r\n type=\"checkbox\"\r\n data-testid=\"sfe-inspector-required\"\r\n :checked=\"!!selected.required\"\r\n @change=\"(e) => patch({ required: (e.target as HTMLInputElement).checked })\"\r\n />\r\n <span>Make this field required</span>\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <div class=\"sg-sfe-inspector-row\" data-testid=\"sfe-inspector-row\">\r\n <label class=\"sg-sfe-inspector-row-label\">Placeholder</label>\r\n <div class=\"sg-sfe-inspector-row-control\">\r\n <input\r\n class=\"sg-sfe-inspector-input\"\r\n data-testid=\"sfe-inspector-placeholder\"\r\n :value=\"selected.placeholder ?? ''\"\r\n @input=\"(e) => {\r\n const val = (e.target as HTMLInputElement).value\r\n patch({ placeholder: val || undefined })\r\n }\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div class=\"sg-sfe-inspector-row\" data-testid=\"sfe-inspector-row\">\r\n <label class=\"sg-sfe-inspector-row-label\">Help text</label>\r\n <div class=\"sg-sfe-inspector-row-control\">\r\n <input\r\n class=\"sg-sfe-inspector-input\"\r\n data-testid=\"sfe-inspector-help\"\r\n :value=\"selected.helpText ?? ''\"\r\n @input=\"(e) => {\r\n const val = (e.target as HTMLInputElement).value\r\n patch({ helpText: val || undefined })\r\n }\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div class=\"sg-sfe-inspector-row\" data-testid=\"sfe-inspector-row\">\r\n <label class=\"sg-sfe-inspector-row-label\">Default</label>\r\n <div class=\"sg-sfe-inspector-row-control\">\r\n <input\r\n class=\"sg-sfe-inspector-input\"\r\n data-testid=\"sfe-inspector-default\"\r\n :value=\"defaultDisplay()\"\r\n @input=\"(e) => handleDefaultInput((e.target as HTMLInputElement).value)\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div v-if=\"isLengthType || isNumericType\" class=\"sg-sfe-inspector-row\" data-testid=\"sfe-inspector-row\">\r\n <label class=\"sg-sfe-inspector-row-label\">{{ isLengthType ? 'Min length' : 'Min' }}</label>\r\n <div class=\"sg-sfe-inspector-row-control\">\r\n <input\r\n class=\"sg-sfe-inspector-input\"\r\n data-testid=\"sfe-inspector-min\"\r\n type=\"number\"\r\n :value=\"selected.min ?? ''\"\r\n @input=\"(e) => {\r\n const raw = (e.target as HTMLInputElement).value\r\n patch({ min: raw === '' ? undefined : Number(raw) })\r\n }\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div v-if=\"isLengthType || isNumericType\" class=\"sg-sfe-inspector-row\" data-testid=\"sfe-inspector-row\">\r\n <label class=\"sg-sfe-inspector-row-label\">{{ isLengthType ? 'Max length' : 'Max' }}</label>\r\n <div class=\"sg-sfe-inspector-row-control\">\r\n <input\r\n class=\"sg-sfe-inspector-input\"\r\n data-testid=\"sfe-inspector-max\"\r\n type=\"number\"\r\n :value=\"selected.max ?? ''\"\r\n @input=\"(e) => {\r\n const raw = (e.target as HTMLInputElement).value\r\n patch({ max: raw === '' ? undefined : Number(raw) })\r\n }\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div v-if=\"isLengthType\" class=\"sg-sfe-inspector-row\" data-testid=\"sfe-inspector-row\">\r\n <label class=\"sg-sfe-inspector-row-label\">Pattern (RegExp)</label>\r\n <div class=\"sg-sfe-inspector-row-control\">\r\n <input\r\n class=\"sg-sfe-inspector-input\"\r\n data-testid=\"sfe-inspector-pattern\"\r\n :value=\"selected.pattern ?? ''\"\r\n placeholder=\"^[A-Z].*\"\r\n @input=\"(e) => {\r\n const val = (e.target as HTMLInputElement).value\r\n patch({ pattern: val || undefined })\r\n }\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div v-if=\"isOptionsType\" class=\"sg-sfe-inspector-options\" data-testid=\"sfe-inspector-options\">\r\n <div class=\"sg-sfe-inspector-row-label\">Options</div>\r\n <div\r\n v-for=\"(opt, idx) in (selected.options ?? [])\"\r\n :key=\"idx\"\r\n class=\"sg-sfe-inspector-option\"\r\n >\r\n <input\r\n class=\"sg-sfe-inspector-input\"\r\n data-testid=\"sfe-inspector-option-label\"\r\n :value=\"opt.label\"\r\n placeholder=\"Label\"\r\n @input=\"(e) => updateOption(idx, { label: (e.target as HTMLInputElement).value })\"\r\n />\r\n <input\r\n class=\"sg-sfe-inspector-input\"\r\n data-testid=\"sfe-inspector-option-value\"\r\n :value=\"String(opt.value)\"\r\n placeholder=\"Value\"\r\n @input=\"(e) => updateOption(idx, { value: (e.target as HTMLInputElement).value })\"\r\n />\r\n <button\r\n type=\"button\"\r\n class=\"sg-sfe-inspector-option-remove\"\r\n aria-label=\"Remove option\"\r\n @click=\"removeOption(idx)\"\r\n >×</button>\r\n </div>\r\n <button\r\n type=\"button\"\r\n class=\"sg-sfe-inspector-option-add\"\r\n data-testid=\"sfe-inspector-option-add\"\r\n @click=\"addOption\"\r\n >+ Add option</button>\r\n </div>\r\n </template>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport { editorSchemaToJsonSchema } from './adapters/jsonSchema'\r\nimport type { SchemaEditorStore } from './useSchemaEditor'\r\n\r\nexport interface SchemaFormEditorSchemaViewProps {\r\n store: SchemaEditorStore\r\n mode?: 'json' | 'ts'\r\n}\r\n\r\nconst props = withDefaults(defineProps<SchemaFormEditorSchemaViewProps>(), {\r\n mode: 'json',\r\n})\r\n\r\nconst text = computed(() => {\r\n const schema = editorSchemaToJsonSchema(props.store.state.value.schema)\r\n if (props.mode === 'ts') return `const schema = ${JSON.stringify(schema, null, 2)} as const`\r\n return JSON.stringify(schema, null, 2)\r\n})\r\n</script>\r\n\r\n<template>\r\n <pre\r\n class=\"sg-sfe-schema-view\"\r\n data-testid=\"sfe-schema-view\"\r\n aria-label=\"Generated JSON Schema\"\r\n ><code>{{ text }}</code></pre>\r\n</template>\r\n","import { computed, ref, type ComputedRef, type Ref } from 'vue'\r\nimport { createCore } from '@skygraph/core'\r\nimport type { Core } from '@skygraph/core'\r\nimport type { EditorAction, EditorField, EditorSchema, EditorState } from './types'\r\nimport { createEmptyEditorSchema } from './adapters/jsonSchema'\r\n\r\nconst HISTORY_LIMIT = 100\r\nconst STORE_PATH = '$sfe.snapshot'\r\n\r\nexport interface SchemaEditorStore {\r\n /** Reactive snapshot — re-rendered on every commit. */\r\n state: ComputedRef<EditorState>\r\n /** Underlying Core instance. */\r\n core: Core\r\n\r\n apply: (action: EditorAction) => void\r\n\r\n addField: (field: EditorField, index?: number) => void\r\n removeField: (id: string) => void\r\n updateField: (id: string, patch: Partial<EditorField>) => void\r\n moveField: (id: string, toIndex: number) => void\r\n moveFieldUp: (id: string) => void\r\n moveFieldDown: (id: string) => void\r\n duplicateField: (id: string) => void\r\n\r\n setSchema: (schema: EditorSchema) => void\r\n setSelectedId: (id: string | null) => void\r\n\r\n undo: () => void\r\n redo: () => void\r\n}\r\n\r\nexport interface UseSchemaEditorOptions {\r\n initialSchema?: EditorSchema\r\n core?: Core\r\n onChange?: (schema: EditorSchema) => void\r\n}\r\n\r\ninterface InternalState {\r\n schema: EditorSchema\r\n selectedId: string | null\r\n}\r\n\r\nfunction cloneSchema(schema: EditorSchema): EditorSchema {\r\n return {\r\n title: schema.title,\r\n description: schema.description,\r\n fields: schema.fields.map((f) => ({\r\n ...f,\r\n options: f.options ? f.options.map((o) => ({ ...o })) : undefined,\r\n })),\r\n }\r\n}\r\n\r\nfunction buildSnapshot(s: InternalState, canUndo: boolean, canRedo: boolean): EditorState {\r\n return {\r\n schema: s.schema,\r\n selectedId: s.selectedId,\r\n canUndo,\r\n canRedo,\r\n }\r\n}\r\n\r\nfunction reduce(state: InternalState, action: EditorAction): InternalState {\r\n switch (action.type) {\r\n case 'add': {\r\n const fields = state.schema.fields.slice()\r\n const index = action.index ?? fields.length\r\n fields.splice(Math.max(0, Math.min(index, fields.length)), 0, action.field)\r\n return {\r\n ...state,\r\n schema: { ...state.schema, fields },\r\n selectedId: action.field.id,\r\n }\r\n }\r\n case 'remove': {\r\n const fields = state.schema.fields.filter((f) => f.id !== action.id)\r\n if (fields.length === state.schema.fields.length) return state\r\n return {\r\n ...state,\r\n schema: { ...state.schema, fields },\r\n selectedId: state.selectedId === action.id ? null : state.selectedId,\r\n }\r\n }\r\n case 'update': {\r\n const idx = state.schema.fields.findIndex((f) => f.id === action.id)\r\n if (idx === -1) return state\r\n const fields = state.schema.fields.slice()\r\n const current = fields[idx]!\r\n const merged: EditorField = { ...current, ...action.patch }\r\n const mergedRecord = merged as unknown as Record<string, unknown>\r\n for (const k of Object.keys(action.patch)) {\r\n if ((action.patch as Record<string, unknown>)[k] === undefined) {\r\n delete mergedRecord[k]\r\n }\r\n }\r\n fields[idx] = merged\r\n return { ...state, schema: { ...state.schema, fields } }\r\n }\r\n case 'move': {\r\n const idx = state.schema.fields.findIndex((f) => f.id === action.id)\r\n if (idx === -1) return state\r\n const fields = state.schema.fields.slice()\r\n const [item] = fields.splice(idx, 1)\r\n const target = Math.max(0, Math.min(action.toIndex, fields.length))\r\n fields.splice(target, 0, item!)\r\n return { ...state, schema: { ...state.schema, fields } }\r\n }\r\n case 'setSchema': {\r\n return {\r\n ...state,\r\n schema: cloneSchema(action.schema),\r\n selectedId: null,\r\n }\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n\r\nexport function useSchemaEditor(options: UseSchemaEditorOptions = {}): SchemaEditorStore {\r\n const core = options.core ?? createCore()\r\n\r\n const initial: InternalState = {\r\n schema: options.initialSchema ? cloneSchema(options.initialSchema) : createEmptyEditorSchema(),\r\n selectedId: null,\r\n }\r\n\r\n const current: Ref<InternalState> = ref(initial) as Ref<InternalState>\r\n const undoStack = ref<InternalState[]>([])\r\n const redoStack = ref<InternalState[]>([])\r\n\r\n core.set(STORE_PATH, initial.schema)\r\n\r\n const state = computed<EditorState>(() =>\r\n buildSnapshot(current.value, undoStack.value.length > 0, redoStack.value.length > 0),\r\n )\r\n\r\n const commit = (next: InternalState, captureHistory: boolean) => {\r\n if (captureHistory) {\r\n undoStack.value = [...undoStack.value, current.value]\r\n if (undoStack.value.length > HISTORY_LIMIT) {\r\n undoStack.value = undoStack.value.slice(-HISTORY_LIMIT)\r\n }\r\n redoStack.value = []\r\n }\r\n current.value = next\r\n core.set(STORE_PATH, next.schema)\r\n options.onChange?.(next.schema)\r\n }\r\n\r\n const apply = (action: EditorAction) => {\r\n const next = reduce(current.value, action)\r\n if (next === current.value) return\r\n commit(next, true)\r\n }\r\n\r\n const addField = (field: EditorField, index?: number) =>\r\n apply({ type: 'add', field, index })\r\n const removeField = (id: string) => apply({ type: 'remove', id })\r\n const updateField = (id: string, patch: Partial<EditorField>) =>\r\n apply({ type: 'update', id, patch })\r\n const moveField = (id: string, toIndex: number) =>\r\n apply({ type: 'move', id, toIndex })\r\n\r\n const moveFieldUp = (id: string) => {\r\n const idx = current.value.schema.fields.findIndex((f) => f.id === id)\r\n if (idx <= 0) return\r\n apply({ type: 'move', id, toIndex: idx - 1 })\r\n }\r\n\r\n const moveFieldDown = (id: string) => {\r\n const fields = current.value.schema.fields\r\n const idx = fields.findIndex((f) => f.id === id)\r\n if (idx === -1 || idx >= fields.length - 1) return\r\n apply({ type: 'move', id, toIndex: idx + 1 })\r\n }\r\n\r\n const duplicateField = (id: string) => {\r\n const fields = current.value.schema.fields\r\n const idx = fields.findIndex((f) => f.id === id)\r\n if (idx === -1) return\r\n const src = fields[idx]!\r\n const existingNames = fields.map((f) => f.name)\r\n let candidate = `${src.name}_copy`\r\n let suffix = 1\r\n while (existingNames.includes(candidate)) {\r\n suffix++\r\n candidate = `${src.name}_copy${suffix}`\r\n }\r\n const copy: EditorField = {\r\n ...src,\r\n id: `dup_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 6)}`,\r\n name: candidate,\r\n options: src.options ? src.options.map((o) => ({ ...o })) : undefined,\r\n }\r\n apply({ type: 'add', field: copy, index: idx + 1 })\r\n }\r\n\r\n const setSchema = (schema: EditorSchema) => apply({ type: 'setSchema', schema })\r\n\r\n const setSelectedId = (id: string | null) => {\r\n if (current.value.selectedId === id) return\r\n commit({ ...current.value, selectedId: id }, false)\r\n }\r\n\r\n const undo = () => {\r\n if (undoStack.value.length === 0) return\r\n const stack = [...undoStack.value]\r\n const prev = stack.pop()!\r\n undoStack.value = stack\r\n redoStack.value = [...redoStack.value, current.value]\r\n if (redoStack.value.length > HISTORY_LIMIT) {\r\n redoStack.value = redoStack.value.slice(-HISTORY_LIMIT)\r\n }\r\n current.value = prev\r\n core.set(STORE_PATH, prev.schema)\r\n options.onChange?.(prev.schema)\r\n }\r\n\r\n const redo = () => {\r\n if (redoStack.value.length === 0) return\r\n const stack = [...redoStack.value]\r\n const next = stack.pop()!\r\n redoStack.value = stack\r\n undoStack.value = [...undoStack.value, current.value]\r\n if (undoStack.value.length > HISTORY_LIMIT) {\r\n undoStack.value = undoStack.value.slice(-HISTORY_LIMIT)\r\n }\r\n current.value = next\r\n core.set(STORE_PATH, next.schema)\r\n options.onChange?.(next.schema)\r\n }\r\n\r\n return {\r\n state,\r\n core,\r\n apply,\r\n addField,\r\n removeField,\r\n updateField,\r\n moveField,\r\n moveFieldUp,\r\n moveFieldDown,\r\n duplicateField,\r\n setSchema,\r\n setSelectedId,\r\n undo,\r\n redo,\r\n }\r\n}\r\n","<script setup lang=\"ts\">\r\nimport { computed, onBeforeUnmount, onMounted, ref } from 'vue'\r\nimport SgSchemaForm from '../SchemaForm/SchemaForm.vue'\r\nimport SgSchemaFormEditorPalette from './SchemaFormEditorPalette.vue'\r\nimport SgSchemaFormEditorCanvas from './SchemaFormEditorCanvas.vue'\r\nimport SgSchemaFormEditorInspector from './SchemaFormEditorInspector.vue'\r\nimport SgSchemaFormEditorSchemaView from './SchemaFormEditorSchemaView.vue'\r\nimport { useSchemaEditor, type SchemaEditorStore } from './useSchemaEditor'\r\nimport { editorSchemaToJsonSchema, createFieldFromPaletteType } from './adapters/jsonSchema'\r\nimport type { PaletteItem } from './palette'\r\nimport type { EditorSchema } from './types'\r\n\r\nexport interface SchemaFormEditorProps {\r\n initialSchema?: EditorSchema\r\n store?: SchemaEditorStore\r\n paletteItems?: PaletteItem[]\r\n emptyText?: string\r\n hideSchemaView?: boolean\r\n}\r\n\r\nconst props = defineProps<SchemaFormEditorProps>()\r\n\r\nconst emit = defineEmits<{\r\n (e: 'change', schema: EditorSchema): void\r\n}>()\r\n\r\nconst internalStore = useSchemaEditor({\r\n initialSchema: props.initialSchema,\r\n onChange: (schema) => emit('change', schema),\r\n})\r\nconst store = computed(() => props.store ?? internalStore)\r\n\r\nconst bottomTab = ref<'preview' | 'schema'>('preview')\r\n\r\nfunction handlePaletteActivate(type: ReturnType<typeof createFieldFromPaletteType>['type']) {\r\n const existingNames = store.value.state.value.schema.fields.map((f) => f.name)\r\n store.value.addField(createFieldFromPaletteType(type, existingNames))\r\n}\r\n\r\nfunction onKey(e: KeyboardEvent) {\r\n const target = e.target as HTMLElement | null\r\n if (target && (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA')) return\r\n const ctrl = e.ctrlKey || e.metaKey\r\n if (!ctrl) return\r\n const k = e.key.toLowerCase()\r\n if (k === 'z' && !e.shiftKey) {\r\n e.preventDefault()\r\n store.value.undo()\r\n } else if ((k === 'z' && e.shiftKey) || k === 'y') {\r\n e.preventDefault()\r\n store.value.redo()\r\n }\r\n}\r\n\r\nonMounted(() => window.addEventListener('keydown', onKey))\r\nonBeforeUnmount(() => window.removeEventListener('keydown', onKey))\r\n\r\nconst previewSchema = computed(() => editorSchemaToJsonSchema(store.value.state.value.schema))\r\nconst previewFields = computed(() => store.value.state.value.schema.fields)\r\nconst previewKey = computed(() =>\r\n previewFields.value.map((f) => `${f.id}:${f.name}:${f.type}`).join('|'),\r\n)\r\n</script>\r\n\r\n<template>\r\n <div class=\"sg-sfe\" data-testid=\"schema-form-editor\">\r\n <div class=\"sg-sfe-toolbar\" data-testid=\"sfe-toolbar\">\r\n <span class=\"sg-sfe-toolbar-title\">Schema Form Editor</span>\r\n <span style=\"flex: 1\" />\r\n <button\r\n type=\"button\"\r\n class=\"sg-sfe-toolbar-btn\"\r\n data-testid=\"sfe-undo\"\r\n aria-label=\"Undo\"\r\n :disabled=\"!store.state.value.canUndo\"\r\n @click=\"store.undo()\"\r\n >Undo</button>\r\n <button\r\n type=\"button\"\r\n class=\"sg-sfe-toolbar-btn\"\r\n data-testid=\"sfe-redo\"\r\n aria-label=\"Redo\"\r\n :disabled=\"!store.state.value.canRedo\"\r\n @click=\"store.redo()\"\r\n >Redo</button>\r\n </div>\r\n\r\n <div class=\"sg-sfe-body\">\r\n <SgSchemaFormEditorPalette\r\n :items=\"paletteItems\"\r\n @item-activate=\"handlePaletteActivate\"\r\n />\r\n <div class=\"sg-sfe-center\">\r\n <SgSchemaFormEditorCanvas :store=\"store\" :empty-text=\"emptyText\" />\r\n <div v-if=\"!hideSchemaView\" class=\"sg-sfe-bottom\" data-testid=\"sfe-bottom\">\r\n <div class=\"sg-sfe-tabs\">\r\n <button\r\n type=\"button\"\r\n :class=\"['sg-sfe-tab', bottomTab === 'preview' ? 'sg-sfe-tab-active' : '']\"\r\n data-testid=\"sfe-tab-preview\"\r\n @click=\"bottomTab = 'preview'\"\r\n >Preview</button>\r\n <button\r\n type=\"button\"\r\n :class=\"['sg-sfe-tab', bottomTab === 'schema' ? 'sg-sfe-tab-active' : '']\"\r\n data-testid=\"sfe-tab-schema\"\r\n @click=\"bottomTab = 'schema'\"\r\n >Schema</button>\r\n </div>\r\n <template v-if=\"bottomTab === 'preview'\">\r\n <div\r\n v-if=\"previewFields.length === 0\"\r\n class=\"sg-sfe-preview-empty\"\r\n data-testid=\"sfe-preview-empty\"\r\n >\r\n Drop fields onto the canvas to see a live preview.\r\n </div>\r\n <div v-else class=\"sg-sfe-preview\" data-testid=\"sfe-preview\">\r\n <SgSchemaForm :key=\"previewKey\" :schema=\"previewSchema\" layout=\"vertical\">\r\n <span />\r\n </SgSchemaForm>\r\n </div>\r\n </template>\r\n <SgSchemaFormEditorSchemaView v-else :store=\"store\" />\r\n </div>\r\n </div>\r\n <SgSchemaFormEditorInspector :store=\"store\" />\r\n </div>\r\n </div>\r\n</template>\r\n","import type { Rule, RuleFn } from '@skygraph/core'\nimport type { JSONSchema } from './jsonSchemaAdapter'\n\n/**\n * Zod schema adapter (Vue port).\n *\n * Converts a Zod schema (or any schema with `.safeParse`) into SkyGraph form\n * rules. Mirrors the React adapter at `@skygraph/react/src/adapters/zodAdapter`\n * — same exports, same shapes, same behaviour. The Vue file is framework-free\n * (no `ref`, no Vue imports) because validation rules are pure functions.\n *\n * Works with Zod v3 / v4 or any library that implements:\n *\n * { safeParse(value: unknown): { success: boolean; error?: { issues: Array<{ message: string }> } } }\n */\nexport interface ZodLikeSchema {\n safeParse(value: unknown): {\n success: boolean\n error?: { issues: Array<{ message: string; path?: (string | number)[] }> }\n }\n}\n\nexport interface ZodAdapterOptions {\n /** Custom error message override. */\n message?: string\n /** Which issue to pick when multiple exist. @default 'first' */\n pick?: 'first' | 'all'\n}\n\n/**\n * Convert a single Zod schema into a SkyGraph `Rule` for one field.\n */\nexport function zodRule(schema: ZodLikeSchema, options?: ZodAdapterOptions): Rule {\n const rule: RuleFn = (value) => {\n const result = schema.safeParse(value)\n if (result.success) return null\n\n const issues = result.error?.issues ?? []\n if (issues.length === 0) return options?.message ?? 'Validation failed'\n\n if (options?.pick === 'all') {\n return issues.map((i) => i.message).join('; ')\n }\n\n return options?.message ?? issues[0].message\n }\n return rule\n}\n\n/**\n * Convert a Zod object schema into a `{ field: Rule[] }` map ready for\n * `useForm({ rules: ... })`.\n */\nexport interface ZodObjectLikeSchema {\n shape: Record<string, ZodLikeSchema>\n}\n\nexport function zodRules(\n schema: ZodObjectLikeSchema,\n options?: ZodAdapterOptions,\n): Record<string, Rule[]> {\n const result: Record<string, Rule[]> = {}\n for (const [key, fieldSchema] of Object.entries(schema.shape)) {\n result[key] = [zodRule(fieldSchema, options)]\n }\n return result\n}\n\n/**\n * Extract default values from a Zod schema. Uses `safeParse(undefined)` to\n * trigger Zod's `.default()` mechanism, then reads the parsed data.\n */\nexport function zodDefaults(schema: ZodObjectLikeSchema): Record<string, unknown> {\n const defaults: Record<string, unknown> = {}\n for (const [key, fieldSchema] of Object.entries(schema.shape)) {\n try {\n const result = fieldSchema.safeParse(undefined) as {\n success: boolean\n data?: unknown\n error?: { issues: Array<{ message: string }> }\n }\n if (result.success && result.data !== undefined) {\n defaults[key] = result.data\n }\n } catch {\n // Skip fields without defaults — Zod throws on schemas like ZodNever.\n }\n }\n return defaults\n}\n\ninterface ZodDef {\n typeName?: string\n checks?: Array<{ kind: string; value?: unknown; regex?: RegExp; message?: string }>\n values?: unknown[]\n innerType?: { _def: ZodDef }\n type?: { _def: ZodDef }\n options?: Array<{ _def: ZodDef }>\n}\n\ninterface ZodFieldSchema {\n _def: ZodDef\n description?: string\n}\n\ninterface ZodObjectSchema {\n _def: ZodDef\n shape?: Record<string, ZodFieldSchema>\n}\n\n/**\n * Convert a Zod object schema to a minimal JSON Schema for `SgSchemaForm`.\n */\nexport function zodToJsonSchema(schema: ZodObjectSchema): JSONSchema {\n const properties: Record<string, Record<string, unknown>> = {}\n const required: string[] = []\n\n const shape =\n schema.shape ?? (schema as unknown as { shape: Record<string, ZodFieldSchema> }).shape\n if (!shape) return { properties, required }\n\n for (const [key, field] of Object.entries(shape)) {\n const prop: Record<string, unknown> = { title: key }\n let def: ZodDef = field._def\n\n if (def.typeName === 'ZodOptional' || def.typeName === 'ZodNullable') {\n def = def.innerType?._def ?? def\n } else {\n required.push(key)\n }\n\n if (def.typeName === 'ZodDefault') {\n prop.default = (def as unknown as { defaultValue: () => unknown }).defaultValue?.()\n def = def.innerType?._def ?? def\n }\n\n switch (def.typeName) {\n case 'ZodString':\n prop.type = 'string'\n for (const check of def.checks ?? []) {\n if (check.kind === 'min') prop.minLength = check.value\n if (check.kind === 'max') prop.maxLength = check.value\n if (check.kind === 'email') prop.format = 'email'\n if (check.kind === 'url') prop.format = 'url'\n if (check.kind === 'regex' && check.regex) prop.pattern = check.regex.source\n }\n break\n case 'ZodNumber':\n prop.type = 'number'\n for (const check of def.checks ?? []) {\n if (check.kind === 'min') prop.minimum = check.value\n if (check.kind === 'max') prop.maximum = check.value\n }\n break\n case 'ZodBoolean':\n prop.type = 'boolean'\n break\n case 'ZodEnum':\n prop.type = 'string'\n prop.enum = def.values ?? []\n break\n case 'ZodDate':\n prop.type = 'string'\n prop.format = 'date'\n break\n default:\n prop.type = 'string'\n }\n\n if (field.description) prop.description = field.description\n\n properties[key] = prop\n }\n\n return { properties, required }\n}\n","<script setup lang=\"ts\">\n/**\n * Time-travel devtool panel — Vue port of React's `HistoryPanel`.\n *\n * Listens to `useHistory()` reactivity (entries / cursor / canUndo /\n * canRedo) and renders the same inline-styled UI as the React adapter.\n * No `sg-*` classes are emitted — React's panel doesn't ship any either,\n * the layout lives entirely in inline styles so the devtool drops cleanly\n * into any host page without theming.\n *\n * Locale strings (`Time-Travel`, `Undo`, `Redo`, `Clear`, `No history yet`,\n * `write/writes`) are hard-coded — `SgLocale` does not expose a\n * `devtools.historyPanel` key today.\n */\nimport type { CSSProperties } from 'vue'\nimport { ref } from 'vue'\nimport type { UseHistoryReturn } from '../../composables/useHistory'\n\nexport interface HistoryPanelProps {\n /** History controller from `useHistory` (entries, cursor, undo/redo, jump, clear). */\n history: UseHistoryReturn\n /** Inline style merged onto the root. */\n style?: CSSProperties\n}\n\nconst props = defineProps<HistoryPanelProps>()\n\nconst expanded = ref<number | null>(null)\n\nfunction toggleExpanded(i: number) {\n expanded.value = expanded.value === i ? null : i\n}\n\nfunction formatTime(ts: number): string {\n const d = new Date(ts)\n return d.toLocaleTimeString(undefined, {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n })\n}\n\nfunction formatValue(v: unknown): string {\n if (v === undefined) return 'undefined'\n if (v === null) return 'null'\n if (typeof v === 'string') return `\"${v}\"`\n try {\n return JSON.stringify(v)\n } catch {\n return String(v)\n }\n}\n\nconst styles: Record<string, CSSProperties> = {\n root: {\n fontFamily: 'ui-monospace, \"Cascadia Code\", \"Fira Code\", monospace',\n fontSize: '12px',\n border: '1px solid var(--sg-border, #d9d9d9)',\n borderRadius: '8px',\n background: 'var(--sg-bg-elevated, #fff)',\n overflow: 'hidden',\n },\n header: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '8px 12px',\n borderBottom: '1px solid var(--sg-border, #d9d9d9)',\n fontWeight: 600,\n fontSize: '13px',\n },\n controls: {\n display: 'flex',\n gap: '4px',\n },\n btn: {\n padding: '2px 8px',\n border: '1px solid var(--sg-border, #d9d9d9)',\n borderRadius: '4px',\n background: 'var(--sg-bg, #fafafa)',\n cursor: 'pointer',\n fontSize: '11px',\n },\n btnDisabled: {\n opacity: 0.4,\n cursor: 'not-allowed',\n },\n list: {\n maxHeight: '300px',\n overflowY: 'auto',\n margin: 0,\n padding: 0,\n listStyle: 'none',\n },\n entry: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '4px 12px',\n cursor: 'pointer',\n borderBottom: '1px solid var(--sg-border-light, #f0f0f0)',\n transition: 'background 0.15s',\n },\n entryActive: {\n background: 'var(--sg-primary-bg, #e6f4ff)',\n fontWeight: 600,\n },\n entryFuture: {\n opacity: 0.5,\n },\n badge: {\n display: 'inline-block',\n padding: '1px 6px',\n borderRadius: '4px',\n fontSize: '10px',\n background: 'var(--sg-primary-bg, #e6f4ff)',\n color: 'var(--sg-primary, #1677ff)',\n },\n patches: {\n padding: '4px 12px 8px 32px',\n background: 'var(--sg-bg-subtle, #fafafa)',\n fontSize: '11px',\n lineHeight: 1.6,\n },\n empty: {\n padding: '24px 12px',\n textAlign: 'center',\n color: 'var(--sg-text-tertiary, #999)',\n },\n}\n</script>\n\n<template>\n <div :style=\"{ ...styles.root, ...(props.style ?? {}) }\">\n <div :style=\"styles.header\">\n <span>Time-Travel ({{ props.history.entries.value.length }})</span>\n <div :style=\"styles.controls\">\n <button\n type=\"button\"\n :style=\"{\n ...styles.btn,\n ...(props.history.canUndo.value ? {} : styles.btnDisabled),\n }\"\n :disabled=\"!props.history.canUndo.value\"\n @click=\"props.history.undo()\"\n >\n Undo\n </button>\n <button\n type=\"button\"\n :style=\"{\n ...styles.btn,\n ...(props.history.canRedo.value ? {} : styles.btnDisabled),\n }\"\n :disabled=\"!props.history.canRedo.value\"\n @click=\"props.history.redo()\"\n >\n Redo\n </button>\n <button type=\"button\" :style=\"styles.btn\" @click=\"props.history.clear()\">Clear</button>\n </div>\n </div>\n\n <div v-if=\"props.history.entries.value.length === 0\" :style=\"styles.empty\">No history yet</div>\n <ul v-else :style=\"styles.list\">\n <li v-for=\"(entry, i) in props.history.entries.value\" :key=\"i\">\n <div\n :style=\"{\n ...styles.entry,\n ...(i === props.history.cursor.value ? styles.entryActive : {}),\n ...(i > props.history.cursor.value ? styles.entryFuture : {}),\n }\"\n @click=\"props.history.jumpTo(i)\"\n @dblclick=\"toggleExpanded(i)\"\n >\n <span :style=\"styles.badge\">{{ i }}</span>\n <span> {{ entry.patches.length }} write{{ entry.patches.length !== 1 ? 's' : '' }} </span>\n <span :style=\"{ marginLeft: 'auto', fontSize: '10px', opacity: 0.6 }\">\n {{ formatTime(entry.timestamp) }}\n </span>\n </div>\n\n <div v-if=\"expanded === i\" :style=\"styles.patches\">\n <div v-for=\"(p, pi) in entry.patches\" :key=\"pi\">\n <code>{{ p.path }}</code\n >:\n <span :style=\"{ opacity: 0.5 }\">{{ formatValue(p.oldValue) }}</span>\n {{ ' → ' }}\n <span>{{ formatValue(p.value) }}</span>\n </div>\n </div>\n </li>\n </ul>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport type { CSSProperties } from 'vue'\nimport type { SizeType } from '../../types'\nimport type { InputPasswordLocale } from '../../types'\nimport { useConfig, useConfigWithDefaults } from './ConfigProvider.vue'\nimport SgSpin from './Spin.vue'\n\nexport type PasswordStrength = 'weak' | 'medium' | 'strong' | 'very-strong'\n\nexport interface InputPasswordProps {\n modelValue?: string\n value?: string\n defaultValue?: string\n placeholder?: string\n visibilityToggle?: boolean\n showStrength?: boolean\n strengthLabels?: Partial<Record<PasswordStrength, string>>\n size?: SizeType\n disabled?: boolean\n loading?: boolean\n unstyled?: boolean\n style?: CSSProperties\n 'aria-invalid'?: boolean | 'false' | 'true' | 'grammar' | 'spelling'\n 'aria-required'?: boolean | 'false' | 'true'\n}\n\nconst props = withDefaults(defineProps<InputPasswordProps>(), {\n visibilityToggle: true,\n showStrength: false,\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', v: string): void\n (e: 'change', v: string): void\n (e: 'focus', ev: FocusEvent): void\n (e: 'blur', ev: FocusEvent): void\n}>()\n\nconst { resolvedSize, resolvedDisabled } = useConfigWithDefaults(props, {})\n\nconst cfg = useConfig()\n\nconst lp = computed<InputPasswordLocale>(() => ({\n showPassword: 'Show password',\n hidePassword: 'Hide password',\n strengthWeak: 'Weak',\n strengthMedium: 'Medium',\n strengthStrong: 'Strong',\n strengthVeryStrong: 'Very strong',\n ...cfg.value.locale?.inputPassword,\n}))\n\nconst visible = ref(false)\nconst internal = ref(props.defaultValue ?? '')\n\nconst current = computed(() => props.modelValue ?? props.value ?? internal.value)\n\nfunction strengthOf(password: string): PasswordStrength {\n if (!password || password.length < 4) return 'weak'\n let score = 0\n if (password.length >= 8) score++\n if (password.length >= 12) score++\n if (/[a-z]/.test(password) && /[A-Z]/.test(password)) score++\n if (/\\d/.test(password)) score++\n if (/[^a-zA-Z0-9]/.test(password)) score++\n if (score <= 1) return 'weak'\n if (score <= 2) return 'medium'\n if (score <= 3) return 'strong'\n return 'very-strong'\n}\n\nconst strength = computed(() => strengthOf(current.value))\n\nconst labels = computed(() => ({\n weak: lp.value.strengthWeak!,\n medium: lp.value.strengthMedium!,\n strong: lp.value.strengthStrong!,\n 'very-strong': lp.value.strengthVeryStrong!,\n ...props.strengthLabels,\n}))\n\nfunction handleChange(v: string) {\n internal.value = v\n emit('update:modelValue', v)\n emit('change', v)\n}\n\nconst disabledEff = computed(() => resolvedDisabled.value || !!props.loading)\n\nconst wrapperClasses = computed(() =>\n props.unstyled\n ? ''\n : [\n 'sg-input-password-wrapper',\n `sg-input-password-wrapper-${resolvedSize.value}`,\n props.loading ? 'sg-input-wrapper-loading' : '',\n ]\n .filter(Boolean)\n .join(' '),\n)\n\nconst inputClasses = computed(() =>\n props.unstyled\n ? ''\n : ['sg-input', 'sg-input-password', `sg-input-${resolvedSize.value}`].join(' '),\n)\n\nconst toggleAria = computed(() => (visible.value ? lp.value.hidePassword : lp.value.showPassword))\n</script>\n\n<template>\n <div v-if=\"!unstyled\" :style=\"style\">\n <span :class=\"wrapperClasses\">\n <input\n :type=\"visible ? 'text' : 'password'\"\n :class=\"inputClasses\"\n :value=\"current\"\n :placeholder=\"placeholder\"\n :disabled=\"disabledEff\"\n :aria-invalid=\"props['aria-invalid']\"\n :aria-required=\"props['aria-required']\"\n @input=\"handleChange(($event.target as HTMLInputElement).value)\"\n @focus=\"emit('focus', $event)\"\n @blur=\"emit('blur', $event)\"\n />\n <SgSpin v-if=\"loading\" size=\"small\" />\n <button\n v-if=\"visibilityToggle && !loading\"\n type=\"button\"\n class=\"sg-input-password-toggle\"\n tabindex=\"-1\"\n :aria-label=\"toggleAria\"\n @click=\"visible = !visible\"\n >\n {{ visible ? '◉' : '○' }}\n </button>\n </span>\n <div v-if=\"showStrength && current.length > 0\" class=\"sg-input-password-strength\">\n <div class=\"sg-input-password-strength-bar\">\n <span :class=\"`sg-input-password-strength-fill sg-input-password-strength-${strength}`\" />\n </div>\n <span :class=\"`sg-input-password-strength-label sg-input-password-strength-${strength}`\">\n {{ labels[strength] }}\n </span>\n </div>\n </div>\n <span v-else :style=\"style\">\n <input\n :type=\"visible ? 'text' : 'password'\"\n :value=\"current\"\n :placeholder=\"placeholder\"\n :disabled=\"disabledEff\"\n @input=\"handleChange(($event.target as HTMLInputElement).value)\"\n @focus=\"emit('focus', $event)\"\n @blur=\"emit('blur', $event)\"\n />\n <button v-if=\"visibilityToggle\" type=\"button\" @click=\"visible = !visible\">\n {{ visible ? lp.hidePassword : lp.showPassword }}\n </button>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport type { CSSProperties } from 'vue'\nimport type { SizeType } from '../../types'\nimport type { SearchInputLocale } from '../../types'\nimport { useConfig, useConfigWithDefaults } from './ConfigProvider.vue'\nimport SgSpin from './Spin.vue'\n\nexport interface SearchInputProps {\n modelValue?: string\n value?: string\n defaultValue?: string\n placeholder?: string\n allowClear?: boolean\n enterButton?: boolean | string\n size?: SizeType\n disabled?: boolean\n loading?: boolean\n unstyled?: boolean\n style?: CSSProperties\n}\n\nconst props = withDefaults(defineProps<SearchInputProps>(), {\n allowClear: true,\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', v: string): void\n (e: 'change', v: string): void\n (e: 'search', v: string): void\n (e: 'focus', ev: FocusEvent): void\n (e: 'blur', ev: FocusEvent): void\n}>()\n\nconst { resolvedSize, resolvedDisabled } = useConfigWithDefaults(props, {})\nconst cfg = useConfig()\n\nconst lp = computed<SearchInputLocale>(() => ({\n placeholder: 'Search…',\n clear: 'Clear',\n search: 'Search',\n ...cfg.value.locale?.searchInput,\n}))\n\nconst internal = ref(props.defaultValue ?? '')\nconst inputRef = ref<HTMLInputElement | null>(null)\n\nconst current = computed(() => props.modelValue ?? props.value ?? internal.value)\n\nconst placeholderEff = computed(() => props.placeholder ?? lp.value.placeholder!)\n\nfunction handleChange(v: string) {\n internal.value = v\n emit('update:modelValue', v)\n emit('change', v)\n}\n\nfunction handleSearch() {\n if (resolvedDisabled.value || props.loading) return\n emit('search', current.value)\n}\n\nfunction handleClear() {\n handleChange('')\n emit('search', '')\n inputRef.value?.focus()\n}\n\nfunction onKeydown(e: KeyboardEvent) {\n if (e.key === 'Enter') handleSearch()\n}\n\nconst wrapperClasses = computed(() =>\n props.unstyled\n ? ''\n : [\n 'sg-search-input',\n `sg-search-input-${resolvedSize.value}`,\n props.enterButton ? 'sg-search-input-with-button' : '',\n props.loading ? 'sg-search-input-loading' : '',\n resolvedDisabled.value ? 'sg-search-input-disabled' : '',\n ]\n .filter(Boolean)\n .join(' '),\n)\n\nconst disabledEff = computed(() => resolvedDisabled.value || !!props.loading)\n</script>\n\n<template>\n <span v-if=\"!unstyled\" :class=\"wrapperClasses\" :style=\"style\">\n <span class=\"sg-search-input-icon\">⌕</span>\n <input\n ref=\"inputRef\"\n type=\"text\"\n :class=\"`sg-input sg-input-${resolvedSize} sg-search-input-field`\"\n :value=\"current\"\n :placeholder=\"placeholderEff\"\n :disabled=\"disabledEff\"\n @input=\"handleChange(($event.target as HTMLInputElement).value)\"\n @keydown=\"onKeydown\"\n @focus=\"emit('focus', $event)\"\n @blur=\"emit('blur', $event)\"\n />\n <SgSpin v-if=\"loading\" size=\"small\" />\n <button\n v-if=\"allowClear && current && !loading\"\n type=\"button\"\n class=\"sg-search-input-clear\"\n tabindex=\"-1\"\n :aria-label=\"lp.clear\"\n @click=\"handleClear\"\n >\n ×\n </button>\n <button\n v-if=\"enterButton\"\n type=\"button\"\n class=\"sg-search-input-btn\"\n :disabled=\"disabledEff\"\n @click=\"handleSearch\"\n >\n {{ typeof enterButton === 'string' ? enterButton : '⌕' }}\n </button>\n </span>\n <span v-else :style=\"style\">\n <input\n ref=\"inputRef\"\n type=\"search\"\n :value=\"current\"\n :placeholder=\"placeholderEff\"\n :disabled=\"disabledEff\"\n @input=\"handleChange(($event.target as HTMLInputElement).value)\"\n @keydown=\"onKeydown\"\n @focus=\"emit('focus', $event)\"\n @blur=\"emit('blur', $event)\"\n />\n <button v-if=\"enterButton\" type=\"button\" :disabled=\"disabledEff\" @click=\"handleSearch\">\n {{ typeof enterButton === 'string' ? enterButton : lp.search }}\n </button>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport type { CSSProperties } from 'vue'\nimport type { SizeType } from '../../types'\nimport type { TagInputLocale } from '../../types'\nimport { useConfig, useConfigWithDefaults } from './ConfigProvider.vue'\n\nexport interface TagInputProps {\n modelValue?: string[]\n value?: string[]\n defaultValue?: string[]\n placeholder?: string\n maxTags?: number\n allowDuplicates?: boolean\n removable?: boolean\n tagColor?: 'default' | 'success' | 'error' | 'warning' | 'processing'\n size?: SizeType\n disabled?: boolean\n loading?: boolean\n unstyled?: boolean\n style?: CSSProperties\n}\n\nconst props = withDefaults(defineProps<TagInputProps>(), {\n defaultValue: () => [],\n allowDuplicates: false,\n removable: true,\n tagColor: 'default',\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', v: string[]): void\n (e: 'change', v: string[]): void\n (e: 'focus', ev: FocusEvent): void\n (e: 'blur', ev: FocusEvent): void\n}>()\n\nconst { resolvedSize, resolvedDisabled } = useConfigWithDefaults(props, {})\nconst cfg = useConfig()\n\nconst lp = computed<TagInputLocale>(() => ({\n placeholder: 'Add tag…',\n removeTag: 'Remove',\n ...cfg.value.locale?.tagInput,\n}))\n\nconst internalTags = ref<string[]>([...props.defaultValue])\nconst inputValue = ref('')\nconst inputRef = ref<HTMLInputElement | null>(null)\n\nconst tags = computed(() => props.modelValue ?? props.value ?? internalTags.value)\n\nconst placeholderEff = computed(() => props.placeholder ?? lp.value.placeholder!)\n\nfunction updateTags(next: string[]) {\n internalTags.value = next\n emit('update:modelValue', next)\n emit('change', next)\n}\n\nfunction addTag(raw: string) {\n const tag = raw.trim()\n if (!tag) return\n if (props.maxTags && tags.value.length >= props.maxTags) return\n if (!props.allowDuplicates && tags.value.includes(tag)) return\n updateTags([...tags.value, tag])\n inputValue.value = ''\n}\n\nfunction removeTag(index: number) {\n updateTags(tags.value.filter((_, i) => i !== index))\n}\n\nfunction onKeydown(e: KeyboardEvent) {\n if (e.key === 'Enter' || e.key === ',') {\n e.preventDefault()\n addTag(inputValue.value)\n } else if (e.key === 'Backspace' && !inputValue.value && tags.value.length > 0) {\n removeTag(tags.value.length - 1)\n }\n}\n\nfunction onPaste(e: ClipboardEvent) {\n e.preventDefault()\n const text = e.clipboardData?.getData('text') ?? ''\n const pasted = text\n .split(/[,;\\n]+/)\n .map((s) => s.trim())\n .filter(Boolean)\n const next = [...tags.value]\n for (const t of pasted) {\n if (props.maxTags && next.length >= props.maxTags) break\n if (!props.allowDuplicates && next.includes(t)) continue\n next.push(t)\n }\n updateTags(next)\n}\n\nfunction onWrapperClick() {\n inputRef.value?.focus()\n}\n\nfunction onInputBlur(e: FocusEvent) {\n if (inputValue.value.trim()) addTag(inputValue.value)\n emit('blur', e)\n}\n\nconst wrapperClasses = computed(() =>\n props.unstyled\n ? ''\n : [\n 'sg-tag-input',\n `sg-tag-input-${resolvedSize.value}`,\n resolvedDisabled.value ? 'sg-tag-input-disabled' : '',\n ]\n .filter(Boolean)\n .join(' '),\n)\n\nconst tagColorClass = computed(() =>\n props.tagColor !== 'default' ? `sg-tag-${props.tagColor}` : '',\n)\n\nconst disabledEff = computed(() => resolvedDisabled.value || !!props.loading)\n</script>\n\n<template>\n <div v-if=\"!unstyled\" :class=\"wrapperClasses\" :style=\"style\" @click=\"onWrapperClick\">\n <span\n v-for=\"(tag, i) in tags\"\n :key=\"`${tag}-${i}`\"\n :class=\"['sg-tag', tagColorClass].filter(Boolean).join(' ')\"\n >\n {{ tag }}\n <span\n v-if=\"removable && !resolvedDisabled\"\n class=\"sg-tag-close\"\n role=\"button\"\n :aria-label=\"`${lp.removeTag} ${tag}`\"\n @click.stop=\"removeTag(i)\"\n >×</span\n >\n </span>\n <input\n ref=\"inputRef\"\n class=\"sg-tag-input-field\"\n :value=\"inputValue\"\n :placeholder=\"tags.length === 0 ? placeholderEff : ''\"\n :disabled=\"disabledEff\"\n @input=\"inputValue = ($event.target as HTMLInputElement).value\"\n @keydown=\"onKeydown\"\n @paste=\"onPaste\"\n @focus=\"emit('focus', $event)\"\n @blur=\"onInputBlur\"\n />\n <span v-if=\"maxTags\" class=\"sg-tag-input-count\">{{ tags.length }}/{{ maxTags }}</span>\n </div>\n <div v-else :style=\"style\">\n <span v-for=\"(tag, i) in tags\" :key=\"`${tag}-${i}`\">\n {{ tag }}\n <button v-if=\"removable\" type=\"button\" @click=\"removeTag(i)\">×</button>\n </span>\n <input\n ref=\"inputRef\"\n v-model=\"inputValue\"\n :placeholder=\"tags.length === 0 ? placeholderEff : ''\"\n :disabled=\"disabledEff\"\n @keydown=\"onKeydown\"\n @paste=\"onPaste\"\n @focus=\"emit('focus', $event)\"\n @blur=\"onInputBlur\"\n />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport type { CSSProperties } from 'vue'\nimport type { SizeType } from '../../types'\nimport type { PinInputLocale } from '../../types'\nimport { useConfig, useConfigWithDefaults } from './ConfigProvider.vue'\n\nexport interface PinInputProps {\n length?: number\n modelValue?: string\n value?: string\n defaultValue?: string\n mask?: boolean\n type?: 'numeric' | 'alphanumeric'\n placeholder?: string\n autoFocus?: boolean\n size?: SizeType\n disabled?: boolean\n loading?: boolean\n unstyled?: boolean\n style?: CSSProperties\n 'aria-label'?: string\n}\n\nconst props = withDefaults(defineProps<PinInputProps>(), {\n length: 6,\n mask: false,\n type: 'numeric',\n placeholder: '○',\n autoFocus: false,\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', v: string): void\n (e: 'change', v: string): void\n (e: 'complete', v: string): void\n}>()\n\nconst { resolvedSize, resolvedDisabled } = useConfigWithDefaults(props, {})\nconst cfg = useConfig()\n\nconst lp = computed<PinInputLocale>(() => ({\n ariaLabel: 'PIN input',\n ...cfg.value.locale?.pinInput,\n}))\n\nconst len = computed(() => props.length)\n\nfunction padCompact(s: string): string {\n const compact = s.replace(/\\s/g, '').slice(0, len.value)\n const chars = compact.split('')\n while (chars.length < len.value) chars.push(' ')\n return chars.join('')\n}\n\nfunction ensureCells(s: string): string[] {\n const a = s.split('')\n while (a.length < len.value) a.push(' ')\n return a.slice(0, len.value)\n}\n\nconst isControlled = computed(() => props.modelValue !== undefined || props.value !== undefined)\n\nconst internal = ref(padCompact(props.defaultValue ?? ''))\n\nconst current = computed(() => {\n if (isControlled.value) {\n return padCompact(String(props.modelValue ?? props.value ?? ''))\n }\n return internal.value\n})\n\nconst pattern = computed(() => (props.type === 'numeric' ? /^\\d$/ : /^[a-zA-Z0-9]$/))\n\n/**\n * Imperative-only DOM ref bag. Plain array (not `ref`) because the cells are\n * never read from a render or computed — they are only used to invoke\n * `.focus()`. Wrapping the bag in `ref` previously caused Vue to detect a\n * mutation during render (each `bindRef` set `cellRefs.value`) and threw the\n * \"Maximum recursive updates exceeded\" warning. See\n * `docs/_streams/decisions/T-Vue-Cleanup.md`.\n */\nconst cellRefs: (HTMLInputElement | null)[] = []\n\nfunction bindRef(el: unknown, i: number) {\n cellRefs[i] = (el as HTMLInputElement) ?? null\n}\n\nfunction focusAt(i: number) {\n if (i >= 0 && i < len.value) cellRefs[i]?.focus()\n}\n\nfunction commit(joined: string) {\n const j = ensureCells(joined).join('')\n if (!isControlled.value) internal.value = j\n const trimmed = j.replace(/\\s/g, '')\n emit('update:modelValue', trimmed)\n emit('change', trimmed)\n if (trimmed.length === len.value) emit('complete', trimmed)\n}\n\nfunction handleChange(index: number, char: string) {\n if (!pattern.value.test(char)) return\n const arr = ensureCells(current.value)\n arr[index] = char\n commit(arr.join(''))\n focusAt(index + 1)\n}\n\nfunction handleKeyDown(index: number, e: KeyboardEvent) {\n if (e.key === 'Backspace') {\n e.preventDefault()\n const arr = ensureCells(current.value)\n if (arr[index] !== ' ') {\n arr[index] = ' '\n commit(arr.join(''))\n } else {\n focusAt(index - 1)\n }\n } else if (e.key === 'ArrowLeft') {\n focusAt(index - 1)\n } else if (e.key === 'ArrowRight') {\n focusAt(index + 1)\n }\n}\n\nfunction handlePaste(e: ClipboardEvent) {\n e.preventDefault()\n const pasted = (e.clipboardData?.getData('text') ?? '').slice(0, len.value)\n const arr = ensureCells(current.value)\n let cursor = 0\n for (const ch of pasted) {\n if (pattern.value.test(ch) && cursor < len.value) {\n arr[cursor] = ch\n cursor++\n }\n }\n commit(arr.join(''))\n focusAt(Math.min(cursor, len.value - 1))\n}\n\nfunction cellDisplay(i: number): string {\n const c = current.value[i]\n return c === ' ' || c === undefined ? '' : c\n}\n\nconst wrapperClasses = computed(() =>\n props.unstyled\n ? ''\n : [\n 'sg-pin-input',\n `sg-pin-input-${resolvedSize.value}`,\n resolvedDisabled.value ? 'sg-pin-input-disabled' : '',\n ]\n .filter(Boolean)\n .join(' '),\n)\n\nconst disabledEff = computed(() => resolvedDisabled.value || !!props.loading)\n\nconst ariaLabelEff = computed(() => props['aria-label'] ?? lp.value.ariaLabel!)\n\n/** Template iterator: 0 .. length-1 */\nconst indices = computed(() => Array.from({ length: len.value }, (_, i) => i))\n</script>\n\n<template>\n <div\n :class=\"unstyled ? '' : wrapperClasses\"\n :style=\"style\"\n role=\"group\"\n :aria-label=\"ariaLabelEff\"\n >\n <template v-for=\"i in indices\" :key=\"i\">\n <input\n v-if=\"unstyled\"\n :ref=\"(el) => bindRef(el, i)\"\n :type=\"mask ? 'password' : 'text'\"\n :inputmode=\"type === 'numeric' ? 'numeric' : 'text'\"\n maxlength=\"1\"\n :value=\"cellDisplay(i)\"\n :disabled=\"disabledEff\"\n :autofocus=\"autoFocus && i === 0\"\n @input=\"handleChange(i, ($event.target as HTMLInputElement).value)\"\n @keydown=\"handleKeyDown(i, $event)\"\n @paste=\"handlePaste\"\n @focus=\"($event.target as HTMLInputElement).select()\"\n />\n <input\n v-else\n :ref=\"(el) => bindRef(el, i)\"\n :class=\"\n [\n 'sg-pin-input-cell',\n `sg-pin-input-cell-${resolvedSize}`,\n cellDisplay(i) ? 'sg-pin-input-cell-filled' : '',\n ]\n .filter(Boolean)\n .join(' ')\n \"\n :type=\"mask ? 'password' : 'text'\"\n :inputmode=\"type === 'numeric' ? 'numeric' : 'text'\"\n maxlength=\"1\"\n :placeholder=\"placeholder\"\n :value=\"cellDisplay(i)\"\n :disabled=\"disabledEff\"\n :autofocus=\"autoFocus && i === 0\"\n @input=\"handleChange(i, ($event.target as HTMLInputElement).value)\"\n @keydown=\"handleKeyDown(i, $event)\"\n @paste=\"handlePaste\"\n @focus=\"($event.target as HTMLInputElement).select()\"\n />\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, ref, useSlots, watch } from 'vue'\nimport type { CSSProperties } from 'vue'\nimport type { SizeType } from '../../types'\nimport type { InlineEditLocale } from '../../types'\nimport { useConfig, useConfigWithDefaults } from './ConfigProvider.vue'\n\nexport interface InlineEditProps {\n modelValue?: string\n value?: string\n defaultValue?: string\n placeholder?: string\n showButtons?: boolean\n saveOnBlur?: boolean\n saveOnEnter?: boolean\n size?: SizeType\n disabled?: boolean\n loading?: boolean\n unstyled?: boolean\n style?: CSSProperties\n}\n\nconst props = withDefaults(defineProps<InlineEditProps>(), {\n defaultValue: '',\n placeholder: '',\n showButtons: true,\n saveOnBlur: true,\n saveOnEnter: true,\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', v: string): void\n (e: 'save', v: string): void\n (e: 'cancel'): void\n}>()\n\ndefineSlots<{\n view(props: { value: string; startEditing: () => void }): unknown\n}>()\n\nconst { resolvedSize, resolvedDisabled } = useConfigWithDefaults(props, {})\nconst cfg = useConfig()\n\nconst lp = computed<InlineEditLocale>(() => ({\n placeholder: 'Click to edit…',\n save: 'Save',\n cancel: 'Cancel',\n ...cfg.value.locale?.inlineEdit,\n}))\n\nconst placeholderEff = computed(() => props.placeholder || lp.value.placeholder!)\n\nconst editing = ref(false)\nconst internal = ref(props.defaultValue)\nconst draft = ref('')\nconst inputRef = ref<HTMLInputElement | null>(null)\n\nconst slots = useSlots()\nconst hasViewSlot = computed(() => Boolean(slots.view))\n\nconst current = computed(() => props.modelValue ?? props.value ?? internal.value)\n\nwatch(editing, (ed) => {\n if (ed) {\n draft.value = current.value\n nextTick(() => inputRef.value?.focus())\n }\n})\n\nfunction startEditing() {\n if (resolvedDisabled.value || props.loading) return\n editing.value = true\n}\n\nfunction save() {\n editing.value = false\n internal.value = draft.value\n emit('update:modelValue', draft.value)\n emit('save', draft.value)\n}\n\nfunction cancel() {\n editing.value = false\n draft.value = current.value\n emit('cancel')\n}\n\nfunction onKeydown(e: KeyboardEvent) {\n if (e.key === 'Enter' && props.saveOnEnter) {\n e.preventDefault()\n save()\n } else if (e.key === 'Escape') {\n cancel()\n }\n}\n\nconst viewClasses = computed(() =>\n [\n 'sg-inline-edit-view',\n `sg-inline-edit-view-${resolvedSize.value}`,\n !current.value ? 'sg-inline-edit-view-placeholder' : '',\n resolvedDisabled.value ? 'sg-inline-edit-view-disabled' : '',\n ]\n .filter(Boolean)\n .join(' '),\n)\n\nfunction onViewKeydown(e: KeyboardEvent) {\n if (e.key === 'Enter' || e.key === ' ') startEditing()\n}\n\nfunction onBlurUnstyled() {\n if (props.saveOnBlur) save()\n}\n\nfunction onBlurStyled() {\n if (props.saveOnBlur && !props.showButtons) save()\n}\n</script>\n\n<template>\n <template v-if=\"!editing\">\n <slot v-if=\"hasViewSlot\" name=\"view\" :value=\"current\" :start-editing=\"startEditing\" />\n <span\n v-else-if=\"unstyled\"\n :style=\"{ ...style, cursor: resolvedDisabled ? 'default' : 'pointer' }\"\n @click=\"startEditing\"\n >{{ current || placeholderEff }}</span\n >\n <span\n v-else\n :class=\"viewClasses\"\n :style=\"style\"\n role=\"button\"\n :tabindex=\"resolvedDisabled ? -1 : 0\"\n @click=\"startEditing\"\n @keydown=\"onViewKeydown\"\n >\n {{ current || placeholderEff }}\n <span v-if=\"!resolvedDisabled\" class=\"sg-inline-edit-pencil\">✎</span>\n </span>\n </template>\n <span v-else-if=\"unstyled\" :style=\"style\">\n <input\n ref=\"inputRef\"\n :value=\"draft\"\n @input=\"draft = ($event.target as HTMLInputElement).value\"\n @keydown=\"onKeydown\"\n @blur=\"onBlurUnstyled\"\n />\n <template v-if=\"showButtons\">\n <button type=\"button\" @click=\"save\">✓</button>\n <button type=\"button\" @click=\"cancel\">✕</button>\n </template>\n </span>\n <span\n v-else\n :class=\"['sg-inline-edit', `sg-inline-edit-${resolvedSize}`].filter(Boolean).join(' ')\"\n :style=\"style\"\n >\n <input\n ref=\"inputRef\"\n :class=\"`sg-input sg-input-${resolvedSize} sg-inline-edit-input`\"\n :value=\"draft\"\n @input=\"draft = ($event.target as HTMLInputElement).value\"\n @keydown=\"onKeydown\"\n @blur=\"onBlurStyled\"\n />\n <span v-if=\"showButtons\" class=\"sg-inline-edit-actions\">\n <button\n type=\"button\"\n class=\"sg-inline-edit-btn sg-inline-edit-btn-save\"\n :aria-label=\"lp.save\"\n @click=\"save\"\n >\n ✓\n </button>\n <button\n type=\"button\"\n class=\"sg-inline-edit-btn sg-inline-edit-btn-cancel\"\n :aria-label=\"lp.cancel\"\n @click=\"cancel\"\n >\n ✕\n </button>\n </span>\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, useSlots } from 'vue'\nimport type { CSSProperties } from 'vue'\nimport type { SizeType } from '../../types'\nimport { useConfigWithDefaults } from './ConfigProvider.vue'\n\nexport interface InputGroupProps {\n compact?: boolean\n size?: SizeType\n unstyled?: boolean\n style?: CSSProperties\n}\n\nconst props = withDefaults(defineProps<InputGroupProps>(), {\n compact: true,\n})\n\ndefineSlots<{\n before(props: Record<string, never>): unknown\n default(props: Record<string, never>): unknown\n after(props: Record<string, never>): unknown\n}>()\n\nconst { resolvedSize } = useConfigWithDefaults(props, {})\n\nconst slots = useSlots()\nconst hasBefore = computed(() => Boolean(slots.before))\nconst hasAfter = computed(() => Boolean(slots.after))\n\nconst classes = computed(() =>\n props.unstyled\n ? ''\n : [\n 'sg-input-group',\n `sg-input-group-${resolvedSize.value}`,\n props.compact ? 'sg-input-group-compact' : '',\n ]\n .filter(Boolean)\n .join(' '),\n)\n</script>\n\n<template>\n <span v-if=\"!unstyled\" :class=\"classes\" :style=\"style\">\n <span v-if=\"hasBefore\" class=\"sg-input-group-addon\"><slot name=\"before\" /></span>\n <slot />\n <span v-if=\"hasAfter\" class=\"sg-input-group-addon\"><slot name=\"after\" /></span>\n </span>\n <span v-else :style=\"style\">\n <slot name=\"before\" />\n <slot />\n <slot name=\"after\" />\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\n\nexport interface InputNumberProps {\n /** v-model binding (Vue idiom). */\n modelValue?: number | null\n /** Compat alias for `modelValue`. */\n value?: number | null\n /** Initial value when uncontrolled. */\n defaultValue?: number\n /** Lower bound. */\n min?: number\n /** Upper bound. */\n max?: number\n /** Stepper increment. */\n step?: number\n /** Decimal precision. */\n precision?: number\n /** Placeholder text. */\n placeholder?: string\n /** Disables editing. */\n disabled?: boolean\n /** Shows a loading spinner. */\n loading?: boolean\n /** Size token. */\n size?: 'small' | 'middle' | 'large'\n /** Strips built-in styling. */\n unstyled?: boolean\n}\n\nconst props = withDefaults(defineProps<InputNumberProps>(), {\n step: 1,\n size: 'middle',\n disabled: false,\n loading: false,\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: number | null): void\n (e: 'change', value: number | null): void\n (e: 'blur'): void\n}>()\n\nconst initial: number | null = props.modelValue ?? props.value ?? props.defaultValue ?? null\nconst internalValue = ref<number | null>(initial)\n\nwatch(\n () => props.modelValue ?? props.value,\n (v) => {\n if (v !== undefined) internalValue.value = v\n },\n)\n\nconst currentValue = computed<number | null>(\n () => (props.modelValue ?? props.value ?? internalValue.value) as number | null,\n)\n\nconst wrapperClass = computed(() =>\n props.unstyled\n ? ''\n : [\n 'sg-input-number',\n `sg-input-number-${props.size}`,\n props.loading ? 'sg-input-number-loading' : '',\n ]\n .filter(Boolean)\n .join(' '),\n)\n\nfunction clamp(v: number): number {\n let result = v\n if (props.min !== undefined && result < props.min) result = props.min\n if (props.max !== undefined && result > props.max) result = props.max\n if (props.precision !== undefined) result = Number(result.toFixed(props.precision))\n return result\n}\n\nfunction update(v: number | null) {\n const next = v !== null ? clamp(v) : null\n internalValue.value = next\n emit('update:modelValue', next)\n emit('change', next)\n}\n\nfunction onInput(e: Event) {\n const raw = (e.target as HTMLInputElement).value\n if (raw === '' || raw === '-') {\n internalValue.value = null\n emit('update:modelValue', null)\n emit('change', null)\n return\n }\n const num = Number(raw)\n if (!isNaN(num)) update(num)\n}\n\nfunction increment() {\n if (props.disabled || props.loading) return\n update((currentValue.value ?? 0) + props.step)\n}\n\nfunction decrement() {\n if (props.disabled || props.loading) return\n update((currentValue.value ?? 0) - props.step)\n}\n\nconst minDisabled = computed(\n () => props.min !== undefined && (currentValue.value ?? 0) <= props.min,\n)\nconst maxDisabled = computed(\n () => props.max !== undefined && (currentValue.value ?? 0) >= props.max,\n)\n</script>\n\n<template>\n <span :class=\"wrapperClass\">\n <button\n :class=\"unstyled ? '' : 'sg-input-number-btn sg-input-number-minus'\"\n :disabled=\"disabled || loading || minDisabled\"\n tabindex=\"-1\"\n @click=\"decrement\"\n >\n −\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n role=\"spinbutton\"\n :aria-valuemin=\"min\"\n :aria-valuemax=\"max\"\n :aria-valuenow=\"currentValue ?? undefined\"\n :class=\"unstyled ? '' : 'sg-input-number-input'\"\n :value=\"currentValue ?? ''\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled || loading\"\n @input=\"onInput\"\n @blur=\"emit('blur')\"\n />\n <button\n :class=\"unstyled ? '' : 'sg-input-number-btn sg-input-number-plus'\"\n :disabled=\"disabled || loading || maxDisabled\"\n tabindex=\"-1\"\n @click=\"increment\"\n >\n +\n </button>\n <span v-if=\"loading && !unstyled\" class=\"sg-spin sg-spin-small\" aria-hidden=\"true\" />\n </span>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\n\nexport interface TextareaProps {\n /** v-model binding (Vue idiom). */\n modelValue?: string\n /** Compat alias for `modelValue`. */\n value?: string\n /** Initial value when uncontrolled. */\n defaultValue?: string\n /** Placeholder shown when empty. */\n placeholder?: string\n /** Visible row count. */\n rows?: number\n /** Hard cap on input length. */\n maxLength?: number\n /** Shows current length below the field. */\n showCount?: boolean\n /** DOM id. */\n id?: string\n /** Disables editing. */\n disabled?: boolean\n /** Shows a loading spinner. */\n loading?: boolean\n /** Size token. */\n size?: 'small' | 'middle' | 'large'\n /** Strips built-in styling. */\n unstyled?: boolean\n}\n\nconst props = withDefaults(defineProps<TextareaProps>(), {\n rows: 4,\n size: 'middle',\n disabled: false,\n loading: false,\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: string): void\n (e: 'change', value: string): void\n (e: 'blur'): void\n (e: 'focus'): void\n}>()\n\nconst internalValue = ref(props.modelValue ?? props.value ?? props.defaultValue ?? '')\n\nwatch(\n () => props.modelValue ?? props.value,\n (v) => {\n if (v !== undefined) internalValue.value = v\n },\n)\n\nconst currentValue = computed(() => props.modelValue ?? props.value ?? internalValue.value)\n\nconst wrapperClass = computed(() =>\n props.unstyled\n ? ''\n : [\n 'sg-textarea-wrapper',\n `sg-textarea-${props.size}`,\n props.loading ? 'sg-textarea-wrapper-loading' : '',\n ]\n .filter(Boolean)\n .join(' '),\n)\n\nfunction onInput(e: Event) {\n const target = e.target as HTMLTextAreaElement\n let v = target.value\n if (props.maxLength && v.length > props.maxLength) {\n v = v.slice(0, props.maxLength)\n }\n internalValue.value = v\n emit('update:modelValue', v)\n emit('change', v)\n}\n</script>\n\n<template>\n <div :class=\"wrapperClass\">\n <textarea\n :id=\"id\"\n :class=\"unstyled ? '' : 'sg-input sg-textarea'\"\n :value=\"currentValue\"\n :placeholder=\"placeholder\"\n :rows=\"rows\"\n :disabled=\"disabled || loading\"\n :aria-disabled=\"disabled || loading\"\n @input=\"onInput\"\n @blur=\"emit('blur')\"\n @focus=\"emit('focus')\"\n />\n <span v-if=\"loading && !unstyled\" class=\"sg-spin sg-spin-small\" aria-hidden=\"true\" />\n <span v-if=\"showCount && !unstyled\" class=\"sg-textarea-count\">\n {{ currentValue.length }}{{ maxLength ? ` / ${maxLength}` : '' }}\n </span>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, onMounted, ref, watch } from 'vue'\n\nexport interface RadioOption {\n label: string\n value: string | number\n disabled?: boolean\n}\n\nexport interface RadioGroupProps {\n /** v-model binding (Vue idiom). */\n modelValue?: string | number\n /** Compat alias for `modelValue`. */\n value?: string | number\n /** Initial value when uncontrolled. */\n defaultValue?: string | number\n /** Options rendered as radio controls. */\n options: RadioOption[]\n /** Stack direction. */\n direction?: 'horizontal' | 'vertical'\n /** Disables all options. */\n disabled?: boolean\n /** Shows a loading spinner next to the selected option and disables interaction. */\n loading?: boolean\n /** Strips built-in styling. */\n unstyled?: boolean\n}\n\nconst props = withDefaults(defineProps<RadioGroupProps>(), {\n modelValue: undefined,\n value: undefined,\n defaultValue: undefined,\n direction: 'horizontal',\n disabled: false,\n loading: false,\n unstyled: false,\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: string | number): void\n (e: 'change', value: string | number): void\n}>()\n\nconst internal = ref<string | number | undefined>(\n props.modelValue ?? props.value ?? props.defaultValue,\n)\n\nwatch(\n () => props.modelValue ?? props.value,\n (v) => {\n if (v !== undefined) internal.value = v\n },\n)\n\nconst current = computed(() => props.modelValue ?? props.value ?? internal.value)\n\nfunction select(opt: RadioOption) {\n if (opt.disabled || props.disabled || props.loading) return\n internal.value = opt.value\n emit('update:modelValue', opt.value)\n emit('change', opt.value)\n}\n\nconst groupClass = computed(() =>\n props.unstyled\n ? ''\n : [\n 'sg-radio-group',\n `sg-radio-group-${props.direction}`,\n props.loading ? 'sg-radio-group-loading' : '',\n ]\n .filter(Boolean)\n .join(' '),\n)\n\n// Inputs are addressed via the wrapper to keep templates clean (one ref per\n// option). Vue 3's `:checked` binding lands as a DOM attribute, not a property,\n// which leaves the radio dot unpainted on the very first mount. Push the\n// state through the property by hand after the patch settles.\nconst wrapperRef = ref<HTMLDivElement | null>(null)\n\nfunction syncInputs() {\n const el = wrapperRef.value\n if (!el) return\n const inputs = el.querySelectorAll<HTMLInputElement>('input[type=\"radio\"]')\n inputs.forEach((input, idx) => {\n const opt = props.options[idx]\n if (!opt) return\n const desired = current.value === opt.value\n if (input.checked !== desired) input.checked = desired\n })\n}\n\nwatch([() => current.value, () => props.options], () => syncInputs(), { flush: 'post' })\nonMounted(syncInputs)\n</script>\n\n<template>\n <div ref=\"wrapperRef\" :class=\"groupClass\" role=\"radiogroup\">\n <label\n v-for=\"opt in options\"\n :key=\"opt.value\"\n :class=\"\n unstyled\n ? ''\n : [\n 'sg-radio',\n current === opt.value ? 'sg-radio-checked' : '',\n opt.disabled || disabled || loading ? 'sg-radio-disabled' : '',\n ]\n .filter(Boolean)\n .join(' ')\n \"\n >\n <input\n type=\"radio\"\n role=\"radio\"\n :class=\"unstyled ? '' : 'sg-radio-input'\"\n :aria-checked=\"current === opt.value\"\n :checked=\"current === opt.value\"\n :disabled=\"opt.disabled || disabled || loading\"\n @change=\"select(opt)\"\n />\n <span :class=\"unstyled ? '' : 'sg-radio-label'\">{{ opt.label }}</span>\n <span\n v-if=\"loading && current === opt.value && !unstyled\"\n class=\"sg-spin sg-spin-small\"\n aria-hidden=\"true\"\n />\n </label>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\n\nexport interface SwitchProps {\n /** v-model binding (Vue idiom). */\n modelValue?: boolean\n /** Compat alias for the on state. */\n checked?: boolean\n /** Initial on state when uncontrolled. */\n defaultChecked?: boolean\n /** Disables interaction. */\n disabled?: boolean\n /** Shows a loading spinner and disables interaction. */\n loading?: boolean\n /** Size token. */\n size?: 'small' | 'middle' | 'large'\n /** Strips built-in styling. */\n unstyled?: boolean\n}\n\nconst props = withDefaults(defineProps<SwitchProps>(), {\n disabled: false,\n loading: false,\n size: 'middle',\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', checked: boolean): void\n (e: 'change', checked: boolean): void\n}>()\n\ndefineSlots<{\n checkedChildren(props: Record<string, never>): unknown\n unCheckedChildren(props: Record<string, never>): unknown\n}>()\n\nconst internal = ref<boolean>(props.modelValue ?? props.checked ?? props.defaultChecked ?? false)\n\nwatch(\n () => props.modelValue ?? props.checked,\n (v) => {\n if (v !== undefined) internal.value = v\n },\n)\n\nconst isChecked = computed(() => props.modelValue ?? props.checked ?? internal.value)\n\nfunction handleClick() {\n if (props.disabled || props.loading) return\n const next = !isChecked.value\n internal.value = next\n emit('update:modelValue', next)\n emit('change', next)\n}\n\nconst switchSizeClass = computed(() => (props.size === 'small' ? 'small' : 'default'))\nconst classes = computed(() =>\n [\n 'sg-switch',\n `sg-switch-${switchSizeClass.value}`,\n isChecked.value ? 'sg-switch-checked' : '',\n props.disabled || props.loading ? 'sg-switch-disabled' : '',\n props.loading ? 'sg-switch-loading' : '',\n ]\n .filter(Boolean)\n .join(' '),\n)\n</script>\n\n<template>\n <button\n role=\"switch\"\n :aria-checked=\"isChecked\"\n :disabled=\"disabled || loading\"\n :class=\"unstyled ? '' : classes\"\n type=\"button\"\n @click=\"handleClick\"\n >\n <template v-if=\"unstyled\">\n <span v-if=\"loading\" class=\"sg-spin sg-spin-small\" aria-hidden=\"true\" />\n <template v-else>\n <slot v-if=\"isChecked\" name=\"checkedChildren\" />\n <slot v-else name=\"unCheckedChildren\" />\n </template>\n </template>\n <template v-else>\n <span class=\"sg-switch-inner\">\n <span v-if=\"loading && !unstyled\" class=\"sg-spin sg-spin-small\" aria-hidden=\"true\" />\n <template v-else>\n <slot v-if=\"isChecked\" name=\"checkedChildren\" />\n <slot v-else name=\"unCheckedChildren\" />\n </template>\n </span>\n <span class=\"sg-switch-handle\" />\n </template>\n </button>\n</template>\n","<script setup lang=\"ts\">\r\nimport { computed, ref, watch } from 'vue'\r\n\r\nexport interface SliderProps {\r\n /** v-model binding (Vue idiom). */\r\n modelValue?: number\r\n /** Compat alias for `modelValue`. */\r\n value?: number\r\n /** Initial value when uncontrolled. */\r\n defaultValue?: number\r\n /** Minimum selectable value. */\r\n min?: number\r\n /** Maximum selectable value. */\r\n max?: number\r\n /** Increment between valid values. */\r\n step?: number\r\n /** Disables interaction. */\r\n disabled?: boolean\r\n /** Strips built-in styling. */\r\n unstyled?: boolean\r\n}\r\n\r\nconst props = withDefaults(defineProps<SliderProps>(), {\r\n defaultValue: 0,\r\n min: 0,\r\n max: 100,\r\n step: 1,\r\n disabled: false,\r\n})\r\n\r\nconst emit = defineEmits<{\r\n (e: 'update:modelValue', value: number): void\r\n (e: 'change', value: number): void\r\n}>()\r\n\r\nconst internal = ref<number>(\r\n props.modelValue ?? props.value ?? props.defaultValue ?? 0,\r\n)\r\n\r\nwatch(\r\n () => props.modelValue ?? props.value,\r\n (v) => {\r\n if (v !== undefined) internal.value = v\r\n },\r\n)\r\n\r\nconst current = computed(() => props.modelValue ?? props.value ?? internal.value)\r\n\r\nconst trackRef = ref<HTMLDivElement | null>(null)\r\nconst percent = computed(() => ((current.value - props.min) / (props.max - props.min)) * 100)\r\n\r\nfunction emitValue(v: number) {\r\n internal.value = v\r\n emit('update:modelValue', v)\r\n emit('change', v)\r\n}\r\n\r\nfunction updateFromPosition(clientX: number) {\r\n if (!trackRef.value || props.disabled) return\r\n const rect = trackRef.value.getBoundingClientRect()\r\n const ratio = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width))\r\n const raw = props.min + ratio * (props.max - props.min)\r\n const stepped = Math.round(raw / props.step) * props.step\r\n emitValue(Math.max(props.min, Math.min(props.max, stepped)))\r\n}\r\n\r\nfunction onMouseDown(e: MouseEvent) {\r\n if (props.disabled) return\r\n updateFromPosition(e.clientX)\r\n const move = (ev: MouseEvent) => updateFromPosition(ev.clientX)\r\n const up = () => {\r\n document.removeEventListener('mousemove', move)\r\n document.removeEventListener('mouseup', up)\r\n }\r\n document.addEventListener('mousemove', move)\r\n document.addEventListener('mouseup', up)\r\n}\r\n\r\nfunction onKeyDown(e: KeyboardEvent) {\r\n if (props.disabled) return\r\n if (e.key === 'ArrowRight' || e.key === 'ArrowUp') {\r\n e.preventDefault()\r\n emitValue(Math.min(props.max, current.value + props.step))\r\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') {\r\n e.preventDefault()\r\n emitValue(Math.max(props.min, current.value - props.step))\r\n }\r\n}\r\n\r\nconst wrapperClass = computed(() =>\r\n props.unstyled\r\n ? ''\r\n : ['sg-slider', props.disabled ? 'sg-slider-disabled' : ''].filter(Boolean).join(' '),\r\n)\r\n</script>\r\n\r\n<template>\r\n <div :class=\"wrapperClass\">\r\n <div\r\n ref=\"trackRef\"\r\n :class=\"unstyled ? '' : 'sg-slider-track'\"\r\n @mousedown=\"onMouseDown\"\r\n >\r\n <div\r\n :class=\"unstyled ? '' : 'sg-slider-fill'\"\r\n :style=\"{ width: `${percent}%` }\"\r\n />\r\n <div\r\n :class=\"unstyled ? '' : 'sg-slider-handle'\"\r\n :style=\"{ left: `${percent}%` }\"\r\n role=\"slider\"\r\n :aria-valuemin=\"min\"\r\n :aria-valuemax=\"max\"\r\n :aria-valuenow=\"current\"\r\n :aria-disabled=\"disabled\"\r\n :tabindex=\"disabled ? -1 : 0\"\r\n @keydown=\"onKeyDown\"\r\n />\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\n\nexport interface RateProps {\n /** v-model binding (Vue idiom). */\n modelValue?: number\n /** Compat alias for `modelValue`. */\n value?: number\n /** Initial value when uncontrolled. */\n defaultValue?: number\n /** Number of rating symbols. */\n count?: number\n /** Allows half steps. */\n allowHalf?: boolean\n /** Custom character (defaults to ★). */\n character?: string\n /** Disables interaction. */\n disabled?: boolean\n /** Strips built-in styling. */\n unstyled?: boolean\n}\n\nconst props = withDefaults(defineProps<RateProps>(), {\n defaultValue: 0,\n count: 5,\n allowHalf: false,\n character: '★',\n disabled: false,\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: number): void\n (e: 'change', value: number): void\n}>()\n\nconst ariaLabel = 'Rating'\nconst starLabel = (n: number) => `${n} star${n > 1 ? 's' : ''}`\n\nconst internal = ref<number>(props.modelValue ?? props.value ?? props.defaultValue)\nconst hoverValue = ref<number | null>(null)\n\nwatch(\n () => props.modelValue ?? props.value,\n (v) => {\n if (v !== undefined) internal.value = v\n },\n)\n\nconst current = computed(() => props.modelValue ?? props.value ?? internal.value)\nconst display = computed(() => hoverValue.value ?? current.value)\n\nfunction emitValue(v: number) {\n internal.value = v\n emit('update:modelValue', v)\n emit('change', v)\n}\n\nfunction clickStar(starIndex: number, e: MouseEvent) {\n if (props.disabled) return\n if (!props.allowHalf) {\n emitValue(current.value === starIndex ? 0 : starIndex)\n return\n }\n const target = e.currentTarget as HTMLElement\n const rect = target.getBoundingClientRect()\n const isLeftHalf = e.clientX - rect.left < rect.width / 2\n const v = isLeftHalf ? starIndex - 0.5 : starIndex\n emitValue(current.value === v ? 0 : v)\n}\n\nfunction hoverStar(starIndex: number, e: MouseEvent) {\n if (props.disabled) return\n if (!props.allowHalf) {\n hoverValue.value = starIndex\n return\n }\n const target = e.currentTarget as HTMLElement\n const rect = target.getBoundingClientRect()\n const isLeftHalf = e.clientX - rect.left < rect.width / 2\n hoverValue.value = isLeftHalf ? starIndex - 0.5 : starIndex\n}\n\nfunction onKey(_starIndex: number, e: KeyboardEvent) {\n if (props.disabled) return\n if (e.key === 'ArrowRight' || e.key === 'ArrowUp') {\n e.preventDefault()\n emitValue(Math.min(props.count, props.allowHalf ? current.value + 0.5 : current.value + 1))\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') {\n e.preventDefault()\n emitValue(Math.max(0, props.allowHalf ? current.value - 0.5 : current.value - 1))\n }\n}\n\nconst wrapperClass = computed(() =>\n props.unstyled\n ? ''\n : ['sg-rate', props.disabled ? 'sg-rate-disabled' : ''].filter(Boolean).join(' '),\n)\n\nfunction classFor(starIndex: number) {\n const isFull = display.value >= starIndex\n const isHalf = props.allowHalf && display.value >= starIndex - 0.5 && display.value < starIndex\n return ['sg-rate-star', isFull ? 'sg-rate-star-full' : '', isHalf ? 'sg-rate-star-half' : '']\n .filter(Boolean)\n .join(' ')\n}\n</script>\n\n<template>\n <div :class=\"wrapperClass\" role=\"radiogroup\" :aria-label=\"ariaLabel\">\n <span\n v-for=\"i in count\"\n :key=\"i\"\n :class=\"unstyled ? '' : classFor(i)\"\n role=\"radio\"\n :aria-checked=\"display >= i\"\n :aria-label=\"starLabel(i)\"\n :tabindex=\"disabled ? -1 : 0\"\n @click=\"(e) => clickStar(i, e)\"\n @mousemove=\"(e) => hoverStar(i, e)\"\n @mouseleave=\"!disabled && (hoverValue = null)\"\n @keydown=\"(e) => onKey(i, e)\"\n >{{ character }}</span\n >\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'\n\nexport interface AutoCompleteOption {\n /** Optional display text — falls back to `value`. */\n label?: string\n /** Stored value emitted on select. */\n value: string\n}\n\nexport interface AutoCompleteProps {\n /** v-model binding (Vue idiom). */\n modelValue?: string\n /** Compat alias for `modelValue`. */\n value?: string\n /** Initial value when uncontrolled. */\n defaultValue?: string\n /** Suggestion list; filtered by label against current input. */\n options: AutoCompleteOption[]\n /** Input placeholder text. */\n placeholder?: string\n /** Disables editing. */\n disabled?: boolean\n /** Shows a loading spinner and disables interaction. */\n loading?: boolean\n /** Size token. */\n size?: 'small' | 'middle' | 'large'\n /** Strips built-in styling. */\n unstyled?: boolean\n}\n\nconst props = withDefaults(defineProps<AutoCompleteProps>(), {\n disabled: false,\n loading: false,\n size: 'middle',\n})\n\nconst isDisabled = computed(() => props.disabled || props.loading)\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: string): void\n (e: 'change', value: string): void\n (e: 'search', value: string): void\n (e: 'select', value: string, option: AutoCompleteOption): void\n (e: 'blur'): void\n}>()\n\nconst internal = ref<string>(props.modelValue ?? props.value ?? props.defaultValue ?? '')\nwatch(\n () => props.modelValue ?? props.value,\n (v) => {\n if (v !== undefined) internal.value = v\n },\n)\n\nconst current = computed(() => props.modelValue ?? props.value ?? internal.value)\nconst open = ref(false)\nconst wrapperRef = ref<HTMLDivElement | null>(null)\n\nconst filtered = computed(() =>\n props.options.filter((o) =>\n (o.label ?? o.value).toLowerCase().includes((current.value ?? '').toLowerCase()),\n ),\n)\n\nfunction handleInput(e: Event) {\n const v = (e.target as HTMLInputElement).value\n internal.value = v\n emit('update:modelValue', v)\n emit('change', v)\n emit('search', v)\n open.value = true\n}\n\nfunction handleSelect(opt: AutoCompleteOption) {\n internal.value = opt.value\n emit('update:modelValue', opt.value)\n emit('change', opt.value)\n emit('select', opt.value, opt)\n open.value = false\n}\n\nfunction handleOutside(e: MouseEvent) {\n if (wrapperRef.value && !wrapperRef.value.contains(e.target as Node)) {\n open.value = false\n }\n}\n\nonMounted(() => document.addEventListener('mousedown', handleOutside))\nonBeforeUnmount(() => document.removeEventListener('mousedown', handleOutside))\n\nconst wrapperClass = computed(() =>\n props.unstyled\n ? ''\n : [\n 'sg-autocomplete',\n `sg-autocomplete-${props.size}`,\n props.loading ? 'sg-autocomplete-loading' : '',\n ]\n .filter(Boolean)\n .join(' '),\n)\n</script>\n\n<template>\n <div ref=\"wrapperRef\" :class=\"wrapperClass\">\n <span :class=\"unstyled ? '' : 'sg-input-wrapper'\">\n <input\n type=\"text\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n :aria-expanded=\"open && filtered.length > 0\"\n :class=\"unstyled ? '' : `sg-input sg-input-${size}`\"\n :value=\"current\"\n :placeholder=\"placeholder\"\n :disabled=\"isDisabled\"\n @input=\"handleInput\"\n @focus=\"open = true\"\n @blur=\"emit('blur')\"\n />\n <span v-if=\"loading && !unstyled\" class=\"sg-spin sg-spin-small\" aria-hidden=\"true\" />\n </span>\n <div v-if=\"open && filtered.length > 0\" :class=\"unstyled ? '' : 'sg-autocomplete-dropdown'\">\n <div\n v-for=\"opt in filtered\"\n :key=\"opt.value\"\n :class=\"unstyled ? '' : 'sg-autocomplete-option'\"\n @mousedown=\"handleSelect(opt)\"\n >\n {{ opt.label ?? opt.value }}\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'\n\nexport interface ColorPickerProps {\n /** v-model binding (Vue idiom). */\n modelValue?: string\n /** Compat alias for `modelValue`. */\n value?: string\n /** Initial value when uncontrolled. */\n defaultValue?: string\n /** Optional preset swatches grouped by label. */\n presets?: Array<{ label: string; colors: string[] }>\n /** When true, show formatted text beside the swatch. */\n showText?: boolean\n /** Output format. */\n format?: 'hex' | 'rgb'\n /** Trigger interaction. */\n trigger?: 'click' | 'hover'\n /** Controlled open state of the picker panel. */\n open?: boolean\n /** Disables interaction. */\n disabled?: boolean\n /** Size token. */\n size?: 'small' | 'middle' | 'large'\n /** Strips built-in styling. */\n unstyled?: boolean\n}\n\nconst props = withDefaults(defineProps<ColorPickerProps>(), {\n format: 'hex',\n trigger: 'click',\n size: 'middle',\n disabled: false,\n open: undefined,\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: string): void\n (e: 'change', value: string): void\n (e: 'openChange', open: boolean): void\n}>()\n\ninterface HSV {\n h: number\n s: number\n v: number\n}\n\nfunction hexToRgb(hex: string): [number, number, number] {\n const clean = hex.replace('#', '')\n const full =\n clean.length === 3 ? clean[0] + clean[0] + clean[1] + clean[1] + clean[2] + clean[2] : clean\n const num = parseInt(full, 16)\n return [(num >> 16) & 255, (num >> 8) & 255, num & 255]\n}\n\nfunction rgbToHex(r: number, g: number, b: number): string {\n return '#' + [r, g, b].map((v) => Math.round(v).toString(16).padStart(2, '0')).join('')\n}\n\nfunction rgbToHsv(r: number, g: number, b: number): HSV {\n r /= 255\n g /= 255\n b /= 255\n const max = Math.max(r, g, b)\n const min = Math.min(r, g, b)\n const d = max - min\n let h = 0\n const s = max === 0 ? 0 : d / max\n const v = max\n if (d !== 0) {\n switch (max) {\n case r:\n h = ((g - b) / d + (g < b ? 6 : 0)) / 6\n break\n case g:\n h = ((b - r) / d + 2) / 6\n break\n case b:\n h = ((r - g) / d + 4) / 6\n break\n }\n }\n return { h, s, v }\n}\n\nfunction hsvToRgb(h: number, s: number, v: number): [number, number, number] {\n let r = 0,\n g = 0,\n b = 0\n const i = Math.floor(h * 6)\n const f = h * 6 - i\n const p = v * (1 - s)\n const q = v * (1 - f * s)\n const t = v * (1 - (1 - f) * s)\n switch (i % 6) {\n case 0:\n r = v\n g = t\n b = p\n break\n case 1:\n r = q\n g = v\n b = p\n break\n case 2:\n r = p\n g = v\n b = t\n break\n case 3:\n r = p\n g = q\n b = v\n break\n case 4:\n r = t\n g = p\n b = v\n break\n case 5:\n r = v\n g = p\n b = q\n break\n }\n return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)]\n}\n\nfunction hsvToHex(h: number, s: number, v: number): string {\n const [r, g, b] = hsvToRgb(h, s, v)\n return rgbToHex(r, g, b)\n}\n\nfunction formatColor(hex: string, fmt: 'hex' | 'rgb'): string {\n if (fmt === 'rgb') {\n const [r, g, b] = hexToRgb(hex)\n return `rgb(${r}, ${g}, ${b})`\n }\n return hex\n}\n\nfunction parseColor(input: string): string | null {\n const trimmed = input.trim()\n if (/^#[0-9a-fA-F]{3}([0-9a-fA-F]{3})?$/.test(trimmed)) {\n const clean = trimmed.replace('#', '')\n const full =\n clean.length === 3\n ? '#' + clean[0] + clean[0] + clean[1] + clean[1] + clean[2] + clean[2]\n : trimmed\n return full.toLowerCase()\n }\n const m = trimmed.match(/^rgb\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*\\)$/i)\n if (m) {\n const r = Math.min(255, parseInt(m[1]))\n const g = Math.min(255, parseInt(m[2]))\n const b = Math.min(255, parseInt(m[3]))\n return rgbToHex(r, g, b)\n }\n return null\n}\n\nconst DEFAULT_COLOR = '#1677ff'\n\nconst internal = ref<string>(\n (props.modelValue ?? props.value ?? props.defaultValue ?? DEFAULT_COLOR).toLowerCase(),\n)\n\nwatch(\n () => props.modelValue ?? props.value,\n (v) => {\n if (v !== undefined) internal.value = v.toLowerCase()\n },\n)\n\nconst current = computed(() => (props.modelValue ?? props.value ?? internal.value).toLowerCase())\nconst internalOpen = ref(false)\nconst isOpen = computed(() => props.open ?? internalOpen.value)\n\nconst wrapperRef = ref<HTMLDivElement | null>(null)\nconst satPanelRef = ref<HTMLDivElement | null>(null)\nconst hueBarRef = ref<HTMLDivElement | null>(null)\nconst textInput = ref(formatColor(current.value, props.format))\n\nconst hsv = ref<HSV>(\n ((): HSV => {\n const [r, g, b] = hexToRgb(current.value)\n return rgbToHsv(r, g, b)\n })(),\n)\n\nwatch(current, (v) => {\n textInput.value = formatColor(v, props.format)\n const [r, g, b] = hexToRgb(v)\n hsv.value = rgbToHsv(r, g, b)\n})\n\nwatch(\n () => props.format,\n (f) => {\n textInput.value = formatColor(current.value, f)\n },\n)\n\nlet hoverTimer: ReturnType<typeof setTimeout> | undefined\n\nfunction setOpenState(v: boolean) {\n internalOpen.value = v\n emit('openChange', v)\n}\n\nfunction emitChange(hex: string) {\n internal.value = hex\n textInput.value = formatColor(hex, props.format)\n const out = formatColor(hex, props.format)\n emit('update:modelValue', out)\n emit('change', out)\n}\n\nfunction handleTriggerClick() {\n if (props.disabled || props.trigger !== 'click') return\n setOpenState(!isOpen.value)\n}\n\nfunction handleMouseEnter() {\n if (props.disabled || props.trigger !== 'hover') return\n if (hoverTimer) clearTimeout(hoverTimer)\n setOpenState(true)\n}\n\nfunction handleMouseLeave() {\n if (props.trigger !== 'hover') return\n hoverTimer = setTimeout(() => setOpenState(false), 200)\n}\n\nfunction handleTextInput(e: Event) {\n const val = (e.target as HTMLInputElement).value\n textInput.value = val\n const parsed = parseColor(val)\n if (parsed) {\n const [r, g, b] = hexToRgb(parsed)\n hsv.value = rgbToHsv(r, g, b)\n emitChange(parsed)\n }\n}\n\nfunction handlePresetClick(c: string) {\n const parsed = parseColor(c)\n if (!parsed) return\n const [r, g, b] = hexToRgb(parsed)\n hsv.value = rgbToHsv(r, g, b)\n emitChange(parsed)\n}\n\nlet dragging: 'sat' | 'hue' | null = null\n\nfunction updateSat(e: PointerEvent) {\n if (!satPanelRef.value) return\n const rect = satPanelRef.value.getBoundingClientRect()\n const s = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width))\n const v = Math.max(0, Math.min(1, 1 - (e.clientY - rect.top) / rect.height))\n const next = { ...hsv.value, s, v }\n hsv.value = next\n emitChange(hsvToHex(next.h, next.s, next.v))\n}\n\nfunction updateHue(e: PointerEvent) {\n if (!hueBarRef.value) return\n const rect = hueBarRef.value.getBoundingClientRect()\n const h = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width))\n const next = { ...hsv.value, h }\n hsv.value = next\n emitChange(hsvToHex(next.h, next.s, next.v))\n}\n\nfunction handleSatPointerDown(e: PointerEvent) {\n e.preventDefault()\n dragging = 'sat'\n ;(e.target as HTMLElement).setPointerCapture?.(e.pointerId)\n updateSat(e)\n}\n\nfunction handleSatPointerMove(e: PointerEvent) {\n if (dragging !== 'sat') return\n updateSat(e)\n}\n\nfunction handleHuePointerDown(e: PointerEvent) {\n e.preventDefault()\n dragging = 'hue'\n ;(e.target as HTMLElement).setPointerCapture?.(e.pointerId)\n updateHue(e)\n}\n\nfunction handleHuePointerMove(e: PointerEvent) {\n if (dragging !== 'hue') return\n updateHue(e)\n}\n\nfunction handlePointerUp() {\n dragging = null\n}\n\nfunction handleOutside(e: MouseEvent) {\n if (!isOpen.value) return\n if (wrapperRef.value && !wrapperRef.value.contains(e.target as Node)) {\n setOpenState(false)\n }\n}\n\nfunction handleKeyDown(e: KeyboardEvent) {\n if (!isOpen.value) return\n if (e.key === 'Escape') setOpenState(false)\n}\n\nonMounted(() => {\n document.addEventListener('mousedown', handleOutside)\n document.addEventListener('keydown', handleKeyDown)\n})\n\nonBeforeUnmount(() => {\n document.removeEventListener('mousedown', handleOutside)\n document.removeEventListener('keydown', handleKeyDown)\n if (hoverTimer) clearTimeout(hoverTimer)\n})\n\nconst wrapperClass = computed(() =>\n props.unstyled\n ? ''\n : [\n 'sg-colorpicker-wrapper',\n `sg-colorpicker-${props.size}`,\n props.disabled ? 'sg-colorpicker-disabled' : '',\n ]\n .filter(Boolean)\n .join(' '),\n)\n\nconst hueColor = computed(() => hsvToHex(hsv.value.h, 1, 1))\nconst satBackground = computed(\n () =>\n `linear-gradient(to top, #000, transparent), linear-gradient(to right, #fff, ${hueColor.value})`,\n)\n</script>\n\n<template>\n <div\n ref=\"wrapperRef\"\n :class=\"wrapperClass\"\n @mouseenter=\"handleMouseEnter\"\n @mouseleave=\"handleMouseLeave\"\n >\n <button\n type=\"button\"\n class=\"sg-colorpicker-trigger\"\n :disabled=\"disabled\"\n aria-haspopup=\"dialog\"\n :aria-expanded=\"isOpen\"\n aria-label=\"Pick color\"\n @click=\"handleTriggerClick\"\n >\n <span class=\"sg-colorpicker-swatch\" :style=\"{ background: current }\" />\n <span v-if=\"showText\" class=\"sg-colorpicker-text\">{{ formatColor(current, format) }}</span>\n </button>\n <div\n v-if=\"isOpen\"\n class=\"sg-colorpicker-dropdown\"\n @mouseenter=\"handleMouseEnter\"\n @mouseleave=\"handleMouseLeave\"\n >\n <div\n ref=\"satPanelRef\"\n class=\"sg-colorpicker-saturation\"\n :style=\"{ background: satBackground }\"\n @pointerdown=\"handleSatPointerDown\"\n @pointermove=\"handleSatPointerMove\"\n @pointerup=\"handlePointerUp\"\n >\n <div\n class=\"sg-colorpicker-cursor\"\n :style=\"{\n left: `${hsv.s * 100}%`,\n top: `${(1 - hsv.v) * 100}%`,\n background: current,\n }\"\n />\n </div>\n <div\n ref=\"hueBarRef\"\n class=\"sg-colorpicker-hue\"\n @pointerdown=\"handleHuePointerDown\"\n @pointermove=\"handleHuePointerMove\"\n @pointerup=\"handlePointerUp\"\n >\n <div class=\"sg-colorpicker-hue-cursor\" :style=\"{ left: `${hsv.h * 100}%` }\" />\n </div>\n <div class=\"sg-colorpicker-input-row\">\n <span class=\"sg-colorpicker-preview\" :style=\"{ background: current }\" />\n <input\n class=\"sg-colorpicker-input\"\n :value=\"textInput\"\n spellcheck=\"false\"\n @input=\"handleTextInput\"\n />\n </div>\n <div v-for=\"group in presets ?? []\" :key=\"group.label\" class=\"sg-colorpicker-preset-group\">\n <div class=\"sg-colorpicker-preset-label\">{{ group.label }}</div>\n <div class=\"sg-colorpicker-preset-grid\">\n <button\n v-for=\"c in group.colors\"\n :key=\"c\"\n type=\"button\"\n class=\"sg-colorpicker-preset-color\"\n :style=\"{ background: c }\"\n :title=\"c\"\n @click=\"handlePresetClick(c)\"\n />\n </div>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport { useConfig } from './ConfigProvider.vue'\n\nexport type DatePickerMode = 'date' | 'month' | 'year'\n\nexport interface ShowTimeConfig {\n /** Time portion format string. */\n format?: string\n /** Step between selectable hours. */\n hourStep?: number\n /** Step between selectable minutes. */\n minuteStep?: number\n /** Step between selectable seconds. */\n secondStep?: number\n /** Initial time when opening without a selected date. */\n defaultValue?: Date\n}\n\nexport interface DatePreset {\n /** Label shown in the sidebar. */\n label: string\n /** Date applied when picked (or a `[start, end]` tuple for range presets). */\n value: Date | [Date, Date]\n}\n\nexport interface DatePickerProps {\n /** v-model binding (Vue idiom). */\n modelValue?: Date | null\n /** Compat alias for `modelValue`. */\n value?: Date | null\n /** Initial value when uncontrolled. */\n defaultValue?: Date\n /** Placeholder text. */\n placeholder?: string\n /** Display format (YYYY/MM/DD/HH/mm/ss). */\n format?: string\n /** Picker level. */\n picker?: DatePickerMode\n /** Show time-of-day picker columns. When object, passes ShowTimeConfig. */\n showTime?: boolean | ShowTimeConfig\n /** Show \"Today\" footer button. */\n showToday?: boolean\n /** Show \"Now\" footer button (with showTime). */\n showNow?: boolean\n /** Show clear button when value exists. */\n allowClear?: boolean\n /** Disabled day predicate. */\n disabledDate?: (d: Date) => boolean\n /** Preset shortcuts in the sidebar. */\n presets?: DatePreset[]\n /** Corner alignment of the dropdown relative to the input. */\n placement?: 'bottomLeft' | 'bottomRight' | 'topLeft' | 'topRight'\n /** Controlled visibility of the dropdown. */\n open?: boolean\n /** When true, the trigger renders read-only text instead of an input. */\n inputReadOnly?: boolean\n /** Disables interaction. */\n disabled?: boolean\n /** Shows a loading spinner and disables interaction. */\n loading?: boolean\n /** Size token. */\n size?: 'small' | 'middle' | 'large'\n /** Strips built-in styling. */\n unstyled?: boolean\n}\n\nconst props = withDefaults(defineProps<DatePickerProps>(), {\n placeholder: 'Select date',\n picker: 'date',\n showTime: false,\n showToday: true,\n showNow: false,\n allowClear: true,\n placement: 'bottomLeft',\n inputReadOnly: false,\n size: 'middle',\n disabled: false,\n loading: false,\n open: undefined,\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: Date | null): void\n (e: 'change', value: Date | null, dateString: string): void\n (e: 'openChange', open: boolean): void\n (e: 'blur'): void\n (e: 'calendarChange', value: Date | null): void\n}>()\n\nconst DEFAULT_MONTH_NAMES = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n]\nconst DEFAULT_DAY_NAMES = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']\n\nconst config = useConfig()\nconst monthNames = computed(() => config.value.locale?.calendar?.monthNames ?? DEFAULT_MONTH_NAMES)\nconst dayNames = computed(() => config.value.locale?.calendar?.dayNames ?? DEFAULT_DAY_NAMES)\nconst todayBtnLabel = computed(() => config.value.locale?.calendar?.today ?? 'Today')\nconst nowBtnLabel = computed(() => config.value.locale?.calendar?.now ?? 'Now')\nconst okBtnLabel = computed(() => config.value.locale?.modal?.okText ?? 'OK')\nconst prevYearLabel = computed(() => config.value.locale?.datePicker?.prevYear ?? 'Previous year')\nconst nextYearLabel = computed(() => config.value.locale?.datePicker?.nextYear ?? 'Next year')\nconst prevMonthLabel = computed(\n () => config.value.locale?.datePicker?.prevMonth ?? 'Previous month',\n)\nconst nextMonthLabel = computed(() => config.value.locale?.datePicker?.nextMonth ?? 'Next month')\n\nfunction pad(n: number) {\n return String(n).padStart(2, '0')\n}\nfunction isSameDay(a: Date, b: Date) {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n )\n}\nfunction isToday(d: Date) {\n return isSameDay(d, new Date())\n}\nfunction getDaysInMonth(year: number, month: number) {\n return new Date(year, month + 1, 0).getDate()\n}\nfunction cloneDate(d: Date) {\n return new Date(d.getTime())\n}\nfunction toValidDate(input: unknown): Date | null {\n if (input == null || input === '') return null\n if (input instanceof Date) return isNaN(input.getTime()) ? null : input\n if (typeof input === 'string' || typeof input === 'number') {\n const d = new Date(input)\n return isNaN(d.getTime()) ? null : d\n }\n return null\n}\nfunction formatDate(d: Date | null, fmt: string): string {\n if (!d) return ''\n return fmt\n .replace('YYYY', String(d.getFullYear()))\n .replace('MM', pad(d.getMonth() + 1))\n .replace('DD', pad(d.getDate()))\n .replace('HH', pad(d.getHours()))\n .replace('mm', pad(d.getMinutes()))\n .replace('ss', pad(d.getSeconds()))\n}\nfunction parseDate(str: string, fmt: string): Date | null {\n if (!str) return null\n const yi = fmt.indexOf('YYYY')\n const mi = fmt.indexOf('MM')\n const di = fmt.indexOf('DD')\n const hi = fmt.indexOf('HH')\n const mni = fmt.indexOf('mm')\n const si = fmt.indexOf('ss')\n const year = yi >= 0 ? parseInt(str.substring(yi, yi + 4), 10) : new Date().getFullYear()\n const month = mi >= 0 ? parseInt(str.substring(mi, mi + 2), 10) - 1 : 0\n const day = di >= 0 ? parseInt(str.substring(di, di + 2), 10) : 1\n const hour = hi >= 0 ? parseInt(str.substring(hi, hi + 2), 10) : 0\n const min = mni >= 0 ? parseInt(str.substring(mni, mni + 2), 10) : 0\n const sec = si >= 0 ? parseInt(str.substring(si, si + 2), 10) : 0\n if (isNaN(year) || isNaN(month) || isNaN(day)) return null\n return new Date(year, month, day, hour, min, sec)\n}\n\nconst hasTime = computed(() => !!props.showTime)\nconst timeConfig = computed<ShowTimeConfig>(() =>\n typeof props.showTime === 'object' && props.showTime !== null ? props.showTime : {},\n)\n\nconst fmt = computed(\n () =>\n props.format ??\n (hasTime.value\n ? 'YYYY-MM-DD HH:mm:ss'\n : props.picker === 'month'\n ? 'YYYY-MM'\n : props.picker === 'year'\n ? 'YYYY'\n : 'YYYY-MM-DD'),\n)\n\nconst normalizedDefault = toValidDate(props.defaultValue)\nconst initial =\n props.modelValue !== undefined\n ? toValidDate(props.modelValue)\n : props.value !== undefined\n ? toValidDate(props.value)\n : normalizedDefault\n\nconst internal = ref<Date | null>(initial)\nwatch(\n () => props.modelValue ?? props.value,\n (v) => {\n if (v !== undefined) {\n const normalized = toValidDate(v)\n internal.value = normalized\n if (normalized) {\n viewYear.value = normalized.getFullYear()\n viewMonth.value = normalized.getMonth()\n tempTime.value = normalized\n }\n }\n },\n)\n\nconst current = computed<Date | null>(() => {\n const ext = props.modelValue !== undefined ? props.modelValue : props.value\n if (ext !== undefined) return toValidDate(ext)\n return internal.value\n})\n\nconst internalOpen = ref(false)\nconst isOpen = computed(() => props.open ?? internalOpen.value)\n\nconst viewYear = ref((current.value ?? new Date()).getFullYear())\nconst viewMonth = ref((current.value ?? new Date()).getMonth())\nconst pickerLevel = ref<DatePickerMode>(\n props.picker === 'year' ? 'year' : props.picker === 'month' ? 'month' : 'date',\n)\nconst tempTime = ref<Date>(current.value ?? timeConfig.value.defaultValue ?? new Date())\nconst inputText = ref('')\nconst isInputting = ref(false)\n\nconst wrapperRef = ref<HTMLDivElement | null>(null)\nconst inputRef = ref<HTMLInputElement | null>(null)\n\nfunction setOpen(v: boolean) {\n internalOpen.value = v\n emit('openChange', v)\n if (!v) {\n isInputting.value = false\n emit('blur')\n }\n}\n\nfunction commit(d: Date | null) {\n internal.value = d\n emit('update:modelValue', d)\n emit('change', d, d ? formatDate(d, fmt.value) : '')\n}\n\nfunction openDropdown() {\n if (props.disabled || props.loading) return\n setOpen(true)\n pickerLevel.value = props.picker === 'year' ? 'year' : props.picker === 'month' ? 'month' : 'date'\n if (current.value) {\n viewYear.value = current.value.getFullYear()\n viewMonth.value = current.value.getMonth()\n tempTime.value = current.value\n }\n}\n\nfunction handleDateSelect(d: Date) {\n emit('calendarChange', d)\n if (hasTime.value) {\n const merged = cloneDate(d)\n merged.setHours(\n tempTime.value.getHours(),\n tempTime.value.getMinutes(),\n tempTime.value.getSeconds(),\n )\n tempTime.value = merged\n internal.value = merged\n return\n }\n commit(d)\n setOpen(false)\n}\n\nfunction handleMonthSelect(month: number) {\n if (props.picker === 'month') {\n const d = new Date(viewYear.value, month, 1)\n commit(d)\n setOpen(false)\n return\n }\n viewMonth.value = month\n pickerLevel.value = 'date'\n}\n\nfunction handleYearSelect(year: number) {\n if (props.picker === 'year') {\n const d = new Date(year, 0, 1)\n commit(d)\n setOpen(false)\n return\n }\n viewYear.value = year\n pickerLevel.value = props.picker === 'month' ? 'month' : 'date'\n}\n\nfunction handleTimeChange(d: Date) {\n tempTime.value = d\n if (current.value) {\n const merged = cloneDate(current.value)\n merged.setHours(d.getHours(), d.getMinutes(), d.getSeconds())\n internal.value = merged\n }\n}\n\nfunction handleTimeOk() {\n const final = current.value ?? tempTime.value\n commit(final)\n setOpen(false)\n}\n\nfunction handleToday() {\n const today = new Date()\n if (hasTime.value) {\n viewYear.value = today.getFullYear()\n viewMonth.value = today.getMonth()\n internal.value = today\n tempTime.value = today\n } else {\n commit(today)\n setOpen(false)\n }\n}\n\nfunction handleNow() {\n const now = new Date()\n commit(now)\n setOpen(false)\n}\n\nfunction handleClear(e: MouseEvent) {\n e.stopPropagation()\n commit(null)\n}\n\nfunction handlePresetSelect(p: DatePreset) {\n const single = Array.isArray(p.value) ? p.value[0] : p.value\n commit(single)\n setOpen(false)\n}\n\nfunction handleInputChange(e: Event) {\n inputText.value = (e.target as HTMLInputElement).value\n isInputting.value = true\n}\n\nfunction handleInputKeyDown(e: KeyboardEvent) {\n if (e.key === 'Enter' && isInputting.value) {\n const parsed = parseDate(inputText.value, fmt.value)\n if (parsed && !isNaN(parsed.getTime())) {\n commit(parsed)\n setOpen(false)\n }\n }\n if (e.key === 'Escape') setOpen(false)\n}\n\nfunction handleOutside(e: MouseEvent) {\n if (!isOpen.value) return\n if (wrapperRef.value && !wrapperRef.value.contains(e.target as Node)) {\n setOpen(false)\n }\n}\n\nfunction handleEscape(e: KeyboardEvent) {\n if (!isOpen.value) return\n if (e.key === 'Escape') setOpen(false)\n}\n\nonMounted(() => {\n document.addEventListener('mousedown', handleOutside)\n document.addEventListener('keydown', handleEscape)\n})\n\nonBeforeUnmount(() => {\n document.removeEventListener('mousedown', handleOutside)\n document.removeEventListener('keydown', handleEscape)\n})\n\ninterface DayCell {\n date: Date\n day: number\n inMonth: boolean\n}\n\nconst weeks = computed<DayCell[][]>(() => {\n const y = viewYear.value\n const m = viewMonth.value\n const daysInMonth = getDaysInMonth(y, m)\n const firstDay = new Date(y, m, 1).getDay()\n const prevDays = getDaysInMonth(y, m - 1)\n const cells: DayCell[] = []\n for (let i = firstDay - 1; i >= 0; i--) {\n cells.push({ date: new Date(y, m - 1, prevDays - i), day: prevDays - i, inMonth: false })\n }\n for (let d = 1; d <= daysInMonth; d++) {\n cells.push({ date: new Date(y, m, d), day: d, inMonth: true })\n }\n const remaining = 42 - cells.length\n for (let d = 1; d <= remaining; d++) {\n cells.push({ date: new Date(y, m + 1, d), day: d, inMonth: false })\n }\n const out: DayCell[][] = []\n for (let i = 0; i < cells.length; i += 7) out.push(cells.slice(i, i + 7))\n return out\n})\n\nconst monthLabel = computed(() => `${monthNames.value[viewMonth.value]} ${viewYear.value}`)\nconst displayText = computed(() => {\n if (isInputting.value) return inputText.value\n return current.value ? formatDate(current.value, fmt.value) : ''\n})\n\nconst yearDecadeStart = computed(() => Math.floor(viewYear.value / 10) * 10)\nconst yearOptions = computed(() => {\n const arr: number[] = []\n for (let y = yearDecadeStart.value - 1; y <= yearDecadeStart.value + 10; y++) arr.push(y)\n return arr\n})\n\nfunction shiftMonth(delta: number) {\n const m = viewMonth.value + delta\n if (m < 0) {\n viewMonth.value = 11\n viewYear.value--\n } else if (m > 11) {\n viewMonth.value = 0\n viewYear.value++\n } else {\n viewMonth.value = m\n }\n}\n\nfunction shiftYear(delta: number) {\n viewYear.value += delta\n}\n\nfunction cellClass(cell: DayCell) {\n const selected = current.value ? isSameDay(cell.date, current.value) : false\n const today = isToday(cell.date)\n const disabled = props.disabledDate?.(cell.date) ?? false\n return [\n 'sg-dp-cell',\n !cell.inMonth ? 'sg-dp-cell-outside' : '',\n selected ? 'sg-dp-cell-selected' : '',\n today ? 'sg-dp-cell-today' : '',\n disabled ? 'sg-dp-cell-disabled' : '',\n ]\n .filter(Boolean)\n .join(' ')\n}\n\nconst wrapperCls = computed(() =>\n props.unstyled\n ? ''\n : [\n 'sg-datepicker',\n `sg-datepicker-${props.size}`,\n isOpen.value ? 'sg-datepicker-open' : '',\n props.disabled || props.loading ? 'sg-datepicker-disabled' : '',\n props.loading ? 'sg-datepicker-loading' : '',\n ]\n .filter(Boolean)\n .join(' '),\n)\n\nconst dropdownCls = computed(() => `sg-dp-dropdown sg-dp-dropdown-${props.placement}`)\n\nconst hourStep = computed(() => timeConfig.value.hourStep ?? 1)\nconst minuteStep = computed(() => timeConfig.value.minuteStep ?? 1)\nconst secondStep = computed(() => timeConfig.value.secondStep ?? 1)\nconst showSeconds = computed(() => (timeConfig.value.format ?? 'HH:mm:ss').includes('ss'))\n\nconst hourItems = computed(() => {\n const arr: number[] = []\n for (let i = 0; i < 24; i += hourStep.value) arr.push(i)\n return arr\n})\nconst minuteItems = computed(() => {\n const arr: number[] = []\n for (let i = 0; i < 60; i += minuteStep.value) arr.push(i)\n return arr\n})\nconst secondItems = computed(() => {\n const arr: number[] = []\n for (let i = 0; i < 60; i += secondStep.value) arr.push(i)\n return arr\n})\n\nfunction setTimeH(h: number) {\n const d = cloneDate(tempTime.value)\n d.setHours(h)\n handleTimeChange(d)\n}\nfunction setTimeM(m: number) {\n const d = cloneDate(tempTime.value)\n d.setMinutes(m)\n handleTimeChange(d)\n}\nfunction setTimeS(s: number) {\n const d = cloneDate(tempTime.value)\n d.setSeconds(s)\n handleTimeChange(d)\n}\n\nconst hourColRef = ref<HTMLDivElement | null>(null)\nconst minuteColRef = ref<HTMLDivElement | null>(null)\nconst secondColRef = ref<HTMLDivElement | null>(null)\n\nfunction scrollActive(col: HTMLElement | null) {\n if (!col) return\n const active = col.querySelector('[data-active=\"true\"]') as HTMLElement | null\n active?.scrollIntoView?.({ block: 'nearest' })\n}\n\nwatch([isOpen, () => tempTime.value], async () => {\n if (!isOpen.value || !hasTime.value) return\n await nextTick()\n scrollActive(hourColRef.value)\n scrollActive(minuteColRef.value)\n scrollActive(secondColRef.value)\n})\n</script>\n\n<template>\n <div ref=\"wrapperRef\" :class=\"wrapperCls\">\n <div\n class=\"sg-datepicker-input\"\n role=\"combobox\"\n aria-haspopup=\"dialog\"\n :aria-expanded=\"isOpen\"\n :aria-disabled=\"disabled\"\n @click=\"openDropdown\"\n >\n <span\n v-if=\"inputReadOnly\"\n :class=\"\n ['sg-datepicker-input-text', displayText ? '' : 'sg-datepicker-placeholder']\n .filter(Boolean)\n .join(' ')\n \"\n >\n {{ displayText || placeholder }}\n </span>\n <input\n v-else\n ref=\"inputRef\"\n class=\"sg-datepicker-input-text\"\n :value=\"displayText\"\n :placeholder=\"placeholder\"\n :readonly=\"disabled\"\n @input=\"handleInputChange\"\n @keydown=\"handleInputKeyDown\"\n @focus=\"openDropdown\"\n />\n <span class=\"sg-datepicker-suffix\">\n <span v-if=\"loading && !unstyled\" class=\"sg-spin sg-spin-small\" aria-hidden=\"true\" />\n <template v-else>\n <span\n v-if=\"allowClear && current\"\n class=\"sg-datepicker-clear\"\n role=\"button\"\n aria-label=\"Clear\"\n @click=\"handleClear\"\n >×</span\n >\n <svg\n class=\"sg-datepicker-icon\"\n viewBox=\"0 0 16 16\"\n width=\"14\"\n height=\"14\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M11 1V0h1v1h2.5A1.5 1.5 0 0116 2.5v12a1.5 1.5 0 01-1.5 1.5h-13A1.5 1.5 0 010 14.5v-12A1.5 1.5 0 011.5 1H4V0h1v1h6zM1.5 2a.5.5 0 00-.5.5V4h14V2.5a.5.5 0 00-.5-.5h-13zM15 5H1v9.5a.5.5 0 00.5.5h13a.5.5 0 00.5-.5V5z\"\n />\n </svg>\n </template>\n </span>\n </div>\n <div v-if=\"isOpen\" :class=\"dropdownCls\">\n <div class=\"sg-dp-dropdown-inner\">\n <div v-if=\"presets && presets.length > 0\" class=\"sg-dp-presets\">\n <div\n v-for=\"p in presets\"\n :key=\"p.label\"\n class=\"sg-dp-preset-item\"\n @click=\"handlePresetSelect(p)\"\n >\n {{ p.label }}\n </div>\n </div>\n <div class=\"sg-dp-content\">\n <div v-if=\"pickerLevel === 'date'\" class=\"sg-dp-panel\">\n <div class=\"sg-dp-panel-header\">\n <button\n type=\"button\"\n class=\"sg-dp-nav-btn\"\n :title=\"prevYearLabel\"\n :aria-label=\"prevYearLabel\"\n @click=\"shiftYear(-1)\"\n >\n «\n </button>\n <button\n type=\"button\"\n class=\"sg-dp-nav-btn\"\n :title=\"prevMonthLabel\"\n :aria-label=\"prevMonthLabel\"\n @click=\"shiftMonth(-1)\"\n >\n ‹\n </button>\n <button\n v-if=\"picker === 'date'\"\n type=\"button\"\n class=\"sg-dp-panel-title sg-dp-panel-title-btn\"\n @click=\"pickerLevel = 'month'\"\n >\n {{ monthLabel }}\n </button>\n <span v-else class=\"sg-dp-panel-title\">{{ monthLabel }}</span>\n <button\n type=\"button\"\n class=\"sg-dp-nav-btn\"\n :title=\"nextMonthLabel\"\n :aria-label=\"nextMonthLabel\"\n @click=\"shiftMonth(1)\"\n >\n ›\n </button>\n <button\n type=\"button\"\n class=\"sg-dp-nav-btn\"\n :title=\"nextYearLabel\"\n :aria-label=\"nextYearLabel\"\n @click=\"shiftYear(1)\"\n >\n »\n </button>\n </div>\n <table class=\"sg-dp-table\">\n <thead>\n <tr>\n <th v-for=\"d in dayNames\" :key=\"d\" class=\"sg-dp-th\">{{ d }}</th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(week, wi) in weeks\" :key=\"wi\">\n <td\n v-for=\"cell in week\"\n :key=\"cell.date.toISOString()\"\n :class=\"cellClass(cell)\"\n @click=\"!props.disabledDate?.(cell.date) && handleDateSelect(cell.date)\"\n >\n <span class=\"sg-dp-cell-inner\">{{ cell.day }}</span>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <div v-if=\"pickerLevel === 'month'\" class=\"sg-dp-panel\">\n <div class=\"sg-dp-panel-header\">\n <button\n type=\"button\"\n class=\"sg-dp-nav-btn\"\n :title=\"prevYearLabel\"\n :aria-label=\"prevYearLabel\"\n @click=\"shiftYear(-1)\"\n >\n «\n </button>\n <span class=\"sg-dp-panel-title\">{{ viewYear }}</span>\n <button\n type=\"button\"\n class=\"sg-dp-nav-btn\"\n :title=\"nextYearLabel\"\n :aria-label=\"nextYearLabel\"\n @click=\"shiftYear(1)\"\n >\n »\n </button>\n </div>\n <div class=\"sg-dp-month-grid\">\n <div\n v-for=\"(name, i) in monthNames\"\n :key=\"i\"\n :class=\"\n [\n 'sg-dp-month-cell',\n current && current.getFullYear() === viewYear && current.getMonth() === i\n ? 'sg-dp-month-cell-selected'\n : '',\n new Date().getFullYear() === viewYear && new Date().getMonth() === i\n ? 'sg-dp-month-cell-current'\n : '',\n ]\n .filter(Boolean)\n .join(' ')\n \"\n @click=\"handleMonthSelect(i)\"\n >\n {{ name.substring(0, 3) }}\n </div>\n </div>\n </div>\n\n <div v-if=\"pickerLevel === 'year'\" class=\"sg-dp-panel\">\n <div class=\"sg-dp-panel-header\">\n <button\n type=\"button\"\n class=\"sg-dp-nav-btn\"\n :title=\"prevYearLabel\"\n :aria-label=\"prevYearLabel\"\n @click=\"shiftYear(-10)\"\n >\n «\n </button>\n <span class=\"sg-dp-panel-title\"\n >{{ yearDecadeStart }} - {{ yearDecadeStart + 9 }}</span\n >\n <button\n type=\"button\"\n class=\"sg-dp-nav-btn\"\n :title=\"nextYearLabel\"\n :aria-label=\"nextYearLabel\"\n @click=\"shiftYear(10)\"\n >\n »\n </button>\n </div>\n <div class=\"sg-dp-year-grid\">\n <div\n v-for=\"y in yearOptions\"\n :key=\"y\"\n :class=\"\n [\n 'sg-dp-year-cell',\n current && current.getFullYear() === y ? 'sg-dp-year-cell-selected' : '',\n new Date().getFullYear() === y ? 'sg-dp-year-cell-current' : '',\n y < yearDecadeStart || y > yearDecadeStart + 9 ? 'sg-dp-year-cell-outside' : '',\n ]\n .filter(Boolean)\n .join(' ')\n \"\n @click=\"handleYearSelect(y)\"\n >\n {{ y }}\n </div>\n </div>\n </div>\n\n <div v-if=\"hasTime && pickerLevel === 'date'\" class=\"sg-dp-time-panel\">\n <div ref=\"hourColRef\" class=\"sg-dp-time-col\">\n <div\n v-for=\"n in hourItems\"\n :key=\"n\"\n :data-active=\"n === tempTime.getHours()\"\n :class=\"[\n 'sg-dp-time-cell',\n n === tempTime.getHours() ? 'sg-dp-time-cell-active' : '',\n ]\"\n @click=\"setTimeH(n)\"\n >\n {{ pad(n) }}\n </div>\n </div>\n <div ref=\"minuteColRef\" class=\"sg-dp-time-col\">\n <div\n v-for=\"n in minuteItems\"\n :key=\"n\"\n :data-active=\"n === tempTime.getMinutes()\"\n :class=\"[\n 'sg-dp-time-cell',\n n === tempTime.getMinutes() ? 'sg-dp-time-cell-active' : '',\n ]\"\n @click=\"setTimeM(n)\"\n >\n {{ pad(n) }}\n </div>\n </div>\n <div v-if=\"showSeconds\" ref=\"secondColRef\" class=\"sg-dp-time-col\">\n <div\n v-for=\"n in secondItems\"\n :key=\"n\"\n :data-active=\"n === tempTime.getSeconds()\"\n :class=\"[\n 'sg-dp-time-cell',\n n === tempTime.getSeconds() ? 'sg-dp-time-cell-active' : '',\n ]\"\n @click=\"setTimeS(n)\"\n >\n {{ pad(n) }}\n </div>\n </div>\n </div>\n\n <div class=\"sg-dp-footer\">\n <div class=\"sg-dp-footer-start\">\n <button\n v-if=\"showToday && !hasTime && pickerLevel === 'date'\"\n type=\"button\"\n class=\"sg-dp-footer-btn sg-dp-today-btn\"\n @click=\"handleToday\"\n >\n {{ todayBtnLabel }}\n </button>\n <button\n v-if=\"showNow && hasTime\"\n type=\"button\"\n class=\"sg-dp-footer-btn sg-dp-now-btn\"\n @click=\"handleNow\"\n >\n {{ nowBtnLabel }}\n </button>\n </div>\n <div class=\"sg-dp-footer-end\">\n <button\n v-if=\"hasTime\"\n type=\"button\"\n class=\"sg-dp-footer-btn sg-dp-ok-btn\"\n @click=\"handleTimeOk\"\n >\n {{ okBtnLabel }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport { useConfig } from './ConfigProvider.vue'\nimport type { DatePreset, ShowTimeConfig } from './DatePicker.vue'\n\nexport type { DatePreset, ShowTimeConfig } from './DatePicker.vue'\n\nexport interface RangePickerProps {\n /** v-model binding — [start, end] tuple (Vue idiom). */\n modelValue?: [Date | null, Date | null]\n /** Compat alias for `modelValue`. */\n value?: [Date | null, Date | null]\n /** Initial range when uncontrolled. */\n defaultValue?: [Date, Date]\n /** Placeholders for the start and end inputs. */\n placeholder?: [string, string]\n /** Display format (YYYY/MM/DD/HH/mm/ss) for both ends. */\n format?: string\n /** Show time-of-day picker columns. When object, passes ShowTimeConfig. */\n showTime?: boolean | ShowTimeConfig\n /** Show clear button when a value exists. */\n allowClear?: boolean\n /** Disabled day predicate. */\n disabledDate?: (d: Date) => boolean\n /** Sidebar shortcuts (`Date | [Date, Date]`). */\n presets?: DatePreset[]\n /** Separator node between the start and end values. */\n separator?: string\n /** Corner alignment of the dropdown relative to the input. */\n placement?: 'bottomLeft' | 'bottomRight' | 'topLeft' | 'topRight'\n /** Controlled visibility of the dropdown. */\n open?: boolean\n /** Disables interaction. */\n disabled?: boolean\n /** Shows a loading spinner and disables interaction. */\n loading?: boolean\n /** Size token. */\n size?: 'small' | 'middle' | 'large'\n /** Strips built-in styling. */\n unstyled?: boolean\n}\n\nconst props = withDefaults(defineProps<RangePickerProps>(), {\n placeholder: () => ['Start date', 'End date'],\n showTime: false,\n allowClear: true,\n separator: '→',\n placement: 'bottomLeft',\n size: 'middle',\n disabled: false,\n loading: false,\n open: undefined,\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: [Date | null, Date | null]): void\n (e: 'change', value: [Date | null, Date | null], dateStrings: [string, string]): void\n (e: 'openChange', open: boolean): void\n}>()\n\nconst DEFAULT_MONTH_NAMES = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n]\nconst DEFAULT_DAY_NAMES = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']\n\nconst config = useConfig()\nconst monthNames = computed(() => config.value.locale?.calendar?.monthNames ?? DEFAULT_MONTH_NAMES)\nconst dayNames = computed(() => config.value.locale?.calendar?.dayNames ?? DEFAULT_DAY_NAMES)\nconst okBtnLabel = computed(() => config.value.locale?.modal?.okText ?? 'OK')\nconst prevYearLabel = computed(() => config.value.locale?.datePicker?.prevYear ?? 'Previous year')\nconst nextYearLabel = computed(() => config.value.locale?.datePicker?.nextYear ?? 'Next year')\nconst prevMonthLabel = computed(\n () => config.value.locale?.datePicker?.prevMonth ?? 'Previous month',\n)\nconst nextMonthLabel = computed(() => config.value.locale?.datePicker?.nextMonth ?? 'Next month')\n\nfunction pad(n: number) {\n return String(n).padStart(2, '0')\n}\nfunction isSameDay(a: Date, b: Date) {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n )\n}\nfunction isToday(d: Date) {\n return isSameDay(d, new Date())\n}\nfunction getDaysInMonth(y: number, m: number) {\n return new Date(y, m + 1, 0).getDate()\n}\nfunction startOfDay(d: Date) {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate())\n}\nfunction cloneDate(d: Date) {\n return new Date(d.getTime())\n}\nfunction toValidDate(input: unknown): Date | null {\n if (input == null || input === '') return null\n if (input instanceof Date) return isNaN(input.getTime()) ? null : input\n if (typeof input === 'string' || typeof input === 'number') {\n const d = new Date(input)\n return isNaN(d.getTime()) ? null : d\n }\n return null\n}\nfunction formatDate(d: Date | null, fmt: string): string {\n if (!d) return ''\n return fmt\n .replace('YYYY', String(d.getFullYear()))\n .replace('MM', pad(d.getMonth() + 1))\n .replace('DD', pad(d.getDate()))\n .replace('HH', pad(d.getHours()))\n .replace('mm', pad(d.getMinutes()))\n .replace('ss', pad(d.getSeconds()))\n}\n\nfunction normalizeRange(raw: [unknown, unknown] | null | undefined): [Date | null, Date | null] {\n return [toValidDate(raw?.[0]), toValidDate(raw?.[1])]\n}\n\nconst hasTime = computed(() => !!props.showTime)\nconst timeConfig = computed<ShowTimeConfig>(() =>\n typeof props.showTime === 'object' && props.showTime !== null ? props.showTime : {},\n)\nconst fmt = computed(() => props.format ?? (hasTime.value ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD'))\n\nconst externalValue = computed<[Date | null, Date | null] | undefined>(() => {\n const v = props.modelValue !== undefined ? props.modelValue : props.value\n return v ? normalizeRange(v) : undefined\n})\n\nconst internal = ref<[Date | null, Date | null]>(\n externalValue.value ?? (props.defaultValue ? normalizeRange(props.defaultValue) : [null, null]),\n)\nwatch(externalValue, (v) => {\n if (v) internal.value = v\n})\nconst current = computed<[Date | null, Date | null]>(() => externalValue.value ?? internal.value)\n\nconst internalOpen = ref(false)\nconst isOpen = computed(() => props.open ?? internalOpen.value)\nconst activeIndex = ref<0 | 1>(0)\nconst hoverDate = ref<Date | null>(null)\n\nconst baseRef = computed(() => current.value[0] ?? new Date())\nconst leftYear = ref(baseRef.value.getFullYear())\nconst leftMonth = ref(baseRef.value.getMonth())\nconst rightYear = computed(() => (leftMonth.value === 11 ? leftYear.value + 1 : leftYear.value))\nconst rightMonth = computed(() => (leftMonth.value === 11 ? 0 : leftMonth.value + 1))\n\nconst tempTimes = ref<[Date, Date]>([\n current.value[0] ?? new Date(),\n current.value[1] ?? new Date(),\n])\n\nconst wrapperRef = ref<HTMLDivElement | null>(null)\n\nfunction setOpen(v: boolean) {\n internalOpen.value = v\n emit('openChange', v)\n}\n\nfunction commitRange(dates: [Date | null, Date | null]) {\n internal.value = dates\n emit('update:modelValue', dates)\n emit('change', dates, [\n dates[0] ? formatDate(dates[0], fmt.value) : '',\n dates[1] ? formatDate(dates[1], fmt.value) : '',\n ])\n}\n\nfunction openDropdown() {\n if (props.disabled || props.loading) return\n setOpen(true)\n}\n\nfunction handleDateSelect(date: Date) {\n if (activeIndex.value === 0) {\n internal.value = [date, null]\n activeIndex.value = 1\n return\n }\n\n let start = current.value[0]\n let end = date\n if (start && end.getTime() < start.getTime()) {\n ;[start, end] = [end, start]\n }\n if (hasTime.value) {\n const s = start ? cloneDate(start) : cloneDate(date)\n s.setHours(\n tempTimes.value[0].getHours(),\n tempTimes.value[0].getMinutes(),\n tempTimes.value[0].getSeconds(),\n )\n const e = cloneDate(end)\n e.setHours(\n tempTimes.value[1].getHours(),\n tempTimes.value[1].getMinutes(),\n tempTimes.value[1].getSeconds(),\n )\n internal.value = [s, e]\n } else {\n commitRange([start, end])\n setOpen(false)\n activeIndex.value = 0\n }\n}\n\nfunction handleTimeOk() {\n commitRange(current.value)\n setOpen(false)\n activeIndex.value = 0\n}\n\nfunction handleClear(e: MouseEvent) {\n e.stopPropagation()\n commitRange([null, null])\n activeIndex.value = 0\n}\n\nfunction handlePresetSelect(p: DatePreset) {\n if (Array.isArray(p.value)) {\n commitRange([p.value[0], p.value[1]])\n } else {\n commitRange([p.value, p.value])\n }\n setOpen(false)\n}\n\nfunction moveLeftMonth(delta: number) {\n const m = leftMonth.value + delta\n if (m < 0) {\n leftMonth.value = 11\n leftYear.value--\n } else if (m > 11) {\n leftMonth.value = 0\n leftYear.value++\n } else {\n leftMonth.value = m\n }\n}\n\ninterface DayCell {\n date: Date\n day: number\n inMonth: boolean\n}\n\nfunction getMonthGrid(year: number, month: number): DayCell[][] {\n const daysInMonth = getDaysInMonth(year, month)\n const firstDay = new Date(year, month, 1).getDay()\n const prevDays = getDaysInMonth(year, month - 1)\n const cells: DayCell[] = []\n for (let i = firstDay - 1; i >= 0; i--) {\n cells.push({ date: new Date(year, month - 1, prevDays - i), day: prevDays - i, inMonth: false })\n }\n for (let d = 1; d <= daysInMonth; d++) {\n cells.push({ date: new Date(year, month, d), day: d, inMonth: true })\n }\n const remaining = 42 - cells.length\n for (let d = 1; d <= remaining; d++) {\n cells.push({ date: new Date(year, month + 1, d), day: d, inMonth: false })\n }\n const weeks: DayCell[][] = []\n for (let i = 0; i < cells.length; i += 7) weeks.push(cells.slice(i, i + 7))\n return weeks\n}\n\nconst leftWeeks = computed(() => getMonthGrid(leftYear.value, leftMonth.value))\nconst rightWeeks = computed(() => getMonthGrid(rightYear.value, rightMonth.value))\n\nfunction isInRange(d: Date): boolean {\n const start = current.value[0]\n if (!start) return false\n const end = current.value[1] ?? hoverDate.value\n if (!end) return false\n const s = startOfDay(start).getTime()\n const e = startOfDay(end).getTime()\n const t = startOfDay(d).getTime()\n return t > Math.min(s, e) && t < Math.max(s, e)\n}\n\nfunction isRangeEdge(d: Date): 'start' | 'end' | null {\n const start = current.value[0]\n if (!start) return null\n if (isSameDay(d, start)) return 'start'\n const end = current.value[1] ?? hoverDate.value\n if (end && isSameDay(d, end)) return 'end'\n return null\n}\n\nfunction cellClass(cell: DayCell) {\n const disabled = props.disabledDate?.(cell.date) ?? false\n const today = isToday(cell.date)\n const inRange = isInRange(cell.date)\n const edge = isRangeEdge(cell.date)\n return [\n 'sg-dp-cell',\n !cell.inMonth ? 'sg-dp-cell-outside' : '',\n today ? 'sg-dp-cell-today' : '',\n disabled ? 'sg-dp-cell-disabled' : '',\n inRange ? 'sg-dp-cell-in-range' : '',\n edge === 'start' ? 'sg-dp-cell-range-start' : '',\n edge === 'end' ? 'sg-dp-cell-range-end' : '',\n ]\n .filter(Boolean)\n .join(' ')\n}\n\nconst displayLeft = computed(() =>\n current.value[0] ? formatDate(current.value[0], fmt.value) : props.placeholder[0],\n)\nconst displayRight = computed(() =>\n current.value[1] ? formatDate(current.value[1], fmt.value) : props.placeholder[1],\n)\n\nconst wrapperCls = computed(() =>\n props.unstyled\n ? ''\n : [\n 'sg-datepicker',\n 'sg-datepicker-range',\n `sg-datepicker-${props.size}`,\n isOpen.value ? 'sg-datepicker-open' : '',\n props.disabled || props.loading ? 'sg-datepicker-disabled' : '',\n props.loading ? 'sg-datepicker-loading' : '',\n ]\n .filter(Boolean)\n .join(' '),\n)\nconst dropdownCls = computed(\n () => `sg-dp-dropdown sg-dp-dropdown-range sg-dp-dropdown-${props.placement}`,\n)\n\nfunction handleOutside(e: MouseEvent) {\n if (!isOpen.value) return\n if (wrapperRef.value && !wrapperRef.value.contains(e.target as Node)) {\n setOpen(false)\n }\n}\n\nfunction handleEscape(e: KeyboardEvent) {\n if (!isOpen.value) return\n if (e.key === 'Escape') setOpen(false)\n}\n\nonMounted(() => {\n document.addEventListener('mousedown', handleOutside)\n document.addEventListener('keydown', handleEscape)\n})\nonBeforeUnmount(() => {\n document.removeEventListener('mousedown', handleOutside)\n document.removeEventListener('keydown', handleEscape)\n})\n\nconst hourStep = computed(() => timeConfig.value.hourStep ?? 1)\nconst minuteStep = computed(() => timeConfig.value.minuteStep ?? 1)\nconst secondStep = computed(() => timeConfig.value.secondStep ?? 1)\nconst showSeconds = computed(() => (timeConfig.value.format ?? 'HH:mm:ss').includes('ss'))\n\nfunction timeItems(step: number, max: number) {\n const arr: number[] = []\n for (let i = 0; i < max; i += step) arr.push(i)\n return arr\n}\n\nconst hourItems = computed(() => timeItems(hourStep.value, 24))\nconst minuteItems = computed(() => timeItems(minuteStep.value, 60))\nconst secondItems = computed(() => timeItems(secondStep.value, 60))\n\nfunction setTime(idx: 0 | 1, fn: (d: Date) => void) {\n const next: [Date, Date] = [cloneDate(tempTimes.value[0]), cloneDate(tempTimes.value[1])]\n fn(next[idx])\n tempTimes.value = next\n if (current.value[0] && current.value[1]) {\n const merged: [Date, Date] = [cloneDate(current.value[0]), cloneDate(current.value[1])]\n merged[idx].setHours(next[idx].getHours(), next[idx].getMinutes(), next[idx].getSeconds())\n internal.value = merged\n }\n}\n\nconst monthLabelLeft = computed(() => `${monthNames.value[leftMonth.value]} ${leftYear.value}`)\nconst monthLabelRight = computed(() => `${monthNames.value[rightMonth.value]} ${rightYear.value}`)\n</script>\n\n<template>\n <div ref=\"wrapperRef\" :class=\"wrapperCls\">\n <div\n class=\"sg-datepicker-input sg-datepicker-range-input\"\n role=\"combobox\"\n aria-haspopup=\"dialog\"\n :aria-expanded=\"isOpen\"\n :aria-disabled=\"disabled\"\n @click=\"openDropdown\"\n >\n <span\n :class=\"\n [\n 'sg-datepicker-range-part',\n activeIndex === 0 ? 'sg-datepicker-range-active' : '',\n current[0] ? '' : 'sg-datepicker-placeholder',\n ]\n .filter(Boolean)\n .join(' ')\n \"\n @click.stop=\"\n () => {\n activeIndex = 0\n openDropdown()\n }\n \"\n >\n {{ displayLeft }}\n </span>\n <span class=\"sg-datepicker-separator\">{{ separator }}</span>\n <span\n :class=\"\n [\n 'sg-datepicker-range-part',\n activeIndex === 1 ? 'sg-datepicker-range-active' : '',\n current[1] ? '' : 'sg-datepicker-placeholder',\n ]\n .filter(Boolean)\n .join(' ')\n \"\n @click.stop=\"\n () => {\n activeIndex = 1\n openDropdown()\n }\n \"\n >\n {{ displayRight }}\n </span>\n <span class=\"sg-datepicker-suffix\">\n <span v-if=\"loading && !unstyled\" class=\"sg-spin sg-spin-small\" aria-hidden=\"true\" />\n <template v-else>\n <span\n v-if=\"allowClear && (current[0] || current[1])\"\n class=\"sg-datepicker-clear\"\n role=\"button\"\n aria-label=\"Clear\"\n @click=\"handleClear\"\n >×</span\n >\n <svg\n class=\"sg-datepicker-icon\"\n viewBox=\"0 0 16 16\"\n width=\"14\"\n height=\"14\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M11 1V0h1v1h2.5A1.5 1.5 0 0116 2.5v12a1.5 1.5 0 01-1.5 1.5h-13A1.5 1.5 0 010 14.5v-12A1.5 1.5 0 011.5 1H4V0h1v1h6zM1.5 2a.5.5 0 00-.5.5V4h14V2.5a.5.5 0 00-.5-.5h-13zM15 5H1v9.5a.5.5 0 00.5.5h13a.5.5 0 00.5-.5V5z\"\n />\n </svg>\n </template>\n </span>\n </div>\n <div v-if=\"isOpen\" :class=\"dropdownCls\">\n <div class=\"sg-dp-dropdown-inner\">\n <div v-if=\"presets && presets.length > 0\" class=\"sg-dp-presets\">\n <div\n v-for=\"p in presets\"\n :key=\"p.label\"\n class=\"sg-dp-preset-item\"\n @click=\"handlePresetSelect(p)\"\n >\n {{ p.label }}\n </div>\n </div>\n <div class=\"sg-dp-content\">\n <div class=\"sg-dp-range-panels\">\n <div class=\"sg-dp-panel\">\n <div class=\"sg-dp-panel-header\">\n <button\n type=\"button\"\n class=\"sg-dp-nav-btn\"\n :title=\"prevYearLabel\"\n :aria-label=\"prevYearLabel\"\n @click=\"leftYear--\"\n >\n «\n </button>\n <button\n type=\"button\"\n class=\"sg-dp-nav-btn\"\n :title=\"prevMonthLabel\"\n :aria-label=\"prevMonthLabel\"\n @click=\"moveLeftMonth(-1)\"\n >\n ‹\n </button>\n <span class=\"sg-dp-panel-title\">{{ monthLabelLeft }}</span>\n <span style=\"flex: 1\" />\n </div>\n <table class=\"sg-dp-table\">\n <thead>\n <tr>\n <th v-for=\"d in dayNames\" :key=\"d\" class=\"sg-dp-th\">{{ d }}</th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(week, wi) in leftWeeks\" :key=\"wi\">\n <td\n v-for=\"cell in week\"\n :key=\"cell.date.toISOString()\"\n :class=\"cellClass(cell)\"\n @click=\"!props.disabledDate?.(cell.date) && handleDateSelect(cell.date)\"\n @mouseenter=\"hoverDate = cell.date\"\n @mouseleave=\"hoverDate = null\"\n >\n <span class=\"sg-dp-cell-inner\">{{ cell.day }}</span>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n <div class=\"sg-dp-panel\">\n <div class=\"sg-dp-panel-header\">\n <span style=\"flex: 1\" />\n <span class=\"sg-dp-panel-title\">{{ monthLabelRight }}</span>\n <button\n type=\"button\"\n class=\"sg-dp-nav-btn\"\n :title=\"nextMonthLabel\"\n :aria-label=\"nextMonthLabel\"\n @click=\"moveLeftMonth(1)\"\n >\n ›\n </button>\n <button\n type=\"button\"\n class=\"sg-dp-nav-btn\"\n :title=\"nextYearLabel\"\n :aria-label=\"nextYearLabel\"\n @click=\"leftYear++\"\n >\n »\n </button>\n </div>\n <table class=\"sg-dp-table\">\n <thead>\n <tr>\n <th v-for=\"d in dayNames\" :key=\"d + '-r'\" class=\"sg-dp-th\">{{ d }}</th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(week, wi) in rightWeeks\" :key=\"wi\">\n <td\n v-for=\"cell in week\"\n :key=\"cell.date.toISOString()\"\n :class=\"cellClass(cell)\"\n @click=\"!props.disabledDate?.(cell.date) && handleDateSelect(cell.date)\"\n @mouseenter=\"hoverDate = cell.date\"\n @mouseleave=\"hoverDate = null\"\n >\n <span class=\"sg-dp-cell-inner\">{{ cell.day }}</span>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n\n <div v-if=\"hasTime && current[0] && current[1]\" class=\"sg-dp-range-time\">\n <div class=\"sg-dp-time-panel\">\n <div class=\"sg-dp-time-col\">\n <div\n v-for=\"n in hourItems\"\n :key=\"n + '-h0'\"\n :data-active=\"n === tempTimes[0].getHours()\"\n :class=\"[\n 'sg-dp-time-cell',\n n === tempTimes[0].getHours() ? 'sg-dp-time-cell-active' : '',\n ]\"\n @click=\"setTime(0, (d) => d.setHours(n))\"\n >\n {{ pad(n) }}\n </div>\n </div>\n <div class=\"sg-dp-time-col\">\n <div\n v-for=\"n in minuteItems\"\n :key=\"n + '-m0'\"\n :data-active=\"n === tempTimes[0].getMinutes()\"\n :class=\"[\n 'sg-dp-time-cell',\n n === tempTimes[0].getMinutes() ? 'sg-dp-time-cell-active' : '',\n ]\"\n @click=\"setTime(0, (d) => d.setMinutes(n))\"\n >\n {{ pad(n) }}\n </div>\n </div>\n <div v-if=\"showSeconds\" class=\"sg-dp-time-col\">\n <div\n v-for=\"n in secondItems\"\n :key=\"n + '-s0'\"\n :data-active=\"n === tempTimes[0].getSeconds()\"\n :class=\"[\n 'sg-dp-time-cell',\n n === tempTimes[0].getSeconds() ? 'sg-dp-time-cell-active' : '',\n ]\"\n @click=\"setTime(0, (d) => d.setSeconds(n))\"\n >\n {{ pad(n) }}\n </div>\n </div>\n </div>\n <div class=\"sg-dp-time-panel\">\n <div class=\"sg-dp-time-col\">\n <div\n v-for=\"n in hourItems\"\n :key=\"n + '-h1'\"\n :data-active=\"n === tempTimes[1].getHours()\"\n :class=\"[\n 'sg-dp-time-cell',\n n === tempTimes[1].getHours() ? 'sg-dp-time-cell-active' : '',\n ]\"\n @click=\"setTime(1, (d) => d.setHours(n))\"\n >\n {{ pad(n) }}\n </div>\n </div>\n <div class=\"sg-dp-time-col\">\n <div\n v-for=\"n in minuteItems\"\n :key=\"n + '-m1'\"\n :data-active=\"n === tempTimes[1].getMinutes()\"\n :class=\"[\n 'sg-dp-time-cell',\n n === tempTimes[1].getMinutes() ? 'sg-dp-time-cell-active' : '',\n ]\"\n @click=\"setTime(1, (d) => d.setMinutes(n))\"\n >\n {{ pad(n) }}\n </div>\n </div>\n <div v-if=\"showSeconds\" class=\"sg-dp-time-col\">\n <div\n v-for=\"n in secondItems\"\n :key=\"n + '-s1'\"\n :data-active=\"n === tempTimes[1].getSeconds()\"\n :class=\"[\n 'sg-dp-time-cell',\n n === tempTimes[1].getSeconds() ? 'sg-dp-time-cell-active' : '',\n ]\"\n @click=\"setTime(1, (d) => d.setSeconds(n))\"\n >\n {{ pad(n) }}\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"sg-dp-footer\">\n <div class=\"sg-dp-footer-end\">\n <button\n v-if=\"hasTime\"\n type=\"button\"\n class=\"sg-dp-footer-btn sg-dp-ok-btn\"\n @click=\"handleTimeOk\"\n >\n {{ okBtnLabel }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\n\nexport interface TimePickerProps {\n /** v-model binding (Vue idiom). */\n modelValue?: string\n /** Compat alias for `modelValue`. */\n value?: string\n /** Initial value when uncontrolled. */\n defaultValue?: string\n /** Placeholder text. */\n placeholder?: string\n /** Display format. */\n format?: string\n /** Use 12-hour clock with AM/PM column. */\n use12Hours?: boolean\n /** Step between hour values. */\n hourStep?: number\n /** Step between minute values. */\n minuteStep?: number\n /** Step between second values. */\n secondStep?: number\n /** Show seconds column. */\n showSecond?: boolean\n /** Show \"Now\" button. */\n showNow?: boolean\n /** Show clear control. */\n allowClear?: boolean\n /** Controlled visibility of the dropdown. */\n open?: boolean\n /** Disables interaction. */\n disabled?: boolean\n /** Shows a loading spinner and disables interaction. */\n loading?: boolean\n /** Size token. */\n size?: 'small' | 'middle' | 'large'\n /** Strips built-in styling. */\n unstyled?: boolean\n /** Hour values to disable in the hour column. */\n disabledHours?: () => number[]\n /** Minute values to disable for the currently picked hour. */\n disabledMinutes?: (hour: number) => number[]\n /** Second values to disable for the currently picked hour + minute. */\n disabledSeconds?: (hour: number, minute: number) => number[]\n}\n\nconst props = withDefaults(defineProps<TimePickerProps>(), {\n placeholder: 'Select time',\n use12Hours: false,\n hourStep: 1,\n minuteStep: 1,\n secondStep: 1,\n showSecond: true,\n showNow: true,\n allowClear: true,\n size: 'middle',\n disabled: false,\n loading: false,\n open: undefined,\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: string): void\n (e: 'change', value: string): void\n (e: 'openChange', open: boolean): void\n}>()\n\nfunction pad(n: number) {\n return String(n).padStart(2, '0')\n}\n\nfunction formatTime(h: number, m: number, s: number, fmt: string, use12: boolean): string {\n if (use12) {\n const period = h >= 12 ? 'PM' : 'AM'\n const h12 = h % 12 || 12\n return fmt\n .replace('hh', pad(h12))\n .replace('mm', pad(m))\n .replace('ss', pad(s))\n .replace('A', period)\n }\n return fmt.replace('HH', pad(h)).replace('mm', pad(m)).replace('ss', pad(s))\n}\n\nfunction parseTime(str: string): { h: number; m: number; s: number } | null {\n if (!str) return null\n const upper = str.toUpperCase()\n const isPM = upper.includes('PM')\n const cleaned = upper.replace(/(AM|PM)/g, '').trim()\n const parts = cleaned.split(':').map(Number)\n if (parts.some(isNaN)) return null\n let h = parts[0] ?? 0\n const m = parts[1] ?? 0\n const s = parts[2] ?? 0\n if (isPM && h < 12) h += 12\n if (!isPM && upper.includes('AM') && h === 12) h = 0\n return { h, m, s }\n}\n\nconst fmt = computed(\n () => props.format ?? (props.use12Hours ? 'hh:mm:ss A' : props.showSecond ? 'HH:mm:ss' : 'HH:mm'),\n)\nconst internal = ref<string>(props.modelValue ?? props.value ?? props.defaultValue ?? '')\nwatch(\n () => props.modelValue ?? props.value,\n (v) => {\n if (v !== undefined) internal.value = v\n },\n)\nconst current = computed(() => props.modelValue ?? props.value ?? internal.value)\n\nconst internalOpen = ref(false)\nconst isOpen = computed(() => props.open ?? internalOpen.value)\n\nconst parsed = computed(() => parseTime(current.value))\nconst hour = ref(parsed.value?.h ?? 0)\nconst minute = ref(parsed.value?.m ?? 0)\nconst second = ref(parsed.value?.s ?? 0)\n\nwatch(current, (v) => {\n const p = parseTime(v)\n if (p) {\n hour.value = p.h\n minute.value = p.m\n second.value = p.s\n }\n})\n\nconst wrapperRef = ref<HTMLDivElement | null>(null)\nconst hourColRef = ref<HTMLDivElement | null>(null)\nconst minuteColRef = ref<HTMLDivElement | null>(null)\nconst secondColRef = ref<HTMLDivElement | null>(null)\n\nconst hours = computed(() => {\n const arr: number[] = []\n if (props.use12Hours) {\n for (let i = 1; i <= 12; i += props.hourStep) arr.push(i)\n } else {\n for (let i = 0; i < 24; i += props.hourStep) arr.push(i)\n }\n return arr\n})\nconst minutes = computed(() => {\n const arr: number[] = []\n for (let i = 0; i < 60; i += props.minuteStep) arr.push(i)\n return arr\n})\nconst seconds = computed(() => {\n const arr: number[] = []\n for (let i = 0; i < 60; i += props.secondStep) arr.push(i)\n return arr\n})\n\nconst disabledHourSet = computed(() => new Set(props.disabledHours?.() ?? []))\nconst disabledMinuteSet = computed(() => new Set(props.disabledMinutes?.(hour.value) ?? []))\nconst disabledSecondSet = computed(\n () => new Set(props.disabledSeconds?.(hour.value, minute.value) ?? []),\n)\n\nconst displayHour = computed(() => (props.use12Hours ? hour.value % 12 || 12 : hour.value))\n\nfunction setOpen(v: boolean) {\n internalOpen.value = v\n emit('openChange', v)\n}\n\nfunction commit(h: number, m: number, s: number) {\n const str = formatTime(h, m, s, fmt.value, props.use12Hours)\n internal.value = str\n emit('update:modelValue', str)\n emit('change', str)\n}\n\nfunction setH(h: number) {\n if (disabledHourSet.value.has(props.use12Hours ? h : h)) return\n const real = props.use12Hours\n ? h === 12\n ? hour.value >= 12\n ? 12\n : 0\n : hour.value >= 12\n ? h + 12\n : h\n : h\n hour.value = real\n commit(real, minute.value, second.value)\n}\nfunction setM(m: number) {\n if (disabledMinuteSet.value.has(m)) return\n minute.value = m\n commit(hour.value, m, second.value)\n}\nfunction setS(s: number) {\n if (disabledSecondSet.value.has(s)) return\n second.value = s\n commit(hour.value, minute.value, s)\n}\n\nfunction handleNow() {\n const now = new Date()\n hour.value = now.getHours()\n minute.value = now.getMinutes()\n second.value = now.getSeconds()\n commit(hour.value, minute.value, second.value)\n setOpen(false)\n}\n\nfunction handleClear(e: MouseEvent) {\n e.stopPropagation()\n internal.value = ''\n emit('update:modelValue', '')\n emit('change', '')\n}\n\nfunction openDropdown() {\n if (props.disabled || props.loading) return\n setOpen(true)\n}\n\nfunction handleOutside(e: MouseEvent) {\n if (!isOpen.value) return\n if (wrapperRef.value && !wrapperRef.value.contains(e.target as Node)) {\n setOpen(false)\n }\n}\n\nfunction handleEscape(e: KeyboardEvent) {\n if (!isOpen.value) return\n if (e.key === 'Escape') setOpen(false)\n}\n\nonMounted(() => {\n document.addEventListener('mousedown', handleOutside)\n document.addEventListener('keydown', handleEscape)\n})\n\nonBeforeUnmount(() => {\n document.removeEventListener('mousedown', handleOutside)\n document.removeEventListener('keydown', handleEscape)\n})\n\nfunction scrollActive(col: HTMLElement | null) {\n if (!col) return\n const active = col.querySelector('[data-active=\"true\"]') as HTMLElement | null\n active?.scrollIntoView?.({ block: 'nearest' })\n}\n\nwatch([isOpen, hour, minute, second], async () => {\n if (!isOpen.value) return\n await nextTick()\n scrollActive(hourColRef.value)\n scrollActive(minuteColRef.value)\n scrollActive(secondColRef.value)\n})\n\nconst wrapperCls = computed(() =>\n props.unstyled\n ? ''\n : [\n 'sg-timepicker',\n `sg-timepicker-${props.size}`,\n isOpen.value ? 'sg-timepicker-open' : '',\n props.disabled || props.loading ? 'sg-timepicker-disabled' : '',\n props.loading ? 'sg-timepicker-loading' : '',\n ]\n .filter(Boolean)\n .join(' '),\n)\n\nfunction setAm() {\n if (hour.value >= 12) {\n const h = hour.value - 12\n hour.value = h\n commit(h, minute.value, second.value)\n }\n}\nfunction setPm() {\n if (hour.value < 12) {\n const h = hour.value + 12\n hour.value = h\n commit(h, minute.value, second.value)\n }\n}\n</script>\n\n<template>\n <div ref=\"wrapperRef\" :class=\"wrapperCls\">\n <div\n class=\"sg-timepicker-input\"\n role=\"combobox\"\n aria-haspopup=\"dialog\"\n :aria-expanded=\"isOpen\"\n :aria-disabled=\"disabled\"\n @click=\"openDropdown\"\n >\n <span :class=\"current ? '' : 'sg-timepicker-placeholder'\">{{ current || placeholder }}</span>\n <span class=\"sg-timepicker-suffix\">\n <span v-if=\"loading && !unstyled\" class=\"sg-spin sg-spin-small\" aria-hidden=\"true\" />\n <template v-else>\n <span\n v-if=\"allowClear && current\"\n class=\"sg-timepicker-clear\"\n role=\"button\"\n aria-label=\"Clear\"\n @click=\"handleClear\"\n >×</span\n >\n <svg\n class=\"sg-timepicker-icon\"\n viewBox=\"0 0 16 16\"\n width=\"14\"\n height=\"14\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M8 0a8 8 0 1 0 0 16A8 8 0 0 0 8 0zm0 14.5A6.5 6.5 0 1 1 8 1.5a6.5 6.5 0 0 1 0 13zM8.5 4H7v5l4.25 2.5.75-1.23L8.5 8.25V4z\"\n />\n </svg>\n </template>\n </span>\n </div>\n <div v-if=\"isOpen\" class=\"sg-tp-dropdown\">\n <div class=\"sg-tp-columns\">\n <div ref=\"hourColRef\" class=\"sg-tp-col\">\n <div\n v-for=\"n in hours\"\n :key=\"n\"\n :data-active=\"n === displayHour\"\n :data-disabled=\"disabledHourSet.has(n)\"\n :class=\"[\n 'sg-tp-cell',\n n === displayHour ? 'sg-tp-cell-active' : '',\n disabledHourSet.has(n) ? 'sg-tp-cell-disabled' : '',\n ]\"\n :aria-disabled=\"disabledHourSet.has(n)\"\n @click=\"setH(n)\"\n >\n {{ pad(n) }}\n </div>\n </div>\n <div ref=\"minuteColRef\" class=\"sg-tp-col\">\n <div\n v-for=\"n in minutes\"\n :key=\"n\"\n :data-active=\"n === minute\"\n :data-disabled=\"disabledMinuteSet.has(n)\"\n :class=\"[\n 'sg-tp-cell',\n n === minute ? 'sg-tp-cell-active' : '',\n disabledMinuteSet.has(n) ? 'sg-tp-cell-disabled' : '',\n ]\"\n :aria-disabled=\"disabledMinuteSet.has(n)\"\n @click=\"setM(n)\"\n >\n {{ pad(n) }}\n </div>\n </div>\n <div v-if=\"showSecond\" ref=\"secondColRef\" class=\"sg-tp-col\">\n <div\n v-for=\"n in seconds\"\n :key=\"n\"\n :data-active=\"n === second\"\n :data-disabled=\"disabledSecondSet.has(n)\"\n :class=\"[\n 'sg-tp-cell',\n n === second ? 'sg-tp-cell-active' : '',\n disabledSecondSet.has(n) ? 'sg-tp-cell-disabled' : '',\n ]\"\n :aria-disabled=\"disabledSecondSet.has(n)\"\n @click=\"setS(n)\"\n >\n {{ pad(n) }}\n </div>\n </div>\n <div v-if=\"use12Hours\" class=\"sg-tp-col sg-tp-col-ampm\">\n <div :class=\"['sg-tp-cell', hour < 12 ? 'sg-tp-cell-active' : '']\" @click=\"setAm\">AM</div>\n <div :class=\"['sg-tp-cell', hour >= 12 ? 'sg-tp-cell-active' : '']\" @click=\"setPm\">\n PM\n </div>\n </div>\n </div>\n <div v-if=\"showNow\" class=\"sg-tp-footer\">\n <button type=\"button\" class=\"sg-tp-now-btn\" @click=\"handleNow\">Now</button>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport SgTimePicker from './TimePicker.vue'\n\nexport interface TimeRangePickerProps {\n /** v-model binding (Vue idiom). */\n modelValue?: [string, string]\n /** Compat alias for `modelValue`. */\n value?: [string, string]\n /** Initial value when uncontrolled. */\n defaultValue?: [string, string]\n /** Placeholders for start and end inputs. */\n placeholder?: [string, string]\n /** Shared display format. */\n format?: string\n /** Both panels use a 12-hour clock when true. */\n use12Hours?: boolean\n /** Shared hour step. */\n hourStep?: number\n /** Shared minute step. */\n minuteStep?: number\n /** Shared second step. */\n secondStep?: number\n /** Show seconds in both panels. */\n showSecond?: boolean\n /** Show clear control when at least one value is set. */\n allowClear?: boolean\n /** Separator string between the two displayed values. */\n separator?: string\n /** Controlled visibility of the range dropdown. */\n open?: boolean\n /** Disables interaction. */\n disabled?: boolean\n /** Shows a loading spinner and disables interaction. */\n loading?: boolean\n /** Size token. */\n size?: 'small' | 'middle' | 'large'\n /** Strips built-in styling. */\n unstyled?: boolean\n}\n\nconst props = withDefaults(defineProps<TimeRangePickerProps>(), {\n placeholder: () => ['Start', 'End'] as [string, string],\n use12Hours: false,\n hourStep: 1,\n minuteStep: 1,\n secondStep: 1,\n showSecond: true,\n allowClear: true,\n separator: '→',\n size: 'middle',\n disabled: false,\n loading: false,\n open: undefined,\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: [string, string]): void\n (e: 'change', value: [string, string]): void\n (e: 'openChange', open: boolean): void\n}>()\n\nconst fmt = computed(\n () => props.format ?? (props.use12Hours ? 'hh:mm:ss A' : props.showSecond ? 'HH:mm:ss' : 'HH:mm'),\n)\n\nconst internal = ref<[string, string]>(\n (props.modelValue ?? props.value ?? props.defaultValue ?? ['', '']) as [string, string],\n)\nwatch(\n () => props.modelValue ?? props.value,\n (v) => {\n if (v !== undefined) internal.value = [...v] as [string, string]\n },\n)\nconst current = computed<[string, string]>(\n () => (props.modelValue ?? props.value ?? internal.value) as [string, string],\n)\n\nconst internalOpen = ref(false)\nconst isOpen = computed(() => props.open ?? internalOpen.value)\nconst wrapperRef = ref<HTMLDivElement | null>(null)\n\nfunction setOpen(v: boolean) {\n internalOpen.value = v\n emit('openChange', v)\n}\n\nfunction emitNext(next: [string, string]) {\n internal.value = next\n emit('update:modelValue', next)\n emit('change', next)\n}\n\nfunction handleStart(v: string) {\n emitNext([v, current.value[1]])\n}\nfunction handleEnd(v: string) {\n emitNext([current.value[0], v])\n}\nfunction handleClear(e: MouseEvent) {\n e.stopPropagation()\n emitNext(['', ''])\n}\n\nfunction openDropdown() {\n if (props.disabled || props.loading) return\n setOpen(true)\n}\n\nfunction handleOutside(e: MouseEvent) {\n if (!isOpen.value) return\n if (wrapperRef.value && !wrapperRef.value.contains(e.target as Node)) setOpen(false)\n}\nfunction handleEscape(e: KeyboardEvent) {\n if (isOpen.value && e.key === 'Escape') setOpen(false)\n}\n\nonMounted(() => {\n document.addEventListener('mousedown', handleOutside)\n document.addEventListener('keydown', handleEscape)\n})\nonBeforeUnmount(() => {\n document.removeEventListener('mousedown', handleOutside)\n document.removeEventListener('keydown', handleEscape)\n})\n\nconst wrapperCls = computed(() =>\n props.unstyled\n ? ''\n : [\n 'sg-timepicker',\n 'sg-timepicker-range',\n `sg-timepicker-${props.size}`,\n isOpen.value ? 'sg-timepicker-open' : '',\n props.disabled || props.loading ? 'sg-timepicker-disabled' : '',\n props.loading ? 'sg-timepicker-loading' : '',\n ]\n .filter(Boolean)\n .join(' '),\n)\n</script>\n\n<template>\n <div ref=\"wrapperRef\" :class=\"wrapperCls\">\n <div\n :class=\"unstyled ? '' : 'sg-timepicker-input sg-timepicker-range-input'\"\n role=\"combobox\"\n aria-haspopup=\"dialog\"\n :aria-expanded=\"isOpen\"\n :aria-disabled=\"disabled\"\n @click=\"openDropdown\"\n >\n <span :class=\"current[0] ? '' : 'sg-timepicker-placeholder'\">\n {{ current[0] || placeholder[0] }}\n </span>\n <span :class=\"unstyled ? '' : 'sg-timepicker-separator'\">{{ separator }}</span>\n <span :class=\"current[1] ? '' : 'sg-timepicker-placeholder'\">\n {{ current[1] || placeholder[1] }}\n </span>\n <span :class=\"unstyled ? '' : 'sg-timepicker-suffix'\">\n <span\n v-if=\"allowClear && (current[0] || current[1])\"\n :class=\"unstyled ? '' : 'sg-timepicker-clear'\"\n role=\"button\"\n aria-label=\"Clear\"\n @click=\"handleClear\"\n >×</span\n >\n </span>\n </div>\n <div v-if=\"isOpen\" :class=\"unstyled ? '' : 'sg-tp-dropdown sg-tp-dropdown-range'\">\n <div :class=\"unstyled ? '' : 'sg-tp-range-panels'\">\n <SgTimePicker\n :value=\"current[0]\"\n :format=\"fmt\"\n :use12-hours=\"use12Hours\"\n :hour-step=\"hourStep\"\n :minute-step=\"minuteStep\"\n :second-step=\"secondStep\"\n :show-second=\"showSecond\"\n :show-now=\"false\"\n :open=\"true\"\n :unstyled=\"unstyled\"\n @change=\"handleStart\"\n />\n <SgTimePicker\n :value=\"current[1]\"\n :format=\"fmt\"\n :use12-hours=\"use12Hours\"\n :hour-step=\"hourStep\"\n :minute-step=\"minuteStep\"\n :second-step=\"secondStep\"\n :show-second=\"showSecond\"\n :show-now=\"false\"\n :open=\"true\"\n :unstyled=\"unstyled\"\n @change=\"handleEnd\"\n />\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\n\nexport interface CalendarEvent {\n id?: string\n key?: string\n date: Date\n title: string\n type?: string\n color?: string\n}\n\nexport interface CalendarLocale {\n /** 12 entries from January to December. */\n monthNames?: string[]\n /** 7 entries — Sunday first; reordered internally by `weekStartDay`. */\n dayNames?: string[]\n /** Label for the \"Today\" footer button. */\n today?: string\n /** Header for the optional ISO week column. */\n week?: string\n}\n\nexport interface CalendarHeaderSlotProps {\n value: Date\n type: 'month' | 'year'\n onChange: (date: Date) => void\n onTypeChange: (type: 'month' | 'year') => void\n}\n\nexport interface CalendarCellSlotProps {\n date: Date\n type: 'date' | 'month'\n}\n\nexport interface CalendarProps {\n /** v-model binding (Vue idiom) — the currently selected date. */\n modelValue?: Date\n /** Compat alias. */\n value?: Date\n /** Initial date when uncontrolled. */\n defaultValue?: Date\n /** View mode: month grid or year overview. */\n mode?: 'month' | 'year'\n /** Calendar events to highlight in cells. */\n events?: CalendarEvent[]\n /** Maximum number of event-dots shown per cell. */\n maxEvents?: number\n /** First day of the week (0 = Sunday). */\n weekStartDay?: number\n /** Show ISO week numbers in month view. */\n showWeekNumber?: boolean\n /**\n * Legacy alias of `showWeekNumber` — kept for backward compatibility,\n * prefer `showWeekNumber`.\n */\n showWeekNumbers?: boolean\n /** Fullscreen layout (with footer and select-header). */\n fullscreen?: boolean\n /** Disabled-day predicate. */\n disabledDate?: (d: Date) => boolean\n /** Locale strings — overrides defaults. */\n locale?: CalendarLocale\n /** Enable range selection mode. */\n rangeSelection?: boolean\n /** Controlled range value `[start, end]`. */\n rangeValue?: [Date | null, Date | null]\n /** Default range when uncontrolled. */\n defaultRangeValue?: [Date | null, Date | null]\n /** Enable multiple-date selection. */\n multipleSelection?: boolean\n /** Controlled array of multi-selected dates. */\n multipleValue?: Date[]\n /** Default multi-selected dates when uncontrolled. */\n defaultMultipleValue?: Date[]\n /** Strips built-in styling. */\n unstyled?: boolean\n}\n\nconst props = withDefaults(defineProps<CalendarProps>(), {\n mode: 'month',\n weekStartDay: 0,\n showWeekNumber: false,\n showWeekNumbers: false,\n fullscreen: true,\n maxEvents: 3,\n rangeSelection: false,\n multipleSelection: false,\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: Date): void\n (e: 'select', value: Date): void\n (e: 'panelChange', value: Date, mode: 'month' | 'year'): void\n (e: 'modeChange', mode: 'month' | 'year'): void\n (e: 'change', value: Date): void\n (e: 'rangeChange', range: [Date | null, Date | null]): void\n (e: 'multipleChange', dates: Date[]): void\n}>()\n\ndefineSlots<{\n /** Custom header renderer; receives panel value + mode + handlers. */\n header(props: CalendarHeaderSlotProps): unknown\n /** Extra content inside a day or month cell. */\n cell(props: CalendarCellSlotProps): unknown\n}>()\n\nconst DEFAULT_MONTH_NAMES = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n]\nconst DEFAULT_DAY_NAMES = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']\n\nconst monthNames = computed(() => props.locale?.monthNames ?? DEFAULT_MONTH_NAMES)\nconst dayNamesBase = computed(() => props.locale?.dayNames ?? DEFAULT_DAY_NAMES)\nconst todayLabel = computed(() => props.locale?.today ?? 'Today')\nconst weekLabel = computed(() => props.locale?.week ?? 'W')\n\nconst internal = ref<Date>(props.modelValue ?? props.value ?? props.defaultValue ?? new Date())\nwatch(\n () => props.modelValue ?? props.value,\n (v) => {\n if (v) internal.value = v\n },\n)\nconst current = computed(() => props.modelValue ?? props.value ?? internal.value)\n\nconst internalRange = ref<[Date | null, Date | null]>(\n (props.rangeValue ?? props.defaultRangeValue ?? [null, null]) as [Date | null, Date | null],\n)\nwatch(\n () => props.rangeValue,\n (v) => {\n if (v !== undefined) internalRange.value = [...v] as [Date | null, Date | null]\n },\n)\nconst rangeState = computed<[Date | null, Date | null]>(\n () => (props.rangeValue ?? internalRange.value) as [Date | null, Date | null],\n)\n\nconst internalMulti = ref<Date[]>([...(props.multipleValue ?? props.defaultMultipleValue ?? [])])\nwatch(\n () => props.multipleValue,\n (v) => {\n if (v !== undefined) internalMulti.value = [...v]\n },\n)\nconst multiState = computed<Date[]>(() => props.multipleValue ?? internalMulti.value)\n\nconst internalMode = ref<'month' | 'year'>(props.mode)\nwatch(\n () => props.mode,\n (m) => {\n internalMode.value = m\n },\n)\nconst currentMode = computed(() => internalMode.value)\n\nfunction isSameDay(a: Date, b: Date) {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n )\n}\nfunction isSameMonth(a: Date, b: Date) {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth()\n}\nfunction isToday(d: Date) {\n return isSameDay(d, new Date())\n}\nfunction getDaysInMonth(year: number, month: number) {\n return new Date(year, month + 1, 0).getDate()\n}\nfunction getISOWeekNumber(date: Date): number {\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()))\n const dayNum = d.getUTCDay() || 7\n d.setUTCDate(d.getUTCDate() + 4 - dayNum)\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1))\n return Math.ceil(((d.getTime() - yearStart.getTime()) / 86400000 + 1) / 7)\n}\nfunction isBetween(date: Date, start: Date, end: Date): boolean {\n const t = date.getTime()\n const s = Math.min(start.getTime(), end.getTime())\n const e = Math.max(start.getTime(), end.getTime())\n return t >= s && t <= e\n}\nfunction isRangeStart(date: Date, start: Date | null, end: Date | null): boolean {\n if (!start) return false\n if (!end) return isSameDay(date, start)\n const s = start.getTime() <= end.getTime() ? start : end\n return isSameDay(date, s)\n}\nfunction isRangeEnd(date: Date, start: Date | null, end: Date | null): boolean {\n if (!start || !end) return false\n const e = start.getTime() <= end.getTime() ? end : start\n return isSameDay(date, e)\n}\n\nconst showWeek = computed(() => props.showWeekNumber || props.showWeekNumbers)\n\nconst panelDate = ref<Date>(current.value)\nwatch(current, (v) => {\n panelDate.value = v\n})\n\nconst panelYear = computed(() => panelDate.value.getFullYear())\nconst panelMonth = computed(() => panelDate.value.getMonth())\n\ninterface DayCell {\n date: Date\n day: number\n inMonth: boolean\n}\n\nconst monthGrid = computed<DayCell[][]>(() => {\n const y = panelYear.value\n const m = panelMonth.value\n const daysInMonth = getDaysInMonth(y, m)\n const firstDayRaw = new Date(y, m, 1).getDay()\n const firstDay = (firstDayRaw - props.weekStartDay + 7) % 7\n const prevMonthDays = getDaysInMonth(y, m - 1)\n const cells: DayCell[] = []\n for (let i = firstDay - 1; i >= 0; i--) {\n cells.push({\n date: new Date(y, m - 1, prevMonthDays - i),\n day: prevMonthDays - i,\n inMonth: false,\n })\n }\n for (let day = 1; day <= daysInMonth; day++) {\n cells.push({ date: new Date(y, m, day), day, inMonth: true })\n }\n const remaining = 42 - cells.length\n for (let day = 1; day <= remaining; day++) {\n cells.push({ date: new Date(y, m + 1, day), day, inMonth: false })\n }\n const weeks: DayCell[][] = []\n for (let i = 0; i < cells.length; i += 7) weeks.push(cells.slice(i, i + 7))\n return weeks\n})\n\nconst yearOptions = computed(() => {\n const arr: number[] = []\n for (let y = panelYear.value - 10; y <= panelYear.value + 10; y++) arr.push(y)\n return arr\n})\n\nfunction eventsForDate(d: Date): CalendarEvent[] {\n return (props.events ?? []).filter((ev) => isSameDay(ev.date, d))\n}\n\nfunction commitSingle(d: Date) {\n internal.value = d\n panelDate.value = d\n emit('update:modelValue', d)\n emit('select', d)\n emit('change', d)\n}\n\nfunction commitRange(next: [Date | null, Date | null]) {\n internalRange.value = next\n emit('rangeChange', next)\n}\n\nfunction commitMultiple(next: Date[]) {\n internalMulti.value = next\n emit('multipleChange', next)\n}\n\nfunction selectDate(d: Date) {\n if (props.disabledDate?.(d)) return\n\n if (props.rangeSelection) {\n const [start, end] = rangeState.value\n if (!start || (start && end)) {\n commitRange([d, null])\n } else {\n commitRange([start, d])\n }\n return\n }\n\n if (props.multipleSelection) {\n const exists = multiState.value.some((dd) => isSameDay(dd, d))\n const next = exists\n ? multiState.value.filter((dd) => !isSameDay(dd, d))\n : [...multiState.value, d]\n commitMultiple(next)\n return\n }\n\n commitSingle(d)\n}\n\nfunction selectMonth(monthIdx: number) {\n const d = new Date(panelYear.value, monthIdx, 1)\n panelDate.value = d\n internal.value = d\n emit('update:modelValue', d)\n emit('select', d)\n emit('change', d)\n internalMode.value = 'month'\n emit('modeChange', 'month')\n emit('panelChange', d, 'month')\n}\n\nfunction shiftMonth(delta: number) {\n const d = new Date(panelYear.value, panelMonth.value + delta, 1)\n panelDate.value = d\n emit('panelChange', d, currentMode.value)\n}\n\nfunction shiftYear(delta: number) {\n const d = new Date(panelYear.value + delta, panelMonth.value, 1)\n panelDate.value = d\n emit('panelChange', d, currentMode.value)\n}\n\nfunction setMode(m: 'month' | 'year') {\n internalMode.value = m\n emit('modeChange', m)\n emit('panelChange', panelDate.value, m)\n}\n\nfunction handleToday() {\n const today = new Date()\n selectDate(today)\n}\n\nfunction handleMonthSelectChange(e: Event) {\n const v = Number((e.target as HTMLSelectElement).value)\n const d = new Date(panelYear.value, v, 1)\n panelDate.value = d\n emit('panelChange', d, currentMode.value)\n}\n\nfunction handleYearSelectChange(e: Event) {\n const v = Number((e.target as HTMLSelectElement).value)\n const d = new Date(v, panelMonth.value, 1)\n panelDate.value = d\n emit('panelChange', d, currentMode.value)\n}\n\nconst dayNames = computed(() => {\n const base = dayNamesBase.value\n const arr: string[] = []\n for (let i = 0; i < 7; i++) arr.push(base[(props.weekStartDay + i) % 7])\n return arr\n})\n\nconst wrapperCls = computed(() =>\n props.unstyled\n ? ''\n : [\n 'sg-calendar',\n props.fullscreen ? 'sg-calendar-fullscreen' : 'sg-calendar-mini',\n `sg-calendar-${currentMode.value}`,\n ]\n .filter(Boolean)\n .join(' '),\n)\n\nfunction cellClasses(cell: DayCell) {\n const [rStart, rEnd] = rangeState.value\n const isRangeMode = props.rangeSelection\n const inRange = isRangeMode && rStart && rEnd ? isBetween(cell.date, rStart, rEnd) : false\n const rangeStart = isRangeMode ? isRangeStart(cell.date, rStart, rEnd) : false\n const rangeEnd = isRangeMode ? isRangeEnd(cell.date, rStart, rEnd) : false\n\n const isMulti = props.multipleSelection\n ? multiState.value.some((d) => isSameDay(d, cell.date))\n : false\n\n const isSelected =\n !isRangeMode && !props.multipleSelection\n ? isSameDay(cell.date, current.value)\n : rangeStart || rangeEnd || isMulti\n\n return [\n 'sg-calendar-cell',\n cell.inMonth ? '' : 'sg-calendar-cell-outside',\n isToday(cell.date) ? 'sg-calendar-cell-today' : '',\n isSelected ? 'sg-calendar-cell-selected' : '',\n inRange ? 'sg-calendar-cell-in-range' : '',\n rangeStart ? 'sg-calendar-cell-range-start' : '',\n rangeEnd ? 'sg-calendar-cell-range-end' : '',\n props.disabledDate?.(cell.date) ? 'sg-calendar-cell-disabled' : '',\n ]\n .filter(Boolean)\n .join(' ')\n}\n\nfunction monthCellClasses(monthIdx: number) {\n const d = new Date(panelYear.value, monthIdx, 1)\n return [\n 'sg-calendar-month-cell',\n isSameMonth(d, current.value) ? 'sg-calendar-month-cell-selected' : '',\n isSameMonth(d, new Date()) ? 'sg-calendar-month-cell-current' : '',\n ]\n .filter(Boolean)\n .join(' ')\n}\n\nfunction onHeaderChange(d: Date) {\n panelDate.value = d\n emit('panelChange', d, currentMode.value)\n}\n</script>\n\n<template>\n <div :class=\"wrapperCls\">\n <slot\n name=\"header\"\n :value=\"panelDate\"\n :type=\"currentMode\"\n :on-change=\"onHeaderChange\"\n :on-type-change=\"setMode\"\n >\n <div class=\"sg-calendar-header\">\n <div class=\"sg-calendar-header-left\">\n <button\n type=\"button\"\n class=\"sg-calendar-nav-btn\"\n title=\"Previous year\"\n aria-label=\"Previous year\"\n @click=\"shiftYear(-1)\"\n >\n «\n </button>\n <button\n v-if=\"currentMode === 'month'\"\n type=\"button\"\n class=\"sg-calendar-nav-btn\"\n title=\"Previous month\"\n aria-label=\"Previous month\"\n @click=\"shiftMonth(-1)\"\n >\n ‹\n </button>\n </div>\n\n <div class=\"sg-calendar-header-center\">\n <select\n class=\"sg-calendar-month-select\"\n aria-label=\"Month\"\n :value=\"panelMonth\"\n @change=\"handleMonthSelectChange\"\n >\n <option v-for=\"(name, i) in monthNames\" :key=\"i\" :value=\"i\">{{ name }}</option>\n </select>\n <select\n class=\"sg-calendar-year-select\"\n aria-label=\"Year\"\n :value=\"panelYear\"\n @change=\"handleYearSelectChange\"\n >\n <option v-for=\"y in yearOptions\" :key=\"y\" :value=\"y\">{{ y }}</option>\n </select>\n <div class=\"sg-calendar-mode-switch\">\n <button\n type=\"button\"\n :class=\"[\n 'sg-calendar-mode-btn',\n currentMode === 'month' ? 'sg-calendar-mode-btn-active' : '',\n ]\"\n @click=\"setMode('month')\"\n >\n Month\n </button>\n <button\n type=\"button\"\n :class=\"[\n 'sg-calendar-mode-btn',\n currentMode === 'year' ? 'sg-calendar-mode-btn-active' : '',\n ]\"\n @click=\"setMode('year')\"\n >\n Year\n </button>\n </div>\n </div>\n\n <div class=\"sg-calendar-header-right\">\n <button\n v-if=\"currentMode === 'month'\"\n type=\"button\"\n class=\"sg-calendar-nav-btn\"\n title=\"Next month\"\n aria-label=\"Next month\"\n @click=\"shiftMonth(1)\"\n >\n ›\n </button>\n <button\n type=\"button\"\n class=\"sg-calendar-nav-btn\"\n title=\"Next year\"\n aria-label=\"Next year\"\n @click=\"shiftYear(1)\"\n >\n »\n </button>\n </div>\n </div>\n </slot>\n\n <div class=\"sg-calendar-body\">\n <table v-if=\"currentMode === 'month'\" class=\"sg-calendar-table\">\n <thead>\n <tr>\n <th v-if=\"showWeek\" class=\"sg-calendar-week-header\">{{ weekLabel }}</th>\n <th v-for=\"d in dayNames\" :key=\"d\" class=\"sg-calendar-day-header\">{{ d }}</th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(week, wi) in monthGrid\" :key=\"wi\" class=\"sg-calendar-week-row\">\n <td v-if=\"showWeek\" class=\"sg-calendar-week-number\">\n {{ getISOWeekNumber(week[0].date) }}\n </td>\n <td\n v-for=\"cell in week\"\n :key=\"cell.date.toISOString()\"\n :class=\"cellClasses(cell)\"\n @click=\"selectDate(cell.date)\"\n >\n <div class=\"sg-calendar-cell-inner\">\n <span class=\"sg-calendar-cell-date\">{{ cell.day }}</span>\n <slot name=\"cell\" :date=\"cell.date\" type=\"date\" />\n <div v-if=\"eventsForDate(cell.date).length > 0\" class=\"sg-calendar-cell-events\">\n <span\n v-for=\"(ev, i) in eventsForDate(cell.date).slice(0, maxEvents)\"\n :key=\"ev.key ?? ev.id ?? i\"\n class=\"sg-calendar-event-dot\"\n :style=\"{ backgroundColor: ev.color ?? 'var(--sg-primary, #1677ff)' }\"\n :title=\"ev.title\"\n />\n <span\n v-if=\"eventsForDate(cell.date).length > maxEvents\"\n class=\"sg-calendar-event-more\"\n >+{{ eventsForDate(cell.date).length - maxEvents }}</span\n >\n </div>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n\n <div v-else class=\"sg-calendar-month-grid\">\n <div\n v-for=\"(name, i) in monthNames\"\n :key=\"i\"\n :class=\"monthCellClasses(i)\"\n @click=\"selectMonth(i)\"\n >\n <div class=\"sg-calendar-month-cell-inner\">\n <span class=\"sg-calendar-month-cell-name\">{{ name }}</span>\n <slot name=\"cell\" :date=\"new Date(panelYear, i, 1)\" type=\"month\" />\n </div>\n </div>\n </div>\n </div>\n\n <div v-if=\"fullscreen\" class=\"sg-calendar-footer\">\n <button type=\"button\" class=\"sg-calendar-today-btn\" @click=\"handleToday\">\n {{ todayLabel }}\n </button>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport SgButton from './Button.vue'\nimport SgSpin from './Spin.vue'\n\nexport interface UploadFile {\n uid: string\n name: string\n status: 'uploading' | 'done' | 'error' | 'removed'\n size?: number\n type?: string\n url?: string\n percent?: number\n error?: unknown\n raw?: File\n}\n\nexport interface UploadProps {\n /** v-model binding (Vue idiom). */\n modelValue?: UploadFile[]\n /** Compat alias for `modelValue`. */\n fileList?: UploadFile[]\n /** Initial file list when uncontrolled. */\n defaultFileList?: UploadFile[]\n /** Accepts multiple files. */\n multiple?: boolean\n /** `accept` attr forwarded to input. */\n accept?: string\n /** Disables interaction. */\n disabled?: boolean\n /** Show drag area instead of click trigger. */\n drag?: boolean\n /** Layout: text list, picture row, picture-card grid. */\n listType?: 'text' | 'picture' | 'picture-card'\n /** Hide the built-in list. */\n showUploadList?: boolean\n /** Maximum number of files. */\n maxCount?: number\n /** Maximum file size in bytes. */\n maxSize?: number\n /** beforeUpload hook (return false/Promise<false> to skip). */\n beforeUpload?: (file: File, fileList: File[]) => boolean | Promise<boolean | File>\n /** Custom upload handler. */\n customRequest?: (options: {\n file: File\n onProgress: (percent: number) => void\n onSuccess: (response?: unknown) => void\n onError: (err: unknown) => void\n }) => void\n /** Strips built-in styling. */\n unstyled?: boolean\n}\n\nconst props = withDefaults(defineProps<UploadProps>(), {\n multiple: false,\n disabled: false,\n drag: false,\n listType: 'text',\n showUploadList: true,\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', files: UploadFile[]): void\n (e: 'change', files: UploadFile[]): void\n (e: 'remove', file: UploadFile): void\n}>()\n\nconst internal = ref<UploadFile[]>(\n props.modelValue ?? props.fileList ?? props.defaultFileList ?? [],\n)\nwatch(\n () => props.modelValue ?? props.fileList,\n (v) => {\n if (v !== undefined) internal.value = v\n },\n)\nconst files = computed(() => props.modelValue ?? props.fileList ?? internal.value)\n\nconst inputRef = ref<HTMLInputElement | null>(null)\nconst isDragging = ref(false)\n\nfunction genUid() {\n return `up_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`\n}\n\nfunction commit(next: UploadFile[]) {\n internal.value = next\n emit('update:modelValue', next)\n emit('change', next)\n}\n\nasync function handleFiles(input: FileList | null) {\n if (!input) return\n const incoming: File[] = Array.from(input)\n const accepted: UploadFile[] = []\n for (const file of incoming) {\n if (props.maxSize !== undefined && file.size > props.maxSize) continue\n if (props.beforeUpload) {\n const r = await props.beforeUpload(file, incoming)\n if (r === false) continue\n }\n accepted.push({\n uid: genUid(),\n name: file.name,\n status: 'uploading',\n size: file.size,\n type: file.type,\n percent: 0,\n raw: file,\n })\n }\n let next = props.multiple ? [...files.value, ...accepted] : accepted.slice(0, 1)\n if (props.maxCount !== undefined) next = next.slice(0, props.maxCount)\n commit(next)\n\n for (const f of accepted) {\n if (props.customRequest && f.raw) {\n props.customRequest({\n file: f.raw,\n onProgress: (percent) => updateFile(f.uid, { percent }),\n onSuccess: () => updateFile(f.uid, { status: 'done', percent: 100 }),\n onError: (err) => updateFile(f.uid, { status: 'error', error: err }),\n })\n } else {\n updateFile(f.uid, { status: 'done', percent: 100 })\n }\n }\n}\n\nfunction updateFile(uid: string, patch: Partial<UploadFile>) {\n const next = files.value.map((f) => (f.uid === uid ? { ...f, ...patch } : f))\n commit(next)\n}\n\nfunction handleRemove(file: UploadFile) {\n const next = files.value.filter((f) => f.uid !== file.uid)\n commit(next)\n emit('remove', file)\n}\n\nfunction openPicker() {\n if (props.disabled) return\n inputRef.value?.click()\n}\n\nfunction onDrop(e: DragEvent) {\n e.preventDefault()\n isDragging.value = false\n if (props.disabled) return\n void handleFiles(e.dataTransfer?.files ?? null)\n}\nfunction onDragOver(e: DragEvent) {\n e.preventDefault()\n if (props.disabled) return\n isDragging.value = true\n}\nfunction onDragLeave() {\n isDragging.value = false\n}\n\nfunction onInputChange(e: Event) {\n const target = e.target as HTMLInputElement\n void handleFiles(target.files)\n target.value = ''\n}\n\nconst wrapperCls = computed(() =>\n props.unstyled\n ? ''\n : [\n 'sg-upload',\n `sg-upload-${props.listType}`,\n props.drag ? 'sg-upload-drag' : 'sg-upload-select',\n props.disabled ? 'sg-upload-disabled' : '',\n isDragging.value ? 'sg-upload-dragging' : '',\n ]\n .filter(Boolean)\n .join(' '),\n)\n\nfunction itemClasses(file: UploadFile) {\n return props.unstyled\n ? ''\n : ['sg-upload-item', `sg-upload-item-${file.status}`].filter(Boolean).join(' ')\n}\n</script>\n\n<template>\n <div :class=\"wrapperCls\">\n <input\n ref=\"inputRef\"\n type=\"file\"\n class=\"sg-upload-input\"\n :multiple=\"multiple\"\n :accept=\"accept\"\n :disabled=\"disabled\"\n aria-label=\"Upload file\"\n style=\"display: none\"\n @change=\"onInputChange\"\n />\n <div\n v-if=\"drag\"\n class=\"sg-upload-drag-area\"\n role=\"button\"\n tabindex=\"0\"\n @click=\"openPicker\"\n @drop=\"onDrop\"\n @dragover=\"onDragOver\"\n @dragleave=\"onDragLeave\"\n >\n <slot name=\"drag\">\n <p class=\"sg-upload-drag-icon\">⬆</p>\n <p class=\"sg-upload-drag-text\">Click or drag file to this area to upload</p>\n </slot>\n </div>\n <div v-else class=\"sg-upload-select-trigger\" @click=\"openPicker\">\n <slot>\n <SgButton :disabled=\"disabled\">Upload</SgButton>\n </slot>\n </div>\n <div v-if=\"showUploadList && files.length > 0\" :class=\"unstyled ? '' : 'sg-upload-list'\">\n <div v-for=\"file in files\" :key=\"file.uid\" :class=\"itemClasses(file)\">\n <span :class=\"unstyled ? '' : 'sg-upload-item-name'\">\n <SgSpin v-if=\"file.status === 'uploading'\" size=\"small\" :unstyled=\"unstyled\" />\n {{ file.name }}\n </span>\n <span v-if=\"file.status === 'uploading'\" :class=\"unstyled ? '' : 'sg-upload-item-progress'\"\n >{{ file.percent ?? 0 }}%</span\n >\n <button\n v-if=\"file.status !== 'uploading'\"\n type=\"button\"\n :class=\"unstyled ? '' : 'sg-upload-item-remove'\"\n :aria-label=\"`Remove file: ${file.name}`\"\n @click=\"handleRemove(file)\"\n >\n ×\n </button>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\n\n/** One node in a cascader tree; children define the next column. */\nexport interface CascaderOption {\n /** Stable value included in the selected path. */\n value: string | number\n /** Display label for the option row. */\n label: string\n /** Nested options for the next level. */\n children?: CascaderOption[]\n /** When `true`, the option cannot be chosen. */\n disabled?: boolean\n /** When `false`, children may load asynchronously (see `loadData`). */\n isLeaf?: boolean\n}\n\nexport type CascaderSearchFilter = (inputValue: string, path: CascaderOption[]) => boolean\n\nexport interface CascaderProps {\n /** Cascader option tree. */\n options: CascaderOption[]\n /** v-model binding (Vue idiom) — array of values from root to leaf. */\n modelValue?: (string | number)[]\n /** Compat alias for `modelValue`. */\n value?: (string | number)[]\n /** Initial value when uncontrolled. */\n defaultValue?: (string | number)[]\n /** Placeholder text. */\n placeholder?: string\n /** Disables interaction. */\n disabled?: boolean\n /** Show clear control. */\n allowClear?: boolean\n /** Enable search, or pass `{ filter }` for a custom path matcher. */\n showSearch?: boolean | { filter?: CascaderSearchFilter }\n /** Trigger that expands a sub-menu. */\n expandTrigger?: 'click' | 'hover'\n /** Allow selecting any non-leaf option. */\n changeOnSelect?: boolean\n /** Custom display formatter for the single-select trigger. */\n displayRender?: (labels: string[], selectedOptions: CascaderOption[]) => string\n /** Allow several leaf paths as removable tags. */\n multiple?: boolean\n /** Maximum tags shown before a \"+N\" summary in `multiple` mode. */\n maxTagCount?: number\n /** Load children for a node when `isLeaf: false` and `children` is empty. */\n loadData?: (selectedOptions: CascaderOption[]) => void\n /** Strips built-in styling. */\n unstyled?: boolean\n /** Size token. */\n size?: 'small' | 'middle' | 'large'\n}\n\nconst props = withDefaults(defineProps<CascaderProps>(), {\n placeholder: 'Please select',\n disabled: false,\n allowClear: true,\n showSearch: false,\n expandTrigger: 'click',\n changeOnSelect: false,\n multiple: false,\n size: 'middle',\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: (string | number)[]): void\n (e: 'change', value: (string | number)[], selectedOptions: CascaderOption[]): void\n}>()\n\nfunction arraysEqual(a: (string | number)[], b: (string | number)[]): boolean {\n if (a.length !== b.length) return false\n return a.every((v, i) => v === b[i])\n}\n\nfunction findOption(opts: CascaderOption[], value: string | number): CascaderOption | undefined {\n return opts.find((o) => o.value === value)\n}\n\nfunction findPath(opts: CascaderOption[], values: (string | number)[]): CascaderOption[] {\n const path: CascaderOption[] = []\n let current = opts\n for (const v of values) {\n const found = findOption(current, v)\n if (!found) break\n path.push(found)\n current = found.children ?? []\n }\n return path\n}\n\nfunction collectAllPaths(\n opts: CascaderOption[],\n leafOnly: boolean,\n): { path: CascaderOption[]; values: (string | number)[] }[] {\n const result: { path: CascaderOption[]; values: (string | number)[] }[] = []\n const walk = (level: CascaderOption[], current: CascaderOption[]) => {\n for (const opt of level) {\n if (opt.disabled) continue\n const nextPath = [...current, opt]\n const isLeaf = opt.isLeaf !== false && (!opt.children || opt.children.length === 0)\n if (!leafOnly || isLeaf) {\n result.push({ path: nextPath, values: nextPath.map((o) => o.value) })\n }\n if (opt.children && opt.children.length > 0) walk(opt.children, nextPath)\n }\n }\n walk(opts, [])\n return result\n}\n\nfunction defaultSearchFilter(input: string, path: CascaderOption[]): boolean {\n const lower = input.toLowerCase()\n return path.some((opt) => opt.label.toLowerCase().includes(lower))\n}\n\nconst internal = ref<(string | number)[]>(\n props.modelValue ?? props.value ?? props.defaultValue ?? [],\n)\nwatch(\n () => props.modelValue ?? props.value,\n (v) => {\n if (v !== undefined) internal.value = v\n },\n)\nconst current = computed(() => props.modelValue ?? props.value ?? internal.value)\n\nconst multiValues = ref<(string | number)[][]>(\n props.multiple && (props.modelValue ?? props.value ?? props.defaultValue ?? []).length > 0\n ? [props.modelValue ?? props.value ?? props.defaultValue ?? []]\n : [],\n)\n\nconst isOpen = ref(false)\nconst activeColumns = ref<CascaderOption[][]>([props.options])\nconst activeValues = ref<(string | number)[]>([])\nconst searchText = ref('')\nconst loadingValues = ref<Set<string | number>>(new Set())\nconst wrapperRef = ref<HTMLDivElement | null>(null)\nconst searchInputRef = ref<HTMLInputElement | null>(null)\n\nfunction rebuildColumns(vals: (string | number)[]) {\n const cols: CascaderOption[][] = [props.options]\n let opts: CascaderOption[] = props.options\n const active: (string | number)[] = []\n for (const v of vals) {\n const found = findOption(opts, v)\n if (!found) break\n active.push(v)\n if (found.children && found.children.length > 0) {\n cols.push(found.children)\n opts = found.children\n } else {\n break\n }\n }\n activeColumns.value = cols\n activeValues.value = active\n}\n\nwatch(isOpen, async (open) => {\n if (!open) return\n rebuildColumns(current.value)\n if (props.showSearch) {\n await nextTick()\n searchInputRef.value?.focus()\n }\n})\n\nwatch(\n () => props.options,\n () => {\n rebuildColumns(activeValues.value)\n },\n)\n\nfunction commit(values: (string | number)[]) {\n internal.value = values\n emit('update:modelValue', values)\n emit('change', values, findPath(props.options, values))\n}\n\nfunction handleSelect(opt: CascaderOption, colIndex: number) {\n if (opt.disabled) return\n const newActive = [...activeValues.value.slice(0, colIndex), opt.value]\n activeValues.value = newActive\n const newCols = [...activeColumns.value.slice(0, colIndex + 1)]\n if (opt.children && opt.children.length > 0) newCols.push(opt.children)\n activeColumns.value = newCols\n\n const isLeaf = opt.isLeaf !== false && (!opt.children || opt.children.length === 0)\n\n if (props.loadData && opt.isLeaf === false && (!opt.children || opt.children.length === 0)) {\n const path = findPath(props.options, newActive)\n loadingValues.value = new Set([...loadingValues.value, opt.value])\n props.loadData(path)\n setTimeout(() => {\n const next = new Set(loadingValues.value)\n next.delete(opt.value)\n loadingValues.value = next\n rebuildColumns(newActive)\n }, 0)\n }\n\n if (props.multiple) {\n if (isLeaf) {\n const path = findPath(props.options, newActive)\n const exists = multiValues.value.some((mv) => arraysEqual(mv, newActive))\n if (exists) {\n multiValues.value = multiValues.value.filter((mv) => !arraysEqual(mv, newActive))\n } else {\n multiValues.value = [...multiValues.value, newActive]\n }\n emit('change', newActive, path)\n }\n return\n }\n\n if (isLeaf || props.changeOnSelect) {\n commit(newActive)\n if (isLeaf) {\n isOpen.value = false\n searchText.value = ''\n }\n }\n}\n\nfunction handleHover(opt: CascaderOption, colIndex: number) {\n if (props.expandTrigger !== 'hover' || opt.disabled) return\n const newActive = [...activeValues.value.slice(0, colIndex), opt.value]\n activeValues.value = newActive\n const newCols = [...activeColumns.value.slice(0, colIndex + 1)]\n if (opt.children && opt.children.length > 0) newCols.push(opt.children)\n activeColumns.value = newCols\n}\n\nfunction handleClear(e: MouseEvent) {\n e.stopPropagation()\n if (props.disabled) return\n if (props.multiple) multiValues.value = []\n commit([])\n searchText.value = ''\n}\n\nfunction handleRemoveTag(index: number, e: MouseEvent) {\n e.stopPropagation()\n if (props.disabled) return\n multiValues.value = multiValues.value.filter((_, i) => i !== index)\n}\n\nfunction handleTriggerClick() {\n if (props.disabled) return\n isOpen.value = !isOpen.value\n}\n\nfunction handleOutside(e: MouseEvent) {\n if (wrapperRef.value && !wrapperRef.value.contains(e.target as Node)) {\n isOpen.value = false\n searchText.value = ''\n }\n}\n\nonMounted(() => document.addEventListener('mousedown', handleOutside))\nonBeforeUnmount(() => document.removeEventListener('mousedown', handleOutside))\n\nconst searchFilter = computed<CascaderSearchFilter | null>(() => {\n if (!props.showSearch) return null\n if (typeof props.showSearch === 'object' && props.showSearch.filter) {\n return props.showSearch.filter\n }\n return defaultSearchFilter\n})\n\nconst searchResults = computed(() => {\n if (!searchText.value || !searchFilter.value) return null\n const all = collectAllPaths(props.options, !props.changeOnSelect)\n return all.filter(({ path }) => searchFilter.value!(searchText.value, path))\n})\n\nfunction handleSearchSelect(values: (string | number)[], path: CascaderOption[]) {\n if (props.multiple) {\n const exists = multiValues.value.some((mv) => arraysEqual(mv, values))\n if (exists) {\n multiValues.value = multiValues.value.filter((mv) => !arraysEqual(mv, values))\n } else {\n multiValues.value = [...multiValues.value, values]\n }\n emit('change', values, path)\n } else {\n commit(values)\n isOpen.value = false\n searchText.value = ''\n }\n}\n\nconst displayLabel = computed(() => {\n if (props.multiple) return ''\n if (current.value.length === 0) return ''\n const path = findPath(props.options, current.value)\n if (path.length === 0) return ''\n const labels = path.map((o) => o.label)\n if (props.displayRender) return props.displayRender(labels, path)\n return labels.join(' / ')\n})\n\nfunction isMultiChecked(values: (string | number)[]) {\n return multiValues.value.some((mv) => arraysEqual(mv, values))\n}\n\nconst visibleMulti = computed(() =>\n props.maxTagCount !== undefined && props.multiple\n ? multiValues.value.slice(0, props.maxTagCount)\n : multiValues.value,\n)\n\nconst hiddenCount = computed(() =>\n props.maxTagCount !== undefined && props.multiple\n ? Math.max(0, multiValues.value.length - props.maxTagCount)\n : 0,\n)\n\nconst wrapperCls = computed(() =>\n props.unstyled\n ? ''\n : [\n 'sg-cascader',\n `sg-cascader-${props.size}`,\n isOpen.value ? 'sg-cascader-open' : '',\n props.disabled ? 'sg-cascader-disabled' : '',\n props.multiple ? 'sg-cascader-multiple' : '',\n ]\n .filter(Boolean)\n .join(' '),\n)\n\nfunction pathLabel(values: (string | number)[]) {\n return findPath(props.options, values)\n .map((o) => o.label)\n .join(' / ')\n}\n</script>\n\n<template>\n <div ref=\"wrapperRef\" :class=\"wrapperCls\">\n <div\n class=\"sg-cascader-selector\"\n role=\"combobox\"\n :aria-expanded=\"isOpen\"\n :aria-disabled=\"disabled\"\n tabindex=\"0\"\n @click=\"handleTriggerClick\"\n >\n <div class=\"sg-cascader-selection-wrap\">\n <span v-if=\"!multiple && !displayLabel && !searchText\" class=\"sg-cascader-placeholder\">\n {{ placeholder }}\n </span>\n <span v-if=\"!multiple && displayLabel && !searchText\" class=\"sg-cascader-selection-item\">\n {{ displayLabel }}\n </span>\n <span\n v-if=\"multiple && multiValues.length === 0 && !searchText\"\n class=\"sg-cascader-placeholder\"\n >\n {{ placeholder }}\n </span>\n <template v-if=\"multiple\">\n <span v-for=\"(mv, i) in visibleMulti\" :key=\"mv.join('-') + i\" class=\"sg-cascader-tag\">\n <span class=\"sg-cascader-tag-label\">{{ pathLabel(mv) }}</span>\n <span\n class=\"sg-cascader-tag-close\"\n role=\"button\"\n aria-label=\"Remove\"\n @click=\"handleRemoveTag(i, $event)\"\n >×</span\n >\n </span>\n <span v-if=\"hiddenCount > 0\" class=\"sg-cascader-tag sg-cascader-tag-rest\">\n +{{ hiddenCount }}...\n </span>\n </template>\n <input\n v-if=\"showSearch && isOpen\"\n ref=\"searchInputRef\"\n v-model=\"searchText\"\n class=\"sg-cascader-search-input\"\n :placeholder=\"placeholder\"\n />\n </div>\n <div class=\"sg-cascader-actions\">\n <span\n v-if=\"allowClear && (current.length > 0 || multiValues.length > 0)\"\n class=\"sg-cascader-clear\"\n role=\"button\"\n aria-label=\"Clear\"\n @click=\"handleClear\"\n >×</span\n >\n <span class=\"sg-cascader-arrow\">{{ isOpen ? '▲' : '▼' }}</span>\n </div>\n </div>\n <div v-if=\"isOpen\" class=\"sg-cascader-dropdown\">\n <template v-if=\"searchResults\">\n <div class=\"sg-cascader-search-list\">\n <div\n v-for=\"{ path, values } in searchResults\"\n :key=\"values.join('-')\"\n :class=\"[\n 'sg-cascader-search-item',\n multiple && isMultiChecked(values) ? 'sg-cascader-search-item-checked' : '',\n ]\"\n @click=\"handleSearchSelect(values, path)\"\n >\n <span\n v-if=\"multiple\"\n :class=\"[\n 'sg-cascader-search-check',\n isMultiChecked(values) ? 'sg-cascader-search-check-active' : '',\n ]\"\n >{{ isMultiChecked(values) ? '✓' : '' }}</span\n >\n <span class=\"sg-cascader-search-label\">\n <template v-for=\"(opt, i) in path\" :key=\"opt.value\">\n <span v-if=\"i > 0\" class=\"sg-cascader-search-separator\"> / </span>\n <span>{{ opt.label }}</span>\n </template>\n </span>\n </div>\n <div v-if=\"searchResults.length === 0\" class=\"sg-cascader-empty\">No matches</div>\n </div>\n </template>\n <template v-else>\n <div class=\"sg-cascader-columns\">\n <ul\n v-for=\"(col, ci) in activeColumns\"\n :key=\"ci\"\n class=\"sg-cascader-column sg-cascader-menu\"\n >\n <li\n v-for=\"opt in col\"\n :key=\"String(opt.value)\"\n :class=\"[\n 'sg-cascader-option sg-cascader-menu-item',\n activeValues[ci] === opt.value\n ? 'sg-cascader-option-active sg-cascader-menu-item-active'\n : '',\n opt.disabled ? 'sg-cascader-option-disabled sg-cascader-menu-item-disabled' : '',\n loadingValues.has(opt.value) ? 'sg-cascader-option-loading' : '',\n ]\"\n @click=\"handleSelect(opt, ci)\"\n @mouseenter=\"handleHover(opt, ci)\"\n >\n <span\n v-if=\"multiple\"\n :class=\"[\n 'sg-cascader-option-check',\n multiValues.some((mv) => mv[ci] === opt.value && mv.length === ci + 1)\n ? 'sg-cascader-option-check-active'\n : '',\n ]\"\n >{{\n multiValues.some((mv) => mv[ci] === opt.value && mv.length === ci + 1) ? '✓' : ''\n }}</span\n >\n <span class=\"sg-cascader-option-label\">{{ opt.label }}</span>\n <span\n v-if=\"loadingValues.has(opt.value)\"\n class=\"sg-cascader-option-expand sg-cascader-option-spinner\"\n aria-hidden=\"true\"\n >⟳</span\n >\n <span\n v-else-if=\"opt.children?.length || opt.isLeaf === false\"\n class=\"sg-cascader-option-expand sg-cascader-menu-item-expand\"\n aria-hidden=\"true\"\n >›</span\n >\n </li>\n </ul>\n </div>\n </template>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, useTemplateRef, watch } from 'vue'\nimport SgTree from '../complex/Tree/Tree.vue'\nimport type { TreeKey, TreeNodeData, TreeFieldNames } from '@skygraph/core'\n\nexport type { TreeKey, TreeNodeData, TreeFieldNames }\n\n/** Back-compat alias — older Vue demos used the `value`/`label` shape. */\nexport type TreeSelectNode = TreeNodeData\n\nexport type TreeSelectStrategy = 'SHOW_ALL' | 'SHOW_PARENT' | 'SHOW_CHILD'\n\nexport interface TreeSelectProps {\n /** Tree nodes to show in the dropdown (`key`/`title` shape — matches React). */\n treeData: TreeNodeData[]\n /** Controlled selected key(s). */\n modelValue?: TreeKey | TreeKey[]\n /** Alias for `modelValue` (mirrors React's `value` prop). */\n value?: TreeKey | TreeKey[]\n /** Initial selected key(s) when uncontrolled. */\n defaultValue?: TreeKey | TreeKey[]\n /** Field-name overrides forwarded to the inner Tree. */\n fieldNames?: TreeFieldNames\n /** Allows selecting multiple leaves without checkboxes. */\n multiple?: boolean\n /** Renders checkboxes on every node with cascade selection. */\n treeCheckable?: boolean\n /** Independent parent/child checks when checkable. */\n treeCheckStrictly?: boolean\n /** Expands every parent on first render. */\n treeDefaultExpandAll?: boolean\n /** Initial expanded keys (overrides `treeDefaultExpandAll`). */\n treeDefaultExpandedKeys?: TreeKey[]\n /** @deprecated Compat alias for `treeDefaultExpandedKeys`. */\n defaultExpandedKeys?: TreeKey[]\n /** Shows search field inside the dropdown. */\n showSearch?: boolean\n /** Optional filter predicate. */\n filterTreeNode?: (inputValue: string, treeNode: TreeNodeData) => boolean\n /** Trigger placeholder. */\n placeholder?: string\n /** Shows clear button. */\n allowClear?: boolean\n /** Disables interaction. */\n disabled?: boolean\n /** Selector size token. */\n size?: 'small' | 'middle' | 'large'\n /** Collapses multiple tags to a “+N” rest indicator. */\n maxTagCount?: number\n /** Inline style on the dropdown panel. */\n dropdownStyle?: Record<string, string | number>\n /** Enables guide lines on the inner Tree. */\n treeLine?: boolean\n /** Which checked keys are surfaced to the trigger when checkable. */\n showCheckedStrategy?: TreeSelectStrategy\n /** Root wrapper class name (additive). */\n className?: string\n /** Strips Skygraph CSS. */\n unstyled?: boolean\n}\n\nconst props = withDefaults(defineProps<TreeSelectProps>(), {\n multiple: false,\n treeCheckable: false,\n treeCheckStrictly: false,\n treeDefaultExpandAll: false,\n showSearch: false,\n placeholder: 'Please select',\n allowClear: false,\n disabled: false,\n size: 'middle',\n treeLine: false,\n showCheckedStrategy: 'SHOW_ALL',\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: TreeKey | TreeKey[]): void\n (\n e: 'change',\n value: TreeKey | TreeKey[],\n label: string[],\n extra: { triggerNode: TreeNodeData },\n ): void\n (e: 'search', value: string): void\n}>()\n\nfunction toArray(val: TreeKey | TreeKey[] | undefined): TreeKey[] {\n if (val === undefined || val === '' || val === null) return []\n return Array.isArray(val) ? val : [val]\n}\n\nfunction findNode(nodes: TreeNodeData[], key: TreeKey): TreeNodeData | undefined {\n for (const n of nodes) {\n if (n.key === key) return n\n if (n.children) {\n const found = findNode(n.children, key)\n if (found) return found\n }\n }\n return undefined\n}\n\nfunction getNodeLabel(node: TreeNodeData | undefined): string {\n if (!node) return ''\n return typeof node.title === 'string' ? node.title : String(node.key)\n}\n\nfunction collectAllKeys(nodes: TreeNodeData[]): TreeKey[] {\n const keys: TreeKey[] = []\n const walk = (list: TreeNodeData[]) => {\n for (const n of list) {\n keys.push(n.key)\n if (n.children) walk(n.children)\n }\n }\n walk(nodes)\n return keys\n}\n\nfunction collectAllParentKeys(nodes: TreeNodeData[]): TreeKey[] {\n const keys: TreeKey[] = []\n const walk = (list: TreeNodeData[]) => {\n for (const n of list) {\n if (n.children && n.children.length > 0) {\n keys.push(n.key)\n walk(n.children)\n }\n }\n }\n walk(nodes)\n return keys\n}\n\nfunction filterTreeKeepMatches(\n nodes: TreeNodeData[],\n predicate: (node: TreeNodeData) => boolean,\n): TreeNodeData[] {\n const result: TreeNodeData[] = []\n for (const node of nodes) {\n const childResult = node.children ? filterTreeKeepMatches(node.children, predicate) : []\n if (predicate(node) || childResult.length > 0) {\n result.push({\n ...node,\n children: childResult.length > 0 ? childResult : undefined,\n })\n }\n }\n return result\n}\n\nfunction getParentKeys(nodes: TreeNodeData[], targetKey: TreeKey): TreeKey[] {\n const parents: TreeKey[] = []\n const walk = (list: TreeNodeData[], path: TreeKey[]): boolean => {\n for (const n of list) {\n if (n.key === targetKey) {\n parents.push(...path)\n return true\n }\n if (n.children && walk(n.children, [...path, n.key])) return true\n }\n return false\n }\n walk(nodes, [])\n return parents\n}\n\nfunction applyStrategy(\n checkedKeys: TreeKey[],\n treeData: TreeNodeData[],\n strategy: TreeSelectStrategy,\n): TreeKey[] {\n if (strategy === 'SHOW_ALL') return checkedKeys\n const checkedSet = new Set(checkedKeys)\n if (strategy === 'SHOW_CHILD') {\n return checkedKeys.filter((key) => {\n const node = findNode(treeData, key)\n return !node?.children || node.children.length === 0\n })\n }\n if (strategy === 'SHOW_PARENT') {\n return checkedKeys.filter((key) => {\n const parents = getParentKeys(treeData, key)\n return !parents.some((pk) => checkedSet.has(pk))\n })\n }\n return checkedKeys\n}\n\nconst isMultiple = computed(() => props.multiple || props.treeCheckable)\n\nconst incoming = computed<TreeKey | TreeKey[] | undefined>(() => props.modelValue ?? props.value)\n\nconst internal = ref<TreeKey[]>(toArray(incoming.value ?? props.defaultValue))\n\nwatch(incoming, (v) => {\n if (v !== undefined) internal.value = toArray(v)\n})\n\nconst currentValue = computed<TreeKey[]>(() =>\n incoming.value !== undefined ? toArray(incoming.value) : internal.value,\n)\n\nconst open = ref(false)\nconst searchValue = ref('')\nconst wrapperRef = useTemplateRef<HTMLDivElement>('wrapperRef')\nconst searchRef = useTemplateRef<HTMLInputElement>('searchRef')\n\nconst defaultFilter = (input: string, node: TreeNodeData): boolean => {\n const title = (typeof node.title === 'string' ? node.title : String(node.key)).toLowerCase()\n return title.includes(input.toLowerCase())\n}\n\nconst filterFn = computed(() => props.filterTreeNode ?? defaultFilter)\n\nconst filteredTreeData = computed<TreeNodeData[]>(() =>\n searchValue.value\n ? filterTreeKeepMatches(props.treeData, (n) => filterFn.value(searchValue.value, n))\n : props.treeData,\n)\n\nconst filteredExpandedKeys = computed<TreeKey[] | undefined>(() =>\n searchValue.value ? collectAllKeys(filteredTreeData.value) : undefined,\n)\n\nconst initialExpandedKeys = computed<TreeKey[] | undefined>(() => {\n if (props.treeDefaultExpandedKeys && props.treeDefaultExpandedKeys.length > 0)\n return props.treeDefaultExpandedKeys\n if (props.defaultExpandedKeys && props.defaultExpandedKeys.length > 0)\n return props.defaultExpandedKeys\n if (props.treeDefaultExpandAll) return collectAllParentKeys(props.treeData)\n return undefined\n})\n\nconst treeCheckedKeys = computed<TreeKey[] | undefined>(() =>\n props.treeCheckable ? currentValue.value : undefined,\n)\n\nconst treeSelectedKeys = computed<TreeKey[] | undefined>(() =>\n props.treeCheckable ? undefined : currentValue.value,\n)\n\nconst displayedValues = computed<TreeKey[]>(() => {\n if (!isMultiple.value) return currentValue.value\n return applyStrategy(currentValue.value, props.treeData, props.showCheckedStrategy)\n})\n\nconst visibleTags = computed(() =>\n props.maxTagCount !== undefined && isMultiple.value\n ? displayedValues.value.slice(0, props.maxTagCount)\n : displayedValues.value,\n)\n\nconst hiddenCount = computed(() =>\n props.maxTagCount !== undefined && isMultiple.value\n ? Math.max(0, displayedValues.value.length - props.maxTagCount)\n : 0,\n)\n\nfunction fireChange(keys: TreeKey[], triggerNode: TreeNodeData) {\n internal.value = keys\n const labels = keys.map((k) => getNodeLabel(findNode(props.treeData, k)))\n const next: TreeKey | TreeKey[] = isMultiple.value ? keys : (keys[0] ?? '')\n emit('update:modelValue', next)\n emit('change', next, labels, { triggerNode })\n}\n\nfunction handleTreeSelect(\n _keys: TreeKey[],\n info: { selected: boolean; node: TreeNodeData; selectedNodes: TreeNodeData[] },\n) {\n if (props.treeCheckable) return\n const node = info.node\n if (isMultiple.value) {\n const newKeys = info.selected\n ? [...currentValue.value, node.key]\n : currentValue.value.filter((k) => k !== node.key)\n fireChange(newKeys, node)\n } else {\n fireChange([node.key], node)\n open.value = false\n searchValue.value = ''\n }\n}\n\nfunction handleTreeCheck(\n checkedKeys: TreeKey[],\n info: {\n checked: boolean\n node: TreeNodeData\n checkedNodes: TreeNodeData[]\n halfCheckedKeys: TreeKey[]\n },\n) {\n const displayed = applyStrategy(checkedKeys, props.treeData, props.showCheckedStrategy)\n fireChange(displayed, info.node)\n}\n\nfunction handleRemoveTag(key: TreeKey, e: MouseEvent) {\n e.stopPropagation()\n if (props.disabled) return\n const node = findNode(props.treeData, key) ?? ({ key } as TreeNodeData)\n const newKeys = currentValue.value.filter((k) => k !== key)\n fireChange(newKeys, node)\n}\n\nfunction handleClear(e: MouseEvent) {\n e.stopPropagation()\n if (props.disabled) return\n const node = props.treeData[0] ?? ({ key: '' } as TreeNodeData)\n fireChange([], node)\n searchValue.value = ''\n}\n\nfunction handleSearchInput(e: Event) {\n const v = (e.target as HTMLInputElement).value\n searchValue.value = v\n emit('search', v)\n}\n\nfunction handleTriggerClick() {\n if (props.disabled) return\n open.value = !open.value\n}\n\nfunction handleOutside(e: MouseEvent) {\n if (!wrapperRef.value) return\n if (!wrapperRef.value.contains(e.target as Node)) {\n open.value = false\n searchValue.value = ''\n }\n}\n\nonMounted(() => document.addEventListener('mousedown', handleOutside))\nonBeforeUnmount(() => document.removeEventListener('mousedown', handleOutside))\n\nwatch(open, (next) => {\n if (next && props.showSearch) {\n void nextTick(() => searchRef.value?.focus())\n }\n})\n\nconst wrapperCls = computed(() => {\n if (props.unstyled) return props.className ?? ''\n return [\n 'sg-treeselect',\n `sg-treeselect-${props.size}`,\n open.value ? 'sg-treeselect-open' : '',\n props.disabled ? 'sg-treeselect-disabled' : '',\n isMultiple.value ? 'sg-treeselect-multiple' : '',\n props.className,\n ]\n .filter(Boolean)\n .join(' ')\n})\n\nfunction labelFor(key: TreeKey): string {\n return getNodeLabel(findNode(props.treeData, key))\n}\n</script>\n\n<template>\n <div ref=\"wrapperRef\" :class=\"wrapperCls\">\n <template v-if=\"unstyled\">\n <div @click=\"handleTriggerClick\">\n <span v-if=\"displayedValues.length === 0\">{{ placeholder }}</span>\n <span v-else-if=\"!isMultiple\">{{ labelFor(displayedValues[0]) }}</span>\n <template v-else>\n <span v-for=\"key in displayedValues\" :key=\"String(key)\">\n {{ labelFor(key) }}\n <span @click=\"(e) => handleRemoveTag(key, e)\">×</span>\n </span>\n </template>\n </div>\n <div v-if=\"open\">\n <input\n v-if=\"showSearch\"\n ref=\"searchRef\"\n :value=\"searchValue\"\n :placeholder=\"placeholder\"\n @input=\"handleSearchInput\"\n />\n <SgTree\n :tree-data=\"filteredTreeData\"\n :field-names=\"fieldNames\"\n :checkable=\"treeCheckable\"\n :check-strictly=\"treeCheckStrictly\"\n :checked-keys=\"treeCheckedKeys\"\n :selected-keys=\"treeSelectedKeys\"\n :multiple=\"isMultiple\"\n :default-expand-all=\"treeDefaultExpandAll && !initialExpandedKeys\"\n :default-expanded-keys=\"initialExpandedKeys\"\n :expanded-keys=\"filteredExpandedKeys\"\n :show-line=\"treeLine\"\n unstyled\n @select=\"handleTreeSelect\"\n @check=\"handleTreeCheck\"\n />\n </div>\n </template>\n\n <template v-else>\n <div class=\"sg-treeselect-selector\" @click=\"handleTriggerClick\">\n <div class=\"sg-treeselect-selection-wrap\">\n <span\n v-if=\"displayedValues.length === 0 && !searchValue\"\n class=\"sg-treeselect-placeholder\"\n >{{ placeholder }}</span\n >\n\n <span\n v-if=\"!isMultiple && displayedValues.length > 0 && !searchValue\"\n class=\"sg-treeselect-selection-item\"\n >{{ labelFor(displayedValues[0]) }}</span\n >\n\n <template v-if=\"isMultiple\">\n <span v-for=\"key in visibleTags\" :key=\"String(key)\" class=\"sg-treeselect-tag\">\n <span class=\"sg-treeselect-tag-label\">{{ labelFor(key) }}</span>\n <span class=\"sg-treeselect-tag-close\" @click=\"(e) => handleRemoveTag(key, e)\"\n >×</span\n >\n </span>\n </template>\n\n <span v-if=\"hiddenCount > 0\" class=\"sg-treeselect-tag sg-treeselect-tag-rest\"\n >+{{ hiddenCount }}...</span\n >\n\n <input\n v-if=\"showSearch && open\"\n ref=\"searchRef\"\n class=\"sg-treeselect-search-input\"\n :value=\"searchValue\"\n @input=\"handleSearchInput\"\n />\n </div>\n\n <div class=\"sg-treeselect-actions\">\n <span\n v-if=\"allowClear && displayedValues.length > 0\"\n class=\"sg-treeselect-clear\"\n @click=\"handleClear\"\n >×</span\n >\n <span class=\"sg-treeselect-arrow\">{{ open ? '\\u25B2' : '\\u25BC' }}</span>\n </div>\n </div>\n\n <div v-if=\"open\" class=\"sg-treeselect-dropdown\" :style=\"dropdownStyle\">\n <div v-if=\"filteredTreeData.length === 0\" class=\"sg-treeselect-empty\">No matches</div>\n <SgTree\n v-else\n :tree-data=\"filteredTreeData\"\n :field-names=\"fieldNames\"\n :checkable=\"treeCheckable\"\n :check-strictly=\"treeCheckStrictly\"\n :checked-keys=\"treeCheckedKeys\"\n :selected-keys=\"treeSelectedKeys\"\n :multiple=\"isMultiple\"\n :default-expand-all=\"treeDefaultExpandAll && !initialExpandedKeys\"\n :default-expanded-keys=\"initialExpandedKeys\"\n :expanded-keys=\"filteredExpandedKeys\"\n :show-line=\"treeLine\"\n @select=\"handleTreeSelect\"\n @check=\"handleTreeCheck\"\n />\n </div>\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport SgButton from './Button.vue'\nimport SgInput from './Input.vue'\nimport SgCheckbox from './Checkbox.vue'\nimport SgPagination from './Pagination.vue'\n\nexport interface TransferItem {\n key: string\n title: string\n description?: string\n disabled?: boolean\n}\n\nexport interface TransferLocale {\n itemUnit?: string\n itemsUnit?: string\n searchPlaceholder?: string\n notFoundContent?: string\n selectAll?: string\n deselectAll?: string\n}\n\nconst DEFAULT_LOCALE: Required<TransferLocale> = {\n itemUnit: 'item',\n itemsUnit: 'items',\n searchPlaceholder: 'Search here',\n notFoundContent: 'Not Found',\n selectAll: 'Select all',\n deselectAll: 'Deselect all',\n}\n\nexport interface TransferProps {\n /** Source data set. */\n dataSource: TransferItem[]\n /** v-model: keys present in the right-hand pane. */\n modelValue?: string[]\n /** Compat alias for `modelValue`. */\n targetKeys?: string[]\n /** Initial target keys when uncontrolled. */\n defaultTargetKeys?: string[]\n /** Show search input on each pane. */\n showSearch?: boolean\n /** Pane titles, [left, right]. */\n titles?: [string, string]\n /** Disables interaction. */\n disabled?: boolean\n /** One-way mode (only left → right). */\n oneWay?: boolean\n /** Show select-all checkbox in the panel header. */\n showSelectAll?: boolean\n /** Enable client pagination. */\n pagination?: boolean | { pageSize?: number }\n /** Fixed list body height (px). */\n listHeight?: number\n /** Locale overrides. */\n locale?: TransferLocale\n /** Strips built-in styling. */\n unstyled?: boolean\n}\n\nconst props = withDefaults(defineProps<TransferProps>(), {\n showSearch: false,\n titles: () => ['Source', 'Target'],\n disabled: false,\n oneWay: false,\n showSelectAll: true,\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', keys: string[]): void\n (e: 'change', keys: string[], direction: 'left' | 'right', moveKeys: string[]): void\n (e: 'selectChange', leftKeys: string[], rightKeys: string[]): void\n (e: 'search', direction: 'left' | 'right', value: string): void\n}>()\n\ndefineSlots<{\n item(props: { item: TransferItem; side: 'left' | 'right' }): unknown\n}>()\n\nconst mergedLocale = computed<Required<TransferLocale>>(() => ({\n ...DEFAULT_LOCALE,\n ...(props.locale ?? {}),\n}))\n\nconst internal = ref<string[]>(\n props.modelValue ?? props.targetKeys ?? props.defaultTargetKeys ?? [],\n)\nwatch(\n () => props.modelValue ?? props.targetKeys,\n (v) => {\n if (v !== undefined) internal.value = v\n },\n)\nconst targets = computed(() => props.modelValue ?? props.targetKeys ?? internal.value)\n\nconst leftSelected = ref<string[]>([])\nconst rightSelected = ref<string[]>([])\nconst leftSearch = ref('')\nconst rightSearch = ref('')\nconst leftPage = ref(1)\nconst rightPage = ref(1)\n\nwatch(leftSearch, () => {\n leftPage.value = 1\n})\nwatch(rightSearch, () => {\n rightPage.value = 1\n})\n\nconst sourceItems = computed(() => props.dataSource.filter((i) => !targets.value.includes(i.key)))\nconst targetItems = computed(() => props.dataSource.filter((i) => targets.value.includes(i.key)))\n\nfunction filterItems(items: TransferItem[], q: string): TransferItem[] {\n if (!q) return items\n const v = q.toLowerCase()\n return items.filter((i) => i.title.toLowerCase().includes(v))\n}\n\nconst filteredLeft = computed(() => filterItems(sourceItems.value, leftSearch.value))\nconst filteredRight = computed(() => filterItems(targetItems.value, rightSearch.value))\n\nfunction resolvePageSize(): number {\n if (!props.pagination) return Infinity\n if (typeof props.pagination === 'object' && props.pagination.pageSize) {\n return props.pagination.pageSize\n }\n return 10\n}\n\nconst pageSize = computed(() => resolvePageSize())\n\nfunction pageSlice(items: TransferItem[], page: number): TransferItem[] {\n if (!props.pagination) return items\n const total = Math.max(1, Math.ceil(items.length / pageSize.value))\n const safe = Math.min(page, total)\n const start = (safe - 1) * pageSize.value\n return items.slice(start, start + pageSize.value)\n}\n\nconst visibleLeft = computed(() => pageSlice(filteredLeft.value, leftPage.value))\nconst visibleRight = computed(() => pageSlice(filteredRight.value, rightPage.value))\n\nfunction countText(items: TransferItem[], selected: string[]): string {\n const count = items.filter((i) => selected.includes(i.key)).length\n const unit = items.length === 1 ? mergedLocale.value.itemUnit : mergedLocale.value.itemsUnit\n return count > 0 ? `${count}/${items.length} ${unit}` : `${items.length} ${unit}`\n}\n\nfunction enabledKeys(items: TransferItem[]): string[] {\n return items.filter((i) => !i.disabled && !props.disabled).map((i) => i.key)\n}\n\nfunction allChecked(items: TransferItem[], selected: string[]): boolean {\n const enabled = enabledKeys(items)\n return enabled.length > 0 && enabled.every((k) => selected.includes(k))\n}\n\nfunction indeterminate(items: TransferItem[], selected: string[]): boolean {\n const enabled = enabledKeys(items)\n const some = enabled.some((k) => selected.includes(k))\n return some && !allChecked(items, selected)\n}\n\nfunction toggleItem(item: TransferItem, side: 'left' | 'right') {\n if (props.disabled || item.disabled) return\n const list = side === 'left' ? leftSelected : rightSelected\n const set = new Set(list.value)\n if (set.has(item.key)) set.delete(item.key)\n else set.add(item.key)\n list.value = Array.from(set)\n emit('selectChange', leftSelected.value, rightSelected.value)\n}\n\nfunction toggleAll(side: 'left' | 'right', checked: boolean) {\n if (props.disabled) return\n const items = side === 'left' ? filteredLeft.value : filteredRight.value\n const list = side === 'left' ? leftSelected : rightSelected\n const enabled = enabledKeys(items)\n if (checked) {\n list.value = Array.from(new Set([...list.value, ...enabled]))\n } else {\n const drop = new Set(enabled)\n list.value = list.value.filter((k) => !drop.has(k))\n }\n emit('selectChange', leftSelected.value, rightSelected.value)\n}\n\nfunction moveRight() {\n const moveKeys = leftSelected.value.filter((k) => {\n const item = props.dataSource.find((i) => i.key === k)\n return item && !item.disabled\n })\n if (moveKeys.length === 0) return\n const next = [...targets.value, ...moveKeys]\n internal.value = next\n emit('update:modelValue', next)\n emit('change', next, 'right', moveKeys)\n leftSelected.value = []\n emit('selectChange', [], rightSelected.value)\n}\n\nfunction moveLeft() {\n if (props.oneWay) return\n const moveKeys = rightSelected.value.filter((k) => {\n const item = props.dataSource.find((i) => i.key === k)\n return item && !item.disabled\n })\n if (moveKeys.length === 0) return\n const moveSet = new Set(moveKeys)\n const next = targets.value.filter((k) => !moveSet.has(k))\n internal.value = next\n emit('update:modelValue', next)\n emit('change', next, 'left', moveKeys)\n rightSelected.value = []\n emit('selectChange', leftSelected.value, [])\n}\n\nconst canMoveRight = computed(() =>\n leftSelected.value.some((k) => {\n const item = props.dataSource.find((i) => i.key === k)\n return item && !item.disabled\n }),\n)\nconst canMoveLeft = computed(\n () =>\n !props.oneWay &&\n rightSelected.value.some((k) => {\n const item = props.dataSource.find((i) => i.key === k)\n return item && !item.disabled\n }),\n)\n\nfunction onLeftSearch(v: string) {\n leftSearch.value = v\n emit('search', 'left', v)\n}\nfunction onRightSearch(v: string) {\n rightSearch.value = v\n emit('search', 'right', v)\n}\n\nconst wrapperCls = computed(() =>\n props.unstyled\n ? ''\n : ['sg-transfer', props.disabled ? 'sg-transfer-disabled' : ''].filter(Boolean).join(' '),\n)\n\nfunction itemCls(item: TransferItem, selected: string[]): string {\n if (props.unstyled) return ''\n return [\n 'sg-transfer-list-item',\n selected.includes(item.key) ? 'sg-transfer-list-item-selected' : '',\n props.disabled || item.disabled ? 'sg-transfer-list-item-disabled' : '',\n ]\n .filter(Boolean)\n .join(' ')\n}\n</script>\n\n<template>\n <div :class=\"wrapperCls\">\n <!-- Source list -->\n <div :class=\"unstyled ? '' : 'sg-transfer-list'\">\n <div :class=\"unstyled ? '' : 'sg-transfer-list-header'\">\n <SgCheckbox\n v-if=\"showSelectAll\"\n :checked=\"allChecked(filteredLeft, leftSelected)\"\n :indeterminate=\"indeterminate(filteredLeft, leftSelected)\"\n :disabled=\"disabled || enabledKeys(filteredLeft).length === 0\"\n @change=\"(v: boolean) => toggleAll('left', v)\"\n />\n <span :class=\"unstyled ? '' : 'sg-transfer-list-header-count'\">\n {{ countText(filteredLeft, leftSelected) }}\n </span>\n <span v-if=\"titles[0]\" :class=\"unstyled ? '' : 'sg-transfer-list-header-title'\">\n {{ titles[0] }}\n </span>\n </div>\n <div v-if=\"showSearch\" :class=\"unstyled ? '' : 'sg-transfer-list-search'\">\n <SgInput\n size=\"small\"\n :model-value=\"leftSearch\"\n :placeholder=\"mergedLocale.searchPlaceholder\"\n allow-clear\n @update:model-value=\"onLeftSearch\"\n />\n </div>\n <div\n :class=\"unstyled ? '' : 'sg-transfer-list-body'\"\n :style=\"listHeight ? { height: `${listHeight}px`, overflow: 'auto' } : undefined\"\n >\n <div v-if=\"visibleLeft.length === 0\" :class=\"unstyled ? '' : 'sg-transfer-list-empty'\">\n {{ mergedLocale.notFoundContent }}\n </div>\n <ul v-else :class=\"unstyled ? '' : 'sg-transfer-list-content'\">\n <li\n v-for=\"item in visibleLeft\"\n :key=\"item.key\"\n :class=\"itemCls(item, leftSelected)\"\n @click=\"toggleItem(item, 'left')\"\n >\n <SgCheckbox\n :checked=\"leftSelected.includes(item.key)\"\n :disabled=\"disabled || item.disabled\"\n @click.stop\n @change=\"() => toggleItem(item, 'left')\"\n />\n <span :class=\"unstyled ? '' : 'sg-transfer-list-item-text'\">\n <slot name=\"item\" :item=\"item\" side=\"left\">{{ item.title }}</slot>\n </span>\n </li>\n </ul>\n </div>\n <div\n v-if=\"pagination && filteredLeft.length > pageSize\"\n :class=\"unstyled ? '' : 'sg-transfer-list-pagination'\"\n >\n <SgPagination\n :current=\"leftPage\"\n :total=\"filteredLeft.length\"\n :page-size=\"pageSize\"\n simple\n @change=\"(p: number) => (leftPage = p)\"\n />\n </div>\n </div>\n\n <!-- Operations -->\n <div :class=\"unstyled ? '' : 'sg-transfer-operations'\">\n <SgButton type=\"primary\" size=\"small\" :disabled=\"disabled || !canMoveRight\" @click=\"moveRight\"\n >›</SgButton\n >\n <SgButton\n v-if=\"!oneWay\"\n type=\"primary\"\n size=\"small\"\n :disabled=\"disabled || !canMoveLeft\"\n @click=\"moveLeft\"\n >‹</SgButton\n >\n </div>\n\n <!-- Target list -->\n <div :class=\"unstyled ? '' : 'sg-transfer-list'\">\n <div :class=\"unstyled ? '' : 'sg-transfer-list-header'\">\n <SgCheckbox\n v-if=\"showSelectAll\"\n :checked=\"allChecked(filteredRight, rightSelected)\"\n :indeterminate=\"indeterminate(filteredRight, rightSelected)\"\n :disabled=\"disabled || enabledKeys(filteredRight).length === 0\"\n @change=\"(v: boolean) => toggleAll('right', v)\"\n />\n <span :class=\"unstyled ? '' : 'sg-transfer-list-header-count'\">\n {{ countText(filteredRight, rightSelected) }}\n </span>\n <span v-if=\"titles[1]\" :class=\"unstyled ? '' : 'sg-transfer-list-header-title'\">\n {{ titles[1] }}\n </span>\n </div>\n <div v-if=\"showSearch\" :class=\"unstyled ? '' : 'sg-transfer-list-search'\">\n <SgInput\n size=\"small\"\n :model-value=\"rightSearch\"\n :placeholder=\"mergedLocale.searchPlaceholder\"\n allow-clear\n @update:model-value=\"onRightSearch\"\n />\n </div>\n <div\n :class=\"unstyled ? '' : 'sg-transfer-list-body'\"\n :style=\"listHeight ? { height: `${listHeight}px`, overflow: 'auto' } : undefined\"\n >\n <div v-if=\"visibleRight.length === 0\" :class=\"unstyled ? '' : 'sg-transfer-list-empty'\">\n {{ mergedLocale.notFoundContent }}\n </div>\n <ul v-else :class=\"unstyled ? '' : 'sg-transfer-list-content'\">\n <li\n v-for=\"item in visibleRight\"\n :key=\"item.key\"\n :class=\"itemCls(item, rightSelected)\"\n @click=\"toggleItem(item, 'right')\"\n >\n <SgCheckbox\n :checked=\"rightSelected.includes(item.key)\"\n :disabled=\"disabled || item.disabled\"\n @click.stop\n @change=\"() => toggleItem(item, 'right')\"\n />\n <span :class=\"unstyled ? '' : 'sg-transfer-list-item-text'\">\n <slot name=\"item\" :item=\"item\" side=\"right\">{{ item.title }}</slot>\n </span>\n </li>\n </ul>\n </div>\n <div\n v-if=\"pagination && filteredRight.length > pageSize\"\n :class=\"unstyled ? '' : 'sg-transfer-list-pagination'\"\n >\n <SgPagination\n :current=\"rightPage\"\n :total=\"filteredRight.length\"\n :page-size=\"pageSize\"\n simple\n @change=\"(p: number) => (rightPage = p)\"\n />\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport type { SizeType } from '../../types'\nimport { useConfigWithDefaults } from './ConfigProvider.vue'\n\nexport interface MentionOption {\n value: string\n label?: string\n disabled?: boolean\n}\n\nexport interface MentionsProps {\n /** v-model binding (Vue idiom). */\n modelValue?: string\n /** Compat alias. */\n value?: string\n /** Initial value when uncontrolled. */\n defaultValue?: string\n /** Placeholder text. */\n placeholder?: string\n /** Mention prefix character(s). */\n prefix?: string | string[]\n /** Number of textarea rows. */\n rows?: number\n /** Mention suggestion options. */\n options?: MentionOption[]\n /** Vertical position of the suggestion dropdown relative to the field. */\n placement?: 'top' | 'bottom'\n /** Disables interaction. */\n disabled?: boolean\n /** Component size. */\n size?: SizeType\n /** Strips built-in styling. */\n unstyled?: boolean\n}\n\nconst props = withDefaults(defineProps<MentionsProps>(), {\n prefix: '@',\n rows: 3,\n options: () => [],\n placement: 'bottom',\n})\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', value: string): void\n (e: 'change', value: string): void\n (e: 'search', text: string, prefix: string): void\n (e: 'select', option: MentionOption, prefix: string): void\n}>()\n\nconst { resolvedSize, resolvedDisabled } = useConfigWithDefaults(props, {})\n\nconst internal = ref<string>(props.modelValue ?? props.value ?? props.defaultValue ?? '')\nwatch(\n () => props.modelValue ?? props.value,\n (v) => {\n if (v !== undefined) internal.value = v\n },\n)\nconst current = computed(() => props.modelValue ?? props.value ?? internal.value)\n\nconst showSuggest = ref(false)\nconst search = ref('')\nconst activePrefix = ref('')\nconst startIndex = ref(0)\nconst activeIndex = ref(0)\nconst textareaRef = ref<HTMLTextAreaElement | null>(null)\nconst dropdownRef = ref<HTMLDivElement | null>(null)\n\nconst prefixes = computed(() => (Array.isArray(props.prefix) ? props.prefix : [props.prefix]))\n\nfunction handleInput(e: Event) {\n const target = e.target as HTMLTextAreaElement\n const v = target.value\n internal.value = v\n emit('update:modelValue', v)\n emit('change', v)\n\n const pos = target.selectionStart ?? v.length\n const before = v.slice(0, pos)\n\n for (const p of prefixes.value) {\n const idx = before.lastIndexOf(p)\n if (idx >= 0) {\n const charBefore = idx > 0 ? before[idx - 1] : ' '\n if (charBefore === ' ' || charBefore === '\\n' || idx === 0) {\n const between = before.slice(idx + p.length)\n if (!between.includes(' ')) {\n activePrefix.value = p\n search.value = between\n startIndex.value = idx\n showSuggest.value = true\n activeIndex.value = 0\n emit('search', between, p)\n return\n }\n }\n }\n }\n showSuggest.value = false\n}\n\nconst filteredOptions = computed(() =>\n props.options.filter(\n (o) => !search.value || (o.label ?? o.value).toLowerCase().includes(search.value.toLowerCase()),\n ),\n)\n\nfunction selectOption(opt: MentionOption) {\n if (opt.disabled) return\n const v = current.value\n const before = v.slice(0, startIndex.value)\n const after = v.slice(startIndex.value + activePrefix.value.length + search.value.length)\n const insertText = `${activePrefix.value}${opt.value} `\n const newValue = before + insertText + after\n internal.value = newValue\n emit('update:modelValue', newValue)\n emit('change', newValue)\n emit('select', opt, activePrefix.value)\n showSuggest.value = false\n void nextTick(() => {\n if (textareaRef.value) {\n const newPos = before.length + insertText.length\n textareaRef.value.focus()\n textareaRef.value.setSelectionRange(newPos, newPos)\n }\n })\n}\n\nfunction handleKeyDown(e: KeyboardEvent) {\n if (!showSuggest.value || filteredOptions.value.length === 0) return\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n activeIndex.value = (activeIndex.value + 1) % filteredOptions.value.length\n } else if (e.key === 'ArrowUp') {\n e.preventDefault()\n activeIndex.value =\n (activeIndex.value - 1 + filteredOptions.value.length) % filteredOptions.value.length\n } else if (e.key === 'Enter') {\n e.preventDefault()\n selectOption(filteredOptions.value[activeIndex.value])\n } else if (e.key === 'Escape') {\n showSuggest.value = false\n }\n}\n\nfunction onClickOutside(e: MouseEvent) {\n if (\n dropdownRef.value &&\n !dropdownRef.value.contains(e.target as Node) &&\n textareaRef.value &&\n !textareaRef.value.contains(e.target as Node)\n ) {\n showSuggest.value = false\n }\n}\n\nonMounted(() => {\n document.addEventListener('mousedown', onClickOutside)\n})\nonBeforeUnmount(() => {\n document.removeEventListener('mousedown', onClickOutside)\n})\n\nconst wrapperCls = computed(() =>\n props.unstyled\n ? ''\n : [\n 'sg-mentions',\n `sg-mentions-${resolvedSize.value}`,\n resolvedDisabled.value ? 'sg-mentions-disabled' : '',\n ]\n .filter(Boolean)\n .join(' '),\n)\n</script>\n\n<template>\n <div :class=\"wrapperCls\">\n <textarea\n ref=\"textareaRef\"\n :class=\"unstyled ? '' : 'sg-input sg-textarea'\"\n :value=\"current\"\n :placeholder=\"placeholder\"\n :rows=\"rows\"\n :disabled=\"resolvedDisabled\"\n @input=\"handleInput\"\n @keydown=\"handleKeyDown\"\n />\n <div\n v-if=\"showSuggest && filteredOptions.length\"\n ref=\"dropdownRef\"\n :class=\"unstyled ? '' : `sg-mentions-dropdown sg-mentions-dropdown-${placement}`\"\n role=\"listbox\"\n >\n <div\n v-for=\"(opt, i) in filteredOptions\"\n :key=\"opt.value\"\n :class=\"\n unstyled\n ? ''\n : [\n 'sg-mentions-option',\n i === activeIndex ? 'sg-mentions-option-active' : '',\n opt.disabled ? 'sg-mentions-option-disabled' : '',\n ]\n .filter(Boolean)\n .join(' ')\n \"\n role=\"option\"\n :aria-selected=\"i === activeIndex\"\n @mousedown.prevent=\"selectOption(opt)\"\n @mouseenter=\"activeIndex = i\"\n >\n {{ opt.label ?? opt.value }}\n </div>\n </div>\n </div>\n</template>\n","<script lang=\"ts\">\r\nimport {\r\n Comment,\r\n Fragment,\r\n Text,\r\n cloneVNode,\r\n computed,\r\n defineComponent,\r\n onBeforeUnmount,\r\n ref,\r\n watch,\r\n type PropType,\r\n type VNode,\r\n} from 'vue'\r\n\r\nexport interface TransitionProps {\r\n /** When `true`, runs enter; when `false`, runs leave (and may unmount). */\r\n visible: boolean\r\n /** Base class name prefix for default enter/leave classes. @default 'sg-fade' */\r\n name?: string\r\n /** Animation length in ms before idle phase and after callbacks. @default 200 */\r\n duration?: number\r\n /** Custom initial class for the enter frame (with `-enter-active`). */\r\n enterFrom?: string\r\n /** Custom final class for the enter-active frame. */\r\n enterTo?: string\r\n /** Custom initial class for the leave frame (with `-leave-active`). */\r\n leaveFrom?: string\r\n /** Custom final class for the leave-active frame. */\r\n leaveTo?: string\r\n /** When `true`, removes the child from the tree after leave. @default true */\r\n unmountOnExit?: boolean\r\n}\r\n\r\ntype Phase = 'idle' | 'enter' | 'enter-active' | 'leave' | 'leave-active'\r\n\r\nfunction findFirstElement(nodes: VNode[]): VNode | null {\r\n for (const node of nodes) {\r\n if (node.type === Comment || node.type === Text) continue\r\n if (node.type === Fragment && Array.isArray(node.children)) {\r\n const inner = findFirstElement(node.children as VNode[])\r\n if (inner) return inner\r\n continue\r\n }\r\n return node\r\n }\r\n return null\r\n}\r\n\r\n/**\r\n * Class-based enter/leave animation that mirrors the React `Transition` contract.\r\n * Clones the single child VNode and merges generated transition classes into it.\r\n */\r\nexport default defineComponent({\r\n name: 'SgTransition',\r\n props: {\r\n visible: { type: Boolean, required: true },\r\n name: { type: String, default: 'sg-fade' },\r\n duration: { type: Number, default: 200 },\r\n enterFrom: { type: String, default: undefined },\r\n enterTo: { type: String, default: undefined },\r\n leaveFrom: { type: String, default: undefined },\r\n leaveTo: { type: String, default: undefined },\r\n unmountOnExit: { type: Boolean, default: true },\r\n onAfterEnter: { type: Function as PropType<() => void>, default: undefined },\r\n onAfterLeave: { type: Function as PropType<() => void>, default: undefined },\r\n },\r\n emits: ['afterEnter', 'afterLeave'],\r\n setup(props, { slots, emit }) {\r\n const mounted = ref(props.visible)\r\n const phase = ref<Phase>('idle')\r\n let timer: ReturnType<typeof setTimeout> | undefined\r\n\r\n const enterClasses = computed(() => {\r\n if (props.enterFrom && props.enterTo) {\r\n return {\r\n from: props.enterFrom,\r\n active: `${props.name}-enter-active`,\r\n to: props.enterTo,\r\n }\r\n }\r\n return {\r\n from: `${props.name}-enter-from`,\r\n active: `${props.name}-enter-active`,\r\n to: `${props.name}-enter-to`,\r\n }\r\n })\r\n\r\n const leaveClasses = computed(() => {\r\n if (props.leaveFrom && props.leaveTo) {\r\n return {\r\n from: props.leaveFrom,\r\n active: `${props.name}-leave-active`,\r\n to: props.leaveTo,\r\n }\r\n }\r\n return {\r\n from: `${props.name}-leave-from`,\r\n active: `${props.name}-leave-active`,\r\n to: `${props.name}-leave-to`,\r\n }\r\n })\r\n\r\n watch(\r\n () => props.visible,\r\n (next, prev) => {\r\n if (next === prev) return\r\n if (timer) clearTimeout(timer)\r\n\r\n if (next) {\r\n mounted.value = true\r\n phase.value = 'enter'\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => {\r\n phase.value = 'enter-active'\r\n })\r\n })\r\n timer = setTimeout(() => {\r\n phase.value = 'idle'\r\n emit('afterEnter')\r\n props.onAfterEnter?.()\r\n }, props.duration)\r\n } else {\r\n phase.value = 'leave'\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => {\r\n phase.value = 'leave-active'\r\n })\r\n })\r\n timer = setTimeout(() => {\r\n phase.value = 'idle'\r\n if (props.unmountOnExit) mounted.value = false\r\n emit('afterLeave')\r\n props.onAfterLeave?.()\r\n }, props.duration)\r\n }\r\n },\r\n )\r\n\r\n onBeforeUnmount(() => {\r\n if (timer) clearTimeout(timer)\r\n })\r\n\r\n const transitionClass = computed(() => {\r\n switch (phase.value) {\r\n case 'enter':\r\n return `${enterClasses.value.from} ${enterClasses.value.active}`\r\n case 'enter-active':\r\n return `${enterClasses.value.to} ${enterClasses.value.active}`\r\n case 'leave':\r\n return `${leaveClasses.value.from} ${leaveClasses.value.active}`\r\n case 'leave-active':\r\n return `${leaveClasses.value.to} ${leaveClasses.value.active}`\r\n default:\r\n return ''\r\n }\r\n })\r\n\r\n return () => {\r\n if (!mounted.value && props.unmountOnExit) return null\r\n const children = slots.default?.() ?? []\r\n const first = findFirstElement(children)\r\n if (!first) return null\r\n const cls = transitionClass.value\r\n if (!cls) return cloneVNode(first)\r\n return cloneVNode(first, { class: cls })\r\n }\r\n },\r\n})\r\n</script>\r\n","<script setup lang=\"ts\">\r\nimport { computed, getCurrentInstance, onBeforeUnmount, toRef, watch } from 'vue'\r\nimport { useFocusTrap } from '../../composables/useFocusTrap'\r\nimport { useConfig } from './ConfigProvider.vue'\r\nimport SgButton from './Button.vue'\r\nimport SgTransition from './Transition.vue'\r\n\r\nlet uid = 0\r\nfunction genId() {\r\n return `sg-modal-${++uid}`\r\n}\r\n\r\nexport interface ModalProps {\r\n /** When `true`, the modal is visible. */\r\n open: boolean\r\n /** Optional heading text; used for the accessible name when set. */\r\n title?: string\r\n /** Optional footer override (default: OK/Cancel pair when `okHandler`). */\r\n footer?: 'default' | 'none'\r\n /** Dialog width as a CSS length or number (pixels). @default 520 */\r\n width?: number | string\r\n /** When provided, default footer with OK button is enabled. */\r\n okHandler?: () => void | Promise<void>\r\n /** Label for the default OK button. */\r\n okText?: string\r\n /** Label for the default Cancel button. */\r\n cancelText?: string\r\n /** Visual type of the default OK button. @default 'primary' */\r\n okType?: 'primary' | 'default' | 'dashed' | 'text'\r\n /** Shows the OK button in loading state and disables interactions. */\r\n confirmLoading?: boolean\r\n /** Strips built-in styles when true. */\r\n unstyled?: boolean\r\n}\r\n\r\nconst props = withDefaults(defineProps<ModalProps>(), {\r\n width: 520,\r\n okType: 'primary',\r\n confirmLoading: false,\r\n})\r\n\r\nconst emit = defineEmits<{\r\n (e: 'close'): void\r\n (e: 'ok'): void\r\n}>()\r\n\r\ndefineSlots<{\r\n default(props: Record<string, never>): unknown\r\n footer(props: Record<string, never>): unknown\r\n}>()\r\n\r\nconst instance = getCurrentInstance()\r\nconst hasFooterSlot = computed<boolean>(\r\n () => !!(instance?.slots as Record<string, unknown> | undefined)?.footer,\r\n)\r\nconst cfg = useConfig()\r\nconst okText = computed(\r\n () => props.okText ?? cfg.value.locale?.modal?.okText ?? 'OK',\r\n)\r\nconst cancelText = computed(\r\n () => props.cancelText ?? cfg.value.locale?.modal?.cancelText ?? 'Cancel',\r\n)\r\n\r\nconst id = genId()\r\nconst titleId = `${id}-title`\r\nconst bodyId = `${id}-body`\r\n\r\nconst trapRef = useFocusTrap(toRef(props, 'open'))\r\n\r\nconst widthStyle = computed(() => ({\r\n width: typeof props.width === 'number' ? `${props.width}px` : props.width,\r\n}))\r\n\r\nfunction onClose() {\r\n emit('close')\r\n}\r\n\r\nfunction onOk() {\r\n emit('ok')\r\n props.okHandler?.()\r\n}\r\n\r\nfunction handleKeyDown(e: KeyboardEvent) {\r\n if (e.key === 'Escape') onClose()\r\n}\r\n\r\nwatch(\r\n () => props.open,\r\n (open) => {\r\n if (open) {\r\n document.addEventListener('keydown', handleKeyDown)\r\n } else {\r\n document.removeEventListener('keydown', handleKeyDown)\r\n }\r\n },\r\n { immediate: true },\r\n)\r\n\r\nonBeforeUnmount(() => {\r\n document.removeEventListener('keydown', handleKeyDown)\r\n})\r\n\r\nconst showDefaultFooter = computed<boolean>(\r\n () => props.footer !== 'none' && !hasFooterSlot.value && !!props.okHandler,\r\n)\r\nconst hasCustomFooter = computed<boolean>(\r\n () => hasFooterSlot.value && props.footer !== 'none',\r\n)\r\n</script>\r\n\r\n<template>\r\n <Teleport to=\"body\">\r\n <template v-if=\"unstyled\">\r\n <div\r\n v-if=\"open\"\r\n ref=\"trapRef\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n :aria-labelledby=\"title ? titleId : undefined\"\r\n :aria-describedby=\"bodyId\"\r\n >\r\n <div v-if=\"title\" :id=\"titleId\">{{ title }}</div>\r\n <div :id=\"bodyId\"><slot /></div>\r\n <div v-if=\"hasCustomFooter\">\r\n <slot name=\"footer\" />\r\n </div>\r\n <div v-else-if=\"showDefaultFooter\">\r\n <SgButton :unstyled=\"true\" @click=\"onClose\">{{ cancelText }}</SgButton>\r\n <SgButton :unstyled=\"true\" @click=\"onOk\">{{ okText }}</SgButton>\r\n </div>\r\n <button type=\"button\" aria-label=\"Close\" @click=\"onClose\">x</button>\r\n </div>\r\n </template>\r\n <template v-else>\r\n <SgTransition :visible=\"open\" name=\"sg-fade\" :unmount-on-exit=\"true\">\r\n <div class=\"sg-modal-mask\" @click=\"onClose\">\r\n <SgTransition :visible=\"open\" name=\"sg-zoom\" :unmount-on-exit=\"true\">\r\n <div\r\n ref=\"trapRef\"\r\n class=\"sg-modal\"\r\n :style=\"widthStyle\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n :aria-labelledby=\"title ? titleId : undefined\"\r\n :aria-describedby=\"bodyId\"\r\n @click.stop\r\n >\r\n <div class=\"sg-modal-header\">\r\n <div v-if=\"title\" class=\"sg-modal-title\" :id=\"titleId\">\r\n {{ title }}\r\n </div>\r\n <SgButton\r\n type=\"text\"\r\n class=\"sg-modal-close\"\r\n aria-label=\"Close\"\r\n @click=\"onClose\"\r\n >\r\n ×\r\n </SgButton>\r\n </div>\r\n <div class=\"sg-modal-body\" :id=\"bodyId\">\r\n <slot />\r\n </div>\r\n <div v-if=\"hasCustomFooter\" class=\"sg-modal-footer\">\r\n <slot name=\"footer\" />\r\n </div>\r\n <div v-else-if=\"showDefaultFooter\" class=\"sg-modal-footer\">\r\n <SgButton :disabled=\"confirmLoading\" @click=\"onClose\">{{ cancelText }}</SgButton>\r\n <SgButton :type=\"okType\" :loading=\"confirmLoading\" @click=\"onOk\">\r\n {{ okText }}\r\n </SgButton>\r\n </div>\r\n </div>\r\n </SgTransition>\r\n </div>\r\n </SgTransition>\r\n </template>\r\n </Teleport>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { computed, getCurrentInstance, onBeforeUnmount, toRef, watch } from 'vue'\r\nimport { useFocusTrap } from '../../composables/useFocusTrap'\r\nimport SgButton from './Button.vue'\r\nimport SgTransition from './Transition.vue'\r\n\r\nlet uid = 0\r\nfunction genId() {\r\n return `sg-drawer-${++uid}`\r\n}\r\n\r\nexport interface DrawerProps {\r\n /** When `true`, the drawer is visible. */\r\n open: boolean\r\n /** Optional header text. */\r\n title?: string\r\n /** Edge from which the panel enters. @default 'right' */\r\n placement?: 'left' | 'right' | 'top' | 'bottom'\r\n /** Width for left/right placement (CSS length or pixels). @default 378 */\r\n width?: number | string\r\n /** Height for top/bottom placement. @default 378 */\r\n height?: number | string\r\n /** When `true`, shows a header close button. @default true */\r\n closable?: boolean\r\n /** When `true`, renders a dimmed mask behind the panel. @default true */\r\n mask?: boolean\r\n /** When `true`, clicking the mask emits `close`. @default true */\r\n maskClosable?: boolean\r\n /** Strips built-in styles when true. */\r\n unstyled?: boolean\r\n}\r\n\r\nconst props = withDefaults(defineProps<DrawerProps>(), {\r\n placement: 'right',\r\n width: 378,\r\n height: 378,\r\n closable: true,\r\n mask: true,\r\n maskClosable: true,\r\n})\r\n\r\nconst emit = defineEmits<{\r\n (e: 'close'): void\r\n}>()\r\n\r\ndefineSlots<{\r\n default(props: Record<string, never>): unknown\r\n footer(props: Record<string, never>): unknown\r\n}>()\r\n\r\nconst PLACEMENT_TRANSITION: Record<string, string> = {\r\n left: 'sg-slide-left',\r\n right: 'sg-slide-right',\r\n top: 'sg-slide-down',\r\n bottom: 'sg-slide-up',\r\n}\r\n\r\nconst id = genId()\r\nconst titleId = `${id}-title`\r\nconst bodyId = `${id}-body`\r\nconst trapRef = useFocusTrap(toRef(props, 'open'))\r\n\r\nconst isHorizontal = computed(\r\n () => props.placement === 'left' || props.placement === 'right',\r\n)\r\n\r\nconst sizeStyle = computed(() => {\r\n const w = typeof props.width === 'number' ? `${props.width}px` : props.width\r\n const h = typeof props.height === 'number' ? `${props.height}px` : props.height\r\n return isHorizontal.value\r\n ? { width: w, height: '100%' }\r\n : { width: '100%', height: h }\r\n})\r\n\r\nconst transitionName = computed(\r\n () => PLACEMENT_TRANSITION[props.placement] ?? 'sg-slide-right',\r\n)\r\n\r\nfunction onClose() {\r\n emit('close')\r\n}\r\n\r\nfunction handleKeyDown(e: KeyboardEvent) {\r\n if (e.key === 'Escape') onClose()\r\n}\r\n\r\nwatch(\r\n () => props.open,\r\n (open) => {\r\n if (open) document.addEventListener('keydown', handleKeyDown)\r\n else document.removeEventListener('keydown', handleKeyDown)\r\n },\r\n { immediate: true },\r\n)\r\n\r\nonBeforeUnmount(() => {\r\n document.removeEventListener('keydown', handleKeyDown)\r\n})\r\n\r\nconst drawerClasses = computed(() =>\r\n ['sg-drawer', `sg-drawer-${props.placement}`].join(' '),\r\n)\r\n\r\nconst instance = getCurrentInstance()\r\nconst hasFooterSlot = computed<boolean>(\r\n () => !!(instance?.slots as Record<string, unknown> | undefined)?.footer,\r\n)\r\n</script>\r\n\r\n<template>\r\n <Teleport to=\"body\">\r\n <template v-if=\"unstyled\">\r\n <div\r\n v-if=\"open\"\r\n ref=\"trapRef\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n :aria-labelledby=\"title ? titleId : undefined\"\r\n :aria-describedby=\"bodyId\"\r\n >\r\n <div v-if=\"title\" :id=\"titleId\">{{ title }}</div>\r\n <div :id=\"bodyId\"><slot /></div>\r\n <div v-if=\"hasFooterSlot\">\r\n <slot name=\"footer\" />\r\n </div>\r\n <button v-if=\"closable\" type=\"button\" aria-label=\"Close\" @click=\"onClose\">×</button>\r\n </div>\r\n </template>\r\n <template v-else>\r\n <SgTransition :visible=\"open\" name=\"sg-fade\" :duration=\"300\">\r\n <div class=\"sg-drawer-root\">\r\n <div\r\n v-if=\"mask\"\r\n class=\"sg-drawer-mask\"\r\n @click=\"maskClosable ? onClose() : undefined\"\r\n />\r\n <SgTransition :visible=\"open\" :name=\"transitionName\" :duration=\"300\">\r\n <div\r\n ref=\"trapRef\"\r\n :class=\"drawerClasses\"\r\n :style=\"sizeStyle\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n :aria-labelledby=\"title ? titleId : undefined\"\r\n :aria-describedby=\"bodyId\"\r\n >\r\n <div v-if=\"title || closable\" class=\"sg-drawer-header\">\r\n <div v-if=\"title\" class=\"sg-drawer-title\" :id=\"titleId\">\r\n {{ title }}\r\n </div>\r\n <SgButton\r\n v-if=\"closable\"\r\n type=\"text\"\r\n class=\"sg-drawer-close\"\r\n aria-label=\"Close\"\r\n @click=\"onClose\"\r\n >\r\n ×\r\n </SgButton>\r\n </div>\r\n <div class=\"sg-drawer-body\" :id=\"bodyId\">\r\n <slot />\r\n </div>\r\n <div v-if=\"hasFooterSlot\" class=\"sg-drawer-footer\">\r\n <slot name=\"footer\" />\r\n </div>\r\n </div>\r\n </SgTransition>\r\n </div>\r\n </SgTransition>\r\n </template>\r\n </Teleport>\r\n</template>\r\n","<script lang=\"ts\">\r\nimport { computed, defineComponent, onBeforeUnmount, onMounted, ref, h, type PropType } from 'vue'\r\nimport SgTransition from './Transition.vue'\r\n\r\n/** Visual variant for notification styling and icon. */\r\nexport type NotificationType = 'success' | 'error' | 'warning' | 'info'\r\n\r\n/** Options passed to `notification.open` and shorthand helpers. */\r\nexport interface NotificationConfig {\r\n type?: NotificationType\r\n message: string\r\n description?: string\r\n duration?: number\r\n key?: string\r\n onClose?: () => void\r\n placement?: 'topRight' | 'topLeft' | 'bottomRight' | 'bottomLeft'\r\n}\r\n\r\ninterface NotificationItem extends NotificationConfig {\r\n id: string\r\n}\r\n\r\ntype Listener = (items: NotificationItem[]) => void\r\n\r\nconst listeners = new Set<Listener>()\r\nlet items: NotificationItem[] = []\r\nlet counter = 0\r\n\r\nfunction notifyAll() {\r\n const snapshot = [...items]\r\n for (const fn of [...listeners]) fn(snapshot)\r\n}\r\n\r\nfunction addNotification(config: NotificationConfig) {\r\n const id = config.key ?? `sg-notif-${++counter}`\r\n const item: NotificationItem = { ...config, id }\r\n items = [...items, item]\r\n notifyAll()\r\n const duration = config.duration ?? 4500\r\n if (duration > 0) {\r\n setTimeout(() => removeNotification(id), duration)\r\n }\r\n}\r\n\r\nfunction removeNotification(id: string) {\r\n items = items.filter((i) => i.id !== id)\r\n notifyAll()\r\n}\r\n\r\n/** Imperative notification API. Mirrors React `notification` singleton. */\r\nexport const notification = {\r\n open: (config: NotificationConfig) => addNotification(config),\r\n success: (message: string, description?: string) =>\r\n addNotification({ type: 'success', message, description }),\r\n error: (message: string, description?: string) =>\r\n addNotification({ type: 'error', message, description }),\r\n warning: (message: string, description?: string) =>\r\n addNotification({ type: 'warning', message, description }),\r\n info: (message: string, description?: string) =>\r\n addNotification({ type: 'info', message, description }),\r\n destroy: () => {\r\n items = []\r\n notifyAll()\r\n },\r\n}\r\n\r\n/** Composable returning the same `notification` singleton. */\r\nexport function useNotification() {\r\n return notification\r\n}\r\n\r\nconst TYPE_ICONS: Record<NotificationType, string> = {\r\n success: '✓',\r\n error: '✕',\r\n warning: '⚠',\r\n info: 'ℹ',\r\n}\r\n\r\nexport interface NotificationContainerProps {\r\n /** Which corner this container listens to. @default 'topRight' */\r\n placement?: 'topRight' | 'topLeft' | 'bottomRight' | 'bottomLeft'\r\n /** Strips built-in styles when true. */\r\n unstyled?: boolean\r\n}\r\n\r\n/**\r\n * Subscribes to the global notification store and renders matching toasts.\r\n */\r\nconst NotificationContainer = defineComponent({\r\n name: 'SgNotificationContainer',\r\n props: {\r\n placement: {\r\n type: String as PropType<'topRight' | 'topLeft' | 'bottomRight' | 'bottomLeft'>,\r\n default: 'topRight',\r\n },\r\n unstyled: { type: Boolean, default: false },\r\n },\r\n setup(props) {\r\n const list = ref<NotificationItem[]>([])\r\n const listener: Listener = (next) => {\r\n list.value = next\r\n }\r\n\r\n onMounted(() => {\r\n listeners.add(listener)\r\n list.value = [...items]\r\n })\r\n onBeforeUnmount(() => {\r\n listeners.delete(listener)\r\n })\r\n\r\n const filtered = computed(() =>\r\n list.value.filter((i) => (i.placement ?? 'topRight') === props.placement),\r\n )\r\n\r\n const containerClass = computed(() =>\r\n props.unstyled\r\n ? undefined\r\n : `sg-notification-container sg-notification-${props.placement}`,\r\n )\r\n\r\n const close = (item: NotificationItem) => {\r\n removeNotification(item.id)\r\n item.onClose?.()\r\n }\r\n\r\n return () => {\r\n if (filtered.value.length === 0) return null\r\n return h(\r\n 'div',\r\n { class: containerClass.value },\r\n filtered.value.map((item) => {\r\n const type = item.type ?? 'info'\r\n const transitionName = props.placement.includes('Right')\r\n ? 'sg-slide-right'\r\n : 'sg-slide-left'\r\n\r\n const card = props.unstyled\r\n ? h('div', { role: 'alert' }, [\r\n h('span', TYPE_ICONS[type]),\r\n h('span', item.message),\r\n item.description ? h('div', item.description) : null,\r\n h(\r\n 'button',\r\n { type: 'button', onClick: () => close(item) },\r\n '×',\r\n ),\r\n ])\r\n : h(\r\n 'div',\r\n {\r\n class: `sg-notification sg-notification-${type}`,\r\n role: 'alert',\r\n },\r\n [\r\n h('div', { class: 'sg-notification-icon' }, TYPE_ICONS[type]),\r\n h('div', { class: 'sg-notification-content' }, [\r\n h(\r\n 'div',\r\n { class: 'sg-notification-message' },\r\n item.message,\r\n ),\r\n item.description\r\n ? h(\r\n 'div',\r\n { class: 'sg-notification-description' },\r\n item.description,\r\n )\r\n : null,\r\n ]),\r\n h(\r\n 'button',\r\n {\r\n class: 'sg-notification-close',\r\n type: 'button',\r\n 'aria-label': 'Close',\r\n onClick: () => close(item),\r\n },\r\n '×',\r\n ),\r\n ],\r\n )\r\n\r\n return h(\r\n SgTransition,\r\n {\r\n key: item.id,\r\n visible: true,\r\n name: transitionName,\r\n unmountOnExit: false,\r\n },\r\n { default: () => h('div', card) },\r\n )\r\n }),\r\n )\r\n }\r\n },\r\n})\r\n\r\nexport { NotificationContainer }\r\nexport default NotificationContainer\r\n</script>\r\n","<script setup lang=\"ts\">\r\nimport { computed, onBeforeUnmount, ref, watch } from 'vue'\r\nimport { useFocusTrap } from '../../composables/useFocusTrap'\r\nimport { useConfig } from './ConfigProvider.vue'\r\nimport SgButton from './Button.vue'\r\nimport SgTransition from './Transition.vue'\r\n\r\nlet uid = 0\r\nfunction genId() {\r\n return `sg-popconfirm-${++uid}`\r\n}\r\n\r\nexport interface PopconfirmProps {\r\n /** Main confirmation question or summary. */\r\n title: string\r\n /** Optional supporting text below the title. */\r\n description?: string\r\n /** Label for the confirm action button. @default 'Yes' */\r\n okText?: string\r\n /** Label for the cancel action button. @default 'No' */\r\n cancelText?: string\r\n /** Popover position relative to the trigger. @default 'top' */\r\n placement?: 'top' | 'bottom' | 'left' | 'right'\r\n /** When `true`, the trigger does not open the popconfirm. */\r\n disabled?: boolean\r\n /** Strips built-in styles when true. */\r\n unstyled?: boolean\r\n}\r\n\r\nconst props = withDefaults(defineProps<PopconfirmProps>(), {\r\n placement: 'top',\r\n disabled: false,\r\n})\r\n\r\nconst emit = defineEmits<{\r\n (e: 'confirm'): void\r\n (e: 'cancel'): void\r\n}>()\r\n\r\ndefineSlots<{\r\n default(props: Record<string, never>): unknown\r\n}>()\r\n\r\nconst cfg = useConfig()\r\nconst okText = computed(\r\n () => props.okText ?? cfg.value.locale?.popconfirm?.okText ?? 'Yes',\r\n)\r\nconst cancelText = computed(\r\n () => props.cancelText ?? cfg.value.locale?.popconfirm?.cancelText ?? 'No',\r\n)\r\n\r\nconst open = ref(false)\r\nconst wrapperRef = ref<HTMLElement | null>(null)\r\nconst trapRef = useFocusTrap(open)\r\nconst popconfirmId = genId()\r\n\r\nfunction handleTrigger() {\r\n if (!props.disabled) open.value = !open.value\r\n}\r\n\r\nfunction handleConfirm() {\r\n open.value = false\r\n emit('confirm')\r\n}\r\n\r\nfunction handleCancel() {\r\n open.value = false\r\n emit('cancel')\r\n}\r\n\r\nfunction handleDocumentClick(e: MouseEvent) {\r\n if (wrapperRef.value && !wrapperRef.value.contains(e.target as Node)) {\r\n open.value = false\r\n }\r\n}\r\n\r\nwatch(\r\n open,\r\n (next) => {\r\n if (next) document.addEventListener('mousedown', handleDocumentClick)\r\n else document.removeEventListener('mousedown', handleDocumentClick)\r\n },\r\n { immediate: true },\r\n)\r\n\r\nonBeforeUnmount(() => {\r\n document.removeEventListener('mousedown', handleDocumentClick)\r\n})\r\n\r\nconst popoverClasses = computed(\r\n () => `sg-popconfirm sg-popconfirm-${props.placement}`,\r\n)\r\n</script>\r\n\r\n<template>\r\n <div\r\n ref=\"wrapperRef\"\r\n :class=\"unstyled ? '' : 'sg-popconfirm-wrapper'\"\r\n :style=\"unstyled ? { position: 'relative', display: 'inline-block' } : undefined\"\r\n >\r\n <div\r\n :aria-describedby=\"open ? popconfirmId : undefined\"\r\n style=\"display: inline-block\"\r\n @click=\"handleTrigger\"\r\n >\r\n <slot />\r\n </div>\r\n <template v-if=\"unstyled\">\r\n <div v-if=\"open\" :id=\"popconfirmId\" role=\"alertdialog\">\r\n <div>{{ title }}</div>\r\n <div v-if=\"description\">{{ description }}</div>\r\n <button type=\"button\" @click=\"handleCancel\">{{ cancelText }}</button>\r\n <button type=\"button\" @click=\"handleConfirm\">{{ okText }}</button>\r\n </div>\r\n </template>\r\n <template v-else>\r\n <SgTransition :visible=\"open\" name=\"sg-fade\">\r\n <div\r\n ref=\"trapRef\"\r\n :id=\"popconfirmId\"\r\n role=\"alertdialog\"\r\n :class=\"popoverClasses\"\r\n >\r\n <div class=\"sg-popconfirm-arrow\" />\r\n <div class=\"sg-popconfirm-inner\">\r\n <div class=\"sg-popconfirm-title\">\r\n <span class=\"sg-popconfirm-icon\">⚠</span>\r\n {{ title }}\r\n </div>\r\n <div v-if=\"description\" class=\"sg-popconfirm-description\">\r\n {{ description }}\r\n </div>\r\n <div class=\"sg-popconfirm-buttons\">\r\n <SgButton size=\"small\" @click=\"handleCancel\">{{ cancelText }}</SgButton>\r\n <SgButton size=\"small\" type=\"primary\" @click=\"handleConfirm\">{{ okText }}</SgButton>\r\n </div>\r\n </div>\r\n </div>\r\n </SgTransition>\r\n </template>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport SgTransition from './Transition.vue'\n\nlet uid = 0\nfunction genId() {\n return `sg-tooltip-${++uid}`\n}\n\nexport interface TooltipProps {\n /**\n * Plain-text content shown in the tooltip.\n * For rich content, use the `title` slot instead — when present, the slot\n * takes precedence and may render any VNodes.\n */\n title?: string\n /** Tooltip position relative to the trigger. @default 'top' */\n placement?: 'top' | 'bottom' | 'left' | 'right'\n /** Strips built-in styles when true. */\n unstyled?: boolean\n}\n\nwithDefaults(defineProps<TooltipProps>(), {\n placement: 'top',\n title: '',\n})\n\ndefineSlots<{\n default(props: Record<string, never>): unknown\n title(props: Record<string, never>): unknown\n}>()\n\nconst visible = ref(false)\nconst tooltipId = genId()\n\nfunction show() {\n visible.value = true\n}\n\nfunction hide() {\n visible.value = false\n}\n</script>\n\n<template>\n <span\n v-if=\"unstyled\"\n :class=\"undefined\"\n style=\"position: relative; display: inline-block\"\n @mouseenter=\"show\"\n @mouseleave=\"hide\"\n >\n <span\n :aria-describedby=\"visible ? tooltipId : undefined\"\n style=\"display: inline-block\"\n @focusin=\"show\"\n @focusout=\"hide\"\n >\n <slot />\n </span>\n <span v-if=\"visible\" :id=\"tooltipId\" role=\"tooltip\">\n <slot name=\"title\">{{ title }}</slot>\n </span>\n </span>\n <span\n v-else\n class=\"sg-tooltip-wrapper\"\n :aria-describedby=\"visible ? tooltipId : undefined\"\n @mouseenter=\"show\"\n @mouseleave=\"hide\"\n >\n <span style=\"display: inline-block\" @focusin=\"show\" @focusout=\"hide\">\n <slot />\n </span>\n <SgTransition :visible=\"visible\" name=\"sg-fade\">\n <span :id=\"tooltipId\" role=\"tooltip\" :class=\"`sg-tooltip sg-tooltip-${placement}`\">\n <span class=\"sg-tooltip-content\">\n <slot name=\"title\">{{ title }}</slot>\n </span>\n <span class=\"sg-tooltip-arrow\" />\n </span>\n </SgTransition>\n </span>\n</template>\n","<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport { useConfigWithDefaults } from './ConfigProvider.vue'\r\nimport type { SizeType } from '../../types'\r\n\r\nexport interface ProgressProps {\r\n /** Completion value from 0 to 100 (clamped). */\r\n percent: number\r\n /** Renders a horizontal bar or circular SVG progress. @default 'line' */\r\n type?: 'line' | 'circle'\r\n /** Visual state; `normal` becomes success at 100%. @default 'normal' */\r\n status?: 'normal' | 'success' | 'error' | 'active'\r\n /** Shows percentage text next to or inside the indicator. @default true */\r\n showInfo?: boolean\r\n /** Bar or circle stroke thickness in pixels. */\r\n strokeWidth?: number\r\n /** Custom color for the filled portion. */\r\n strokeColor?: string\r\n /** Component size variant. */\r\n size?: SizeType\r\n /** SVG width/height for circle type. @default 120 */\r\n width?: number\r\n /** Strips built-in styles when true. */\r\n unstyled?: boolean\r\n}\r\n\r\nconst props = withDefaults(defineProps<ProgressProps>(), {\r\n type: 'line',\r\n status: 'normal',\r\n showInfo: true,\r\n width: 120,\r\n})\r\n\r\nconst { resolvedSize } = useConfigWithDefaults({ size: undefined }, {})\r\nconst realSize = computed<SizeType>(() => props.size ?? resolvedSize.value)\r\nconst progressSize = computed(() => (realSize.value === 'small' ? 'small' : 'default'))\r\n\r\nconst clampedPercent = computed(() => Math.min(100, Math.max(0, props.percent)))\r\nconst resolvedStatus = computed(() =>\r\n clampedPercent.value >= 100 && props.status === 'normal' ? 'success' : props.status,\r\n)\r\n\r\nconst lineClasses = computed(() =>\r\n [\r\n 'sg-progress',\r\n 'sg-progress-line',\r\n `sg-progress-${resolvedStatus.value}`,\r\n `sg-progress-${progressSize.value}`,\r\n ].join(' '),\r\n)\r\n\r\nconst circleClasses = computed(() =>\r\n ['sg-progress', 'sg-progress-circle', `sg-progress-${resolvedStatus.value}`].join(' '),\r\n)\r\n\r\nconst barHeight = computed(() => props.strokeWidth ?? (progressSize.value === 'small' ? 6 : 8))\r\n\r\nconst circle = computed(() => {\r\n const sw = props.strokeWidth ?? 6\r\n const radius = (props.width - sw) / 2\r\n const circumference = 2 * Math.PI * radius\r\n const offset = circumference - (clampedPercent.value / 100) * circumference\r\n return { sw, radius, circumference, offset }\r\n})\r\n</script>\r\n\r\n<template>\r\n <div\r\n v-if=\"unstyled\"\r\n role=\"progressbar\"\r\n :aria-valuenow=\"clampedPercent\"\r\n >\r\n <div v-if=\"type === 'line'\" :style=\"{ width: '100%', height: `${strokeWidth ?? 8}px`, background: '#eee' }\">\r\n <div :style=\"{ width: `${clampedPercent}%`, height: '100%', background: strokeColor ?? '#1677ff' }\" />\r\n </div>\r\n <span v-else>{{ clampedPercent }}%</span>\r\n </div>\r\n <div\r\n v-else-if=\"type === 'circle'\"\r\n :class=\"circleClasses\"\r\n role=\"progressbar\"\r\n :aria-valuenow=\"clampedPercent\"\r\n >\r\n <svg :width=\"width\" :height=\"width\" :viewBox=\"`0 0 ${width} ${width}`\">\r\n <circle\r\n class=\"sg-progress-circle-trail\"\r\n :cx=\"width / 2\"\r\n :cy=\"width / 2\"\r\n :r=\"circle.radius\"\r\n :stroke-width=\"circle.sw\"\r\n fill=\"none\"\r\n />\r\n <circle\r\n class=\"sg-progress-circle-path\"\r\n :cx=\"width / 2\"\r\n :cy=\"width / 2\"\r\n :r=\"circle.radius\"\r\n :stroke-width=\"circle.sw\"\r\n fill=\"none\"\r\n :stroke-dasharray=\"circle.circumference\"\r\n :stroke-dashoffset=\"circle.offset\"\r\n stroke-linecap=\"round\"\r\n :style=\"strokeColor ? { stroke: strokeColor } : undefined\"\r\n :transform=\"`rotate(-90 ${width / 2} ${width / 2})`\"\r\n />\r\n </svg>\r\n <span v-if=\"showInfo\" class=\"sg-progress-circle-text\">{{ clampedPercent }}%</span>\r\n </div>\r\n <div\r\n v-else\r\n :class=\"lineClasses\"\r\n role=\"progressbar\"\r\n :aria-valuenow=\"clampedPercent\"\r\n >\r\n <div class=\"sg-progress-outer\">\r\n <div class=\"sg-progress-inner\" :style=\"{ height: `${barHeight}px` }\">\r\n <div\r\n class=\"sg-progress-bg\"\r\n :style=\"{\r\n width: `${clampedPercent}%`,\r\n ...(strokeColor ? { background: strokeColor } : {}),\r\n }\"\r\n />\r\n </div>\r\n </div>\r\n <span v-if=\"showInfo\" class=\"sg-progress-text\">{{ clampedPercent }}%</span>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { computed, defineComponent, h, useSlots } from 'vue'\r\n\r\nexport interface ResultProps {\r\n /** Outcome type controlling default icon and styling. */\r\n status: 'success' | 'error' | 'info' | 'warning' | '404' | '403' | '500'\r\n /** Primary heading for the result. */\r\n title: string\r\n /** Secondary explanatory text below the title. */\r\n subTitle?: string\r\n /** Strips built-in styles when true. */\r\n unstyled?: boolean\r\n}\r\n\r\nconst props = defineProps<ResultProps>()\r\n\r\ndefineSlots<{\r\n default(props: Record<string, never>): unknown\r\n icon(props: Record<string, never>): unknown\r\n extra(props: Record<string, never>): unknown\r\n}>()\r\n\r\nconst slots = useSlots()\r\nconst hasCustomIcon = computed(() => Boolean(slots.icon))\r\nconst hasExtra = computed(() => Boolean(slots.extra))\r\nconst hasChildren = computed(() => Boolean(slots.default))\r\n\r\nconst STATUS_COLOR: Record<string, string> = {\r\n success: 'var(--sg-color-success)',\r\n error: 'var(--sg-color-error)',\r\n info: 'var(--sg-color-primary)',\r\n warning: 'var(--sg-color-warning)',\r\n '404': 'var(--sg-color-text-tertiary)',\r\n '403': 'var(--sg-color-text-tertiary)',\r\n '500': 'var(--sg-color-text-tertiary)',\r\n}\r\n\r\nconst iconColor = computed(() => STATUS_COLOR[props.status])\r\nconst rootClasses = computed(() => `sg-result sg-result-${props.status}`)\r\n\r\nconst DefaultIcon = defineComponent({\r\n name: 'SgResultDefaultIcon',\r\n props: { status: { type: String, required: true } },\r\n setup(p) {\r\n return () => {\r\n const status = p.status\r\n const common = {\r\n viewBox: '64 64 896 896',\r\n width: '72',\r\n height: '72',\r\n fill: 'currentColor',\r\n }\r\n if (status === 'success') {\r\n return h('svg', common, [\r\n h('path', {\r\n d: 'M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm193.5 301.7l-210.6 292a31.8 31.8 0 01-51.7 0L318.5 484.9c-3.8-5.3 0-12.7 6.5-12.7h46.9c10.2 0 19.9 4.9 25.9 13.3l71.2 98.8 157.2-218c6-8.3 15.6-13.3 25.9-13.3H699c6.5 0 10.3 7.4 6.5 12.7z',\r\n }),\r\n ])\r\n }\r\n if (status === 'error') {\r\n return h('svg', common, [\r\n h('path', {\r\n d: 'M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm165.4 618.2l-66-.3L512 563.4l-99.3 118.4-66.1.3c-4.4 0-8-3.5-8-8 0-1.9.7-3.7 1.9-5.2l130.1-155L340.5 359a8.32 8.32 0 01-1.9-5.2c0-4.4 3.6-8 8-8l66.1.3L512 464.6l99.3-118.4 66-.3c4.4 0 8 3.5 8 8 0 1.9-.7 3.7-1.9 5.2L553.5 514l130 155c1.2 1.5 1.9 3.3 1.9 5.2 0 4.4-3.6 8-8 8z',\r\n }),\r\n ])\r\n }\r\n if (status === 'info') {\r\n return h('svg', common, [\r\n h('path', {\r\n d: 'M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm32 664c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V456c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v272zm-32-344a48.01 48.01 0 010-96 48.01 48.01 0 010 96z',\r\n }),\r\n ])\r\n }\r\n if (status === 'warning') {\r\n return h('svg', common, [\r\n h('path', {\r\n d: 'M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm-32 232c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v272c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V296zm32 440a48.01 48.01 0 010-96 48.01 48.01 0 010 96z',\r\n }),\r\n ])\r\n }\r\n return h(\r\n 'svg',\r\n {\r\n viewBox: '0 0 252 294',\r\n width: '252',\r\n height: '294',\r\n fill: 'none',\r\n xmlns: 'http://www.w3.org/2000/svg',\r\n },\r\n [\r\n h(\r\n 'text',\r\n {\r\n x: '50%',\r\n y: '50%',\r\n 'dominant-baseline': 'middle',\r\n 'text-anchor': 'middle',\r\n fill: 'currentColor',\r\n 'font-size': '80',\r\n 'font-weight': 'bold',\r\n opacity: '0.25',\r\n },\r\n status,\r\n ),\r\n ],\r\n )\r\n }\r\n },\r\n})\r\n</script>\r\n\r\n<template>\r\n <div v-if=\"unstyled\" role=\"status\" aria-live=\"polite\">\r\n <div>\r\n <slot v-if=\"hasCustomIcon\" name=\"icon\" />\r\n <DefaultIcon v-else :status=\"status\" />\r\n </div>\r\n <div>{{ title }}</div>\r\n <div v-if=\"subTitle\">{{ subTitle }}</div>\r\n <div v-if=\"hasExtra\"><slot name=\"extra\" /></div>\r\n <slot />\r\n </div>\r\n <div\r\n v-else\r\n :class=\"rootClasses\"\r\n role=\"status\"\r\n aria-live=\"polite\"\r\n >\r\n <div class=\"sg-result-icon\" :style=\"{ color: iconColor }\">\r\n <slot v-if=\"hasCustomIcon\" name=\"icon\" />\r\n <DefaultIcon v-else :status=\"status\" />\r\n </div>\r\n <div class=\"sg-result-title\">{{ title }}</div>\r\n <div v-if=\"subTitle\" class=\"sg-result-subtitle\">{{ subTitle }}</div>\r\n <div v-if=\"hasExtra\" class=\"sg-result-extra\"><slot name=\"extra\" /></div>\r\n <div v-if=\"hasChildren\" class=\"sg-result-content\"><slot /></div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { computed, defineComponent, h, useSlots } from 'vue'\r\nimport { useConfig } from './ConfigProvider.vue'\r\n\r\nexport interface EmptyProps {\r\n /**\r\n * Description text below the image. Pass `null` to hide. Defaults to \"No Data\"\r\n * (or `locale.empty.description` if provided).\r\n */\r\n description?: string | null\r\n /** Strips built-in styles when true. */\r\n unstyled?: boolean\r\n}\r\n\r\nconst props = defineProps<EmptyProps>()\r\n\r\ndefineSlots<{\r\n default(props: Record<string, never>): unknown\r\n image(props: Record<string, never>): unknown\r\n}>()\r\n\r\nconst slots = useSlots()\r\nconst cfg = useConfig()\r\n\r\nconst description = computed(() => {\r\n if (props.description === null) return null\r\n if (props.description !== undefined) return props.description\r\n return cfg.value.locale?.empty?.description ?? 'No Data'\r\n})\r\n\r\nconst hasChildren = computed(() => Boolean(slots.default))\r\nconst hasCustomImage = computed(() => Boolean(slots.image))\r\n\r\nconst DefaultEmptyImage = defineComponent({\r\n name: 'SgEmptyDefaultImage',\r\n setup() {\r\n return () =>\r\n h(\r\n 'svg',\r\n {\r\n width: '64',\r\n height: '41',\r\n viewBox: '0 0 64 41',\r\n xmlns: 'http://www.w3.org/2000/svg',\r\n },\r\n [\r\n h(\r\n 'g',\r\n { fill: 'none', 'fill-rule': 'evenodd', transform: 'translate(0 1)' },\r\n [\r\n h('ellipse', {\r\n cx: '32',\r\n cy: '33',\r\n rx: '32',\r\n ry: '7',\r\n fill: 'currentColor',\r\n opacity: '0.08',\r\n }),\r\n h(\r\n 'g',\r\n {\r\n 'fill-rule': 'nonzero',\r\n stroke: 'currentColor',\r\n 'stroke-opacity': '0.25',\r\n },\r\n [\r\n h('path', {\r\n d: 'M55 12.76L44.854 1.258C44.367.474 43.656 0 42.907 0H21.093c-.749 0-1.46.474-1.947 1.257L9 12.761V22h46v-9.24z',\r\n }),\r\n h('path', {\r\n d: 'M41.613 15.931c0-1.605.994-2.93 2.227-2.931H55v18.137C55 33.26 53.68 35 52.05 35H11.95C10.32 35 9 33.259 9 31.137V13h11.16c1.233 0 2.227 1.323 2.227 2.928v.022c0 1.605 1.005 2.901 2.237 2.901h14.752c1.232 0 2.237-1.308 2.237-2.913v-.007z',\r\n fill: 'currentColor',\r\n opacity: '0.08',\r\n }),\r\n ],\r\n ),\r\n ],\r\n ),\r\n ],\r\n )\r\n },\r\n})\r\n</script>\r\n\r\n<template>\r\n <div v-if=\"unstyled\" role=\"status\">\r\n <div>\r\n <slot v-if=\"hasCustomImage\" name=\"image\" />\r\n <DefaultEmptyImage v-else />\r\n </div>\r\n <p v-if=\"description !== null\">{{ description }}</p>\r\n <slot />\r\n </div>\r\n <div v-else class=\"sg-empty\" role=\"status\">\r\n <div class=\"sg-empty-image\">\r\n <slot v-if=\"hasCustomImage\" name=\"image\" />\r\n <DefaultEmptyImage v-else />\r\n </div>\r\n <p v-if=\"description !== null\" class=\"sg-empty-description\">{{ description }}</p>\r\n <div v-if=\"hasChildren\" class=\"sg-empty-footer\"><slot /></div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\n\r\nexport interface SkeletonAvatar {\r\n size?: number\r\n shape?: 'circle' | 'square'\r\n}\r\n\r\nexport interface SkeletonTitle {\r\n width?: number | string\r\n}\r\n\r\nexport interface SkeletonParagraph {\r\n rows?: number\r\n width?: Array<number | string>\r\n}\r\n\r\nexport interface SkeletonProps {\r\n /** Enables a shimmering animation. @default false */\r\n active?: boolean\r\n /** Shows an avatar block; pass an object for `size` and `shape`. */\r\n avatar?: boolean | SkeletonAvatar\r\n /** Shows a title bar; pass an object for custom `width`. @default true */\r\n title?: boolean | SkeletonTitle\r\n /** Shows paragraph lines; pass an object for `rows` and per-line `width`. @default true */\r\n paragraph?: boolean | SkeletonParagraph\r\n /** When false, renders default slot instead of the skeleton. @default true */\r\n loading?: boolean\r\n /** Strips built-in styles when true. */\r\n unstyled?: boolean\r\n}\r\n\r\nconst props = withDefaults(defineProps<SkeletonProps>(), {\r\n active: false,\r\n title: true,\r\n paragraph: true,\r\n loading: true,\r\n})\r\n\r\ndefineSlots<{\r\n default(props: Record<string, never>): unknown\r\n}>()\r\n\r\nconst avatarSize = computed(() =>\r\n typeof props.avatar === 'object' ? props.avatar.size ?? 40 : 40,\r\n)\r\nconst avatarShape = computed(() =>\r\n typeof props.avatar === 'object' ? props.avatar.shape ?? 'circle' : 'circle',\r\n)\r\nconst titleWidth = computed<string | number>(() =>\r\n typeof props.title === 'object' ? props.title.width ?? '38%' : '38%',\r\n)\r\nconst rows = computed(() =>\r\n typeof props.paragraph === 'object' ? props.paragraph.rows ?? 3 : 3,\r\n)\r\nconst rowWidths = computed(() =>\r\n typeof props.paragraph === 'object' ? props.paragraph.width : undefined,\r\n)\r\n\r\nfunction getRowWidth(index: number, total: number): string | number {\r\n const widths = rowWidths.value\r\n if (widths && widths[index] !== undefined) return widths[index]\r\n if (index === total - 1) return '61%'\r\n return '100%'\r\n}\r\n\r\nfunction toCss(w: string | number): string {\r\n return typeof w === 'number' ? `${w}px` : w\r\n}\r\n\r\nconst rootClasses = computed(() =>\r\n [\r\n 'sg-skeleton',\r\n props.active ? 'sg-skeleton-active' : '',\r\n props.avatar ? 'sg-skeleton-with-avatar' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' '),\r\n)\r\n</script>\r\n\r\n<template>\r\n <slot v-if=\"!loading\" />\r\n <div\r\n v-else-if=\"unstyled\"\r\n aria-busy=\"true\"\r\n aria-label=\"Loading\"\r\n >\r\n <div\r\n v-if=\"avatar\"\r\n :style=\"{ width: `${avatarSize}px`, height: `${avatarSize}px` }\"\r\n />\r\n <div>\r\n <div v-if=\"title\" :style=\"{ width: toCss(titleWidth), height: '16px' }\" />\r\n <template v-if=\"paragraph\">\r\n <div\r\n v-for=\"i in rows\"\r\n :key=\"i\"\r\n :style=\"{ width: toCss(getRowWidth(i - 1, rows)), height: '16px' }\"\r\n />\r\n </template>\r\n </div>\r\n </div>\r\n <div\r\n v-else\r\n :class=\"rootClasses\"\r\n aria-busy=\"true\"\r\n aria-label=\"Loading\"\r\n >\r\n <div v-if=\"avatar\" class=\"sg-skeleton-header\">\r\n <span\r\n :class=\"['sg-skeleton-avatar', `sg-skeleton-avatar-${avatarShape}`]\"\r\n :style=\"{ width: `${avatarSize}px`, height: `${avatarSize}px` }\"\r\n />\r\n </div>\r\n <div class=\"sg-skeleton-content\">\r\n <div\r\n v-if=\"title\"\r\n class=\"sg-skeleton-title\"\r\n :style=\"{ width: toCss(titleWidth) }\"\r\n />\r\n <ul v-if=\"paragraph\" class=\"sg-skeleton-paragraph\">\r\n <li\r\n v-for=\"i in rows\"\r\n :key=\"i\"\r\n :style=\"{ width: toCss(getRowWidth(i - 1, rows)) }\"\r\n />\r\n </ul>\r\n </div>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport { useConfigWithDefaults } from './ConfigProvider.vue'\nimport type { SizeType } from '../../types'\n\nexport interface TabItem {\n /** Unique key used for selection and ARIA. */\n key: string\n /** Tab label in the tab list. */\n label: string\n /** Panel body shown when this tab is active. */\n content?: string\n /** When true, the tab cannot be activated. */\n disabled?: boolean\n /** When true, shows a spinner and blocks activation until cleared. */\n loading?: boolean\n}\n\nexport interface TabsProps {\n /** Visual chrome. @default 'card' */\n type?: 'line' | 'card'\n /** Tab definitions. */\n items: TabItem[]\n /** Controlled active tab key. */\n activeKey?: string\n /** Initial active tab when uncontrolled. */\n defaultActiveKey?: string\n /** Component size variant. */\n size?: SizeType\n /** Strips built-in styles when true. */\n unstyled?: boolean\n}\n\nconst props = withDefaults(defineProps<TabsProps>(), {\n type: 'card',\n})\n\nconst emit = defineEmits<{\n (e: 'change', key: string): void\n}>()\n\ndefineSlots<{\n default(props: { activeKey: string }): unknown\n tab(props: { item: TabItem }): unknown\n panel(props: { item: TabItem }): unknown\n}>()\n\nconst { resolvedSize } = useConfigWithDefaults({ size: undefined }, {})\nconst realSize = computed<SizeType>(() => props.size ?? resolvedSize.value)\n\nconst internal = ref(props.activeKey ?? props.defaultActiveKey ?? props.items[0]?.key ?? '')\nconst currentKey = computed(() => props.activeKey ?? internal.value)\nconst activeItem = computed(() => props.items.find((i) => i.key === currentKey.value))\n\nfunction setKey(key: string, disabled?: boolean, loading?: boolean) {\n if (disabled || loading) return\n internal.value = key\n emit('change', key)\n}\n\nfunction onKeyDown(e: KeyboardEvent, item: TabItem) {\n const enabled = props.items.filter((i) => !i.disabled && !i.loading)\n if (enabled.length === 0) return\n const cur = enabled.findIndex((i) => i.key === item.key)\n if (e.key === 'ArrowRight' || e.key === 'ArrowDown') {\n e.preventDefault()\n const next = enabled[(cur + 1) % enabled.length]\n if (next) setKey(next.key)\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') {\n e.preventDefault()\n const prev = enabled[(cur - 1 + enabled.length) % enabled.length]\n if (prev) setKey(prev.key)\n } else if (e.key === 'Home') {\n e.preventDefault()\n setKey(enabled[0].key)\n } else if (e.key === 'End') {\n e.preventDefault()\n setKey(enabled[enabled.length - 1].key)\n }\n}\n\nconst rootClasses = computed(() =>\n [\n 'sg-tabs',\n `sg-tabs-${realSize.value}`,\n props.type === 'line' ? 'sg-tabs-line' : 'sg-tabs-card',\n ].join(' '),\n)\n</script>\n\n<template>\n <div v-if=\"unstyled\">\n <div role=\"tablist\">\n <button\n v-for=\"item in items\"\n :key=\"item.key\"\n type=\"button\"\n role=\"tab\"\n :aria-selected=\"item.key === currentKey\"\n :disabled=\"item.disabled || item.loading\"\n @click=\"setKey(item.key, item.disabled, item.loading)\"\n >\n <slot name=\"tab\" :item=\"item\">{{ item.label }}</slot>\n <span v-if=\"item.loading\" class=\"sg-spin sg-spin-small\" aria-hidden=\"true\" />\n </button>\n </div>\n <div role=\"tabpanel\">\n <slot v-if=\"activeItem\" name=\"panel\" :item=\"activeItem\">\n {{ activeItem.content }}\n </slot>\n <slot :activeKey=\"currentKey\" />\n </div>\n </div>\n <div v-else :class=\"rootClasses\">\n <div class=\"sg-tabs-nav\" role=\"tablist\">\n <div\n v-for=\"item in items\"\n :key=\"item.key\"\n role=\"tab\"\n :aria-selected=\"item.key === currentKey\"\n :class=\"[\n 'sg-tabs-tab',\n item.key === currentKey ? 'sg-tabs-tab-active' : '',\n item.disabled ? 'sg-tabs-tab-disabled' : '',\n item.loading ? 'sg-tabs-tab-loading' : '',\n ]\"\n :tabindex=\"item.key === currentKey ? 0 : -1\"\n @click=\"setKey(item.key, item.disabled, item.loading)\"\n @keydown=\"onKeyDown($event, item)\"\n >\n <slot name=\"tab\" :item=\"item\">{{ item.label }}</slot>\n <span v-if=\"item.loading && !unstyled\" class=\"sg-spin sg-spin-small\" aria-hidden=\"true\" />\n </div>\n </div>\n <div class=\"sg-tabs-content\" role=\"tabpanel\">\n <slot v-if=\"activeItem\" name=\"panel\" :item=\"activeItem\">\n {{ activeItem.content }}\n </slot>\n <slot :activeKey=\"currentKey\" />\n </div>\n </div>\n</template>\n","<script lang=\"ts\">\nimport {\n computed,\n defineComponent,\n h,\n onBeforeUnmount,\n ref,\n type Component,\n type PropType,\n type VNode,\n type VNodeChild,\n} from 'vue'\n\nexport interface MenuItem {\n /** Unique key for selection and open-state tracking. */\n key: string\n /** Visible label. */\n label: string\n /**\n * Optional leading icon. Accepts any VNode (e.g. created with `h()` or `<component :is>`).\n * Aligns left of the label and inherits the item colour state.\n */\n icon?: VNodeChild\n /** When true, the item cannot be activated. */\n disabled?: boolean\n /** When true, styles the item as a destructive action. */\n danger?: boolean\n /** Nested items for a submenu. */\n children?: MenuItem[]\n /** Renders as a titled group or a non-interactive divider. */\n type?: 'group' | 'divider'\n}\n\nfunction collectNavigable(\n items: MenuItem[],\n openKeys: string[],\n mode: 'vertical' | 'horizontal' | 'inline',\n out: MenuItem[] = [],\n): MenuItem[] {\n for (const item of items) {\n if (item.type === 'divider') continue\n if (item.type === 'group') {\n if (item.children) collectNavigable(item.children, openKeys, mode, out)\n continue\n }\n if (item.disabled) continue\n out.push(item)\n if (mode === 'inline' && item.children?.length && openKeys.includes(item.key)) {\n collectNavigable(item.children, openKeys, mode, out)\n }\n }\n return out\n}\n\nfunction findByKey(items: MenuItem[], key: string): MenuItem | null {\n for (const item of items) {\n if (item.key === key && item.type !== 'divider' && item.type !== 'group') return item\n if (item.children) {\n const found = findByKey(item.children, key)\n if (found) return found\n }\n }\n return null\n}\n\nfunction findParentKey(\n items: MenuItem[],\n key: string,\n parent: string | null = null,\n): string | null {\n for (const item of items) {\n if (item.key === key) return parent\n if (item.children) {\n const nextParent = item.type === 'group' ? parent : item.key\n const found = findParentKey(item.children, key, nextParent)\n if (found !== null) return found\n }\n }\n return null\n}\n\ninterface MenuItemRendererProps {\n item: MenuItem\n mode: 'vertical' | 'horizontal' | 'inline'\n selectedKeys: string[]\n openKeys: string[]\n activeKey: string\n inlineCollapsed: boolean\n depth: number\n unstyled: boolean\n onSelect: (key: string) => void\n onToggleOpen: (key: string) => void\n onFocusKey: (key: string) => void\n}\n\nconst StyledMenuItem: Component = defineComponent({\n name: 'SgMenuItemStyled',\n props: {\n item: { type: Object as PropType<MenuItem>, required: true },\n mode: { type: String as PropType<MenuItemRendererProps['mode']>, required: true },\n selectedKeys: { type: Array as PropType<string[]>, required: true },\n openKeys: { type: Array as PropType<string[]>, required: true },\n activeKey: { type: String, required: true },\n inlineCollapsed: { type: Boolean, default: false },\n depth: { type: Number, required: true },\n unstyled: { type: Boolean, default: false },\n onSelect: { type: Function as PropType<(key: string) => void>, required: true },\n onToggleOpen: {\n type: Function as PropType<(key: string) => void>,\n required: true,\n },\n onFocusKey: { type: Function as PropType<(key: string) => void>, required: true },\n },\n setup(p): () => VNode {\n const hoverOpen = ref(false)\n let timer: ReturnType<typeof setTimeout> | undefined\n onBeforeUnmount(() => timer && clearTimeout(timer))\n\n const hasChildren = computed(() => !!(p.item.children && p.item.children.length > 0))\n const isSelected = computed(() => p.selectedKeys.includes(p.item.key))\n const isInlineOpen = computed(() => p.openKeys.includes(p.item.key))\n const showPopover = computed(() => p.mode !== 'inline' && hasChildren.value)\n const showInlineSub = computed(() => p.mode === 'inline' && hasChildren.value)\n\n const itemClasses = computed(() =>\n [\n 'sg-menu-item',\n isSelected.value && !hasChildren.value ? 'sg-menu-item-selected' : '',\n p.item.disabled ? 'sg-menu-item-disabled' : '',\n p.item.danger ? 'sg-menu-item-danger' : '',\n hasChildren.value ? 'sg-menu-submenu' : '',\n ]\n .filter(Boolean)\n .join(' '),\n )\n\n const wrapperClasses = computed(() =>\n [\n hasChildren.value ? 'sg-menu-submenu-wrapper' : '',\n showPopover.value && hoverOpen.value ? 'sg-menu-submenu-open' : '',\n ]\n .filter(Boolean)\n .join(' '),\n )\n\n const paddingLeft = computed(() => {\n return p.mode === 'inline' && !p.inlineCollapsed ? `${24 + p.depth * 24}px` : undefined\n })\n\n function handleMouseEnter() {\n if (!showPopover.value || p.item.disabled) return\n if (timer) clearTimeout(timer)\n hoverOpen.value = true\n }\n\n function handleMouseLeave() {\n if (!showPopover.value) return\n timer = setTimeout(() => (hoverOpen.value = false), 150)\n }\n\n function handleClick() {\n if (p.item.disabled) return\n if (showInlineSub.value) {\n p.onToggleOpen(p.item.key)\n return\n }\n if (!hasChildren.value) p.onSelect(p.item.key)\n }\n\n return () => {\n if (p.item.type === 'divider') {\n return h('li', { class: 'sg-menu-divider', role: 'separator' })\n }\n if (p.item.type === 'group') {\n return h('li', { class: 'sg-menu-group', role: 'group' }, [\n h('div', { class: 'sg-menu-group-title' }, p.item.label),\n h(\n 'ul',\n { class: 'sg-menu-group-list', role: 'menu' },\n (p.item.children ?? []).map((child) =>\n h(StyledMenuItem, {\n key: child.key,\n item: child,\n mode: p.mode,\n selectedKeys: p.selectedKeys,\n openKeys: p.openKeys,\n activeKey: p.activeKey,\n inlineCollapsed: p.inlineCollapsed,\n depth: p.depth,\n unstyled: p.unstyled,\n onSelect: p.onSelect,\n onToggleOpen: p.onToggleOpen,\n onFocusKey: p.onFocusKey,\n }),\n ),\n ),\n ])\n }\n\n const children: VNode[] = []\n\n if (p.item.label !== undefined) {\n const itemEl = h(\n 'div',\n {\n role: 'menuitem',\n 'data-menu-key': p.item.key,\n tabindex: p.activeKey === p.item.key ? 0 : -1,\n 'aria-selected': isSelected.value,\n 'aria-disabled': p.item.disabled || undefined,\n 'aria-haspopup': hasChildren.value ? 'menu' : undefined,\n 'aria-expanded': hasChildren.value\n ? showPopover.value\n ? hoverOpen.value\n : isInlineOpen.value\n : undefined,\n class: itemClasses.value,\n style: { paddingLeft: paddingLeft.value },\n onClick: handleClick,\n onFocus: () => p.onFocusKey(p.item.key),\n },\n [\n p.item.icon != null\n ? h(\n 'span',\n { class: 'sg-menu-item-icon', 'aria-hidden': 'true' },\n // Native HTML elements treat the third arg as children\n // directly — passing the `{ default }` slot object only\n // works for components.\n p.item.icon as VNode | VNode[] | string,\n )\n : null,\n !(p.inlineCollapsed && p.depth === 0)\n ? h('span', { class: 'sg-menu-item-label' }, p.item.label)\n : null,\n hasChildren.value\n ? h('span', {\n class: [\n 'sg-menu-submenu-arrow',\n (showPopover.value ? hoverOpen.value : isInlineOpen.value)\n ? 'sg-menu-submenu-arrow-open'\n : '',\n ]\n .filter(Boolean)\n .join(' '),\n })\n : null,\n ],\n )\n children.push(itemEl)\n }\n\n if (showInlineSub.value) {\n children.push(\n h(\n 'ul',\n {\n class: ['sg-menu-inline-sub', isInlineOpen.value ? 'sg-menu-inline-sub-open' : '']\n .filter(Boolean)\n .join(' '),\n role: 'menu',\n },\n (p.item.children ?? []).map((child) =>\n h(StyledMenuItem, {\n key: child.key,\n item: child,\n mode: p.mode,\n selectedKeys: p.selectedKeys,\n openKeys: p.openKeys,\n activeKey: p.activeKey,\n inlineCollapsed: p.inlineCollapsed,\n depth: p.depth + 1,\n unstyled: p.unstyled,\n onSelect: p.onSelect,\n onToggleOpen: p.onToggleOpen,\n onFocusKey: p.onFocusKey,\n }),\n ),\n ),\n )\n }\n\n if (showPopover.value && hoverOpen.value) {\n children.push(\n h(\n 'ul',\n { class: 'sg-menu-popup', role: 'menu' },\n (p.item.children ?? []).map((child) =>\n h(StyledMenuItem, {\n key: child.key,\n item: child,\n mode: p.mode,\n selectedKeys: p.selectedKeys,\n openKeys: p.openKeys,\n activeKey: p.activeKey,\n inlineCollapsed: false,\n depth: 0,\n unstyled: p.unstyled,\n onSelect: p.onSelect,\n onToggleOpen: p.onToggleOpen,\n onFocusKey: p.onFocusKey,\n }),\n ),\n ),\n )\n }\n\n return h(\n 'li',\n {\n class: wrapperClasses.value,\n onMouseenter: handleMouseEnter,\n onMouseleave: handleMouseLeave,\n },\n children,\n )\n }\n },\n})\n\nexport default defineComponent({\n name: 'SgMenu',\n props: {\n items: { type: Array as PropType<MenuItem[]>, required: true },\n mode: {\n type: String as PropType<'vertical' | 'horizontal' | 'inline'>,\n default: 'vertical',\n },\n selectedKeys: { type: Array as PropType<string[] | undefined>, default: undefined },\n defaultSelectedKeys: { type: Array as PropType<string[]>, default: () => [] },\n openKeys: { type: Array as PropType<string[] | undefined>, default: undefined },\n defaultOpenKeys: { type: Array as PropType<string[]>, default: () => [] },\n inlineCollapsed: { type: Boolean, default: false },\n theme: { type: String as PropType<'light' | 'dark'>, default: 'light' },\n unstyled: { type: Boolean, default: false },\n },\n emits: ['select', 'openChange'],\n setup(props, { emit }) {\n const internalSelected = ref<string[]>(props.selectedKeys ?? props.defaultSelectedKeys)\n const internalOpen = ref<string[]>(props.openKeys ?? props.defaultOpenKeys)\n\n const currentSelected = computed(() => props.selectedKeys ?? internalSelected.value)\n const currentOpen = computed(() => props.openKeys ?? internalOpen.value)\n\n const navigable = computed(() => collectNavigable(props.items, currentOpen.value, props.mode))\n\n const initialActive =\n currentSelected.value.find((k) => navigable.value.some((n) => n.key === k)) ??\n navigable.value[0]?.key ??\n ''\n const activeKey = ref(initialActive)\n\n function handleSelect(key: string) {\n const next = [key]\n internalSelected.value = next\n activeKey.value = key\n emit('select', { key, selectedKeys: next })\n }\n\n function toggleOpen(key: string) {\n const next = currentOpen.value.includes(key)\n ? currentOpen.value.filter((k) => k !== key)\n : [...currentOpen.value, key]\n internalOpen.value = next\n emit('openChange', next)\n }\n\n const rootRef = ref<HTMLUListElement | null>(null)\n\n function focusKey(key: string) {\n activeKey.value = key\n const el = rootRef.value?.querySelector<HTMLElement>(`[data-menu-key=\"${CSS.escape(key)}\"]`)\n el?.focus()\n }\n\n function moveBy(delta: 1 | -1) {\n const list = navigable.value\n if (list.length === 0) return\n const idx = list.findIndex((n) => n.key === activeKey.value)\n const base = idx < 0 ? (delta === 1 ? -1 : 0) : idx\n const next = (base + delta + list.length) % list.length\n focusKey(list[next].key)\n }\n\n function isInlineParentOf(parentKey: string, childKey: string) {\n const parent = findByKey(props.items, parentKey)\n if (!parent?.children) return false\n return parent.children.some((c) => c.key === childKey)\n }\n\n function handleKeyDown(e: KeyboardEvent) {\n const list = navigable.value\n if (list.length === 0) return\n const horizontal = props.mode === 'horizontal'\n const primaryNext = horizontal ? 'ArrowRight' : 'ArrowDown'\n const primaryPrev = horizontal ? 'ArrowLeft' : 'ArrowUp'\n\n switch (e.key) {\n case primaryNext:\n e.preventDefault()\n moveBy(1)\n break\n case primaryPrev:\n e.preventDefault()\n moveBy(-1)\n break\n case 'Home':\n e.preventDefault()\n focusKey(list[0].key)\n break\n case 'End':\n e.preventDefault()\n focusKey(list[list.length - 1].key)\n break\n case 'Enter':\n case ' ': {\n const current = findByKey(props.items, activeKey.value)\n if (!current || current.disabled) return\n e.preventDefault()\n if (current.children?.length) {\n if (props.mode === 'inline') toggleOpen(current.key)\n } else {\n handleSelect(current.key)\n }\n break\n }\n case 'ArrowRight': {\n if (horizontal) return\n const current = findByKey(props.items, activeKey.value)\n if (props.mode === 'inline' && current?.children?.length) {\n e.preventDefault()\n if (!currentOpen.value.includes(current.key)) toggleOpen(current.key)\n else {\n const first = current.children.find((c) => !c.disabled && c.type !== 'divider')\n if (first) focusKey(first.key)\n }\n }\n break\n }\n case 'ArrowLeft': {\n if (horizontal) return\n const current = findByKey(props.items, activeKey.value)\n if (!current) return\n if (\n props.mode === 'inline' &&\n current.children?.length &&\n currentOpen.value.includes(current.key)\n ) {\n e.preventDefault()\n toggleOpen(current.key)\n return\n }\n const parent = findParentKey(props.items, activeKey.value)\n if (parent && isInlineParentOf(parent, activeKey.value) && props.mode === 'inline') {\n e.preventDefault()\n focusKey(parent)\n }\n break\n }\n case 'Escape': {\n const current = findByKey(props.items, activeKey.value)\n const parent = findParentKey(props.items, activeKey.value)\n if (parent && props.mode === 'inline' && currentOpen.value.includes(parent)) {\n e.preventDefault()\n toggleOpen(parent)\n focusKey(parent)\n } else if (\n current?.children?.length &&\n props.mode === 'inline' &&\n currentOpen.value.includes(current.key)\n ) {\n e.preventDefault()\n toggleOpen(current.key)\n }\n break\n }\n }\n }\n\n return () => {\n const rootClasses = props.unstyled\n ? undefined\n : [\n 'sg-menu',\n `sg-menu-${props.mode}`,\n `sg-menu-${props.theme}`,\n props.inlineCollapsed ? 'sg-menu-collapsed' : '',\n ]\n .filter(Boolean)\n .join(' ')\n\n return h(\n 'ul',\n {\n ref: rootRef,\n role: 'menu',\n 'aria-orientation': props.mode === 'horizontal' ? 'horizontal' : 'vertical',\n class: rootClasses,\n onKeydown: handleKeyDown,\n },\n props.items.map((item) =>\n h(StyledMenuItem, {\n key: item.key,\n item,\n mode: props.mode,\n selectedKeys: currentSelected.value,\n openKeys: currentOpen.value,\n activeKey: activeKey.value,\n inlineCollapsed: props.inlineCollapsed,\n depth: 0,\n unstyled: props.unstyled,\n onSelect: handleSelect,\n onToggleOpen: toggleOpen,\n onFocusKey: (k: string) => (activeKey.value = k),\n }),\n ),\n )\n }\n },\n})\n</script>\n","<script setup lang=\"ts\">\nexport interface BreadcrumbItem {\n /** Segment label. */\n title: string\n /** When set, the segment renders as a link with this URL. */\n href?: string\n}\n\nexport interface BreadcrumbProps {\n /** Ordered trail from root to current location. */\n items: BreadcrumbItem[]\n /** Node rendered between segments. @default '/' */\n separator?: string\n /** Strips built-in styles when true. */\n unstyled?: boolean\n}\n\nwithDefaults(defineProps<BreadcrumbProps>(), {\n separator: '/',\n})\n\nconst emit = defineEmits<{\n (e: 'itemClick', item: BreadcrumbItem, index: number): void\n}>()\n\ndefineSlots<{\n item(props: { item: BreadcrumbItem; index: number }): unknown\n}>()\n\nfunction onClick(item: BreadcrumbItem, idx: number, e: Event) {\n if (item.href) {\n // Allow navigation by default; consumers may emit too.\n } else {\n e.preventDefault()\n }\n emit('itemClick', item, idx)\n}\n</script>\n\n<template>\n <nav v-if=\"unstyled\" aria-label=\"Breadcrumb\">\n <span v-for=\"(item, i) in items\" :key=\"i\">\n <a v-if=\"item.href\" :href=\"item.href\" @click=\"onClick(item, i, $event)\">\n <slot name=\"item\" :item=\"item\" :index=\"i\">{{ item.title }}</slot>\n </a>\n <span v-else>\n <slot name=\"item\" :item=\"item\" :index=\"i\">{{ item.title }}</slot>\n </span>\n <span v-if=\"i < items.length - 1\">{{ separator }}</span>\n </span>\n </nav>\n <nav v-else class=\"sg-breadcrumb\" aria-label=\"Breadcrumb\">\n <template v-for=\"(item, i) in items\" :key=\"i\">\n <a\n v-if=\"item.href\"\n class=\"sg-breadcrumb-link\"\n :href=\"item.href\"\n @click=\"onClick(item, i, $event)\"\n >\n <slot name=\"item\" :item=\"item\" :index=\"i\">{{ item.title }}</slot>\n </a>\n <span v-else :class=\"i === items.length - 1 ? 'sg-breadcrumb-current' : 'sg-breadcrumb-link'\">\n <slot name=\"item\" :item=\"item\" :index=\"i\">{{ item.title }}</slot>\n </span>\n <span v-if=\"i < items.length - 1\" class=\"sg-breadcrumb-separator\">{{ separator }}</span>\n </template>\n </nav>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, ref, watch, type PropType } from 'vue'\nimport { useConfigWithDefaults } from './ConfigProvider.vue'\nimport SgTransition from './Transition.vue'\n\nlet uid = 0\nfunction genId() {\n return `sg-dropdown-${++uid}`\n}\n\nexport interface DropdownItem {\n /** Unique key passed when activated. */\n key: string\n /** Visible menu row content. */\n label: string\n /** When true, the row cannot be selected. */\n disabled?: boolean\n /** When true, styles the row as destructive. */\n danger?: boolean\n /** When true, renders a separator instead of a selectable row. */\n divider?: boolean\n}\n\nexport interface DropdownProps {\n items: DropdownItem[]\n trigger?: 'click' | 'hover'\n placement?: 'bottomLeft' | 'bottomRight' | 'topLeft' | 'topRight'\n disabled?: boolean\n unstyled?: boolean\n}\n\nconst props = defineProps({\n items: {\n type: Array as PropType<DropdownItem[]>,\n required: true,\n },\n trigger: {\n type: String as PropType<'click' | 'hover'>,\n default: 'hover',\n },\n placement: {\n type: String as PropType<'bottomLeft' | 'bottomRight' | 'topLeft' | 'topRight'>,\n default: 'bottomLeft',\n },\n disabled: { type: Boolean, default: undefined },\n unstyled: { type: Boolean, default: false },\n})\n\nconst emit = defineEmits<{\n (e: 'select', key: string): void\n}>()\n\ndefineSlots<{\n default(props: Record<string, never>): unknown\n /** Custom row renderer (replaces `item.label` rendering). */\n item(props: { item: DropdownItem; index: number; focused: boolean }): unknown\n}>()\n\nconst { resolvedDisabled } = useConfigWithDefaults({ disabled: undefined }, {})\nconst disabled = computed(() => props.disabled ?? resolvedDisabled.value)\n\nconst open = ref(false)\nconst focusedIndex = ref(-1)\nconst wrapperRef = ref<HTMLElement | null>(null)\nlet timer: ReturnType<typeof setTimeout> | undefined\n\nconst menuId = genId()\n\nfunction getNextMenuIndex(current: number, direction: 1 | -1) {\n const items = props.items\n let next = current\n for (let i = 0; i < items.length; i++) {\n next = (next + direction + items.length) % items.length\n if (!items[next].divider && !items[next].disabled) return next\n }\n return current\n}\n\nfunction handleMouseEnter() {\n if (props.trigger !== 'hover' || disabled.value) return\n if (timer) clearTimeout(timer)\n open.value = true\n}\n\nfunction handleMouseLeave() {\n if (props.trigger !== 'hover') return\n timer = setTimeout(() => (open.value = false), 100)\n}\n\nfunction handleClick() {\n if (props.trigger !== 'click' || disabled.value) return\n open.value = !open.value\n}\n\nfunction handleSelect(item: DropdownItem) {\n if (item.disabled) return\n open.value = false\n emit('select', item.key)\n}\n\nfunction handleKeyDown(e: KeyboardEvent) {\n if (disabled.value) return\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault()\n if (open.value && focusedIndex.value >= 0 && !props.items[focusedIndex.value].divider) {\n handleSelect(props.items[focusedIndex.value])\n } else {\n open.value = !open.value\n }\n break\n case 'Escape':\n e.preventDefault()\n open.value = false\n break\n case 'ArrowDown':\n e.preventDefault()\n if (!open.value) open.value = true\n else focusedIndex.value = getNextMenuIndex(focusedIndex.value, 1)\n break\n case 'ArrowUp':\n e.preventDefault()\n if (!open.value) open.value = true\n else focusedIndex.value = getNextMenuIndex(focusedIndex.value, -1)\n break\n case 'Home':\n if (open.value) {\n e.preventDefault()\n focusedIndex.value = getNextMenuIndex(-1, 1)\n }\n break\n case 'End':\n if (open.value) {\n e.preventDefault()\n focusedIndex.value = getNextMenuIndex(props.items.length, -1)\n }\n break\n }\n}\n\nfunction handleDocumentClick(e: MouseEvent) {\n if (wrapperRef.value && !wrapperRef.value.contains(e.target as Node)) {\n open.value = false\n }\n}\n\nwatch(\n open,\n (next) => {\n if (next) {\n document.addEventListener('mousedown', handleDocumentClick)\n } else {\n focusedIndex.value = -1\n document.removeEventListener('mousedown', handleDocumentClick)\n }\n },\n { immediate: true },\n)\n\nonBeforeUnmount(() => {\n document.removeEventListener('mousedown', handleDocumentClick)\n if (timer) clearTimeout(timer)\n})\n\nconst menuClasses = computed(() => `sg-dropdown sg-dropdown-${props.placement}`)\n</script>\n\n<template>\n <div v-if=\"unstyled\" ref=\"wrapperRef\" style=\"position: relative; display: inline-block\">\n <div @click=\"handleClick\" @mouseenter=\"handleMouseEnter\" @mouseleave=\"handleMouseLeave\">\n <slot />\n </div>\n <div v-if=\"open\" @mouseenter=\"handleMouseEnter\" @mouseleave=\"handleMouseLeave\">\n <template v-for=\"(item, idx) in items\" :key=\"item.key\">\n <hr v-if=\"item.divider\" />\n <div v-else @click=\"handleSelect(item)\">\n <slot name=\"item\" :item=\"item\" :index=\"idx\" :focused=\"idx === focusedIndex\">\n {{ item.label }}\n </slot>\n </div>\n </template>\n </div>\n </div>\n <div\n v-else\n ref=\"wrapperRef\"\n class=\"sg-dropdown-wrapper\"\n @mouseenter=\"handleMouseEnter\"\n @mouseleave=\"handleMouseLeave\"\n >\n <div\n class=\"sg-dropdown-trigger\"\n :aria-expanded=\"open\"\n aria-haspopup=\"menu\"\n :aria-controls=\"menuId\"\n :tabindex=\"disabled ? -1 : 0\"\n @click=\"handleClick\"\n @keydown=\"handleKeyDown\"\n >\n <slot />\n </div>\n <SgTransition :visible=\"open\" name=\"sg-slide-up\">\n <div\n :class=\"menuClasses\"\n role=\"menu\"\n :id=\"menuId\"\n @mouseenter=\"handleMouseEnter\"\n @mouseleave=\"handleMouseLeave\"\n >\n <template v-for=\"(item, idx) in items\" :key=\"item.key\">\n <div v-if=\"item.divider\" class=\"sg-dropdown-divider\" role=\"separator\" />\n <div\n v-else\n role=\"menuitem\"\n :class=\"[\n 'sg-dropdown-item',\n item.disabled ? 'sg-dropdown-item-disabled' : '',\n item.danger ? 'sg-dropdown-item-danger' : '',\n idx === focusedIndex ? 'sg-dropdown-item-focused' : '',\n ]\"\n @click=\"handleSelect(item)\"\n >\n <slot name=\"item\" :item=\"item\" :index=\"idx\" :focused=\"idx === focusedIndex\">\n {{ item.label }}\n </slot>\n </div>\n </template>\n </div>\n </SgTransition>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, getCurrentInstance, useSlots } from 'vue'\nimport { useConfigWithDefaults } from './ConfigProvider.vue'\nimport type { SizeType } from '../../types'\n\nexport interface StepItem {\n /** Primary step title. */\n title: string\n /** Optional secondary text below the title. */\n description?: string\n /** Custom icon glyph (emoji / unicode / short label). Pass `icon` slot for rich content. */\n icon?: string\n /** Overrides auto-derived status from `current` index. */\n status?: 'wait' | 'process' | 'finish' | 'error'\n}\n\nexport interface StepsProps {\n /** Zero-based index of the active (in-progress) step. */\n current: number\n /** Steps in display order. */\n items: StepItem[]\n /** Stack direction. @default 'horizontal' */\n direction?: 'horizontal' | 'vertical'\n /** Component size variant. */\n size?: SizeType\n /** Visual variant. @default 'default' */\n type?: 'default' | 'navigation'\n /** Force-enable / disable click-to-change. When omitted, inferred from\n * the presence of a `change` listener (matches React's `onChange` semantics). */\n clickable?: boolean\n /** Strips built-in styles when true. */\n unstyled?: boolean\n}\n\nconst props = withDefaults(defineProps<StepsProps>(), {\n direction: 'horizontal',\n type: 'default',\n clickable: undefined,\n})\n\nconst emit = defineEmits<{\n (e: 'change', current: number): void\n}>()\n\ndefineSlots<{\n icon(props: { item: StepItem; index: number; status: string }): unknown\n}>()\n\nconst slots = useSlots()\nconst hasIconSlot = computed(() => !!slots.icon)\n\nconst { resolvedSize } = useConfigWithDefaults({ size: undefined }, {})\nconst realSize = computed<SizeType>(() => props.size ?? resolvedSize.value)\nconst stepsSize = computed(() => (realSize.value === 'small' ? 'small' : 'default'))\n\nconst instance = getCurrentInstance()\nconst hasOnChange = computed(() => {\n if (props.clickable !== undefined) return props.clickable\n const vp = instance?.vnode?.props\n return !!(vp && (vp.onChange || vp['onChange']))\n})\n\nfunction resolveStatus(index: number, override?: StepItem['status']): string {\n if (override) return override\n if (index < props.current) return 'finish'\n if (index === props.current) return 'process'\n return 'wait'\n}\n\nconst rootClasses = computed(() =>\n [\n 'sg-steps',\n `sg-steps-${props.direction}`,\n `sg-steps-${stepsSize.value}`,\n props.type === 'navigation' ? 'sg-steps-navigation' : '',\n ]\n .filter(Boolean)\n .join(' '),\n)\n\nfunction itemClasses(status: string, clickable: boolean) {\n return ['sg-steps-item', `sg-steps-item-${status}`, clickable ? 'sg-steps-item-clickable' : '']\n .filter(Boolean)\n .join(' ')\n}\n\nfunction emitChange(i: number) {\n if (!hasOnChange.value) return\n emit('change', i)\n}\n</script>\n\n<template>\n <div v-if=\"unstyled\">\n <div\n v-for=\"(item, i) in items\"\n :key=\"i\"\n :data-status=\"resolveStatus(i, item.status)\"\n @click=\"emitChange(i)\"\n >\n <span>\n <slot name=\"icon\" :item=\"item\" :index=\"i\" :status=\"resolveStatus(i, item.status)\">\n {{ item.icon ?? (resolveStatus(i, item.status) === 'finish' ? '✓' : i + 1) }}\n </slot>\n </span>\n <span>{{ item.title }}</span>\n <span v-if=\"item.description\">{{ item.description }}</span>\n </div>\n </div>\n <div v-else :class=\"rootClasses\" role=\"list\">\n <div\n v-for=\"(item, i) in items\"\n :key=\"i\"\n :class=\"itemClasses(resolveStatus(i, item.status), hasOnChange)\"\n :aria-current=\"resolveStatus(i, item.status) === 'process' ? 'step' : undefined\"\n @click=\"emitChange(i)\"\n >\n <div class=\"sg-steps-item-container\">\n <div class=\"sg-steps-item-icon\">\n <span v-if=\"hasIconSlot || item.icon\" class=\"sg-steps-icon-custom\">\n <slot name=\"icon\" :item=\"item\" :index=\"i\" :status=\"resolveStatus(i, item.status)\">{{\n item.icon\n }}</slot>\n </span>\n <span v-else class=\"sg-steps-icon\">\n <svg\n v-if=\"resolveStatus(i, item.status) === 'finish'\"\n viewBox=\"64 64 896 896\"\n width=\"1em\"\n height=\"1em\"\n fill=\"currentColor\"\n >\n <path\n d=\"M912 190h-69.9c-9.8 0-19.1 4.5-25.1 12.2L404.7 724.5 207 474a32 32 0 00-25.1-12.2H112c-6.7 0-10.4 7.7-6.3 12.9l273.9 347c12.8 16.2 37.4 16.2 50.3 0l488.4-618.9c4.1-5.1.4-12.8-6.3-12.8z\"\n />\n </svg>\n <svg\n v-else-if=\"resolveStatus(i, item.status) === 'error'\"\n viewBox=\"64 64 896 896\"\n width=\"1em\"\n height=\"1em\"\n fill=\"currentColor\"\n >\n <path\n d=\"M563.8 512l262.5-312.9c4.4-5.2.7-13.1-6.1-13.1h-79.8c-4.7 0-9.2 2.1-12.3 5.7L512 449.8 295.9 191.7c-3-3.6-7.5-5.7-12.3-5.7H203.8c-6.8 0-10.5 7.9-6.1 13.1L460.2 512 197.7 824.9A7.95 7.95 0 00203.8 838h79.8c4.7 0 9.2-2.1 12.3-5.7L512 574.1l216.1 258.1c3 3.6 7.5 5.7 12.3 5.7h79.8c6.8 0 10.5-7.9 6.1-13.1L563.8 512z\"\n />\n </svg>\n <template v-else>{{ i + 1 }}</template>\n </span>\n </div>\n <div class=\"sg-steps-item-content\">\n <div class=\"sg-steps-item-title\">\n {{ item.title }}\n <span\n v-if=\"direction === 'horizontal' && i < items.length - 1\"\n class=\"sg-steps-item-tail\"\n />\n </div>\n <div v-if=\"item.description\" class=\"sg-steps-item-description\">\n {{ item.description }}\n </div>\n </div>\n </div>\n <div\n v-if=\"direction === 'vertical' && i < items.length - 1\"\n class=\"sg-steps-item-tail-vertical\"\n />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, ref, useSlots, watch, type PropType } from 'vue'\nimport { useConfigWithDefaults } from './ConfigProvider.vue'\nimport type { SizeType } from '../../types'\n\nexport interface SegmentedOptionObject {\n label: string\n value: string\n /** Optional icon glyph (emoji / short text). Use the named `icon` slot for richer content. */\n icon?: string\n disabled?: boolean\n}\n\nexport type SegmentedOption = string | SegmentedOptionObject\n\nexport interface SegmentedProps {\n options: SegmentedOption[]\n /** Controlled selected value. */\n value?: string\n /** v-model binding (Vue idiom) — alias for `value`. */\n modelValue?: string\n /** Initial value when uncontrolled. */\n defaultValue?: string\n /** Component size variant. */\n size?: SizeType\n /** Disables the control. */\n disabled?: boolean\n /** Stretches the control to full width. */\n block?: boolean\n /** Strips built-in styles when true. */\n unstyled?: boolean\n}\n\nconst props = defineProps({\n options: {\n type: Array as PropType<SegmentedOption[]>,\n required: true,\n },\n value: { type: String, default: undefined },\n modelValue: { type: String, default: undefined },\n defaultValue: { type: String, default: undefined },\n size: { type: String as PropType<SizeType>, default: undefined },\n disabled: { type: Boolean, default: undefined },\n block: { type: Boolean, default: false },\n unstyled: { type: Boolean, default: false },\n})\n\nconst emit = defineEmits<{\n (e: 'change', value: string): void\n (e: 'update:value', value: string): void\n (e: 'update:modelValue', value: string): void\n}>()\n\ndefineSlots<{\n icon(props: { option: SegmentedOptionObject; index: number }): unknown\n}>()\n\nconst slots = useSlots()\nconst hasIconSlot = computed(() => !!slots.icon)\n\nconst { resolvedSize, resolvedDisabled } = useConfigWithDefaults(\n { size: undefined, disabled: undefined },\n {},\n)\nconst realSize = computed<SizeType>(() => props.size ?? resolvedSize.value)\nconst realDisabled = computed(() => props.disabled ?? resolvedDisabled.value)\n\nfunction normalize(opt: SegmentedOption): SegmentedOptionObject {\n if (typeof opt === 'string') return { label: opt, value: opt }\n return opt\n}\n\nconst normalized = computed(() => props.options.map(normalize))\n\nconst initial =\n props.value ?? props.modelValue ?? props.defaultValue ?? normalize(props.options[0])?.value ?? ''\nconst internal = ref<string>(initial)\nwatch(\n () => props.value ?? props.modelValue,\n (v) => {\n if (v !== undefined) internal.value = v\n },\n)\nconst currentValue = computed(() => props.value ?? props.modelValue ?? internal.value)\n\nfunction select(val: string, disabled?: boolean) {\n if (realDisabled.value || disabled) return\n internal.value = val\n emit('change', val)\n emit('update:value', val)\n emit('update:modelValue', val)\n}\n\nconst rootClasses = computed(() =>\n [\n 'sg-segmented',\n `sg-segmented-${realSize.value}`,\n props.block ? 'sg-segmented-block' : '',\n realDisabled.value ? 'sg-segmented-disabled' : '',\n ]\n .filter(Boolean)\n .join(' '),\n)\n</script>\n\n<template>\n <div v-if=\"unstyled\" role=\"radiogroup\">\n <label v-for=\"(opt, i) in normalized\" :key=\"opt.value\">\n <input\n type=\"radio\"\n name=\"sg-segmented\"\n :value=\"opt.value\"\n :checked=\"opt.value === currentValue\"\n :disabled=\"realDisabled || opt.disabled\"\n @change=\"select(opt.value, opt.disabled)\"\n />\n <slot v-if=\"hasIconSlot || opt.icon\" name=\"icon\" :option=\"opt\" :index=\"i\">{{\n opt.icon\n }}</slot>\n {{ opt.label }}\n </label>\n </div>\n <div v-else :class=\"rootClasses\" role=\"radiogroup\">\n <div\n v-for=\"(opt, i) in normalized\"\n :key=\"opt.value\"\n role=\"radio\"\n :aria-checked=\"opt.value === currentValue\"\n :class=\"[\n 'sg-segmented-item',\n opt.value === currentValue ? 'sg-segmented-item-selected' : '',\n opt.disabled ? 'sg-segmented-item-disabled' : '',\n ]\"\n @click=\"select(opt.value, opt.disabled)\"\n >\n <span v-if=\"hasIconSlot || opt.icon\" class=\"sg-segmented-item-icon\">\n <slot name=\"icon\" :option=\"opt\" :index=\"i\">{{ opt.icon }}</slot>\n </span>\n <span class=\"sg-segmented-item-label\">{{ opt.label }}</span>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, useSlots, type CSSProperties } from 'vue'\n\nexport interface BadgeProps {\n /** Numeric value shown in the badge. */\n count?: number\n /** Renders a small dot indicator. */\n dot?: boolean\n /** Maximum count before showing `{overflowCount}+`. @default 99 */\n overflowCount?: number\n /** Show even when count is 0. */\n showZero?: boolean\n /** Custom CSS color. */\n color?: string\n /** Preset status style. */\n status?: 'success' | 'error' | 'warning' | 'processing' | 'default'\n /** Status label text. */\n text?: string\n /** Pixel offset `[right, top]`. */\n offset?: [number, number]\n /** Strips built-in styles when true. */\n unstyled?: boolean\n}\n\nconst props = withDefaults(defineProps<BadgeProps>(), {\n overflowCount: 99,\n})\n\ndefineSlots<{\n default(props: Record<string, never>): unknown\n}>()\n\nconst slots = useSlots()\nconst hasChildren = computed(() => Boolean(slots.default))\n\nconst hasCount = computed(() => props.count !== undefined && (props.count > 0 || props.showZero))\n\nconst displayCount = computed(() => {\n if (!hasCount.value) return null\n return props.count! > props.overflowCount ? `${props.overflowCount}+` : `${props.count}`\n})\n\nconst isStandalone = computed(() => !hasChildren.value && (hasCount.value || Boolean(props.dot)))\n\nconst offsetStyle = computed<CSSProperties | undefined>(() =>\n props.offset && !isStandalone.value\n ? { right: `${-props.offset[0]}px`, marginTop: `${props.offset[1]}px` }\n : undefined,\n)\n\nconst colorStyle = computed<CSSProperties | undefined>(() =>\n props.color ? { background: props.color } : undefined,\n)\n</script>\n\n<template>\n <span v-if=\"unstyled\" style=\"position: relative; display: inline-block\">\n <slot />\n <sup v-if=\"dot || hasCount\">{{ displayCount }}</sup>\n <span v-if=\"status\">{{ text }}</span>\n </span>\n <span v-else-if=\"status && !hasChildren\" class=\"sg-badge-status\">\n <span :class=\"`sg-badge-status-dot sg-badge-status-${status}`\" :style=\"colorStyle\" />\n <span v-if=\"text\" class=\"sg-badge-status-text\">{{ text }}</span>\n </span>\n <span v-else :class=\"['sg-badge', isStandalone ? 'sg-badge-standalone' : null]\">\n <slot />\n <sup\n v-if=\"dot && !hasCount\"\n class=\"sg-badge-dot\"\n :style=\"{ ...(offsetStyle ?? {}), ...(colorStyle ?? {}) }\"\n />\n <sup\n v-if=\"hasCount\"\n class=\"sg-badge-count\"\n :style=\"{ ...(offsetStyle ?? {}), ...(colorStyle ?? {}) }\"\n :aria-label=\"displayCount ?? undefined\"\n >\n {{ displayCount }}\n </sup>\n </span>\n</template>\n","<script setup lang=\"ts\">\r\nimport { computed, type CSSProperties } from 'vue'\r\n\r\nexport interface TagProps {\r\n /** Preset semantic color or any CSS color string. @default 'default' */\r\n color?: 'default' | 'success' | 'error' | 'warning' | 'processing' | string\r\n /** Shows a close control when true. */\r\n closable?: boolean\r\n /** Whether to draw a border. @default true */\r\n bordered?: boolean\r\n /** Strips built-in styles when true. */\r\n unstyled?: boolean\r\n}\r\n\r\nconst props = withDefaults(defineProps<TagProps>(), {\r\n color: 'default',\r\n bordered: true,\r\n})\r\n\r\nconst emit = defineEmits<{\r\n (e: 'close'): void\r\n}>()\r\n\r\ndefineSlots<{\r\n default(props: Record<string, never>): unknown\r\n}>()\r\n\r\nconst PRESET = new Set(['default', 'success', 'error', 'warning', 'processing'])\r\n\r\nconst isPreset = computed(() => PRESET.has(props.color))\r\n\r\nconst classes = computed(() =>\r\n [\r\n 'sg-tag',\r\n isPreset.value ? `sg-tag-${props.color}` : '',\r\n props.bordered ? '' : 'sg-tag-borderless',\r\n ]\r\n .filter(Boolean)\r\n .join(' '),\r\n)\r\n\r\nconst customStyle = computed<CSSProperties | undefined>(() =>\r\n isPreset.value\r\n ? undefined\r\n : { background: props.color, borderColor: props.color, color: '#fff' },\r\n)\r\n\r\nfunction handleClose(e: Event) {\r\n e.stopPropagation()\r\n emit('close')\r\n}\r\n</script>\r\n\r\n<template>\r\n <span v-if=\"unstyled\">\r\n <slot />\r\n <span v-if=\"closable\" role=\"button\" @click=\"handleClose\">×</span>\r\n </span>\r\n <span v-else :class=\"classes\" :style=\"customStyle\">\r\n <slot />\r\n <span\r\n v-if=\"closable\"\r\n class=\"sg-tag-close\"\r\n role=\"button\"\r\n aria-label=\"Close\"\r\n @click=\"handleClose\"\r\n >\r\n ×\r\n </span>\r\n </span>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { computed, useSlots, type CSSProperties } from 'vue'\r\nimport { useConfig } from './ConfigProvider.vue'\r\nimport type { SizeType } from '../../types'\r\n\r\nexport interface AvatarProps {\r\n /** Image URL when displaying a photo avatar. */\r\n src?: string\r\n /** Alt text. */\r\n alt?: string\r\n /** Accessible name. */\r\n ariaLabel?: string\r\n /** Width/height in px or preset size token. */\r\n size?: SizeType | number\r\n /** Outer shape. @default 'circle' */\r\n shape?: 'circle' | 'square'\r\n /** Strips built-in styles when true. */\r\n unstyled?: boolean\r\n}\r\n\r\nconst props = withDefaults(defineProps<AvatarProps>(), {\r\n shape: 'circle',\r\n})\r\n\r\ndefineSlots<{\r\n default(props: Record<string, never>): unknown\r\n icon(props: Record<string, never>): unknown\r\n}>()\r\n\r\nconst cfg = useConfig()\r\nconst sizeMap: Record<string, number> = { small: 24, default: 32, large: 40 }\r\n\r\nconst resolvedSize = computed<SizeType | number>(() =>\r\n props.size ?? cfg.value.size ?? 'middle',\r\n)\r\n\r\nconst avatarSize = computed(() => {\r\n const s = resolvedSize.value\r\n if (typeof s === 'number') return s\r\n return s === 'middle' ? 'default' : s\r\n})\r\n\r\nconst px = computed(() => {\r\n const s = resolvedSize.value\r\n return typeof s === 'number' ? s : sizeMap[avatarSize.value as string]\r\n})\r\n\r\nconst fontSize = computed(() => Math.round(px.value * 0.45))\r\n\r\nconst slots = useSlots()\r\nconst hasIcon = computed(() => Boolean(slots.icon))\r\n\r\nconst classes = computed(() =>\r\n [\r\n 'sg-avatar',\r\n `sg-avatar-${props.shape}`,\r\n typeof resolvedSize.value === 'string' ? `sg-avatar-${avatarSize.value}` : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' '),\r\n)\r\n\r\nconst sizeStyle = computed<CSSProperties>(() => ({\r\n width: `${px.value}px`,\r\n height: `${px.value}px`,\r\n lineHeight: `${px.value}px`,\r\n fontSize: props.src ? undefined : `${fontSize.value}px`,\r\n}))\r\n</script>\r\n\r\n<template>\r\n <span\r\n v-if=\"unstyled\"\r\n role=\"img\"\r\n :aria-label=\"ariaLabel\"\r\n >\r\n <img v-if=\"src\" :src=\"src\" :alt=\"alt\" />\r\n <slot v-else-if=\"hasIcon\" name=\"icon\" />\r\n <slot v-else />\r\n </span>\r\n <span\r\n v-else\r\n :class=\"classes\"\r\n :style=\"sizeStyle\"\r\n role=\"img\"\r\n :aria-label=\"ariaLabel\"\r\n >\r\n <img v-if=\"src\" class=\"sg-avatar-image\" :src=\"src\" :alt=\"alt\" />\r\n <span v-else-if=\"hasIcon\" class=\"sg-avatar-icon\"><slot name=\"icon\" /></span>\r\n <span v-else class=\"sg-avatar-text\"><slot /></span>\r\n </span>\r\n</template>\r\n","<script lang=\"ts\">\r\nimport {\r\n Comment,\r\n Fragment,\r\n Text,\r\n computed,\r\n defineComponent,\r\n h,\r\n onBeforeUnmount,\r\n ref,\r\n watch,\r\n type PropType,\r\n type VNode,\r\n} from 'vue'\r\n\r\nexport interface CarouselProps {\r\n /** Auto-advance slides on an interval. @default false */\r\n autoplay?: boolean\r\n /** Interval in ms between autoplay steps. @default 3000 */\r\n autoplaySpeed?: number\r\n /** Show dot navigation. @default true */\r\n dots?: boolean\r\n /** Where dots are placed. @default 'bottom' */\r\n dotPosition?: 'top' | 'bottom' | 'left' | 'right'\r\n /** Slide transition. @default 'slide' */\r\n effect?: 'slide' | 'fade'\r\n /** Strips built-in styles when true. */\r\n unstyled?: boolean\r\n}\r\n\r\nfunction flatten(nodes: VNode[]): VNode[] {\r\n const out: VNode[] = []\r\n for (const node of nodes) {\r\n if (node.type === Comment) continue\r\n if (node.type === Text) continue\r\n if (node.type === Fragment && Array.isArray(node.children)) {\r\n out.push(...flatten(node.children as VNode[]))\r\n continue\r\n }\r\n out.push(node)\r\n }\r\n return out\r\n}\r\n\r\nexport default defineComponent({\r\n name: 'SgCarousel',\r\n props: {\r\n autoplay: { type: Boolean, default: false },\r\n autoplaySpeed: { type: Number, default: 3000 },\r\n dots: { type: Boolean, default: true },\r\n dotPosition: {\r\n type: String as PropType<'top' | 'bottom' | 'left' | 'right'>,\r\n default: 'bottom',\r\n },\r\n effect: {\r\n type: String as PropType<'slide' | 'fade'>,\r\n default: 'slide',\r\n },\r\n unstyled: { type: Boolean, default: false },\r\n },\r\n setup(props, { slots }) {\r\n const current = ref(0)\r\n const slideCount = ref(0)\r\n let timer: ReturnType<typeof setInterval> | undefined\r\n\r\n function goTo(index: number, total: number) {\r\n if (total === 0) {\r\n current.value = 0\r\n return\r\n }\r\n current.value = ((index % total) + total) % total\r\n }\r\n\r\n function startAutoplay() {\r\n if (timer) clearInterval(timer)\r\n const total = slideCount.value\r\n if (!props.autoplay || total <= 1) return\r\n timer = setInterval(() => goTo(current.value + 1, total), props.autoplaySpeed)\r\n }\r\n\r\n watch(\r\n () => [props.autoplay, props.autoplaySpeed, slideCount.value] as const,\r\n () => startAutoplay(),\r\n )\r\n\r\n onBeforeUnmount(() => {\r\n if (timer) clearInterval(timer)\r\n })\r\n\r\n const isVertical = computed(\r\n () => props.dotPosition === 'left' || props.dotPosition === 'right',\r\n )\r\n\r\n return () => {\r\n const raw = slots.default?.() ?? []\r\n const slides = flatten(raw)\r\n const count = slides.length\r\n if (slideCount.value !== count) {\r\n slideCount.value = count\r\n }\r\n if (current.value >= count && count > 0) {\r\n current.value = count - 1\r\n }\r\n\r\n if (props.unstyled) {\r\n return h('div', null, [\r\n slides[current.value] ? h('div', null, [slides[current.value]]) : null,\r\n props.dots\r\n ? h(\r\n 'div',\r\n null,\r\n slides.map((_, i) =>\r\n h(\r\n 'button',\r\n {\r\n key: i,\r\n type: 'button',\r\n 'aria-current': i === current.value,\r\n onClick: () => goTo(i, count),\r\n },\r\n String(i + 1),\r\n ),\r\n ),\r\n )\r\n : null,\r\n ])\r\n }\r\n\r\n const rootClasses = [\r\n 'sg-carousel',\r\n `sg-carousel-dots-${props.dotPosition}`,\r\n isVertical.value ? 'sg-carousel-vertical' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')\r\n\r\n return h('div', { class: rootClasses }, [\r\n h('div', { class: 'sg-carousel-container' }, [\r\n h(\r\n 'div',\r\n { class: 'sg-carousel-track' },\r\n slides.map((slide, i) =>\r\n h(\r\n 'div',\r\n {\r\n key: i,\r\n class: [\r\n 'sg-carousel-slide',\r\n i === current.value ? 'sg-carousel-slide-active' : '',\r\n `sg-carousel-effect-${props.effect}`,\r\n ],\r\n style:\r\n props.effect === 'slide'\r\n ? { transform: `translateX(${(i - current.value) * 100}%)` }\r\n : undefined,\r\n 'aria-hidden': i !== current.value,\r\n },\r\n [slide],\r\n ),\r\n ),\r\n ),\r\n ]),\r\n props.dots && count > 1\r\n ? h(\r\n 'div',\r\n {\r\n class: ['sg-carousel-dots', isVertical.value ? 'sg-carousel-dots-vertical' : ''],\r\n },\r\n slides.map((_, i) =>\r\n h('button', {\r\n key: i,\r\n type: 'button',\r\n class: [\r\n 'sg-carousel-dot',\r\n i === current.value ? 'sg-carousel-dot-active' : '',\r\n ],\r\n 'aria-label': `Slide ${i + 1}`,\r\n onClick: () => goTo(i, count),\r\n }),\r\n ),\r\n )\r\n : null,\r\n ])\r\n }\r\n },\r\n})\r\n</script>\r\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nexport interface TimelineItem {\n /**\n * Main body text content.\n * For rich content use the scoped `content` slot — when present, the slot\n * takes precedence over this string.\n */\n content: string\n /**\n * Optional label text.\n * For rich content use the scoped `label` slot.\n */\n label?: string\n /** Border / text colour for the default ring (ignored when a custom `dot` is provided). */\n color?: string\n /**\n * Custom marker text (replaces default dot).\n * For rich markers use the scoped `dot` slot.\n */\n dot?: string\n /** Forces this item to one side (overrides list `mode` for this index). */\n position?: 'left' | 'right'\n}\n\nexport interface TimelineProps {\n /** Ordered timeline steps. */\n items: TimelineItem[]\n /** Layout. @default 'left' */\n mode?: 'left' | 'right' | 'alternate'\n /**\n * Pending tail content. Pass `true` for an empty synthetic item.\n * For rich pending content use the `pending-content` slot.\n */\n pending?: string | boolean\n /** Reverse visual order. */\n reverse?: boolean\n /** Strips built-in styles when true. */\n unstyled?: boolean\n}\n\nconst props = withDefaults(defineProps<TimelineProps>(), {\n mode: 'left',\n})\n\ndefineSlots<{\n /** Per-item content override. `isPending` is `true` for the synthetic pending tail. */\n content(slotProps: { item: TimelineItem; index: number; isPending: boolean }): unknown\n /** Per-item label override (shown beside the marker / above on `alternate`). */\n label(slotProps: { item: TimelineItem; index: number }): unknown\n /**\n * Per-item dot override. Replaces the default ring; `isPending` is `true`\n * for the synthetic pending tail (use it to render `pendingDot` analogue).\n */\n dot(slotProps: { item: TimelineItem; index: number; isPending: boolean }): unknown\n}>()\n\ninterface InternalItem extends TimelineItem {\n __pending?: boolean\n}\n\nconst computedItems = computed<InternalItem[]>(() => {\n let arr: InternalItem[] = props.items.map((it) => ({ ...it }))\n if (props.pending) {\n arr.push({\n content: typeof props.pending === 'boolean' ? '' : props.pending,\n __pending: true,\n })\n }\n if (props.reverse) arr = arr.reverse()\n return arr\n})\n\nconst isPending = computed(() => !!props.pending)\n\nfunction getPosition(item: InternalItem, index: number): 'left' | 'right' {\n if (item.position) return item.position\n if (props.mode === 'alternate') return index % 2 === 0 ? 'left' : 'right'\n return props.mode\n}\n\nfunction itemClasses(item: InternalItem, index: number, isLast: boolean) {\n const pos = getPosition(item, index)\n return [\n 'sg-timeline-item',\n `sg-timeline-item-${pos}`,\n (item.__pending ?? (isPending.value && isLast)) ? 'sg-timeline-item-pending' : '',\n ]\n .filter(Boolean)\n .join(' ')\n}\n\nconst rootClasses = computed(() => `sg-timeline sg-timeline-${props.mode}`)\n</script>\n\n<template>\n <ul v-if=\"unstyled\">\n <li v-for=\"(item, i) in computedItems\" :key=\"i\">\n <span v-if=\"$slots.label || item.label !== undefined\">\n <slot name=\"label\" :item=\"item\" :index=\"i\">{{ item.label }}</slot>\n </span>\n <span>\n <slot name=\"dot\" :item=\"item\" :index=\"i\" :is-pending=\"item.__pending ?? false\">{{\n item.dot ?? '●'\n }}</slot>\n </span>\n <span>\n <slot name=\"content\" :item=\"item\" :index=\"i\" :is-pending=\"item.__pending ?? false\">{{\n item.content\n }}</slot>\n </span>\n </li>\n </ul>\n <ul v-else :class=\"rootClasses\" role=\"list\">\n <li\n v-for=\"(item, i) in computedItems\"\n :key=\"i\"\n :class=\"itemClasses(item, i, i === computedItems.length - 1)\"\n role=\"listitem\"\n >\n <div v-if=\"$slots.label || item.label !== undefined\" class=\"sg-timeline-item-label\">\n <slot name=\"label\" :item=\"item\" :index=\"i\">{{ item.label }}</slot>\n </div>\n <div class=\"sg-timeline-item-head-wrapper\">\n <div\n :class=\"[\n 'sg-timeline-item-head',\n item.dot || $slots.dot ? 'sg-timeline-item-head-custom' : '',\n ]\"\n :style=\"\n item.color && !item.dot && !$slots.dot\n ? { borderColor: item.color, color: item.color }\n : undefined\n \"\n >\n <slot name=\"dot\" :item=\"item\" :index=\"i\" :is-pending=\"item.__pending ?? false\">{{\n item.dot ?? ''\n }}</slot>\n </div>\n <div v-if=\"i < computedItems.length - 1\" class=\"sg-timeline-item-tail\" />\n </div>\n <div class=\"sg-timeline-item-content\">\n <slot name=\"content\" :item=\"item\" :index=\"i\" :is-pending=\"item.__pending ?? false\">{{\n item.content\n }}</slot>\n </div>\n </li>\n </ul>\n</template>\n","<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport { useConfigWithDefaults } from './ConfigProvider.vue'\r\nimport type { SizeType } from '../../types'\r\n\r\nexport interface DescriptionsItem {\r\n /** Optional stable key. */\r\n key?: string\r\n /** Field label. */\r\n label: string\r\n /** Value content. */\r\n value: string\r\n /** Column span (max `column`). */\r\n span?: number\r\n}\r\n\r\nexport interface DescriptionsProps {\r\n /** Optional heading. */\r\n title?: string\r\n /** Rows built from these items. */\r\n items: DescriptionsItem[]\r\n /** Renders bordered table. */\r\n bordered?: boolean\r\n /** Number of columns per row. @default 3 */\r\n column?: number\r\n /** Horizontal or vertical layout. @default 'horizontal' */\r\n layout?: 'horizontal' | 'vertical'\r\n /** Append \":\" after labels. @default true */\r\n colon?: boolean\r\n /** Component size variant. */\r\n size?: SizeType\r\n /** Strips built-in styles when true. */\r\n unstyled?: boolean\r\n}\r\n\r\nconst props = withDefaults(defineProps<DescriptionsProps>(), {\r\n bordered: false,\r\n column: 3,\r\n layout: 'horizontal',\r\n colon: true,\r\n})\r\n\r\nconst { resolvedSize } = useConfigWithDefaults({ size: undefined }, {})\r\nconst realSize = computed<SizeType>(() => props.size ?? resolvedSize.value)\r\nconst descSize = computed(() => (realSize.value === 'small' ? 'small' : 'default'))\r\n\r\nfunction buildRows(items: DescriptionsItem[], column: number): DescriptionsItem[][] {\r\n const rows: DescriptionsItem[][] = []\r\n let currentRow: DescriptionsItem[] = []\r\n let usedSpan = 0\r\n for (const item of items) {\r\n const span = Math.min(item.span ?? 1, column)\r\n if (usedSpan + span > column) {\r\n rows.push(currentRow)\r\n currentRow = []\r\n usedSpan = 0\r\n }\r\n currentRow.push(item)\r\n usedSpan += span\r\n if (usedSpan >= column) {\r\n rows.push(currentRow)\r\n currentRow = []\r\n usedSpan = 0\r\n }\r\n }\r\n if (currentRow.length > 0) rows.push(currentRow)\r\n return rows\r\n}\r\n\r\nconst rows = computed(() => buildRows(props.items, props.column))\r\n\r\nconst rootClasses = computed(() =>\r\n [\r\n 'sg-descriptions',\r\n `sg-descriptions-${descSize.value}`,\r\n props.bordered ? 'sg-descriptions-bordered' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' '),\r\n)\r\n</script>\r\n\r\n<template>\r\n <div v-if=\"unstyled\" role=\"list\">\r\n <div v-if=\"title\">{{ title }}</div>\r\n <table>\r\n <tbody>\r\n <tr v-for=\"(row, ri) in rows\" :key=\"ri\">\r\n <template v-for=\"(item, ci) in row\" :key=\"item.key ?? ci\">\r\n <th>{{ item.label }}{{ colon ? ':' : '' }}</th>\r\n <td :colspan=\"item.span\">{{ item.value }}</td>\r\n </template>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n <div v-else :class=\"rootClasses\" role=\"list\">\r\n <div v-if=\"title\" class=\"sg-descriptions-title\">{{ title }}</div>\r\n <table class=\"sg-descriptions-table\">\r\n <tbody>\r\n <template v-for=\"(row, ri) in rows\" :key=\"ri\">\r\n <template v-if=\"layout === 'vertical'\">\r\n <tr class=\"sg-descriptions-row\">\r\n <th\r\n v-for=\"(item, ci) in row\"\r\n :key=\"`label-${item.key ?? ci}`\"\r\n class=\"sg-descriptions-item-label\"\r\n :colspan=\"item.span ?? 1\"\r\n >\r\n {{ item.label }}\r\n <span v-if=\"colon\" class=\"sg-descriptions-colon\">:</span>\r\n </th>\r\n </tr>\r\n <tr class=\"sg-descriptions-row\">\r\n <td\r\n v-for=\"(item, ci) in row\"\r\n :key=\"`value-${item.key ?? ci}`\"\r\n class=\"sg-descriptions-item-content\"\r\n :colspan=\"item.span ?? 1\"\r\n >\r\n {{ item.value }}\r\n </td>\r\n </tr>\r\n </template>\r\n <tr v-else class=\"sg-descriptions-row\">\r\n <template v-for=\"(item, ci) in row\" :key=\"item.key ?? ci\">\r\n <th class=\"sg-descriptions-item-label\">\r\n {{ item.label }}\r\n <span v-if=\"colon\" class=\"sg-descriptions-colon\">:</span>\r\n </th>\r\n <td\r\n class=\"sg-descriptions-item-content\"\r\n :colspan=\"item.span ?? 1\"\r\n >\r\n {{ item.value }}\r\n </td>\r\n </template>\r\n </tr>\r\n </template>\r\n </tbody>\r\n </table>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\nimport { computed, nextTick, onMounted, ref, watch } from 'vue'\nimport { useConfigWithDefaults } from './ConfigProvider.vue'\nimport type { SizeType } from '../../types'\n\nexport interface CollapseItem {\n /** Unique key. */\n key: string\n /** Header text. */\n label: string\n /** Body text revealed when expanded. */\n content: string\n /** Optional content next to header. */\n extra?: string\n /** When `false`, hides the expand/collapse arrow. */\n showArrow?: boolean\n /** When `true`, the panel cannot be toggled. */\n disabled?: boolean\n}\n\nexport interface CollapseProps {\n items: CollapseItem[]\n /** Controlled open keys. */\n activeKey?: string | string[]\n /** Initial open keys. */\n defaultActiveKey?: string | string[]\n /** Only one panel open at a time. */\n accordion?: boolean\n /** Draw a border. @default true */\n bordered?: boolean\n /** Placement of expand icon. @default 'start' */\n expandIconPosition?: 'start' | 'end'\n /** Transparent style. */\n ghost?: boolean\n /** Component size variant. */\n size?: SizeType\n /** Strips built-in styles when true. */\n unstyled?: boolean\n}\n\nconst props = withDefaults(defineProps<CollapseProps>(), {\n accordion: false,\n bordered: true,\n expandIconPosition: 'start',\n ghost: false,\n})\n\nconst emit = defineEmits<{\n (e: 'change', activeKey: string[]): void\n}>()\n\ndefineSlots<{\n panel(props: { item: CollapseItem }): unknown\n}>()\n\nconst { resolvedSize } = useConfigWithDefaults({ size: undefined }, {})\nconst realSize = computed<SizeType>(() => props.size ?? resolvedSize.value)\n\nfunction toArray(val?: string | string[]): string[] {\n if (val === undefined) return []\n return Array.isArray(val) ? val : [val]\n}\n\nconst internalActive = ref<string[]>(toArray(props.activeKey ?? props.defaultActiveKey))\nconst currentActive = computed(() =>\n props.activeKey !== undefined ? toArray(props.activeKey) : internalActive.value,\n)\n\nfunction toggle(key: string) {\n let next: string[]\n if (props.accordion) {\n next = currentActive.value.includes(key) ? [] : [key]\n } else {\n next = currentActive.value.includes(key)\n ? currentActive.value.filter((k) => k !== key)\n : [...currentActive.value, key]\n }\n internalActive.value = next\n emit('change', next)\n}\n\nconst rootClasses = computed(() =>\n [\n 'sg-collapse',\n props.bordered ? 'sg-collapse-bordered' : '',\n props.ghost ? 'sg-collapse-ghost' : '',\n `sg-collapse-${realSize.value}`,\n ]\n .filter(Boolean)\n .join(' '),\n)\n\nfunction panelClasses(item: CollapseItem) {\n const isActive = currentActive.value.includes(item.key)\n return [\n 'sg-collapse-panel',\n isActive ? 'sg-collapse-panel-active' : '',\n item.disabled ? 'sg-collapse-panel-disabled' : '',\n ]\n .filter(Boolean)\n .join(' ')\n}\n\nfunction arrowClasses(item: CollapseItem) {\n const isActive = currentActive.value.includes(item.key)\n return ['sg-collapse-arrow', isActive ? 'sg-collapse-arrow-open' : ''].filter(Boolean).join(' ')\n}\n\nfunction isOpen(key: string) {\n return currentActive.value.includes(key)\n}\n\nfunction onKeyDown(e: KeyboardEvent, item: CollapseItem) {\n if (item.disabled) return\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n toggle(item.key)\n }\n}\n\n/* --- Per-panel animated max-height bookkeeping --- */\n\nconst contentRefs = ref<Map<string, HTMLElement>>(new Map())\nconst measuredHeights = ref<Map<string, number | null>>(new Map())\n\nfunction setContentRef(key: string, el: Element | null) {\n if (el) contentRefs.value.set(key, el as HTMLElement)\n else contentRefs.value.delete(key)\n}\n\nfunction contentStyle(item: CollapseItem) {\n const measured = measuredHeights.value.get(item.key)\n const open = isOpen(item.key)\n let value: string\n if (measured !== undefined && measured !== null) value = `${measured}px`\n else if (open) value = 'none'\n else value = '0px'\n return { '--sg-collapse-content-max-height': value } as Record<string, string>\n}\n\nfunction syncHeight(item: CollapseItem) {\n const el = contentRefs.value.get(item.key)\n if (!el) return\n if (isOpen(item.key)) {\n measuredHeights.value.set(item.key, el.scrollHeight)\n } else {\n measuredHeights.value.set(item.key, el.scrollHeight)\n requestAnimationFrame(() => {\n measuredHeights.value.set(item.key, 0)\n measuredHeights.value = new Map(measuredHeights.value)\n })\n }\n measuredHeights.value = new Map(measuredHeights.value)\n}\n\nfunction onTransitionEnd(item: CollapseItem) {\n if (isOpen(item.key)) {\n measuredHeights.value.set(item.key, null)\n measuredHeights.value = new Map(measuredHeights.value)\n }\n}\n\nonMounted(() => {\n // Prime measurements for any panels that start open so their CSS\n // max-height reflects the actual scrollHeight (Vue mounted the DOM\n // synchronously, so refs are populated by this tick).\n for (const item of props.items) {\n if (isOpen(item.key)) {\n const el = contentRefs.value.get(item.key)\n if (el) {\n measuredHeights.value.set(item.key, el.scrollHeight)\n }\n }\n }\n measuredHeights.value = new Map(measuredHeights.value)\n})\n\nwatch(currentActive, (next, prev) => {\n const prevSet = new Set(prev ?? [])\n const nextSet = new Set(next ?? [])\n const changed: string[] = []\n for (const item of props.items) {\n const was = prevSet.has(item.key)\n const now = nextSet.has(item.key)\n if (was !== now) changed.push(item.key)\n }\n if (changed.length === 0) return\n void nextTick(() => {\n for (const key of changed) {\n const item = props.items.find((i) => i.key === key)\n if (item) syncHeight(item)\n }\n })\n})\n</script>\n\n<template>\n <div v-if=\"unstyled\">\n <div v-for=\"item in items\" :key=\"item.key\">\n <button\n type=\"button\"\n :disabled=\"item.disabled\"\n :aria-expanded=\"isOpen(item.key)\"\n @click=\"!item.disabled && toggle(item.key)\"\n >\n {{ item.label }}\n <span v-if=\"item.extra\">{{ item.extra }}</span>\n </button>\n <div v-if=\"isOpen(item.key)\">\n <slot name=\"panel\" :item=\"item\">{{ item.content }}</slot>\n </div>\n </div>\n </div>\n <div v-else :class=\"rootClasses\">\n <div v-for=\"item in items\" :key=\"item.key\" :class=\"panelClasses(item)\">\n <div\n class=\"sg-collapse-header\"\n role=\"button\"\n :tabindex=\"item.disabled ? -1 : 0\"\n :aria-expanded=\"isOpen(item.key)\"\n @click=\"!item.disabled && toggle(item.key)\"\n @keydown=\"onKeyDown($event, item)\"\n >\n <span\n v-if=\"expandIconPosition === 'start' && item.showArrow !== false\"\n :class=\"arrowClasses(item)\"\n />\n <span class=\"sg-collapse-header-text\">{{ item.label }}</span>\n <span\n v-if=\"expandIconPosition === 'end' && item.showArrow !== false\"\n :class=\"arrowClasses(item)\"\n />\n <span v-if=\"item.extra\" class=\"sg-collapse-extra\">{{ item.extra }}</span>\n </div>\n <div\n :ref=\"(el) => setContentRef(item.key, el as Element | null)\"\n class=\"sg-collapse-content\"\n :style=\"contentStyle(item)\"\n @transitionend=\"onTransitionEnd(item)\"\n >\n <div class=\"sg-collapse-content-inner\">\n <slot name=\"panel\" :item=\"item\">{{ item.content }}</slot>\n </div>\n </div>\n </div>\n </div>\n</template>\n","import type { SgLocale } from '../types'\n\n/** English (US) preset for {@link SgConfigProvider} `locale`. */\nexport const en_US: SgLocale = {\n modal: {\n okText: 'OK',\n cancelText: 'Cancel',\n },\n popconfirm: {\n okText: 'Yes',\n cancelText: 'No',\n },\n empty: {\n description: 'No Data',\n },\n pagination: {\n totalPrefix: 'Total',\n itemsPerPage: '/ page',\n jump: 'Go to',\n page: 'page',\n },\n inputPassword: {\n showPassword: 'Show password',\n hidePassword: 'Hide password',\n strengthWeak: 'Weak',\n strengthMedium: 'Medium',\n strengthStrong: 'Strong',\n strengthVeryStrong: 'Very strong',\n },\n searchInput: {\n placeholder: 'Search…',\n clear: 'Clear',\n search: 'Search',\n },\n tagInput: {\n placeholder: 'Add tag…',\n removeTag: 'Remove',\n },\n pinInput: {\n ariaLabel: 'PIN input',\n },\n inlineEdit: {\n placeholder: 'Click to edit…',\n save: 'Save',\n cancel: 'Cancel',\n },\n calendar: {\n monthNames: [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ],\n dayNames: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],\n today: 'Today',\n now: 'Now',\n week: 'W',\n prevYear: 'Previous year',\n nextYear: 'Next year',\n prevMonth: 'Previous month',\n nextMonth: 'Next month',\n },\n datePicker: {\n prevYear: 'Previous year',\n nextYear: 'Next year',\n prevMonth: 'Previous month',\n nextMonth: 'Next month',\n },\n}\n","import type { SgLocale } from '../types'\n\n/** Русская локаль для {@link SgConfigProvider} `locale`. */\nexport const ru_RU: SgLocale = {\n modal: {\n okText: 'ОК',\n cancelText: 'Отмена',\n },\n popconfirm: {\n okText: 'Да',\n cancelText: 'Нет',\n },\n empty: {\n description: 'Нет данных',\n },\n pagination: {\n totalPrefix: 'Всего',\n itemsPerPage: ' / стр.',\n jump: 'Перейти',\n page: 'стр.',\n },\n inputPassword: {\n showPassword: 'Показать пароль',\n hidePassword: 'Скрыть пароль',\n strengthWeak: 'Слабый',\n strengthMedium: 'Средний',\n strengthStrong: 'Сильный',\n strengthVeryStrong: 'Очень сильный',\n },\n searchInput: {\n placeholder: 'Поиск…',\n clear: 'Очистить',\n search: 'Найти',\n },\n tagInput: {\n placeholder: 'Добавить тег…',\n removeTag: 'Удалить',\n },\n pinInput: {\n ariaLabel: 'Ввод PIN-кода',\n },\n inlineEdit: {\n placeholder: 'Нажмите для редактирования…',\n save: 'Сохранить',\n cancel: 'Отмена',\n },\n calendar: {\n monthNames: [\n 'Январь',\n 'Февраль',\n 'Март',\n 'Апрель',\n 'Май',\n 'Июнь',\n 'Июль',\n 'Август',\n 'Сентябрь',\n 'Октябрь',\n 'Ноябрь',\n 'Декабрь',\n ],\n dayNames: ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'],\n today: 'Сегодня',\n now: 'Сейчас',\n week: 'Нед',\n prevYear: 'Предыдущий год',\n nextYear: 'Следующий год',\n prevMonth: 'Предыдущий месяц',\n nextMonth: 'Следующий месяц',\n },\n datePicker: {\n prevYear: 'Предыдущий год',\n nextYear: 'Следующий год',\n prevMonth: 'Предыдущий месяц',\n nextMonth: 'Следующий месяц',\n },\n}\n","import type { SgLocale } from '../types'\n\n/** Chinese (Simplified, zh-CN) preset for {@link SgConfigProvider} `locale`. */\nexport const zh_CN: SgLocale = {\n modal: {\n okText: '确定',\n cancelText: '取消',\n },\n popconfirm: {\n okText: '确定',\n cancelText: '取消',\n },\n empty: {\n description: '暂无数据',\n },\n pagination: {\n totalPrefix: '共',\n itemsPerPage: ' 条/页',\n jump: '跳至',\n page: '页',\n },\n inputPassword: {\n showPassword: '显示密码',\n hidePassword: '隐藏密码',\n strengthWeak: '弱',\n strengthMedium: '中',\n strengthStrong: '强',\n strengthVeryStrong: '非常强',\n },\n searchInput: {\n placeholder: '搜索…',\n clear: '清除',\n search: '搜索',\n },\n tagInput: {\n placeholder: '添加标签…',\n removeTag: '删除',\n },\n pinInput: {\n ariaLabel: 'PIN 输入',\n },\n inlineEdit: {\n placeholder: '点击编辑…',\n save: '保存',\n cancel: '取消',\n },\n calendar: {\n monthNames: [\n '一月',\n '二月',\n '三月',\n '四月',\n '五月',\n '六月',\n '七月',\n '八月',\n '九月',\n '十月',\n '十一月',\n '十二月',\n ],\n dayNames: ['日', '一', '二', '三', '四', '五', '六'],\n today: '今天',\n now: '此刻',\n week: '周',\n prevYear: '上一年',\n nextYear: '下一年',\n prevMonth: '上个月',\n nextMonth: '下个月',\n },\n datePicker: {\n prevYear: '上一年',\n nextYear: '下一年',\n prevMonth: '上个月',\n nextMonth: '下个月',\n },\n}\n","import type { SgLocale } from '../types'\n\n/** German (de-DE) preset for {@link SgConfigProvider} `locale`. */\nexport const de_DE: SgLocale = {\n modal: {\n okText: 'OK',\n cancelText: 'Abbrechen',\n },\n popconfirm: {\n okText: 'Ja',\n cancelText: 'Nein',\n },\n empty: {\n description: 'Keine Daten',\n },\n pagination: {\n totalPrefix: 'Gesamt',\n itemsPerPage: ' / Seite',\n jump: 'Gehe zu',\n page: 'Seite',\n },\n inputPassword: {\n showPassword: 'Passwort anzeigen',\n hidePassword: 'Passwort verbergen',\n strengthWeak: 'Schwach',\n strengthMedium: 'Mittel',\n strengthStrong: 'Stark',\n strengthVeryStrong: 'Sehr stark',\n },\n searchInput: {\n placeholder: 'Suchen…',\n clear: 'Leeren',\n search: 'Suchen',\n },\n tagInput: {\n placeholder: 'Tag hinzufügen…',\n removeTag: 'Entfernen',\n },\n pinInput: {\n ariaLabel: 'PIN-Eingabe',\n },\n inlineEdit: {\n placeholder: 'Klicken zum Bearbeiten…',\n save: 'Speichern',\n cancel: 'Abbrechen',\n },\n calendar: {\n monthNames: [\n 'Januar',\n 'Februar',\n 'März',\n 'April',\n 'Mai',\n 'Juni',\n 'Juli',\n 'August',\n 'September',\n 'Oktober',\n 'November',\n 'Dezember',\n ],\n dayNames: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],\n today: 'Heute',\n now: 'Jetzt',\n week: 'KW',\n prevYear: 'Vorheriges Jahr',\n nextYear: 'Nächstes Jahr',\n prevMonth: 'Vorheriger Monat',\n nextMonth: 'Nächster Monat',\n },\n datePicker: {\n prevYear: 'Vorheriges Jahr',\n nextYear: 'Nächstes Jahr',\n prevMonth: 'Vorheriger Monat',\n nextMonth: 'Nächster Monat',\n },\n}\n","import type { SgLocale } from '../types'\n\n/** French (fr-FR) preset for {@link SgConfigProvider} `locale`. */\nexport const fr_FR: SgLocale = {\n modal: {\n okText: 'OK',\n cancelText: 'Annuler',\n },\n popconfirm: {\n okText: 'Oui',\n cancelText: 'Non',\n },\n empty: {\n description: 'Aucune donnée',\n },\n pagination: {\n totalPrefix: 'Total',\n itemsPerPage: ' / page',\n jump: 'Aller à',\n page: 'page',\n },\n inputPassword: {\n showPassword: 'Afficher le mot de passe',\n hidePassword: 'Masquer le mot de passe',\n strengthWeak: 'Faible',\n strengthMedium: 'Moyen',\n strengthStrong: 'Fort',\n strengthVeryStrong: 'Très fort',\n },\n searchInput: {\n placeholder: 'Rechercher…',\n clear: 'Effacer',\n search: 'Rechercher',\n },\n tagInput: {\n placeholder: 'Ajouter un tag…',\n removeTag: 'Supprimer',\n },\n pinInput: {\n ariaLabel: 'Saisie PIN',\n },\n inlineEdit: {\n placeholder: 'Cliquer pour modifier…',\n save: 'Enregistrer',\n cancel: 'Annuler',\n },\n calendar: {\n monthNames: [\n 'Janvier',\n 'Février',\n 'Mars',\n 'Avril',\n 'Mai',\n 'Juin',\n 'Juillet',\n 'Août',\n 'Septembre',\n 'Octobre',\n 'Novembre',\n 'Décembre',\n ],\n dayNames: ['Di', 'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa'],\n today: \"Aujourd'hui\",\n now: 'Maintenant',\n week: 'Sem',\n prevYear: 'Année précédente',\n nextYear: 'Année suivante',\n prevMonth: 'Mois précédent',\n nextMonth: 'Mois suivant',\n },\n datePicker: {\n prevYear: 'Année précédente',\n nextYear: 'Année suivante',\n prevMonth: 'Mois précédent',\n nextMonth: 'Mois suivant',\n },\n}\n","import type { SgLocale } from '../types'\n\n/** Spanish (es-ES) preset for {@link SgConfigProvider} `locale`. */\nexport const es_ES: SgLocale = {\n modal: {\n okText: 'Aceptar',\n cancelText: 'Cancelar',\n },\n popconfirm: {\n okText: 'Sí',\n cancelText: 'No',\n },\n empty: {\n description: 'Sin datos',\n },\n pagination: {\n totalPrefix: 'Total',\n itemsPerPage: ' / pág.',\n jump: 'Ir a',\n page: 'pág.',\n },\n inputPassword: {\n showPassword: 'Mostrar contraseña',\n hidePassword: 'Ocultar contraseña',\n strengthWeak: 'Débil',\n strengthMedium: 'Medio',\n strengthStrong: 'Fuerte',\n strengthVeryStrong: 'Muy fuerte',\n },\n searchInput: {\n placeholder: 'Buscar…',\n clear: 'Limpiar',\n search: 'Buscar',\n },\n tagInput: {\n placeholder: 'Añadir etiqueta…',\n removeTag: 'Eliminar',\n },\n pinInput: {\n ariaLabel: 'Entrada de PIN',\n },\n inlineEdit: {\n placeholder: 'Haga clic para editar…',\n save: 'Guardar',\n cancel: 'Cancelar',\n },\n calendar: {\n monthNames: [\n 'Enero',\n 'Febrero',\n 'Marzo',\n 'Abril',\n 'Mayo',\n 'Junio',\n 'Julio',\n 'Agosto',\n 'Septiembre',\n 'Octubre',\n 'Noviembre',\n 'Diciembre',\n ],\n dayNames: ['Do', 'Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sá'],\n today: 'Hoy',\n now: 'Ahora',\n week: 'Sem',\n prevYear: 'Año anterior',\n nextYear: 'Año siguiente',\n prevMonth: 'Mes anterior',\n nextMonth: 'Mes siguiente',\n },\n datePicker: {\n prevYear: 'Año anterior',\n nextYear: 'Año siguiente',\n prevMonth: 'Mes anterior',\n nextMonth: 'Mes siguiente',\n },\n}\n"],"names":["useForm","options","core","createCore","form","createForm","knownKeys","collectValues","result","key","v","values","ref","formState","scheduled","refreshNow","scheduleRefresh","removeMiddleware","event","next","onScopeDispose","submit","_a","reset","vals","k","setFieldValue","name","value","setFieldsValue","getFieldValue","getFieldsValue","validateFields","computed","useField","meta","errors","warnings","touched","dirty","validating","refreshMeta","m","unsubs","u","onChange","onBlur","useFieldArray","counter","genKey","initial","keys","index","defaultValue","_","i","from","to","item","currentLen","newKeys","useWatch","unsub","useComputed","path","useTable","table","createTable","initialData","isRef","visibleRows","tableState","pinnedColumns","columnWidths","refresh","dataRef","stop","watch","column","direction","sorts","filter","fn","page","side","width","useTree","tree","createTree","treeState","flatNodes","level","allFlat","multiple","parentKey","children","dragKey","dropKey","position","predicate","current","useGraph","externalCore","graphOptions","graph","createGraph","state","unsubscribe","FOCUSABLE_SELECTOR","isHidden","el","cur","style","_c","_b","queryFocusable","container","useFocusTrap","active","containerRef","previousFocus","attachedEl","handleKeyDown","e","list","first","last","activeEl","detach","attach","focusable","isActive","sync","onMounted","useRovingTabIndex","itemCount","orientation","loop","activeIndex","items","getCount","setItemRef","focusItem","count","nextIndex","isNext","isPrev","useListNavigation","onSelect","typeaheadTimeout","labels","typeahead","typeaheadTimer","setLabels","prev","query","startIndex","idx","unwrap","useVirtualScroll","initialItemCount","initialItemHeight","initialOverscan","engine","createVirtual","range","recalc","scrollToIndex","align","h","ro","scrollHandler","useHistory","history","createHistory","cursor","entries","undo","redo","jumpTo","clear","props","__props","emit","__emit","currentValue","wrapperClasses","inputClasses","onInput","target","onFocus","showClear","slots","useSlots","hasPrefix","hasSuffix","_createElementBlock","_openBlock","_hoisted_1","_renderSlot","_ctx","_createElementVNode","_hoisted_3","_hoisted_4","internal","inputRef","syncCheckbox","wrapperClass","hasDefaultSlot","_hoisted_2","selectUid","genId","listboxId","open","wrapperRef","getInitial","currentSingle","currentMultiple","selectedOption","o","selectedOptions","emitValue","handleSelect","opt","handleRemoveTag","val","isDisabled","isOptionSelected","handleOutside","onBeforeUnmount","onNativeChange","picked","num","final","_toDisplayString","_Fragment","_renderList","_unref","_cache","$event","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_normalizeClass","_hoisted_13","sgConfigKey","EMPTY","EMPTY_REF","useConfig","inject","useConfigWithDefaults","defaults","cfgRef","resolvedSize","resolvedDisabled","parentRef","merged","parent","provide","disabled","cfg","totalPrefix","itemsPerPageLabel","jumpLabel","jumpValue","totalPages","safeCurrent","go","handleJump","buildPages","total","pages","rootClasses","simpleClasses","p","_hoisted_11","_hoisted_12","_hoisted_15","_hoisted_16","_createTextVNode","realSize","visible","timer","s","d","spinSizeClass","spinClasses","hasChildren","hasIndicator","DEFAULT_TABLE_LOCALE","DEFAULT_COL_WIDTH","MIN_COL_WIDTH","EXPAND_COL_WIDTH","SELECTION_COL_WIDTH","localeFull","sCls","sSty","colDepth","c","colLeafCount","sum","ch","hasColumnGroups","headerDepth","leafColumns","out","visit","headerRows","depth","rows","span","columns","setSort","clearSort","addFilter","clearFilters","setPage","setFilterFn","setColumnWidth","internalSearch","searchQuery","currentSort","handleSortClick","internalSelected","selectedKeys","selectedSet","toggleRowSelected","id","r","allCurrentPageSelected","someCurrentPageSelected","toggleSelectAll","ids","set","treeChildField","treeIndent","treeExpanded","collectAllTreeIds","initTreeExpanded","toggleTreeRow","flatRows","childField","has","internalExpanded","exp","expandedSet","toggleExpand","wasExpanded","isRowExpandable","row","activeFilters","openFilterDropdown","rebuildFilters","colsWith","hasSearch","lower","col","applyColumnFilter","toggleFilterDropdown","closeFilterDropdown","filterDropdownRefs","setFilterDropdownRef","onDocClick","ev","resizing","onResizeStart","startW","onResizeMove","onResizeEnd","min","editingCell","editingValue","startEdit","nextTick","input","commitEdit","cancelEdit","colWidthPx","hasScrollX","hasAutoColumns","shouldFlexExplicitWidths","colTrack","resized","w","totalLeadingCols","totalCols","gridTemplate","parts","fixedOffsets","left","right","leftSum","rightSum","fixedStyle","isHeader","gotoPage","summaryRows","aggregateValue","nums","n","a","b","virtualConfig","isObj","virtualEngine","scrollEl","scrollTop","viewportHeight","virtualVersion","buildEstimate","rh","est","fallback","ensureVirtualEngine","eng","onVirtualScroll","syncViewport","virtualRange","visibleSize","bottom","bodyRows","rowIndexOffset","rowClassFor","absIndex","extra","selected","striped","handleRowClick","scrollClass","scrollStyle","gridStyle","hasToolbar","spacerColumn","__expose","_normalizeStyle","_createBlock","SgInput","headerRow","rowIdx","SgCheckbox","cell","_createVNode","SgSelect","f","_vShow","localIdx","cIdx","_withModifiers","_hoisted_14","_resolveDynamicComponent","_hoisted_17","_hoisted_18","_hoisted_19","srow","srIdx","_hoisted_20","_hoisted_21","scell","sIdx","_hoisted_22","SgSpin","_hoisted_23","SgPagination","rowEl","handleSwitcherClick","handleCheckChange","handleClick","handleContextMenu","titleText","highlight","sv","text","isDragging","isEditing","editInput","editingText","visibleActions","statusClass","rowClass","handleEditKey","actionDisabled","action","handleActionClick","onDragStart","onDragOver","onDragLeave","onDragEnd","onDrop","ariaExpanded","ariaChecked","indentPx","DEFAULT_TREE_LOCALE","DEFAULT_INDENT","NODE_HEIGHT","VIRTUAL_OVERSCAN","setExpandedKeys","expandAll","collapseAll","toggleCheck","setCheckedKeys","selectKey","setSelectedKeys","markLoading","markLoaded","moveNode","filterNodes","internalSearchValue","searchValue","applySearch","node","filtered","focusedKeyInternal","focusedKey","setFocusedKey","dropPosition","handleExpand","handleCheck","checkedNodes","ck","selectedNodes","sk","handleLoadData","handleDragStart","handleDragOver","rect","y","pos","handleDragLeave","handleDragEnd","handleDrop","dragNode","dropNode","handleRightClick","evt","isDraggable","isEditable","nodeStatusFor","handleEdit","oldValue","handleEditCancel","useTemplateRef","treeRef","itemHeight","scrollToFocused","targetTop","st","focusNode","flat","currentIndex","parentIndex","handleScroll","useVirtual","visibleSlice","rawStart","visibleCount","endIndex","virtualOffset","totalHeight","virtualBottomPad","handleExpandAll","handleCollapseAll","handleCheckAll","nodes","handleUncheckAll","TreeNodeRow","internalPage","internalSelectedKeys","dragIndex","dropIndex","virtualEl","pageSize","currentPage","paginatedData","start","pageCount","changePage","handleItemClick","handleVirtualScroll","emptyText","gridResponsiveClass","grid","virtualSlice","height","overscan","offsetTop","rowCls","isSelected","isDropTarget","itemsContainerClass","visibleItems","vi","entry","ROW_NUMBER_COL_WIDTH","orderedColumns","middle","totalContentHeight","activeCell","draftValue","resolveRowKey","resolveCellValue","isEditableCell","rowIndex","handleHeaderClick","nextDir","handleCellClick","colIndex","handleCellDoubleClick","handleEditorKeydown","handleRowDblClick","toggleRowSelection","allSelected","ci","si","useChartSize","size","lastApplied","observedEl","apply","cr","watchEffect","buildPageRule","opts","margins","buildPrintHtml","fragment","documentRef","styles","pageRule","scale","title","escapeHtml","customStyles","wrapperOpen","printElement","popup","html","trigger","DEFAULT_CHART_ANIMATION_MS","resolveChartAnimation","animate","DEFAULT_PALETTE","colorForSeries","series","normalizePadding","chartBounds","max","formatY","formatX","yTicks","arr","t","xTicks","tickCount","TIP_WIDTH","TIP_LINE_HEIGHT","TIP_PADDING","TIP_GAP","defaultValueFormatter","fmt","cls","suffix","tipMetrics","headerHeight","tipHeight","tipX","tipY","rowY","resolveBrushConfig","brush","DEFAULT_FILL","drag","overlayRef","xToCategoryIndex","localX","plotX","plotW","step","raw","categoryIndexToX","clientToCategoryIndex","clientX","overlay","svg","viewW","vb","attr","safeSetCapture","safeReleaseCapture","publish","handlePointerDown","handlePointerMove","handlePointerUp","finalEnd","handlePointerCancel","handleDoubleClick","liveSelection","selectionRect","sel","x1","x2","fillColor","overlayStyle","rootRef","svgRef","fallbackW","fallbackH","padding","viewH","plotY","plotH","bounds","animation","xCoord","yCoord","lineSegments","color","segments","cmd","markerPoints","crosshairEnabled","crosshairFmt","hoverIdx","handleSvgMouseMove","xStep","rawIdx","handleSvgMouseLeave","crosshairPoints","brushConfig","isBrushControlled","internalBrushRange","effectiveBrushRange","handleBrushChange","ChartAxes","ln","seg","ChartCrosshair","ChartBrush","ChartLegend","seriesValues","stackedTotals","bars","cats","groupWidth","groupBox","groupOffset","acc","baseY","topY","x","yTop","seriesCount","barWidth","stackedValues","stacks","baselineY","areaPaths","upper","topV","bottomY","linePath","reversedLower","areaPath","cx","cy","radius","innerR","describeSlice","end","ir","y1","y2","largeArc","ix1","iy1","ix2","iy2","slices","onButtonClick","SVG_NS","XLINK_NS","serializeSvg","clone","triggerDownload","blob","fileName","url","ensureExt","ext","measureSvg","downloadSvg","xml","downloadSvgAsPng","fileNameOrOpts","resolve","reject","img","canvas","ctx","pngBlob","err","iconStroke","PRINT_ICON","SVG_ICON","PNG_ICON","RESET_ICON","defaultChartActions","brushReset","resolveChartActions","actions","makeSeriesContextMenuHandler","handler","payload","makeChartContextMenuHandler","ORTHOGONAL_CORNER_RADIUS","DRAG_THRESHOLD_PX","HOVER_SHOW_DELAY_MS","HOVER_HIDE_GRACE_MS","canvasRef","effectiveDraggable","effectivePanable","effectiveZoomable","isControlled","controlledIds","internalSelection","currentSelection","selectionSet","commitSelection","selectionsEqual","sa","view","edges","allBounds","boundsById","localOriginOffset","resolveAnchor","g","nodeId","refer","anchors","best","bestDiff","diff","endpointWorldPoint","ep","off","buildEdgePath","edge","obstacles","sourceBounds","targetBounds","pts","routeOrthogonal","pointsToRoundedPath","_d","sourceSide","nearestSide","targetSide","getBezierPath","_e","wp","pointsToPath","renderedEdges","map","skip","bb","needsBounds","sb","tb","dragRef","draggingId","applyMove","nx","ny","beginDrag","primaryId","members","onNodePointerMove","dx","dy","endNodeDrag","toggleSelection","onNodePointerDown","multiCapable","isCtrl","mid","onNodeClick","onWheel","factor","lasso","lassoRef","rectFromCorners","x0","y0","screenRectToWorld","z","aabbIntersects","nodesInBox","world","wrapperSession","startLasso","sx","sy","startPan","onWrapperPointerDown","onWrapperPointerMove","screen","hits","onWrapperPointerUp","onCanvasClick","__instance","getCurrentInstance","dropEnabled","attrs","acceptedTypes","dragHasAcceptedType","types","wx","wy","onWrapperContextMenu","onNodeContextMenu","onEdgeContextMenu","hoveredNode","hoveredEdge","nodeHoverShowTimer","nodeHoverHideTimer","edgeHoverShowTimer","edgeHoverHideTimer","clearTimer","handle","showNodeHover","hideNodeHover","showEdgeHover","hideEdgeHover","hasNodeActions","hasEdgeActions","edgesInteractive","hoveredNodeRecord","hoveredNodeBounds","hoveredEdgeRecord","hoveredEdgeMid","canvasBounds","wrapperStyle","base","canvasStyle","nodeClassFor","nodeStyleFor","visibleNodeActions","visibleEdgeActions","widgetStyle","widget","widgets","dragSession","cellSize","root","onHeaderPointerDown","onResizePointerDown","onPointerMove","ds","cw","nextX","nextY","onPointerUp","MS_PER_DAY","stepMs","toMs","computedRange","now","totalMs","res","totalSteps","ganttWidth","headerTicks","label","taskBarStyle","task","onBarPointerDown","dxMs","snappedDx","bucketKey","timeMs","groupBy","day","bucketLabel","sorted","groups","group","alignDown","alignUp","assignmentMin","assignmentMax","rangeFrom","rangeTo","stepValue","pxPerMs","totalWidth","gridHeight","formatTick","dd","mm","ticks","rowIndexById","conflictingIds","byResource","j","aS","aE","bS","bE","assignmentRects","startMs","endMs","statusOf","blockClass","colorOverrideFor","startInteraction","kind","nextStart","nextEnd","onAssignmentKeyDown","dir","formContextKey","formProviderContextKey","formOptions","_changed","all","formApi","formRef","classes","provider","handleSubmit","firstErrorField","injected","field","prevValue","wrappedOnChange","normalized","registerField","allRules","hasErrors","hasWarnings","effectiveStatus","fieldClasses","hasLabelSlot","args","listUid","newItems","fields","operation","insertIndex","indices","forms","info","inferredType","handleChange","newValue","errorId","fieldStateClass","files","_hoisted_25","_hoisted_26","realDisabled","jsonTypeToFieldType","schema","buildOptions","jsonSchemaToFields","prop","jsonSchemaToRules","requiredFields","rules","jsonSchemaToDefaults","rulesMap","internalForm","formInstance","SgForm","fieldConfig","SgField","SgAutoField","SgButton","DEFAULT_PALETTE_ITEMS","PALETTE_DATA_TYPE","type","idCounter","nextId","prefix","fieldTypeToJsonSchemaType","jsonSchemaPropertyToFieldType","createEmptyEditorSchema","jsonSchemaToEditorSchema","required","ftype","editorFieldToProperty","format","editorSchemaToJsonSchema","editor","properties","createFieldFromPaletteType","existingNames","baseName","baseLabel","isEmpty","jsonSchema","dropIndicator","beforeIndex","fromIdx","fromPalette","txt","newField","handleEmptyClick","handleFieldClick","handleFieldDragStart","handleFieldDragEnd","handleFieldDragOver","handleFieldDragLeave","TYPES_WITH_OPTIONS","TYPES_WITH_NUMERIC_RANGE","TYPES_WITH_LENGTH_RANGE","isOptionsType","isNumericType","isLengthType","isBooleanType","patch","defaultDisplay","handleDefaultInput","updateOption","copy","removeOption","addOption","_hoisted_27","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_33","_hoisted_34","_hoisted_36","_hoisted_39","HISTORY_LIMIT","STORE_PATH","cloneSchema","buildSnapshot","canUndo","canRedo","reduce","mergedRecord","useSchemaEditor","undoStack","redoStack","commit","captureHistory","toIndex","src","candidate","stack","internalStore","store","bottomTab","handlePaletteActivate","onKey","previewSchema","previewFields","previewKey","SgSchemaFormEditorPalette","SgSchemaFormEditorCanvas","SgSchemaForm","SgSchemaFormEditorSchemaView","SgSchemaFormEditorInspector","zodRule","issues","zodRules","fieldSchema","zodDefaults","zodToJsonSchema","shape","def","check","expanded","toggleExpanded","formatTime","ts","formatValue","pi","lp","strengthOf","password","score","strength","disabledEff","toggleAria","placeholderEff","handleSearch","handleClear","onKeydown","internalTags","inputValue","tags","updateTags","addTag","tag","removeTag","onPaste","pasted","onWrapperClick","onInputBlur","tagColorClass","len","padCompact","chars","ensureCells","pattern","cellRefs","bindRef","focusAt","joined","trimmed","char","handlePaste","cellDisplay","ariaLabelEff","editing","draft","hasViewSlot","ed","startEditing","save","cancel","viewClasses","onViewKeydown","onBlurUnstyled","onBlurStyled","hasBefore","hasAfter","internalValue","clamp","update","increment","decrement","minDisabled","maxDisabled","select","groupClass","syncInputs","desired","isChecked","switchSizeClass","trackRef","percent","updateFromPosition","ratio","stepped","onMouseDown","move","up","onKeyDown","ariaLabel","starLabel","hoverValue","display","clickStar","starIndex","hoverStar","isLeftHalf","_starIndex","classFor","isFull","isHalf","handleInput","DEFAULT_COLOR","hexToRgb","hex","clean","full","rgbToHex","rgbToHsv","hsvToRgb","q","hsvToHex","formatColor","parseColor","internalOpen","isOpen","satPanelRef","hueBarRef","textInput","hsv","hoverTimer","setOpenState","emitChange","handleTriggerClick","handleMouseEnter","handleMouseLeave","handleTextInput","parsed","handlePresetClick","dragging","updateSat","updateHue","handleSatPointerDown","handleSatPointerMove","handleHuePointerDown","handleHuePointerMove","hueColor","satBackground","DEFAULT_MONTH_NAMES","DEFAULT_DAY_NAMES","config","monthNames","dayNames","todayBtnLabel","nowBtnLabel","okBtnLabel","prevYearLabel","nextYearLabel","prevMonthLabel","nextMonthLabel","pad","isSameDay","isToday","getDaysInMonth","year","month","cloneDate","toValidDate","formatDate","parseDate","str","yi","mi","di","hi","mni","hour","sec","hasTime","timeConfig","normalizedDefault","viewYear","viewMonth","tempTime","pickerLevel","inputText","isInputting","setOpen","openDropdown","handleDateSelect","handleMonthSelect","handleYearSelect","handleTimeChange","handleTimeOk","handleToday","today","handleNow","handlePresetSelect","single","handleInputChange","handleInputKeyDown","handleEscape","weeks","daysInMonth","firstDay","prevDays","cells","remaining","monthLabel","displayText","yearDecadeStart","yearOptions","shiftMonth","delta","shiftYear","cellClass","wrapperCls","dropdownCls","hourStep","minuteStep","secondStep","showSeconds","hourItems","minuteItems","secondItems","setTimeH","setTimeM","setTimeS","hourColRef","minuteColRef","secondColRef","scrollActive","week","wi","_hoisted_24","_hoisted_28","_hoisted_32","_hoisted_35","_hoisted_37","_hoisted_38","startOfDay","normalizeRange","externalValue","hoverDate","baseRef","leftYear","leftMonth","rightYear","rightMonth","tempTimes","commitRange","dates","date","moveLeftMonth","getMonthGrid","leftWeeks","rightWeeks","isInRange","isRangeEdge","inRange","displayLeft","displayRight","timeItems","setTime","monthLabelLeft","monthLabelRight","_hoisted_40","_hoisted_41","_hoisted_42","use12","period","h12","parseTime","isPM","minute","second","hours","minutes","seconds","disabledHourSet","disabledMinuteSet","disabledSecondSet","displayHour","setH","real","setM","setS","setAm","setPm","emitNext","handleStart","handleEnd","SgTimePicker","dayNamesBase","todayLabel","weekLabel","internalRange","rangeState","internalMulti","multiState","internalMode","currentMode","isSameMonth","getISOWeekNumber","dayNum","yearStart","isBetween","isRangeStart","isRangeEnd","showWeek","panelDate","panelYear","panelMonth","monthGrid","prevMonthDays","eventsForDate","commitSingle","commitMultiple","selectDate","selectMonth","monthIdx","setMode","handleMonthSelectChange","handleYearSelectChange","cellClasses","rStart","rEnd","isRangeMode","rangeStart","rangeEnd","isMulti","monthCellClasses","onHeaderChange","genUid","handleFiles","incoming","accepted","file","updateFile","uid","handleRemove","openPicker","onInputChange","itemClasses","arraysEqual","findOption","findPath","found","collectAllPaths","leafOnly","walk","nextPath","isLeaf","defaultSearchFilter","multiValues","activeColumns","activeValues","searchText","loadingValues","searchInputRef","rebuildColumns","cols","newActive","newCols","mv","handleHover","searchFilter","searchResults","handleSearchSelect","displayLabel","isMultiChecked","visibleMulti","hiddenCount","pathLabel","toArray","findNode","getNodeLabel","collectAllKeys","collectAllParentKeys","filterTreeKeepMatches","childResult","getParentKeys","targetKey","parents","applyStrategy","checkedKeys","treeData","strategy","checkedSet","pk","isMultiple","searchRef","defaultFilter","filterFn","filteredTreeData","filteredExpandedKeys","initialExpandedKeys","treeCheckedKeys","treeSelectedKeys","displayedValues","visibleTags","fireChange","triggerNode","handleTreeSelect","_keys","handleTreeCheck","displayed","handleSearchInput","labelFor","SgTree","DEFAULT_LOCALE","mergedLocale","targets","leftSelected","rightSelected","leftSearch","rightSearch","leftPage","rightPage","sourceItems","targetItems","filterItems","filteredLeft","filteredRight","resolvePageSize","pageSlice","visibleLeft","visibleRight","countText","unit","enabledKeys","allChecked","enabled","indeterminate","toggleItem","toggleAll","checked","drop","moveRight","moveKeys","moveLeft","moveSet","canMoveRight","canMoveLeft","onLeftSearch","onRightSearch","itemCls","showSuggest","search","activePrefix","textareaRef","dropdownRef","prefixes","before","charBefore","between","filteredOptions","selectOption","after","insertText","newPos","onClickOutside","findFirstElement","Comment","Text","Fragment","inner","_sfc_main$l","defineComponent","mounted","phase","enterClasses","leaveClasses","transitionClass","cloneVNode","instance","hasFooterSlot","okText","cancelText","titleId","bodyId","trapRef","toRef","widthStyle","onClose","onOk","showDefaultFooter","hasCustomFooter","_Teleport","SgTransition","PLACEMENT_TRANSITION","isHorizontal","sizeStyle","transitionName","drawerClasses","listeners","notifyAll","snapshot","addNotification","duration","removeNotification","notification","message","description","useNotification","TYPE_ICONS","NotificationContainer","listener","containerClass","close","card","popconfirmId","handleTrigger","handleConfirm","handleCancel","handleDocumentClick","popoverClasses","tooltipId","show","hide","progressSize","clampedPercent","resolvedStatus","lineClasses","circleClasses","barHeight","circle","sw","circumference","offset","hasCustomIcon","hasExtra","STATUS_COLOR","iconColor","DefaultIcon","status","common","hasCustomImage","DefaultEmptyImage","avatarSize","avatarShape","titleWidth","rowWidths","getRowWidth","widths","toCss","currentKey","activeItem","setKey","loading","collectNavigable","openKeys","mode","findByKey","findParentKey","nextParent","StyledMenuItem","hoverOpen","isInlineOpen","showPopover","showInlineSub","paddingLeft","child","itemEl","_sfc_main$b","currentSelected","currentOpen","navigable","initialActive","activeKey","toggleOpen","focusKey","moveBy","isInlineParentOf","childKey","horizontal","primaryNext","primaryPrev","onClick","focusedIndex","menuId","getNextMenuIndex","menuClasses","hasIconSlot","stepsSize","hasOnChange","vp","resolveStatus","override","clickable","normalize","hasCount","displayCount","isStandalone","offsetStyle","colorStyle","PRESET","isPreset","customStyle","handleClose","sizeMap","px","fontSize","hasIcon","flatten","_sfc_main$3","slideCount","goTo","startAutoplay","isVertical","slides","slide","computedItems","it","isPending","getPosition","isLast","$slots","descSize","buildRows","currentRow","usedSpan","ri","internalActive","currentActive","toggle","panelClasses","arrowClasses","contentRefs","measuredHeights","setContentRef","contentStyle","measured","syncHeight","onTransitionEnd","prevSet","nextSet","changed","was","en_US","ru_RU","zh_CN","de_DE","fr_FR","es_ES"],"mappings":"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"}
|