@skygraph/react 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 +70 -12
- package/dist/Table-BmesoMje.d.ts +1017 -0
- package/dist/Table-CpKMOH2x.d.cts +1017 -0
- package/dist/chunk-2OCEO636.js +91 -0
- package/dist/chunk-2OCEO636.js.map +1 -0
- package/dist/chunk-BNMJSYI2.js +54 -0
- package/dist/chunk-BNMJSYI2.js.map +1 -0
- package/dist/chunk-FSV73JI4.js +58 -0
- package/dist/chunk-FSV73JI4.js.map +1 -0
- package/dist/chunk-GJDDPZH7.js +226 -0
- package/dist/chunk-GJDDPZH7.js.map +1 -0
- package/dist/chunk-MLEBVELO.js +1412 -0
- package/dist/chunk-MLEBVELO.js.map +1 -0
- package/dist/chunk-NXB3VAVF.js +3794 -0
- package/dist/chunk-NXB3VAVF.js.map +1 -0
- package/dist/chunk-SEQI65CF.js +61 -0
- package/dist/chunk-SEQI65CF.js.map +1 -0
- package/dist/chunk-UO6VJC3C.js +1667 -0
- package/dist/chunk-UO6VJC3C.js.map +1 -0
- package/dist/chunk-Z5UGF7EO.js +847 -0
- package/dist/chunk-Z5UGF7EO.js.map +1 -0
- package/dist/chunk-ZJF6SJLP.js +200 -0
- package/dist/chunk-ZJF6SJLP.js.map +1 -0
- package/dist/common-CdpocIEz.d.cts +27 -0
- package/dist/common-CdpocIEz.d.ts +27 -0
- package/dist/datagrid-B6hg5yJh.d.cts +200 -0
- package/dist/datagrid-B6hg5yJh.d.ts +200 -0
- package/dist/datagrid.cjs +1053 -0
- package/dist/datagrid.cjs.map +1 -0
- package/dist/datagrid.d.cts +2 -0
- package/dist/datagrid.d.ts +2 -0
- package/dist/datagrid.js +10 -0
- package/dist/datagrid.js.map +1 -0
- package/dist/devtools.cjs +253 -0
- package/dist/devtools.cjs.map +1 -0
- package/dist/devtools.d.cts +29 -0
- package/dist/devtools.d.ts +29 -0
- package/dist/devtools.js +9 -0
- package/dist/devtools.js.map +1 -0
- package/dist/form.cjs +1723 -0
- package/dist/form.cjs.map +1 -0
- package/dist/form.d.cts +530 -0
- package/dist/form.d.ts +530 -0
- package/dist/form.js +49 -0
- package/dist/form.js.map +1 -0
- package/dist/index.cjs +22467 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +3685 -0
- package/dist/index.d.ts +3685 -0
- package/dist/index.js +14131 -0
- package/dist/index.js.map +1 -0
- package/dist/table.cjs +4134 -0
- package/dist/table.cjs.map +1 -0
- package/dist/table.d.cts +31 -0
- package/dist/table.d.ts +31 -0
- package/dist/table.js +26 -0
- package/dist/table.js.map +1 -0
- package/dist/tree.cjs +1822 -0
- package/dist/tree.cjs.map +1 -0
- package/dist/tree.d.cts +348 -0
- package/dist/tree.d.ts +348 -0
- package/dist/tree.js +13 -0
- package/dist/tree.js.map +1 -0
- package/dist/virtual.cjs +145 -0
- package/dist/virtual.cjs.map +1 -0
- package/dist/virtual.d.cts +50 -0
- package/dist/virtual.d.ts +50 -0
- package/dist/virtual.js +11 -0
- package/dist/virtual.js.map +1 -0
- package/package.json +108 -18
- package/index.js +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../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","../src/hooks/useComputed.ts","../src/components/complex/Cascader/Cascader.tsx","../src/components/complex/Calendar/Calendar.tsx","../src/components/complex/Calendar/types.ts","../src/components/ui/Modal.tsx","../src/hooks/a11y/useFocusTrap.ts","../src/components/ui/Radio.tsx","../src/components/ui/Switch.tsx","../src/components/ui/Tabs.tsx","../src/components/ui/InputNumber.tsx","../src/components/ui/DatePicker.tsx","../src/components/ui/TimePicker.tsx","../src/components/ui/AutoComplete.tsx","../src/components/ui/Slider.tsx","../src/components/ui/Rate.tsx","../src/components/ui/Upload.tsx","../src/components/ui/Notification.tsx","../src/components/ui/Drawer.tsx","../src/components/ui/Popconfirm.tsx","../src/components/ui/Badge.tsx","../src/components/ui/Tag.tsx","../src/components/ui/Avatar.tsx","../src/components/ui/Breadcrumb.tsx","../src/components/ui/Dropdown.tsx","../src/components/ui/Progress.tsx","../src/components/ui/Menu.tsx","../src/components/ui/Collapse.tsx","../src/components/ui/ColorPicker.tsx","../src/components/ui/Empty.tsx","../src/components/ui/Result.tsx","../src/components/ui/Skeleton.tsx","../src/components/ui/Segmented.tsx","../src/components/ui/Steps.tsx","../src/components/ui/Timeline.tsx","../src/components/ui/Carousel.tsx","../src/components/ui/Descriptions.tsx","../src/components/complex/SchemaFormEditor/SchemaFormEditor.tsx","../src/components/complex/SchemaFormEditor/useSchemaEditor.ts","../src/components/complex/SchemaFormEditor/adapters/jsonSchema.ts","../src/components/complex/SchemaFormEditor/SchemaFormEditorPalette.tsx","../src/components/complex/SchemaFormEditor/SchemaFormEditorCanvas.tsx","../src/components/complex/SchemaFormEditor/SchemaFormEditorInspector.tsx","../src/components/complex/SchemaFormEditor/SchemaFormEditorSchemaView.tsx","../src/index.ts","../src/hooks/useGraph.ts","../src/components/complex/Diagram/Diagram.tsx","../src/components/complex/Diagram/HoverActions.tsx","../src/components/complex/Diagram/selection.ts","../src/components/complex/Dashboard/Dashboard.tsx","../src/components/complex/Dashboard/DashboardEditor.tsx","../src/components/complex/Gantt/Gantt.tsx","../src/components/complex/ResourceCalendar/ResourceCalendar.tsx","../src/components/complex/Timeline/Timeline.tsx","../src/components/complex/Charts/types.ts","../src/components/complex/Charts/ChartLegend.tsx","../src/components/complex/Charts/ChartCrosshair.tsx","../src/components/complex/Charts/ChartBrush.tsx","../src/components/complex/Charts/LineChart.tsx","../src/components/complex/Charts/ChartAxes.tsx","../src/components/complex/Charts/chartRef.ts","../src/components/complex/Charts/useChartSize.ts","../src/components/complex/Charts/chartExport.ts","../src/components/complex/Charts/ChartHoverToolbar.tsx","../src/components/complex/Charts/chartContextMenu.ts","../src/components/complex/Charts/BarChart.tsx","../src/components/complex/Charts/AreaChart.tsx","../src/components/complex/Charts/PieChart.tsx","../src/components/complex/List/List.tsx","../src/components/complex/Transfer/Transfer.tsx","../src/components/complex/Transfer/TransferList.tsx","../src/components/complex/Transfer/types.ts","../src/components/ui/Mentions.tsx","../src/components/ui/InputPassword.tsx","../src/components/ui/SearchInput.tsx","../src/components/ui/TagInput.tsx","../src/components/ui/PinInput.tsx","../src/components/ui/InlineEdit.tsx","../src/components/ui/InputGroup.tsx"],"sourcesContent":["import type { SgLocale } from '../types/locale'\n\n/**\n * English (US) locale preset for {@link ConfigProvider}.\n *\n * Covers the strings consumed by all React-adapter components: hidden\n * helper aria-labels, button tooltips, placeholders, modal/drawer/notification\n * close buttons, chart aria roles, date-picker / calendar navigation,\n * dashboard / gantt / resource-calendar / timeline accessibility names,\n * and schema-form-editor toolbar.\n */\nexport const en_US: SgLocale = {\n empty: {\n description: 'No Data',\n },\n pagination: {\n totalPrefix: 'Total',\n itemsPerPage: '/ page',\n jump: 'Go to',\n page: 'page',\n ariaLabel: 'Pagination',\n },\n popconfirm: {\n okText: 'Yes',\n cancelText: 'No',\n },\n modal: {\n okText: 'OK',\n cancelText: 'Cancel',\n closeAriaLabel: 'Close',\n },\n form: {\n required: '*',\n optional: '(optional)',\n submitText: 'Submit',\n resetText: 'Reset',\n },\n upload: {\n uploadText: 'Upload',\n removeFile: 'Remove file',\n uploadError: 'Upload failed',\n previewFile: 'Preview',\n uploadAriaLabel: 'Upload file',\n },\n transfer: {\n titles: ['Source', 'Target'],\n searchPlaceholder: 'Search',\n itemUnit: 'item',\n itemsUnit: 'items',\n notFoundContent: 'Not found',\n selectAll: 'Select all',\n deselectAll: 'Deselect all',\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 inputPassword: {\n showPassword: 'Show password',\n hidePassword: 'Hide password',\n },\n searchInput: {\n clear: 'Clear',\n },\n inlineEdit: {\n save: 'Save',\n cancel: 'Cancel',\n },\n tagInput: {\n removeTag: (tag) => `Remove ${tag}`,\n },\n drawer: {\n closeAriaLabel: 'Close',\n },\n notification: {\n closeAriaLabel: 'Close',\n },\n tag: {\n closeAriaLabel: 'Close',\n },\n spin: {\n loading: 'Loading',\n },\n skeleton: {\n loading: 'Loading',\n },\n breadcrumb: {\n ariaLabel: 'Breadcrumb',\n },\n carousel: {\n slide: (index) => `Slide ${index}`,\n },\n rate: {\n ariaLabel: 'Rating',\n star: (n) => `${n} star${n > 1 ? 's' : ''}`,\n },\n charts: {\n lineChart: 'Line chart',\n barChart: 'Bar chart',\n areaChart: 'Area chart',\n pieChart: 'Pie chart',\n legend: 'Chart legend',\n actions: 'Chart actions',\n },\n datePicker: {\n prevYear: 'Previous year',\n nextYear: 'Next year',\n prevMonth: 'Previous month',\n nextMonth: 'Next month',\n },\n cascader: {\n searchPlaceholder: 'Search...',\n noMatches: 'No matches',\n },\n treeSelect: {\n searchPlaceholder: 'Search...',\n noMatches: 'No matches',\n },\n dashboard: {\n ariaLabel: 'Dashboard',\n editorAriaLabel: 'Dashboard editor',\n resizeWidget: 'Resize widget',\n widgetActions: 'Widget actions',\n },\n gantt: {\n ariaLabel: 'Gantt chart',\n resizeTask: 'Resize task',\n },\n resourceCalendar: {\n ariaLabel: 'Resource calendar',\n resource: (name) => `Resource ${name}`,\n capacity: (n) => `capacity ${n} per slot`,\n resizeStart: 'Resize start',\n resizeEnd: 'Resize end',\n conflictSuffix: ' (conflict)',\n },\n timeline: {\n ariaLabel: 'Timeline',\n },\n schemaFormEditor: {\n undo: 'Undo',\n redo: 'Redo',\n removeOption: 'Remove option',\n schemaView: 'Generated JSON Schema',\n optionLabelPlaceholder: 'Label',\n optionValuePlaceholder: 'Value',\n moveFieldUp: 'Move field up',\n moveFieldDown: 'Move field down',\n duplicateField: 'Duplicate field',\n deleteField: 'Delete field',\n },\n}\n","import type { SgLocale } from '../types/locale'\n\n/**\n * Russian (RU) locale preset for {@link ConfigProvider}.\n */\nexport const ru_RU: SgLocale = {\n empty: {\n description: 'Нет данных',\n },\n pagination: {\n totalPrefix: 'Всего',\n itemsPerPage: '/ стр.',\n jump: 'Перейти',\n page: 'стр.',\n ariaLabel: 'Постраничная навигация',\n },\n popconfirm: {\n okText: 'Да',\n cancelText: 'Нет',\n },\n modal: {\n okText: 'OK',\n cancelText: 'Отмена',\n closeAriaLabel: 'Закрыть',\n },\n form: {\n required: '*',\n optional: '(необязательно)',\n submitText: 'Отправить',\n resetText: 'Сбросить',\n },\n upload: {\n uploadText: 'Загрузить',\n removeFile: 'Удалить файл',\n uploadError: 'Ошибка загрузки',\n previewFile: 'Просмотр',\n uploadAriaLabel: 'Загрузить файл',\n },\n transfer: {\n titles: ['Источник', 'Цель'],\n searchPlaceholder: 'Поиск',\n itemUnit: 'элемент',\n itemsUnit: 'элементов',\n notFoundContent: 'Ничего не найдено',\n selectAll: 'Выбрать все',\n deselectAll: 'Снять выделение',\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 inputPassword: {\n showPassword: 'Показать пароль',\n hidePassword: 'Скрыть пароль',\n },\n searchInput: {\n clear: 'Очистить',\n },\n inlineEdit: {\n save: 'Сохранить',\n cancel: 'Отмена',\n },\n tagInput: {\n removeTag: (tag) => `Удалить ${tag}`,\n },\n drawer: {\n closeAriaLabel: 'Закрыть',\n },\n notification: {\n closeAriaLabel: 'Закрыть',\n },\n tag: {\n closeAriaLabel: 'Закрыть',\n },\n spin: {\n loading: 'Загрузка',\n },\n skeleton: {\n loading: 'Загрузка',\n },\n breadcrumb: {\n ariaLabel: 'Хлебные крошки',\n },\n carousel: {\n slide: (index) => `Слайд ${index}`,\n },\n rate: {\n ariaLabel: 'Рейтинг',\n star: (n) => `${n} ${n === 1 ? 'звезда' : n < 5 ? 'звезды' : 'звёзд'}`,\n },\n charts: {\n lineChart: 'Линейная диаграмма',\n barChart: 'Столбчатая диаграмма',\n areaChart: 'Диаграмма с областями',\n pieChart: 'Круговая диаграмма',\n legend: 'Легенда',\n actions: 'Действия с диаграммой',\n },\n datePicker: {\n prevYear: 'Предыдущий год',\n nextYear: 'Следующий год',\n prevMonth: 'Предыдущий месяц',\n nextMonth: 'Следующий месяц',\n },\n cascader: {\n searchPlaceholder: 'Поиск...',\n noMatches: 'Совпадений не найдено',\n },\n treeSelect: {\n searchPlaceholder: 'Поиск...',\n noMatches: 'Совпадений не найдено',\n },\n dashboard: {\n ariaLabel: 'Дашборд',\n editorAriaLabel: 'Редактор дашборда',\n resizeWidget: 'Изменить размер виджета',\n widgetActions: 'Действия виджета',\n },\n gantt: {\n ariaLabel: 'Диаграмма Ганта',\n resizeTask: 'Изменить длительность задачи',\n },\n resourceCalendar: {\n ariaLabel: 'Календарь ресурсов',\n resource: (name) => `Ресурс ${name}`,\n capacity: (n) => `${n} на слот`,\n resizeStart: 'Изменить начало',\n resizeEnd: 'Изменить конец',\n conflictSuffix: ' (конфликт)',\n },\n timeline: {\n ariaLabel: 'Хронология',\n },\n schemaFormEditor: {\n undo: 'Отменить',\n redo: 'Повторить',\n removeOption: 'Удалить опцию',\n schemaView: 'Сгенерированная JSON-схема',\n optionLabelPlaceholder: 'Подпись',\n optionValuePlaceholder: 'Значение',\n moveFieldUp: 'Переместить вверх',\n moveFieldDown: 'Переместить вниз',\n duplicateField: 'Дублировать поле',\n deleteField: 'Удалить поле',\n },\n}\n","import type { SgLocale } from '../types/locale'\n\n/**\n * Chinese (Simplified, zh-CN) locale preset for {@link ConfigProvider}.\n *\n * Mirrors the structure of {@link en_US}; values translated for general\n * UI use. Identifiers, `sg-*` class names and unicode glyphs are not\n * translated (see CHARTER §10).\n */\nexport const zh_CN: SgLocale = {\n empty: {\n description: '暂无数据',\n },\n pagination: {\n totalPrefix: '共',\n itemsPerPage: '条/页',\n jump: '跳至',\n page: '页',\n ariaLabel: '分页',\n },\n popconfirm: {\n okText: '确定',\n cancelText: '取消',\n },\n modal: {\n okText: '确定',\n cancelText: '取消',\n closeAriaLabel: '关闭',\n },\n form: {\n required: '*',\n optional: '(可选)',\n submitText: '提交',\n resetText: '重置',\n },\n upload: {\n uploadText: '上传',\n removeFile: '删除文件',\n uploadError: '上传失败',\n previewFile: '预览',\n uploadAriaLabel: '上传文件',\n },\n transfer: {\n titles: ['源', '目标'],\n searchPlaceholder: '搜索',\n itemUnit: '项',\n itemsUnit: '项',\n notFoundContent: '未找到',\n selectAll: '全选',\n deselectAll: '取消全选',\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 inputPassword: {\n showPassword: '显示密码',\n hidePassword: '隐藏密码',\n },\n searchInput: {\n clear: '清除',\n },\n inlineEdit: {\n save: '保存',\n cancel: '取消',\n },\n tagInput: {\n removeTag: (tag) => `删除 ${tag}`,\n },\n drawer: {\n closeAriaLabel: '关闭',\n },\n notification: {\n closeAriaLabel: '关闭',\n },\n tag: {\n closeAriaLabel: '关闭',\n },\n spin: {\n loading: '加载中',\n },\n skeleton: {\n loading: '加载中',\n },\n breadcrumb: {\n ariaLabel: '面包屑',\n },\n carousel: {\n slide: (index) => `第 ${index} 张`,\n },\n rate: {\n ariaLabel: '评分',\n star: (n) => `${n} 星`,\n },\n charts: {\n lineChart: '折线图',\n barChart: '柱状图',\n areaChart: '面积图',\n pieChart: '饼图',\n legend: '图例',\n actions: '图表操作',\n },\n datePicker: {\n prevYear: '上一年',\n nextYear: '下一年',\n prevMonth: '上个月',\n nextMonth: '下个月',\n },\n cascader: {\n searchPlaceholder: '搜索...',\n noMatches: '无匹配项',\n },\n treeSelect: {\n searchPlaceholder: '搜索...',\n noMatches: '无匹配项',\n },\n dashboard: {\n ariaLabel: '仪表板',\n editorAriaLabel: '仪表板编辑器',\n resizeWidget: '调整组件大小',\n widgetActions: '组件操作',\n },\n gantt: {\n ariaLabel: '甘特图',\n resizeTask: '调整任务时长',\n },\n resourceCalendar: {\n ariaLabel: '资源日历',\n resource: (name) => `资源 ${name}`,\n capacity: (n) => `每槽 ${n}`,\n resizeStart: '调整开始',\n resizeEnd: '调整结束',\n conflictSuffix: '(冲突)',\n },\n timeline: {\n ariaLabel: '时间线',\n },\n schemaFormEditor: {\n undo: '撤销',\n redo: '重做',\n removeOption: '删除选项',\n schemaView: '生成的 JSON Schema',\n optionLabelPlaceholder: '标签',\n optionValuePlaceholder: '值',\n moveFieldUp: '上移字段',\n moveFieldDown: '下移字段',\n duplicateField: '复制字段',\n deleteField: '删除字段',\n },\n}\n","import type { SgLocale } from '../types/locale'\n\n/**\n * German (de-DE) locale preset for {@link ConfigProvider}.\n *\n * Mirrors the structure of {@link en_US}; values translated for general\n * UI use. Identifiers, `sg-*` class names and unicode glyphs are not\n * translated (see CHARTER §10).\n */\nexport const de_DE: SgLocale = {\n empty: {\n description: 'Keine Daten',\n },\n pagination: {\n totalPrefix: 'Gesamt',\n itemsPerPage: '/ Seite',\n jump: 'Gehe zu',\n page: 'Seite',\n ariaLabel: 'Seitennavigation',\n },\n popconfirm: {\n okText: 'Ja',\n cancelText: 'Nein',\n },\n modal: {\n okText: 'OK',\n cancelText: 'Abbrechen',\n closeAriaLabel: 'Schließen',\n },\n form: {\n required: '*',\n optional: '(optional)',\n submitText: 'Senden',\n resetText: 'Zurücksetzen',\n },\n upload: {\n uploadText: 'Hochladen',\n removeFile: 'Datei entfernen',\n uploadError: 'Hochladen fehlgeschlagen',\n previewFile: 'Vorschau',\n uploadAriaLabel: 'Datei hochladen',\n },\n transfer: {\n titles: ['Quelle', 'Ziel'],\n searchPlaceholder: 'Suchen',\n itemUnit: 'Element',\n itemsUnit: 'Elemente',\n notFoundContent: 'Nicht gefunden',\n selectAll: 'Alle auswählen',\n deselectAll: 'Auswahl aufheben',\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 inputPassword: {\n showPassword: 'Passwort anzeigen',\n hidePassword: 'Passwort verbergen',\n },\n searchInput: {\n clear: 'Leeren',\n },\n inlineEdit: {\n save: 'Speichern',\n cancel: 'Abbrechen',\n },\n tagInput: {\n removeTag: (tag) => `${tag} entfernen`,\n },\n drawer: {\n closeAriaLabel: 'Schließen',\n },\n notification: {\n closeAriaLabel: 'Schließen',\n },\n tag: {\n closeAriaLabel: 'Schließen',\n },\n spin: {\n loading: 'Wird geladen',\n },\n skeleton: {\n loading: 'Wird geladen',\n },\n breadcrumb: {\n ariaLabel: 'Brotkrümelnavigation',\n },\n carousel: {\n slide: (index) => `Folie ${index}`,\n },\n rate: {\n ariaLabel: 'Bewertung',\n star: (n) => `${n} ${n === 1 ? 'Stern' : 'Sterne'}`,\n },\n charts: {\n lineChart: 'Liniendiagramm',\n barChart: 'Balkendiagramm',\n areaChart: 'Flächendiagramm',\n pieChart: 'Tortendiagramm',\n legend: 'Diagrammlegende',\n actions: 'Diagrammaktionen',\n },\n datePicker: {\n prevYear: 'Vorheriges Jahr',\n nextYear: 'Nächstes Jahr',\n prevMonth: 'Vorheriger Monat',\n nextMonth: 'Nächster Monat',\n },\n cascader: {\n searchPlaceholder: 'Suchen...',\n noMatches: 'Keine Treffer',\n },\n treeSelect: {\n searchPlaceholder: 'Suchen...',\n noMatches: 'Keine Treffer',\n },\n dashboard: {\n ariaLabel: 'Dashboard',\n editorAriaLabel: 'Dashboard-Editor',\n resizeWidget: 'Widget-Größe ändern',\n widgetActions: 'Widget-Aktionen',\n },\n gantt: {\n ariaLabel: 'Gantt-Diagramm',\n resizeTask: 'Aufgabendauer ändern',\n },\n resourceCalendar: {\n ariaLabel: 'Ressourcenkalender',\n resource: (name) => `Ressource ${name}`,\n capacity: (n) => `Kapazität ${n} pro Slot`,\n resizeStart: 'Anfang verschieben',\n resizeEnd: 'Ende verschieben',\n conflictSuffix: ' (Konflikt)',\n },\n timeline: {\n ariaLabel: 'Zeitleiste',\n },\n schemaFormEditor: {\n undo: 'Rückgängig',\n redo: 'Wiederholen',\n removeOption: 'Option entfernen',\n schemaView: 'Generiertes JSON-Schema',\n optionLabelPlaceholder: 'Bezeichnung',\n optionValuePlaceholder: 'Wert',\n moveFieldUp: 'Feld nach oben verschieben',\n moveFieldDown: 'Feld nach unten verschieben',\n duplicateField: 'Feld duplizieren',\n deleteField: 'Feld löschen',\n },\n}\n","import type { SgLocale } from '../types/locale'\n\n/**\n * French (fr-FR) locale preset for {@link ConfigProvider}.\n *\n * Mirrors the structure of {@link en_US}; values translated for general\n * UI use. Identifiers, `sg-*` class names and unicode glyphs are not\n * translated (see CHARTER §10).\n */\nexport const fr_FR: SgLocale = {\n empty: {\n description: 'Aucune donnée',\n },\n pagination: {\n totalPrefix: 'Total',\n itemsPerPage: '/ page',\n jump: 'Aller à',\n page: 'page',\n ariaLabel: 'Pagination',\n },\n popconfirm: {\n okText: 'Oui',\n cancelText: 'Non',\n },\n modal: {\n okText: 'OK',\n cancelText: 'Annuler',\n closeAriaLabel: 'Fermer',\n },\n form: {\n required: '*',\n optional: '(facultatif)',\n submitText: 'Envoyer',\n resetText: 'Réinitialiser',\n },\n upload: {\n uploadText: 'Téléverser',\n removeFile: 'Supprimer le fichier',\n uploadError: 'Échec du téléversement',\n previewFile: 'Aperçu',\n uploadAriaLabel: 'Téléverser un fichier',\n },\n transfer: {\n titles: ['Source', 'Cible'],\n searchPlaceholder: 'Rechercher',\n itemUnit: 'élément',\n itemsUnit: 'éléments',\n notFoundContent: 'Introuvable',\n selectAll: 'Tout sélectionner',\n deselectAll: 'Tout désélectionner',\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 inputPassword: {\n showPassword: 'Afficher le mot de passe',\n hidePassword: 'Masquer le mot de passe',\n },\n searchInput: {\n clear: 'Effacer',\n },\n inlineEdit: {\n save: 'Enregistrer',\n cancel: 'Annuler',\n },\n tagInput: {\n removeTag: (tag) => `Supprimer ${tag}`,\n },\n drawer: {\n closeAriaLabel: 'Fermer',\n },\n notification: {\n closeAriaLabel: 'Fermer',\n },\n tag: {\n closeAriaLabel: 'Fermer',\n },\n spin: {\n loading: 'Chargement',\n },\n skeleton: {\n loading: 'Chargement',\n },\n breadcrumb: {\n ariaLabel: \"Fil d'Ariane\",\n },\n carousel: {\n slide: (index) => `Diapositive ${index}`,\n },\n rate: {\n ariaLabel: 'Évaluation',\n star: (n) => `${n} étoile${n > 1 ? 's' : ''}`,\n },\n charts: {\n lineChart: 'Graphique en courbes',\n barChart: 'Graphique à barres',\n areaChart: 'Graphique en aires',\n pieChart: 'Graphique en secteurs',\n legend: 'Légende du graphique',\n actions: 'Actions du graphique',\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 cascader: {\n searchPlaceholder: 'Rechercher...',\n noMatches: 'Aucun résultat',\n },\n treeSelect: {\n searchPlaceholder: 'Rechercher...',\n noMatches: 'Aucun résultat',\n },\n dashboard: {\n ariaLabel: 'Tableau de bord',\n editorAriaLabel: 'Éditeur du tableau de bord',\n resizeWidget: 'Redimensionner le widget',\n widgetActions: 'Actions du widget',\n },\n gantt: {\n ariaLabel: 'Diagramme de Gantt',\n resizeTask: 'Redimensionner la tâche',\n },\n resourceCalendar: {\n ariaLabel: 'Calendrier des ressources',\n resource: (name) => `Ressource ${name}`,\n capacity: (n) => `capacité ${n} par créneau`,\n resizeStart: 'Redimensionner le début',\n resizeEnd: 'Redimensionner la fin',\n conflictSuffix: ' (conflit)',\n },\n timeline: {\n ariaLabel: 'Chronologie',\n },\n schemaFormEditor: {\n undo: 'Annuler',\n redo: 'Rétablir',\n removeOption: \"Supprimer l'option\",\n schemaView: 'Schéma JSON généré',\n optionLabelPlaceholder: 'Libellé',\n optionValuePlaceholder: 'Valeur',\n moveFieldUp: 'Déplacer vers le haut',\n moveFieldDown: 'Déplacer vers le bas',\n duplicateField: 'Dupliquer le champ',\n deleteField: 'Supprimer le champ',\n },\n}\n","import type { SgLocale } from '../types/locale'\n\n/**\n * Spanish (es-ES) locale preset for {@link ConfigProvider}.\n *\n * Mirrors the structure of {@link en_US}; values translated for general\n * UI use. Identifiers, `sg-*` class names and unicode glyphs are not\n * translated (see CHARTER §10).\n */\nexport const es_ES: SgLocale = {\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 ariaLabel: 'Paginación',\n },\n popconfirm: {\n okText: 'Sí',\n cancelText: 'No',\n },\n modal: {\n okText: 'Aceptar',\n cancelText: 'Cancelar',\n closeAriaLabel: 'Cerrar',\n },\n form: {\n required: '*',\n optional: '(opcional)',\n submitText: 'Enviar',\n resetText: 'Restablecer',\n },\n upload: {\n uploadText: 'Subir',\n removeFile: 'Eliminar archivo',\n uploadError: 'Error al subir',\n previewFile: 'Vista previa',\n uploadAriaLabel: 'Subir archivo',\n },\n transfer: {\n titles: ['Origen', 'Destino'],\n searchPlaceholder: 'Buscar',\n itemUnit: 'elemento',\n itemsUnit: 'elementos',\n notFoundContent: 'No encontrado',\n selectAll: 'Seleccionar todo',\n deselectAll: 'Deseleccionar todo',\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 inputPassword: {\n showPassword: 'Mostrar contraseña',\n hidePassword: 'Ocultar contraseña',\n },\n searchInput: {\n clear: 'Limpiar',\n },\n inlineEdit: {\n save: 'Guardar',\n cancel: 'Cancelar',\n },\n tagInput: {\n removeTag: (tag) => `Eliminar ${tag}`,\n },\n drawer: {\n closeAriaLabel: 'Cerrar',\n },\n notification: {\n closeAriaLabel: 'Cerrar',\n },\n tag: {\n closeAriaLabel: 'Cerrar',\n },\n spin: {\n loading: 'Cargando',\n },\n skeleton: {\n loading: 'Cargando',\n },\n breadcrumb: {\n ariaLabel: 'Ruta de navegación',\n },\n carousel: {\n slide: (index) => `Diapositiva ${index}`,\n },\n rate: {\n ariaLabel: 'Calificación',\n star: (n) => `${n} estrella${n > 1 ? 's' : ''}`,\n },\n charts: {\n lineChart: 'Gráfico de líneas',\n barChart: 'Gráfico de barras',\n areaChart: 'Gráfico de áreas',\n pieChart: 'Gráfico circular',\n legend: 'Leyenda del gráfico',\n actions: 'Acciones del gráfico',\n },\n datePicker: {\n prevYear: 'Año anterior',\n nextYear: 'Año siguiente',\n prevMonth: 'Mes anterior',\n nextMonth: 'Mes siguiente',\n },\n cascader: {\n searchPlaceholder: 'Buscar...',\n noMatches: 'Sin coincidencias',\n },\n treeSelect: {\n searchPlaceholder: 'Buscar...',\n noMatches: 'Sin coincidencias',\n },\n dashboard: {\n ariaLabel: 'Panel',\n editorAriaLabel: 'Editor del panel',\n resizeWidget: 'Cambiar tamaño del widget',\n widgetActions: 'Acciones del widget',\n },\n gantt: {\n ariaLabel: 'Diagrama de Gantt',\n resizeTask: 'Cambiar duración de la tarea',\n },\n resourceCalendar: {\n ariaLabel: 'Calendario de recursos',\n resource: (name) => `Recurso ${name}`,\n capacity: (n) => `capacidad ${n} por franja`,\n resizeStart: 'Mover el inicio',\n resizeEnd: 'Mover el final',\n conflictSuffix: ' (conflicto)',\n },\n timeline: {\n ariaLabel: 'Línea de tiempo',\n },\n schemaFormEditor: {\n undo: 'Deshacer',\n redo: 'Rehacer',\n removeOption: 'Eliminar opción',\n schemaView: 'Esquema JSON generado',\n optionLabelPlaceholder: 'Etiqueta',\n optionValuePlaceholder: 'Valor',\n moveFieldUp: 'Mover campo arriba',\n moveFieldDown: 'Mover campo abajo',\n duplicateField: 'Duplicar campo',\n deleteField: 'Eliminar campo',\n },\n}\n","import { useEffect, useState } from 'react'\nimport type { Core } from '@skygraph/core'\n\nexport function useComputed(core: Core, path: string): unknown {\n const [value, setValue] = useState(() => core.get(path))\n\n useEffect(() => {\n return core.subscribe(path, (v) => {\n setValue(v)\n })\n }, [core, path])\n\n return value\n}\n","import React, { useState, useEffect, useRef, useCallback, useMemo } from 'react'\nimport { useConfig } from '../../ConfigProvider'\nimport type { CascaderProps, CascaderOption } from './types'\n\nfunction getOptionLabel(opt: CascaderOption): string {\n if (typeof opt.label === 'string') return opt.label\n if (typeof opt.label === 'number') return String(opt.label)\n return String(opt.value)\n}\n\nfunction findPath(options: CascaderOption[], values: (string | number)[]): CascaderOption[] {\n const path: CascaderOption[] = []\n let current = options\n for (const val of values) {\n const found = current.find((o) => o.value === val)\n if (!found) break\n path.push(found)\n current = found.children ?? []\n }\n return path\n}\n\nfunction collectAllPaths(\n options: CascaderOption[],\n leafOnly: boolean,\n): { path: CascaderOption[]; values: (string | number)[] }[] {\n const result: { path: CascaderOption[]; values: (string | number)[] }[] = []\n const walk = (opts: CascaderOption[], current: CascaderOption[]) => {\n for (const opt of opts) {\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) {\n walk(opt.children, nextPath)\n }\n }\n }\n walk(options, [])\n return result\n}\n\nfunction defaultSearchFilter(input: string, path: CascaderOption[]): boolean {\n const lowerInput = input.toLowerCase()\n return path.some((opt) => getOptionLabel(opt).toLowerCase().includes(lowerInput))\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\n/**\n * Hierarchical picker with columns, optional multi-select, search, and lazy-loaded branches.\n */\nexport function Cascader(props: CascaderProps) {\n const {\n options,\n value: controlledValue,\n defaultValue,\n onChange,\n placeholder = 'Please select',\n allowClear = false,\n disabled = false,\n size = 'middle',\n multiple = false,\n showSearch = false,\n expandTrigger = 'click',\n changeOnSelect = false,\n displayRender,\n loadData,\n maxTagCount,\n dropdownStyle,\n className,\n style,\n unstyled,\n } = props\n\n const cascaderLocale = useConfig().locale?.cascader\n const searchPlaceholder = cascaderLocale?.searchPlaceholder ?? 'Search...'\n const noMatchesText = cascaderLocale?.noMatches ?? 'No matches'\n\n const [internalValue, setInternalValue] = useState<(string | number)[]>(\n () => controlledValue ?? defaultValue ?? [],\n )\n const [multiValues, setMultiValues] = useState<(string | number)[][]>(() => {\n if (!multiple) return []\n if (controlledValue && controlledValue.length > 0) return [controlledValue]\n if (defaultValue && defaultValue.length > 0) return [defaultValue]\n return []\n })\n const [open, setOpen] = useState(false)\n const [activeColumns, setActiveColumns] = useState<CascaderOption[][]>([options])\n const [activeValues, setActiveValues] = useState<(string | number)[]>([])\n const [searchValue, setSearchValue] = useState('')\n const [loadingValues, setLoadingValues] = useState<Set<string | number>>(new Set())\n const wrapperRef = useRef<HTMLDivElement>(null)\n const searchRef = useRef<HTMLInputElement>(null)\n\n const currentValue = controlledValue ?? internalValue\n\n useEffect(() => {\n if (controlledValue !== undefined) {\n setInternalValue(controlledValue)\n }\n }, [controlledValue])\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (wrapperRef.current && !wrapperRef.current.contains(e.target as Node)) {\n setOpen(false)\n setSearchValue('')\n }\n }\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [])\n\n useEffect(() => {\n if (open) {\n rebuildColumns(currentValue)\n if (showSearch && searchRef.current) {\n searchRef.current.focus()\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open])\n\n const rebuildColumns = useCallback(\n (vals: (string | number)[]) => {\n const cols: CascaderOption[][] = [options]\n let current = options\n const active: (string | number)[] = []\n for (const val of vals) {\n const found = current.find((o) => o.value === val)\n if (!found) break\n active.push(val)\n if (found.children && found.children.length > 0) {\n cols.push(found.children)\n current = found.children\n } else {\n break\n }\n }\n setActiveColumns(cols)\n setActiveValues(active)\n },\n [options],\n )\n\n const fireChange = useCallback(\n (values: (string | number)[], path: CascaderOption[]) => {\n setInternalValue(values)\n onChange?.(values, path)\n },\n [onChange],\n )\n\n const handleOptionClick = useCallback(\n (opt: CascaderOption, colIndex: number) => {\n if (opt.disabled) return\n\n const newActiveValues = [...activeValues.slice(0, colIndex), opt.value]\n setActiveValues(newActiveValues)\n\n const newColumns = [...activeColumns.slice(0, colIndex + 1)]\n if (opt.children && opt.children.length > 0) {\n newColumns.push(opt.children)\n }\n setActiveColumns(newColumns)\n\n const isLeaf = opt.isLeaf !== false && (!opt.children || opt.children.length === 0)\n\n if (loadData && !isLeaf && (!opt.children || opt.children.length === 0) && !opt.isLeaf) {\n const path = findPath(options, newActiveValues)\n setLoadingValues((prev) => new Set(prev).add(opt.value))\n loadData(path)\n setTimeout(() => {\n setLoadingValues((prev) => {\n const next = new Set(prev)\n next.delete(opt.value)\n return next\n })\n rebuildColumns(newActiveValues)\n }, 0)\n }\n\n if (multiple) {\n if (isLeaf) {\n const path = findPath(options, newActiveValues)\n const exists = multiValues.some((mv) => arraysEqual(mv, newActiveValues))\n if (exists) {\n const newMulti = multiValues.filter((mv) => !arraysEqual(mv, newActiveValues))\n setMultiValues(newMulti)\n onChange?.(newActiveValues, path)\n } else {\n const newMulti = [...multiValues, newActiveValues]\n setMultiValues(newMulti)\n onChange?.(newActiveValues, path)\n }\n }\n return\n }\n\n if (isLeaf || changeOnSelect) {\n const path = findPath(options, newActiveValues)\n fireChange(newActiveValues, path)\n if (isLeaf) {\n setOpen(false)\n setSearchValue('')\n }\n }\n },\n [\n activeValues,\n activeColumns,\n options,\n multiple,\n multiValues,\n changeOnSelect,\n loadData,\n fireChange,\n rebuildColumns,\n onChange,\n ],\n )\n\n const handleOptionHover = useCallback(\n (opt: CascaderOption, colIndex: number) => {\n if (expandTrigger !== 'hover' || opt.disabled) return\n const newActiveValues = [...activeValues.slice(0, colIndex), opt.value]\n setActiveValues(newActiveValues)\n\n const newColumns = [...activeColumns.slice(0, colIndex + 1)]\n if (opt.children && opt.children.length > 0) {\n newColumns.push(opt.children)\n }\n setActiveColumns(newColumns)\n },\n [expandTrigger, activeValues, activeColumns],\n )\n\n const handleClear = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation()\n if (disabled) return\n if (multiple) {\n setMultiValues([])\n }\n fireChange([], [])\n setSearchValue('')\n },\n [disabled, multiple, fireChange],\n )\n\n const handleRemoveMulti = useCallback(\n (index: number, e: React.MouseEvent) => {\n e.stopPropagation()\n if (disabled) return\n const newMulti = multiValues.filter((_, i) => i !== index)\n setMultiValues(newMulti)\n },\n [disabled, multiValues],\n )\n\n const handleTriggerClick = useCallback(() => {\n if (disabled) return\n setOpen((prev) => !prev)\n }, [disabled])\n\n const handleSearchChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n setSearchValue(e.target.value)\n }, [])\n\n const searchFilter = useMemo(() => {\n if (!showSearch) return null\n if (typeof showSearch === 'object' && showSearch.filter) return showSearch.filter\n return defaultSearchFilter\n }, [showSearch])\n\n const searchResults = useMemo(() => {\n if (!searchValue || !searchFilter) return null\n const allPaths = collectAllPaths(options, !changeOnSelect)\n return allPaths.filter(({ path }) => searchFilter(searchValue, path))\n }, [searchValue, searchFilter, options, changeOnSelect])\n\n const handleSearchSelect = useCallback(\n (values: (string | number)[], path: CascaderOption[]) => {\n if (multiple) {\n const exists = multiValues.some((mv) => arraysEqual(mv, values))\n if (exists) {\n setMultiValues(multiValues.filter((mv) => !arraysEqual(mv, values)))\n } else {\n setMultiValues([...multiValues, values])\n }\n onChange?.(values, path)\n } else {\n fireChange(values, path)\n setOpen(false)\n setSearchValue('')\n }\n },\n [multiple, multiValues, fireChange, onChange],\n )\n\n const getDisplayText = useCallback((): React.ReactNode => {\n if (multiple) return null\n if (currentValue.length === 0) return null\n const path = findPath(options, currentValue)\n if (path.length === 0) return null\n const labels = path.map(getOptionLabel)\n if (displayRender) return displayRender(labels, path)\n return labels.join(' / ')\n }, [multiple, currentValue, options, displayRender])\n\n const displayText = getDisplayText()\n\n const isMultiChecked = useCallback(\n (values: (string | number)[]): boolean => {\n return multiValues.some((mv) => arraysEqual(mv, values))\n },\n [multiValues],\n )\n\n // Unstyled render\n if (unstyled) {\n return (\n <div ref={wrapperRef} className={className} style={style}>\n <div onClick={handleTriggerClick}>\n {!multiple && !displayText && <span>{placeholder}</span>}\n {!multiple && displayText && <span>{displayText}</span>}\n {multiple && multiValues.length === 0 && <span>{placeholder}</span>}\n {multiple &&\n multiValues.map((mv, i) => {\n const path = findPath(options, mv)\n return (\n <span key={i}>\n {path.map(getOptionLabel).join(' / ')}\n <span onClick={(e) => handleRemoveMulti(i, e)}>×</span>\n </span>\n )\n })}\n </div>\n {open && (\n <div>\n {showSearch && (\n <input\n ref={searchRef}\n value={searchValue}\n onChange={handleSearchChange}\n placeholder={searchPlaceholder}\n />\n )}\n {searchResults ? (\n <div>\n {searchResults.map(({ path, values }) => (\n <div key={values.join('-')} onClick={() => handleSearchSelect(values, path)}>\n {path.map(getOptionLabel).join(' / ')}\n </div>\n ))}\n {searchResults.length === 0 && <div>{noMatchesText}</div>}\n </div>\n ) : (\n <div style={{ display: 'flex' }}>\n {activeColumns.map((col, colIndex) => (\n <div key={colIndex}>\n {col.map((opt) => (\n <div\n key={opt.value}\n onClick={() => handleOptionClick(opt, colIndex)}\n onMouseEnter={() => handleOptionHover(opt, colIndex)}\n >\n {opt.label}\n </div>\n ))}\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n )\n }\n\n // Styled render\n const wrapperCls = [\n 'sg-cascader',\n `sg-cascader-${size}`,\n open ? 'sg-cascader-open' : '',\n disabled ? 'sg-cascader-disabled' : '',\n multiple ? 'sg-cascader-multiple' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const visibleMulti =\n maxTagCount !== undefined && multiple ? multiValues.slice(0, maxTagCount) : multiValues\n\n const hiddenCount =\n maxTagCount !== undefined && multiple ? Math.max(0, multiValues.length - maxTagCount) : 0\n\n return (\n <div className={wrapperCls} style={style} ref={wrapperRef}>\n <div className=\"sg-cascader-selector\" onClick={handleTriggerClick}>\n <div className=\"sg-cascader-selection-wrap\">\n {!multiple && !displayText && !searchValue && (\n <span className=\"sg-cascader-placeholder\">{placeholder}</span>\n )}\n\n {!multiple && displayText && !searchValue && (\n <span className=\"sg-cascader-selection-item\">{displayText}</span>\n )}\n\n {multiple && multiValues.length === 0 && !searchValue && (\n <span className=\"sg-cascader-placeholder\">{placeholder}</span>\n )}\n\n {multiple &&\n visibleMulti.map((mv, i) => {\n const path = findPath(options, mv)\n return (\n <span key={i} className=\"sg-cascader-tag\">\n <span className=\"sg-cascader-tag-label\">\n {path.map(getOptionLabel).join(' / ')}\n </span>\n <span className=\"sg-cascader-tag-close\" onClick={(e) => handleRemoveMulti(i, e)}>\n ×\n </span>\n </span>\n )\n })}\n\n {hiddenCount > 0 && (\n <span className=\"sg-cascader-tag sg-cascader-tag-rest\">+{hiddenCount}...</span>\n )}\n\n {showSearch && open && (\n <input\n ref={searchRef}\n className=\"sg-cascader-search-input\"\n value={searchValue}\n onChange={handleSearchChange}\n placeholder={searchPlaceholder}\n />\n )}\n </div>\n\n <div className=\"sg-cascader-actions\">\n {allowClear && (currentValue.length > 0 || multiValues.length > 0) && (\n <span className=\"sg-cascader-clear\" onClick={handleClear}>\n ×\n </span>\n )}\n <span className=\"sg-cascader-arrow\">{open ? '\\u25B2' : '\\u25BC'}</span>\n </div>\n </div>\n\n {open && (\n <div className=\"sg-cascader-dropdown\" style={dropdownStyle}>\n {searchResults ? (\n <div className=\"sg-cascader-search-list\">\n {searchResults.map(({ path, values }) => {\n const checked = multiple && isMultiChecked(values)\n return (\n <div\n key={values.join('-')}\n className={[\n 'sg-cascader-search-item',\n checked ? 'sg-cascader-search-item-checked' : '',\n !multiple && arraysEqual(values, currentValue)\n ? 'sg-cascader-search-item-active'\n : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => handleSearchSelect(values, path)}\n >\n {multiple && (\n <span\n className={`sg-cascader-search-check ${checked ? 'sg-cascader-search-check-active' : ''}`}\n >\n {checked ? '✓' : ''}\n </span>\n )}\n <span className=\"sg-cascader-search-label\">\n {path.map((opt, i) => (\n <React.Fragment key={opt.value}>\n {i > 0 && <span className=\"sg-cascader-search-separator\"> / </span>}\n <span>{getOptionLabel(opt)}</span>\n </React.Fragment>\n ))}\n </span>\n </div>\n )\n })}\n {searchResults.length === 0 && (\n <div className=\"sg-cascader-empty\">{noMatchesText}</div>\n )}\n </div>\n ) : (\n <div className=\"sg-cascader-columns\">\n {activeColumns.map((col, colIndex) => (\n <div key={colIndex} className=\"sg-cascader-column\">\n {col.map((opt) => {\n const isActive = activeValues[colIndex] === opt.value\n const hasChildren = opt.children && opt.children.length > 0\n const isLoading = loadingValues.has(opt.value)\n const isChecked =\n multiple &&\n multiValues.some(\n (mv) => mv[colIndex] === opt.value && mv.length === colIndex + 1,\n )\n\n return (\n <div\n key={opt.value}\n className={[\n 'sg-cascader-option',\n isActive ? 'sg-cascader-option-active' : '',\n opt.disabled ? 'sg-cascader-option-disabled' : '',\n isLoading ? 'sg-cascader-option-loading' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => handleOptionClick(opt, colIndex)}\n onMouseEnter={() => handleOptionHover(opt, colIndex)}\n >\n {multiple && (\n <span\n className={`sg-cascader-option-check ${isChecked ? 'sg-cascader-option-check-active' : ''}`}\n >\n {isChecked ? '✓' : ''}\n </span>\n )}\n <span className=\"sg-cascader-option-label\">{opt.label}</span>\n {hasChildren && !isLoading && (\n <span className=\"sg-cascader-option-expand\">▸</span>\n )}\n {isLoading && (\n <span className=\"sg-cascader-option-expand sg-cascader-option-spinner\">\n ⟳\n </span>\n )}\n </div>\n )\n })}\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n )\n}\n","import { useState, useEffect, useMemo, useCallback, useRef } from 'react'\nimport type { CalendarProps, CalendarEvent } from './types'\nimport { DEFAULT_MONTH_NAMES, DEFAULT_DAY_NAMES } from './types'\nimport { useConfig } from '../../ConfigProvider'\n\nfunction isSameDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n )\n}\n\nfunction isSameMonth(a: Date, b: Date): boolean {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth()\n}\n\nfunction isToday(date: Date): boolean {\n return isSameDay(date, new Date())\n}\n\nfunction getDaysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate()\n}\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}\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}\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}\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\ninterface DayCell {\n date: Date\n day: number\n inMonth: boolean\n}\n\nfunction getMonthGrid(year: number, month: number, weekStartDay: number): DayCell[][] {\n const daysInMonth = getDaysInMonth(year, month)\n const firstDayRaw = new Date(year, month, 1).getDay()\n const firstDay = (firstDayRaw - weekStartDay + 7) % 7\n const prevMonthDays = getDaysInMonth(year, month - 1)\n\n const cells: DayCell[] = []\n\n for (let i = firstDay - 1; i >= 0; i--) {\n const day = prevMonthDays - i\n cells.push({\n date: new Date(year, month - 1, day),\n day,\n inMonth: false,\n })\n }\n\n for (let day = 1; day <= daysInMonth; day++) {\n cells.push({\n date: new Date(year, month, day),\n day,\n inMonth: true,\n })\n }\n\n const remaining = 42 - cells.length\n for (let day = 1; day <= remaining; day++) {\n cells.push({\n date: new Date(year, month + 1, day),\n day,\n inMonth: false,\n })\n }\n\n const weeks: DayCell[][] = []\n for (let i = 0; i < cells.length; i += 7) {\n weeks.push(cells.slice(i, i + 7))\n }\n return weeks\n}\n\nfunction getEventsForDate(events: CalendarEvent[] | undefined, date: Date): CalendarEvent[] {\n if (!events) return []\n return events.filter((ev) => isSameDay(ev.date, date))\n}\n\n/**\n * Month/year calendar with panel navigation, week numbers, range/multi selection,\n * event markers, keyboard navigation, and fullscreen or compact layout.\n */\nexport function Calendar(props: CalendarProps) {\n const {\n value: controlledValue,\n defaultValue,\n onChange,\n onPanelChange,\n onSelect,\n mode: controlledMode,\n fullscreen = true,\n headerRender,\n cellRender,\n disabledDate,\n locale,\n className,\n style,\n unstyled,\n showWeekNumber,\n weekStartDay = 0,\n rangeSelection,\n rangeValue: controlledRangeValue,\n defaultRangeValue,\n onRangeChange,\n multipleSelection,\n multipleValue: controlledMultipleValue,\n defaultMultipleValue,\n onMultipleChange,\n events,\n maxEvents = 3,\n keyboard = true,\n } = props\n\n const ctxCalendarLocale = useConfig().locale?.calendar\n const monthNames = locale?.monthNames ?? ctxCalendarLocale?.monthNames ?? DEFAULT_MONTH_NAMES\n const baseDayNames = locale?.dayNames ?? ctxCalendarLocale?.dayNames ?? DEFAULT_DAY_NAMES\n const todayLabel = locale?.today ?? ctxCalendarLocale?.today ?? 'Today'\n const weekLabel = locale?.week ?? ctxCalendarLocale?.week ?? 'W'\n const prevYearLabel = ctxCalendarLocale?.prevYear ?? 'Previous year'\n const nextYearLabel = ctxCalendarLocale?.nextYear ?? 'Next year'\n const prevMonthLabel = ctxCalendarLocale?.prevMonth ?? 'Previous month'\n const nextMonthLabel = ctxCalendarLocale?.nextMonth ?? 'Next month'\n\n const dayNames = useMemo(() => {\n if (weekStartDay === 0) return baseDayNames\n return [...baseDayNames.slice(weekStartDay), ...baseDayNames.slice(0, weekStartDay)]\n }, [baseDayNames, weekStartDay])\n\n const [internalValue, setInternalValue] = useState<Date>(\n () => controlledValue ?? defaultValue ?? new Date(),\n )\n const [internalMode, setInternalMode] = useState<'month' | 'year'>(controlledMode ?? 'month')\n\n const [panelDate, setPanelDate] = useState<Date>(\n () => controlledValue ?? defaultValue ?? new Date(),\n )\n\n // Range selection state\n const [internalRange, setInternalRange] = useState<[Date | null, Date | null]>(\n () => controlledRangeValue ?? defaultRangeValue ?? [null, null],\n )\n const [rangeHover, setRangeHover] = useState<Date | null>(null)\n const rangeClickCount = useRef(0)\n\n const currentRange = controlledRangeValue ?? internalRange\n\n // Multiple selection state\n const [internalMultiple, setInternalMultiple] = useState<Date[]>(\n () => controlledMultipleValue ?? defaultMultipleValue ?? [],\n )\n const currentMultiple = controlledMultipleValue ?? internalMultiple\n\n // Keyboard focused date\n const [focusedDate, setFocusedDate] = useState<Date | null>(null)\n const calendarRef = useRef<HTMLDivElement>(null)\n\n const currentValue = controlledValue ?? internalValue\n const currentMode = controlledMode ?? internalMode\n\n useEffect(() => {\n if (controlledValue) {\n setInternalValue(controlledValue)\n setPanelDate(controlledValue)\n }\n }, [controlledValue])\n\n useEffect(() => {\n if (controlledMode !== undefined) {\n setInternalMode(controlledMode)\n }\n }, [controlledMode])\n\n const panelYear = panelDate.getFullYear()\n const panelMonth = panelDate.getMonth()\n\n const weeks = useMemo(\n () => getMonthGrid(panelYear, panelMonth, weekStartDay),\n [panelYear, panelMonth, weekStartDay],\n )\n\n const handleDateSelect = useCallback(\n (date: Date) => {\n if (disabledDate?.(date)) return\n\n if (rangeSelection) {\n const clickNum = rangeClickCount.current\n if (clickNum === 0) {\n const newRange: [Date | null, Date | null] = [date, null]\n setInternalRange(newRange)\n onRangeChange?.(newRange)\n rangeClickCount.current = 1\n } else {\n const start = currentRange[0]!\n const newRange: [Date | null, Date | null] =\n start.getTime() <= date.getTime() ? [start, date] : [date, start]\n setInternalRange(newRange)\n onRangeChange?.(newRange)\n rangeClickCount.current = 0\n setRangeHover(null)\n }\n return\n }\n\n if (multipleSelection) {\n const exists = currentMultiple.findIndex((d) => isSameDay(d, date))\n let next: Date[]\n if (exists >= 0) {\n next = currentMultiple.filter((_, i) => i !== exists)\n } else {\n next = [...currentMultiple, date]\n }\n setInternalMultiple(next)\n onMultipleChange?.(next)\n return\n }\n\n setInternalValue(date)\n setPanelDate(date)\n onSelect?.(date)\n onChange?.(date)\n },\n [\n disabledDate,\n onSelect,\n onChange,\n rangeSelection,\n currentRange,\n onRangeChange,\n multipleSelection,\n currentMultiple,\n onMultipleChange,\n ],\n )\n\n const handleMonthSelect = useCallback(\n (month: number) => {\n const newDate = new Date(panelYear, month, 1)\n setPanelDate(newDate)\n setInternalValue(newDate)\n onSelect?.(newDate)\n onChange?.(newDate)\n setInternalMode('month')\n onPanelChange?.(newDate, 'month')\n },\n [panelYear, onSelect, onChange, onPanelChange],\n )\n\n const handlePrevMonth = useCallback(() => {\n const d = new Date(panelYear, panelMonth - 1, 1)\n setPanelDate(d)\n onPanelChange?.(d, currentMode)\n }, [panelYear, panelMonth, currentMode, onPanelChange])\n\n const handleNextMonth = useCallback(() => {\n const d = new Date(panelYear, panelMonth + 1, 1)\n setPanelDate(d)\n onPanelChange?.(d, currentMode)\n }, [panelYear, panelMonth, currentMode, onPanelChange])\n\n const handlePrevYear = useCallback(() => {\n const d = new Date(panelYear - 1, panelMonth, 1)\n setPanelDate(d)\n onPanelChange?.(d, currentMode)\n }, [panelYear, panelMonth, currentMode, onPanelChange])\n\n const handleNextYear = useCallback(() => {\n const d = new Date(panelYear + 1, panelMonth, 1)\n setPanelDate(d)\n onPanelChange?.(d, currentMode)\n }, [panelYear, panelMonth, currentMode, onPanelChange])\n\n const handleModeChange = useCallback(\n (mode: 'month' | 'year') => {\n setInternalMode(mode)\n onPanelChange?.(panelDate, mode)\n },\n [panelDate, onPanelChange],\n )\n\n const handlePanelDateChange = useCallback(\n (date: Date) => {\n setPanelDate(date)\n onPanelChange?.(date, currentMode)\n },\n [currentMode, onPanelChange],\n )\n\n const handleToday = useCallback(() => {\n const today = new Date()\n handleDateSelect(today)\n }, [handleDateSelect])\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (!keyboard || currentMode !== 'month') return\n\n const focused = focusedDate ?? currentValue\n let next: Date | null = null\n\n switch (e.key) {\n case 'ArrowLeft':\n e.preventDefault()\n next = new Date(focused.getFullYear(), focused.getMonth(), focused.getDate() - 1)\n break\n case 'ArrowRight':\n e.preventDefault()\n next = new Date(focused.getFullYear(), focused.getMonth(), focused.getDate() + 1)\n break\n case 'ArrowUp':\n e.preventDefault()\n next = new Date(focused.getFullYear(), focused.getMonth(), focused.getDate() - 7)\n break\n case 'ArrowDown':\n e.preventDefault()\n next = new Date(focused.getFullYear(), focused.getMonth(), focused.getDate() + 7)\n break\n case 'Home':\n e.preventDefault()\n next = new Date(focused.getFullYear(), focused.getMonth(), 1)\n break\n case 'End':\n e.preventDefault()\n next = new Date(focused.getFullYear(), focused.getMonth() + 1, 0)\n break\n case 'PageUp':\n e.preventDefault()\n if (e.shiftKey) {\n next = new Date(focused.getFullYear() - 1, focused.getMonth(), focused.getDate())\n } else {\n next = new Date(focused.getFullYear(), focused.getMonth() - 1, focused.getDate())\n }\n break\n case 'PageDown':\n e.preventDefault()\n if (e.shiftKey) {\n next = new Date(focused.getFullYear() + 1, focused.getMonth(), focused.getDate())\n } else {\n next = new Date(focused.getFullYear(), focused.getMonth() + 1, focused.getDate())\n }\n break\n case 'Enter':\n case ' ':\n e.preventDefault()\n handleDateSelect(focused)\n return\n }\n\n if (next) {\n setFocusedDate(next)\n if (next.getMonth() !== panelMonth || next.getFullYear() !== panelYear) {\n setPanelDate(next)\n onPanelChange?.(next, currentMode)\n }\n }\n },\n [\n keyboard,\n currentMode,\n focusedDate,\n currentValue,\n panelMonth,\n panelYear,\n handleDateSelect,\n onPanelChange,\n ],\n )\n\n const yearOptions = useMemo(() => {\n const years: number[] = []\n for (let y = panelYear - 10; y <= panelYear + 10; y++) {\n years.push(y)\n }\n return years\n }, [panelYear])\n\n const isDateInRange = useCallback(\n (date: Date): boolean => {\n if (!rangeSelection) return false\n const [start, end] = currentRange\n if (start && end) return isBetween(date, start, end)\n if (start && rangeHover) return isBetween(date, start, rangeHover)\n return false\n },\n [rangeSelection, currentRange, rangeHover],\n )\n\n const isDateMultiSelected = useCallback(\n (date: Date): boolean => {\n if (!multipleSelection) return false\n return currentMultiple.some((d) => isSameDay(d, date))\n },\n [multipleSelection, currentMultiple],\n )\n\n // Unstyled render\n if (unstyled) {\n return (\n <div\n className={className}\n style={style}\n ref={calendarRef}\n tabIndex={keyboard ? 0 : undefined}\n onKeyDown={handleKeyDown}\n >\n {headerRender ? (\n headerRender({\n value: panelDate,\n type: currentMode,\n onChange: handlePanelDateChange,\n onTypeChange: handleModeChange,\n })\n ) : (\n <div>\n <button onClick={handlePrevYear}>«</button>\n {currentMode === 'month' && <button onClick={handlePrevMonth}>‹</button>}\n <span>\n {monthNames[panelMonth]} {panelYear}\n </span>\n {currentMode === 'month' && <button onClick={handleNextMonth}>›</button>}\n <button onClick={handleNextYear}>»</button>\n <button onClick={() => handleModeChange(currentMode === 'month' ? 'year' : 'month')}>\n {currentMode === 'month' ? 'Year' : 'Month'}\n </button>\n </div>\n )}\n\n {currentMode === 'month' ? (\n <table>\n <thead>\n <tr>\n {showWeekNumber && <th>{weekLabel}</th>}\n {dayNames.map((d) => (\n <th key={d}>{d}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {weeks.map((week, wi) => (\n <tr key={wi}>\n {showWeekNumber && <td>{getISOWeekNumber(week[0].date)}</td>}\n {week.map((cell) => (\n <td key={cell.date.toISOString()} onClick={() => handleDateSelect(cell.date)}>\n {cell.day}\n {cellRender?.(cell.date, { type: 'date' })}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n ) : (\n <div>\n {monthNames.map((name, i) => (\n <div key={i} onClick={() => handleMonthSelect(i)}>\n {name}\n {cellRender?.(new Date(panelYear, i, 1), { type: 'month' })}\n </div>\n ))}\n </div>\n )}\n </div>\n )\n }\n\n // Styled render\n const wrapperCls = [\n 'sg-calendar',\n fullscreen ? 'sg-calendar-fullscreen' : 'sg-calendar-mini',\n rangeSelection ? 'sg-calendar-range' : '',\n multipleSelection ? 'sg-calendar-multiple' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const renderHeader = () => {\n if (headerRender) {\n return headerRender({\n value: panelDate,\n type: currentMode,\n onChange: handlePanelDateChange,\n onTypeChange: handleModeChange,\n })\n }\n\n return (\n <div className=\"sg-calendar-header\">\n <div className=\"sg-calendar-header-left\">\n <button\n className=\"sg-calendar-nav-btn\"\n onClick={handlePrevYear}\n title={prevYearLabel}\n aria-label={prevYearLabel}\n >\n «\n </button>\n {currentMode === 'month' && (\n <button\n className=\"sg-calendar-nav-btn\"\n onClick={handlePrevMonth}\n title={prevMonthLabel}\n aria-label={prevMonthLabel}\n >\n ‹\n </button>\n )}\n </div>\n\n <div className=\"sg-calendar-header-center\">\n <select\n className=\"sg-calendar-month-select\"\n value={panelMonth}\n onChange={(e) => {\n const d = new Date(panelYear, Number(e.target.value), 1)\n setPanelDate(d)\n onPanelChange?.(d, currentMode)\n }}\n >\n {monthNames.map((name, i) => (\n <option key={i} value={i}>\n {name}\n </option>\n ))}\n </select>\n\n <select\n className=\"sg-calendar-year-select\"\n value={panelYear}\n onChange={(e) => {\n const d = new Date(Number(e.target.value), panelMonth, 1)\n setPanelDate(d)\n onPanelChange?.(d, currentMode)\n }}\n >\n {yearOptions.map((y) => (\n <option key={y} value={y}>\n {y}\n </option>\n ))}\n </select>\n\n <div className=\"sg-calendar-mode-switch\">\n <button\n className={`sg-calendar-mode-btn ${currentMode === 'month' ? 'sg-calendar-mode-btn-active' : ''}`}\n onClick={() => handleModeChange('month')}\n >\n Month\n </button>\n <button\n className={`sg-calendar-mode-btn ${currentMode === 'year' ? 'sg-calendar-mode-btn-active' : ''}`}\n onClick={() => handleModeChange('year')}\n >\n Year\n </button>\n </div>\n </div>\n\n <div className=\"sg-calendar-header-right\">\n {currentMode === 'month' && (\n <button\n className=\"sg-calendar-nav-btn\"\n onClick={handleNextMonth}\n title={nextMonthLabel}\n aria-label={nextMonthLabel}\n >\n ›\n </button>\n )}\n <button\n className=\"sg-calendar-nav-btn\"\n onClick={handleNextYear}\n title={nextYearLabel}\n aria-label={nextYearLabel}\n >\n »\n </button>\n </div>\n </div>\n )\n }\n\n const renderMonthView = () => (\n <table className=\"sg-calendar-table\">\n <thead>\n <tr>\n {showWeekNumber && <th className=\"sg-calendar-week-header\">{weekLabel}</th>}\n {dayNames.map((d) => (\n <th key={d} className=\"sg-calendar-day-header\">\n {d}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {weeks.map((week, wi) => (\n <tr key={wi} className=\"sg-calendar-week-row\">\n {showWeekNumber && (\n <td className=\"sg-calendar-week-number\">{getISOWeekNumber(week[0].date)}</td>\n )}\n {week.map((cell) => {\n const isDisabled = disabledDate?.(cell.date)\n const isSelected =\n !rangeSelection && !multipleSelection && isSameDay(cell.date, currentValue)\n const isTodayCell = isToday(cell.date)\n const isFocused = focusedDate ? isSameDay(cell.date, focusedDate) : false\n const inRange = isDateInRange(cell.date)\n const isMultiSel = isDateMultiSelected(cell.date)\n const isStart =\n rangeSelection && isRangeStart(cell.date, currentRange[0], currentRange[1])\n const isEnd =\n rangeSelection && isRangeEnd(cell.date, currentRange[0], currentRange[1])\n const dateEvents = getEventsForDate(events, cell.date)\n\n const cellCls = [\n 'sg-calendar-cell',\n cell.inMonth ? '' : 'sg-calendar-cell-outside',\n isSelected ? 'sg-calendar-cell-selected' : '',\n isTodayCell ? 'sg-calendar-cell-today' : '',\n isDisabled ? 'sg-calendar-cell-disabled' : '',\n isFocused ? 'sg-calendar-cell-focused' : '',\n inRange ? 'sg-calendar-cell-in-range' : '',\n isStart ? 'sg-calendar-cell-range-start' : '',\n isEnd ? 'sg-calendar-cell-range-end' : '',\n isMultiSel ? 'sg-calendar-cell-multi-selected' : '',\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <td\n key={cell.date.toISOString()}\n className={cellCls}\n onClick={() => !isDisabled && handleDateSelect(cell.date)}\n onMouseEnter={() => {\n if (rangeSelection && rangeClickCount.current === 1) {\n setRangeHover(cell.date)\n }\n }}\n >\n <div className=\"sg-calendar-cell-inner\">\n <span className=\"sg-calendar-cell-date\">{cell.day}</span>\n {dateEvents.length > 0 && (\n <div className=\"sg-calendar-cell-events\">\n {dateEvents.slice(0, maxEvents).map((ev, ei) => (\n <span\n key={ev.key ?? ei}\n className=\"sg-calendar-event-dot\"\n style={{ backgroundColor: ev.color ?? 'var(--sg-primary, #1677ff)' }}\n title={ev.title}\n />\n ))}\n {dateEvents.length > maxEvents && (\n <span className=\"sg-calendar-event-more\">\n +{dateEvents.length - maxEvents}\n </span>\n )}\n </div>\n )}\n {cellRender && (\n <div className=\"sg-calendar-cell-content\">\n {cellRender(cell.date, { type: 'date' })}\n </div>\n )}\n </div>\n </td>\n )\n })}\n </tr>\n ))}\n </tbody>\n </table>\n )\n\n const renderYearView = () => (\n <div className=\"sg-calendar-month-grid\">\n {monthNames.map((name, i) => {\n const monthDate = new Date(panelYear, i, 1)\n const isCurrentMonth = isSameMonth(monthDate, currentValue)\n const isThisMonth = isSameMonth(monthDate, new Date())\n\n const cellCls = [\n 'sg-calendar-month-cell',\n isCurrentMonth ? 'sg-calendar-month-cell-selected' : '',\n isThisMonth ? 'sg-calendar-month-cell-current' : '',\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <div key={i} className={cellCls} onClick={() => handleMonthSelect(i)}>\n <div className=\"sg-calendar-month-cell-inner\">\n <span className=\"sg-calendar-month-cell-name\">{name}</span>\n {cellRender && (\n <div className=\"sg-calendar-month-cell-content\">\n {cellRender(monthDate, { type: 'month' })}\n </div>\n )}\n </div>\n </div>\n )\n })}\n </div>\n )\n\n return (\n <div\n ref={calendarRef}\n className={wrapperCls}\n style={style}\n tabIndex={keyboard ? 0 : undefined}\n onKeyDown={handleKeyDown}\n >\n {renderHeader()}\n <div className=\"sg-calendar-body\">\n {currentMode === 'month' ? renderMonthView() : renderYearView()}\n </div>\n {fullscreen && (\n <div className=\"sg-calendar-footer\">\n <button className=\"sg-calendar-today-btn\" onClick={handleToday}>\n {todayLabel}\n </button>\n {rangeSelection && currentRange[0] && currentRange[1] && (\n <button\n className=\"sg-calendar-clear-btn\"\n onClick={() => {\n setInternalRange([null, null])\n onRangeChange?.([null, null])\n rangeClickCount.current = 0\n }}\n >\n Clear Range\n </button>\n )}\n {multipleSelection && currentMultiple.length > 0 && (\n <span className=\"sg-calendar-selection-count\">{currentMultiple.length} selected</span>\n )}\n </div>\n )}\n </div>\n )\n}\n","import type React from 'react'\nimport type { CalendarLocale } from '../../../types/locale'\n\nexport type { CalendarLocale }\n\n/** Values passed to `headerRender` for custom calendar chrome. */\nexport interface CalendarHeaderInfo {\n /** Date currently shown in the panel (year/month context). */\n value: Date\n /** Whether the panel shows the month grid or year/month picker. */\n type: 'month' | 'year'\n /** Updates the panel date (e.g. month/year selects). */\n onChange: (date: Date) => void\n /** Switches between month and year panel modes. */\n onTypeChange: (type: 'month' | 'year') => void\n}\n\n/** Context for `cellRender` describing which cell kind is being rendered. */\nexport interface CalendarCellInfo {\n /** `date` for day cells, `month` for month tiles in year view. */\n type: 'date' | 'month'\n}\n\n/** Calendar event marker for a specific date. */\nexport interface CalendarEvent {\n /** Date of the event. */\n date: Date\n /** Short label shown in the cell. */\n title: string\n /** Color dot or badge color. */\n color?: string\n /** Unique key. */\n key?: string\n}\n\n/** Props for the month/year calendar with optional custom header and cells. */\nexport interface CalendarProps {\n /** Controlled selected date. */\n value?: Date\n /** Initial selected date when uncontrolled. */\n defaultValue?: Date\n /** Fired when the selected date changes. */\n onChange?: (date: Date) => void\n /** Fired when the visible panel date or view mode changes. */\n onPanelChange?: (date: Date, mode: 'month' | 'year') => void\n /** Fired when a date is chosen (including month pick in year view). */\n onSelect?: (date: Date) => void\n /** Controlled panel mode: month grid or year/month list. */\n mode?: 'month' | 'year'\n /**\n * Uses full layout including footer \"today\" when `true`.\n * @default true\n */\n fullscreen?: boolean\n /** Custom header UI; receives navigation state and handlers. */\n headerRender?: (info: CalendarHeaderInfo) => React.ReactNode\n /** Extra content inside day or month cells. */\n cellRender?: (date: Date, info: CalendarCellInfo) => React.ReactNode\n /** Marks dates non-interactive when it returns `true`. */\n disabledDate?: (date: Date) => boolean\n /** Overrides default English month/day names and today label. */\n locale?: CalendarLocale\n /** Root element class name. */\n className?: string\n /** Root element inline styles. */\n style?: React.CSSProperties\n /** Renders semantic structure without Skygraph calendar CSS. */\n unstyled?: boolean\n\n /** Shows ISO week numbers on the left of each row. */\n showWeekNumber?: boolean\n /** First day of week: 0=Sunday, 1=Monday, etc. @default 0 */\n weekStartDay?: 0 | 1 | 2 | 3 | 4 | 5 | 6\n\n /** Enables 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 /** Fired when range changes. */\n onRangeChange?: (range: [Date | null, Date | null]) => void\n\n /** Enables multiple date selection mode. */\n multipleSelection?: boolean\n /** Controlled array of selected dates. */\n multipleValue?: Date[]\n /** Default multiple selected dates. */\n defaultMultipleValue?: Date[]\n /** Fired when multiple selection changes. */\n onMultipleChange?: (dates: Date[]) => void\n\n /** Event markers per date. */\n events?: CalendarEvent[]\n /** Max events to show per cell before \"+N more\". @default 3 */\n maxEvents?: number\n\n /** Enables keyboard navigation. @default true */\n keyboard?: boolean\n}\n\nexport const DEFAULT_MONTH_NAMES = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December',\n]\n\nexport const DEFAULT_DAY_NAMES = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']\n","import React, { useEffect, useCallback, useId } from 'react'\nimport { Button } from './Button'\nimport { Transition } from './Transition'\nimport { useFocusTrap } from '../../hooks/a11y/useFocusTrap'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps } from '../../types'\n\n/** Props for the modal dialog overlay. */\nexport interface ModalProps extends BaseComponentProps {\n /** When `true`, the modal is visible. */\n open: boolean\n /** Called when the modal should close (Escape, mask click, or close control). */\n onClose: () => void\n /** Optional heading text; used for the accessible name when set. */\n title?: string\n /** Main dialog body content. */\n children?: React.ReactNode\n /**\n * Footer region below the body. Omit to render the default OK / Cancel pair\n * (enabled when `onOk` is provided). Pass `null` to hide the footer entirely.\n */\n footer?: React.ReactNode\n /** Dialog width as a CSS length or number (pixels). @default 520 */\n width?: number | string\n /** Called when the default OK button is clicked. Enables the default footer. */\n onOk?: () => void | Promise<void>\n /** Label for the default OK button. Falls back to `locale.modal.okText` → `OK`. */\n okText?: string\n /** Label for the default Cancel button. Falls back to `locale.modal.cancelText` → `Cancel`. */\n cancelText?: string\n /** Visual type of the default OK button. @default 'primary' */\n okType?: 'primary' | 'default' | 'dashed' | 'text'\n /** Shows the OK button in loading state and disables interactions. */\n confirmLoading?: boolean\n}\n\n/**\n * Modal dialog with mask, optional title/footer, focus trap, and Escape to close.\n * Renders a bare structure when `unstyled` is set.\n */\nexport function Modal({\n open,\n onClose,\n title,\n children,\n footer,\n width = 520,\n onOk,\n okText: okTextProp,\n cancelText: cancelTextProp,\n okType = 'primary',\n confirmLoading,\n className,\n unstyled,\n}: ModalProps) {\n const uid = useId()\n const titleId = `${uid}-title`\n const bodyId = `${uid}-body`\n const trapRef = useFocusTrap(open)\n const modalLocale = useConfig().locale?.modal\n const okText = okTextProp ?? modalLocale?.okText ?? 'OK'\n const cancelText = cancelTextProp ?? modalLocale?.cancelText ?? 'Cancel'\n const closeAriaLabel = modalLocale?.closeAriaLabel ?? 'Close'\n\n const defaultFooter =\n footer === null ? null : footer === undefined && onOk ? (\n <>\n <Button onClick={onClose} disabled={confirmLoading}>\n {cancelText}\n </Button>\n <Button type={okType} loading={confirmLoading} onClick={() => onOk()}>\n {okText}\n </Button>\n </>\n ) : (\n footer\n )\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n },\n [onClose],\n )\n\n useEffect(() => {\n if (open) {\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }\n }, [open, handleKeyDown])\n\n if (unstyled) {\n if (!open) return null\n return (\n <div\n ref={trapRef}\n className={className}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n aria-describedby={children ? bodyId : undefined}\n >\n {title && <div id={titleId}>{title}</div>}\n <div id={bodyId}>{children}</div>\n {defaultFooter && <div>{defaultFooter}</div>}\n <Button type=\"text\" onClick={onClose} unstyled aria-label={closeAriaLabel}>\n x\n </Button>\n </div>\n )\n }\n\n return (\n <Transition visible={open} name=\"sg-fade\" unmountOnExit>\n <div className=\"sg-modal-mask\" onClick={onClose}>\n <Transition visible={open} name=\"sg-zoom\" unmountOnExit>\n <div\n ref={trapRef}\n className={['sg-modal', className].filter(Boolean).join(' ')}\n style={{\n ['--sg-modal-width' as string]: typeof width === 'number' ? `${width}px` : width,\n }}\n onClick={(e) => e.stopPropagation()}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n aria-describedby={children ? bodyId : undefined}\n >\n <div className=\"sg-modal-header\">\n {title && (\n <div className=\"sg-modal-title\" id={titleId}>\n {title}\n </div>\n )}\n <Button\n type=\"text\"\n className=\"sg-modal-close\"\n onClick={onClose}\n aria-label={closeAriaLabel}\n >\n ×\n </Button>\n </div>\n <div className=\"sg-modal-body\" id={bodyId}>\n {children}\n </div>\n {defaultFooter && <div className=\"sg-modal-footer\">{defaultFooter}</div>}\n </div>\n </Transition>\n </div>\n </Transition>\n )\n}\n","import { useEffect, useRef } from 'react'\n\nconst FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled]):not([type=\"hidden\"])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n '[contenteditable=\"true\"]',\n].join(', ')\n\nfunction isVisible(el: HTMLElement): boolean {\n if (el.hasAttribute('aria-hidden') && el.getAttribute('aria-hidden') === 'true') return false\n return el.offsetParent !== null || el === document.activeElement\n}\n\nfunction queryFocusable(container: HTMLElement): HTMLElement[] {\n return Array.from(container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)).filter(isVisible)\n}\n\nexport function useFocusTrap(active: boolean) {\n const containerRef = useRef<HTMLDivElement>(null)\n const previousFocusRef = useRef<HTMLElement | null>(null)\n\n useEffect(() => {\n if (!active) return\n\n previousFocusRef.current = document.activeElement as HTMLElement | null\n\n const container = containerRef.current\n if (!container) return\n\n const focusFirst = () => {\n const focusable = queryFocusable(container)\n if (focusable.length > 0) {\n focusable[0].focus()\n } else {\n if (!container.hasAttribute('tabindex')) container.setAttribute('tabindex', '-1')\n container.focus()\n }\n }\n\n requestAnimationFrame(focusFirst)\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') return\n\n const focusable = queryFocusable(container)\n if (focusable.length === 0) {\n e.preventDefault()\n container.focus()\n return\n }\n\n const first = focusable[0]\n const last = focusable[focusable.length - 1]\n const active = document.activeElement as HTMLElement | null\n\n if (e.shiftKey) {\n if (active === first || !container.contains(active)) {\n e.preventDefault()\n last.focus()\n }\n } else {\n if (active === last || !container.contains(active)) {\n e.preventDefault()\n first.focus()\n }\n }\n }\n\n container.addEventListener('keydown', handleKeyDown)\n\n return () => {\n container.removeEventListener('keydown', handleKeyDown)\n if (previousFocusRef.current && typeof previousFocusRef.current.focus === 'function') {\n previousFocusRef.current.focus()\n }\n }\n }, [active])\n\n return containerRef\n}\n","import React from 'react'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, InteractiveProps } from '../../types'\nimport { Spin } from './Spin'\n\n/** One selectable option in a radio group. */\nexport interface RadioOption {\n /** Visible label for the option. */\n label: string\n /** Value emitted when this option is selected. */\n value: string | number\n /** Disables this option regardless of group-level disabled state. */\n disabled?: boolean\n}\n\n/** Props for the RadioGroup component. */\nexport interface RadioGroupProps extends BaseComponentProps, InteractiveProps {\n /** Controlled selected value. */\n value?: string | number\n /** Uncontrolled initial selected value. */\n defaultValue?: string | number\n /** Options rendered as radio controls. */\n options: RadioOption[]\n /** Stacks options horizontally or vertically. @default 'horizontal' */\n direction?: 'horizontal' | 'vertical'\n /** Called when the selected value changes. */\n onChange?: (value: string | number) => void\n}\n\n/** Mutually exclusive radio options in a horizontal or vertical group. */\nexport function RadioGroup({\n value,\n defaultValue,\n options,\n direction = 'horizontal',\n disabled: disabledProp,\n loading,\n onChange,\n className,\n style,\n unstyled,\n}: RadioGroupProps) {\n const config = useConfig()\n const disabled = disabledProp ?? config.disabled ?? false\n\n const [internalValue, setInternalValue] = React.useState(value ?? defaultValue)\n const currentValue = value ?? internalValue\n\n const groupClass = unstyled\n ? (className ?? '')\n : [\n 'sg-radio-group',\n `sg-radio-group-${direction}`,\n loading ? 'sg-radio-group-loading' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <div className={groupClass} role=\"radiogroup\" style={style}>\n {options.map((opt) => (\n <label\n key={opt.value}\n className={\n unstyled\n ? ''\n : [\n 'sg-radio',\n currentValue === 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 aria-checked={currentValue === opt.value}\n className={unstyled ? '' : 'sg-radio-input'}\n checked={currentValue === opt.value}\n disabled={opt.disabled || disabled || loading}\n onChange={() => {\n setInternalValue(opt.value)\n onChange?.(opt.value)\n }}\n />\n {!unstyled && <span className=\"sg-radio-box\" aria-hidden=\"true\" />}\n <span className={unstyled ? '' : 'sg-radio-label'}>{opt.label}</span>\n {loading && currentValue === opt.value && <Spin size=\"small\" unstyled={unstyled} />}\n </label>\n ))}\n </div>\n )\n}\n","import React from 'react'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, InteractiveProps, SizableProps } from '../../types'\nimport { Spin } from './Spin'\n\n/** Props for the Switch component. */\nexport interface SwitchProps extends BaseComponentProps, InteractiveProps, SizableProps {\n /** Controlled on state. */\n checked?: boolean\n /** Uncontrolled initial on state. */\n defaultChecked?: boolean\n /** Called when the switch is toggled. */\n onChange?: (checked: boolean) => void\n /** Content shown while the switch is on. */\n checkedChildren?: React.ReactNode\n /** Content shown while the switch is off. */\n unCheckedChildren?: React.ReactNode\n}\n\n/** Toggle switch with optional on/off slot content and loading state. */\nexport function Switch({\n checked,\n defaultChecked,\n disabled: disabledProp,\n loading,\n size: sizeProp,\n onChange,\n checkedChildren,\n unCheckedChildren,\n className,\n style,\n unstyled,\n}: SwitchProps) {\n const config = useConfig()\n const disabled = disabledProp ?? config.disabled ?? false\n const resolvedSize = sizeProp ?? config.size ?? 'middle'\n const switchSizeClass = resolvedSize === 'small' ? 'small' : 'default'\n\n const [internalChecked, setInternalChecked] = React.useState(\n checked ?? defaultChecked ?? false\n )\n const isChecked = checked ?? internalChecked\n\n const handleClick = () => {\n if (disabled || loading) return\n const next = !isChecked\n setInternalChecked(next)\n onChange?.(next)\n }\n\n if (unstyled) {\n return (\n <button\n role=\"switch\"\n aria-checked={isChecked}\n disabled={disabled || loading}\n onClick={handleClick}\n className={className}\n style={style}\n >\n {loading && <Spin size=\"small\" unstyled />}\n {isChecked ? checkedChildren : unCheckedChildren}\n </button>\n )\n }\n\n const classes = [\n 'sg-switch',\n `sg-switch-${switchSizeClass}`,\n isChecked ? 'sg-switch-checked' : '',\n disabled || loading ? 'sg-switch-disabled' : '',\n loading ? 'sg-switch-loading' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <button\n role=\"switch\"\n aria-checked={isChecked}\n disabled={disabled || loading}\n onClick={handleClick}\n className={classes}\n style={style}\n >\n <span className=\"sg-switch-inner\">\n {loading ? (\n <Spin size=\"small\" unstyled={unstyled} />\n ) : (\n isChecked ? checkedChildren : unCheckedChildren\n )}\n </span>\n <span className=\"sg-switch-handle\" />\n </button>\n )\n}\n","import React, { useState } from 'react'\nimport { Spin } from './Spin'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, SizableProps } from '../../types'\n\n/** Configuration for one tab: label, panel content, and optional states. */\nexport interface TabItem {\n /** Unique key used for selection and ARIA. */\n key: string\n /** Tab label in the tab list. */\n label: React.ReactNode\n /** Panel body shown when this tab is active. */\n children: React.ReactNode\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\n/** Props for the tab list and associated single visible panel. */\nexport interface TabsProps extends BaseComponentProps, SizableProps {\n /**\n * Visual chrome: `card` — bordered strip with the active tab attached to the\n * panel (classic desktop tabs). `line` — minimal underline indicator only.\n * @default 'card'\n */\n type?: 'line' | 'card'\n /** Tab definitions including labels and panel content. */\n items: TabItem[]\n /** Controlled active tab key. */\n activeKey?: string\n /** Initial active tab when `activeKey` is not controlled. */\n defaultActiveKey?: string\n /** Called when the active tab changes after user interaction. */\n onChange?: (key: string) => void\n}\n\n/**\n * Tabbed interface with keyboard navigation between tabs and one visible panel.\n * Resolves initial active key from props, then first item, when uncontrolled.\n */\nexport function Tabs({\n type: typeProp,\n items,\n activeKey,\n defaultActiveKey,\n onChange,\n size: sizeProp,\n className,\n style,\n unstyled,\n}: TabsProps) {\n const config = useConfig()\n const size = sizeProp ?? config.size ?? 'middle'\n const type = typeProp ?? 'card'\n const [internalKey, setInternalKey] = useState(\n activeKey ?? defaultActiveKey ?? items[0]?.key ?? ''\n )\n const currentKey = activeKey ?? internalKey\n const activeItem = items.find((i) => i.key === currentKey)\n\n const handleClick = (key: string, disabled?: boolean, loading?: boolean) => {\n if (disabled || loading) return\n setInternalKey(key)\n onChange?.(key)\n }\n\n if (unstyled) {\n return (\n <div className={className} style={style}>\n <div role=\"tablist\">\n {items.map((item) => (\n <button\n key={item.key}\n role=\"tab\"\n aria-selected={item.key === currentKey}\n disabled={item.disabled || item.loading}\n onClick={() => handleClick(item.key, item.disabled, item.loading)}\n >\n {item.label}\n {item.loading && <Spin size=\"small\" unstyled />}\n </button>\n ))}\n </div>\n <div role=\"tabpanel\">{activeItem?.children}</div>\n </div>\n )\n }\n\n return (\n <div\n className={[\n 'sg-tabs',\n `sg-tabs-${size}`,\n type === 'line' ? 'sg-tabs-line' : 'sg-tabs-card',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={style}\n >\n <div className=\"sg-tabs-nav\" role=\"tablist\">\n {items.map((item) => (\n <div\n key={item.key}\n role=\"tab\"\n aria-selected={item.key === currentKey}\n className={[\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 .filter(Boolean)\n .join(' ')}\n tabIndex={item.key === currentKey ? 0 : -1}\n onClick={() => handleClick(item.key, item.disabled, item.loading)}\n onKeyDown={(e) => {\n const enabledItems = items.filter((i) => !i.disabled && !i.loading)\n if (enabledItems.length === 0) return\n const curIdx = enabledItems.findIndex((i) => i.key === item.key)\n if (e.key === 'ArrowRight' || e.key === 'ArrowDown') {\n e.preventDefault()\n const next = enabledItems[(curIdx + 1) % enabledItems.length]\n if (next) handleClick(next.key)\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') {\n e.preventDefault()\n const prev = enabledItems[(curIdx - 1 + enabledItems.length) % enabledItems.length]\n if (prev) handleClick(prev.key)\n } else if (e.key === 'Home') {\n e.preventDefault()\n handleClick(enabledItems[0].key)\n } else if (e.key === 'End') {\n e.preventDefault()\n handleClick(enabledItems[enabledItems.length - 1].key)\n }\n }}\n >\n {item.label}\n {item.loading && <Spin size=\"small\" unstyled={unstyled} />}\n </div>\n ))}\n </div>\n <div className=\"sg-tabs-content\" role=\"tabpanel\">\n {activeItem?.children}\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { Spin } from './Spin'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, InteractiveProps, SizableProps } from '../../types'\n\n/** Props for the InputNumber component. */\nexport interface InputNumberProps extends BaseComponentProps, InteractiveProps, SizableProps {\n /** Controlled numeric value. */\n value?: number\n /** Uncontrolled initial value. */\n defaultValue?: number\n /** Lower bound applied on change and via stepper. */\n min?: number\n /** Upper bound applied on change and via stepper. */\n max?: number\n /** Amount added or subtracted by the stepper buttons. @default 1 */\n step?: number\n /** Decimal places enforced after clamping. */\n precision?: number\n /** Placeholder when the field has no value. */\n placeholder?: string\n /** Called with the clamped number or null when the field is cleared. */\n onChange?: (value: number | null) => void\n /** Called when the input loses focus. */\n onBlur?: () => void\n}\n\n/** Numeric field with +/- controls, optional bounds, precision, and loading state. */\nexport function InputNumber({\n value,\n defaultValue,\n min,\n max,\n step = 1,\n precision,\n disabled: disabledProp,\n loading,\n placeholder,\n size: sizeProp,\n onChange,\n onBlur,\n className,\n style,\n unstyled,\n}: InputNumberProps) {\n const config = useConfig()\n const size = sizeProp ?? config.size ?? 'middle'\n const disabled = disabledProp ?? config.disabled ?? false\n\n const [internalValue, setInternalValue] = React.useState<number | null>(\n value ?? defaultValue ?? null\n )\n const currentValue = value ?? internalValue\n\n const clamp = (v: number): number => {\n let result = v\n if (min !== undefined && result < min) result = min\n if (max !== undefined && result > max) result = max\n if (precision !== undefined) result = Number(result.toFixed(precision))\n return result\n }\n\n const update = (v: number | null) => {\n const clamped = v !== null ? clamp(v) : null\n setInternalValue(clamped)\n onChange?.(clamped)\n }\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const raw = e.target.value\n if (raw === '' || raw === '-') {\n setInternalValue(null)\n onChange?.(null)\n return\n }\n const num = Number(raw)\n if (!isNaN(num)) update(num)\n }\n\n const increment = () => {\n if (disabled || loading) return\n update((currentValue ?? 0) + step)\n }\n\n const decrement = () => {\n if (disabled || loading) return\n update((currentValue ?? 0) - step)\n }\n\n const wrapperClass = unstyled\n ? className ?? ''\n : [\n 'sg-input-number',\n `sg-input-number-${size}`,\n loading ? 'sg-input-number-loading' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <span className={wrapperClass} style={style}>\n <button\n className={unstyled ? '' : 'sg-input-number-btn sg-input-number-minus'}\n onClick={decrement}\n disabled={disabled || loading || (min !== undefined && (currentValue ?? 0) <= min)}\n tabIndex={-1}\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 className={unstyled ? '' : 'sg-input-number-input'}\n value={currentValue ?? ''}\n placeholder={placeholder}\n disabled={disabled || loading}\n onChange={handleChange}\n onBlur={onBlur}\n />\n <button\n className={unstyled ? '' : 'sg-input-number-btn sg-input-number-plus'}\n onClick={increment}\n disabled={disabled || loading || (max !== undefined && (currentValue ?? 0) >= max)}\n tabIndex={-1}\n >\n +\n </button>\n {loading && <Spin size=\"small\" unstyled={unstyled} />}\n </span>\n )\n}\n","import React, { useState, useRef, useEffect, useMemo, useCallback } from 'react'\nimport { Spin } from './Spin'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, InteractiveProps, SizableProps } from '../../types'\n\n// ── Date helpers ──\n\nfunction isSameDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n )\n}\n\nfunction isToday(d: Date): boolean {\n return isSameDay(d, new Date())\n}\n\nfunction getDaysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate()\n}\n\nfunction startOfDay(d: Date): Date {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate())\n}\n\nfunction cloneDate(d: Date): Date {\n return new Date(d.getTime())\n}\n\n/**\n * Coerce arbitrary input into a valid `Date` or `null`.\n *\n * Form bindings frequently pass non-Date values (empty strings from\n * `defaultValues: { birthDate: '' }`, ISO strings from a server, numbers from\n * timestamps, `Invalid Date` objects). Calling `.getFullYear()` on any of those\n * throws — so normalize at the boundary and treat garbage as \"no value\".\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}\n\nfunction formatDate(d: Date | null, fmt: string): string {\n if (!d) return ''\n const pad = (n: number) => String(n).padStart(2, '0')\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 parseDate(str: string, fmt: string): Date | null {\n if (!str) return null\n const yi = fmt.indexOf('YYYY'),\n mi = fmt.indexOf('MM'),\n di = fmt.indexOf('DD')\n const hi = fmt.indexOf('HH'),\n mni = fmt.indexOf('mm'),\n si = fmt.indexOf('ss')\n\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\n if (isNaN(year) || isNaN(month) || isNaN(day)) return null\n return new Date(year, month, day, hour, min, sec)\n}\n\n// ── Month grid builder ──\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\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\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 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 DAY_NAMES = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']\n\n// ── Picker modes ──\n\nexport type PickerMode = 'date' | 'month' | 'year' | 'week'\n\n/** Named shortcut that sets the calendar to a single date or a range. */\nexport interface DatePreset {\n /** Preset label shown in the sidebar. */\n label: string\n /** Date applied for single picker, or [start, end] for range presets. */\n value: Date | [Date, Date]\n}\n\n/** Fine-grained options when time selection is enabled on the date picker. */\nexport interface ShowTimeConfig {\n /** Time portion format string (supports HH, mm, ss tokens). */\n format?: string\n /** Step between selectable hours in the time scroller. */\n hourStep?: number\n /** Step between selectable minutes in the time scroller. */\n minuteStep?: number\n /** Step between selectable seconds in the time scroller. */\n secondStep?: number\n /** Initial time used when opening the panel without a selected date. */\n defaultValue?: Date\n}\n\n// ── Props ──\n\n/** Props for picking a single calendar date (and optional time) with presets and placement. */\nexport interface DatePickerProps extends BaseComponentProps, InteractiveProps, SizableProps {\n /** Controlled selected date or null when cleared. */\n value?: Date | null\n /** Initial date when uncontrolled. */\n defaultValue?: Date\n /** Called when the value is committed or cleared; second arg is formatted string. */\n onChange?: (date: Date | null, dateString: string) => void\n /** Called when a day is selected in the calendar (including while picking time). */\n onCalendarChange?: (date: Date | null) => void\n /** Placeholder shown when no date is selected. */\n placeholder?: string\n /** Display and parse format (YYYY, MM, DD, HH, mm, ss). */\n format?: string\n /** Granularity: full date, month only, year only, or week (week mode uses date UI). */\n picker?: PickerMode\n /** When true, show default time UI; when an object, pass ShowTimeConfig. */\n showTime?: boolean | ShowTimeConfig\n /** When true, show a Today action in the footer (date mode without time). */\n showToday?: boolean\n /** When true with showTime, show a Now action in the footer. */\n showNow?: boolean\n /** When true, show a clear control when a value exists. */\n allowClear?: boolean\n /** Return true to disable specific calendar days. */\n disabledDate?: (date: Date) => boolean\n /** Sidebar shortcuts for common dates or ranges. */\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 /** Called when the dropdown opens or closes. */\n onOpenChange?: (open: boolean) => void\n /** Called when the panel closes after an outside click (blur semantics). */\n onBlur?: () => void\n /** When true, the field shows text only; otherwise the input is editable. */\n inputReadOnly?: boolean\n}\n\n/** Props for selecting a start and end date (optional time) in one control. */\nexport interface RangePickerProps extends BaseComponentProps, InteractiveProps, SizableProps {\n /** Controlled range; null entries mean that end is not set yet. */\n value?: [Date | null, Date | null]\n /** Initial range when uncontrolled. */\n defaultValue?: [Date, Date]\n /** Called when the range changes; includes formatted strings for both ends. */\n onChange?: (dates: [Date | null, Date | null], dateStrings: [string, string]) => void\n /** Placeholders for start and end inputs. */\n placeholder?: [string, string]\n /** Display format for both values. */\n format?: string\n /** Enable time columns for both ends; object passes ShowTimeConfig. */\n showTime?: boolean | ShowTimeConfig\n /** When true, show a clear control when either end has a value. */\n allowClear?: boolean\n /** Return true to disable specific calendar days. */\n disabledDate?: (date: Date) => boolean\n /** Sidebar shortcuts; tuple values apply as full range, single dates duplicate to range. */\n presets?: DatePreset[]\n /** Node between start and end display (default arrow). */\n separator?: React.ReactNode\n /** Corner alignment of the range dropdown. */\n placement?: 'bottomLeft' | 'bottomRight' | 'topLeft' | 'topRight'\n /** Controlled visibility of the dropdown. */\n open?: boolean\n /** Called when the dropdown opens or closes. */\n onOpenChange?: (open: boolean) => void\n}\n\n// ── TimeScrollColumn ──\n\nfunction TimeScrollColumn({\n items,\n value,\n onChange,\n unstyled,\n}: {\n items: number[]\n value: number\n onChange: (v: number) => void\n unstyled?: boolean\n}) {\n const colRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const el = colRef.current\n if (!el) return\n const active = el.querySelector('[data-active=\"true\"]') as HTMLElement | null\n if (active?.scrollIntoView) active.scrollIntoView({ block: 'nearest' })\n }, [value])\n\n return (\n <div ref={colRef} className={unstyled ? '' : 'sg-dp-time-col'}>\n {items.map((n) => (\n <div\n key={n}\n data-active={n === value}\n className={\n unstyled ? '' : `sg-dp-time-cell${n === value ? ' sg-dp-time-cell-active' : ''}`\n }\n onClick={() => onChange(n)}\n >\n {String(n).padStart(2, '0')}\n </div>\n ))}\n </div>\n )\n}\n\n// ── TimePanel ──\n\nfunction TimePanel({\n value,\n onChange,\n config,\n unstyled,\n}: {\n value: Date\n onChange: (d: Date) => void\n config: ShowTimeConfig\n unstyled?: boolean\n}) {\n const hourStep = config.hourStep ?? 1\n const minuteStep = config.minuteStep ?? 1\n const secondStep = config.secondStep ?? 1\n const showSeconds = (config.format ?? 'HH:mm:ss').includes('ss')\n\n const hours = useMemo(() => {\n const arr: number[] = []\n for (let i = 0; i < 24; i += hourStep) arr.push(i)\n return arr\n }, [hourStep])\n const minutes = useMemo(() => {\n const arr: number[] = []\n for (let i = 0; i < 60; i += minuteStep) arr.push(i)\n return arr\n }, [minuteStep])\n const seconds = useMemo(() => {\n const arr: number[] = []\n for (let i = 0; i < 60; i += secondStep) arr.push(i)\n return arr\n }, [secondStep])\n\n const setH = (h: number) => {\n const d = cloneDate(value)\n d.setHours(h)\n onChange(d)\n }\n const setM = (m: number) => {\n const d = cloneDate(value)\n d.setMinutes(m)\n onChange(d)\n }\n const setS = (s: number) => {\n const d = cloneDate(value)\n d.setSeconds(s)\n onChange(d)\n }\n\n return (\n <div className={unstyled ? '' : 'sg-dp-time-panel'}>\n <TimeScrollColumn\n items={hours}\n value={value.getHours()}\n onChange={setH}\n unstyled={unstyled}\n />\n <TimeScrollColumn\n items={minutes}\n value={value.getMinutes()}\n onChange={setM}\n unstyled={unstyled}\n />\n {showSeconds && (\n <TimeScrollColumn\n items={seconds}\n value={value.getSeconds()}\n onChange={setS}\n unstyled={unstyled}\n />\n )}\n </div>\n )\n}\n\n// ── CalendarPanel (shared by DatePicker and RangePicker) ──\n\nfunction CalendarPanel({\n viewYear,\n viewMonth,\n selectedDate,\n hoverDate,\n rangeStart,\n rangeEnd,\n disabledDate,\n onSelect,\n onHover,\n onMonthChange,\n onYearChange,\n onTitleClick,\n unstyled,\n}: {\n viewYear: number\n viewMonth: number\n selectedDate: Date | null\n hoverDate?: Date | null\n rangeStart?: Date | null\n rangeEnd?: Date | null\n disabledDate?: (d: Date) => boolean\n onSelect: (d: Date) => void\n onHover?: (d: Date | null) => void\n onMonthChange: (delta: number) => void\n onYearChange: (delta: number) => void\n /** When set, the month/year label opens the month picker (single DatePicker). */\n onTitleClick?: () => void\n unstyled?: boolean\n}) {\n const config = useConfig()\n const monthNames = config.locale?.calendar?.monthNames ?? MONTH_NAMES\n const dayNames = config.locale?.calendar?.dayNames ?? DAY_NAMES\n const weeks = useMemo(() => getMonthGrid(viewYear, viewMonth), [viewYear, viewMonth])\n const monthLabel = `${monthNames[viewMonth]} ${viewYear}`\n\n const isInRange = useCallback(\n (d: Date): boolean => {\n if (!rangeStart) return false\n const end = rangeEnd ?? hoverDate\n if (!end) return false\n const s = startOfDay(rangeStart).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 [rangeStart, rangeEnd, hoverDate],\n )\n\n const isRangeEdge = useCallback(\n (d: Date): 'start' | 'end' | null => {\n if (!rangeStart) return null\n if (isSameDay(d, rangeStart)) return 'start'\n const end = rangeEnd ?? hoverDate\n if (end && isSameDay(d, end)) return 'end'\n return null\n },\n [rangeStart, rangeEnd, hoverDate],\n )\n\n const dpLocale = useConfig().locale?.datePicker\n const prevYearLabel = dpLocale?.prevYear ?? 'Previous year'\n const nextYearLabel = dpLocale?.nextYear ?? 'Next year'\n const prevMonthLabel = dpLocale?.prevMonth ?? 'Previous month'\n const nextMonthLabel = dpLocale?.nextMonth ?? 'Next month'\n\n return (\n <div className={unstyled ? '' : 'sg-dp-panel'}>\n <div className={unstyled ? '' : 'sg-dp-panel-header'}>\n <button\n className={unstyled ? '' : 'sg-dp-nav-btn'}\n onClick={() => onYearChange(-1)}\n title={prevYearLabel}\n aria-label={prevYearLabel}\n >\n «\n </button>\n <button\n className={unstyled ? '' : 'sg-dp-nav-btn'}\n onClick={() => onMonthChange(-1)}\n title={prevMonthLabel}\n aria-label={prevMonthLabel}\n >\n ‹\n </button>\n {onTitleClick ? (\n <button\n type=\"button\"\n className={unstyled ? '' : 'sg-dp-panel-title sg-dp-panel-title-btn'}\n onClick={onTitleClick}\n >\n {monthLabel}\n </button>\n ) : (\n <span className={unstyled ? '' : 'sg-dp-panel-title'}>{monthLabel}</span>\n )}\n <button\n className={unstyled ? '' : 'sg-dp-nav-btn'}\n onClick={() => onMonthChange(1)}\n title={nextMonthLabel}\n aria-label={nextMonthLabel}\n >\n ›\n </button>\n <button\n className={unstyled ? '' : 'sg-dp-nav-btn'}\n onClick={() => onYearChange(1)}\n title={nextYearLabel}\n aria-label={nextYearLabel}\n >\n »\n </button>\n </div>\n <table className={unstyled ? '' : 'sg-dp-table'}>\n <thead>\n <tr>\n {dayNames.map((d) => (\n <th key={d} className={unstyled ? '' : 'sg-dp-th'}>\n {d}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {weeks.map((week, wi) => (\n <tr key={wi}>\n {week.map((cell) => {\n const disabled = disabledDate?.(cell.date) ?? false\n const selected = selectedDate ? isSameDay(cell.date, selectedDate) : false\n const today = isToday(cell.date)\n const inRange = isInRange(cell.date)\n const edge = isRangeEdge(cell.date)\n\n const cls = unstyled\n ? ''\n : [\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 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 return (\n <td\n key={cell.date.toISOString()}\n className={cls}\n onClick={() => !disabled && onSelect(cell.date)}\n onMouseEnter={() => onHover?.(cell.date)}\n onMouseLeave={() => onHover?.(null)}\n >\n <span className={unstyled ? '' : 'sg-dp-cell-inner'}>{cell.day}</span>\n </td>\n )\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\n// ── MonthPanel ──\n\nfunction MonthPanel({\n viewYear,\n selectedDate,\n onSelect,\n onYearChange,\n unstyled,\n}: {\n viewYear: number\n selectedDate: Date | null\n onSelect: (month: number) => void\n onYearChange: (delta: number) => void\n unstyled?: boolean\n}) {\n const config = useConfig()\n const monthNames = config.locale?.calendar?.monthNames ?? MONTH_NAMES\n return (\n <div className={unstyled ? '' : 'sg-dp-panel'}>\n <div className={unstyled ? '' : 'sg-dp-panel-header'}>\n <button className={unstyled ? '' : 'sg-dp-nav-btn'} onClick={() => onYearChange(-1)}>\n «\n </button>\n <span className={unstyled ? '' : 'sg-dp-panel-title'}>{viewYear}</span>\n <button className={unstyled ? '' : 'sg-dp-nav-btn'} onClick={() => onYearChange(1)}>\n »\n </button>\n </div>\n <div className={unstyled ? '' : 'sg-dp-month-grid'}>\n {monthNames.map((name, i) => {\n const isSelected =\n selectedDate && selectedDate.getFullYear() === viewYear && selectedDate.getMonth() === i\n const isCurrent = new Date().getFullYear() === viewYear && new Date().getMonth() === i\n const cls = unstyled\n ? ''\n : [\n 'sg-dp-month-cell',\n isSelected ? 'sg-dp-month-cell-selected' : '',\n isCurrent ? 'sg-dp-month-cell-current' : '',\n ]\n .filter(Boolean)\n .join(' ')\n return (\n <div key={i} className={cls} onClick={() => onSelect(i)}>\n {name.substring(0, 3)}\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n\n// ── YearPanel ──\n\nfunction YearPanel({\n viewYear,\n selectedDate,\n onSelect,\n onDecadeChange,\n unstyled,\n}: {\n viewYear: number\n selectedDate: Date | null\n onSelect: (year: number) => void\n onDecadeChange: (delta: number) => void\n unstyled?: boolean\n}) {\n const startYear = Math.floor(viewYear / 10) * 10\n const years = useMemo(() => {\n const arr: number[] = []\n for (let y = startYear - 1; y <= startYear + 10; y++) arr.push(y)\n return arr\n }, [startYear])\n\n return (\n <div className={unstyled ? '' : 'sg-dp-panel'}>\n <div className={unstyled ? '' : 'sg-dp-panel-header'}>\n <button className={unstyled ? '' : 'sg-dp-nav-btn'} onClick={() => onDecadeChange(-10)}>\n «\n </button>\n <span className={unstyled ? '' : 'sg-dp-panel-title'}>\n {startYear} - {startYear + 9}\n </span>\n <button className={unstyled ? '' : 'sg-dp-nav-btn'} onClick={() => onDecadeChange(10)}>\n »\n </button>\n </div>\n <div className={unstyled ? '' : 'sg-dp-year-grid'}>\n {years.map((y) => {\n const isSelected = selectedDate?.getFullYear() === y\n const isCurrent = new Date().getFullYear() === y\n const isOutside = y < startYear || y > startYear + 9\n const cls = unstyled\n ? ''\n : [\n 'sg-dp-year-cell',\n isSelected ? 'sg-dp-year-cell-selected' : '',\n isCurrent ? 'sg-dp-year-cell-current' : '',\n isOutside ? 'sg-dp-year-cell-outside' : '',\n ]\n .filter(Boolean)\n .join(' ')\n return (\n <div key={y} className={cls} onClick={() => onSelect(y)}>\n {y}\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n\n// ── Presets sidebar ──\n\nfunction PresetsSidebar({\n presets,\n onSelect,\n unstyled,\n}: {\n presets: DatePreset[]\n onSelect: (v: DatePreset['value']) => void\n unstyled?: boolean\n}) {\n return (\n <div className={unstyled ? '' : 'sg-dp-presets'}>\n {presets.map((p) => (\n <div\n key={p.label}\n className={unstyled ? '' : 'sg-dp-preset-item'}\n onClick={() => onSelect(p.value)}\n >\n {p.label}\n </div>\n ))}\n </div>\n )\n}\n\n// ═══════════════════════════════════════════════════════\n// DatePicker\n// ═══════════════════════════════════════════════════════\n\n/**\n * Single-date (or month/year) picker with optional time, presets, and typed input.\n * Dropdown placement, open state, and today/now actions are configurable.\n *\n * @default placeholder - `'Select date'`\n * @default picker - `'date'`\n * @default showTime - `false`\n * @default showToday - `true`\n * @default showNow - `false`\n * @default allowClear - `true`\n * @default placement - `'bottomLeft'`\n * @default inputReadOnly - `false`\n */\nexport function DatePicker({\n value,\n defaultValue,\n onChange,\n onCalendarChange,\n placeholder = 'Select date',\n format: formatProp,\n picker = 'date',\n showTime = false,\n showToday = true,\n showNow = false,\n allowClear = true,\n disabledDate,\n presets,\n disabled: disabledProp,\n loading,\n size: sizeProp,\n placement = 'bottomLeft',\n open: openProp,\n onOpenChange,\n onBlur,\n inputReadOnly = false,\n className,\n style,\n unstyled,\n}: DatePickerProps) {\n const config = useConfig()\n const size = sizeProp ?? config.size ?? 'middle'\n const disabled = disabledProp ?? config.disabled ?? false\n const cal = config.locale?.calendar\n const todayBtnLabel = cal?.today ?? 'Today'\n const nowBtnLabel = cal?.now ?? 'Now'\n const okBtnLabel = config.locale?.modal?.okText ?? 'OK'\n\n const timeConfig: ShowTimeConfig = typeof showTime === 'object' ? showTime : {}\n const hasTime = !!showTime\n const fmt =\n formatProp ??\n (hasTime\n ? 'YYYY-MM-DD HH:mm:ss'\n : picker === 'month'\n ? 'YYYY-MM'\n : picker === 'year'\n ? 'YYYY'\n : 'YYYY-MM-DD')\n\n const normalizedValue = toValidDate(value)\n const normalizedDefault = toValidDate(defaultValue)\n\n const [internalValue, setInternalValue] = useState<Date | null>(\n value !== undefined ? normalizedValue : normalizedDefault,\n )\n const [internalOpen, setInternalOpen] = useState(false)\n const [inputText, setInputText] = useState('')\n const [isInputting, setIsInputting] = useState(false)\n\n const currentValue = value !== undefined ? normalizedValue : internalValue\n const isOpen = openProp ?? internalOpen\n\n const [viewYear, setViewYear] = useState(() => (currentValue ?? new Date()).getFullYear())\n const [viewMonth, setViewMonth] = useState(() => (currentValue ?? new Date()).getMonth())\n const [pickerLevel, setPickerLevel] = useState<'date' | 'month' | 'year'>(\n picker === 'year' ? 'year' : picker === 'month' ? 'month' : 'date',\n )\n const [tempTime, setTempTime] = useState<Date>(\n () => currentValue ?? timeConfig.defaultValue ?? new Date(),\n )\n\n const ref = useRef<HTMLDivElement>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n\n const closeDropdown = useCallback(() => {\n setInternalOpen(false)\n onOpenChange?.(false)\n setIsInputting(false)\n onBlur?.()\n }, [onOpenChange, onBlur])\n\n const closeRef = useRef(closeDropdown)\n closeRef.current = closeDropdown\n\n useEffect(() => {\n const handle = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) {\n closeRef.current()\n }\n }\n document.addEventListener('mousedown', handle)\n return () => document.removeEventListener('mousedown', handle)\n }, [])\n\n useEffect(() => {\n if (value !== undefined) {\n const normalized = toValidDate(value)\n setInternalValue(normalized)\n if (normalized) {\n setViewYear(normalized.getFullYear())\n setViewMonth(normalized.getMonth())\n setTempTime(normalized)\n }\n }\n }, [value])\n\n const openDropdown = () => {\n if (disabled || loading) return\n setInternalOpen(true)\n onOpenChange?.(true)\n setPickerLevel(picker === 'year' ? 'year' : picker === 'month' ? 'month' : 'date')\n if (currentValue) {\n setViewYear(currentValue.getFullYear())\n setViewMonth(currentValue.getMonth())\n setTempTime(currentValue)\n }\n }\n\n const commitValue = (d: Date | null) => {\n setInternalValue(d)\n onChange?.(d, d ? formatDate(d, fmt) : '')\n }\n\n const handleDateSelect = (date: Date) => {\n onCalendarChange?.(date)\n\n if (hasTime) {\n const merged = cloneDate(date)\n merged.setHours(tempTime.getHours(), tempTime.getMinutes(), tempTime.getSeconds())\n setTempTime(merged)\n setInternalValue(merged)\n return\n }\n\n commitValue(date)\n closeDropdown()\n }\n\n const handleMonthSelect = (month: number) => {\n if (picker === 'month') {\n const d = new Date(viewYear, month, 1)\n commitValue(d)\n closeDropdown()\n return\n }\n setViewMonth(month)\n setPickerLevel('date')\n }\n\n const handleYearSelect = (year: number) => {\n if (picker === 'year') {\n const d = new Date(year, 0, 1)\n commitValue(d)\n closeDropdown()\n return\n }\n setViewYear(year)\n setPickerLevel(picker === 'month' ? 'month' : 'date')\n }\n\n const handleTimeChange = (d: Date) => {\n setTempTime(d)\n if (currentValue) {\n const merged = cloneDate(currentValue)\n merged.setHours(d.getHours(), d.getMinutes(), d.getSeconds())\n setInternalValue(merged)\n }\n }\n\n const handleTimeOk = () => {\n const final = currentValue ?? tempTime\n commitValue(final)\n closeDropdown()\n }\n\n const handleToday = () => {\n const today = new Date()\n if (hasTime) {\n setViewYear(today.getFullYear())\n setViewMonth(today.getMonth())\n setInternalValue(today)\n setTempTime(today)\n } else {\n commitValue(today)\n closeDropdown()\n }\n }\n\n const handleNow = () => {\n const now = new Date()\n commitValue(now)\n closeDropdown()\n }\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation()\n commitValue(null)\n }\n\n const handlePresetSelect = (val: DatePreset['value']) => {\n const d = Array.isArray(val) ? val[0] : val\n commitValue(d)\n closeDropdown()\n }\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setInputText(e.target.value)\n setIsInputting(true)\n }\n\n const handleInputKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && isInputting) {\n const parsed = parseDate(inputText, fmt)\n if (parsed && !isNaN(parsed.getTime())) {\n commitValue(parsed)\n closeDropdown()\n }\n }\n if (e.key === 'Escape') closeDropdown()\n }\n\n const displayText = isInputting ? inputText : currentValue ? formatDate(currentValue, fmt) : ''\n\n const wrapperCls = unstyled\n ? (className ?? '')\n : [\n 'sg-datepicker',\n `sg-datepicker-${size}`,\n isOpen ? 'sg-datepicker-open' : '',\n disabled ? 'sg-datepicker-disabled' : '',\n loading ? 'sg-datepicker-loading' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const placementCls = `sg-dp-dropdown-${placement}`\n\n return (\n <div className={wrapperCls} ref={ref} style={style}>\n <div\n className={unstyled ? '' : 'sg-datepicker-input'}\n onClick={openDropdown}\n role=\"combobox\"\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n aria-disabled={disabled}\n >\n {inputReadOnly ? (\n <span\n className={\n unstyled\n ? ''\n : ['sg-datepicker-input-text', displayText ? '' : 'sg-datepicker-placeholder']\n .filter(Boolean)\n .join(' ')\n }\n >\n {displayText || placeholder}\n </span>\n ) : (\n <input\n ref={inputRef}\n className={unstyled ? '' : 'sg-datepicker-input-text'}\n value={displayText}\n placeholder={placeholder}\n onChange={handleInputChange}\n onKeyDown={handleInputKeyDown}\n onFocus={openDropdown}\n readOnly={disabled}\n />\n )}\n <span className={unstyled ? '' : 'sg-datepicker-suffix'}>\n {loading ? (\n <Spin size=\"small\" unstyled={unstyled} />\n ) : (\n <>\n {allowClear && currentValue && (\n <span className={unstyled ? '' : 'sg-datepicker-clear'} onClick={handleClear}>\n ×\n </span>\n )}\n <svg\n className={unstyled ? '' : 'sg-datepicker-icon'}\n viewBox=\"0 0 16 16\"\n width=\"14\"\n height=\"14\"\n fill=\"currentColor\"\n >\n <path 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 </svg>\n </>\n )}\n </span>\n </div>\n\n {isOpen && (\n <div className={unstyled ? '' : `sg-dp-dropdown ${placementCls}`}>\n <div className={unstyled ? '' : 'sg-dp-dropdown-inner'}>\n {presets && presets.length > 0 && (\n <PresetsSidebar presets={presets} onSelect={handlePresetSelect} unstyled={unstyled} />\n )}\n <div className={unstyled ? '' : 'sg-dp-content'}>\n {pickerLevel === 'date' && (\n <CalendarPanel\n viewYear={viewYear}\n viewMonth={viewMonth}\n selectedDate={currentValue}\n disabledDate={disabledDate}\n onSelect={handleDateSelect}\n onMonthChange={(d) => {\n const m = viewMonth + d\n if (m < 0) {\n setViewMonth(11)\n setViewYear(viewYear - 1)\n } else if (m > 11) {\n setViewMonth(0)\n setViewYear(viewYear + 1)\n } else setViewMonth(m)\n }}\n onYearChange={(d) => setViewYear(viewYear + d)}\n onTitleClick={\n picker === 'date' && pickerLevel === 'date'\n ? () => setPickerLevel('month')\n : undefined\n }\n unstyled={unstyled}\n />\n )}\n {pickerLevel === 'month' && (\n <MonthPanel\n viewYear={viewYear}\n selectedDate={currentValue}\n onSelect={handleMonthSelect}\n onYearChange={(d) => setViewYear(viewYear + d)}\n unstyled={unstyled}\n />\n )}\n {pickerLevel === 'year' && (\n <YearPanel\n viewYear={viewYear}\n selectedDate={currentValue}\n onSelect={handleYearSelect}\n onDecadeChange={(d) => setViewYear(viewYear + d)}\n unstyled={unstyled}\n />\n )}\n\n {hasTime && pickerLevel === 'date' && (\n <TimePanel\n value={tempTime}\n onChange={handleTimeChange}\n config={timeConfig}\n unstyled={unstyled}\n />\n )}\n\n <div className={unstyled ? '' : 'sg-dp-footer'}>\n <div className={unstyled ? '' : 'sg-dp-footer-start'}>\n {showToday && !hasTime && pickerLevel === 'date' && (\n <button\n className={unstyled ? '' : 'sg-dp-footer-btn sg-dp-today-btn'}\n onClick={handleToday}\n >\n {todayBtnLabel}\n </button>\n )}\n {showNow && hasTime && (\n <button\n className={unstyled ? '' : 'sg-dp-footer-btn sg-dp-now-btn'}\n onClick={handleNow}\n >\n {nowBtnLabel}\n </button>\n )}\n </div>\n <div className={unstyled ? '' : 'sg-dp-footer-end'}>\n {hasTime && (\n <button\n className={unstyled ? '' : 'sg-dp-footer-btn sg-dp-ok-btn'}\n onClick={handleTimeOk}\n >\n {okBtnLabel}\n </button>\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n )\n}\n\n// ═══════════════════════════════════════════════════════\n// RangePicker\n// ═══════════════════════════════════════════════════════\n\n/**\n * Two-month range selector with optional time columns and preset shortcuts.\n * Commits the range after the second date is chosen (or OK when time is enabled).\n *\n * @default placeholder - `['Start date', 'End date']`\n * @default showTime - `false`\n * @default allowClear - `true`\n * @default separator - `'→'`\n * @default placement - `'bottomLeft'`\n */\nexport function RangePicker({\n value,\n defaultValue,\n onChange,\n placeholder = ['Start date', 'End date'],\n format: formatProp,\n showTime = false,\n allowClear = true,\n disabledDate,\n presets,\n separator = '→',\n disabled: disabledProp,\n loading,\n size: sizeProp,\n placement = 'bottomLeft',\n open: openProp,\n onOpenChange,\n className,\n style,\n unstyled,\n}: RangePickerProps) {\n const config = useConfig()\n const size = sizeProp ?? config.size ?? 'middle'\n const disabled = disabledProp ?? config.disabled ?? false\n const okBtnLabel = config.locale?.modal?.okText ?? 'OK'\n\n const hasTime = !!showTime\n const timeConfig: ShowTimeConfig = typeof showTime === 'object' ? showTime : {}\n const fmt = formatProp ?? (hasTime ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD')\n\n const normalizeRange = (\n raw: [unknown, unknown] | null | undefined,\n ): [Date | null, Date | null] => [toValidDate(raw?.[0]), toValidDate(raw?.[1])]\n\n const normalizedValue = value ? normalizeRange(value) : null\n const normalizedDefault = defaultValue ? normalizeRange(defaultValue) : null\n\n const [internalValue, setInternalValue] = useState<[Date | null, Date | null]>(\n normalizedValue ?? normalizedDefault ?? [null, null],\n )\n const [internalOpen, setInternalOpen] = useState(false)\n const [activeIndex, setActiveIndex] = useState<0 | 1>(0)\n const [hoverDate, setHoverDate] = useState<Date | null>(null)\n\n const currentValue = normalizedValue ?? internalValue\n const isOpen = openProp ?? internalOpen\n\n const now = new Date()\n const [leftYear, setLeftYear] = useState(() => (currentValue[0] ?? now).getFullYear())\n const [leftMonth, setLeftMonth] = useState(() => (currentValue[0] ?? now).getMonth())\n const rightYear = leftMonth === 11 ? leftYear + 1 : leftYear\n const rightMonth = leftMonth === 11 ? 0 : leftMonth + 1\n\n const [tempTimes, setTempTimes] = useState<[Date, Date]>([\n currentValue[0] ?? now,\n currentValue[1] ?? now,\n ])\n\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const handle = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) {\n setInternalOpen(false)\n onOpenChange?.(false)\n }\n }\n document.addEventListener('mousedown', handle)\n return () => document.removeEventListener('mousedown', handle)\n }, [onOpenChange])\n\n useEffect(() => {\n if (value) setInternalValue(normalizeRange(value))\n }, [value])\n\n const openDropdown = () => {\n if (disabled || loading) return\n setInternalOpen(true)\n onOpenChange?.(true)\n }\n\n const commitRange = (dates: [Date | null, Date | null]) => {\n setInternalValue(dates)\n onChange?.(dates, [\n dates[0] ? formatDate(dates[0], fmt) : '',\n dates[1] ? formatDate(dates[1], fmt) : '',\n ])\n }\n\n const handleDateSelect = (date: Date) => {\n if (activeIndex === 0) {\n setInternalValue([date, null])\n setActiveIndex(1)\n } else {\n let start = currentValue[0]\n let end = date\n if (start && end.getTime() < start.getTime()) {\n ;[start, end] = [end, start]\n }\n\n if (hasTime) {\n const s = start ? cloneDate(start) : cloneDate(date)\n s.setHours(tempTimes[0].getHours(), tempTimes[0].getMinutes(), tempTimes[0].getSeconds())\n const e = cloneDate(end)\n e.setHours(tempTimes[1].getHours(), tempTimes[1].getMinutes(), tempTimes[1].getSeconds())\n setInternalValue([s, e])\n } else {\n commitRange([start, end])\n setInternalOpen(false)\n onOpenChange?.(false)\n setActiveIndex(0)\n }\n }\n }\n\n const handleTimeOk = () => {\n commitRange(currentValue)\n setInternalOpen(false)\n onOpenChange?.(false)\n setActiveIndex(0)\n }\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation()\n commitRange([null, null])\n setActiveIndex(0)\n }\n\n const handlePresetSelect = (val: DatePreset['value']) => {\n if (Array.isArray(val)) {\n commitRange(val)\n } else {\n commitRange([val, val])\n }\n setInternalOpen(false)\n onOpenChange?.(false)\n }\n\n const moveLeftMonth = (d: number) => {\n const m = leftMonth + d\n if (m < 0) {\n setLeftMonth(11)\n setLeftYear(leftYear - 1)\n } else if (m > 11) {\n setLeftMonth(0)\n setLeftYear(leftYear + 1)\n } else setLeftMonth(m)\n }\n\n const wrapperCls = unstyled\n ? (className ?? '')\n : [\n 'sg-datepicker',\n 'sg-datepicker-range',\n `sg-datepicker-${size}`,\n isOpen ? 'sg-datepicker-open' : '',\n disabled ? 'sg-datepicker-disabled' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <div className={wrapperCls} ref={ref} style={style}>\n <div\n className={unstyled ? '' : 'sg-datepicker-input sg-datepicker-range-input'}\n onClick={openDropdown}\n >\n <span\n className={\n unstyled\n ? ''\n : `sg-datepicker-range-part${activeIndex === 0 ? ' sg-datepicker-range-active' : ''}`\n }\n onClick={(e) => {\n e.stopPropagation()\n setActiveIndex(0)\n openDropdown()\n }}\n >\n {currentValue[0] ? formatDate(currentValue[0], fmt) : placeholder[0]}\n </span>\n <span className={unstyled ? '' : 'sg-datepicker-separator'}>{separator}</span>\n <span\n className={\n unstyled\n ? ''\n : `sg-datepicker-range-part${activeIndex === 1 ? ' sg-datepicker-range-active' : ''}`\n }\n onClick={(e) => {\n e.stopPropagation()\n setActiveIndex(1)\n openDropdown()\n }}\n >\n {currentValue[1] ? formatDate(currentValue[1], fmt) : placeholder[1]}\n </span>\n <span className={unstyled ? '' : 'sg-datepicker-suffix'}>\n {allowClear && (currentValue[0] || currentValue[1]) && (\n <span className={unstyled ? '' : 'sg-datepicker-clear'} onClick={handleClear}>\n ×\n </span>\n )}\n <svg\n className={unstyled ? '' : 'sg-datepicker-icon'}\n viewBox=\"0 0 16 16\"\n width=\"14\"\n height=\"14\"\n fill=\"currentColor\"\n >\n <path 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 </svg>\n </span>\n </div>\n\n {isOpen && (\n <div\n className={\n unstyled ? '' : `sg-dp-dropdown sg-dp-dropdown-range sg-dp-dropdown-${placement}`\n }\n >\n <div className={unstyled ? '' : 'sg-dp-dropdown-inner'}>\n {presets && presets.length > 0 && (\n <PresetsSidebar presets={presets} onSelect={handlePresetSelect} unstyled={unstyled} />\n )}\n <div className={unstyled ? '' : 'sg-dp-content'}>\n <div className={unstyled ? '' : 'sg-dp-range-panels'}>\n <CalendarPanel\n viewYear={leftYear}\n viewMonth={leftMonth}\n selectedDate={null}\n rangeStart={currentValue[0]}\n rangeEnd={currentValue[1]}\n hoverDate={hoverDate}\n disabledDate={disabledDate}\n onSelect={handleDateSelect}\n onHover={setHoverDate}\n onMonthChange={(d) => moveLeftMonth(d)}\n onYearChange={(d) => setLeftYear(leftYear + d)}\n unstyled={unstyled}\n />\n <CalendarPanel\n viewYear={rightYear}\n viewMonth={rightMonth}\n selectedDate={null}\n rangeStart={currentValue[0]}\n rangeEnd={currentValue[1]}\n hoverDate={hoverDate}\n disabledDate={disabledDate}\n onSelect={handleDateSelect}\n onHover={setHoverDate}\n onMonthChange={(d) => moveLeftMonth(d)}\n onYearChange={(d) => setLeftYear(leftYear + d)}\n unstyled={unstyled}\n />\n </div>\n\n {hasTime && currentValue[0] && currentValue[1] && (\n <div className={unstyled ? '' : 'sg-dp-range-time'}>\n <TimePanel\n value={tempTimes[0]}\n onChange={(d) => setTempTimes([d, tempTimes[1]])}\n config={timeConfig}\n unstyled={unstyled}\n />\n <TimePanel\n value={tempTimes[1]}\n onChange={(d) => setTempTimes([tempTimes[0], d])}\n config={timeConfig}\n unstyled={unstyled}\n />\n </div>\n )}\n\n <div className={unstyled ? '' : 'sg-dp-footer'}>\n {hasTime && (\n <button\n className={unstyled ? '' : 'sg-dp-footer-btn sg-dp-ok-btn'}\n onClick={handleTimeOk}\n >\n {okBtnLabel}\n </button>\n )}\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n )\n}\n\n// Attach RangePicker to DatePicker for Ant-like API: DatePicker.RangePicker\n;(DatePicker as unknown as { RangePicker: typeof RangePicker }).RangePicker = RangePicker\n","import React, { useState, useRef, useEffect, useMemo, useCallback } from 'react'\nimport { Spin } from './Spin'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, InteractiveProps, SizableProps } from '../../types'\n\n// ── Helpers ──\n\nfunction pad(n: number): string {\n return String(n).padStart(2, '0')\n}\n\nfunction formatTime(h: number, m: number, s: number, fmt: string, use12h: boolean): string {\n if (use12h) {\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\n .replace('HH', pad(h))\n .replace('mm', pad(m))\n .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\n let h = parts[0] ?? 0\n const m = parts[1] ?? 0\n const s = parts[2] ?? 0\n\n if (isPM && h < 12) h += 12\n if (!isPM && upper.includes('AM') && h === 12) h = 0\n\n return { h, m, s }\n}\n\n// ── ScrollColumn ──\n\nfunction ScrollColumn({\n items,\n value,\n disabledItems,\n onChange,\n unstyled,\n}: {\n items: number[]\n value: number\n disabledItems?: Set<number>\n onChange: (v: number) => void\n unstyled?: boolean\n}) {\n const colRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const el = colRef.current\n if (!el) return\n const active = el.querySelector('[data-active=\"true\"]') as HTMLElement | null\n if (active?.scrollIntoView) {\n active.scrollIntoView({ block: 'nearest', behavior: 'smooth' })\n }\n }, [value])\n\n return (\n <div ref={colRef} className={unstyled ? '' : 'sg-tp-col'}>\n {items.map((n) => {\n const isDisabled = disabledItems?.has(n) ?? false\n const isActive = n === value\n const cls = unstyled ? '' : [\n 'sg-tp-cell',\n isActive ? 'sg-tp-cell-active' : '',\n isDisabled ? 'sg-tp-cell-disabled' : '',\n ].filter(Boolean).join(' ')\n return (\n <div\n key={n}\n data-active={isActive}\n className={cls}\n onClick={() => !isDisabled && onChange(n)}\n >\n {pad(n)}\n </div>\n )\n })}\n </div>\n )\n}\n\n// ── Types ──\n\n/** Props for a single time value picked via scroll columns and optional Now/Clear. */\nexport interface TimePickerProps extends BaseComponentProps, InteractiveProps, SizableProps {\n /** Controlled time string matching the active format. */\n value?: string\n /** Initial time when uncontrolled. */\n defaultValue?: string\n /** Placeholder when the value is empty. */\n placeholder?: string\n /** Display format (HH/hh, mm, ss, A for 12h). */\n format?: string\n /** When true, use 12-hour clock with AM/PM column. */\n use12Hours?: boolean\n /** Step between hour values in the scroller. */\n hourStep?: number\n /** Step between minute values in the scroller. */\n minuteStep?: number\n /** Step between second values in the scroller. */\n secondStep?: number\n /** When true, show the seconds column. */\n showSecond?: boolean\n /** When true, show a Now button that sets current time and closes. */\n showNow?: boolean\n /** When true, show a clear control when a value exists. */\n allowClear?: boolean\n /** Hour values to disable in the hour column. */\n disabledHours?: () => number[]\n /** Minute values to disable for the given hour. */\n disabledMinutes?: (hour: number) => number[]\n /** Second values to disable for the given hour and minute. */\n disabledSeconds?: (hour: number, minute: number) => number[]\n /** Called when the time string changes. */\n onChange?: (timeString: string) => void\n /** Called when the dropdown opens or closes. */\n onOpenChange?: (open: boolean) => void\n /** Controlled visibility of the dropdown. */\n open?: boolean\n /** Reserved for read-only input behavior (currently unused in markup). */\n inputReadOnly?: boolean\n /**\n * Accessible name for the `role=\"combobox\"` trigger. Wrapping the styled\n * trigger in a `<label>` does not associate (the trigger is not a form\n * element), so `aria-label` / `aria-labelledby` is the supported way to\n * give the control a name. Required for axe `aria-input-field-name`.\n */\n 'aria-label'?: string\n /** Id(s) of the element(s) that label the trigger. Mirrors `aria-label`. */\n 'aria-labelledby'?: string\n}\n\n/** Props for two side-by-side TimePicker panels as a start/end range. */\nexport interface TimeRangePickerProps extends BaseComponentProps, InteractiveProps, SizableProps {\n /** Controlled start and end time strings. */\n value?: [string, string]\n /** Initial range when uncontrolled. */\n defaultValue?: [string, string]\n /** Placeholders for start and end fields. */\n placeholder?: [string, string]\n /** Shared display format for both pickers. */\n format?: string\n /** When true, both panels use 12-hour mode. */\n use12Hours?: boolean\n /** Shared hour step for both panels. */\n hourStep?: number\n /** Shared minute step for both panels. */\n minuteStep?: number\n /** Shared second step for both panels. */\n secondStep?: number\n /** When true, show seconds on both panels. */\n showSecond?: boolean\n /** When true, show a clear control when either side has a value. */\n allowClear?: boolean\n /** Node between start and end labels. */\n separator?: React.ReactNode\n /** Called when either start or end time changes. */\n onChange?: (timeStrings: [string, string]) => void\n /** Called when the combined dropdown opens or closes. */\n onOpenChange?: (open: boolean) => void\n /** Controlled visibility of the range dropdown. */\n open?: boolean\n}\n\n// ═══════════════════════════════════════════════════════\n// TimePicker\n// ═══════════════════════════════════════════════════════\n\n/**\n * Scroll-column time picker with optional 12h mode, disabled slots, and Now/Clear.\n * Value is a formatted string; format defaults from use12Hours and showSecond.\n *\n * @default placeholder - `'Select time'`\n * @default use12Hours - `false`\n * @default hourStep - `1`\n * @default minuteStep - `1`\n * @default secondStep - `1`\n * @default showSecond - `true`\n * @default showNow - `true`\n * @default allowClear - `true`\n * @default inputReadOnly - `false`\n */\nexport function TimePicker({\n value,\n defaultValue,\n placeholder = 'Select time',\n format: formatProp,\n use12Hours = false,\n hourStep = 1,\n minuteStep = 1,\n secondStep = 1,\n showSecond = true,\n showNow = true,\n allowClear = true,\n disabledHours,\n disabledMinutes,\n disabledSeconds,\n disabled: disabledProp,\n loading,\n size: sizeProp,\n onChange,\n onOpenChange,\n open: openProp,\n inputReadOnly: _inputReadOnly = false,\n className,\n style,\n unstyled,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n}: TimePickerProps) {\n const config = useConfig()\n const size = sizeProp ?? config.size ?? 'middle'\n const disabled = disabledProp ?? config.disabled ?? false\n\n const fmt = formatProp ?? (use12Hours ? 'hh:mm:ss A' : (showSecond ? 'HH:mm:ss' : 'HH:mm'))\n\n const [internalValue, setInternalValue] = useState(value ?? defaultValue ?? '')\n const [internalOpen, setInternalOpen] = useState(false)\n const currentValue = value !== undefined ? value : internalValue\n const isOpen = openProp ?? internalOpen\n\n const parsed = useMemo(() => parseTime(currentValue), [currentValue])\n const [hour, setHour] = useState(parsed?.h ?? 0)\n const [minute, setMinute] = useState(parsed?.m ?? 0)\n const [second, setSecond] = useState(parsed?.s ?? 0)\n\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const handle = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) {\n setInternalOpen(false)\n onOpenChange?.(false)\n }\n }\n document.addEventListener('mousedown', handle)\n return () => document.removeEventListener('mousedown', handle)\n }, [onOpenChange])\n\n useEffect(() => {\n const p = parseTime(currentValue)\n if (p) {\n setHour(p.h)\n setMinute(p.m)\n setSecond(p.s)\n }\n }, [currentValue])\n\n const hours = useMemo(() => {\n const arr: number[] = []\n if (use12Hours) {\n for (let i = 1; i <= 12; i += hourStep) arr.push(i)\n } else {\n for (let i = 0; i < 24; i += hourStep) arr.push(i)\n }\n return arr\n }, [hourStep, use12Hours])\n\n const minutes = useMemo(() => {\n const arr: number[] = []\n for (let i = 0; i < 60; i += minuteStep) arr.push(i)\n return arr\n }, [minuteStep])\n\n const seconds = useMemo(() => {\n const arr: number[] = []\n for (let i = 0; i < 60; i += secondStep) arr.push(i)\n return arr\n }, [secondStep])\n\n const disHours = useMemo(() => new Set(disabledHours?.() ?? []), [disabledHours])\n const disMinutes = useMemo(() => new Set(disabledMinutes?.(hour) ?? []), [disabledMinutes, hour])\n const disSecs = useMemo(() => new Set(disabledSeconds?.(hour, minute) ?? []), [disabledSeconds, hour, minute])\n\n const commitTime = useCallback((h: number, m: number, s: number) => {\n const str = formatTime(h, m, s, fmt, use12Hours)\n setInternalValue(str)\n onChange?.(str)\n }, [fmt, use12Hours, onChange])\n\n const handleHourChange = (h: number) => {\n const realH = use12Hours ? (h === 12 ? (hour >= 12 ? 12 : 0) : (hour >= 12 ? h + 12 : h)) : h\n setHour(realH)\n commitTime(realH, minute, second)\n }\n\n const handleMinuteChange = (m: number) => {\n setMinute(m)\n commitTime(hour, m, second)\n }\n\n const handleSecondChange = (s: number) => {\n setSecond(s)\n commitTime(hour, minute, s)\n }\n\n const handleNow = () => {\n const now = new Date()\n const h = now.getHours(), m = now.getMinutes(), s = now.getSeconds()\n setHour(h)\n setMinute(m)\n setSecond(s)\n commitTime(h, m, s)\n setInternalOpen(false)\n onOpenChange?.(false)\n }\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation()\n setInternalValue('')\n onChange?.('')\n }\n\n const openDropdown = () => {\n if (disabled || loading) return\n setInternalOpen(true)\n onOpenChange?.(true)\n }\n\n const displayHour = use12Hours ? (hour % 12 || 12) : hour\n\n const wrapperCls = unstyled ? className ?? '' : [\n 'sg-timepicker',\n `sg-timepicker-${size}`,\n isOpen ? 'sg-timepicker-open' : '',\n disabled ? 'sg-timepicker-disabled' : '',\n className,\n ].filter(Boolean).join(' ')\n\n return (\n <div className={wrapperCls} ref={ref} style={style}>\n <div\n className={unstyled ? '' : 'sg-timepicker-input'}\n onClick={openDropdown}\n role=\"combobox\"\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n aria-disabled={disabled}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n >\n <span className={currentValue ? '' : (unstyled ? '' : 'sg-timepicker-placeholder')}>\n {currentValue || placeholder}\n </span>\n <span className={unstyled ? '' : 'sg-timepicker-suffix'}>\n {loading ? (\n <Spin size=\"small\" unstyled={unstyled} />\n ) : (\n <>\n {allowClear && currentValue && (\n <span className={unstyled ? '' : 'sg-timepicker-clear'} onClick={handleClear}>×</span>\n )}\n <svg className={unstyled ? '' : 'sg-timepicker-icon-svg'} viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"currentColor\">\n <path d=\"M8 0a8 8 0 110 16A8 8 0 018 0zm0 1a7 7 0 100 14A7 7 0 008 1zm.5 3v4.5l3 1.5-.5 1-3.5-1.75V4h1z\"/>\n </svg>\n </>\n )}\n </span>\n </div>\n\n {isOpen && (\n <div className={unstyled ? '' : 'sg-tp-dropdown'}>\n <div className={unstyled ? '' : 'sg-tp-columns'}>\n <ScrollColumn\n items={hours}\n value={displayHour}\n disabledItems={disHours}\n onChange={handleHourChange}\n unstyled={unstyled}\n />\n <ScrollColumn\n items={minutes}\n value={minute}\n disabledItems={disMinutes}\n onChange={handleMinuteChange}\n unstyled={unstyled}\n />\n {showSecond && (\n <ScrollColumn\n items={seconds}\n value={second}\n disabledItems={disSecs}\n onChange={handleSecondChange}\n unstyled={unstyled}\n />\n )}\n {use12Hours && (\n <div className={unstyled ? '' : 'sg-tp-col sg-tp-col-ampm'}>\n <div\n className={unstyled ? '' : `sg-tp-cell${hour < 12 ? ' sg-tp-cell-active' : ''}`}\n onClick={() => { if (hour >= 12) { const h = hour - 12; setHour(h); commitTime(h, minute, second) } }}\n >\n AM\n </div>\n <div\n className={unstyled ? '' : `sg-tp-cell${hour >= 12 ? ' sg-tp-cell-active' : ''}`}\n onClick={() => { if (hour < 12) { const h = hour + 12; setHour(h); commitTime(h, minute, second) } }}\n >\n PM\n </div>\n </div>\n )}\n </div>\n {showNow && (\n <div className={unstyled ? '' : 'sg-tp-footer'}>\n <button className={unstyled ? '' : 'sg-tp-now-btn'} onClick={handleNow}>Now</button>\n </div>\n )}\n </div>\n )}\n </div>\n )\n}\n\n// Attach TimeRangePicker for Ant-like API: TimePicker.RangePicker\n/**\n * Range control hosting two TimePicker instances for independent start and end times.\n * Shares format, steps, and 12h setting; inner panels stay open while the range is open.\n *\n * @default placeholder - `['Start', 'End']`\n * @default use12Hours - `false`\n * @default hourStep - `1`\n * @default minuteStep - `1`\n * @default secondStep - `1`\n * @default showSecond - `true`\n * @default allowClear - `true`\n * @default separator - `'→'`\n */\nexport function TimeRangePicker({\n value,\n defaultValue,\n placeholder = ['Start', 'End'],\n format: formatProp,\n use12Hours = false,\n hourStep = 1,\n minuteStep = 1,\n secondStep = 1,\n showSecond = true,\n allowClear = true,\n separator = '→',\n disabled: disabledProp,\n loading,\n size: sizeProp,\n onChange,\n onOpenChange,\n open: openProp,\n className,\n style,\n unstyled,\n}: TimeRangePickerProps) {\n const config = useConfig()\n const size = sizeProp ?? config.size ?? 'middle'\n const disabled = disabledProp ?? config.disabled ?? false\n\n const fmt = formatProp ?? (use12Hours ? 'hh:mm:ss A' : (showSecond ? 'HH:mm:ss' : 'HH:mm'))\n\n const [internalValue, setInternalValue] = useState<[string, string]>(value ?? defaultValue ?? ['', ''])\n const [internalOpen, setInternalOpen] = useState(false)\n const currentValue = value ?? internalValue\n const isOpen = openProp ?? internalOpen\n\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const handle = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) {\n setInternalOpen(false)\n onOpenChange?.(false)\n }\n }\n document.addEventListener('mousedown', handle)\n return () => document.removeEventListener('mousedown', handle)\n }, [onOpenChange])\n\n const handleStartChange = (v: string) => {\n const next: [string, string] = [v, currentValue[1]]\n setInternalValue(next)\n onChange?.(next)\n }\n\n const handleEndChange = (v: string) => {\n const next: [string, string] = [currentValue[0], v]\n setInternalValue(next)\n onChange?.(next)\n }\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation()\n const next: [string, string] = ['', '']\n setInternalValue(next)\n onChange?.(next)\n }\n\n const openDropdown = () => {\n if (disabled || loading) return\n setInternalOpen(true)\n onOpenChange?.(true)\n }\n\n const wrapperCls = unstyled ? className ?? '' : [\n 'sg-timepicker', 'sg-timepicker-range',\n `sg-timepicker-${size}`,\n isOpen ? 'sg-timepicker-open' : '',\n disabled ? 'sg-timepicker-disabled' : '',\n className,\n ].filter(Boolean).join(' ')\n\n return (\n <div className={wrapperCls} ref={ref} style={style}>\n <div className={unstyled ? '' : 'sg-timepicker-input sg-timepicker-range-input'} onClick={openDropdown}>\n <span>{currentValue[0] || placeholder[0]}</span>\n <span className={unstyled ? '' : 'sg-timepicker-separator'}>{separator}</span>\n <span>{currentValue[1] || placeholder[1]}</span>\n <span className={unstyled ? '' : 'sg-timepicker-suffix'}>\n {allowClear && (currentValue[0] || currentValue[1]) && (\n <span className={unstyled ? '' : 'sg-timepicker-clear'} onClick={handleClear}>×</span>\n )}\n </span>\n </div>\n\n {isOpen && (\n <div className={unstyled ? '' : 'sg-tp-dropdown sg-tp-dropdown-range'}>\n <div className={unstyled ? '' : 'sg-tp-range-panels'}>\n <TimePicker\n value={currentValue[0]}\n onChange={handleStartChange}\n format={fmt}\n use12Hours={use12Hours}\n hourStep={hourStep}\n minuteStep={minuteStep}\n secondStep={secondStep}\n showSecond={showSecond}\n showNow={false}\n open={true}\n unstyled={unstyled}\n />\n <TimePicker\n value={currentValue[1]}\n onChange={handleEndChange}\n format={fmt}\n use12Hours={use12Hours}\n hourStep={hourStep}\n minuteStep={minuteStep}\n secondStep={secondStep}\n showSecond={showSecond}\n showNow={false}\n open={true}\n unstyled={unstyled}\n />\n </div>\n </div>\n )}\n </div>\n )\n}\n\n;(TimePicker as unknown as { RangePicker: typeof TimeRangePicker }).RangePicker = TimeRangePicker\n","import React, { useState, useRef, useEffect } from 'react'\nimport { Spin } from './Spin'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, InteractiveProps, SizableProps } from '../../types'\n\n/** Suggestion row shown in the AutoComplete dropdown. */\nexport interface AutoCompleteOption {\n /** Text shown in the list; also used for client-side filtering. */\n label: string\n /** Value written to the input when the row is chosen. */\n value: string\n}\n\n/** Props for text input with filtered suggestions and optional callbacks. */\nexport interface AutoCompleteProps extends BaseComponentProps, InteractiveProps, SizableProps {\n /** Controlled input value. */\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 /** Called when the typed value changes. */\n onChange?: (value: string) => void\n /** Called on each change with the current query string. */\n onSearch?: (query: string) => void\n /** Called when a suggestion is picked from the list. */\n onSelect?: (value: string, option: AutoCompleteOption) => void\n /** Called when the input loses focus. */\n onBlur?: () => void\n}\n\n/**\n * Text field with a dropdown of options filtered as the user types.\n * Opens the list on focus and filters by option label (case-insensitive).\n */\nexport function AutoComplete({\n value,\n defaultValue,\n options,\n placeholder,\n disabled: disabledProp,\n loading,\n size: sizeProp,\n onChange,\n onSearch,\n onSelect,\n onBlur,\n className,\n style,\n unstyled,\n}: AutoCompleteProps) {\n const config = useConfig()\n const size = sizeProp ?? config.size ?? 'middle'\n const disabled = disabledProp ?? config.disabled ?? false\n\n const [internalValue, setInternalValue] = useState(value ?? defaultValue ?? '')\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLDivElement>(null)\n const currentValue = value ?? internalValue\n\n const filtered = options.filter((o) =>\n o.label.toLowerCase().includes(currentValue.toLowerCase())\n )\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false)\n }\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [])\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const v = e.target.value\n setInternalValue(v)\n onChange?.(v)\n onSearch?.(v)\n setOpen(true)\n }\n\n const handleSelect = (opt: AutoCompleteOption) => {\n setInternalValue(opt.value)\n onChange?.(opt.value)\n onSelect?.(opt.value, opt)\n setOpen(false)\n }\n\n const wrapperClass = unstyled\n ? className ?? ''\n : ['sg-autocomplete', `sg-autocomplete-${size}`, loading ? 'sg-autocomplete-loading' : '', className]\n .filter(Boolean)\n .join(' ')\n\n return (\n <div className={wrapperClass} ref={ref} style={style}>\n <span className={unstyled ? '' : 'sg-input-wrapper'}>\n <input\n type=\"text\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded={open && filtered.length > 0}\n className={unstyled ? '' : `sg-input sg-input-${size}`}\n value={currentValue}\n placeholder={placeholder}\n disabled={disabled || loading}\n onChange={handleChange}\n onFocus={() => setOpen(true)}\n onBlur={onBlur}\n />\n {loading && <Spin size=\"small\" unstyled={unstyled} />}\n </span>\n {open && filtered.length > 0 && (\n <div className={unstyled ? '' : 'sg-autocomplete-dropdown'}>\n {filtered.map((opt) => (\n <div\n key={opt.value}\n className={unstyled ? '' : 'sg-autocomplete-option'}\n onMouseDown={() => handleSelect(opt)}\n >\n {opt.label}\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n","import React, { useRef, useCallback } from 'react'\r\nimport { useConfig } from '../ConfigProvider'\r\nimport type { BaseComponentProps, InteractiveProps } from '../../types'\r\n\r\n/** Props for the Slider component. */\r\nexport interface SliderProps extends BaseComponentProps, InteractiveProps {\r\n /** Controlled value within min and max. */\r\n value?: number\r\n /** Uncontrolled initial value. @default 0 */\r\n defaultValue?: number\r\n /** Minimum selectable value. @default 0 */\r\n min?: number\r\n /** Maximum selectable value. @default 100 */\r\n max?: number\r\n /** Increment between valid values. @default 1 */\r\n step?: number\r\n /** Called when the value changes via pointer or keyboard. */\r\n onChange?: (value: number) => void\r\n}\r\n\r\n/** Horizontal slider for picking a number between min and max with keyboard support. */\r\nexport function Slider({\r\n value,\r\n defaultValue = 0,\r\n min = 0,\r\n max = 100,\r\n step = 1,\r\n disabled: disabledProp,\r\n onChange,\r\n className,\r\n style,\r\n unstyled,\r\n}: SliderProps) {\r\n const config = useConfig()\r\n const disabled = disabledProp ?? config.disabled\r\n\r\n const [internalValue, setInternalValue] = React.useState(value ?? defaultValue)\r\n const currentValue = value ?? internalValue\r\n const trackRef = useRef<HTMLDivElement>(null)\r\n\r\n const percent = ((currentValue - min) / (max - min)) * 100\r\n\r\n const updateFromPosition = useCallback(\r\n (clientX: number) => {\r\n if (!trackRef.current || disabled) return\r\n const rect = trackRef.current.getBoundingClientRect()\r\n const ratio = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width))\r\n const raw = min + ratio * (max - min)\r\n const stepped = Math.round(raw / step) * step\r\n const clamped = Math.max(min, Math.min(max, stepped))\r\n setInternalValue(clamped)\r\n onChange?.(clamped)\r\n },\r\n [min, max, step, disabled, onChange],\r\n )\r\n\r\n const handleMouseDown = (e: React.MouseEvent) => {\r\n if (disabled) return\r\n updateFromPosition(e.clientX)\r\n\r\n const handleMove = (ev: MouseEvent) => updateFromPosition(ev.clientX)\r\n const handleUp = () => {\r\n document.removeEventListener('mousemove', handleMove)\r\n document.removeEventListener('mouseup', handleUp)\r\n }\r\n document.addEventListener('mousemove', handleMove)\r\n document.addEventListener('mouseup', handleUp)\r\n }\r\n\r\n const wrapperClass = unstyled\r\n ? className ?? ''\r\n : ['sg-slider', disabled ? 'sg-slider-disabled' : '', className]\r\n .filter(Boolean)\r\n .join(' ')\r\n\r\n return (\r\n <div className={wrapperClass} style={style}>\r\n <div\r\n className={unstyled ? '' : 'sg-slider-track'}\r\n ref={trackRef}\r\n onMouseDown={handleMouseDown}\r\n >\r\n <div\r\n className={unstyled ? '' : 'sg-slider-fill'}\r\n style={{ width: `${percent}%` }}\r\n />\r\n <div\r\n className={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={currentValue}\r\n aria-disabled={disabled}\r\n tabIndex={disabled ? -1 : 0}\r\n onKeyDown={(e) => {\r\n if (disabled) return\r\n if (e.key === 'ArrowRight' || e.key === 'ArrowUp') {\r\n e.preventDefault()\r\n const next = Math.min(max, currentValue + step)\r\n setInternalValue(next)\r\n onChange?.(next)\r\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') {\r\n e.preventDefault()\r\n const next = Math.max(min, currentValue - step)\r\n setInternalValue(next)\r\n onChange?.(next)\r\n }\r\n }}\r\n />\r\n </div>\r\n </div>\r\n )\r\n}\r\n","import React from 'react'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, InteractiveProps } from '../../types'\n\n/** Props for the Rate component. */\nexport interface RateProps extends BaseComponentProps, InteractiveProps {\n /** Controlled rating value. */\n value?: number\n /** Uncontrolled initial rating. @default 0 */\n defaultValue?: number\n /** Number of rating symbols. @default 5 */\n count?: number\n /** Allows selecting half steps between stars. */\n allowHalf?: boolean\n /** Custom node rendered for each rating symbol. @default '★' */\n character?: React.ReactNode\n /** Called when the rating value changes. */\n onChange?: (value: number) => void\n}\n\n/** Star-style rating with hover preview, half steps, and keyboard adjustment. */\nexport function Rate({\n value,\n defaultValue = 0,\n count = 5,\n disabled: disabledProp,\n allowHalf,\n character = '★',\n onChange,\n className,\n style,\n unstyled,\n}: RateProps) {\n const config = useConfig()\n const disabled = disabledProp ?? config.disabled\n const rateLocale = config.locale?.rate\n const ariaLabel = rateLocale?.ariaLabel ?? 'Rating'\n const starLabel = rateLocale?.star ?? ((n: number) => `${n} star${n > 1 ? 's' : ''}`)\n\n const [internalValue, setInternalValue] = React.useState(value ?? defaultValue)\n const [hoverValue, setHoverValue] = React.useState<number | null>(null)\n const currentValue = value ?? internalValue\n const displayValue = hoverValue ?? currentValue\n\n const handleClick = (starValue: number) => {\n if (disabled) return\n const next = currentValue === starValue ? 0 : starValue\n setInternalValue(next)\n onChange?.(next)\n }\n\n const handleStarClick = (starIndex: number, clientX: number, rect: DOMRect) => {\n if (disabled) return\n if (!allowHalf) {\n handleClick(starIndex)\n return\n }\n const isLeftHalf = clientX - rect.left < rect.width / 2\n handleClick(isLeftHalf ? starIndex - 0.5 : starIndex)\n }\n\n const handleStarHover = (starIndex: number, clientX: number, rect: DOMRect) => {\n if (disabled) return\n if (!allowHalf) {\n setHoverValue(starIndex)\n return\n }\n const isLeftHalf = clientX - rect.left < rect.width / 2\n setHoverValue(isLeftHalf ? starIndex - 0.5 : starIndex)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent, _starIndex: number) => {\n if (disabled) return\n if (e.key === 'ArrowRight' || e.key === 'ArrowUp') {\n e.preventDefault()\n const next = Math.min(count, allowHalf ? currentValue + 0.5 : currentValue + 1)\n handleClick(next)\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') {\n e.preventDefault()\n const next = Math.max(0, allowHalf ? currentValue - 0.5 : currentValue - 1)\n handleClick(next)\n }\n }\n\n const wrapperClass = unstyled\n ? (className ?? '')\n : ['sg-rate', disabled ? 'sg-rate-disabled' : '', className].filter(Boolean).join(' ')\n\n return (\n <div className={wrapperClass} style={style} role=\"radiogroup\" aria-label={ariaLabel}>\n {Array.from({ length: count }, (_, i) => {\n const starIndex = i + 1\n const isFull = displayValue >= starIndex\n const isHalf = allowHalf && displayValue >= starIndex - 0.5 && displayValue < starIndex\n\n return (\n <span\n key={i}\n className={\n unstyled\n ? ''\n : [\n 'sg-rate-star',\n isFull ? 'sg-rate-star-full' : '',\n isHalf ? 'sg-rate-star-half' : '',\n ]\n .filter(Boolean)\n .join(' ')\n }\n role=\"radio\"\n aria-checked={isFull}\n aria-label={starLabel(starIndex)}\n tabIndex={disabled ? -1 : 0}\n onClick={(e) =>\n handleStarClick(starIndex, e.clientX, e.currentTarget.getBoundingClientRect())\n }\n onKeyDown={(e) => handleKeyDown(e, starIndex)}\n onMouseMove={(e) =>\n handleStarHover(starIndex, e.clientX, e.currentTarget.getBoundingClientRect())\n }\n onMouseLeave={() => !disabled && setHoverValue(null)}\n >\n {character}\n </span>\n )\n })}\n </div>\n )\n}\n","import React, { useRef } from 'react'\nimport { Button } from './Button'\nimport { Spin } from './Spin'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, InteractiveProps } from '../../types'\n\n/** File entry shown in the upload list after selection or simulated progress. */\nexport interface UploadFile {\n /** Stable unique id for list keys and remove callbacks. */\n uid: string\n /** Display file name. */\n name: string\n /** File size in bytes. */\n size: number\n /** Visual state in the file list row. */\n status: 'uploading' | 'done' | 'error'\n}\n\n/** Props for the file picker trigger, optional custom trigger, and file list UI. */\nexport interface UploadProps extends BaseComponentProps, InteractiveProps {\n /** Passed to the hidden `<input type=\"file\">` accept attribute. */\n accept?: string\n /** Allows selecting more than one file per dialog when supported. */\n multiple?: boolean\n /** Files to render in the list below the trigger. @default [] */\n fileList?: UploadFile[]\n /** Caps how many new files are passed to `onUpload` relative to current list length. */\n maxCount?: number\n /** Called with chosen files after the user confirms the native picker. */\n onUpload?: (files: File[]) => void\n /** Called when the user removes a completed or errored list item. */\n onRemove?: (file: UploadFile) => void\n /** Custom trigger; defaults to a primary Upload button. */\n children?: React.ReactNode\n}\n\n/**\n * Hidden file input with a clickable trigger and optional controlled file list with remove actions.\n */\nexport function Upload({\n accept,\n multiple,\n disabled: disabledProp,\n loading,\n fileList = [],\n maxCount,\n onUpload,\n onRemove,\n children,\n className,\n style,\n unstyled,\n}: UploadProps) {\n const config = useConfig()\n const disabled = disabledProp ?? config.disabled\n const uploadLocale = config.locale?.upload\n const uploadText = uploadLocale?.uploadText ?? 'Upload'\n const removeLabel = uploadLocale?.removeFile ?? 'Remove file'\n const uploadAriaLabel = uploadLocale?.uploadAriaLabel ?? 'Upload file'\n const inputRef = useRef<HTMLInputElement>(null)\n\n const handleClick = () => {\n if (disabled || loading) return\n inputRef.current?.click()\n }\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files ?? [])\n if (maxCount) {\n const remaining = maxCount - fileList.length\n onUpload?.(files.slice(0, Math.max(0, remaining)))\n } else {\n onUpload?.(files)\n }\n if (inputRef.current) inputRef.current.value = ''\n }\n\n const wrapperClass = unstyled\n ? (className ?? '')\n : ['sg-upload', loading ? 'sg-upload-loading' : '', className].filter(Boolean).join(' ')\n\n return (\n <div className={wrapperClass} style={style}>\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n style={{ display: 'none' }}\n aria-label={uploadAriaLabel}\n onChange={handleChange}\n />\n <div onClick={handleClick}>\n {children ?? (\n <Button disabled={disabled} loading={loading}>\n {uploadText}\n </Button>\n )}\n </div>\n {fileList.length > 0 && (\n <div className={unstyled ? '' : 'sg-upload-list'}>\n {fileList.map((file) => (\n <div\n key={file.uid}\n className={\n unstyled\n ? ''\n : ['sg-upload-item', `sg-upload-item-${file.status}`].filter(Boolean).join(' ')\n }\n >\n <span className={unstyled ? '' : 'sg-upload-item-name'}>\n {file.status === 'uploading' && <Spin size=\"small\" unstyled={unstyled} />}\n {file.name}\n </span>\n {file.status !== 'uploading' && (\n <button\n type=\"button\"\n className={unstyled ? '' : 'sg-upload-item-remove'}\n onClick={() => onRemove?.(file)}\n aria-label={`${removeLabel}: ${file.name}`}\n >\n ×\n </button>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n","import React, { useState, useEffect, useRef } from 'react'\nimport { Transition } from './Transition'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps } from '../../types'\n\n/** Visual variant for notification styling and icon. */\nexport type NotificationType = 'success' | 'error' | 'warning' | 'info'\n\n/** Options passed to `notification.open` and shorthand helpers. */\nexport interface NotificationConfig {\n /** Notification style variant; defaults to `info` when omitted in the card. */\n type?: NotificationType\n /** Primary line of text (title). */\n message: React.ReactNode\n /** Optional secondary detail below the message. */\n description?: React.ReactNode\n /** Auto-dismiss delay in ms; `0` disables auto-close. */\n duration?: number\n /** Stable id for deduplication; a generated id is used if omitted. */\n key?: string\n /** Called after the notification is removed (manual or auto). */\n onClose?: () => void\n /** Corner stack this toast belongs to; must match a mounted container. */\n placement?: 'topRight' | 'topLeft' | 'bottomRight' | 'bottomLeft'\n}\n\ninterface NotificationItem extends NotificationConfig {\n id: string\n}\n\ntype Listener = (items: NotificationItem[]) => void\n\nconst listeners = new Set<Listener>()\nlet items: NotificationItem[] = []\nlet counter = 0\n\nfunction notify(all: Listener[]) {\n for (const fn of all) fn([...items])\n}\n\nfunction addNotification(config: NotificationConfig) {\n const id = config.key ?? `sg-notif-${++counter}`\n const item: NotificationItem = { ...config, id }\n items = [...items, item]\n notify([...listeners])\n\n const duration = config.duration ?? 4500\n if (duration > 0) {\n setTimeout(() => removeNotification(id), duration)\n }\n}\n\nfunction removeNotification(id: string) {\n items = items.filter((i) => i.id !== id)\n notify([...listeners])\n}\n\nexport const notification = {\n open: (config: NotificationConfig) => addNotification(config),\n success: (message: React.ReactNode, description?: React.ReactNode) =>\n addNotification({ type: 'success', message, description }),\n error: (message: React.ReactNode, description?: React.ReactNode) =>\n addNotification({ type: 'error', message, description }),\n warning: (message: React.ReactNode, description?: React.ReactNode) =>\n addNotification({ type: 'warning', message, description }),\n info: (message: React.ReactNode, description?: React.ReactNode) =>\n addNotification({ type: 'info', message, description }),\n destroy: () => {\n items = []\n notify([...listeners])\n },\n}\n\nconst typeIcons: Record<NotificationType, string> = {\n success: '✓',\n error: '✕',\n warning: '⚠',\n info: 'ℹ',\n}\n\n/** Props for the region that renders toasts for one corner placement. */\nexport interface NotificationContainerProps extends BaseComponentProps {\n /** Which corner this container listens to; filters incoming notifications. @default 'topRight' */\n placement?: 'topRight' | 'topLeft' | 'bottomRight' | 'bottomLeft'\n}\n\n/**\n * Subscribes to the global notification store and renders matching toasts.\n * Mount one instance per `placement` you use (typically in app root).\n */\nexport function NotificationContainer({\n placement = 'topRight',\n unstyled,\n}: NotificationContainerProps) {\n const [list, setList] = useState<NotificationItem[]>([])\n const listenerRef = useRef<Listener | undefined>(undefined)\n\n useEffect(() => {\n const fn: Listener = (newItems) => setList(newItems)\n listenerRef.current = fn\n listeners.add(fn)\n return () => {\n listeners.delete(fn)\n }\n }, [])\n\n const filtered = list.filter((i) => (i.placement ?? 'topRight') === placement)\n\n if (filtered.length === 0) return null\n\n const containerClass = unstyled\n ? undefined\n : `sg-notification-container sg-notification-${placement}`\n\n return (\n <div className={containerClass}>\n {filtered.map((item) => (\n <Transition\n key={item.id}\n visible={true}\n name={placement.includes('Right') ? 'sg-slide-right' : 'sg-slide-left'}\n unmountOnExit={false}\n >\n <div>\n <NotificationCard\n item={item}\n onClose={() => {\n removeNotification(item.id)\n item.onClose?.()\n }}\n unstyled={unstyled}\n />\n </div>\n </Transition>\n ))}\n </div>\n )\n}\n\nfunction NotificationCard({\n item,\n onClose,\n unstyled,\n}: {\n item: NotificationItem\n onClose: () => void\n unstyled?: boolean\n}) {\n const type = item.type ?? 'info'\n const closeAriaLabel = useConfig().locale?.notification?.closeAriaLabel ?? 'Close'\n\n if (unstyled) {\n return (\n <div role=\"alert\">\n <span>{typeIcons[type]}</span>\n <span>{item.message}</span>\n {item.description && <div>{item.description}</div>}\n <button onClick={onClose} aria-label={closeAriaLabel}>\n ×\n </button>\n </div>\n )\n }\n\n return (\n <div className={`sg-notification sg-notification-${type}`} role=\"alert\">\n <div className=\"sg-notification-icon\">{typeIcons[type]}</div>\n <div className=\"sg-notification-content\">\n <div className=\"sg-notification-message\">{item.message}</div>\n {item.description && <div className=\"sg-notification-description\">{item.description}</div>}\n </div>\n <button className=\"sg-notification-close\" onClick={onClose} aria-label={closeAriaLabel}>\n ×\n </button>\n </div>\n )\n}\n","import React, { useEffect, useCallback, useId } from 'react'\nimport { Button } from './Button'\nimport { Transition } from './Transition'\nimport { useConfig } from '../ConfigProvider'\nimport { useFocusTrap } from '../../hooks/a11y/useFocusTrap'\nimport type { BaseComponentProps } from '../../types'\n\n/** Props for the slide-in drawer panel. */\nexport interface DrawerProps extends BaseComponentProps {\n /** When `true`, the drawer is visible. */\n open: boolean\n /** Called when the drawer should close (Escape, mask, or close button). */\n onClose: () => void\n /** Optional header content next to the close control. */\n title?: React.ReactNode\n /** Main drawer body content. */\n children?: React.ReactNode\n /** Optional footer region (e.g. actions). */\n footer?: React.ReactNode\n /** Edge from which the panel enters. @default 'right' */\n placement?: 'left' | 'right' | 'top' | 'bottom'\n /** Width for left/right placement (CSS length or pixels). @default 378 */\n width?: number | string\n /** Height for top/bottom placement (CSS length or pixels). @default 378 */\n height?: number | string\n /** When `true`, shows a header close button. @default true */\n closable?: boolean\n /** When `true`, renders a dimmed mask behind the panel. @default true */\n mask?: boolean\n /** When `true`, clicking the mask calls `onClose`. @default true */\n maskClosable?: boolean\n}\n\nconst PLACEMENT_TRANSITION: Record<string, string> = {\n left: 'sg-slide-left',\n right: 'sg-slide-right',\n top: 'sg-slide-down',\n bottom: 'sg-slide-up',\n}\n\n/**\n * Side panel drawer with optional mask, placement transitions, and focus trap.\n * Horizontal placement uses `width`; vertical uses `height`.\n */\nexport function Drawer({\n open,\n onClose,\n title,\n children,\n footer,\n placement = 'right',\n width = 378,\n height = 378,\n closable = true,\n mask = true,\n maskClosable = true,\n className,\n style,\n unstyled,\n}: DrawerProps) {\n const uid = useId()\n const titleId = `${uid}-title`\n const bodyId = `${uid}-body`\n const trapRef = useFocusTrap(open)\n const { locale } = useConfig()\n const closeAriaLabel = locale?.drawer?.closeAriaLabel ?? 'Close'\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n },\n [onClose],\n )\n\n useEffect(() => {\n if (open) {\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }\n }, [open, handleKeyDown])\n\n const isHorizontal = placement === 'left' || placement === 'right'\n const sizeStyle: React.CSSProperties = isHorizontal\n ? { width, height: '100%' }\n : { height, width: '100%' }\n\n if (unstyled) {\n if (!open) return null\n return (\n <div\n ref={trapRef}\n className={className}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n aria-describedby={children ? bodyId : undefined}\n >\n {title && <div id={titleId}>{title}</div>}\n <div id={bodyId}>{children}</div>\n {footer && <div>{footer}</div>}\n {closable && (\n <button onClick={onClose} aria-label={closeAriaLabel}>\n ×\n </button>\n )}\n </div>\n )\n }\n\n const transitionName = PLACEMENT_TRANSITION[placement] ?? 'sg-slide-right'\n\n return (\n <Transition visible={open} name=\"sg-fade\" unmountOnExit duration={300}>\n <div className=\"sg-drawer-root\">\n {mask && <div className=\"sg-drawer-mask\" onClick={maskClosable ? onClose : undefined} />}\n <Transition visible={open} name={transitionName} unmountOnExit duration={300}>\n <div\n ref={trapRef}\n className={['sg-drawer', `sg-drawer-${placement}`, className].filter(Boolean).join(' ')}\n style={{ ...sizeStyle, ...style }}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n aria-describedby={children ? bodyId : undefined}\n >\n {(title || closable) && (\n <div className=\"sg-drawer-header\">\n {title && (\n <div className=\"sg-drawer-title\" id={titleId}>\n {title}\n </div>\n )}\n {closable && (\n <Button\n type=\"text\"\n className=\"sg-drawer-close\"\n onClick={onClose}\n aria-label={closeAriaLabel}\n >\n ×\n </Button>\n )}\n </div>\n )}\n <div className=\"sg-drawer-body\" id={bodyId}>\n {children}\n </div>\n {footer && <div className=\"sg-drawer-footer\">{footer}</div>}\n </div>\n </Transition>\n </div>\n </Transition>\n )\n}\n","import React, { useState, useRef, useEffect, useId } from 'react'\nimport { Button } from './Button'\nimport { Transition } from './Transition'\nimport { useFocusTrap } from '../../hooks/a11y/useFocusTrap'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps } from '../../types'\n\n/** Props for the confirmation bubble anchored to a trigger element. */\nexport interface PopconfirmProps extends BaseComponentProps {\n /** Main confirmation question or summary. */\n title: React.ReactNode\n /** Optional supporting text below the title. */\n description?: React.ReactNode\n /** Called when the user confirms. */\n onConfirm?: () => void\n /** Called when the user cancels or dismisses without confirming. */\n onCancel?: () => void\n /** Label for the confirm action button. @default 'Yes' */\n okText?: string\n /** Label for the cancel action button. @default 'No' */\n cancelText?: string\n /** Popover position relative to the trigger. @default 'top' */\n placement?: 'top' | 'bottom' | 'left' | 'right'\n /** Single React element that opens the popconfirm on click. */\n children: React.ReactElement\n /** When `true`, the trigger does not open the popconfirm. */\n disabled?: boolean\n}\n\n/**\n * Lightweight confirm dialog on click: wraps a trigger and shows OK/Cancel.\n * Closes on outside click or after confirm/cancel.\n */\nexport function Popconfirm({\n title,\n description,\n onConfirm,\n onCancel,\n okText: okTextProp,\n cancelText: cancelTextProp,\n placement = 'top',\n children,\n disabled,\n className,\n unstyled,\n}: PopconfirmProps) {\n const popconfirmLocale = useConfig().locale?.popconfirm\n const okText = okTextProp ?? popconfirmLocale?.okText ?? 'Yes'\n const cancelText = cancelTextProp ?? popconfirmLocale?.cancelText ?? 'No'\n const [open, setOpen] = useState(false)\n const ref = useRef<HTMLDivElement>(null)\n const trapRef = useFocusTrap(open)\n const popconfirmId = useId()\n\n useEffect(() => {\n if (!open) return\n const handleClick = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) {\n setOpen(false)\n }\n }\n document.addEventListener('mousedown', handleClick)\n return () => document.removeEventListener('mousedown', handleClick)\n }, [open])\n\n const handleTrigger = () => {\n if (!disabled) setOpen(!open)\n }\n\n const handleConfirm = () => {\n setOpen(false)\n onConfirm?.()\n }\n\n const handleCancel = () => {\n setOpen(false)\n onCancel?.()\n }\n\n if (unstyled) {\n return (\n <div ref={ref} className={className} style={{ position: 'relative', display: 'inline-block' }}>\n <div onClick={handleTrigger} aria-describedby={open ? popconfirmId : undefined}>{children}</div>\n {open && (\n <div id={popconfirmId} role=\"alertdialog\">\n <div>{title}</div>\n {description && <div>{description}</div>}\n <button onClick={handleCancel}>{cancelText}</button>\n <button onClick={handleConfirm}>{okText}</button>\n </div>\n )}\n </div>\n )\n }\n\n return (\n <div\n ref={ref}\n className={['sg-popconfirm-wrapper', className].filter(Boolean).join(' ')}\n >\n <div onClick={handleTrigger} aria-describedby={open ? popconfirmId : undefined}>{children}</div>\n <Transition visible={open} name=\"sg-fade\" unmountOnExit>\n <div id={popconfirmId} role=\"alertdialog\" ref={trapRef} className={`sg-popconfirm sg-popconfirm-${placement}`}>\n <div className=\"sg-popconfirm-arrow\" />\n <div className=\"sg-popconfirm-inner\">\n <div className=\"sg-popconfirm-title\">\n <span className=\"sg-popconfirm-icon\">⚠</span>\n {title}\n </div>\n {description && (\n <div className=\"sg-popconfirm-description\">{description}</div>\n )}\n <div className=\"sg-popconfirm-buttons\">\n <Button size=\"small\" onClick={handleCancel}>{cancelText}</Button>\n <Button size=\"small\" type=\"primary\" onClick={handleConfirm}>{okText}</Button>\n </div>\n </div>\n </div>\n </Transition>\n </div>\n )\n}\n","import React from 'react'\nimport type { BaseComponentProps, SizableProps } from '../../types'\n\n/** Props for the Badge component (count, dot, or status ribbon). */\nexport interface BadgeProps extends BaseComponentProps, SizableProps {\n /** Numeric value shown in the badge; hidden when zero unless `showZero`. */\n count?: number\n /** Renders a small dot indicator instead of a numeric count. */\n dot?: boolean\n /** Maximum count before showing `{overflowCount}+`. @default 99 */\n overflowCount?: number\n /** When true, shows the badge even when `count` is zero. */\n showZero?: boolean\n /** Custom background color for the dot or count (CSS color). */\n color?: string\n /** Preset status style for standalone status badges. */\n status?: 'success' | 'error' | 'warning' | 'processing' | 'default'\n /** Text shown next to the status dot when `status` is set. */\n text?: React.ReactNode\n /** Pixel offset `[right, top]` for the dot or count position. */\n offset?: [number, number]\n /** Wrapped trigger element (e.g. icon or avatar). */\n children?: React.ReactNode\n}\n\n/**\n * Displays a notification count, dot, or status label on a child element.\n */\nexport function Badge({\n count,\n dot,\n overflowCount = 99,\n showZero,\n color,\n status,\n text,\n offset,\n children,\n className,\n style,\n unstyled,\n}: BadgeProps) {\n const hasCount = count !== undefined && (count > 0 || showZero)\n const displayCount = hasCount ? (count! > overflowCount ? `${overflowCount}+` : `${count}`) : null\n\n if (unstyled) {\n return (\n <span\n className={className}\n style={{ position: 'relative', display: 'inline-block', ...style }}\n >\n {children}\n {(dot || hasCount) && <sup>{displayCount}</sup>}\n {status && <span>{text}</span>}\n </span>\n )\n }\n\n if (status && !children) {\n return (\n <span className={['sg-badge-status', className].filter(Boolean).join(' ')}>\n <span\n className={`sg-badge-status-dot sg-badge-status-${status}`}\n style={color ? { background: color } : undefined}\n />\n {text && <span className=\"sg-badge-status-text\">{text}</span>}\n </span>\n )\n }\n\n const isStandalone = !children && (hasCount || dot)\n const offsetStyle: React.CSSProperties | undefined =\n offset && !isStandalone ? { right: -offset[0], marginTop: offset[1] } : undefined\n\n return (\n <span\n className={['sg-badge', isStandalone && 'sg-badge-standalone', className]\n .filter(Boolean)\n .join(' ')}\n >\n {children}\n {dot && !hasCount && (\n <sup\n className=\"sg-badge-dot\"\n style={{ ...offsetStyle, ...(color ? { background: color } : {}) }}\n />\n )}\n {hasCount && (\n <sup\n className=\"sg-badge-count\"\n style={{ ...offsetStyle, ...(color ? { background: color } : {}) }}\n aria-label={displayCount ?? undefined}\n >\n {displayCount}\n </sup>\n )}\n </span>\n )\n}\n","import React from 'react'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, SizableProps } from '../../types'\n\n/** Props for the Tag component (label with optional close control). */\nexport interface TagProps extends BaseComponentProps, SizableProps {\n /** Preset semantic color or any CSS color string for custom tags. @default 'default' */\n color?: 'default' | 'success' | 'error' | 'warning' | 'processing' | string\n /** Shows a close control when true. */\n closable?: boolean\n /** Called when the close control is activated. */\n onClose?: () => void\n /** Whether to show a border around the tag. @default true */\n bordered?: boolean\n /** Tag label content. */\n children: React.ReactNode\n}\n\nconst presetColors = new Set(['default', 'success', 'error', 'warning', 'processing'])\n\n/**\n * Inline label tag with optional preset colors and closable behavior.\n */\nexport function Tag({\n color = 'default',\n closable,\n onClose,\n bordered = true,\n children,\n className,\n style,\n unstyled,\n}: TagProps) {\n const closeAriaLabel = useConfig().locale?.tag?.closeAriaLabel ?? 'Close'\n if (unstyled) {\n return (\n <span className={className} style={style}>\n {children}\n {closable && (\n <span onClick={onClose} role=\"button\">\n ×\n </span>\n )}\n </span>\n )\n }\n\n const isPreset = presetColors.has(color)\n const classes = [\n 'sg-tag',\n isPreset ? `sg-tag-${color}` : '',\n bordered ? '' : 'sg-tag-borderless',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const customStyle: React.CSSProperties = isPreset\n ? { ...style }\n : { ...style, background: color, borderColor: color, color: '#fff' }\n\n return (\n <span className={classes} style={customStyle}>\n {children}\n {closable && (\n <span\n className=\"sg-tag-close\"\n onClick={(e) => {\n e.stopPropagation()\n onClose?.()\n }}\n role=\"button\"\n aria-label={closeAriaLabel}\n >\n ×\n </span>\n )}\n </span>\n )\n}\n","import React from 'react'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, SizeType } from '../../types'\n\n/** Props for the Avatar component (image, icon, or text fallback). */\nexport interface AvatarProps extends BaseComponentProps {\n /** Image URL when displaying a photo avatar. */\n src?: string\n /** Alt text for the image when `src` is set. */\n alt?: string\n /** Accessible name for the avatar when there is no visible text. */\n 'aria-label'?: string\n /** Width/height in px (number) or preset size token. */\n size?: SizeType | number\n /** Outer shape of the avatar. @default 'circle' */\n shape?: 'circle' | 'square'\n /** Icon node shown when `src` is omitted. */\n icon?: React.ReactNode\n /** Text or initials shown when neither `src` nor `icon` is set. */\n children?: React.ReactNode\n}\n\nconst sizeMap: Record<string, number> = {\n small: 24,\n default: 32,\n large: 40,\n}\n\n/**\n * Renders a user avatar from an image URL, icon, or text content.\n */\nexport function Avatar({\n src,\n alt,\n 'aria-label': ariaLabel,\n size: sizeProp,\n shape = 'circle',\n icon,\n children,\n className,\n style,\n unstyled,\n}: AvatarProps) {\n const config = useConfig()\n const size = sizeProp ?? config.size ?? 'middle'\n const avatarSize = typeof size === 'number' ? size : (size === 'middle' ? 'default' : size)\n const px = typeof size === 'number' ? size : sizeMap[avatarSize]\n const fontSize = Math.round(px * 0.45)\n\n if (unstyled) {\n return (\n <span className={className} style={style} role=\"img\" aria-label={ariaLabel}>\n {src ? <img src={src} alt={alt} /> : icon ?? children}\n </span>\n )\n }\n\n const classes = [\n 'sg-avatar',\n `sg-avatar-${shape}`,\n typeof size === 'string' ? `sg-avatar-${avatarSize}` : '',\n className,\n ].filter(Boolean).join(' ')\n\n const sizeStyle: React.CSSProperties = {\n width: px,\n height: px,\n lineHeight: `${px}px`,\n fontSize: src ? undefined : fontSize,\n ...style,\n }\n\n return (\n <span className={classes} style={sizeStyle} role=\"img\" aria-label={ariaLabel}>\n {src ? (\n <img className=\"sg-avatar-image\" src={src} alt={alt} />\n ) : icon ? (\n <span className=\"sg-avatar-icon\">{icon}</span>\n ) : (\n <span className=\"sg-avatar-text\">{children}</span>\n )}\n </span>\n )\n}\n","import React from 'react'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps } from '../../types'\n\n/** One segment in the breadcrumb trail. */\nexport interface BreadcrumbItem {\n /** Segment label or custom content. */\n title: React.ReactNode\n /** When set, the segment renders as a link with this URL. */\n href?: string\n /** Invoked on click; prevents navigation when `href` is also set. */\n onClick?: () => void\n}\n\n/** Props for the breadcrumb navigation list. */\nexport interface BreadcrumbProps extends BaseComponentProps {\n /** Ordered trail from root to current location. */\n items: BreadcrumbItem[]\n /** Node rendered between segments. @default '/' */\n separator?: React.ReactNode\n}\n\n/** Renders a breadcrumb trail with optional links, custom separators, and current-page styling. */\nexport function Breadcrumb({\n items,\n separator = '/',\n className,\n style,\n unstyled,\n}: BreadcrumbProps) {\n const ariaLabel = useConfig().locale?.breadcrumb?.ariaLabel ?? 'Breadcrumb'\n if (unstyled) {\n return (\n <nav className={className} style={style} aria-label={ariaLabel}>\n {items.map((item, i) => (\n <span key={i}>\n {item.href ? <a href={item.href}>{item.title}</a> : item.title}\n {i < items.length - 1 && <span>{separator}</span>}\n </span>\n ))}\n </nav>\n )\n }\n\n return (\n <nav\n className={['sg-breadcrumb', className].filter(Boolean).join(' ')}\n style={style}\n aria-label={ariaLabel}\n >\n {items.map((item, i) => {\n const isLast = i === items.length - 1\n return (\n <React.Fragment key={i}>\n {item.href || item.onClick ? (\n <a\n className=\"sg-breadcrumb-link\"\n href={item.href}\n onClick={(e) => {\n if (item.onClick) {\n e.preventDefault()\n item.onClick()\n }\n }}\n >\n {item.title}\n </a>\n ) : (\n <span className={isLast ? 'sg-breadcrumb-current' : 'sg-breadcrumb-link'}>\n {item.title}\n </span>\n )}\n {!isLast && <span className=\"sg-breadcrumb-separator\">{separator}</span>}\n </React.Fragment>\n )\n })}\n </nav>\n )\n}\n","import React, { useState, useRef, useEffect, useId } from 'react'\nimport { Transition } from './Transition'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps } from '../../types'\n\n/** One entry in the dropdown menu: action row or non-interactive divider. */\nexport interface DropdownItem {\n /** Unique key passed to `onSelect` when the row is activated. */\n key: string\n /** Visible menu row content. */\n label: React.ReactNode\n /** When true, the row cannot be selected. */\n disabled?: boolean\n /** When true, styles the row as a destructive action. */\n danger?: boolean\n /** When true, renders a separator instead of a selectable row. */\n divider?: boolean\n}\n\n/** Props for the trigger + anchored menu dropdown. */\nexport interface DropdownProps extends BaseComponentProps {\n /** Menu rows and optional dividers. */\n items: DropdownItem[]\n /** Called with the item `key` after a successful selection. */\n onSelect?: (key: string) => void\n /** Opens the menu on click or hover. @default 'hover' */\n trigger?: 'click' | 'hover'\n /** Menu position relative to the trigger. @default 'bottomLeft' */\n placement?: 'bottomLeft' | 'bottomRight' | 'topLeft' | 'topRight'\n /** When true, ignores open/close and selection; uses ConfigProvider when omitted. */\n disabled?: boolean\n /** Element rendered as the menu trigger. */\n children: React.ReactElement\n}\n\n/**\n * Anchored menu opened by hover or click, with keyboard support and outside-click close.\n * Styled variant uses a slide transition; unstyled variant renders a minimal structure.\n */\nexport function Dropdown({\n items,\n onSelect,\n trigger = 'hover',\n placement = 'bottomLeft',\n disabled: disabledProp,\n children,\n className,\n unstyled,\n}: DropdownProps) {\n const config = useConfig()\n const disabled = disabledProp ?? config.disabled ?? false\n\n const [open, setOpen] = useState(false)\n const [focusedIndex, setFocusedIndex] = useState(-1)\n const ref = useRef<HTMLDivElement>(null)\n const timerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n const menuId = useId()\n\n useEffect(() => {\n if (!open) return\n const handleClick = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) {\n setOpen(false)\n }\n }\n document.addEventListener('mousedown', handleClick)\n return () => document.removeEventListener('mousedown', handleClick)\n }, [open])\n\n useEffect(() => {\n if (!open) setFocusedIndex(-1)\n }, [open])\n\n const getNextMenuIndex = (current: number, direction: 1 | -1) => {\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\n const handleMouseEnter = () => {\n if (trigger !== 'hover' || disabled) return\n clearTimeout(timerRef.current)\n setOpen(true)\n }\n\n const handleMouseLeave = () => {\n if (trigger !== 'hover') return\n timerRef.current = setTimeout(() => setOpen(false), 100)\n }\n\n const handleClick = () => {\n if (trigger !== 'click' || disabled) return\n setOpen(!open)\n }\n\n const handleSelect = (item: DropdownItem) => {\n if (item.disabled) return\n setOpen(false)\n onSelect?.(item.key)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (disabled) return\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault()\n if (open && focusedIndex >= 0 && !items[focusedIndex].divider) {\n handleSelect(items[focusedIndex])\n } else {\n setOpen(!open)\n }\n break\n case 'Escape':\n e.preventDefault()\n setOpen(false)\n break\n case 'ArrowDown':\n e.preventDefault()\n if (!open) setOpen(true)\n else setFocusedIndex((i) => getNextMenuIndex(i, 1))\n break\n case 'ArrowUp':\n e.preventDefault()\n if (!open) setOpen(true)\n else setFocusedIndex((i) => getNextMenuIndex(i, -1))\n break\n case 'Home':\n if (open) {\n e.preventDefault()\n setFocusedIndex(getNextMenuIndex(-1, 1))\n }\n break\n case 'End':\n if (open) {\n e.preventDefault()\n setFocusedIndex(getNextMenuIndex(items.length, -1))\n }\n break\n }\n }\n\n if (unstyled) {\n return (\n <div ref={ref} className={className} style={{ position: 'relative', display: 'inline-block' }}>\n <div onClick={handleClick} onMouseEnter={handleMouseEnter} onMouseLeave={handleMouseLeave}>\n {children}\n </div>\n {open && (\n <div onMouseEnter={handleMouseEnter} onMouseLeave={handleMouseLeave}>\n {items.map((item) =>\n item.divider ? <hr key={item.key} /> : (\n <div key={item.key} onClick={() => handleSelect(item)}>{item.label}</div>\n )\n )}\n </div>\n )}\n </div>\n )\n }\n\n return (\n <div\n ref={ref}\n className={['sg-dropdown-wrapper', className].filter(Boolean).join(' ')}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n <div\n className=\"sg-dropdown-trigger\"\n aria-expanded={open}\n aria-haspopup=\"menu\"\n aria-controls={menuId}\n tabIndex={disabled ? -1 : 0}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n >\n {children}\n </div>\n <Transition visible={open} name=\"sg-slide-up\" unmountOnExit>\n <div\n className={`sg-dropdown sg-dropdown-${placement}`}\n role=\"menu\"\n id={menuId}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {items.map((item, idx) =>\n item.divider ? (\n <div key={item.key} className=\"sg-dropdown-divider\" role=\"separator\" />\n ) : (\n <div\n key={item.key}\n role=\"menuitem\"\n className={[\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 ].filter(Boolean).join(' ')}\n onClick={() => handleSelect(item)}\n >\n {item.label}\n </div>\n )\n )}\n </div>\n </Transition>\n </div>\n )\n}\n","// react is used for JSX\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, SizableProps } from '../../types'\n\n/** Props for the Progress bar or circular progress indicator. */\nexport interface ProgressProps extends BaseComponentProps, SizableProps {\n /** Completion value from 0 to 100 (clamped). */\n percent: number\n /** Renders a horizontal bar or circular SVG progress. @default 'line' */\n type?: 'line' | 'circle'\n /** Visual state; `normal` becomes success at 100%. @default 'normal' */\n status?: 'normal' | 'success' | 'error' | 'active'\n /** Shows percentage text next to or inside the indicator. @default true */\n showInfo?: boolean\n /** Bar or circle stroke thickness in pixels. */\n strokeWidth?: number\n /** Custom color for the filled portion of the progress. */\n strokeColor?: string\n /** SVG width/height for circle type. @default 120 */\n width?: number\n}\n\n/**\n * Displays task completion as a line or circle, with optional percentage label.\n */\nexport function Progress({\n percent,\n type = 'line',\n status = 'normal',\n showInfo = true,\n strokeWidth,\n strokeColor,\n size: sizeProp,\n width = 120,\n className,\n style,\n unstyled,\n}: ProgressProps) {\n const config = useConfig()\n const size = sizeProp ?? config.size ?? 'middle'\n const progressSize = size === 'small' ? 'small' : 'default'\n\n const clampedPercent = Math.min(100, Math.max(0, percent))\n const resolvedStatus = clampedPercent >= 100 && status === 'normal' ? 'success' : status\n\n if (unstyled) {\n return (\n <div className={className} style={style} role=\"progressbar\" aria-valuenow={clampedPercent}>\n {type === 'line' ? (\n <div style={{ width: '100%', height: strokeWidth ?? 8, background: '#eee' }}>\n <div style={{ width: `${clampedPercent}%`, height: '100%', background: strokeColor ?? '#1677ff' }} />\n </div>\n ) : (\n <span>{clampedPercent}%</span>\n )}\n </div>\n )\n }\n\n if (type === 'circle') {\n const sw = strokeWidth ?? 6\n const radius = (width - sw) / 2\n const circumference = 2 * Math.PI * radius\n const offset = circumference - (clampedPercent / 100) * circumference\n\n return (\n <div\n className={[\n 'sg-progress sg-progress-circle',\n `sg-progress-${resolvedStatus}`,\n className,\n ].filter(Boolean).join(' ')}\n style={style}\n role=\"progressbar\"\n aria-valuenow={clampedPercent}\n >\n <svg width={width} height={width} viewBox={`0 0 ${width} ${width}`}>\n <circle\n className=\"sg-progress-circle-trail\"\n cx={width / 2}\n cy={width / 2}\n r={radius}\n strokeWidth={sw}\n fill=\"none\"\n />\n <circle\n className=\"sg-progress-circle-path\"\n cx={width / 2}\n cy={width / 2}\n r={radius}\n strokeWidth={sw}\n fill=\"none\"\n strokeDasharray={circumference}\n strokeDashoffset={offset}\n strokeLinecap=\"round\"\n style={strokeColor ? { stroke: strokeColor } : undefined}\n transform={`rotate(-90 ${width / 2} ${width / 2})`}\n />\n </svg>\n {showInfo && (\n <span className=\"sg-progress-circle-text\">{clampedPercent}%</span>\n )}\n </div>\n )\n }\n\n const barHeight = strokeWidth ?? (progressSize === 'small' ? 6 : 8)\n\n return (\n <div\n className={[\n 'sg-progress sg-progress-line',\n `sg-progress-${resolvedStatus}`,\n `sg-progress-${progressSize}`,\n className,\n ].filter(Boolean).join(' ')}\n style={style}\n role=\"progressbar\"\n aria-valuenow={clampedPercent}\n >\n <div className=\"sg-progress-outer\">\n <div className=\"sg-progress-inner\" style={{ height: barHeight }}>\n <div\n className=\"sg-progress-bg\"\n style={{\n width: `${clampedPercent}%`,\n ...(strokeColor ? { background: strokeColor } : {}),\n }}\n />\n </div>\n </div>\n {showInfo && (\n <span className=\"sg-progress-text\">{clampedPercent}%</span>\n )}\n </div>\n )\n}\n","import { useState, useRef, useEffect, useCallback, type ReactNode, type KeyboardEvent as ReactKeyboardEvent } from 'react'\nimport type { BaseComponentProps, SizableProps } from '../../types'\n\nfunction collectNavigableItems(\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) collectNavigableItems(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 collectNavigableItems(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(items: MenuItem[], key: string, parent: string | null = null): 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\n/** Single menu entry: leaf item, submenu, group heading, or divider. */\nexport interface MenuItem {\n /** Unique key for selection and open-state tracking. */\n key: string\n /** Visible label or custom node. */\n label: ReactNode\n /** Optional icon shown before the label. */\n icon?: ReactNode\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; omit for a leaf. */\n children?: MenuItem[]\n /** Renders as a titled group or a non-interactive divider. */\n type?: 'group' | 'divider'\n}\n\n/** Props for the hierarchical menu with optional inline, horizontal, or vertical layout. */\nexport interface MenuProps extends BaseComponentProps, SizableProps {\n /** Top-level menu items (may include groups and nested submenus). */\n items: MenuItem[]\n /** Layout and interaction mode for the root menu. @default 'vertical' */\n mode?: 'vertical' | 'horizontal' | 'inline'\n /** Controlled list of selected item keys. */\n selectedKeys?: string[]\n /** Initial selected keys when `selectedKeys` is not set. @default [] */\n defaultSelectedKeys?: string[]\n /** Controlled list of keys for expanded inline submenus. */\n openKeys?: string[]\n /** Initial open submenu keys when `openKeys` is not set. @default [] */\n defaultOpenKeys?: string[]\n /** Called after the user selects a leaf item. */\n onSelect?: (info: { key: string; selectedKeys: string[] }) => void\n /** Called when inline submenu expand/collapse state changes. */\n onOpenChange?: (openKeys: string[]) => void\n /** Collapses inline mode to icons only at the root level. @default false */\n inlineCollapsed?: boolean\n /** Built-in color scheme for styled menus. @default 'light' */\n theme?: 'light' | 'dark'\n}\n\n/**\n * Renders an accessible menu tree with support for groups, dividers, and nested submenus.\n * Supports controlled or uncontrolled selection and open keys.\n */\nexport function Menu({\n items,\n mode = 'vertical',\n selectedKeys,\n defaultSelectedKeys = [],\n openKeys,\n defaultOpenKeys = [],\n onSelect,\n onOpenChange,\n inlineCollapsed = false,\n theme = 'light',\n className,\n style,\n unstyled,\n}: MenuProps) {\n const [internalSelected, setInternalSelected] = useState<string[]>(\n selectedKeys ?? defaultSelectedKeys\n )\n const [internalOpen, setInternalOpen] = useState<string[]>(\n openKeys ?? defaultOpenKeys\n )\n const rootRef = useRef<HTMLUListElement>(null)\n\n const currentSelected = selectedKeys ?? internalSelected\n const currentOpen = openKeys ?? internalOpen\n\n const navigable = collectNavigableItems(items, currentOpen, mode)\n const initialActive =\n currentSelected.find((k) => navigable.some((n) => n.key === k)) ??\n navigable[0]?.key ??\n ''\n const [activeKey, setActiveKey] = useState(initialActive)\n\n useEffect(() => {\n if (!activeKey || !navigable.some((n) => n.key === activeKey)) {\n setActiveKey(navigable[0]?.key ?? '')\n }\n }, [activeKey, navigable])\n\n const handleSelect = (key: string) => {\n const next = [key]\n setInternalSelected(next)\n setActiveKey(key)\n onSelect?.({ key, selectedKeys: next })\n }\n\n const toggleOpen = (key: string) => {\n const next = currentOpen.includes(key)\n ? currentOpen.filter((k) => k !== key)\n : [...currentOpen, key]\n setInternalOpen(next)\n onOpenChange?.(next)\n }\n\n const focusKey = useCallback((key: string) => {\n setActiveKey(key)\n const el = rootRef.current?.querySelector<HTMLElement>(\n `[data-menu-key=\"${CSS.escape(key)}\"]`,\n )\n el?.focus()\n }, [])\n\n const moveBy = useCallback(\n (delta: 1 | -1) => {\n if (navigable.length === 0) return\n const idx = navigable.findIndex((n) => n.key === activeKey)\n const base = idx < 0 ? (delta === 1 ? -1 : 0) : idx\n const next = (base + delta + navigable.length) % navigable.length\n focusKey(navigable[next].key)\n },\n [navigable, activeKey, focusKey],\n )\n\n const isInlineParentOf = (parentKey: string, childKey: string): boolean => {\n const parent = findByKey(items, parentKey)\n if (!parent?.children) return false\n return parent.children.some((c) => c.key === childKey)\n }\n\n const handleRootKeyDown = (e: ReactKeyboardEvent<HTMLUListElement>) => {\n if (navigable.length === 0) return\n const horizontal = 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(navigable[0].key)\n break\n case 'End':\n e.preventDefault()\n focusKey(navigable[navigable.length - 1].key)\n break\n case 'Enter':\n case ' ': {\n const current = findByKey(items, activeKey)\n if (!current || current.disabled) return\n e.preventDefault()\n if (current.children?.length) {\n if (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(items, activeKey)\n if (mode === 'inline' && current?.children?.length) {\n e.preventDefault()\n if (!currentOpen.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(items, activeKey)\n if (!current) return\n if (mode === 'inline' && current.children?.length && currentOpen.includes(current.key)) {\n e.preventDefault()\n toggleOpen(current.key)\n return\n }\n const parent = findParentKey(items, activeKey)\n if (parent && isInlineParentOf(parent, activeKey) && mode === 'inline') {\n e.preventDefault()\n focusKey(parent)\n }\n break\n }\n case 'Escape': {\n const current = findByKey(items, activeKey)\n const parent = findParentKey(items, activeKey)\n if (parent && mode === 'inline' && currentOpen.includes(parent)) {\n e.preventDefault()\n toggleOpen(parent)\n focusKey(parent)\n } else if (current?.children?.length && mode === 'inline' && currentOpen.includes(current.key)) {\n e.preventDefault()\n toggleOpen(current.key)\n }\n break\n }\n }\n }\n\n if (unstyled) {\n return (\n <ul\n ref={rootRef}\n role=\"menu\"\n aria-orientation={mode === 'horizontal' ? 'horizontal' : 'vertical'}\n className={className}\n style={style}\n onKeyDown={handleRootKeyDown}\n >\n {items.map((item) => (\n <UnstyledMenuItem\n key={item.key}\n item={item}\n selectedKeys={currentSelected}\n openKeys={currentOpen}\n activeKey={activeKey}\n onSelect={handleSelect}\n onToggleOpen={toggleOpen}\n onFocusKey={setActiveKey}\n />\n ))}\n </ul>\n )\n }\n\n const rootClasses = [\n 'sg-menu',\n `sg-menu-${mode}`,\n `sg-menu-${theme}`,\n inlineCollapsed ? 'sg-menu-collapsed' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <ul\n ref={rootRef}\n role=\"menu\"\n aria-orientation={mode === 'horizontal' ? 'horizontal' : 'vertical'}\n className={rootClasses}\n style={style}\n onKeyDown={handleRootKeyDown}\n >\n {items.map((item) => (\n <StyledMenuItem\n key={item.key}\n item={item}\n mode={mode}\n selectedKeys={currentSelected}\n openKeys={currentOpen}\n activeKey={activeKey}\n onSelect={handleSelect}\n onToggleOpen={toggleOpen}\n onFocusKey={setActiveKey}\n inlineCollapsed={inlineCollapsed}\n depth={0}\n />\n ))}\n </ul>\n )\n}\n\n/* ---- Unstyled (headless) ---- */\n\nfunction UnstyledMenuItem({\n item,\n selectedKeys,\n openKeys,\n activeKey,\n onSelect,\n onToggleOpen,\n onFocusKey,\n}: {\n item: MenuItem\n selectedKeys: string[]\n openKeys: string[]\n activeKey: string\n onSelect: (key: string) => void\n onToggleOpen: (key: string) => void\n onFocusKey: (key: string) => void\n}) {\n if (item.type === 'divider') return <li role=\"separator\" />\n if (item.type === 'group') {\n return (\n <li role=\"group\">\n <span>{item.label}</span>\n <ul role=\"menu\">\n {item.children?.map((child) => (\n <UnstyledMenuItem\n key={child.key}\n item={child}\n selectedKeys={selectedKeys}\n openKeys={openKeys}\n activeKey={activeKey}\n onSelect={onSelect}\n onToggleOpen={onToggleOpen}\n onFocusKey={onFocusKey}\n />\n ))}\n </ul>\n </li>\n )\n }\n if (item.children?.length) {\n const isOpen = openKeys.includes(item.key)\n const isActive = activeKey === item.key\n return (\n <li>\n <button\n data-menu-key={item.key}\n disabled={item.disabled}\n aria-expanded={isOpen}\n aria-haspopup=\"menu\"\n tabIndex={isActive ? 0 : -1}\n onClick={() => onToggleOpen(item.key)}\n onFocus={() => onFocusKey(item.key)}\n >\n {item.icon}\n {item.label}\n </button>\n {isOpen && (\n <ul role=\"menu\">\n {item.children.map((child) => (\n <UnstyledMenuItem\n key={child.key}\n item={child}\n selectedKeys={selectedKeys}\n openKeys={openKeys}\n activeKey={activeKey}\n onSelect={onSelect}\n onToggleOpen={onToggleOpen}\n onFocusKey={onFocusKey}\n />\n ))}\n </ul>\n )}\n </li>\n )\n }\n const isActive = activeKey === item.key\n return (\n <li\n role=\"menuitem\"\n data-menu-key={item.key}\n tabIndex={isActive ? 0 : -1}\n aria-selected={selectedKeys.includes(item.key)}\n aria-disabled={item.disabled || undefined}\n onClick={() => !item.disabled && onSelect(item.key)}\n onFocus={() => onFocusKey(item.key)}\n >\n {item.icon}\n {item.label}\n </li>\n )\n}\n\n/* ---- Styled ---- */\n\nfunction StyledMenuItem({\n item,\n mode,\n selectedKeys,\n openKeys,\n activeKey,\n onSelect,\n onToggleOpen,\n onFocusKey,\n inlineCollapsed,\n depth,\n}: {\n item: MenuItem\n mode: 'vertical' | 'horizontal' | 'inline'\n selectedKeys: string[]\n openKeys: string[]\n activeKey: string\n onSelect: (key: string) => void\n onToggleOpen: (key: string) => void\n onFocusKey: (key: string) => void\n inlineCollapsed: boolean\n depth: number\n}) {\n const popoverRef = useRef<HTMLLIElement>(null)\n const [hoverOpen, setHoverOpen] = useState(false)\n const timerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n\n useEffect(() => {\n return () => clearTimeout(timerRef.current)\n }, [])\n\n if (item.type === 'divider') {\n return <li className=\"sg-menu-divider\" role=\"separator\" />\n }\n\n if (item.type === 'group') {\n return (\n <li className=\"sg-menu-group\" role=\"group\">\n <div className=\"sg-menu-group-title\">{item.label}</div>\n <ul className=\"sg-menu-group-list\" role=\"menu\">\n {item.children?.map((child) => (\n <StyledMenuItem\n key={child.key}\n item={child}\n mode={mode}\n selectedKeys={selectedKeys}\n openKeys={openKeys}\n activeKey={activeKey}\n onSelect={onSelect}\n onToggleOpen={onToggleOpen}\n onFocusKey={onFocusKey}\n inlineCollapsed={inlineCollapsed}\n depth={depth}\n />\n ))}\n </ul>\n </li>\n )\n }\n\n const hasChildren = !!(item.children && item.children.length > 0)\n const isSelected = selectedKeys.includes(item.key)\n const isInlineOpen = openKeys.includes(item.key)\n const showPopover = mode !== 'inline' && hasChildren\n const showInlineSub = mode === 'inline' && hasChildren\n\n const itemClasses = [\n 'sg-menu-item',\n isSelected && !hasChildren ? 'sg-menu-item-selected' : '',\n item.disabled ? 'sg-menu-item-disabled' : '',\n item.danger ? 'sg-menu-item-danger' : '',\n hasChildren ? 'sg-menu-submenu' : '',\n ]\n .filter(Boolean)\n .join(' ')\n\n const handleMouseEnter = () => {\n if (!showPopover || item.disabled) return\n clearTimeout(timerRef.current)\n setHoverOpen(true)\n }\n\n const handleMouseLeave = () => {\n if (!showPopover) return\n timerRef.current = setTimeout(() => setHoverOpen(false), 150)\n }\n\n const handleItemClick = () => {\n if (item.disabled) return\n if (showInlineSub) {\n onToggleOpen(item.key)\n return\n }\n if (!hasChildren) {\n onSelect(item.key)\n }\n }\n\n const paddingLeft =\n mode === 'inline' && !inlineCollapsed ? `${24 + depth * 24}px` : undefined\n\n return (\n <li\n ref={popoverRef}\n className={[\n hasChildren ? 'sg-menu-submenu-wrapper' : '',\n showPopover && hoverOpen ? 'sg-menu-submenu-open' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n <div\n role=\"menuitem\"\n data-menu-key={item.key}\n tabIndex={activeKey === item.key ? 0 : -1}\n aria-selected={isSelected}\n aria-disabled={item.disabled || undefined}\n aria-haspopup={hasChildren ? 'menu' : undefined}\n aria-expanded={hasChildren ? (showPopover ? hoverOpen : isInlineOpen) : undefined}\n className={itemClasses}\n style={{ paddingLeft }}\n onClick={handleItemClick}\n onFocus={() => onFocusKey(item.key)}\n >\n {item.icon && <span className=\"sg-menu-item-icon\">{item.icon}</span>}\n {!(inlineCollapsed && depth === 0) && (\n <span className=\"sg-menu-item-label\">{item.label}</span>\n )}\n {hasChildren && (\n <span\n className={[\n 'sg-menu-submenu-arrow',\n (showPopover ? hoverOpen : isInlineOpen)\n ? 'sg-menu-submenu-arrow-open'\n : '',\n ]\n .filter(Boolean)\n .join(' ')}\n />\n )}\n </div>\n\n {/* Inline submenu */}\n {showInlineSub && (\n <ul\n className={[\n 'sg-menu-inline-sub',\n isInlineOpen ? 'sg-menu-inline-sub-open' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n role=\"menu\"\n >\n {item.children!.map((child) => (\n <StyledMenuItem\n key={child.key}\n item={child}\n mode={mode}\n selectedKeys={selectedKeys}\n openKeys={openKeys}\n activeKey={activeKey}\n onSelect={onSelect}\n onToggleOpen={onToggleOpen}\n onFocusKey={onFocusKey}\n inlineCollapsed={inlineCollapsed}\n depth={depth + 1}\n />\n ))}\n </ul>\n )}\n\n {/* Popover submenu (vertical / horizontal) */}\n {showPopover && hoverOpen && (\n <ul className=\"sg-menu-popup\" role=\"menu\">\n {item.children!.map((child) => (\n <StyledMenuItem\n key={child.key}\n item={child}\n mode={mode}\n selectedKeys={selectedKeys}\n openKeys={openKeys}\n activeKey={activeKey}\n onSelect={onSelect}\n onToggleOpen={onToggleOpen}\n onFocusKey={onFocusKey}\n inlineCollapsed={false}\n depth={0}\n />\n ))}\n </ul>\n )}\n </li>\n )\n}\n","import { useState, useRef, useEffect, type ReactNode } from 'react'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, SizableProps } from '../../types'\n\n/** Single collapsible section: header, body, and optional metadata. */\nexport interface CollapseItem {\n /** Unique key used for selection state and toggling. */\n key: string\n /** Header content shown in the panel trigger. */\n label: ReactNode\n /** Body content revealed when the panel is expanded. */\n children: ReactNode\n /** Optional content rendered beside the header (e.g. actions). */\n extra?: ReactNode\n /** When `false`, hides the expand/collapse arrow. */\n showArrow?: boolean\n /** When `true`, the panel cannot be toggled. */\n disabled?: boolean\n}\n\n/** Props for the vertical accordion-style collapse list. */\nexport interface CollapseProps extends BaseComponentProps, SizableProps {\n /** Panels to render, each with a stable `key`. */\n items: CollapseItem[]\n /** Controlled open keys; when set, overrides internal state. */\n activeKey?: string | string[]\n /** Initial open keys when uncontrolled. */\n defaultActiveKey?: string | string[]\n /** Called after the open set changes (controlled or uncontrolled). */\n onChange?: (activeKey: string[]) => void\n /** When `true`, only one panel may be open at a time. @default false */\n accordion?: boolean\n /** When `true`, draws a border around the collapse container. @default true */\n bordered?: boolean\n /** Placement of the expand icon relative to the header text. @default 'start' */\n expandIconPosition?: 'start' | 'end'\n /** Transparent style without panel background borders. @default false */\n ghost?: boolean\n}\n\nfunction toArray(val?: string | string[]): string[] {\n if (val === undefined) return []\n return Array.isArray(val) ? val : [val]\n}\n\n/**\n * Renders an expandable list of panels with optional accordion mode and styled or unstyled markup.\n */\nexport function Collapse({\n items,\n activeKey,\n defaultActiveKey,\n onChange,\n accordion = false,\n bordered = true,\n expandIconPosition = 'start',\n ghost = false,\n size: sizeProp,\n className,\n style,\n unstyled,\n}: CollapseProps) {\n const config = useConfig()\n const size = sizeProp ?? config.size ?? 'middle'\n\n const [internalActive, setInternalActive] = useState<string[]>(\n toArray(activeKey ?? defaultActiveKey),\n )\n const currentActive = activeKey !== undefined ? toArray(activeKey) : internalActive\n\n const toggle = (key: string) => {\n let next: string[]\n if (accordion) {\n next = currentActive.includes(key) ? [] : [key]\n } else {\n next = currentActive.includes(key)\n ? currentActive.filter((k) => k !== key)\n : [...currentActive, key]\n }\n setInternalActive(next)\n onChange?.(next)\n }\n\n if (unstyled) {\n return (\n <div className={className} style={style}>\n {items.map((item) => {\n const isActive = currentActive.includes(item.key)\n return (\n <div key={item.key}>\n <button\n disabled={item.disabled}\n aria-expanded={isActive}\n onClick={() => !item.disabled && toggle(item.key)}\n >\n {item.label}\n {item.extra}\n </button>\n {isActive && <div>{item.children}</div>}\n </div>\n )\n })}\n </div>\n )\n }\n\n const rootClasses = [\n 'sg-collapse',\n bordered ? 'sg-collapse-bordered' : '',\n ghost ? 'sg-collapse-ghost' : '',\n `sg-collapse-${size}`,\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <div className={rootClasses} style={style}>\n {items.map((item) => {\n const isActive = currentActive.includes(item.key)\n const showArrow = item.showArrow !== false\n return (\n <CollapsePanel\n key={item.key}\n item={item}\n isActive={isActive}\n showArrow={showArrow}\n expandIconPosition={expandIconPosition}\n onToggle={() => !item.disabled && toggle(item.key)}\n />\n )\n })}\n </div>\n )\n}\n\nfunction CollapsePanel({\n item,\n isActive,\n showArrow,\n expandIconPosition,\n onToggle,\n}: {\n item: CollapseItem\n isActive: boolean\n showArrow: boolean\n expandIconPosition: 'start' | 'end'\n onToggle: () => void\n}) {\n const contentRef = useRef<HTMLDivElement>(null)\n const [height, setHeight] = useState<number | undefined>(undefined)\n const firstRender = useRef(true)\n\n useEffect(() => {\n if (firstRender.current) {\n firstRender.current = false\n if (isActive && contentRef.current) {\n setHeight(contentRef.current.scrollHeight)\n }\n return\n }\n if (!contentRef.current) return\n if (isActive) {\n setHeight(contentRef.current.scrollHeight)\n } else {\n setHeight(contentRef.current.scrollHeight)\n requestAnimationFrame(() => {\n setHeight(0)\n })\n }\n }, [isActive])\n\n const handleTransitionEnd = () => {\n if (isActive && contentRef.current) {\n setHeight(undefined)\n }\n }\n\n const panelClasses = [\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 const arrow = showArrow ? (\n <span\n className={['sg-collapse-arrow', isActive ? 'sg-collapse-arrow-open' : '']\n .filter(Boolean)\n .join(' ')}\n />\n ) : null\n\n return (\n <div className={panelClasses}>\n <div\n className=\"sg-collapse-header\"\n role=\"button\"\n tabIndex={item.disabled ? -1 : 0}\n aria-expanded={isActive}\n onClick={onToggle}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onToggle()\n }\n }}\n >\n {expandIconPosition === 'start' && arrow}\n <span className=\"sg-collapse-header-text\">{item.label}</span>\n {expandIconPosition === 'end' && arrow}\n {item.extra && <span className=\"sg-collapse-extra\">{item.extra}</span>}\n </div>\n <div\n ref={contentRef}\n className=\"sg-collapse-content\"\n style={{\n ['--sg-collapse-content-max-height' as string]:\n height !== undefined ? `${height}px` : isActive ? 'none' : '0px',\n }}\n onTransitionEnd={handleTransitionEnd}\n >\n <div className=\"sg-collapse-content-inner\">{item.children}</div>\n </div>\n </div>\n )\n}\n","import React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n type ReactNode,\n} from 'react'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, InteractiveProps, SizableProps } from '../../types'\n\n/** Props for a color swatch trigger with saturation/hue panel and optional presets. */\nexport interface ColorPickerProps extends BaseComponentProps, InteractiveProps, SizableProps {\n /** Controlled color as hex (#rrggbb) or rgb(...) string matching parse rules. */\n value?: string\n /** Initial color when uncontrolled. */\n defaultValue?: string\n /** Called when the color changes; receives string in the active format prop. */\n onChange?: (color: string) => void\n /** Optional grouped preset swatches (label + color strings). */\n presets?: Array<{ label: string; colors: string[] }>\n /** When true, show formatted text; when a function, render custom node beside swatch. */\n showText?: boolean | ((color: string) => ReactNode)\n /** String format used for display and onChange payload. */\n format?: 'hex' | 'rgb'\n /** Whether the panel opens on click or on hover (with a short leave delay). */\n trigger?: 'click' | 'hover'\n /** Controlled open state of the picker panel. */\n open?: boolean\n /** Called when the panel opens or closes. */\n onOpenChange?: (open: boolean) => void\n /**\n * Accessible name for the trigger button. The trigger only shows a color\n * swatch (and optional `showText`), so without a programmatic name axe\n * `button-name` flags the control. Provide either `aria-label` or\n * `aria-labelledby`; if `showText` renders text, that text is enough.\n */\n 'aria-label'?: string\n /** Id(s) of the element(s) that label the trigger. Mirrors `aria-label`. */\n 'aria-labelledby'?: string\n}\n\n/* ---- Color math helpers ---- */\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\n ? clean[0] + clean[0] + clean[1] + clean[1] + clean[2] + clean[2]\n : 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 (\n '#' +\n [r, g, b].map((v) => Math.round(v).toString(16).padStart(2, '0')).join('')\n )\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; g = t; b = p\n break\n case 1:\n r = q; g = v; b = p\n break\n case 2:\n r = p; g = v; b = t\n break\n case 3:\n r = p; g = q; b = v\n break\n case 4:\n r = t; g = p; b = v\n break\n case 5:\n r = v; g = p; 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, format: 'hex' | 'rgb'): string {\n if (format === '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 rgbMatch = trimmed.match(\n /^rgb\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*\\)$/i\n )\n if (rgbMatch) {\n const [, rs, gs, bs] = rgbMatch\n const r = Math.min(255, parseInt(rs))\n const g = Math.min(255, parseInt(gs))\n const b = Math.min(255, parseInt(bs))\n return rgbToHex(r, g, b)\n }\n return null\n}\n\nconst DEFAULT_COLOR = '#1677ff'\n\n/* ---- Component ---- */\n\n/**\n * Color picker with saturation/value square, hue strip, text input, and optional presets.\n * Supports click or hover trigger and controlled or internal open state.\n *\n * @default format - `'hex'`\n * @default trigger - `'click'`\n */\nexport function ColorPicker({\n value,\n defaultValue,\n onChange,\n presets,\n showText,\n size: sizeProp,\n disabled: disabledProp,\n format = 'hex',\n trigger = 'click',\n open: controlledOpen,\n onOpenChange,\n className,\n style,\n unstyled,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n}: ColorPickerProps) {\n const config = useConfig()\n const size = sizeProp ?? config.size ?? 'middle'\n const disabled = disabledProp ?? config.disabled ?? false\n\n const [internalColor, setInternalColor] = useState(\n value ?? defaultValue ?? DEFAULT_COLOR\n )\n const currentHex = (value ?? internalColor).toLowerCase()\n\n const [hsv, setHsv] = useState<HSV>(() => {\n const [r, g, b] = hexToRgb(currentHex)\n return rgbToHsv(r, g, b)\n })\n\n const [internalOpen, setInternalOpen] = useState(false)\n const isOpen = controlledOpen ?? internalOpen\n const [textInput, setTextInput] = useState(formatColor(currentHex, format))\n\n const wrapperRef = useRef<HTMLDivElement>(null)\n const timerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n const satPanelRef = useRef<HTMLDivElement>(null)\n const hueBarRef = useRef<HTMLDivElement>(null)\n const draggingRef = useRef<'sat' | 'hue' | null>(null)\n\n useEffect(() => {\n if (value) {\n const [r, g, b] = hexToRgb(value)\n setHsv(rgbToHsv(r, g, b))\n setTextInput(formatColor(value, format))\n }\n }, [value, format])\n\n const emitChange = useCallback(\n (hex: string) => {\n setInternalColor(hex)\n setTextInput(formatColor(hex, format))\n onChange?.(formatColor(hex, format))\n },\n [format, onChange]\n )\n\n const setOpenState = (v: boolean) => {\n setInternalOpen(v)\n onOpenChange?.(v)\n }\n\n /* Close on outside click */\n useEffect(() => {\n if (!isOpen) return\n const handler = (e: MouseEvent) => {\n if (wrapperRef.current && !wrapperRef.current.contains(e.target as Node)) {\n setOpenState(false)\n }\n }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen])\n\n /* Trigger handlers */\n const handleTriggerClick = () => {\n if (disabled || trigger !== 'click') return\n setOpenState(!isOpen)\n }\n\n const handleMouseEnter = () => {\n if (disabled || trigger !== 'hover') return\n clearTimeout(timerRef.current)\n setOpenState(true)\n }\n\n const handleMouseLeave = () => {\n if (trigger !== 'hover') return\n timerRef.current = setTimeout(() => setOpenState(false), 200)\n }\n\n /* Saturation/Brightness panel drag */\n const handleSatPointerDown = (e: React.PointerEvent) => {\n e.preventDefault()\n draggingRef.current = 'sat'\n ;(e.target as HTMLElement).setPointerCapture(e.pointerId)\n updateSat(e.nativeEvent)\n }\n\n const handleSatPointerMove = (e: React.PointerEvent) => {\n if (draggingRef.current !== 'sat') return\n updateSat(e.nativeEvent)\n }\n\n const handleSatPointerUp = () => {\n draggingRef.current = null\n }\n\n const updateSat = (e: PointerEvent) => {\n if (!satPanelRef.current) return\n const rect = satPanelRef.current.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, s, v }\n setHsv(next)\n emitChange(hsvToHex(next.h, next.s, next.v))\n }\n\n /* Hue bar drag */\n const handleHuePointerDown = (e: React.PointerEvent) => {\n e.preventDefault()\n draggingRef.current = 'hue'\n ;(e.target as HTMLElement).setPointerCapture(e.pointerId)\n updateHue(e.nativeEvent)\n }\n\n const handleHuePointerMove = (e: React.PointerEvent) => {\n if (draggingRef.current !== 'hue') return\n updateHue(e.nativeEvent)\n }\n\n const handleHuePointerUp = () => {\n draggingRef.current = null\n }\n\n const updateHue = (e: PointerEvent) => {\n if (!hueBarRef.current) return\n const rect = hueBarRef.current.getBoundingClientRect()\n const h = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width))\n const next = { ...hsv, h }\n setHsv(next)\n emitChange(hsvToHex(next.h, next.s, next.v))\n }\n\n /* Text input */\n const handleTextChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value\n setTextInput(val)\n const parsed = parseColor(val)\n if (parsed) {\n const [r, g, b] = hexToRgb(parsed)\n setHsv(rgbToHsv(r, g, b))\n emitChange(parsed)\n }\n }\n\n /* Preset click */\n const handlePresetClick = (color: string) => {\n const parsed = parseColor(color)\n if (!parsed) return\n const [r, g, b] = hexToRgb(parsed)\n setHsv(rgbToHsv(r, g, b))\n emitChange(parsed)\n }\n\n /* Render text next to swatch */\n const renderText = () => {\n if (!showText) return null\n if (typeof showText === 'function') return showText(formatColor(currentHex, format))\n return <span className={unstyled ? undefined : 'sg-colorpicker-text'}>{formatColor(currentHex, format)}</span>\n }\n\n const hueColor = hsvToHex(hsv.h, 1, 1)\n\n if (unstyled) {\n return (\n <div ref={wrapperRef} className={className} style={{ ...style, position: 'relative', display: 'inline-block' }}>\n <button\n type=\"button\"\n disabled={disabled}\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n onClick={handleTriggerClick}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n <span style={{ display: 'inline-block', width: 16, height: 16, background: currentHex }} />\n {renderText()}\n </button>\n {isOpen && (\n <div onMouseEnter={handleMouseEnter} onMouseLeave={handleMouseLeave}>\n <div\n ref={satPanelRef}\n style={{ width: 200, height: 150, position: 'relative', background: `linear-gradient(to top, #000, transparent), linear-gradient(to right, #fff, ${hueColor})` }}\n onPointerDown={handleSatPointerDown}\n onPointerMove={handleSatPointerMove}\n onPointerUp={handleSatPointerUp}\n />\n <div\n ref={hueBarRef}\n style={{ width: 200, height: 12, background: 'linear-gradient(to right, #f00 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%)' }}\n onPointerDown={handleHuePointerDown}\n onPointerMove={handleHuePointerMove}\n onPointerUp={handleHuePointerUp}\n />\n <input value={textInput} onChange={handleTextChange} />\n {presets?.map((group) => (\n <div key={group.label}>\n <div>{group.label}</div>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>\n {group.colors.map((c) => (\n <button\n key={c}\n style={{ width: 16, height: 16, background: c }}\n onClick={() => handlePresetClick(c)}\n />\n ))}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n )\n }\n\n const sizeClass = `sg-colorpicker-${size}`\n\n return (\n <div\n ref={wrapperRef}\n className={['sg-colorpicker-wrapper', sizeClass, disabled ? 'sg-colorpicker-disabled' : '', className]\n .filter(Boolean)\n .join(' ')}\n style={style}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {/* Trigger */}\n <button\n type=\"button\"\n className=\"sg-colorpicker-trigger\"\n onClick={handleTriggerClick}\n disabled={disabled}\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n >\n <span className=\"sg-colorpicker-swatch\" style={{ background: currentHex }} />\n {renderText()}\n </button>\n\n {/* Dropdown */}\n {isOpen && (\n <div\n className=\"sg-colorpicker-dropdown\"\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {/* Saturation / Brightness panel */}\n <div\n ref={satPanelRef}\n className=\"sg-colorpicker-saturation\"\n style={{ background: `linear-gradient(to top, #000, transparent), linear-gradient(to right, #fff, ${hueColor})` }}\n onPointerDown={handleSatPointerDown}\n onPointerMove={handleSatPointerMove}\n onPointerUp={handleSatPointerUp}\n >\n <div\n className=\"sg-colorpicker-cursor\"\n style={{\n left: `${hsv.s * 100}%`,\n top: `${(1 - hsv.v) * 100}%`,\n background: currentHex,\n }}\n />\n </div>\n\n {/* Hue bar */}\n <div\n ref={hueBarRef}\n className=\"sg-colorpicker-hue\"\n onPointerDown={handleHuePointerDown}\n onPointerMove={handleHuePointerMove}\n onPointerUp={handleHuePointerUp}\n >\n <div\n className=\"sg-colorpicker-hue-cursor\"\n style={{ left: `${hsv.h * 100}%` }}\n />\n </div>\n\n {/* Color preview + text input */}\n <div className=\"sg-colorpicker-input-row\">\n <span\n className=\"sg-colorpicker-preview\"\n style={{ background: currentHex }}\n />\n <input\n className=\"sg-colorpicker-input\"\n value={textInput}\n onChange={handleTextChange}\n spellCheck={false}\n />\n </div>\n\n {/* Presets */}\n {presets?.map((group) => (\n <div className=\"sg-colorpicker-preset-group\" key={group.label}>\n <div className=\"sg-colorpicker-preset-label\">{group.label}</div>\n <div className=\"sg-colorpicker-preset-grid\">\n {group.colors.map((c) => (\n <button\n key={c}\n className=\"sg-colorpicker-preset-color\"\n style={{ background: c }}\n onClick={() => handlePresetClick(c)}\n title={c}\n />\n ))}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n","import React from 'react'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps } from '../../types'\n\n/** Props for the Empty state component. */\nexport interface EmptyProps extends BaseComponentProps {\n /** Illustration or icon above the description; uses built-in art when omitted. */\n image?: React.ReactNode\n /** Message below the image; defaults to \"No Data\" when undefined, hidden when null. */\n description?: React.ReactNode\n /** Optional footer actions or supplementary content. */\n children?: React.ReactNode\n}\n\nconst DefaultImage = () => (\n <svg width=\"64\" height=\"41\" viewBox=\"0 0 64 41\" xmlns=\"http://www.w3.org/2000/svg\">\n <g fill=\"none\" fillRule=\"evenodd\" transform=\"translate(0 1)\">\n <ellipse cx=\"32\" cy=\"33\" rx=\"32\" ry=\"7\" fill=\"currentColor\" opacity=\"0.08\" />\n <g fillRule=\"nonzero\" stroke=\"currentColor\" strokeOpacity=\"0.25\">\n <path 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\" />\n <path\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\"\n fill=\"currentColor\"\n opacity=\"0.08\"\n />\n </g>\n </g>\n </svg>\n)\n\n/**\n * Presents a no-data state with optional image, description, and footer slot.\n */\nexport function Empty({\n image,\n description,\n children,\n className,\n style,\n unstyled,\n}: EmptyProps) {\n const localeDefault = useConfig().locale?.empty?.description ?? 'No Data'\n const desc = description === undefined ? localeDefault : description\n\n if (unstyled) {\n return (\n <div className={className} style={style} role=\"status\">\n <div>{image ?? <DefaultImage />}</div>\n {desc !== null && <p>{desc}</p>}\n {children}\n </div>\n )\n }\n\n return (\n <div className={['sg-empty', className].filter(Boolean).join(' ')} style={style} role=\"status\">\n <div className=\"sg-empty-image\">{image ?? <DefaultImage />}</div>\n {desc !== null && <p className=\"sg-empty-description\">{desc}</p>}\n {children && <div className=\"sg-empty-footer\">{children}</div>}\n </div>\n )\n}\n","import React from 'react'\nimport type { BaseComponentProps } from '../../types'\n\n/** Props for the Result feedback page (status, title, and optional actions). */\nexport interface ResultProps extends BaseComponentProps {\n /** Outcome type controlling default icon and styling. */\n status: 'success' | 'error' | 'info' | 'warning' | '404' | '403' | '500'\n /** Primary heading for the result. */\n title: React.ReactNode\n /** Secondary explanatory text below the title. */\n subTitle?: React.ReactNode\n /** Replaces the default icon for the given `status`. */\n icon?: React.ReactNode\n /** Actions or buttons shown below the titles (e.g. primary CTA). */\n extra?: React.ReactNode\n /** Additional body content below `extra`. */\n children?: React.ReactNode\n}\n\nconst icons: Record<string, React.ReactNode> = {\n success: (\n <svg viewBox=\"64 64 896 896\" width=\"72\" height=\"72\" fill=\"currentColor\">\n <path 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\" />\n </svg>\n ),\n error: (\n <svg viewBox=\"64 64 896 896\" width=\"72\" height=\"72\" fill=\"currentColor\">\n <path 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\" />\n </svg>\n ),\n info: (\n <svg viewBox=\"64 64 896 896\" width=\"72\" height=\"72\" fill=\"currentColor\">\n <path 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\" />\n </svg>\n ),\n warning: (\n <svg viewBox=\"64 64 896 896\" width=\"72\" height=\"72\" fill=\"currentColor\">\n <path 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\" />\n </svg>\n ),\n '404': (\n <svg viewBox=\"0 0 252 294\" width=\"252\" height=\"294\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <text x=\"50%\" y=\"50%\" dominantBaseline=\"middle\" textAnchor=\"middle\" fill=\"currentColor\" fontSize=\"80\" fontWeight=\"bold\" opacity=\"0.25\">404</text>\n </svg>\n ),\n '403': (\n <svg viewBox=\"0 0 252 294\" width=\"252\" height=\"294\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <text x=\"50%\" y=\"50%\" dominantBaseline=\"middle\" textAnchor=\"middle\" fill=\"currentColor\" fontSize=\"80\" fontWeight=\"bold\" opacity=\"0.25\">403</text>\n </svg>\n ),\n '500': (\n <svg viewBox=\"0 0 252 294\" width=\"252\" height=\"294\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <text x=\"50%\" y=\"50%\" dominantBaseline=\"middle\" textAnchor=\"middle\" fill=\"currentColor\" fontSize=\"80\" fontWeight=\"bold\" opacity=\"0.25\">500</text>\n </svg>\n ),\n}\n\nconst statusColorMap: Record<string, string> = {\n success: 'var(--sg-color-success)',\n error: 'var(--sg-color-error)',\n info: 'var(--sg-color-primary)',\n warning: 'var(--sg-color-warning)',\n '404': 'var(--sg-color-text-tertiary)',\n '403': 'var(--sg-color-text-tertiary)',\n '500': 'var(--sg-color-text-tertiary)',\n}\n\n/**\n * Full-page or section result layout with preset icons for common HTTP and feedback states.\n */\nexport function Result({\n status,\n title,\n subTitle,\n icon,\n extra,\n children,\n className,\n style,\n unstyled,\n}: ResultProps) {\n const resolvedIcon = icon ?? icons[status]\n\n if (unstyled) {\n return (\n <div className={className} style={style} role=\"status\" aria-live=\"polite\">\n <div>{resolvedIcon}</div>\n <div>{title}</div>\n {subTitle && <div>{subTitle}</div>}\n {extra && <div>{extra}</div>}\n {children}\n </div>\n )\n }\n\n return (\n <div\n className={['sg-result', `sg-result-${status}`, className].filter(Boolean).join(' ')}\n style={style}\n role=\"status\"\n aria-live=\"polite\"\n >\n <div className=\"sg-result-icon\" style={{ color: statusColorMap[status] }}>\n {resolvedIcon}\n </div>\n <div className=\"sg-result-title\">{title}</div>\n {subTitle && <div className=\"sg-result-subtitle\">{subTitle}</div>}\n {extra && <div className=\"sg-result-extra\">{extra}</div>}\n {children && <div className=\"sg-result-content\">{children}</div>}\n </div>\n )\n}\n","import React from 'react'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps } from '../../types'\n\n/** Props for the Skeleton loading placeholder layout. */\nexport interface SkeletonProps extends BaseComponentProps {\n /** Enables a shimmering animation on placeholders. @default false */\n active?: boolean\n /** Shows an avatar block; pass an object for `size` and `shape`. */\n avatar?: boolean | { size?: number; shape?: 'circle' | 'square' }\n /** Shows a title bar; pass an object for custom `width`. @default true */\n title?: boolean | { width?: number | string }\n /** Shows paragraph lines; pass an object for `rows` and per-line `width`. @default true */\n paragraph?: boolean | { rows?: number; width?: Array<number | string> }\n /** When false, renders `children` instead of the skeleton. @default true */\n loading?: boolean\n /** Real content shown when `loading` is false. */\n children?: React.ReactNode\n}\n\n/**\n * Placeholder UI while content loads; supports avatar, title, and paragraph blocks.\n */\nexport function Skeleton({\n active = false,\n avatar,\n title = true,\n paragraph = true,\n loading = true,\n children,\n className,\n style,\n unstyled,\n}: SkeletonProps) {\n const loadingLabel = useConfig().locale?.skeleton?.loading ?? 'Loading'\n if (!loading) return <>{children}</>\n\n const avatarSize = typeof avatar === 'object' ? (avatar.size ?? 40) : 40\n const avatarShape = typeof avatar === 'object' ? (avatar.shape ?? 'circle') : 'circle'\n const titleWidth = typeof title === 'object' ? (title.width ?? '38%') : '38%'\n const rows = typeof paragraph === 'object' ? (paragraph.rows ?? 3) : 3\n const rowWidths = typeof paragraph === 'object' ? paragraph.width : undefined\n\n const getRowWidth = (index: number, total: number): string | number => {\n if (rowWidths && rowWidths[index] !== undefined) return rowWidths[index]\n if (index === total - 1) return '61%'\n return '100%'\n }\n\n if (unstyled) {\n return (\n <div className={className} style={style} aria-busy=\"true\" aria-label={loadingLabel}>\n {avatar && <div style={{ width: avatarSize, height: avatarSize }} />}\n <div>\n {title && <div style={{ width: titleWidth, height: 16 }} />}\n {paragraph &&\n Array.from({ length: rows }, (_, i) => (\n <div key={i} style={{ width: getRowWidth(i, rows), height: 16 }} />\n ))}\n </div>\n </div>\n )\n }\n\n return (\n <div\n className={[\n 'sg-skeleton',\n active ? 'sg-skeleton-active' : '',\n avatar ? 'sg-skeleton-with-avatar' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={style}\n aria-busy=\"true\"\n aria-label={loadingLabel}\n >\n {avatar && (\n <div className=\"sg-skeleton-header\">\n <span\n className={['sg-skeleton-avatar', `sg-skeleton-avatar-${avatarShape}`].join(' ')}\n style={{ width: avatarSize, height: avatarSize }}\n />\n </div>\n )}\n <div className=\"sg-skeleton-content\">\n {title && (\n <div\n className=\"sg-skeleton-title\"\n style={{ width: typeof titleWidth === 'number' ? `${titleWidth}px` : titleWidth }}\n />\n )}\n {paragraph && (\n <ul className=\"sg-skeleton-paragraph\">\n {Array.from({ length: rows }, (_, i) => {\n const w = getRowWidth(i, rows)\n return <li key={i} style={{ width: typeof w === 'number' ? `${w}px` : w }} />\n })}\n </ul>\n )}\n </div>\n </div>\n )\n}\n","import React, { useState } from 'react'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, InteractiveProps, SizableProps } from '../../types'\n\nexport type SegmentedOption =\n | string\n | { label: React.ReactNode; value: string; icon?: React.ReactNode; disabled?: boolean }\n\n/** Props for a horizontal group of mutually exclusive segment choices. */\nexport interface SegmentedProps extends BaseComponentProps, InteractiveProps, SizableProps {\n /** Segment definitions as strings or objects with label, value, and optional icon. */\n options: SegmentedOption[]\n /** Controlled selected segment value. */\n value?: string\n /** Initial value when uncontrolled; falls back to first option value if unset. */\n defaultValue?: string\n /** Called when the user selects a segment. */\n onChange?: (value: string) => void\n /** When true, the control stretches to the full width of its container. */\n block?: boolean\n}\n\nfunction normalizeOption(opt: SegmentedOption) {\n if (typeof opt === 'string') return { label: opt, value: opt }\n return opt\n}\n\n/**\n * Segmented control (radio group) for picking one of several options.\n * Renders as styled pills or, when unstyled, as native radio inputs.\n */\nexport function Segmented({\n options,\n value,\n defaultValue,\n onChange,\n block,\n size: sizeProp,\n disabled: disabledProp,\n className,\n style,\n unstyled,\n}: SegmentedProps) {\n const config = useConfig()\n const size = sizeProp ?? config.size ?? 'middle'\n const disabled = disabledProp ?? config.disabled ?? false\n\n const normalized = options.map(normalizeOption)\n const [internalValue, setInternalValue] = useState(\n value ?? defaultValue ?? normalized[0]?.value ?? ''\n )\n const currentValue = value ?? internalValue\n\n const handleSelect = (val: string, optDisabled?: boolean) => {\n if (disabled || optDisabled) return\n setInternalValue(val)\n onChange?.(val)\n }\n\n if (unstyled) {\n return (\n <div className={className} style={style} role=\"radiogroup\">\n {normalized.map((opt) => (\n <label key={opt.value}>\n <input\n type=\"radio\"\n name=\"sg-segmented\"\n value={opt.value}\n checked={opt.value === currentValue}\n disabled={disabled || opt.disabled}\n onChange={() => handleSelect(opt.value, opt.disabled)}\n />\n {opt.icon}\n {opt.label}\n </label>\n ))}\n </div>\n )\n }\n\n return (\n <div\n className={[\n 'sg-segmented',\n `sg-segmented-${size}`,\n block ? 'sg-segmented-block' : '',\n disabled ? 'sg-segmented-disabled' : '',\n className,\n ].filter(Boolean).join(' ')}\n style={style}\n role=\"radiogroup\"\n >\n {normalized.map((opt) => (\n <div\n key={opt.value}\n role=\"radio\"\n aria-checked={opt.value === currentValue}\n className={[\n 'sg-segmented-item',\n opt.value === currentValue ? 'sg-segmented-item-selected' : '',\n opt.disabled ? 'sg-segmented-item-disabled' : '',\n ].filter(Boolean).join(' ')}\n onClick={() => handleSelect(opt.value, opt.disabled)}\n >\n {opt.icon && <span className=\"sg-segmented-item-icon\">{opt.icon}</span>}\n <span className=\"sg-segmented-item-label\">{opt.label}</span>\n </div>\n ))}\n </div>\n )\n}\n","import React from 'react'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, SizableProps } from '../../types'\n\n/** One step in a wizard or progress sequence. */\nexport interface StepItem {\n /** Primary step title. */\n title: React.ReactNode\n /** Optional secondary text below the title. */\n description?: React.ReactNode\n /** Custom icon; defaults to checkmark, error mark, or index when omitted. */\n icon?: React.ReactNode\n /** Overrides auto-derived status from `current` index. */\n status?: 'wait' | 'process' | 'finish' | 'error'\n}\n\n/** Props for the step indicator sequence. */\nexport interface StepsProps extends BaseComponentProps, SizableProps {\n /** Zero-based index of the active (in-progress) step. */\n current: number\n /** Steps in display order. */\n items: StepItem[]\n /** Stack direction for the step list. @default 'horizontal' */\n direction?: 'horizontal' | 'vertical'\n /** When set, each step becomes clickable and reports its index. */\n onChange?: (current: number) => void\n /** Visual variant: standard steps or navigation-style. @default 'default' */\n type?: 'default' | 'navigation'\n}\n\nconst CheckIcon = () => (\n <svg viewBox=\"64 64 896 896\" width=\"1em\" height=\"1em\" fill=\"currentColor\">\n <path 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 </svg>\n)\n\nconst ErrorIcon = () => (\n <svg viewBox=\"64 64 896 896\" width=\"1em\" height=\"1em\" fill=\"currentColor\">\n <path 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 </svg>\n)\n\nfunction resolveStatus(index: number, current: number, itemStatus?: StepItem['status']): string {\n if (itemStatus) return itemStatus\n if (index < current) return 'finish'\n if (index === current) return 'process'\n return 'wait'\n}\n\n/**\n * Displays a linear sequence of steps with icons, titles, and optional descriptions.\n * Derives each step status from `current` unless overridden per item.\n */\nexport function Steps({\n current,\n items,\n direction = 'horizontal',\n size: sizeProp,\n onChange,\n type = 'default',\n className,\n style,\n unstyled,\n}: StepsProps) {\n const config = useConfig()\n const size = sizeProp ?? config.size ?? 'middle'\n const stepsSize = size === 'small' ? 'small' : 'default'\n\n if (unstyled) {\n return (\n <div className={className} style={style}>\n {items.map((item, i) => {\n const status = resolveStatus(i, current, item.status)\n return (\n <div key={i} onClick={() => onChange?.(i)} data-status={status}>\n <span>{item.icon ?? (status === 'finish' ? '✓' : i + 1)}</span>\n <span>{item.title}</span>\n {item.description && <span>{item.description}</span>}\n </div>\n )\n })}\n </div>\n )\n }\n\n return (\n <div\n className={[\n 'sg-steps',\n `sg-steps-${direction}`,\n `sg-steps-${stepsSize}`,\n type === 'navigation' ? 'sg-steps-navigation' : '',\n className,\n ].filter(Boolean).join(' ')}\n style={style}\n role=\"list\"\n >\n {items.map((item, i) => {\n const status = resolveStatus(i, current, item.status)\n const clickable = !!onChange\n\n return (\n <div\n key={i}\n className={[\n 'sg-steps-item',\n `sg-steps-item-${status}`,\n clickable ? 'sg-steps-item-clickable' : '',\n ].filter(Boolean).join(' ')}\n onClick={clickable ? () => onChange!(i) : undefined}\n aria-current={status === 'process' ? 'step' : undefined}\n >\n <div className=\"sg-steps-item-container\">\n <div className=\"sg-steps-item-icon\">\n {item.icon ? (\n <span className=\"sg-steps-icon-custom\">{item.icon}</span>\n ) : status === 'finish' ? (\n <span className=\"sg-steps-icon\"><CheckIcon /></span>\n ) : status === 'error' ? (\n <span className=\"sg-steps-icon\"><ErrorIcon /></span>\n ) : (\n <span className=\"sg-steps-icon\">{i + 1}</span>\n )}\n </div>\n <div className=\"sg-steps-item-content\">\n <div className=\"sg-steps-item-title\">\n {item.title}\n {direction === 'horizontal' && i < items.length - 1 && (\n <span className=\"sg-steps-item-tail\" />\n )}\n </div>\n {item.description && (\n <div className=\"sg-steps-item-description\">{item.description}</div>\n )}\n </div>\n </div>\n {direction === 'vertical' && i < items.length - 1 && (\n <div className=\"sg-steps-item-tail-vertical\" />\n )}\n </div>\n )\n })}\n </div>\n )\n}\n","import React from 'react'\nimport type { BaseComponentProps } from '../../types'\n\n/** One entry on the timeline axis (content, optional label, and marker styling). */\nexport interface TimelineItem {\n /** Main body content for this step. */\n children: React.ReactNode\n /** Border/text color for the default dot when no custom `dot` is set. */\n color?: string\n /** Custom marker node; replaces the default dot. */\n dot?: React.ReactNode\n /** Optional label rendered beside or above the marker. */\n label?: React.ReactNode\n /** Forces this item to the left or right side (overrides list `mode` for this index). */\n position?: 'left' | 'right'\n}\n\n/** Props for the vertical timeline list with optional pending tail. */\nexport interface TimelineProps extends BaseComponentProps {\n /** Ordered timeline steps. */\n items: TimelineItem[]\n /** Layout: fixed side, or alternating left/right per item. @default 'left' */\n mode?: 'left' | 'right' | 'alternate'\n /** When truthy, appends a pending item; if `true`, children of that item are empty. */\n pending?: React.ReactNode | boolean\n /** Marker for the synthetic pending item when `pending` is set. */\n pendingDot?: React.ReactNode\n /** When `true`, reverses the visual order of `items` (and pending). */\n reverse?: boolean\n}\n\n/**\n * Displays a chronological list with axis, dots, and optional pending state.\n */\nexport function Timeline({\n items: rawItems,\n mode = 'left',\n pending,\n pendingDot,\n reverse,\n className,\n style,\n unstyled,\n}: TimelineProps) {\n let items = [...rawItems]\n\n if (pending) {\n items.push({\n children: typeof pending === 'boolean' ? null : pending,\n dot: pendingDot,\n })\n }\n\n if (reverse) items = items.reverse()\n\n const getPosition = (item: TimelineItem, index: number): 'left' | 'right' => {\n if (item.position) return item.position\n if (mode === 'alternate') return index % 2 === 0 ? 'left' : 'right'\n return mode\n }\n\n if (unstyled) {\n return (\n <ul className={className} style={style}>\n {items.map((item, i) => (\n <li key={i}>\n {item.label && <span>{item.label}</span>}\n <span>{item.dot ?? '●'}</span>\n <span>{item.children}</span>\n </li>\n ))}\n </ul>\n )\n }\n\n const isPending = !!pending\n\n return (\n <ul\n className={[\n 'sg-timeline',\n `sg-timeline-${mode}`,\n className,\n ].filter(Boolean).join(' ')}\n style={style}\n role=\"list\"\n >\n {items.map((item, i) => {\n const pos = getPosition(item, i)\n const isLast = i === items.length - 1\n const isPendingItem = isPending && isLast\n\n return (\n <li\n key={i}\n className={[\n 'sg-timeline-item',\n `sg-timeline-item-${pos}`,\n isPendingItem ? 'sg-timeline-item-pending' : '',\n ].filter(Boolean).join(' ')}\n role=\"listitem\"\n >\n {item.label !== undefined && (\n <div className=\"sg-timeline-item-label\">{item.label}</div>\n )}\n <div className=\"sg-timeline-item-head-wrapper\">\n <div\n className={[\n 'sg-timeline-item-head',\n item.dot ? 'sg-timeline-item-head-custom' : '',\n ].filter(Boolean).join(' ')}\n style={item.color && !item.dot ? { borderColor: item.color, color: item.color } : undefined}\n >\n {item.dot}\n </div>\n {!isLast && <div className=\"sg-timeline-item-tail\" />}\n </div>\n <div className=\"sg-timeline-item-content\">{item.children}</div>\n </li>\n )\n })}\n </ul>\n )\n}\n","import React, { useState, useEffect, useCallback, Children } from 'react'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps } from '../../types'\n\n/** Props for a simple slide carousel with dots and optional autoplay. */\nexport interface CarouselProps extends BaseComponentProps {\n /** Advances to the next slide on an interval when there is more than one slide. @default false */\n autoplay?: boolean\n /** Interval in ms between autoplay steps. @default 3000 */\n autoplaySpeed?: number\n /** Shows dot controls to jump between slides (hidden when only one slide in styled mode). @default true */\n dots?: boolean\n /** Where dot navigation is placed relative to the track. @default 'bottom' */\n dotPosition?: 'top' | 'bottom' | 'left' | 'right'\n /** Transition between slides: horizontal offset or crossfade. @default 'slide' */\n effect?: 'slide' | 'fade'\n /** Each direct child is treated as one slide. */\n children: React.ReactNode\n}\n\n/**\n * Cycles through child slides with optional autoplay, dot navigation, and slide or fade transitions.\n */\nexport function Carousel({\n autoplay = false,\n autoplaySpeed = 3000,\n dots = true,\n dotPosition = 'bottom',\n effect = 'slide',\n children,\n className,\n style,\n unstyled,\n}: CarouselProps) {\n const slides = Children.toArray(children)\n const count = slides.length\n const [current, setCurrent] = useState(0)\n const slideLabel = useConfig().locale?.carousel?.slide ?? ((index: number) => `Slide ${index}`)\n\n const goTo = useCallback(\n (index: number) => {\n setCurrent(((index % count) + count) % count)\n },\n [count],\n )\n\n useEffect(() => {\n if (!autoplay || count <= 1) return\n const id = setInterval(() => goTo(current + 1), autoplaySpeed)\n return () => clearInterval(id)\n }, [autoplay, autoplaySpeed, current, count, goTo])\n\n if (unstyled) {\n return (\n <div className={className} style={style}>\n {slides[current]}\n {dots && (\n <div>\n {slides.map((_, i) => (\n <button key={i} onClick={() => goTo(i)} aria-current={i === current}>\n {i + 1}\n </button>\n ))}\n </div>\n )}\n </div>\n )\n }\n\n const isVertical = dotPosition === 'left' || dotPosition === 'right'\n\n return (\n <div\n className={[\n 'sg-carousel',\n `sg-carousel-dots-${dotPosition}`,\n isVertical ? 'sg-carousel-vertical' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={style}\n >\n <div className=\"sg-carousel-container\">\n <div className=\"sg-carousel-track\">\n {slides.map((slide, i) => (\n <div\n key={i}\n className={[\n 'sg-carousel-slide',\n i === current ? 'sg-carousel-slide-active' : '',\n `sg-carousel-effect-${effect}`,\n ]\n .filter(Boolean)\n .join(' ')}\n style={\n effect === 'slide'\n ? { transform: `translateX(${(i - current) * 100}%)` }\n : undefined\n }\n aria-hidden={i !== current}\n >\n {slide}\n </div>\n ))}\n </div>\n </div>\n\n {dots && count > 1 && (\n <div\n className={['sg-carousel-dots', isVertical ? 'sg-carousel-dots-vertical' : '']\n .filter(Boolean)\n .join(' ')}\n >\n {slides.map((_, i) => (\n <button\n key={i}\n className={['sg-carousel-dot', i === current ? 'sg-carousel-dot-active' : '']\n .filter(Boolean)\n .join(' ')}\n onClick={() => goTo(i)}\n aria-label={slideLabel(i + 1)}\n />\n ))}\n </div>\n )}\n </div>\n )\n}\n","import React from 'react'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, SizableProps } from '../../types'\n\n/** Single label/value pair in a descriptions list. */\nexport interface DescriptionsItem {\n /** Optional stable key for list reconciliation. */\n key?: string\n /** Field label shown in the first cell or header row. */\n label: React.ReactNode\n /** Value content paired with `label`. */\n children: React.ReactNode\n /** Column span for this item within the grid (max `column`). */\n span?: number\n}\n\n/** Props for the Descriptions key-value table. */\nexport interface DescriptionsProps extends BaseComponentProps, SizableProps {\n /** Optional heading above the descriptions table. */\n title?: React.ReactNode\n /** Rows built from these items according to `column` and each item's `span`. */\n items: DescriptionsItem[]\n /** Renders a bordered table style. @default false */\n bordered?: boolean\n /** Number of description columns per row. @default 3 */\n column?: number\n /** Stacks labels and values in separate rows when vertical. @default 'horizontal' */\n layout?: 'horizontal' | 'vertical'\n /** Appends \":\" after labels when true. @default true */\n colon?: boolean\n}\n\nfunction buildRows(items: DescriptionsItem[], column: number): DescriptionsItem[][] {\n const rows: DescriptionsItem[][] = []\n let currentRow: DescriptionsItem[] = []\n let usedSpan = 0\n\n for (const item of items) {\n const span = Math.min(item.span ?? 1, column)\n if (usedSpan + span > column) {\n rows.push(currentRow)\n currentRow = []\n usedSpan = 0\n }\n currentRow.push(item)\n usedSpan += span\n if (usedSpan >= column) {\n rows.push(currentRow)\n currentRow = []\n usedSpan = 0\n }\n }\n if (currentRow.length > 0) rows.push(currentRow)\n return rows\n}\n\n/**\n * Renders a responsive key-value table from `items`, with horizontal or vertical layout.\n */\nexport function Descriptions({\n title,\n items,\n bordered = false,\n column = 3,\n size: sizeProp,\n layout = 'horizontal',\n colon = true,\n className,\n style,\n unstyled,\n}: DescriptionsProps) {\n const config = useConfig()\n const size = sizeProp ?? config.size ?? 'middle'\n const descSize = size === 'small' ? 'small' : 'default'\n\n const rows = buildRows(items, column)\n\n if (unstyled) {\n return (\n <div className={className} style={style} role=\"list\">\n {title && <div>{title}</div>}\n <table>\n <tbody>\n {rows.map((row, ri) => (\n <tr key={ri}>\n {row.map((item, ci) => (\n <React.Fragment key={item.key ?? ci}>\n <th>{item.label}{colon ? ':' : ''}</th>\n <td colSpan={item.span}>{item.children}</td>\n </React.Fragment>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n }\n\n return (\n <div\n className={[\n 'sg-descriptions',\n `sg-descriptions-${descSize}`,\n bordered ? 'sg-descriptions-bordered' : '',\n className,\n ].filter(Boolean).join(' ')}\n style={style}\n role=\"list\"\n >\n {title && <div className=\"sg-descriptions-title\">{title}</div>}\n <table className=\"sg-descriptions-table\">\n <tbody>\n {rows.map((row, ri) =>\n layout === 'vertical' ? (\n <React.Fragment key={ri}>\n <tr className=\"sg-descriptions-row\">\n {row.map((item, ci) => (\n <th\n key={`label-${item.key ?? ci}`}\n className=\"sg-descriptions-item-label\"\n colSpan={item.span ?? 1}\n >\n {item.label}\n {colon && <span className=\"sg-descriptions-colon\">:</span>}\n </th>\n ))}\n </tr>\n <tr className=\"sg-descriptions-row\">\n {row.map((item, ci) => (\n <td\n key={`content-${item.key ?? ci}`}\n className=\"sg-descriptions-item-content\"\n colSpan={item.span ?? 1}\n >\n {item.children}\n </td>\n ))}\n </tr>\n </React.Fragment>\n ) : (\n <tr key={ri} className=\"sg-descriptions-row\">\n {row.map((item, ci) => (\n <React.Fragment key={item.key ?? ci}>\n <th className=\"sg-descriptions-item-label\">\n {item.label}\n {colon && <span className=\"sg-descriptions-colon\">:</span>}\n </th>\n <td className=\"sg-descriptions-item-content\" colSpan={item.span ?? 1}>\n {item.children}\n </td>\n </React.Fragment>\n ))}\n </tr>\n ),\n )}\n </tbody>\n </table>\n </div>\n )\n}\n","import { useEffect, useMemo, useState } from 'react'\nimport type { CSSProperties } from 'react'\nimport { useSchemaEditor } from './useSchemaEditor'\nimport type { SchemaEditorStore, UseSchemaEditorOptions } from './useSchemaEditor'\nimport { SchemaFormEditorPalette } from './SchemaFormEditorPalette'\nimport type { PaletteItem } from './SchemaFormEditorPalette'\nimport { SchemaFormEditorCanvas } from './SchemaFormEditorCanvas'\nimport { SchemaFormEditorInspector } from './SchemaFormEditorInspector'\nimport { SchemaFormEditorSchemaView } from './SchemaFormEditorSchemaView'\nimport { createFieldFromPaletteType, editorSchemaToJsonSchema } from './adapters/jsonSchema'\nimport { SchemaForm } from '../SchemaForm'\nimport type { EditorSchema } from './types'\nimport { useConfig } from '../../ConfigProvider'\n\nexport interface SchemaFormEditorProps {\n /** Initial schema (uncontrolled). Use `setSchema` from a custom store for controlled use. */\n initialSchema?: EditorSchema\n /**\n * Externally-managed editor store. When provided, `initialSchema`,\n * `onChange` are ignored and the consumer drives the editor directly.\n */\n store?: SchemaEditorStore\n /** Override the default palette catalogue. */\n paletteItems?: PaletteItem[]\n /** Fires after every successful mutation with the new schema. */\n onChange?: (schema: EditorSchema) => void\n /** Empty-state CTA. */\n emptyText?: string\n /** Wrapper className (additive). */\n className?: string\n /** Wrapper inline style. */\n style?: CSSProperties\n /** Hide the bottom Preview / Schema toggle. Default is to show it. */\n hideSchemaView?: boolean\n}\n\nexport function SchemaFormEditor({\n initialSchema,\n store: externalStore,\n paletteItems,\n onChange,\n emptyText,\n className,\n style,\n hideSchemaView,\n}: SchemaFormEditorProps) {\n const sfeLocale = useConfig().locale?.schemaFormEditor\n const internalOptions: UseSchemaEditorOptions = { initialSchema, onChange }\n const internalStore = useSchemaEditor(internalOptions)\n const store = externalStore ?? internalStore\n const [bottomTab, setBottomTab] = useState<'preview' | 'schema'>('preview')\n\n // Allow Ctrl/Cmd + Z / Shift+Z keyboard shortcuts when the editor has focus.\n useEffect(() => {\n function onKey(e: KeyboardEvent) {\n const target = e.target as HTMLElement | null\n if (target && (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA')) return\n const ctrl = e.ctrlKey || e.metaKey\n if (!ctrl) return\n const k = e.key.toLowerCase()\n if (k === 'z' && !e.shiftKey) {\n e.preventDefault()\n store.undo()\n } else if ((k === 'z' && e.shiftKey) || k === 'y') {\n e.preventDefault()\n store.redo()\n }\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [store])\n\n return (\n <div\n className={['sg-sfe', className].filter(Boolean).join(' ')}\n style={style}\n data-testid=\"schema-form-editor\"\n >\n <div className=\"sg-sfe-toolbar\" data-testid=\"sfe-toolbar\">\n <span className=\"sg-sfe-toolbar-title\">Schema Form Editor</span>\n <span style={{ flex: 1 }} />\n <button\n type=\"button\"\n className=\"sg-sfe-toolbar-btn\"\n data-testid=\"sfe-undo\"\n aria-label={sfeLocale?.undo ?? 'Undo'}\n disabled={!store.state.canUndo}\n onClick={() => store.undo()}\n >\n Undo\n </button>\n <button\n type=\"button\"\n className=\"sg-sfe-toolbar-btn\"\n data-testid=\"sfe-redo\"\n aria-label={sfeLocale?.redo ?? 'Redo'}\n disabled={!store.state.canRedo}\n onClick={() => store.redo()}\n >\n Redo\n </button>\n </div>\n\n <div className=\"sg-sfe-body\">\n <SchemaFormEditorPalette\n items={paletteItems}\n onItemActivate={(type) => {\n const existingNames = store.state.schema.fields.map((f) => f.name)\n store.addField(createFieldFromPaletteType(type, existingNames))\n }}\n />\n <div className=\"sg-sfe-center\">\n <SchemaFormEditorCanvas store={store} emptyText={emptyText} />\n {!hideSchemaView && (\n <div className=\"sg-sfe-bottom\" data-testid=\"sfe-bottom\">\n <div className=\"sg-sfe-tabs\">\n <button\n type=\"button\"\n className={['sg-sfe-tab', bottomTab === 'preview' ? 'sg-sfe-tab-active' : '']\n .filter(Boolean)\n .join(' ')}\n data-testid=\"sfe-tab-preview\"\n onClick={() => setBottomTab('preview')}\n >\n Preview\n </button>\n <button\n type=\"button\"\n className={['sg-sfe-tab', bottomTab === 'schema' ? 'sg-sfe-tab-active' : '']\n .filter(Boolean)\n .join(' ')}\n data-testid=\"sfe-tab-schema\"\n onClick={() => setBottomTab('schema')}\n >\n Schema\n </button>\n </div>\n {bottomTab === 'preview' ? (\n <PreviewPane store={store} />\n ) : (\n <SchemaFormEditorSchemaView store={store} />\n )}\n </div>\n )}\n </div>\n <SchemaFormEditorInspector store={store} />\n </div>\n </div>\n )\n}\n\nfunction PreviewPane({ store }: { store: SchemaEditorStore }) {\n const fields = store.state.schema.fields\n const jsonSchema = useMemo(\n () => editorSchemaToJsonSchema(store.state.schema),\n [store.state.schema],\n )\n // Re-key the form when the schema fingerprint changes so defaults are picked\n // up after every mutation in the editor.\n const formKey = useMemo(\n () => fields.map((f) => `${f.id}:${f.name}:${f.type}`).join('|'),\n [fields],\n )\n\n if (fields.length === 0) {\n return (\n <div className=\"sg-sfe-preview-empty\" data-testid=\"sfe-preview-empty\">\n Drop fields onto the canvas to see a live preview.\n </div>\n )\n }\n\n return (\n <div className=\"sg-sfe-preview\" data-testid=\"sfe-preview\">\n <SchemaForm key={formKey} schema={jsonSchema} layout=\"vertical\">\n <span />\n </SchemaForm>\n </div>\n )\n}\n","import { useCallback, useMemo, useRef, useSyncExternalStore } from 'react'\nimport { createCore } from '@skygraph/core'\nimport type { Core } from '@skygraph/core'\nimport type { EditorAction, EditorField, EditorSchema, EditorState } from './types'\nimport { createEmptyEditorSchema } from './adapters/jsonSchema'\n\nconst HISTORY_LIMIT = 100\nconst STORE_PATH = '$sfe.snapshot'\n\n/**\n * Public store API surfaced by `useSchemaEditor`. Mutations are dispatched\n * through `apply(action)` which handles undo / redo bookkeeping. Convenience\n * methods (`addField`, `removeField`, ...) wrap the corresponding actions.\n */\nexport interface SchemaEditorStore {\n /** Live snapshot — re-rendered on every commit. */\n state: EditorState\n /** Underlying Core instance (mirrored snapshot under `$sfe.snapshot`). */\n core: Core\n\n apply: (action: EditorAction) => void\n\n addField: (field: EditorField, index?: number) => void\n removeField: (id: string) => void\n updateField: (id: string, patch: Partial<EditorField>) => void\n moveField: (id: string, toIndex: number) => void\n moveFieldUp: (id: string) => void\n moveFieldDown: (id: string) => void\n duplicateField: (id: string) => void\n\n setSchema: (schema: EditorSchema) => void\n setSelectedId: (id: string | null) => void\n\n undo: () => void\n redo: () => void\n}\n\nexport interface UseSchemaEditorOptions {\n /** Initial schema; defaults to an empty schema. */\n initialSchema?: EditorSchema\n /** External Core instance (cross-engine coordination). */\n core?: Core\n /** Fires after every successful mutation with the new schema. */\n onChange?: (schema: EditorSchema) => void\n}\n\ninterface InternalState {\n schema: EditorSchema\n selectedId: string | null\n}\n\nfunction cloneSchema(schema: EditorSchema): EditorSchema {\n return {\n title: schema.title,\n description: schema.description,\n fields: schema.fields.map((f) => ({ ...f, options: f.options ? f.options.map((o) => ({ ...o })) : undefined })),\n }\n}\n\nexport function useSchemaEditor(options: UseSchemaEditorOptions = {}): SchemaEditorStore {\n const { initialSchema, onChange } = options\n\n const onChangeRef = useRef(onChange)\n onChangeRef.current = onChange\n\n const storeRef = useRef<{\n core: Core\n current: InternalState\n snapshot: EditorState\n undoStack: InternalState[]\n redoStack: InternalState[]\n listeners: Set<() => void>\n } | null>(null)\n\n if (storeRef.current === null) {\n const core = options.core ?? createCore()\n const initial: InternalState = {\n schema: initialSchema ? cloneSchema(initialSchema) : createEmptyEditorSchema(),\n selectedId: null,\n }\n storeRef.current = {\n core,\n current: initial,\n snapshot: buildSnapshot(initial, false, false),\n undoStack: [],\n redoStack: [],\n listeners: new Set(),\n }\n core.set(STORE_PATH, initial.schema)\n }\n\n const store = storeRef.current\n\n const subscribe = useCallback((cb: () => void) => {\n store.listeners.add(cb)\n return () => {\n store.listeners.delete(cb)\n }\n }, [store])\n\n const getSnapshot = useCallback(() => store.snapshot, [store])\n\n const state = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n const commit = useCallback(\n (next: InternalState, captureHistory: boolean) => {\n if (captureHistory) {\n store.undoStack.push(store.current)\n if (store.undoStack.length > HISTORY_LIMIT) store.undoStack.shift()\n store.redoStack.length = 0\n }\n store.current = next\n store.snapshot = buildSnapshot(\n next,\n store.undoStack.length > 0,\n store.redoStack.length > 0,\n )\n store.core.set(STORE_PATH, next.schema)\n for (const cb of store.listeners) cb()\n onChangeRef.current?.(next.schema)\n },\n [store],\n )\n\n const apply = useCallback(\n (action: EditorAction) => {\n const next = reduce(store.current, action)\n if (next === store.current) return\n commit(next, true)\n },\n [store, commit],\n )\n\n const addField = useCallback(\n (field: EditorField, index?: number) => apply({ type: 'add', field, index }),\n [apply],\n )\n const removeField = useCallback((id: string) => apply({ type: 'remove', id }), [apply])\n const updateField = useCallback(\n (id: string, patch: Partial<EditorField>) => apply({ type: 'update', id, patch }),\n [apply],\n )\n const moveField = useCallback(\n (id: string, toIndex: number) => apply({ type: 'move', id, toIndex }),\n [apply],\n )\n\n const moveFieldUp = useCallback(\n (id: string) => {\n const idx = store.current.schema.fields.findIndex((f) => f.id === id)\n if (idx <= 0) return\n apply({ type: 'move', id, toIndex: idx - 1 })\n },\n [store, apply],\n )\n\n const moveFieldDown = useCallback(\n (id: string) => {\n const fields = store.current.schema.fields\n const idx = fields.findIndex((f) => f.id === id)\n if (idx === -1 || idx >= fields.length - 1) return\n apply({ type: 'move', id, toIndex: idx + 1 })\n },\n [store, apply],\n )\n\n const duplicateField = useCallback(\n (id: string) => {\n const fields = store.current.schema.fields\n const idx = fields.findIndex((f) => f.id === id)\n if (idx === -1) return\n const src = fields[idx]!\n const existingNames = fields.map((f) => f.name)\n let candidate = `${src.name}_copy`\n let suffix = 1\n while (existingNames.includes(candidate)) {\n suffix++\n candidate = `${src.name}_copy${suffix}`\n }\n const copy: EditorField = {\n ...src,\n id: `dup_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 6)}`,\n name: candidate,\n options: src.options ? src.options.map((o) => ({ ...o })) : undefined,\n }\n apply({ type: 'add', field: copy, index: idx + 1 })\n },\n [store, apply],\n )\n\n const setSchema = useCallback(\n (schema: EditorSchema) => apply({ type: 'setSchema', schema }),\n [apply],\n )\n\n const setSelectedId = useCallback(\n (id: string | null) => {\n if (store.current.selectedId === id) return\n const next: InternalState = { ...store.current, selectedId: id }\n commit(next, false)\n },\n [store, commit],\n )\n\n const undo = useCallback(() => {\n if (store.undoStack.length === 0) return\n const prev = store.undoStack.pop()!\n store.redoStack.push(store.current)\n if (store.redoStack.length > HISTORY_LIMIT) store.redoStack.shift()\n store.current = prev\n store.snapshot = buildSnapshot(\n prev,\n store.undoStack.length > 0,\n store.redoStack.length > 0,\n )\n store.core.set(STORE_PATH, prev.schema)\n for (const cb of store.listeners) cb()\n onChangeRef.current?.(prev.schema)\n }, [store])\n\n const redo = useCallback(() => {\n if (store.redoStack.length === 0) return\n const next = store.redoStack.pop()!\n store.undoStack.push(store.current)\n if (store.undoStack.length > HISTORY_LIMIT) store.undoStack.shift()\n store.current = next\n store.snapshot = buildSnapshot(\n next,\n store.undoStack.length > 0,\n store.redoStack.length > 0,\n )\n store.core.set(STORE_PATH, next.schema)\n for (const cb of store.listeners) cb()\n onChangeRef.current?.(next.schema)\n }, [store])\n\n return useMemo<SchemaEditorStore>(\n () => ({\n state,\n core: store.core,\n apply,\n addField,\n removeField,\n updateField,\n moveField,\n moveFieldUp,\n moveFieldDown,\n duplicateField,\n setSchema,\n setSelectedId,\n undo,\n redo,\n }),\n [\n state,\n store,\n apply,\n addField,\n removeField,\n updateField,\n moveField,\n moveFieldUp,\n moveFieldDown,\n duplicateField,\n setSchema,\n setSelectedId,\n undo,\n redo,\n ],\n )\n}\n\nfunction buildSnapshot(state: InternalState, canUndo: boolean, canRedo: boolean): EditorState {\n return {\n schema: state.schema,\n selectedId: state.selectedId,\n canUndo,\n canRedo,\n }\n}\n\nfunction reduce(state: InternalState, action: EditorAction): InternalState {\n switch (action.type) {\n case 'add': {\n const fields = state.schema.fields.slice()\n const index = action.index ?? fields.length\n fields.splice(Math.max(0, Math.min(index, fields.length)), 0, action.field)\n return {\n ...state,\n schema: { ...state.schema, fields },\n selectedId: action.field.id,\n }\n }\n case 'remove': {\n const fields = state.schema.fields.filter((f) => f.id !== action.id)\n if (fields.length === state.schema.fields.length) return state\n return {\n ...state,\n schema: { ...state.schema, fields },\n selectedId: state.selectedId === action.id ? null : state.selectedId,\n }\n }\n case 'update': {\n const idx = state.schema.fields.findIndex((f) => f.id === action.id)\n if (idx === -1) return state\n const fields = state.schema.fields.slice()\n const current = fields[idx]!\n const merged: EditorField = { ...current, ...action.patch }\n // strip undefined explicit overrides — `patch.min: undefined` should\n // unset the field (helpful from the inspector).\n const mergedRecord = merged as unknown as Record<string, unknown>\n for (const k of Object.keys(action.patch)) {\n if ((action.patch as Record<string, unknown>)[k] === undefined) {\n delete mergedRecord[k]\n }\n }\n fields[idx] = merged\n return { ...state, schema: { ...state.schema, fields } }\n }\n case 'move': {\n const idx = state.schema.fields.findIndex((f) => f.id === action.id)\n if (idx === -1) return state\n const fields = state.schema.fields.slice()\n const [item] = fields.splice(idx, 1)\n const target = Math.max(0, Math.min(action.toIndex, fields.length))\n fields.splice(target, 0, item!)\n return { ...state, schema: { ...state.schema, fields } }\n }\n case 'setSchema': {\n return {\n ...state,\n schema: cloneSchema(action.schema),\n selectedId: null,\n }\n }\n default:\n return state\n }\n}\n","import type { JSONSchema, JSONSchemaProperty } from '../../../../adapters/jsonSchemaAdapter'\nimport type { FieldType } from '../../AutoField/AutoField'\nimport type { EditorField, EditorSchema } from '../types'\n\nlet idCounter = 0\nfunction nextId(prefix = 'fld'): string {\n idCounter++\n return `${prefix}_${Date.now().toString(36)}_${idCounter}`\n}\n\n/**\n * Map a `FieldType` (the SkyGraph runtime type) to the matching pair of\n * JSON-Schema `type` and `format`. Anything we cannot round-trip cleanly\n * (e.g. `slider` — JSON-Schema has no slider hint) is exported as\n * `type: number` plus a `description` marker, see TODO below.\n */\nfunction fieldTypeToJsonSchemaType(\n type: FieldType,\n): { type: JSONSchemaProperty['type']; format?: string } {\n switch (type) {\n case 'string':\n case 'textarea':\n return { type: 'string' }\n case 'email':\n return { type: 'string', format: 'email' }\n case 'url':\n return { type: 'string', format: 'url' }\n case 'date':\n return { type: 'string', format: 'date' }\n case 'time':\n return { type: 'string', format: 'time' }\n case 'password':\n return { type: 'string', format: 'password' }\n case 'color':\n return { type: 'string', format: 'color' }\n case 'number':\n case 'slider':\n case 'rate':\n // TODO: `slider` / `rate` are SkyGraph extensions; we lose the visual\n // hint when round-tripping through pure JSON Schema.\n return { type: 'number' }\n case 'boolean':\n case 'switch':\n return { type: 'boolean' }\n case 'select':\n case 'radio':\n return { type: 'string' }\n case 'multiselect':\n return { type: 'array' }\n case 'file':\n return { type: 'string' }\n default:\n return { type: 'string' }\n }\n}\n\n/**\n * Best-effort inverse of `fieldTypeToJsonSchemaType`. Defaults to `string`\n * if we cannot determine the precise widget — the inspector lets the user\n * change it later.\n */\nfunction jsonSchemaPropertyToFieldType(prop: JSONSchemaProperty): FieldType {\n if (prop.enum || prop.oneOf) return 'select'\n if (prop.format === 'email') return 'email'\n if (prop.format === 'uri' || prop.format === 'url') return 'url'\n if (prop.format === 'date') return 'date'\n if (prop.format === 'time') return 'time'\n if (prop.format === 'password') return 'password'\n if (prop.format === 'color') return 'color'\n\n switch (prop.type) {\n case 'number':\n case 'integer':\n return 'number'\n case 'boolean':\n return 'boolean'\n case 'array':\n return 'multiselect'\n default:\n if (prop.maxLength && prop.maxLength > 200) return 'textarea'\n return 'string'\n }\n}\n\n/** Build an empty editor schema. Useful for the \"blank canvas\" demo. */\nexport function createEmptyEditorSchema(): EditorSchema {\n return { fields: [] }\n}\n\n/**\n * Convert a plain JSON Schema (the same shape `SchemaForm` accepts) to an\n * `EditorSchema`. Property order is preserved (`Object.entries` is stable\n * for string keys per ES2015).\n */\nexport function jsonSchemaToEditorSchema(schema: JSONSchema): EditorSchema {\n const props = schema.properties ?? {}\n const required = new Set(schema.required ?? [])\n\n const fields: EditorField[] = []\n for (const [name, prop] of Object.entries(props)) {\n const ftype = jsonSchemaPropertyToFieldType(prop)\n fields.push({\n id: nextId('imp'),\n name,\n label: prop.title ?? name,\n type: ftype,\n required: required.has(name),\n min: prop.minimum ?? prop.minLength,\n max: prop.maximum ?? prop.maxLength,\n pattern: prop.pattern,\n defaultValue: prop.default,\n helpText: prop.description,\n placeholder: undefined,\n options:\n prop.oneOf?.map((o) => ({\n value: o.const as string | number,\n label: o.title ?? String(o.const),\n })) ??\n prop.enum?.map((v, i) => ({\n value: v as string | number,\n label: prop.enumNames?.[i] ?? String(v),\n })),\n })\n }\n\n return {\n title: schema.title,\n description: schema.description,\n fields,\n }\n}\n\n/** Serialize an `EditorField` to a single JSON-Schema property entry. */\nfunction editorFieldToProperty(field: EditorField): JSONSchemaProperty {\n const { type, format } = fieldTypeToJsonSchemaType(field.type)\n const prop: JSONSchemaProperty = { type }\n if (format) prop.format = format\n if (field.label && field.label !== field.name) prop.title = field.label\n if (field.helpText) prop.description = field.helpText\n if (field.defaultValue !== undefined) prop.default = field.defaultValue\n\n if (type === 'string') {\n if (field.min !== undefined) prop.minLength = field.min\n if (field.max !== undefined) prop.maxLength = field.max\n if (field.pattern) prop.pattern = field.pattern\n } else if (type === 'number' || type === 'integer') {\n if (field.min !== undefined) prop.minimum = field.min\n if (field.max !== undefined) prop.maximum = field.max\n }\n\n if (field.options && field.options.length > 0) {\n prop.enum = field.options.map((o) => o.value)\n prop.enumNames = field.options.map((o) => o.label)\n }\n\n if (field.type === 'textarea' && prop.maxLength === undefined) {\n // Keep round-trip stable: textarea inference requires maxLength > 200.\n prop.maxLength = 1000\n }\n\n return prop\n}\n\n/** Convert an `EditorSchema` back to a plain JSON Schema. */\nexport function editorSchemaToJsonSchema(editor: EditorSchema): JSONSchema {\n const properties: Record<string, JSONSchemaProperty> = {}\n const required: string[] = []\n for (const field of editor.fields) {\n properties[field.name] = editorFieldToProperty(field)\n if (field.required) required.push(field.name)\n }\n const out: JSONSchema = {\n type: 'object',\n properties,\n }\n if (required.length > 0) out.required = required\n if (editor.title) out.title = editor.title\n if (editor.description) out.description = editor.description\n return out\n}\n\n/**\n * Factory for newly-dropped palette items. Keeps the per-type defaults in\n * one place so the palette and the inspector agree on what e.g. a brand-new\n * \"Slider\" should look like.\n */\nexport function createFieldFromPaletteType(type: FieldType, existingNames: string[]): EditorField {\n const baseName = `field${existingNames.length + 1}`\n let name = baseName\n let suffix = 1\n while (existingNames.includes(name)) {\n suffix++\n name = `${baseName}_${suffix}`\n }\n\n const baseLabel = type.charAt(0).toUpperCase() + type.slice(1)\n const field: EditorField = {\n id: nextId('new'),\n name,\n label: baseLabel,\n type,\n }\n\n if (type === 'select' || type === 'radio') {\n field.options = [\n { value: 'option1', label: 'Option 1' },\n { value: 'option2', label: 'Option 2' },\n ]\n }\n if (type === 'number' || type === 'slider') {\n field.min = 0\n field.max = 100\n }\n if (type === 'rate') {\n field.max = 5\n }\n\n return field\n}\n","import type { CSSProperties, DragEvent } from 'react'\nimport type { FieldType } from '../AutoField/AutoField'\n\nexport interface PaletteItem {\n /** SkyGraph field type — passed through `dataTransfer` on drop. */\n type: FieldType\n /** Display label in the palette. */\n label: string\n /** One-line description shown under the label. */\n hint?: string\n /** Single-character glyph (rendered as plain text — no emoji). */\n glyph?: string\n}\n\n/**\n * Default catalogue rendered when the consumer doesn't pass `items`. The list\n * is intentionally flat (no categorisation) so the v1 editor stays focused.\n */\nexport const DEFAULT_PALETTE_ITEMS: PaletteItem[] = [\n { type: 'string', label: 'Input', hint: 'Single-line text', glyph: 'T' },\n { type: 'textarea', label: 'Textarea', hint: 'Multi-line text', glyph: '¶' },\n { type: 'number', label: 'Number', hint: 'Numeric input', glyph: '#' },\n { type: 'select', label: 'Select', hint: 'Dropdown choice', glyph: '▾' },\n { type: 'radio', label: 'Radio', hint: 'Single choice', glyph: '◉' },\n { type: 'boolean', label: 'Checkbox', hint: 'Boolean toggle', glyph: '☐' },\n { type: 'switch', label: 'Switch', hint: 'On / off toggle', glyph: '⌨' },\n { type: 'date', label: 'Date', hint: 'Calendar picker', glyph: '📅' },\n { type: 'time', label: 'Time', hint: 'Clock picker', glyph: '🕒' },\n { type: 'slider', label: 'Slider', hint: 'Numeric range', glyph: '═' },\n { type: 'rate', label: 'Rate', hint: 'Star rating', glyph: '★' },\n { type: 'color', label: 'Color', hint: 'Color picker', glyph: '◐' },\n { type: 'email', label: 'Email', hint: 'Email input', glyph: '@' },\n { type: 'url', label: 'URL', hint: 'Link input', glyph: '↗' },\n { type: 'password', label: 'Password', hint: 'Masked input', glyph: '✱' },\n { type: 'file', label: 'File', hint: 'File upload', glyph: '⇪' },\n]\n\n/**\n * Mime-type used by the palette → canvas drag transfer. Kept narrow so\n * external drops (e.g. files into the page) do not collide.\n */\nexport const PALETTE_DATA_TYPE = 'application/x-sg-sfe-palette-type'\n\nexport interface SchemaFormEditorPaletteProps {\n /** Override the default catalogue. */\n items?: PaletteItem[]\n /** Wrapper className (additive). */\n className?: string\n /** Wrapper inline style. */\n style?: CSSProperties\n /**\n * Optional fallback callback when the host environment does not support\n * HTML5 drag-and-drop (e.g. some test runners). The canvas listens for\n * `onClick` on palette items to add a field at the end as a graceful\n * degradation.\n */\n onItemActivate?: (type: FieldType) => void\n}\n\nexport function SchemaFormEditorPalette({\n items = DEFAULT_PALETTE_ITEMS,\n className,\n style,\n onItemActivate,\n}: SchemaFormEditorPaletteProps) {\n function handleDragStart(type: FieldType) {\n return (e: DragEvent<HTMLDivElement>) => {\n e.dataTransfer.setData(PALETTE_DATA_TYPE, type)\n e.dataTransfer.setData('text/plain', type)\n e.dataTransfer.effectAllowed = 'copy'\n }\n }\n\n return (\n <div\n className={['sg-sfe-palette', className].filter(Boolean).join(' ')}\n style={style}\n data-testid=\"sfe-palette\"\n >\n <div className=\"sg-sfe-palette-title\">Fields</div>\n <div className=\"sg-sfe-palette-list\">\n {items.map((item) => (\n <div\n key={item.type}\n className=\"sg-sfe-palette-item\"\n data-palette-type={item.type}\n draggable\n tabIndex={0}\n role=\"button\"\n onDragStart={handleDragStart(item.type)}\n onClick={() => onItemActivate?.(item.type)}\n onKeyDown={(e) => {\n if ((e.key === 'Enter' || e.key === ' ') && onItemActivate) {\n e.preventDefault()\n onItemActivate(item.type)\n }\n }}\n >\n <span className=\"sg-sfe-palette-item-glyph\" aria-hidden=\"true\">\n {item.glyph ?? '·'}\n </span>\n <span className=\"sg-sfe-palette-item-body\">\n <span className=\"sg-sfe-palette-item-label\">{item.label}</span>\n {item.hint && (\n <span className=\"sg-sfe-palette-item-hint\">{item.hint}</span>\n )}\n </span>\n </div>\n ))}\n </div>\n </div>\n )\n}\n","import { useCallback, useMemo, useRef, useState } from 'react'\nimport type { CSSProperties, DragEvent } from 'react'\nimport type { Rule } from '@skygraph/core'\nimport { Form } from '../Form'\nimport { Field } from '../Field'\nimport { AutoField } from '../AutoField/AutoField'\nimport { useForm } from '../../../hooks/useForm'\nimport { editorSchemaToJsonSchema, createFieldFromPaletteType } from './adapters/jsonSchema'\nimport { jsonSchemaToRules, jsonSchemaToDefaults } from '../../../adapters/jsonSchemaAdapter'\nimport { PALETTE_DATA_TYPE } from './SchemaFormEditorPalette'\nimport type { SchemaEditorStore } from './useSchemaEditor'\nimport type { EditorField } from './types'\nimport type { FieldType } from '../AutoField/AutoField'\nimport { useConfig } from '../../ConfigProvider'\n\nexport interface SchemaFormEditorCanvasProps {\n store: SchemaEditorStore\n /** Empty-state CTA text. */\n emptyText?: string\n /** Wrapper className (additive). */\n className?: string\n /** Wrapper inline style. */\n style?: CSSProperties\n}\n\nexport function SchemaFormEditorCanvas({\n store,\n emptyText = 'Drop a field here',\n className,\n style,\n}: SchemaFormEditorCanvasProps) {\n const {\n state,\n addField,\n removeField,\n moveFieldUp,\n moveFieldDown,\n duplicateField,\n moveField,\n setSelectedId,\n } = store\n const fields = state.schema.fields\n const isEmpty = fields.length === 0\n\n const jsonSchema = useMemo(() => editorSchemaToJsonSchema(state.schema), [state.schema])\n const rulesMap = useMemo(() => jsonSchemaToRules(jsonSchema), [jsonSchema])\n const defaults = useMemo(() => jsonSchemaToDefaults(jsonSchema), [jsonSchema])\n\n // Re-key the form whenever the schema fingerprint changes so the underlying\n // FormEngine rebuilds its defaults — otherwise newly-added fields would not\n // pick up their `defaultValue`.\n const formKey = useMemo(\n () =>\n fields.map((f) => `${f.id}:${f.name}:${f.type}:${String(f.defaultValue ?? '')}`).join('|'),\n [fields],\n )\n\n const [dropIndicator, setDropIndicator] = useState<number | null>(null)\n const dragRef = useRef<{ id: string } | null>(null)\n\n function handleDragOver(e: DragEvent<HTMLDivElement>) {\n if (\n e.dataTransfer.types.includes(PALETTE_DATA_TYPE) ||\n e.dataTransfer.types.includes('text/plain') ||\n dragRef.current !== null\n ) {\n e.preventDefault()\n e.dataTransfer.dropEffect = dragRef.current ? 'move' : 'copy'\n }\n }\n\n function handleDrop(e: DragEvent<HTMLDivElement>, beforeIndex: number) {\n e.preventDefault()\n e.stopPropagation()\n setDropIndicator(null)\n\n // Re-order existing field\n if (dragRef.current) {\n const id = dragRef.current.id\n const fromIdx = fields.findIndex((f) => f.id === id)\n dragRef.current = null\n if (fromIdx === -1) return\n let target = beforeIndex\n if (target > fromIdx) target -= 1\n if (target === fromIdx) return\n moveField(id, target)\n return\n }\n\n // Drop a new field from the palette\n let type: FieldType | null = null\n const fromPalette = e.dataTransfer.getData(PALETTE_DATA_TYPE)\n if (fromPalette) {\n type = fromPalette as FieldType\n } else {\n const txt = e.dataTransfer.getData('text/plain')\n if (txt) type = txt as FieldType\n }\n if (!type) return\n\n const existingNames = fields.map((f) => f.name)\n const newField = createFieldFromPaletteType(type, existingNames)\n addField(newField, beforeIndex)\n }\n\n const handleEmptyClick = useCallback(() => setSelectedId(null), [setSelectedId])\n\n return (\n <div\n className={['sg-sfe-canvas', className].filter(Boolean).join(' ')}\n style={style}\n data-testid=\"sfe-canvas\"\n data-empty={isEmpty ? 'true' : 'false'}\n onDragOver={handleDragOver}\n onDrop={(e) => handleDrop(e, fields.length)}\n >\n {isEmpty && (\n <div\n className=\"sg-sfe-canvas-empty\"\n data-testid=\"sfe-canvas-empty\"\n onClick={handleEmptyClick}\n >\n {emptyText}\n </div>\n )}\n\n {!isEmpty && (\n <CanvasForm\n key={formKey}\n fields={fields}\n rulesMap={rulesMap}\n defaults={defaults}\n selectedId={state.selectedId}\n dropIndicator={dropIndicator}\n onSelect={setSelectedId}\n onRemove={removeField}\n onDuplicate={duplicateField}\n onMoveUp={moveFieldUp}\n onMoveDown={moveFieldDown}\n onFieldDragStart={(id) => {\n dragRef.current = { id }\n }}\n onFieldDragEnd={() => {\n dragRef.current = null\n setDropIndicator(null)\n }}\n onFieldDrop={handleDrop}\n onIndicator={setDropIndicator}\n />\n )}\n </div>\n )\n}\n\ninterface CanvasFormProps {\n fields: EditorField[]\n rulesMap: Record<string, Rule[]>\n defaults: Record<string, unknown>\n selectedId: string | null\n dropIndicator: number | null\n onSelect: (id: string | null) => void\n onRemove: (id: string) => void\n onDuplicate: (id: string) => void\n onMoveUp: (id: string) => void\n onMoveDown: (id: string) => void\n onFieldDragStart: (id: string) => void\n onFieldDragEnd: () => void\n onFieldDrop: (e: DragEvent<HTMLDivElement>, beforeIndex: number) => void\n onIndicator: (i: number | null) => void\n}\n\nfunction CanvasForm({\n fields,\n rulesMap,\n defaults,\n selectedId,\n dropIndicator,\n onSelect,\n onRemove,\n onDuplicate,\n onMoveUp,\n onMoveDown,\n onFieldDragStart,\n onFieldDragEnd,\n onFieldDrop,\n onIndicator,\n}: CanvasFormProps) {\n const form = useForm({ defaultValues: defaults })\n\n return (\n <Form form={form} layout=\"vertical\" className=\"sg-sfe-canvas-form\">\n {fields.map((field, idx) => (\n <FieldOverlay\n key={field.id}\n index={idx}\n field={field}\n isSelected={field.id === selectedId}\n isLast={idx === fields.length - 1}\n showIndicator={dropIndicator === idx}\n rules={rulesMap[field.name]}\n onSelect={onSelect}\n onRemove={onRemove}\n onDuplicate={onDuplicate}\n onMoveUp={onMoveUp}\n onMoveDown={onMoveDown}\n onFieldDragStart={onFieldDragStart}\n onFieldDragEnd={onFieldDragEnd}\n onFieldDrop={onFieldDrop}\n onIndicator={onIndicator}\n />\n ))}\n {dropIndicator === fields.length && (\n <div className=\"sg-sfe-canvas-drop-indicator\" data-testid=\"sfe-drop-indicator\" />\n )}\n </Form>\n )\n}\n\ninterface FieldOverlayProps {\n index: number\n field: EditorField\n isSelected: boolean\n isLast: boolean\n showIndicator: boolean\n rules: Rule[] | undefined\n onSelect: (id: string | null) => void\n onRemove: (id: string) => void\n onDuplicate: (id: string) => void\n onMoveUp: (id: string) => void\n onMoveDown: (id: string) => void\n onFieldDragStart: (id: string) => void\n onFieldDragEnd: () => void\n onFieldDrop: (e: DragEvent<HTMLDivElement>, beforeIndex: number) => void\n onIndicator: (i: number | null) => void\n}\n\nfunction FieldOverlay({\n index,\n field,\n isSelected,\n showIndicator,\n rules,\n onSelect,\n onRemove,\n onDuplicate,\n onMoveUp,\n onMoveDown,\n onFieldDragStart,\n onFieldDragEnd,\n onFieldDrop,\n onIndicator,\n}: FieldOverlayProps) {\n const sfeLocale = useConfig().locale?.schemaFormEditor\n function handleDragOver(e: DragEvent<HTMLDivElement>) {\n e.preventDefault()\n e.stopPropagation()\n onIndicator(index)\n }\n\n function handleDragLeave() {\n onIndicator(null)\n }\n\n return (\n <>\n {showIndicator && (\n <div className=\"sg-sfe-canvas-drop-indicator\" data-testid=\"sfe-drop-indicator\" />\n )}\n <div\n className={['sg-sfe-canvas-field', isSelected ? 'sg-sfe-canvas-field-selected' : '']\n .filter(Boolean)\n .join(' ')}\n data-testid=\"sfe-canvas-field\"\n data-field-id={field.id}\n data-field-name={field.name}\n draggable\n onClick={(e) => {\n e.stopPropagation()\n onSelect(field.id)\n }}\n onDragStart={(e) => {\n e.stopPropagation()\n e.dataTransfer.effectAllowed = 'move'\n e.dataTransfer.setData('text/plain', field.id)\n onFieldDragStart(field.id)\n }}\n onDragEnd={onFieldDragEnd}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={(e) => onFieldDrop(e, index)}\n >\n {isSelected && (\n <div\n className=\"sg-sfe-canvas-field-toolbar\"\n data-testid=\"sfe-field-toolbar\"\n onClick={(e) => e.stopPropagation()}\n >\n <button\n type=\"button\"\n className=\"sg-sfe-canvas-field-toolbar-btn\"\n data-testid=\"sfe-action-up\"\n aria-label={sfeLocale?.moveFieldUp ?? 'Move field up'}\n onClick={() => onMoveUp(field.id)}\n >\n ↑\n </button>\n <button\n type=\"button\"\n className=\"sg-sfe-canvas-field-toolbar-btn\"\n data-testid=\"sfe-action-down\"\n aria-label={sfeLocale?.moveFieldDown ?? 'Move field down'}\n onClick={() => onMoveDown(field.id)}\n >\n ↓\n </button>\n <button\n type=\"button\"\n className=\"sg-sfe-canvas-field-toolbar-btn\"\n data-testid=\"sfe-action-duplicate\"\n aria-label={sfeLocale?.duplicateField ?? 'Duplicate field'}\n onClick={() => onDuplicate(field.id)}\n >\n ⎘\n </button>\n <button\n type=\"button\"\n className=\"sg-sfe-canvas-field-toolbar-btn sg-sfe-canvas-field-toolbar-btn-danger\"\n data-testid=\"sfe-action-delete\"\n aria-label={sfeLocale?.deleteField ?? 'Delete field'}\n onClick={() => onRemove(field.id)}\n >\n ×\n </button>\n </div>\n )}\n <div className=\"sg-sfe-canvas-field-inner\">\n <Field name={field.name} label={field.label} rules={rules}>\n {() => (\n <AutoField\n name={field.name}\n type={field.type}\n options={field.options}\n placeholder={field.placeholder}\n min={field.min}\n max={field.max}\n />\n )}\n </Field>\n {field.helpText && <span className=\"sg-sfe-canvas-field-help\">{field.helpText}</span>}\n </div>\n </div>\n </>\n )\n}\n","import { useMemo } from 'react'\nimport type { CSSProperties } from 'react'\nimport type { SchemaEditorStore } from './useSchemaEditor'\nimport type { EditorField } from './types'\nimport type { AutoFieldOption, FieldType } from '../AutoField/AutoField'\nimport { useConfig } from '../../ConfigProvider'\n\nexport interface SchemaFormEditorInspectorProps {\n store: SchemaEditorStore\n className?: string\n style?: CSSProperties\n}\n\nconst TYPES_WITH_OPTIONS: FieldType[] = ['select', 'radio', 'multiselect']\nconst TYPES_WITH_NUMERIC_RANGE: FieldType[] = ['number', 'slider', 'rate']\nconst TYPES_WITH_LENGTH_RANGE: FieldType[] = ['string', 'textarea', 'password', 'email', 'url']\n\nexport function SchemaFormEditorInspector({\n store,\n className,\n style,\n}: SchemaFormEditorInspectorProps) {\n const { state, updateField } = store\n\n const selected = useMemo<EditorField | null>(() => {\n const id = state.selectedId\n if (!id) return null\n return state.schema.fields.find((f) => f.id === id) ?? null\n }, [state.selectedId, state.schema.fields])\n\n if (!selected) {\n return (\n <div\n className={['sg-sfe-inspector', className].filter(Boolean).join(' ')}\n style={style}\n data-testid=\"sfe-inspector\"\n >\n <div className=\"sg-sfe-inspector-empty\" data-testid=\"sfe-inspector-empty\">\n Select a field on the canvas to edit its properties.\n </div>\n </div>\n )\n }\n\n const isOptionsType = TYPES_WITH_OPTIONS.includes(selected.type)\n const isNumericType = TYPES_WITH_NUMERIC_RANGE.includes(selected.type)\n const isLengthType = TYPES_WITH_LENGTH_RANGE.includes(selected.type)\n const isBooleanType = selected.type === 'boolean' || selected.type === 'switch'\n\n function patch(p: Partial<EditorField>) {\n updateField(selected!.id, p)\n }\n\n return (\n <div\n className={['sg-sfe-inspector', className].filter(Boolean).join(' ')}\n style={style}\n data-testid=\"sfe-inspector\"\n >\n <div className=\"sg-sfe-inspector-title\">Field properties</div>\n\n <Row label=\"Name\">\n <input\n className=\"sg-sfe-inspector-input\"\n data-testid=\"sfe-inspector-name\"\n value={selected.name}\n onChange={(e) => patch({ name: e.target.value })}\n />\n </Row>\n\n <Row label=\"Label\">\n <input\n className=\"sg-sfe-inspector-input\"\n data-testid=\"sfe-inspector-label\"\n value={selected.label}\n onChange={(e) => patch({ label: e.target.value })}\n />\n </Row>\n\n <Row label=\"Type\">\n <input\n className=\"sg-sfe-inspector-input\"\n data-testid=\"sfe-inspector-type\"\n value={selected.type}\n readOnly\n aria-readonly=\"true\"\n />\n </Row>\n\n <Row label=\"Required\">\n <label className=\"sg-sfe-inspector-checkbox\">\n <input\n type=\"checkbox\"\n data-testid=\"sfe-inspector-required\"\n checked={!!selected.required}\n onChange={(e) => patch({ required: e.target.checked })}\n />\n <span>Make this field required</span>\n </label>\n </Row>\n\n <Row label=\"Placeholder\">\n <input\n className=\"sg-sfe-inspector-input\"\n data-testid=\"sfe-inspector-placeholder\"\n value={selected.placeholder ?? ''}\n onChange={(e) => patch({ placeholder: e.target.value || undefined })}\n />\n </Row>\n\n <Row label=\"Help text\">\n <input\n className=\"sg-sfe-inspector-input\"\n data-testid=\"sfe-inspector-help\"\n value={selected.helpText ?? ''}\n onChange={(e) => patch({ helpText: e.target.value || undefined })}\n />\n </Row>\n\n <Row label=\"Default\">\n <input\n className=\"sg-sfe-inspector-input\"\n data-testid=\"sfe-inspector-default\"\n value={\n selected.defaultValue === undefined\n ? ''\n : isBooleanType\n ? String(selected.defaultValue)\n : String(selected.defaultValue)\n }\n onChange={(e) => {\n const raw = e.target.value\n if (raw === '') return patch({ defaultValue: undefined })\n if (isBooleanType) return patch({ defaultValue: raw === 'true' })\n if (isNumericType) {\n const n = Number(raw)\n return patch({ defaultValue: Number.isFinite(n) ? n : raw })\n }\n patch({ defaultValue: raw })\n }}\n />\n </Row>\n\n {(isLengthType || isNumericType) && (\n <Row label={isLengthType ? 'Min length' : 'Min'}>\n <input\n className=\"sg-sfe-inspector-input\"\n data-testid=\"sfe-inspector-min\"\n type=\"number\"\n value={selected.min ?? ''}\n onChange={(e) => {\n const raw = e.target.value\n patch({ min: raw === '' ? undefined : Number(raw) })\n }}\n />\n </Row>\n )}\n\n {(isLengthType || isNumericType) && (\n <Row label={isLengthType ? 'Max length' : 'Max'}>\n <input\n className=\"sg-sfe-inspector-input\"\n data-testid=\"sfe-inspector-max\"\n type=\"number\"\n value={selected.max ?? ''}\n onChange={(e) => {\n const raw = e.target.value\n patch({ max: raw === '' ? undefined : Number(raw) })\n }}\n />\n </Row>\n )}\n\n {isLengthType && (\n <Row label=\"Pattern (RegExp)\">\n <input\n className=\"sg-sfe-inspector-input\"\n data-testid=\"sfe-inspector-pattern\"\n value={selected.pattern ?? ''}\n placeholder=\"^[A-Z].*\"\n onChange={(e) => patch({ pattern: e.target.value || undefined })}\n />\n </Row>\n )}\n\n {isOptionsType && (\n <OptionsEditor\n options={selected.options ?? []}\n onChange={(options) => patch({ options })}\n />\n )}\n </div>\n )\n}\n\nfunction Row({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <div className=\"sg-sfe-inspector-row\" data-testid=\"sfe-inspector-row\">\n <label className=\"sg-sfe-inspector-row-label\">{label}</label>\n <div className=\"sg-sfe-inspector-row-control\">{children}</div>\n </div>\n )\n}\n\nfunction OptionsEditor({\n options,\n onChange,\n}: {\n options: AutoFieldOption[]\n onChange: (next: AutoFieldOption[]) => void\n}) {\n const sfeLocale = useConfig().locale?.schemaFormEditor\n function update(idx: number, patch: Partial<AutoFieldOption>) {\n const copy = options.map((o) => ({ ...o }))\n copy[idx] = { ...copy[idx]!, ...patch }\n onChange(copy)\n }\n function remove(idx: number) {\n const copy = options.slice()\n copy.splice(idx, 1)\n onChange(copy)\n }\n function add() {\n const next: AutoFieldOption = {\n value: `option${options.length + 1}`,\n label: `Option ${options.length + 1}`,\n }\n onChange([...options, next])\n }\n\n return (\n <div className=\"sg-sfe-inspector-options\" data-testid=\"sfe-inspector-options\">\n <div className=\"sg-sfe-inspector-row-label\">Options</div>\n {options.map((opt, idx) => (\n <div key={idx} className=\"sg-sfe-inspector-option\">\n <input\n className=\"sg-sfe-inspector-input\"\n data-testid=\"sfe-inspector-option-label\"\n value={opt.label}\n placeholder={sfeLocale?.optionLabelPlaceholder ?? 'Label'}\n onChange={(e) => update(idx, { label: e.target.value })}\n />\n <input\n className=\"sg-sfe-inspector-input\"\n data-testid=\"sfe-inspector-option-value\"\n value={String(opt.value)}\n placeholder={sfeLocale?.optionValuePlaceholder ?? 'Value'}\n onChange={(e) => update(idx, { value: e.target.value })}\n />\n <button\n type=\"button\"\n className=\"sg-sfe-inspector-option-remove\"\n aria-label={sfeLocale?.removeOption ?? 'Remove option'}\n onClick={() => remove(idx)}\n >\n ×\n </button>\n </div>\n ))}\n <button\n type=\"button\"\n className=\"sg-sfe-inspector-option-add\"\n onClick={add}\n data-testid=\"sfe-inspector-option-add\"\n >\n + Add option\n </button>\n </div>\n )\n}\n","import { useMemo } from 'react'\nimport type { CSSProperties } from 'react'\nimport { editorSchemaToJsonSchema } from './adapters/jsonSchema'\nimport type { SchemaEditorStore } from './useSchemaEditor'\nimport { useConfig } from '../../ConfigProvider'\n\nexport interface SchemaFormEditorSchemaViewProps {\n store: SchemaEditorStore\n className?: string\n style?: CSSProperties\n /** Output mode — formatted JSON or a TypeScript-friendly literal. */\n mode?: 'json' | 'ts'\n}\n\nexport function SchemaFormEditorSchemaView({\n store,\n className,\n style,\n mode = 'json',\n}: SchemaFormEditorSchemaViewProps) {\n const sfeLocale = useConfig().locale?.schemaFormEditor\n const text = useMemo(() => {\n const schema = editorSchemaToJsonSchema(store.state.schema)\n if (mode === 'ts') return `const schema = ${JSON.stringify(schema, null, 2)} as const`\n return JSON.stringify(schema, null, 2)\n }, [store.state.schema, mode])\n\n return (\n <pre\n className={['sg-sfe-schema-view', className].filter(Boolean).join(' ')}\n style={style}\n data-testid=\"sfe-schema-view\"\n aria-label={sfeLocale?.schemaView ?? 'Generated JSON Schema'}\n >\n <code>{text}</code>\n </pre>\n )\n}\n","// Common types\nexport type { SizeType, BaseComponentProps, InteractiveProps, SizableProps } from './types'\nexport type {\n SgLocale,\n PaginationLocale,\n ModalLocale,\n PopconfirmLocale,\n EmptyLocale,\n FormLocale,\n UploadLocale,\n TransferLocale,\n InputPasswordLocale,\n SearchInputLocale,\n InlineEditLocale,\n TagInputLocale,\n DrawerLocale,\n NotificationLocale,\n TagLocale,\n SpinLocale,\n SkeletonLocale,\n BreadcrumbLocale,\n CarouselLocale,\n RateLocale,\n ChartsLocale,\n DatePickerLocale,\n CascaderLocale,\n TreeSelectLocale,\n DashboardLocale,\n GanttLocale,\n ResourceCalendarLocale,\n TimelineLocale,\n SchemaFormEditorLocale,\n} from './types'\n\n// ConfigProvider\nexport { ConfigProvider, useConfig } from './components/ConfigProvider'\nexport type { SgConfig, ConfigProviderProps } from './components/ConfigProvider'\n\n// Locale presets\nexport { en_US, ru_RU, zh_CN, de_DE, fr_FR, es_ES } from './locales'\n\n// Hooks\nexport { useField } from './hooks/useField'\nexport type { UseFieldReturn } from './hooks/useField'\nexport { useForm } from './hooks/useForm'\nexport type { UseFormOptions, UseFormReturn } from './hooks/useForm'\nexport { useComputed } from './hooks/useComputed'\n\n// Complex components (use core)\nexport { Form } from './components/complex/Form'\nexport type { FormProps } from './components/complex/Form'\nexport { Field } from './components/complex/Field'\nexport type { FieldProps } from './components/complex/Field'\nexport { SubmitButton } from './components/complex/SubmitButton'\nexport type { SubmitButtonProps } from './components/complex/SubmitButton'\nexport { FormContext, useFormContext } from './components/complex/FormContext'\nexport { FormList } from './components/complex/FormList'\nexport type { FormListProps } from './components/complex/FormList'\nexport { useWatch } from './hooks/useWatch'\nexport { Table } from './components/complex/Table'\nexport type {\n TableProps,\n TableColumn,\n TableRef,\n RowSelectionConfig,\n ExpandableConfig,\n TreeConfig,\n SummaryCell,\n CellSpan,\n TableLocale,\n FilterDropdownProps,\n AggregateType,\n RowNumberConfig,\n PinnedRowsConfig,\n GroupRow,\n SelectionSummaryAction,\n HeaderCell,\n FlatRow,\n} from './components/complex/Table'\nexport type { RowId, SortConfig, SortDirection, ColumnFilter, FilterFn } from '@skygraph/core'\nexport { useTable } from './hooks/useTable'\nexport type { UseTableOptions, UseTableReturn } from './hooks/useTable'\n\nexport { Tree } from './components/complex/Tree'\nexport type {\n TreeProps,\n TreeKey,\n TreeNodeData,\n TreeFieldNames,\n TreeLocale,\n TreeNodeStatus,\n TreeNodeAction,\n CheckInfo,\n SelectInfo,\n ExpandInfo,\n DragInfo,\n DropInfo,\n EditInfo,\n} from './components/complex/Tree'\nexport { useTree } from './hooks/useTree'\nexport type { UseTreeOptions, UseTreeReturn } from './hooks/useTree'\n\n// TreeSelect — single export from the complex (core-backed) implementation.\n// The legacy ui-only `TreeSelect` (and its `TreeSelectNode` type alias) was\n// removed in tab C round 9; consumers must use `TreeNodeData` from\n// `@skygraph/core` (re-exported above from `./components/complex/Tree`).\nexport { TreeSelect } from './components/complex/TreeSelect'\nexport type { TreeSelectProps } from './components/complex/TreeSelect'\nexport { Cascader } from './components/complex/Cascader'\nexport type { CascaderProps, CascaderOption } from './components/complex/Cascader'\n// Calendar lives in components/complex/ (uses core indirectly via state hooks).\n// The previous ui/Calendar.tsx was a re-export shim that violated the\n// \"ui/ has no core\" boundary; we now export directly from complex.\nexport { Calendar } from './components/complex/Calendar'\nexport type {\n CalendarProps,\n CalendarLocale,\n CalendarHeaderInfo,\n CalendarCellInfo,\n CalendarEvent,\n} from './components/complex/Calendar'\n\n// UI components (pure React, no core)\nexport { Spin } from './components/ui/Spin'\nexport type { SpinProps } from './components/ui/Spin'\nexport { Button } from './components/ui/Button'\nexport type { ButtonProps } from './components/ui/Button'\nexport { Input } from './components/ui/Input'\nexport type { InputProps } from './components/ui/Input'\nexport { Modal } from './components/ui/Modal'\nexport type { ModalProps } from './components/ui/Modal'\nexport { Checkbox } from './components/ui/Checkbox'\nexport type { CheckboxProps } from './components/ui/Checkbox'\nexport { RadioGroup } from './components/ui/Radio'\nexport type { RadioGroupProps, RadioOption } from './components/ui/Radio'\nexport { Switch } from './components/ui/Switch'\nexport type { SwitchProps } from './components/ui/Switch'\nexport { Select } from './components/ui/Select'\nexport type { SelectProps, SelectOption } from './components/ui/Select'\nexport { Tabs } from './components/ui/Tabs'\nexport type { TabsProps, TabItem } from './components/ui/Tabs'\nexport { Tooltip } from './components/ui/Tooltip'\nexport type { TooltipProps } from './components/ui/Tooltip'\nexport { Textarea } from './components/ui/Textarea'\nexport type { TextareaProps } from './components/ui/Textarea'\nexport { InputNumber } from './components/ui/InputNumber'\nexport type { InputNumberProps } from './components/ui/InputNumber'\nexport { DatePicker, RangePicker } from './components/ui/DatePicker'\nexport type {\n DatePickerProps,\n RangePickerProps,\n PickerMode,\n DatePreset,\n ShowTimeConfig,\n} from './components/ui/DatePicker'\nexport { TimePicker, TimeRangePicker } from './components/ui/TimePicker'\nexport type { TimePickerProps, TimeRangePickerProps } from './components/ui/TimePicker'\nexport { AutoComplete } from './components/ui/AutoComplete'\nexport type { AutoCompleteProps, AutoCompleteOption } from './components/ui/AutoComplete'\nexport { Slider } from './components/ui/Slider'\nexport type { SliderProps } from './components/ui/Slider'\nexport { Rate } from './components/ui/Rate'\nexport type { RateProps } from './components/ui/Rate'\nexport { Upload } from './components/ui/Upload'\nexport type { UploadProps, UploadFile } from './components/ui/Upload'\nexport { notification, NotificationContainer } from './components/ui/Notification'\nexport type { NotificationConfig, NotificationContainerProps } from './components/ui/Notification'\nexport { Drawer } from './components/ui/Drawer'\nexport type { DrawerProps } from './components/ui/Drawer'\nexport { Popconfirm } from './components/ui/Popconfirm'\nexport type { PopconfirmProps } from './components/ui/Popconfirm'\nexport { Badge } from './components/ui/Badge'\nexport type { BadgeProps } from './components/ui/Badge'\nexport { Tag } from './components/ui/Tag'\nexport type { TagProps } from './components/ui/Tag'\nexport { Avatar } from './components/ui/Avatar'\nexport type { AvatarProps } from './components/ui/Avatar'\nexport { Breadcrumb } from './components/ui/Breadcrumb'\nexport type { BreadcrumbProps, BreadcrumbItem } from './components/ui/Breadcrumb'\nexport { Pagination } from './components/ui/Pagination'\nexport type { PaginationProps } from './components/ui/Pagination'\nexport { Dropdown } from './components/ui/Dropdown'\nexport type { DropdownProps, DropdownItem } from './components/ui/Dropdown'\nexport { Progress } from './components/ui/Progress'\nexport type { ProgressProps } from './components/ui/Progress'\nexport { Menu } from './components/ui/Menu'\nexport type { MenuProps, MenuItem } from './components/ui/Menu'\nexport { Collapse } from './components/ui/Collapse'\nexport type { CollapseProps, CollapseItem } from './components/ui/Collapse'\nexport { ColorPicker } from './components/ui/ColorPicker'\nexport type { ColorPickerProps } from './components/ui/ColorPicker'\nexport { Empty } from './components/ui/Empty'\nexport type { EmptyProps } from './components/ui/Empty'\nexport { Result } from './components/ui/Result'\nexport type { ResultProps } from './components/ui/Result'\nexport { Skeleton } from './components/ui/Skeleton'\nexport type { SkeletonProps } from './components/ui/Skeleton'\nexport { Segmented } from './components/ui/Segmented'\nexport type { SegmentedProps } from './components/ui/Segmented'\nexport { Steps } from './components/ui/Steps'\nexport type { StepsProps, StepItem } from './components/ui/Steps'\nexport { Timeline } from './components/ui/Timeline'\nexport type { TimelineProps, TimelineItem } from './components/ui/Timeline'\nexport { Carousel } from './components/ui/Carousel'\nexport type { CarouselProps } from './components/ui/Carousel'\nexport { Descriptions } from './components/ui/Descriptions'\nexport type { DescriptionsProps, DescriptionsItem } from './components/ui/Descriptions'\n\n// Schema Forms\nexport { useFieldArray } from './hooks/useFieldArray'\nexport type { UseFieldArrayReturn } from './hooks/useFieldArray'\nexport { AutoField } from './components/complex/AutoField'\nexport type { AutoFieldProps, FieldType, AutoFieldOption } from './components/complex/AutoField'\nexport { zodRule, zodRules, zodDefaults, zodToJsonSchema } from './adapters/zodAdapter'\nexport type { ZodLikeSchema, ZodObjectLikeSchema, ZodAdapterOptions } from './adapters/zodAdapter'\nexport {\n jsonSchemaToFields,\n jsonSchemaToRules,\n jsonSchemaToDefaults,\n} from './adapters/jsonSchemaAdapter'\nexport type { JSONSchema, JSONSchemaProperty, AutoFieldConfig } from './adapters/jsonSchemaAdapter'\nexport { FormProvider, useFormProvider } from './components/complex/FormProvider'\nexport type { FormProviderProps } from './components/complex/FormProvider'\nexport { SchemaForm } from './components/complex/SchemaForm'\nexport type { SchemaFormProps } from './components/complex/SchemaForm'\n\n// SchemaFormEditor — visual builder over SchemaForm.\nexport {\n SchemaFormEditor,\n SchemaFormEditorPalette,\n SchemaFormEditorCanvas,\n SchemaFormEditorInspector,\n SchemaFormEditorSchemaView,\n useSchemaEditor,\n jsonSchemaToEditorSchema,\n editorSchemaToJsonSchema,\n createEmptyEditorSchema,\n createFieldFromPaletteType,\n DEFAULT_PALETTE_ITEMS,\n PALETTE_DATA_TYPE,\n} from './components/complex/SchemaFormEditor'\nexport type {\n SchemaFormEditorProps,\n SchemaFormEditorPaletteProps,\n SchemaFormEditorCanvasProps,\n SchemaFormEditorInspectorProps,\n SchemaFormEditorSchemaViewProps,\n SchemaEditorStore,\n UseSchemaEditorOptions,\n PaletteItem,\n EditorSchema,\n EditorField,\n EditorAction,\n EditorState,\n} from './components/complex/SchemaFormEditor'\n\n// Virtual Scroll\nexport { useVirtualScroll } from './hooks/useVirtualScroll'\nexport type { UseVirtualScrollOptions, UseVirtualScrollReturn } from './hooks/useVirtualScroll'\nexport { VirtualList } from './components/complex/VirtualList/VirtualList'\nexport type { VirtualListProps, VirtualListRef } from './components/complex/VirtualList/VirtualList'\nexport type {\n VirtualEngine,\n VirtualEngineOptions,\n VirtualEngineEvent,\n VirtualEngineListener,\n VirtualRange,\n VirtualItem,\n MeasureCache,\n MeasureCacheEvent,\n MeasureCacheListener,\n} from '@skygraph/core'\nexport { createVirtual, createMeasureCache } from '@skygraph/core'\n\n// History / DevTools\nexport { useHistory } from './hooks/useHistory'\nexport type { UseHistoryReturn } from './hooks/useHistory'\nexport { HistoryPanel } from './components/devtools/HistoryPanel'\nexport type { HistoryPanelProps } from './components/devtools/HistoryPanel'\n\n// Diagram (GraphEngine view)\nexport { useGraph } from './hooks/useGraph'\nexport type { UseGraphOptions, UseGraphReturn } from './hooks/useGraph'\nexport { Diagram } from './components/complex/Diagram'\nexport type {\n DiagramProps,\n DiagramNodeRenderer,\n DiagramRef,\n DiagramSelectionMode,\n DiagramCanvasContextPoint,\n NodeAction as DiagramNodeAction,\n EdgeAction as DiagramEdgeAction,\n} from './components/complex/Diagram'\n\n// Print (Tab L1 — @media print + popup-window helper, no runtime deps)\nexport { printElement, buildPrintHtml, buildPageRule } from './utils/print'\nexport type { PrintOptions, PrintableProp } from './utils/print'\n\n// Dashboard (static-layout grid for widgets)\nexport { Dashboard, DashboardEditor } from './components/complex/Dashboard'\nexport type {\n DashboardProps,\n DashboardWidget,\n WidgetAction,\n DashboardEditorProps,\n DashboardLayoutChange,\n DashboardLayoutPatch,\n DashboardContextMenuHandler,\n DashboardWidgetContextMenuHandler,\n} from './components/complex/Dashboard'\n\n// Gantt (task bars over a discrete time axis)\nexport { Gantt } from './components/complex/Gantt'\nexport type {\n GanttProps,\n GanttTask,\n GanttResource,\n GanttScale,\n GanttRange,\n} from './components/complex/Gantt'\n\n// ResourceCalendar (shifts / bookings per resource lane with conflict detection)\nexport { ResourceCalendar } from './components/complex/ResourceCalendar'\nexport type {\n ResourceCalendarProps,\n Resource,\n Assignment,\n AvailabilityRule,\n CalendarScale,\n Conflict,\n} from './components/complex/ResourceCalendar'\n\n// EventTimeline (chronological event stream — distinct from the simpler\n// step-based `Timeline` in `components/ui/Timeline.tsx`).\nexport { EventTimeline } from './components/complex/Timeline'\nexport type {\n EventTimelineProps,\n TimelineEvent,\n TimelineOrientation,\n TimelineGroupBy,\n} from './components/complex/Timeline'\n\n// Charts (SVG primitives + animations + crosshair + brushing + hover toolbar)\nexport {\n LineChart,\n BarChart,\n AreaChart,\n PieChart,\n ChartLegend,\n ChartCrosshair,\n ChartBrush,\n ChartHoverToolbar,\n defaultChartActions,\n resolveChartActions,\n resolveBrushConfig,\n useChartSize,\n downloadSvg,\n downloadSvgAsPng,\n serializeSvg,\n measureSvg,\n triggerDownload,\n makeChartContextMenuHandler,\n makeSeriesContextMenuHandler,\n DEFAULT_PALETTE,\n DEFAULT_CHART_ANIMATION_MS,\n colorForSeries,\n resolveChartAnimation,\n chartDataKey,\n} from './components/complex/Charts'\nexport type {\n LineChartProps,\n LineChartCrosshair,\n BarChartProps,\n AreaChartProps,\n PieChartProps,\n PieChartSlice,\n ChartLegendProps,\n ChartCrosshairProps,\n ChartCrosshairPoint,\n ChartBrushProps,\n ChartBrushConfig,\n ChartBrushRange,\n ChartHoverToolbarProps,\n ChartAction,\n ChartActionContext,\n ChartActionsProp,\n ChartSize,\n DownloadPngOptions,\n PngSize,\n ChartContextMenuHandler,\n ChartContextMenuPayload,\n ChartSeriesContextMenuHandler,\n ChartSeriesContextMenuPayload,\n ChartAnimation,\n BaseChartProps,\n ChartCategory,\n ChartSeries,\n ChartValue,\n ChartRef,\n} from './components/complex/Charts'\n\n// DataGrid\nexport { DataGrid } from './components/complex/DataGrid'\nexport type {\n DataGridProps,\n DataGridRef,\n DataGridColumn,\n DataGridLocale,\n CellEditorProps,\n CellPosition,\n CellRange,\n CellValue,\n DataGridSummaryRow,\n DataGridContextMenuItem,\n} from './components/complex/DataGrid'\n\n// Complex components (additional)\nexport { List } from './components/complex/List'\nexport type { ListProps, ListItemProps, ListItemMetaProps } from './components/complex/List'\n// Transfer — single export from the complex (pagination, sortable, locale,\n// footer, operations) implementation. The simpler ui-only Transfer was\n// removed in tab C round 9.\n// `TransferLocale` is already exported above (from `./types`) — avoid a\n// duplicate identifier in the rolled-up `.d.ts`.\nexport { Transfer, TransferList } from './components/complex/Transfer'\nexport type { TransferProps, TransferItem, TransferListProps } from './components/complex/Transfer'\nexport { Mentions } from './components/ui/Mentions'\nexport type { MentionsProps, MentionOption } from './components/ui/Mentions'\nexport { Transition } from './components/ui/Transition'\nexport type { TransitionProps } from './components/ui/Transition'\n\n// Form-oriented UI components\nexport { InputPassword } from './components/ui/InputPassword'\nexport type { InputPasswordProps, PasswordStrength } from './components/ui/InputPassword'\nexport { SearchInput } from './components/ui/SearchInput'\nexport type { SearchInputProps } from './components/ui/SearchInput'\nexport { TagInput } from './components/ui/TagInput'\nexport type { TagInputProps } from './components/ui/TagInput'\nexport { PinInput } from './components/ui/PinInput'\nexport type { PinInputProps } from './components/ui/PinInput'\nexport { InlineEdit } from './components/ui/InlineEdit'\nexport type { InlineEditProps } from './components/ui/InlineEdit'\nexport { InputGroup } from './components/ui/InputGroup'\nexport type { InputGroupProps } from './components/ui/InputGroup'\n","import { useMemo, useRef, useSyncExternalStore } from 'react'\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: GraphState\n /** The Core instance backing the engine (own or borrowed). */\n core: Core\n}\n\n/**\n * Reactive bridge between `createGraph` (from `@skygraph/core`) and React.\n *\n * The hook creates (or reuses) a Core + Graph pair, subscribes to the\n * `$graph.snapshot.*` namespace, and re-renders the consumer on every commit.\n *\n * The graph object reference is stable across renders. Mutations go through\n * `graph.addNode(...)`, `graph.moveNode(...)`, etc.\n */\nexport function useGraph(options: UseGraphOptions = {}): UseGraphReturn {\n const { core: externalCore, ...graphOptions } = options\n\n const { graph, core } = useMemo(() => {\n const c = externalCore ?? createCore()\n const g = createGraph(c, graphOptions)\n return { graph: g, core: c }\n // graphOptions contains a name only; ignoring its identity is the\n // correct behaviour — re-creating the engine on each render would lose\n // user-mutated state.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [externalCore])\n\n // Cache the snapshot reference so `useSyncExternalStore` can compare by\n // identity. We rebuild it ONLY when the engine commits (subscribe callback\n // fires) — not on every render. This is what `useSyncExternalStore`\n // requires: getSnapshot must be referentially stable between commits.\n const snapshotRef = useRef<GraphState | null>(null)\n if (snapshotRef.current === null) {\n snapshotRef.current = graph.getState()\n }\n\n const state = useSyncExternalStore(\n (cb) =>\n graph.subscribe(() => {\n snapshotRef.current = graph.getState()\n cb()\n }),\n () => snapshotRef.current!,\n () => snapshotRef.current!,\n )\n\n return { graph, state, core }\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport type {\n CSSProperties,\n DragEvent as ReactDragEvent,\n ForwardedRef,\n MouseEvent as ReactMouseEvent,\n PointerEvent as ReactPointerEvent,\n ReactNode,\n WheelEvent as ReactWheelEvent,\n} from 'react'\nimport {\n routeOrthogonal,\n pointsToPath,\n pointsToRoundedPath,\n getBezierPath,\n resolveEdgeEndpoint,\n} from '@skygraph/core'\nimport type { ResolvedEndpoint } from '@skygraph/core'\nimport type {\n AABB,\n EdgeEndpoint,\n GraphEdge,\n GraphEngine,\n GraphNode,\n GraphState,\n NodeId,\n Point,\n} from '@skygraph/core'\nimport { printElement } from '../../../utils/print'\nimport type { PrintOptions, PrintableProp } from '../../../utils/print'\nimport {\n EdgeHoverActions,\n NodeHoverActions,\n type EdgeAction,\n type NodeAction,\n} from './HoverActions'\nimport {\n nodesInBox,\n rectFromCorners,\n screenRectToWorld,\n selectionsEqual,\n toggleSelection,\n type ScreenRect,\n} from './selection'\n\n/** Imperative API of {@link Diagram}. */\nexport interface DiagramRef {\n /**\n * Открыть popup и вызвать window.print() на DOM-области диаграммы. Объекты\n * `customStyles` / `pageSize` / `orientation` мерджатся с тем, что пришло\n * через prop `printable`.\n */\n print: (opts?: PrintOptions) => void\n}\n\n/**\n * Per-node renderer. Receives the engine node and returns the React content\n * placed inside the absolutely-positioned wrapper. If omitted, a default\n * label (`node.id`) is rendered.\n */\nexport type DiagramNodeRenderer = (node: GraphNode) => ReactNode\n\n/** Selection management mode for the diagram. */\nexport type DiagramSelectionMode = 'single' | 'multi' | 'lasso'\n\n/**\n * Argument passed to {@link DiagramProps.onCanvasContextMenu} — combines\n * world-space and screen-space coordinates so consumers can position a\n * floating menu without re-projecting.\n */\nexport interface DiagramCanvasContextPoint {\n /** World-space x (matches `node.transform.x`). */\n x: number\n /** World-space y. */\n y: number\n /** Browser-screen x (`event.clientX`). */\n screenX: number\n /** Browser-screen y (`event.clientY`). */\n screenY: number\n}\n\n/**\n * Argument passed to {@link DiagramProps.onDropNode} when a draggable\n * HTML5 element is dropped on the canvas. Combines world-space\n * coordinates (already adjusted for pan / zoom) with the underlying\n * `DragEvent` so consumers can pull whatever payload they encoded.\n */\nexport interface DiagramDropPoint {\n /** World-space x where the cursor was released. */\n x: number\n /** World-space y where the cursor was released. */\n y: number\n /** Browser-screen x (`event.clientX`). */\n screenX: number\n /** Browser-screen y (`event.clientY`). */\n screenY: number\n /** The original native `DataTransfer` so the consumer can decode the payload. */\n dataTransfer: DataTransfer | null\n}\n\nexport interface DiagramProps {\n /** GraphEngine driving the diagram (e.g. from `useGraph()`). */\n graph: GraphEngine\n /**\n * Snapshot of the graph state (from `useGraph().state`). Required so that\n * the component re-renders on every commit.\n */\n state: GraphState\n /** Width of the canvas; defaults to a flexible 100%. */\n width?: number | string\n /** Height of the canvas; defaults to 400. */\n height?: number | string\n /** Optional content renderer per node. */\n renderNode?: DiagramNodeRenderer\n /** Root wrapper className. */\n className?: string\n /** Root wrapper inline style. */\n style?: CSSProperties\n /** Drop the default `sg-diagram-*` class names. */\n unstyled?: boolean\n /**\n * Enable click-and-drag to move nodes. The handler receives the new\n * position in the parent's coordinate space and is expected to call\n * `graph.moveNode(...)` (the default handler does exactly this).\n *\n * Set `true` for the default behaviour, `false` (default) to disable,\n * or pass a custom function for richer drag logic (e.g. snap-to-grid,\n * permission checks).\n *\n * @default false\n */\n draggable?: boolean | ((id: NodeId, x: number, y: number) => void)\n /**\n * Enable mouse-wheel zoom (`Ctrl + wheel`) and pinch-zoom-style scaling.\n * The internal canvas is wrapped in a `<g>` / `<div>` whose CSS\n * transform reflects the current zoom factor.\n *\n * @default false\n */\n zoomable?: boolean\n /**\n * Enable panning. Plain mouse-wheel scrolls the canvas; the middle\n * mouse button drags it. `Ctrl + wheel` is reserved for zoom (when\n * `zoomable` is also on), so the two flags compose cleanly.\n *\n * @default false\n */\n panable?: boolean\n /**\n * Snap node coordinates to a grid of this size (world units). When set,\n * `moveNode` is called with rounded `(x, y)` and the wrapper picks up\n * the `sg-diagram-grid` class so a CSS background pattern renders.\n *\n * Pass `0` or `undefined` to disable.\n */\n snapToGrid?: number\n /**\n * When `true`, orthogonal edges receive the AABBs of every other node\n * as obstacles so the A*-based router can avoid them. Off by default to\n * keep the cheap L-route path the norm; opt in only when the diagram\n * tends to have crossings worth avoiding.\n *\n * Independent of `routing` per edge — edges with `routing !== 'orthogonal'`\n * ignore this flag.\n */\n routeAroundNodes?: boolean\n /**\n * Tuning knobs forwarded to the edge router. `gridSize` / `inflate` /\n * `maxNodes` only apply to `routing: 'orthogonal'` when\n * `routeAroundNodes` is on (see `routeOrthogonal` in `@skygraph/core`).\n *\n * • `cornerRadius` — radius of rounded corners on orthogonal\n * edges. Defaults to `8` world units. Pass `0` for sharp\n * right-angle corners.\n * • `curvature` — control-handle intensity for `routing: 'bezier'`.\n * Defaults to React Flow's `0.25`. Range: `0..1`.\n */\n routingOptions?: {\n gridSize?: number\n inflate?: number\n maxNodes?: number\n cornerRadius?: number\n curvature?: number\n /**\n * Where the central bend of an orthogonal edge sits between the\n * two perpendicular stubs:\n * - `0` → bend at the source\n * - `0.5` → midpoint (default — matches React Flow's smoothstep)\n * - `1` → bend at the target\n */\n stepPosition?: number\n /**\n * Length of the perpendicular stub extending from each endpoint\n * before the connector turns. Defaults to `max(20, gridSize)`,\n * matching React Flow's `offset = 20`.\n */\n stubLength?: number\n }\n /**\n * When `true`, every rendered edge gets an arrow marker on its target\n * end (matches the visual norm of mainstream diagram libraries).\n * The marker reuses the edge stroke colour through `currentColor`\n * so hover / selected styles propagate automatically.\n *\n * @default true\n */\n edgeArrows?: boolean\n /**\n * Включает поддержку печати через `ref.print()`. Если `true` — без\n * визуальных изменений; объект `{ fileName }` задаёт имя popup-окна\n * (используется как title и дефолт для \"Save as PDF\").\n *\n * Сама печать триггерится императивно через `ref.print()`.\n * @default false\n */\n printable?: PrintableProp\n\n /**\n * Right-click on a node — fired with the original mouse event and the\n * engine node. If defined, the component calls `event.preventDefault()`\n * and the browser's native context menu is suppressed. If omitted, the\n * native menu shows as usual.\n */\n onNodeContextMenu?: (event: ReactMouseEvent<HTMLDivElement>, node: GraphNode) => void\n /**\n * Right-click on an edge path. Same suppression contract as\n * {@link DiagramProps.onNodeContextMenu}.\n */\n onEdgeContextMenu?: (event: ReactMouseEvent<SVGPathElement>, edge: GraphEdge) => void\n /**\n * Right-click on the empty canvas (i.e. neither a node nor an edge).\n * The point combines world and screen coordinates so a floating menu\n * can be positioned without re-projection.\n */\n onCanvasContextMenu?: (\n event: ReactMouseEvent<HTMLDivElement>,\n point: DiagramCanvasContextPoint,\n ) => void\n\n /**\n * Mini-toolbar entries shown above a hovered node. The overlay is\n * rendered in screen-space, so its size stays constant under\n * pan / zoom. Show / hide use a 200 ms enter delay and 150 ms leave\n * grace so the cursor can hop from the node to the overlay.\n */\n nodeActions?: readonly NodeAction[]\n /** Same as {@link DiagramProps.nodeActions} but rendered next to a hovered edge. */\n edgeActions?: readonly EdgeAction[]\n\n /**\n * Controlled selection: array of selected node ids. Pair with\n * {@link DiagramProps.onSelectionChange}. If left undefined, the\n * component manages selection internally (uncontrolled).\n */\n selection?: readonly NodeId[]\n /** Initial selection for the uncontrolled mode. */\n defaultSelection?: readonly NodeId[]\n /** Fired whenever the selection changes (both controlled and uncontrolled). */\n onSelectionChange?: (selection: NodeId[]) => void\n /**\n * - `'single'` (default) — legacy behaviour; no multi-select, no lasso.\n * - `'multi'` — `Ctrl+click` toggles selection; dragging a selected\n * node moves all selected together.\n * - `'lasso'` — same as `'multi'` plus a left-button drag on empty\n * canvas opens a rubber-band rectangle selecting nodes whose AABBs\n * intersect it.\n *\n * Defaults to `'single'` for backwards compatibility — existing drag\n * code keeps working unchanged.\n */\n selectionMode?: DiagramSelectionMode\n\n /**\n * Fired when an HTML5 drag-and-drop ends on the canvas. The handler\n * receives world-space coordinates (already adjusted for pan / zoom)\n * plus the raw `DataTransfer` so the consumer can decode whatever\n * payload it set on `dragStart`.\n *\n * The wrapper automatically wires `onDragOver = preventDefault` so\n * drop targets work without extra config. Passing `undefined` leaves\n * the canvas inert.\n */\n onDropNode?: (point: DiagramDropPoint) => void\n /**\n * Comma-separated list of MIME types accepted by the canvas. When the\n * dragged payload doesn't include any of these types, the drop is\n * ignored (the cursor falls back to \"no-drop\"). Defaults to\n * `['application/x-sg-node']` — the convention used by Skygraph\n * palette items. Pass `'*'` (string) or `null` to accept everything.\n */\n dropTypes?: readonly string[] | '*' | null\n}\n\ninterface ViewState {\n zoom: number\n panX: number\n panY: number\n}\n\nfunction defaultRenderNode(node: GraphNode): ReactNode {\n return <span className=\"sg-diagram-node-label\">{node.id}</span>\n}\n\n/**\n * Default corner radius for rounded orthogonal corners. Matches the\n * value React Flow uses (`5px`) which gives a visible smoothing\n * without rounding the path into mush.\n */\nconst ORTHOGONAL_CORNER_RADIUS = 8\n\n/**\n * Visual gap between the arrowhead tip and the node border. ~8 world\n * units matches the typical `border-radius` on shape nodes so arrows\n * never clip the rounded corner, and gives the marker enough breathing\n * room to read as a distinct glyph instead of merging into the node\n * border. Two endpoints in a row × 8 = 16 — well below the smallest\n * sensible node-to-node gap in any realistic layout.\n */\nconst ENDPOINT_PADDING = 8\n\n/**\n * Pure-geometry endpoint resolution — port of React Flow's\n * `getNodeIntersection` (which itself derives from mxGraph's\n * `mxPerimeter.RectanglePerimeter`). The connection point is the\n * intersection between the centre-to-centre segment and the node's\n * bounding rectangle, with a small outward `padding` for the marker.\n *\n * **Anchors from `GraphEdge.from / to` are intentionally ignored at\n * the render layer.** They remain meaningful for the engine\n * (`graph.anchorsOf`, serialization) but the visual layer now follows\n * the floating-edges convention used by every mainstream diagram\n * library (xyflow / mxGraph / draw.io). Dragging a node around the\n * canvas no longer produces the \"wrong-side-of-the-box\" /\n * \"edge cuts through node body\" artifacts the anchor-honouring\n * resolver leaked.\n */\nfunction resolveEdgeEndpoints(\n sourceBox: AABB,\n targetBox: AABB,\n): { source: ResolvedEndpoint; target: ResolvedEndpoint } {\n const source = resolveEdgeEndpoint(sourceBox, targetBox, ENDPOINT_PADDING)\n const target = resolveEdgeEndpoint(targetBox, sourceBox, ENDPOINT_PADDING)\n return { source, target }\n}\n\n/**\n * Mid-point of an edge for hover toolbar placement — keep it close to\n * the rendered path geometry by averaging the two resolved endpoint\n * points (post-padding), so the toolbar tracks the visual centre of\n * the edge as nodes are dragged around.\n */\nfunction edgeMidpoint(\n graph: GraphEngine,\n ep: { from: EdgeEndpoint; to: EdgeEndpoint },\n): Point | null {\n const sb = graph.boundsOf(ep.from.node)\n const tb = graph.boundsOf(ep.to.node)\n if (sb.w === 0 || tb.w === 0) return null\n const { source, target } = resolveEdgeEndpoints(sb, tb)\n return [(source.point[0] + target.point[0]) / 2, (source.point[1] + target.point[1]) / 2]\n}\n\nfunction buildEdgePath(\n edge: GraphEdge,\n source: ResolvedEndpoint,\n target: ResolvedEndpoint,\n obstacles: readonly AABB[] | undefined,\n sourceBounds: AABB | undefined,\n targetBounds: AABB | undefined,\n routerOpts: DiagramProps['routingOptions'],\n): string {\n const start = source.point\n const end = target.point\n switch (edge.routing) {\n case 'orthogonal': {\n const points = routeOrthogonal(start, end, {\n obstacles,\n gridSize: routerOpts?.gridSize,\n inflate: routerOpts?.inflate,\n maxNodes: routerOpts?.maxNodes,\n sourceBounds,\n targetBounds,\n stepPosition: routerOpts?.stepPosition,\n stubLength: routerOpts?.stubLength,\n })\n return pointsToRoundedPath(points, routerOpts?.cornerRadius ?? ORTHOGONAL_CORNER_RADIUS)\n }\n case 'bezier': {\n return getBezierPath({\n source: start,\n sourceSide: source.side,\n target: end,\n targetSide: target.side,\n curvature: routerOpts?.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\nfunction unionBounds(boxes: AABB[]): AABB {\n if (boxes.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 boxes) {\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 HOVER_SHOW_DELAY_MS = 200\nconst HOVER_HIDE_GRACE_MS = 150\n\n/**\n * Reactive diagram view: DOM nodes for shapes + an SVG overlay for edges.\n *\n * Capabilities:\n * - Straight / orthogonal / manual edge routing (with optional A*\n * obstacle-aware routing via `routeAroundNodes`)\n * - Drag-and-drop with optional snap-to-grid; multi-drag when the\n * dragged node is part of the current selection\n * - Mouse-wheel zoom (`Ctrl+wheel`) and pan (plain wheel /\n * middle-button drag)\n * - Selection management: single / multi (Ctrl+click) / lasso\n * (rubber-band on empty canvas)\n * - Hover mini-toolbars (`nodeActions` / `edgeActions`) and right-click\n * callbacks (`onNodeContextMenu` / `onEdgeContextMenu` /\n * `onCanvasContextMenu`) for custom context menus\n */\nfunction DiagramInner(\n {\n graph,\n state,\n width = '100%',\n height = 400,\n renderNode = defaultRenderNode,\n className,\n style,\n unstyled = false,\n draggable = false,\n zoomable = false,\n panable = false,\n snapToGrid,\n routeAroundNodes = false,\n routingOptions,\n printable,\n onNodeContextMenu,\n onEdgeContextMenu,\n onCanvasContextMenu,\n nodeActions,\n edgeActions,\n selection,\n defaultSelection,\n onSelectionChange,\n selectionMode = 'single',\n onDropNode,\n dropTypes,\n edgeArrows = true,\n }: DiagramProps,\n forwardedRef: ForwardedRef<DiagramRef>,\n) {\n const nodes = useMemo(() => Array.from(state.nodes.values()), [state])\n const edges = useMemo(() => Array.from(state.edges.values()), [state])\n\n const allBounds = useMemo(() => nodes.map((n) => graph.boundsOf(n.id)), [nodes, graph])\n const canvasBounds = useMemo(() => unionBounds(allBounds), [allBounds])\n\n // Pre-index node bounds by id so each edge's obstacle list (which excludes\n // its own endpoint nodes) can be assembled in O(N) rather than O(N²).\n const boundsById = useMemo(() => {\n const m = new Map<NodeId, AABB>()\n nodes.forEach((n, i) => m.set(n.id, allBounds[i]!))\n return m\n }, [nodes, allBounds])\n\n const [view, setView] = useState<ViewState>({ zoom: 1, panX: 0, panY: 0 })\n\n const wrapperRef = useRef<HTMLDivElement>(null)\n\n // ─── Selection (controlled / uncontrolled) ────────────────────────────────\n const isSelectionControlled = selection !== undefined\n const [internalSelection, setInternalSelection] = useState<readonly NodeId[]>(\n () => defaultSelection ?? [],\n )\n const currentSelection = isSelectionControlled\n ? (selection as readonly NodeId[])\n : internalSelection\n const selectionSet = useMemo(() => new Set(currentSelection), [currentSelection])\n\n const onSelectionChangeRef = useRef(onSelectionChange)\n useEffect(() => {\n onSelectionChangeRef.current = onSelectionChange\n }, [onSelectionChange])\n\n const commitSelection = useCallback(\n (next: readonly NodeId[]) => {\n if (selectionsEqual(currentSelection, next)) return\n const arr = Array.isArray(next) ? (next as NodeId[]) : Array.from(next)\n if (!isSelectionControlled) setInternalSelection(arr)\n onSelectionChangeRef.current?.(arr)\n },\n [currentSelection, isSelectionControlled],\n )\n\n // Drop dropped/removed ids from the internal selection so it never holds\n // stale references after `removeNode`.\n useEffect(() => {\n if (isSelectionControlled) return\n const filtered = internalSelection.filter((id) => state.nodes.has(id))\n if (filtered.length !== internalSelection.length) {\n setInternalSelection(filtered)\n onSelectionChangeRef.current?.(filtered as NodeId[])\n }\n }, [isSelectionControlled, internalSelection, state])\n\n // ─── Print plumbing ───────────────────────────────────────────────────────\n const printOptionsFromProp = useMemo(() => {\n if (typeof printable === 'object' && printable !== null) {\n return { fileName: printable.fileName }\n }\n return {}\n }, [printable])\n\n const doPrint = useCallback(\n (opts?: PrintOptions) => {\n printElement(wrapperRef.current, { ...printOptionsFromProp, ...(opts ?? {}) })\n },\n [printOptionsFromProp],\n )\n\n useImperativeHandle(forwardedRef, () => ({ print: doPrint }), [doPrint])\n\n const wrapperClass = unstyled\n ? className\n : ['sg-diagram', snapToGrid ? 'sg-diagram-grid' : '', className].filter(Boolean).join(' ')\n\n const wrapperStyle: CSSProperties = {\n position: 'relative',\n width,\n height,\n overflow: 'hidden',\n // CSS variables consumed by `.sg-diagram-grid` so the visual grid\n // matches the snap step and follows the current pan / zoom.\n ...(snapToGrid\n ? ({\n '--sg-grid-size': `${snapToGrid * view.zoom}px`,\n backgroundPosition: `${view.panX}px ${view.panY}px`,\n } as CSSProperties)\n : null),\n ...style,\n }\n\n const canvasStyle: CSSProperties = {\n position: 'absolute',\n top: 0,\n left: 0,\n transform: `translate(${view.panX}px, ${view.panY}px) scale(${view.zoom})`,\n transformOrigin: '0 0',\n width: '100%',\n height: '100%',\n }\n\n // ─── Drag state (single + multi) ──────────────────────────────────────────\n //\n // The drag pipeline is built on Pointer Events rather than the older\n // mousedown / window-mousemove dance. The rationale:\n //\n // • Pointer Events unify mouse / touch / pen so the same path\n // handles trackpads, touchscreens, drawing tablets and Mac\n // \"right-click via two-finger tap\" — these all delivered the\n // mouse fallback erratically, which is the \"не у всех работает\"\n // symptom users were hitting on Macs and tablets.\n // • `setPointerCapture` guarantees `pointermove` / `pointerup`\n // keep firing on the original target even if the cursor leaves\n // the wrapper or the user releases over another window.\n // • Browser drag-and-drop (HTML5 DnD) and Pointer Events never\n // conflict on the same element — we already wire `onDragOver` /\n // `onDrop` on the wrapper for palette → canvas drops.\n interface DragSession {\n primaryId: NodeId\n pointerId: number\n target: HTMLElement\n startX: number\n startY: number\n startZoom: number\n /** Per-node initial world position; iterated on every move. */\n members: Array<{ id: NodeId; x0: number; y0: number }>\n moved: boolean\n }\n const dragRef = useRef<DragSession | null>(null)\n const [draggingId, setDraggingId] = useState<NodeId | null>(null)\n\n /** Pointer movement (in CSS pixels) before a click \"counts\" as a drag. */\n const DRAG_THRESHOLD_PX = 0.5\n\n function applyMove(id: NodeId, x: number, y: number) {\n let nx = x\n let ny = y\n if (snapToGrid && snapToGrid > 0) {\n nx = Math.round(nx / snapToGrid) * snapToGrid\n ny = Math.round(ny / snapToGrid) * snapToGrid\n }\n if (typeof draggable === 'function') draggable(id, nx, ny)\n else graph.moveNode(id, nx, ny)\n }\n\n function handleNodePointerDown(id: NodeId) {\n return (e: ReactPointerEvent<HTMLDivElement>) => {\n // Left button only — middle is reserved for pan, right is context menu.\n // Touch / pen always report `button === 0`.\n if (e.button !== 0) return\n\n const node = graph.getNode(id)\n if (!node) return\n\n const multiCapable = selectionMode !== 'single'\n const isCtrl = e.ctrlKey || e.metaKey\n\n if (multiCapable && isCtrl) {\n // Toggle membership — never start a drag on Ctrl+click.\n e.preventDefault()\n e.stopPropagation()\n commitSelection(toggleSelection(currentSelection, id))\n return\n }\n\n // If the node is part of the active selection, drag the whole group;\n // otherwise drag just this one (and, in multi modes, replace the\n // selection with `[id]` so the visual cue tracks the focus).\n if (multiCapable) {\n if (!selectionSet.has(id)) commitSelection([id])\n }\n\n if (!draggable) return\n e.preventDefault()\n e.stopPropagation()\n\n const groupIds =\n multiCapable && selectionSet.has(id) ? Array.from(new Set([id, ...currentSelection])) : [id]\n const members = groupIds\n .map((mid) => {\n const n = 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 const target = e.currentTarget\n // Capture the pointer on the node element so subsequent\n // `pointermove` / `pointerup` keep reaching us even if the user\n // drags fast or releases outside the wrapper. Without capture,\n // touch pointers commonly \"escape\" once the finger leaves the\n // initial element bounds, which is the root cause of the \"drag\n // freezes\" reports on Android/iOS.\n try {\n target.setPointerCapture(e.pointerId)\n } catch {\n // Some browsers throw if the pointer is already released — the\n // session is still valid, we just lose capture; ignore.\n }\n\n dragRef.current = {\n primaryId: id,\n pointerId: e.pointerId,\n target,\n startX: e.clientX,\n startY: e.clientY,\n startZoom: view.zoom,\n members,\n moved: false,\n }\n setDraggingId(id)\n }\n }\n\n function handleNodePointerMove(e: ReactPointerEvent<HTMLDivElement>) {\n const d = dragRef.current\n if (!d || d.pointerId !== e.pointerId) return\n const dx = (e.clientX - d.startX) / d.startZoom\n const dy = (e.clientY - d.startY) / d.startZoom\n if (!d.moved && (Math.abs(dx) > DRAG_THRESHOLD_PX || Math.abs(dy) > DRAG_THRESHOLD_PX)) {\n d.moved = true\n }\n // Group commits into a single transaction so undo restores the whole\n // multi-drag rather than one node at a time.\n if (d.members.length > 1) {\n graph.transaction(() => {\n for (const m of d.members) applyMove(m.id, m.x0 + dx, m.y0 + dy)\n })\n } else {\n const m = d.members[0]!\n applyMove(m.id, m.x0 + dx, m.y0 + dy)\n }\n }\n\n function endDrag(e: ReactPointerEvent<HTMLDivElement>) {\n const d = dragRef.current\n if (!d || d.pointerId !== e.pointerId) return\n try {\n d.target.releasePointerCapture(d.pointerId)\n } catch {\n // Already released — ignore.\n }\n dragRef.current = null\n setDraggingId(null)\n }\n\n // Safety net — if the component unmounts mid-drag, the captured\n // pointer would otherwise linger and the next click on the same\n // element would behave oddly.\n useEffect(() => {\n return () => {\n const d = dragRef.current\n if (d) {\n try {\n d.target.releasePointerCapture(d.pointerId)\n } catch {\n // pointer might already be gone — nothing to do\n }\n dragRef.current = null\n }\n }\n }, [])\n\n // ─── Wheel: zoom (Ctrl) / pan (plain) ────────────────────────────────────\n function handleWheel(e: ReactWheelEvent<HTMLDivElement>) {\n if (!zoomable && !panable) return\n if (zoomable && (e.ctrlKey || e.metaKey)) {\n e.preventDefault()\n const factor = e.deltaY < 0 ? 1.1 : 1 / 1.1\n setView((v) => ({\n ...v,\n zoom: Math.max(0.1, Math.min(10, v.zoom * factor)),\n }))\n return\n }\n if (panable) {\n e.preventDefault()\n setView((v) => ({\n ...v,\n panX: v.panX - e.deltaX,\n panY: v.panY - e.deltaY,\n }))\n }\n }\n\n // ─── Lasso state ──────────────────────────────────────────────────────────\n const [lasso, setLasso] = useState<ScreenRect | null>(null)\n const lassoRef = useRef<{\n startX: number\n startY: number\n initial: readonly NodeId[]\n additive: boolean\n } | null>(null)\n const boundsByIdRef = useRef(boundsById)\n useEffect(() => {\n boundsByIdRef.current = boundsById\n }, [boundsById])\n const viewRef = useRef(view)\n useEffect(() => {\n viewRef.current = view\n }, [view])\n\n // Wrapper-level pointer session (lasso OR middle-button pan). We\n // keep one session at a time — both gestures emit `pointerdown` from\n // the same target so swapping modes is just a discriminator.\n type WrapperSession =\n | { kind: 'lasso'; pointerId: number }\n | { kind: 'pan'; pointerId: number; startX: number; startY: number; panX: number; panY: number }\n const wrapperSessionRef = useRef<WrapperSession | null>(null)\n\n function startLasso(e: ReactPointerEvent<HTMLDivElement>) {\n const rect = wrapperRef.current?.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.setPointerCapture(e.pointerId)\n } catch {\n // ignored — capture is best-effort\n }\n lassoRef.current = {\n startX: sx,\n startY: sy,\n initial: currentSelection,\n additive: e.shiftKey || e.ctrlKey || e.metaKey,\n }\n wrapperSessionRef.current = { kind: 'lasso', pointerId: e.pointerId }\n setLasso({ x: sx, y: sy, w: 0, h: 0 })\n }\n\n function startPan(e: ReactPointerEvent<HTMLDivElement>) {\n e.preventDefault()\n try {\n e.currentTarget.setPointerCapture(e.pointerId)\n } catch {\n // ignored\n }\n wrapperSessionRef.current = {\n kind: 'pan',\n pointerId: e.pointerId,\n startX: e.clientX,\n startY: e.clientY,\n panX: view.panX,\n panY: view.panY,\n }\n }\n\n // ─── Wrapper pointerdown: middle-pan / lasso / clear-selection ────────────\n function handleWrapperPointerDown(e: ReactPointerEvent<HTMLDivElement>) {\n if (panable && e.button === 1) {\n startPan(e)\n return\n }\n\n if (e.button !== 0) return\n\n // Empty-canvas left click — only meaningful when selection management\n // is active. The pointerdown originates on the wrapper / canvas, never\n // on a node (those stop propagation in `handleNodePointerDown`).\n if (selectionMode === 'lasso') {\n startLasso(e)\n return\n }\n if (selectionMode === 'multi' && currentSelection.length > 0) {\n // Shift / Ctrl preserve the current selection; plain click clears.\n if (!(e.shiftKey || e.ctrlKey || e.metaKey)) commitSelection([])\n }\n }\n\n function handleWrapperPointerMove(e: ReactPointerEvent<HTMLDivElement>) {\n const s = wrapperSessionRef.current\n if (!s || s.pointerId !== e.pointerId) return\n if (s.kind === 'pan') {\n const dx = e.clientX - s.startX\n const dy = e.clientY - s.startY\n setView((v) => ({ ...v, panX: s.panX + dx, panY: s.panY + dy }))\n return\n }\n // lasso\n const r = wrapperRef.current?.getBoundingClientRect()\n const l = lassoRef.current\n if (!r || !l) return\n const cx = e.clientX - r.left\n const cy = e.clientY - r.top\n const screen = rectFromCorners(l.startX, l.startY, cx, cy)\n setLasso(screen)\n const world = screenRectToWorld(screen, viewRef.current)\n const hits = nodesInBox(boundsByIdRef.current, world)\n const next = l.additive ? Array.from(new Set([...l.initial, ...hits])) : hits\n commitSelection(next)\n }\n\n function handleWrapperPointerUp(e: ReactPointerEvent<HTMLDivElement>) {\n const s = wrapperSessionRef.current\n if (!s || s.pointerId !== e.pointerId) return\n try {\n e.currentTarget.releasePointerCapture(s.pointerId)\n } catch {\n // ignored\n }\n wrapperSessionRef.current = null\n if (s.kind === 'lasso') {\n lassoRef.current = null\n setLasso(null)\n }\n }\n\n // ─── HTML5 drag-and-drop (palette → canvas) ───────────────────────────────\n // The wrapper accepts drops by default — see `onDropNode` / `dropTypes`.\n // `dragover` MUST `preventDefault` for the browser to fire `drop` and\n // for the cursor to switch out of \"no-drop\".\n const acceptedTypes = useMemo<readonly string[] | null>(() => {\n if (dropTypes === '*' || dropTypes === null) return null\n if (dropTypes === undefined) return ['application/x-sg-node']\n return dropTypes\n }, [dropTypes])\n\n const dropEnabled = !!onDropNode\n\n function dragHasAcceptedType(e: ReactDragEvent<HTMLDivElement>): boolean {\n if (!acceptedTypes) return true\n const types = e.dataTransfer?.types\n if (!types || types.length === 0) return false\n for (const t of acceptedTypes) {\n // `types` is a DOMStringList in some browsers; `includes` works on the proxy too.\n for (let i = 0; i < types.length; i++) {\n if (types[i] === t) return true\n }\n }\n return false\n }\n\n function handleDragOver(e: ReactDragEvent<HTMLDivElement>) {\n if (!dropEnabled) return\n if (!dragHasAcceptedType(e)) return\n e.preventDefault()\n if (e.dataTransfer) e.dataTransfer.dropEffect = 'copy'\n }\n\n function handleDrop(e: ReactDragEvent<HTMLDivElement>) {\n if (!onDropNode) return\n if (!dragHasAcceptedType(e)) return\n e.preventDefault()\n const rect = wrapperRef.current?.getBoundingClientRect()\n if (!rect) return\n const sx = e.clientX - rect.left\n const sy = e.clientY - rect.top\n const wx = (sx - view.panX) / (view.zoom || 1)\n const wy = (sy - view.panY) / (view.zoom || 1)\n onDropNode({\n x: wx,\n y: wy,\n screenX: e.clientX,\n screenY: e.clientY,\n dataTransfer: e.dataTransfer,\n })\n }\n\n // ─── Context menu plumbing ────────────────────────────────────────────────\n function handleWrapperContextMenu(e: ReactMouseEvent<HTMLDivElement>) {\n if (!onCanvasContextMenu) return\n const rect = wrapperRef.current?.getBoundingClientRect()\n if (!rect) return\n const sx = e.clientX - rect.left\n const sy = e.clientY - rect.top\n const wx = (sx - view.panX) / (view.zoom || 1)\n const wy = (sy - view.panY) / (view.zoom || 1)\n e.preventDefault()\n onCanvasContextMenu(e, { x: wx, y: wy, screenX: e.clientX, screenY: e.clientY })\n }\n\n function handleNodeContextMenu(node: GraphNode) {\n return (e: ReactMouseEvent<HTMLDivElement>) => {\n // Always stop propagation so the wrapper-level handler doesn't also\n // fire and treat the node as if it were the canvas. We only suppress\n // the native menu when a per-node callback is registered.\n e.stopPropagation()\n if (!onNodeContextMenu) return\n e.preventDefault()\n onNodeContextMenu(e, node)\n }\n }\n\n function handleEdgeContextMenu(edge: GraphEdge) {\n return (e: ReactMouseEvent<SVGPathElement>) => {\n e.stopPropagation()\n if (!onEdgeContextMenu) return\n e.preventDefault()\n onEdgeContextMenu(e, edge)\n }\n }\n\n // ─── Hover overlays (nodes / edges) ───────────────────────────────────────\n const [hoveredNode, setHoveredNode] = useState<NodeId | null>(null)\n const [hoveredEdge, setHoveredEdge] = useState<string | null>(null)\n const nodeHoverShowTimer = useRef<number | null>(null)\n const nodeHoverHideTimer = useRef<number | null>(null)\n const edgeHoverShowTimer = useRef<number | null>(null)\n const edgeHoverHideTimer = useRef<number | null>(null)\n\n const clearTimer = (ref: React.MutableRefObject<number | null>) => {\n if (ref.current != null) {\n window.clearTimeout(ref.current)\n ref.current = null\n }\n }\n\n useEffect(() => {\n return () => {\n clearTimer(nodeHoverShowTimer)\n clearTimer(nodeHoverHideTimer)\n clearTimer(edgeHoverShowTimer)\n clearTimer(edgeHoverHideTimer)\n }\n }, [])\n\n const showNodeHover = (id: NodeId) => {\n clearTimer(nodeHoverHideTimer)\n if (hoveredNode === id) return\n clearTimer(nodeHoverShowTimer)\n nodeHoverShowTimer.current = window.setTimeout(() => {\n setHoveredNode(id)\n nodeHoverShowTimer.current = null\n }, HOVER_SHOW_DELAY_MS)\n }\n\n const hideNodeHover = () => {\n clearTimer(nodeHoverShowTimer)\n clearTimer(nodeHoverHideTimer)\n nodeHoverHideTimer.current = window.setTimeout(() => {\n setHoveredNode(null)\n nodeHoverHideTimer.current = null\n }, HOVER_HIDE_GRACE_MS)\n }\n\n const showEdgeHover = (id: string) => {\n clearTimer(edgeHoverHideTimer)\n if (hoveredEdge === id) return\n clearTimer(edgeHoverShowTimer)\n edgeHoverShowTimer.current = window.setTimeout(() => {\n setHoveredEdge(id)\n edgeHoverShowTimer.current = null\n }, HOVER_SHOW_DELAY_MS)\n }\n\n const hideEdgeHover = () => {\n clearTimer(edgeHoverShowTimer)\n clearTimer(edgeHoverHideTimer)\n edgeHoverHideTimer.current = window.setTimeout(() => {\n setHoveredEdge(null)\n edgeHoverHideTimer.current = null\n }, HOVER_HIDE_GRACE_MS)\n }\n\n // ─── Render — nodes / edges / overlays ────────────────────────────────────\n const hasNodeActions = !!nodeActions && nodeActions.length > 0\n const hasEdgeActions = !!edgeActions && edgeActions.length > 0\n const edgesInteractive = !!onEdgeContextMenu || hasEdgeActions\n\n const hoveredNodeRecord = hoveredNode != null ? (state.nodes.get(hoveredNode) ?? null) : null\n const hoveredNodeBounds = hoveredNode != null ? (boundsById.get(hoveredNode) ?? null) : null\n\n const hoveredEdgeRecord = hoveredEdge != null ? (state.edges.get(hoveredEdge) ?? null) : null\n const hoveredEdgeMid = useMemo(() => {\n if (!hoveredEdgeRecord) return null\n const mid = edgeMidpoint(graph, hoveredEdgeRecord)\n if (!mid) return null\n return { x: mid[0], y: mid[1] }\n }, [graph, hoveredEdgeRecord])\n\n return (\n <div\n ref={wrapperRef}\n className={wrapperClass}\n style={wrapperStyle}\n onWheel={zoomable || panable ? handleWheel : undefined}\n onPointerDown={\n panable || selectionMode === 'lasso' || selectionMode === 'multi'\n ? handleWrapperPointerDown\n : undefined\n }\n onPointerMove={panable || selectionMode === 'lasso' ? handleWrapperPointerMove : undefined}\n onPointerUp={panable || selectionMode === 'lasso' ? handleWrapperPointerUp : undefined}\n onPointerCancel={panable || selectionMode === 'lasso' ? handleWrapperPointerUp : undefined}\n onLostPointerCapture={\n panable || selectionMode === 'lasso' ? handleWrapperPointerUp : undefined\n }\n onContextMenu={onCanvasContextMenu ? handleWrapperContextMenu : undefined}\n onDragOver={dropEnabled ? handleDragOver : undefined}\n onDrop={dropEnabled ? handleDrop : undefined}\n data-selection-mode={selectionMode}\n data-sg-drop={dropEnabled ? 'true' : undefined}\n >\n <div\n className={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 >\n <svg\n className={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 // The SVG layer never grabs pointer events itself — only\n // its child `path[data-edge-hit]` elements opt in via\n // `pointer-events: stroke` so nodes underneath stay\n // interactive across edge gaps.\n pointerEvents: 'none',\n }}\n aria-hidden=\"true\"\n >\n {/*\n * Marker defs — open-V arrowhead designed in `strokeWidth`\n * units so the arrow always reads as a natural extension of\n * the path stroke (instead of looking like a glued-on\n * triangle). The shape is two strokes that meet at `(0, 0)`,\n * which is also the marker's `refX`/`refY` anchor — that\n * means the marker tip touches the path's endpoint exactly,\n * so the routing layer can leave a clean `ENDPOINT_PADDING`\n * gap between the path and the node border and the arrow\n * lands inside that gap.\n *\n * `markerUnits=\"strokeWidth\"` is the key knob: it scales the\n * arrow with the stroke, so hover (which thickens the line)\n * also enlarges the arrowhead — visual cue-stack matching\n * React Flow, draw.io and Lucidchart.\n *\n * `context-stroke` makes the arrow inherit the line's\n * colour. The CSS fallback (`fill: currentColor`) keeps\n * Firefox and older Safari rendering the right colour.\n */}\n {edgeArrows && (\n <defs>\n <marker\n id=\"sg-diagram-arrow\"\n viewBox=\"-10 -10 20 20\"\n refX=\"0\"\n refY=\"0\"\n markerWidth=\"12\"\n markerHeight=\"12\"\n orient=\"auto-start-reverse\"\n markerUnits=\"strokeWidth\"\n >\n <path\n d=\"M -7 -5 L 0 0 L -7 5\"\n fill=\"none\"\n stroke=\"context-stroke\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"sg-diagram-arrow-fill\"\n />\n </marker>\n </defs>\n )}\n {edges.map((edge) =>\n renderEdge(\n edge,\n boundsById,\n routeAroundNodes,\n routingOptions,\n edgesInteractive,\n edgeArrows,\n edgesInteractive ? handleEdgeContextMenu(edge) : undefined,\n hasEdgeActions ? () => showEdgeHover(String(edge.id)) : undefined,\n hasEdgeActions ? () => hideEdgeHover() : undefined,\n ),\n )}\n </svg>\n {nodes.map((node) => {\n const bounds = graph.boundsOf(node.id)\n const isSelected = selectionSet.has(node.id)\n const isDragging = draggingId === node.id\n const nodeClass = unstyled\n ? undefined\n : [\n 'sg-diagram-node',\n `sg-diagram-node-${node.outline.kind}`,\n draggable ? 'sg-diagram-node-draggable' : '',\n isSelected ? 'sg-diagram-node-selected' : '',\n ]\n .filter(Boolean)\n .join(' ')\n return (\n <div\n key={node.id}\n data-node-id={node.id}\n data-selected={isSelected ? 'true' : undefined}\n data-sg-dragging={isDragging ? 'true' : undefined}\n className={nodeClass}\n style={{\n position: 'absolute',\n left: bounds.x,\n top: bounds.y,\n width: bounds.w,\n height: bounds.h,\n cursor: draggable ? (isDragging ? 'grabbing' : 'grab') : undefined,\n userSelect: draggable ? 'none' : undefined,\n }}\n onPointerDown={\n draggable || selectionMode !== 'single' ? handleNodePointerDown(node.id) : undefined\n }\n onPointerMove={draggable ? handleNodePointerMove : undefined}\n onPointerUp={draggable ? endDrag : undefined}\n onPointerCancel={draggable ? endDrag : undefined}\n onLostPointerCapture={draggable ? endDrag : undefined}\n onContextMenu={onNodeContextMenu ? handleNodeContextMenu(node) : undefined}\n onMouseEnter={hasNodeActions ? () => showNodeHover(node.id) : undefined}\n onMouseLeave={hasNodeActions ? () => hideNodeHover() : undefined}\n >\n {renderNode(node)}\n </div>\n )\n })}\n </div>\n\n {/* Hover overlays — live in the wrapper (screen-space), so size /\n font don't track zoom. */}\n {hasNodeActions && hoveredNodeRecord && hoveredNodeBounds && (\n <NodeHoverActions\n node={hoveredNodeRecord}\n actions={nodeActions!}\n screenX={view.panX + hoveredNodeBounds.x * view.zoom}\n screenY={view.panY + hoveredNodeBounds.y * view.zoom}\n width={hoveredNodeBounds.w * view.zoom}\n unstyled={unstyled}\n onPointerEnter={() => showNodeHover(hoveredNodeRecord.id)}\n onPointerLeave={() => hideNodeHover()}\n />\n )}\n\n {hasEdgeActions && hoveredEdgeRecord && hoveredEdgeMid && (\n <EdgeHoverActions\n edge={hoveredEdgeRecord}\n actions={edgeActions!}\n screenX={view.panX + hoveredEdgeMid.x * view.zoom}\n screenY={view.panY + hoveredEdgeMid.y * view.zoom}\n unstyled={unstyled}\n onPointerEnter={() => showEdgeHover(String(hoveredEdgeRecord.id))}\n onPointerLeave={() => hideEdgeHover()}\n />\n )}\n\n {/* Lasso rubber band (only while dragging on empty canvas). */}\n {lasso && (\n <div\n className={unstyled ? undefined : 'sg-diagram-lasso'}\n style={{\n position: 'absolute',\n left: lasso.x,\n top: lasso.y,\n width: lasso.w,\n height: lasso.h,\n pointerEvents: 'none',\n }}\n />\n )}\n </div>\n )\n}\n\nfunction renderEdge(\n edge: GraphEdge,\n boundsById: ReadonlyMap<NodeId, AABB>,\n routeAroundNodes: boolean,\n routerOpts: DiagramProps['routingOptions'],\n interactive: boolean,\n arrows: boolean,\n onContextMenu: ((e: ReactMouseEvent<SVGPathElement>) => void) | undefined,\n onMouseEnter: (() => void) | undefined,\n onMouseLeave: (() => void) | undefined,\n): ReactNode {\n const sBox = boundsById.get(edge.from.node)\n const tBox = boundsById.get(edge.to.node)\n if (!sBox || !tBox) return null\n\n // Pure-geometry floating endpoints — see `resolveEdgeEndpoint` in\n // `@skygraph/core`. Source/target each get the same outward padding\n // so the arrowhead sits in a symmetric visual gap and the line never\n // overlaps the node border.\n const { source, target } = resolveEdgeEndpoints(sBox, tBox)\n\n // Build the obstacle list (every node except this edge's two endpoints).\n // We only do this for `orthogonal` routing AND only when `routeAroundNodes`\n // is on — straight/manual ignore it.\n let obstacles: AABB[] | undefined\n if (routeAroundNodes && edge.routing === 'orthogonal') {\n const skip = new Set<NodeId>([edge.from.node, edge.to.node])\n obstacles = []\n for (const [id, bb] of boundsById) {\n if (!skip.has(id)) obstacles.push(bb)\n }\n }\n\n // No bounds are passed to the orthogonal router any more: the\n // resolver already placed the endpoints OUTSIDE the boxes\n // (padded by ENDPOINT_PADDING), so the router shouldn't re-derive\n // \"exit through nearest side\" — doing so on top of an already-\n // outside-the-box point produced visible loops around the source\n // node (visible on the OrthogonalRouting demo in v1).\n const d = buildEdgePath(edge, source, target, obstacles, undefined, undefined, routerOpts)\n\n const markerEnd = arrows ? 'url(#sg-diagram-arrow)' : undefined\n\n if (!interactive) {\n return (\n <path\n key={edge.id}\n d={d}\n className={`sg-diagram-edge sg-diagram-edge-${edge.routing}`}\n fill=\"none\"\n markerEnd={markerEnd}\n data-edge-id={edge.id}\n data-obstacle-count={obstacles ? obstacles.length : 0}\n />\n )\n }\n\n return (\n <g key={edge.id} data-edge-id={edge.id}>\n {/* Wide invisible underlay for easier hit-testing on the thin edge. */}\n <path\n d={d}\n className=\"sg-diagram-edge-hit\"\n fill=\"none\"\n stroke=\"transparent\"\n strokeWidth={16}\n data-edge-hit=\"true\"\n style={{ pointerEvents: 'stroke', cursor: onContextMenu ? 'context-menu' : undefined }}\n onContextMenu={onContextMenu}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n />\n <path\n d={d}\n className={`sg-diagram-edge sg-diagram-edge-${edge.routing}`}\n fill=\"none\"\n markerEnd={markerEnd}\n data-edge-id={edge.id}\n data-obstacle-count={obstacles ? obstacles.length : 0}\n style={{ pointerEvents: 'none' }}\n />\n </g>\n )\n}\n\n/**\n * Reactive diagram view (forwardRef-обёртка над `DiagramInner`). Обновлять\n * данные нужно через `graph` / `state`; для печати — `ref.print()`.\n */\nexport const Diagram = forwardRef<DiagramRef, DiagramProps>(DiagramInner)\nDiagram.displayName = 'Diagram'\n\nexport type { NodeAction, EdgeAction } from './HoverActions'\n","import type { CSSProperties, MouseEvent as ReactMouseEvent, ReactNode } from 'react'\nimport type { GraphEdge, GraphNode } from '@skygraph/core'\n\n/**\n * Mini-toolbar entry rendered above a hovered `GraphNode` (from\n * `@skygraph/core`). The `onClick` receives the original node so handlers\n * can run engine mutations (e.g. `graph.removeNode(node.id)`) without\n * re-resolving by id.\n */\nexport interface NodeAction {\n /** Stable key — also the value reflected in `data-action-id`. */\n id: string\n /** Custom React content (icon / SVG); falls back to `label`. */\n icon?: ReactNode\n /** Label rendered next to / instead of the icon, also used as `aria-label`. */\n label?: string\n /** Click handler. */\n onClick: (node: GraphNode, event: ReactMouseEvent<HTMLButtonElement>) => void\n /**\n * Optional predicate hiding the action for some nodes. Re-evaluated on\n * every render so it can react to per-node `data` changes.\n */\n hidden?: (node: GraphNode) => boolean\n}\n\n/** Same shape as `NodeAction`, but rendered above a hovered edge. */\nexport interface EdgeAction {\n id: string\n icon?: ReactNode\n label?: string\n onClick: (edge: GraphEdge, event: ReactMouseEvent<HTMLButtonElement>) => void\n hidden?: (edge: GraphEdge) => boolean\n}\n\ninterface NodeHoverActionsProps {\n node: GraphNode\n actions: readonly NodeAction[]\n /** Top-left of the hover anchor in *wrapper* (screen) coords, in px. */\n screenX: number\n screenY: number\n /** Width of the hovered node bbox in screen px (used to centre / clamp). */\n width: number\n unstyled?: boolean\n onPointerEnter?: () => void\n onPointerLeave?: () => void\n}\n\n/**\n * Floating mini-panel rendered above a hovered node. Lives in the wrapper\n * coordinate space (NOT inside the zoomed canvas) so its size stays\n * constant regardless of the diagram's zoom level.\n */\nexport function NodeHoverActions({\n node,\n actions,\n screenX,\n screenY,\n width,\n unstyled,\n onPointerEnter,\n onPointerLeave,\n}: NodeHoverActionsProps) {\n const visible = actions.filter((a) => !a.hidden?.(node))\n if (visible.length === 0) return null\n\n const style: CSSProperties = {\n position: 'absolute',\n left: screenX + width / 2,\n top: screenY,\n transform: 'translate(-50%, calc(-100% - 8px))',\n pointerEvents: 'auto',\n zIndex: 5,\n }\n\n return (\n <div\n className={unstyled ? undefined : 'sg-diagram-hover-actions'}\n data-node-id={String(node.id)}\n style={style}\n onMouseEnter={onPointerEnter}\n onMouseLeave={onPointerLeave}\n >\n {visible.map((action) => (\n <button\n key={action.id}\n type=\"button\"\n data-action-id={action.id}\n className={unstyled ? undefined : 'sg-diagram-hover-action'}\n aria-label={action.label ?? action.id}\n title={action.label}\n onMouseDown={(ev) => ev.stopPropagation()}\n onClick={(ev) => {\n ev.stopPropagation()\n action.onClick(node, ev)\n }}\n >\n {action.icon ?? action.label ?? action.id}\n </button>\n ))}\n </div>\n )\n}\n\ninterface EdgeHoverActionsProps {\n edge: GraphEdge\n actions: readonly EdgeAction[]\n /** Mid-point of the edge in screen coords. */\n screenX: number\n screenY: number\n unstyled?: boolean\n onPointerEnter?: () => void\n onPointerLeave?: () => void\n}\n\n/** Floating mini-panel rendered next to a hovered edge mid-point. */\nexport function EdgeHoverActions({\n edge,\n actions,\n screenX,\n screenY,\n unstyled,\n onPointerEnter,\n onPointerLeave,\n}: EdgeHoverActionsProps) {\n const visible = actions.filter((a) => !a.hidden?.(edge))\n if (visible.length === 0) return null\n\n const style: CSSProperties = {\n position: 'absolute',\n left: screenX,\n top: screenY,\n transform: 'translate(-50%, -50%)',\n pointerEvents: 'auto',\n zIndex: 5,\n }\n\n return (\n <div\n className={unstyled ? undefined : 'sg-diagram-hover-actions'}\n data-edge-id={String(edge.id)}\n style={style}\n onMouseEnter={onPointerEnter}\n onMouseLeave={onPointerLeave}\n >\n {visible.map((action) => (\n <button\n key={action.id}\n type=\"button\"\n data-action-id={action.id}\n className={unstyled ? undefined : 'sg-diagram-hover-action'}\n aria-label={action.label ?? action.id}\n title={action.label}\n onMouseDown={(ev) => ev.stopPropagation()}\n onClick={(ev) => {\n ev.stopPropagation()\n action.onClick(edge, ev)\n }}\n >\n {action.icon ?? action.label ?? action.id}\n </button>\n ))}\n </div>\n )\n}\n","import type { AABB, NodeId } from '@skygraph/core'\r\n\r\n/**\r\n * Internal helpers for {@link Diagram} selection / lasso. Pure functions —\r\n * no React, no DOM. Easy to unit-test and reuse from custom drag handlers.\r\n */\r\n\r\n/** Axis-aligned rectangle in *screen* pixels (lasso uses these). */\r\nexport interface ScreenRect {\r\n x: number\r\n y: number\r\n w: number\r\n h: number\r\n}\r\n\r\n/**\r\n * Convert a {x0, y0, x1, y1} pair captured during a lasso drag into a\r\n * normalised positive-extent rectangle.\r\n */\r\nexport function rectFromCorners(\r\n x0: number,\r\n y0: number,\r\n x1: number,\r\n y1: number,\r\n): ScreenRect {\r\n const x = Math.min(x0, x1)\r\n const y = Math.min(y0, y1)\r\n return { x, y, w: Math.abs(x1 - x0), h: Math.abs(y1 - y0) }\r\n}\r\n\r\n/** Project a screen-space rectangle into world-space using the current view. */\r\nexport function screenRectToWorld(\r\n rect: ScreenRect,\r\n view: { panX: number; panY: number; zoom: number },\r\n): ScreenRect {\r\n const z = view.zoom || 1\r\n return {\r\n x: (rect.x - view.panX) / z,\r\n y: (rect.y - view.panY) / z,\r\n w: rect.w / z,\r\n h: rect.h / z,\r\n }\r\n}\r\n\r\n/** AABB / AABB intersection test (closed intervals). */\r\nexport function aabbsIntersect(a: AABB, b: AABB): boolean {\r\n if (a.x + a.w < b.x) return false\r\n if (b.x + b.w < a.x) return false\r\n if (a.y + a.h < b.y) return false\r\n if (b.y + b.h < a.y) return false\r\n return true\r\n}\r\n\r\n/**\r\n * Pick every entry of `boundsById` whose AABB intersects `world`.\r\n * Stable ordering — caller doesn't have to sort.\r\n */\r\nexport function nodesInBox(\r\n boundsById: ReadonlyMap<NodeId, AABB>,\r\n world: ScreenRect,\r\n): NodeId[] {\r\n const out: NodeId[] = []\r\n for (const [id, bb] of boundsById) {\r\n if (aabbsIntersect(bb, world)) out.push(id)\r\n }\r\n return out\r\n}\r\n\r\n/** Toggle membership of `id` in `selection` (immutable). */\r\nexport function toggleSelection(selection: readonly NodeId[], id: NodeId): NodeId[] {\r\n const idx = selection.indexOf(id)\r\n if (idx === -1) return [...selection, id]\r\n const next = selection.slice()\r\n next.splice(idx, 1)\r\n return next\r\n}\r\n\r\n/** Compare two selection arrays as multisets. */\r\nexport function selectionsEqual(a: readonly NodeId[], b: readonly NodeId[]): boolean {\r\n if (a === b) return true\r\n if (a.length !== b.length) return false\r\n const sa = new Set(a)\r\n for (const id of b) if (!sa.has(id)) return false\r\n return true\r\n}\r\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type MouseEvent as ReactMouseEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n} from 'react'\nimport type {\n DashboardCommonProps,\n DashboardWidget,\n DashboardWidgetContextMenuHandler,\n WidgetAction,\n} from './types'\nimport { useConfig } from '../../ConfigProvider'\n\nexport type {\n DashboardCommonProps,\n DashboardContextMenuHandler,\n DashboardWidget,\n DashboardWidgetContextMenuHandler,\n WidgetAction,\n} from './types'\n\nexport interface DashboardProps extends DashboardCommonProps {\n /** Widgets pinned to grid cells. */\n widgets: readonly DashboardWidget[]\n /** Total grid columns. @default 12 */\n columns?: number\n /** Row height in pixels (uniform). @default 80 */\n rowHeight?: number\n /** Gap between cells in pixels. @default 16 */\n gap?: number\n /** Drop default `sg-dashboard-*` classes. */\n unstyled?: boolean\n /** Root wrapper className. */\n className?: string\n /** Root wrapper inline style. */\n style?: CSSProperties\n}\n\n/**\n * Minimal static-layout dashboard.\n * - CSS Grid with `columns` columns and a uniform `rowHeight`.\n * - Each widget pins to its `(x, y, w, h)` cell range.\n * - Optional per-widget `actions` menu (`⋯` button on hover).\n * - Optional `onWidgetContextMenu` / `onDashboardContextMenu` callbacks\n * follow the same convention as `Diagram`: `preventDefault()` is\n * only called when the consumer passed a handler.\n *\n * Drag / resize / auto-pack live in `DashboardEditor`, not here.\n */\nexport function Dashboard({\n widgets,\n columns = 12,\n rowHeight = 80,\n gap = 16,\n unstyled = false,\n className,\n style,\n onWidgetContextMenu,\n onDashboardContextMenu,\n}: DashboardProps) {\n const dashboardLocale = useConfig().locale?.dashboard\n const [maximizedId, setMaximizedId] = useState<string | null>(null)\n\n const wrapperClass = unstyled ? className : ['sg-dashboard', className].filter(Boolean).join(' ')\n\n const gridStyle: CSSProperties = {\n display: 'grid',\n gridTemplateColumns: `repeat(${columns}, 1fr)`,\n gridAutoRows: `${rowHeight}px`,\n gap,\n ...style,\n }\n\n const handleRootContextMenu = (e: ReactMouseEvent<HTMLDivElement>) => {\n if (!onDashboardContextMenu) return\n if (e.target !== e.currentTarget) return\n e.preventDefault()\n onDashboardContextMenu(e)\n }\n\n return (\n <div\n className={wrapperClass}\n style={gridStyle}\n role=\"region\"\n aria-label={dashboardLocale?.ariaLabel ?? 'Dashboard'}\n onContextMenu={onDashboardContextMenu ? handleRootContextMenu : undefined}\n >\n {widgets.map((w) => (\n <DashboardWidgetView\n key={w.id}\n widget={w}\n unstyled={unstyled}\n isMaximized={maximizedId === w.id}\n totalColumns={columns}\n onWidgetContextMenu={onWidgetContextMenu}\n onToggleMaximize={() => setMaximizedId((cur) => (cur === w.id ? null : w.id))}\n />\n ))}\n </div>\n )\n}\n\n// ─── Internal widget view (also reused by DashboardEditor) ──────────────────\n\n/**\n * Editor-only hooks plumbed into the shared widget view. Kept opaque\n * outside the package — `DashboardEditor` constructs this object;\n * `Dashboard` never does.\n */\nexport interface DashboardWidgetEditorBindings {\n editable: boolean\n showResizeHandle: boolean\n onPointerDownDragHandle?: (e: ReactPointerEvent<HTMLElement>, widget: DashboardWidget) => void\n onPointerDownResizeHandle?: (e: ReactPointerEvent<HTMLElement>, widget: DashboardWidget) => void\n}\n\nexport interface DashboardWidgetViewProps {\n widget: DashboardWidget\n unstyled: boolean\n isMaximized: boolean\n totalColumns: number\n onWidgetContextMenu?: DashboardWidgetContextMenuHandler\n onToggleMaximize: () => void\n /** When set, render drag/resize hooks (used by `DashboardEditor`). */\n editor?: DashboardWidgetEditorBindings\n /**\n * Default actions injected by the parent when the widget itself\n * doesn't declare any. Currently only used by `DashboardEditor`.\n */\n defaultActions?: readonly WidgetAction[]\n}\n\n/**\n * Internal: renders a single widget cell. Owns the per-widget hover /\n * action-menu state so a hover on widget A doesn't re-render widget B.\n *\n * `Dashboard` and `DashboardEditor` both consume this view — the editor\n * passes `editor` bindings to enable drag and resize.\n */\nexport function DashboardWidgetView({\n widget,\n unstyled,\n isMaximized,\n totalColumns,\n onWidgetContextMenu,\n onToggleMaximize,\n editor,\n defaultActions,\n}: DashboardWidgetViewProps) {\n const dashboardLocale = useConfig().locale?.dashboard\n const [hovered, setHovered] = useState(false)\n const [menuOpen, setMenuOpen] = useState(false)\n\n const widgetClass = unstyled\n ? widget.className\n : ['sg-dashboard-widget', widget.className].filter(Boolean).join(' ')\n\n const widgetStyle: CSSProperties = isMaximized\n ? {\n gridColumn: `1 / span ${totalColumns}`,\n gridRow: `1 / span 6`,\n position: 'relative',\n zIndex: 5,\n ...widget.style,\n }\n : {\n gridColumn: `${widget.x} / span ${widget.w ?? 1}`,\n gridRow: `${widget.y} / span ${widget.h ?? 1}`,\n position: editor ? 'relative' : (widget.style?.position ?? 'relative'),\n ...widget.style,\n }\n\n const content = widget.children ?? widget.render?.() ?? null\n\n // Pick the actions list: per-widget overrides win; otherwise use the\n // parent-supplied defaults (editor mode); otherwise no menu. The\n // built-in `__maximize__` action flips its label to `Restore` while\n // the widget is in maximized state — easier than asking consumers to\n // track that flag themselves.\n const actions = useMemo<readonly WidgetAction[]>(() => {\n const raw = widget.actions ?? defaultActions ?? []\n return raw\n .filter((a) => !a.hidden?.(widget))\n .map((a) => (a.id === '__maximize__' && isMaximized ? { ...a, label: 'Restore' } : a))\n }, [widget, defaultActions, isMaximized])\n\n const hasActions = actions.length > 0\n\n const handleContextMenu = (e: ReactMouseEvent<HTMLDivElement>) => {\n if (!onWidgetContextMenu) return\n e.preventDefault()\n e.stopPropagation()\n onWidgetContextMenu(e, widget)\n }\n\n // The actions visibility flag is what tests assert against. We expose\n // it as `data-sg-actions` so consumers can also style on it without\n // recreating the hover-tracking themselves.\n const actionsVisible = hasActions && (hovered || menuOpen || isMaximized)\n\n return (\n <div\n className={widgetClass}\n style={widgetStyle}\n data-widget-id={widget.id}\n data-sg-maximized={isMaximized ? 'true' : undefined}\n data-sg-actions={hasActions ? (actionsVisible ? 'visible' : 'hidden') : undefined}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onContextMenu={onWidgetContextMenu ? handleContextMenu : undefined}\n >\n {(widget.title !== undefined || hasActions || editor) && (\n <div\n className={unstyled ? undefined : 'sg-dashboard-widget-header'}\n data-role={editor ? 'drag-handle' : undefined}\n onPointerDown={\n editor?.editable && editor.onPointerDownDragHandle\n ? (e) => editor.onPointerDownDragHandle?.(e, widget)\n : undefined\n }\n style={\n editor?.editable\n ? { touchAction: 'none', cursor: 'grab', userSelect: 'none' }\n : undefined\n }\n >\n <span className={unstyled ? undefined : 'sg-dashboard-widget-title'}>\n {widget.title ?? null}\n </span>\n {hasActions && (\n <WidgetActionsMenu\n widget={widget}\n actions={actions}\n unstyled={unstyled}\n open={menuOpen}\n onOpenChange={setMenuOpen}\n onActivateMaximize={onToggleMaximize}\n />\n )}\n </div>\n )}\n <div className={unstyled ? undefined : 'sg-dashboard-widget-body'}>{content}</div>\n {editor?.showResizeHandle && (\n <div\n className={unstyled ? undefined : 'sg-dashboard-editor-resize-handle'}\n data-role=\"resize-handle\"\n role=\"button\"\n aria-label={dashboardLocale?.resizeWidget ?? 'Resize widget'}\n tabIndex={-1}\n onPointerDown={\n editor.onPointerDownResizeHandle\n ? (e) => editor.onPointerDownResizeHandle?.(e, widget)\n : undefined\n }\n style={{ touchAction: 'none' }}\n >\n {!unstyled && (\n <span className=\"sg-dashboard-editor-resize-handle-grip\" aria-hidden=\"true\" />\n )}\n </div>\n )}\n </div>\n )\n}\n\n// ─── Internal action-menu popover ───────────────────────────────────────────\n\ninterface WidgetActionsMenuProps {\n widget: DashboardWidget\n actions: readonly WidgetAction[]\n unstyled: boolean\n open: boolean\n onOpenChange: (next: boolean) => void\n onActivateMaximize: () => void\n}\n\n/**\n * Anchored more-actions popover for a single widget. Opens on click,\n * closes on outside-click, Escape, or after an action runs. Keeps its\n * own DOM ref for outside-click detection.\n */\nfunction WidgetActionsMenu({\n widget,\n actions,\n unstyled,\n open,\n onOpenChange,\n onActivateMaximize,\n}: WidgetActionsMenuProps) {\n const dashboardLocale = useConfig().locale?.dashboard\n const wrapperRef = useRef<HTMLDivElement | null>(null)\n\n useEffect(() => {\n if (!open) return\n const onDocClick = (ev: MouseEvent) => {\n if (!wrapperRef.current) return\n if (!wrapperRef.current.contains(ev.target as Node)) onOpenChange(false)\n }\n const onKey = (ev: KeyboardEvent) => {\n if (ev.key === 'Escape') onOpenChange(false)\n }\n document.addEventListener('mousedown', onDocClick)\n document.addEventListener('keydown', onKey)\n return () => {\n document.removeEventListener('mousedown', onDocClick)\n document.removeEventListener('keydown', onKey)\n }\n }, [open, onOpenChange])\n\n const runAction = useCallback(\n (action: WidgetAction) => {\n onOpenChange(false)\n // The built-in `Maximize` action is wired through the parent so\n // that toggling state survives outside the menu's lifecycle.\n if (action.id === '__maximize__') {\n onActivateMaximize()\n return\n }\n action.onClick(widget)\n },\n [widget, onOpenChange, onActivateMaximize],\n )\n\n const triggerCls = unstyled ? undefined : 'sg-dashboard-widget-more'\n const menuCls = unstyled ? undefined : 'sg-dashboard-widget-actions-menu'\n\n return (\n <div\n ref={wrapperRef}\n className={unstyled ? undefined : 'sg-dashboard-widget-actions'}\n data-role=\"widget-actions\"\n // Stop pointerdown on the trigger from starting an editor drag.\n onPointerDown={(e) => e.stopPropagation()}\n >\n <button\n type=\"button\"\n className={triggerCls}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-label={dashboardLocale?.widgetActions ?? 'Widget actions'}\n data-role=\"widget-more-button\"\n onClick={(e) => {\n e.stopPropagation()\n onOpenChange(!open)\n }}\n >\n <MoreIcon />\n </button>\n {open && (\n <div className={menuCls} role=\"menu\" data-role=\"widget-actions-menu\">\n {actions.map((a) => {\n const itemCls = unstyled\n ? undefined\n : [\n 'sg-dashboard-widget-actions-item',\n a.variant === 'danger' ? 'sg-dashboard-widget-actions-item-danger' : '',\n ]\n .filter(Boolean)\n .join(' ')\n return (\n <button\n key={a.id}\n type=\"button\"\n role=\"menuitem\"\n className={itemCls}\n data-action-id={a.id}\n onClick={(ev) => {\n ev.stopPropagation()\n runAction(a)\n }}\n >\n {a.icon !== undefined && (\n <span className={unstyled ? undefined : 'sg-dashboard-widget-actions-icon'}>\n {a.icon}\n </span>\n )}\n <span>{a.label}</span>\n </button>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n\nfunction MoreIcon(): ReactNode {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <circle cx=\"3\" cy=\"8\" r=\"1.4\" />\n <circle cx=\"8\" cy=\"8\" r=\"1.4\" />\n <circle cx=\"13\" cy=\"8\" r=\"1.4\" />\n </svg>\n )\n}\n","import {\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type MouseEvent as ReactMouseEvent,\n type PointerEvent as ReactPointerEvent,\n} from 'react'\nimport { DashboardWidgetView } from './Dashboard'\nimport type { DashboardCommonProps, DashboardWidget, WidgetAction } from './types'\nimport { useConfig } from '../../ConfigProvider'\n\n/**\n * Patch describing a layout change for one widget. Only the changed fields\n * are present, so consumers can spread it onto their existing widget state.\n */\nexport type DashboardLayoutPatch = Partial<Pick<DashboardWidget, 'x' | 'y' | 'w' | 'h'>>\n\n/**\n * Callback signature: receives the full updated widgets array (already\n * patched with the new `(x, y, w, h)` for the affected widget). Designed\n * for `onLayoutChange={setWidgets}`.\n */\nexport type DashboardLayoutChange = (\n next: DashboardWidget[],\n meta: { widgetId: string; patch: DashboardLayoutPatch },\n) => void\n\nexport interface DashboardEditorProps extends DashboardCommonProps {\n /** Widgets pinned to grid cells. */\n widgets: readonly DashboardWidget[]\n /**\n * Called whenever a widget is dragged or resized to a new cell. Receives\n * the full updated widgets array. Skipped when no actual layout change\n * occurred (drag inside the same cell).\n */\n onLayoutChange?: DashboardLayoutChange\n /** Total grid columns. @default 12 */\n columns?: number\n /** Row height in pixels (uniform). @default 80 */\n rowHeight?: number\n /** Gap between cells in pixels. @default 16 */\n gap?: number\n /**\n * When `false`, drag / resize handlers are disabled and the editor renders\n * read-only (still keeps the resize-handle DOM hidden). @default true\n */\n editable?: boolean\n /** Drop default `sg-dashboard-*` classes. */\n unstyled?: boolean\n /** Root wrapper className. */\n className?: string\n /** Root wrapper inline style. */\n style?: CSSProperties\n /**\n * Optional Refresh handler. When provided, the default action set\n * (used when a widget doesn't declare its own `actions`) gains a\n * `Refresh` entry that calls this with the widget data.\n */\n onWidgetRefresh?: (widget: DashboardWidget) => void\n /**\n * Optional Settings handler. Same default-action wiring as\n * `onWidgetRefresh`.\n */\n onWidgetSettings?: (widget: DashboardWidget) => void\n /**\n * Optional Remove handler. When omitted, the default `Remove` action\n * removes the widget from the layout via `onLayoutChange` (passing\n * the same array minus the widget — `meta.patch` is empty in that\n * case so consumers can detect a removal).\n */\n onWidgetRemove?: (widget: DashboardWidget) => void\n}\n\nconst MIN_W = 1\nconst MIN_H = 1\n\ninterface DragState {\n kind: 'move' | 'resize'\n widgetId: string\n startClientX: number\n startClientY: number\n origX: number\n origY: number\n origW: number\n origH: number\n cellW: number\n cellH: number\n columns: number\n gap: number\n /** Last emitted (x, y, w, h) to skip duplicate `onLayoutChange` calls. */\n lastX: number\n lastY: number\n lastW: number\n lastH: number\n}\n\nfunction clamp(v: number, lo: number, hi: number) {\n return Math.max(lo, Math.min(hi, v))\n}\n\n/**\n * Editable variant of `Dashboard` — drag widgets by their header to move\n * `(x, y)`, drag the bottom-right handle to resize `(w, h)`. Layout snaps\n * to the underlying CSS grid.\n *\n * Implementation notes:\n * - Pointer events with `window` listeners (no pointer capture, no\n * wheel-blocking, no React state during drag — we only `onLayoutChange`\n * when the snapped cell actually changes).\n * - Cell width is computed from `gridRef.getBoundingClientRect()` at drag\n * start so responsive containers stay accurate between drags.\n * - Movement uses `Math.round(delta / cell)` so the widget snaps to the\n * nearest cell while the pointer is moving.\n * - Per-widget `actions` (the `⋯` menu) and right-click `onWidgetContextMenu`\n * work the same way as in the read-only `Dashboard`.\n */\nexport function DashboardEditor({\n widgets,\n onLayoutChange,\n columns = 12,\n rowHeight = 80,\n gap = 16,\n editable = true,\n unstyled = false,\n className,\n style,\n onWidgetContextMenu,\n onDashboardContextMenu,\n onWidgetRefresh,\n onWidgetSettings,\n onWidgetRemove,\n}: DashboardEditorProps) {\n const dashboardLocale = useConfig().locale?.dashboard\n const gridRef = useRef<HTMLDivElement | null>(null)\n const dragRef = useRef<DragState | null>(null)\n const [maximizedId, setMaximizedId] = useState<string | null>(null)\n // Latest widgets are read inside drag handlers via this ref so that\n // re-renders during drag don't break stale-closure equality checks.\n const widgetsRef = useRef(widgets)\n widgetsRef.current = widgets\n const onChangeRef = useRef(onLayoutChange)\n onChangeRef.current = onLayoutChange\n\n function emitChange(widgetId: string, patch: DashboardLayoutPatch) {\n const cb = onChangeRef.current\n if (!cb) return\n const list = widgetsRef.current\n const next = list.map((w) => (w.id === widgetId ? { ...w, ...patch } : w))\n cb(next, { widgetId, patch })\n }\n\n function emitRemove(widgetId: string) {\n const cb = onChangeRef.current\n if (!cb) return\n const list = widgetsRef.current\n const next = list.filter((w) => w.id !== widgetId)\n cb(next, { widgetId, patch: {} })\n }\n\n function startDrag(\n e: ReactPointerEvent<HTMLElement>,\n widget: DashboardWidget,\n kind: 'move' | 'resize',\n ) {\n if (!editable || !onChangeRef.current) return\n const grid = gridRef.current\n if (!grid) return\n e.preventDefault()\n e.stopPropagation()\n\n const rect = grid.getBoundingClientRect()\n // Fallback to a sensible minimum if the container isn't laid out yet\n // (e.g. inside a hidden parent). Without this, division by zero would\n // make every move snap to the same cell.\n const usableW = Math.max(rect.width, columns + gap * (columns - 1))\n const totalGap = gap * Math.max(0, columns - 1)\n const cellW = Math.max(1, (usableW - totalGap) / columns)\n\n const origW = widget.w ?? 1\n const origH = widget.h ?? 1\n const drag: DragState = {\n kind,\n widgetId: widget.id,\n startClientX: e.clientX,\n startClientY: e.clientY,\n origX: widget.x,\n origY: widget.y,\n origW,\n origH,\n cellW,\n cellH: rowHeight,\n columns,\n gap,\n lastX: widget.x,\n lastY: widget.y,\n lastW: origW,\n lastH: origH,\n }\n dragRef.current = drag\n\n function onMove(ev: PointerEvent) {\n const d = dragRef.current\n if (!d) return\n const dx = ev.clientX - d.startClientX\n const dy = ev.clientY - d.startClientY\n const colUnit = d.cellW + d.gap\n const rowUnit = d.cellH + d.gap\n const dCol = Math.round(dx / colUnit)\n const dRow = Math.round(dy / rowUnit)\n\n if (d.kind === 'move') {\n const ww = d.origW\n const newX = clamp(d.origX + dCol, 1, Math.max(1, d.columns - ww + 1))\n const newY = Math.max(1, d.origY + dRow)\n if (newX !== d.lastX || newY !== d.lastY) {\n d.lastX = newX\n d.lastY = newY\n emitChange(d.widgetId, { x: newX, y: newY })\n }\n } else {\n const newW = clamp(d.origW + dCol, MIN_W, Math.max(MIN_W, d.columns - d.origX + 1))\n const newH = Math.max(MIN_H, d.origH + dRow)\n if (newW !== d.lastW || newH !== d.lastH) {\n d.lastW = newW\n d.lastH = newH\n emitChange(d.widgetId, { w: newW, h: newH })\n }\n }\n }\n\n function onUp() {\n dragRef.current = null\n window.removeEventListener('pointermove', onMove)\n window.removeEventListener('pointerup', onUp)\n window.removeEventListener('pointercancel', onUp)\n }\n\n window.addEventListener('pointermove', onMove)\n window.addEventListener('pointerup', onUp)\n window.addEventListener('pointercancel', onUp)\n }\n\n // Default action set used when a widget doesn't declare its own\n // `actions`. Synthesised once per render — the underlying callbacks\n // are read from props on every invocation, so memoising further\n // doesn't buy us anything.\n const defaultActions = useMemo<readonly WidgetAction[]>(() => {\n if (!onLayoutChange) return []\n const list: WidgetAction[] = []\n if (onWidgetRefresh) {\n list.push({\n id: '__refresh__',\n label: 'Refresh',\n onClick: (w) => onWidgetRefresh(w),\n })\n }\n list.push({\n id: '__maximize__',\n label: 'Maximize',\n onClick: () => {\n // Real toggle handled by `WidgetActionsMenu` via\n // `onActivateMaximize` — this onClick is only here to satisfy\n // the `WidgetAction` type. The id sentinel `__maximize__`\n // routes execution through the parent toggle.\n },\n })\n if (onWidgetSettings) {\n list.push({\n id: '__settings__',\n label: 'Settings',\n onClick: (w) => onWidgetSettings(w),\n })\n }\n list.push({\n id: '__remove__',\n label: 'Remove',\n variant: 'danger',\n onClick: (w) => {\n if (onWidgetRemove) {\n onWidgetRemove(w)\n return\n }\n emitRemove(w.id)\n },\n })\n return list\n }, [onLayoutChange, onWidgetRefresh, onWidgetSettings, onWidgetRemove])\n\n const wrapperClass = unstyled\n ? className\n : ['sg-dashboard', 'sg-dashboard-editor', className].filter(Boolean).join(' ')\n\n const gridStyle: CSSProperties = {\n display: 'grid',\n gridTemplateColumns: `repeat(${columns}, 1fr)`,\n gridAutoRows: `${rowHeight}px`,\n gap,\n ...style,\n }\n\n const handleRootContextMenu = (e: ReactMouseEvent<HTMLDivElement>) => {\n if (!onDashboardContextMenu) return\n if (e.target !== e.currentTarget) return\n e.preventDefault()\n onDashboardContextMenu(e)\n }\n\n return (\n <div\n ref={gridRef}\n className={wrapperClass}\n style={gridStyle}\n role=\"region\"\n aria-label={dashboardLocale?.editorAriaLabel ?? 'Dashboard editor'}\n data-edit-mode={editable ? 'true' : 'false'}\n onContextMenu={onDashboardContextMenu ? handleRootContextMenu : undefined}\n >\n {widgets.map((w) => (\n <DashboardWidgetView\n key={w.id}\n widget={w}\n unstyled={unstyled}\n isMaximized={maximizedId === w.id}\n totalColumns={columns}\n onWidgetContextMenu={onWidgetContextMenu}\n onToggleMaximize={() => setMaximizedId((cur) => (cur === w.id ? null : w.id))}\n editor={{\n editable,\n showResizeHandle: editable,\n onPointerDownDragHandle: (e, widget) => startDrag(e, widget, 'move'),\n onPointerDownResizeHandle: (e, widget) => startDrag(e, widget, 'resize'),\n }}\n defaultActions={defaultActions}\n />\n ))}\n </div>\n )\n}\n","import {\n useCallback,\n useMemo,\n useRef,\n type CSSProperties,\n type MouseEvent as ReactMouseEvent,\n} from 'react'\nimport { pointsToPath } from '@skygraph/core'\nimport type { GanttProps, GanttRange, GanttScale, GanttTask } from './types'\nimport { useConfig } from '../../ConfigProvider'\n\nconst DAY = 86_400_000\nconst STEP_MS: Record<GanttScale, number> = {\n day: DAY,\n week: 7 * DAY,\n month: 30 * DAY,\n quarter: 90 * DAY,\n}\n\nfunction toMs(v: Date | number): number {\n return v instanceof Date ? v.getTime() : v\n}\n\nfunction alignDown(t: number, step: number): number {\n return Math.floor(t / step) * step\n}\n\nfunction alignUp(t: number, step: number): number {\n return Math.ceil(t / step) * step\n}\n\nfunction clamp(v: number, lo: number, hi: number): number {\n return Math.max(lo, Math.min(hi, v))\n}\n\nfunction formatTick(timeMs: number, scale: GanttScale, columnWidth: number): string {\n const d = new Date(timeMs)\n switch (scale) {\n case 'day': {\n const dd = String(d.getUTCDate()).padStart(2, '0')\n // `DD.MM` needs ~32px to render cleanly; below that drop the month\n // and show day-of-month only, plus prepend the month at every 1st\n // so the user still has a calendar anchor.\n if (columnWidth < 32) {\n if (d.getUTCDate() === 1) {\n const mm = String(d.getUTCMonth() + 1).padStart(2, '0')\n return `${dd}.${mm}`\n }\n return dd\n }\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 case 'quarter': {\n const q = Math.floor(d.getUTCMonth() / 3) + 1\n return `Q${q} ${d.getUTCFullYear()}`\n }\n }\n}\n\ninterface Resolved {\n rangeStart: number\n rangeEnd: number\n step: number\n totalWidth: number\n pxPerMs: number\n rows: Array<{ key: string; label: string }>\n rowOf: (task: GanttTask) => number\n}\n\nfunction deriveRange(tasks: readonly GanttTask[], step: number): GanttRange {\n if (tasks.length === 0) {\n const now = Date.now()\n return { from: new Date(alignDown(now, step)), to: new Date(alignUp(now + step, step)) }\n }\n let lo = Infinity\n let hi = -Infinity\n for (const t of tasks) {\n const s = toMs(t.start)\n const e = toMs(t.end)\n if (s < lo) lo = s\n if (e > hi) hi = e\n }\n return {\n from: new Date(alignDown(lo - step, step)),\n to: new Date(alignUp(hi + step, step)),\n }\n}\n\n/**\n * Gantt chart: tasks-as-bars over a discrete time axis with optional\n * resource lanes and dependency arrows.\n *\n * v1 capabilities:\n * - `scale` of `day | week | month | quarter` — drives header ticks AND\n * the drag/resize snap step (1 column = 1 step).\n * - `draggable` — left-click on a bar moves it horizontally; `start` /\n * `end` are emitted via `onTaskChange` once per snap.\n * - `resizable` — drag the right edge of a bar to extend `end` only.\n * - `dependencies` — orthogonal arrows from upstream task end to dependent\n * task start, routed via `routeOrthogonal` from `@skygraph/core`.\n * - `resources` — when provided, every task pinned to a lane via\n * `resourceId`; otherwise one task per row.\n *\n * Out-of-scope (planned for v2): hierarchy collapse, milestones, baselines,\n * critical-path highlighting, calendar-aware month/quarter widths.\n */\nexport function Gantt({\n tasks,\n resources,\n scale = 'day',\n range,\n rowHeight = 32,\n columnWidth = 40,\n sidebarWidth = 200,\n onTaskChange,\n draggable = false,\n resizable = false,\n unstyled = false,\n className,\n style,\n}: GanttProps) {\n const ganttLocale = useConfig().locale?.gantt\n const onChangeRef = useRef(onTaskChange)\n onChangeRef.current = onTaskChange\n\n const resolved = useMemo<Resolved>(() => {\n const step = STEP_MS[scale]\n const r = range ?? deriveRange(tasks, step)\n const rangeStart = r.from.getTime()\n const rangeEnd = r.to.getTime()\n const pxPerMs = columnWidth / step\n const totalWidth = (rangeEnd - rangeStart) * pxPerMs\n\n let rows: Array<{ key: string; label: string }>\n let rowOf: (task: GanttTask) => number\n if (resources && resources.length > 0) {\n rows = resources.map((r) => ({ key: r.id, label: r.name }))\n const idx = new Map(resources.map((r, i) => [r.id, i]))\n rowOf = (t) => (t.resourceId ? (idx.get(t.resourceId) ?? 0) : 0)\n } else {\n rows = tasks.map((t) => ({ key: t.id, label: t.name }))\n const idx = new Map(tasks.map((t, i) => [t.id, i]))\n rowOf = (t) => idx.get(t.id) ?? 0\n }\n\n return { rangeStart, rangeEnd, step, totalWidth, pxPerMs, rows, rowOf }\n }, [tasks, resources, scale, range, columnWidth])\n\n const ticks = useMemo(() => {\n const out: Array<{ x: number; label: string; time: number }> = []\n for (let t = resolved.rangeStart; t < resolved.rangeEnd; t += resolved.step) {\n out.push({\n x: (t - resolved.rangeStart) * resolved.pxPerMs,\n label: formatTick(t, scale, columnWidth),\n time: t,\n })\n }\n return out\n }, [resolved, scale, columnWidth])\n\n const taskRects = useMemo(() => {\n return tasks.map((task) => {\n const startMs = toMs(task.start)\n const endMs = toMs(task.end)\n const x = (startMs - resolved.rangeStart) * resolved.pxPerMs\n const w = Math.max(2, (endMs - startMs) * resolved.pxPerMs)\n const row = resolved.rowOf(task)\n const y = row * rowHeight\n return { task, x, y, w, h: rowHeight, row }\n })\n }, [tasks, resolved, rowHeight])\n\n const taskRectById = useMemo(() => {\n const m = new Map<string, (typeof taskRects)[number]>()\n for (const r of taskRects) m.set(r.task.id, r)\n return m\n }, [taskRects])\n\n // Gantt-specific dependency routing — `routeOrthogonal` from core picks\n // the nearest side of each rect, which gives \"bottom-of-source\" /\n // \"top-of-target\" exits on dependencies between adjacent rows. That\n // looks unnatural in a Gantt: the convention is ALWAYS source-right →\n // target-left, regardless of geometry. So we build the path by hand:\n //\n // • Forward dep (target starts strictly after source ends): 3-bend Z\n // — right stub from source, vertical to target's row, horizontal\n // into target's left edge.\n // • Backward / overlapping dep (target's left edge sits at or before\n // source's right edge): 5-bend U detour under the source row, so\n // the link doesn't run inside either bar.\n const dependencyPaths = useMemo(() => {\n const out: Array<{ id: string; d: string }> = []\n // Exit stub from the source's right edge; the entry stub before the\n // target is intentionally longer (`APPROACH`) so the final horizontal\n // segment is unmistakably \"into the target\" and the arrowhead has\n // room to read even at small zoom levels.\n const STUB = 8\n const APPROACH = 18\n for (const r of taskRects) {\n const deps = r.task.dependencies\n if (!deps || deps.length === 0) continue\n for (const depId of deps) {\n const src = taskRectById.get(depId)\n if (!src) continue\n const sx = src.x + src.w\n const sy = src.y + src.h / 2\n const tx = r.x\n const ey = r.y + r.h / 2\n\n let points: ReadonlyArray<readonly [number, number]>\n if (tx >= sx + STUB + APPROACH) {\n // Forward Z — bend right after the source so the long final\n // horizontal lives at the target's row, with at least\n // `APPROACH` px of clean run into the target's left edge.\n const bendX = sx + STUB\n points = [\n [sx, sy],\n [bendX, sy],\n [bendX, ey],\n [tx, ey],\n ]\n } else {\n // U detour for backward / overlapping deps. Horizontal runs\n // along the row boundary just below the source so the link\n // sits in the row-gap gutter instead of slicing through the\n // next bar; entry segment is `APPROACH` wide for legibility.\n const detourY = src.y + src.h\n points = [\n [sx, sy],\n [sx + STUB, sy],\n [sx + STUB, detourY],\n [tx - APPROACH, detourY],\n [tx - APPROACH, ey],\n [tx, ey],\n ]\n }\n out.push({ id: `${depId}->${r.task.id}`, d: pointsToPath(points) })\n }\n }\n return out\n }, [taskRects, taskRectById])\n\n // ─── Drag / resize plumbing ─────────────────────────────────────────────\n const dragRef = useRef<{\n kind: 'move' | 'resize'\n taskId: string\n startClientX: number\n origStart: number\n origEnd: number\n lastStart: number\n lastEnd: number\n } | null>(null)\n\n const startInteraction = useCallback(\n (e: ReactMouseEvent<HTMLDivElement>, task: GanttTask, kind: 'move' | 'resize') => {\n if (e.button !== 0) return\n if (kind === 'move' && !draggable) return\n if (kind === 'resize' && !resizable) return\n if (!onChangeRef.current) return\n e.preventDefault()\n e.stopPropagation()\n\n const origStart = toMs(task.start)\n const origEnd = toMs(task.end)\n const step = resolved.step\n const pxPerMs = resolved.pxPerMs\n\n dragRef.current = {\n kind,\n taskId: task.id,\n startClientX: e.clientX,\n origStart,\n origEnd,\n lastStart: origStart,\n lastEnd: origEnd,\n }\n\n function onMove(ev: MouseEvent) {\n const d = dragRef.current\n if (!d) return\n const dxPx = ev.clientX - d.startClientX\n const dxMs = dxPx / pxPerMs\n // Snap to nearest step.\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 {\n nextEnd = Math.max(d.origStart + step, d.origEnd + snappedDx)\n }\n if (nextStart === d.lastStart && nextEnd === d.lastEnd) return\n d.lastStart = nextStart\n d.lastEnd = nextEnd\n const cb = onChangeRef.current\n if (cb) {\n cb({\n ...task,\n start: nextStart,\n end: nextEnd,\n })\n }\n }\n\n function onUp() {\n dragRef.current = null\n window.removeEventListener('mousemove', onMove)\n window.removeEventListener('mouseup', onUp)\n }\n\n window.addEventListener('mousemove', onMove)\n window.addEventListener('mouseup', onUp)\n },\n [draggable, resizable, resolved],\n )\n\n // ─── Render ─────────────────────────────────────────────────────────────\n const wrapperClass = unstyled ? className : ['sg-gantt', className].filter(Boolean).join(' ')\n\n const headerHeight = rowHeight\n const gridHeight = resolved.rows.length * rowHeight\n // Reserve vertical space for the horizontal scrollbar that lives inside\n // `.sg-gantt-main` (overflow-x: auto). Without this padding the\n // scrollbar's ~14px eats into the last row's bars.\n const SCROLLBAR_RESERVE = 14\n const totalHeight = gridHeight + headerHeight + SCROLLBAR_RESERVE\n\n // `minmax(0, 1fr)` is required so the main track can shrink below the\n // intrinsic width of its child (`width: totalWidth`, often thousands of\n // pixels) — otherwise the grid swells past the parent and the chart\n // bleeds outside its container. The actual horizontal scrolling lives\n // on `.sg-gantt-main` below, which keeps the sidebar pinned while the\n // bars area scrolls.\n const wrapperStyle: CSSProperties = {\n display: 'grid',\n gridTemplateColumns: `${sidebarWidth}px minmax(0, 1fr)`,\n width: '100%',\n overflow: 'hidden',\n height: totalHeight,\n ...style,\n }\n\n return (\n <div\n className={wrapperClass}\n style={wrapperStyle}\n role=\"region\"\n aria-label={ganttLocale?.ariaLabel ?? 'Gantt chart'}\n data-scale={scale}\n >\n {/* Sidebar (task / resource list) */}\n <div className={unstyled ? undefined : 'sg-gantt-sidebar'} style={{ width: sidebarWidth }}>\n <div\n className={unstyled ? undefined : 'sg-gantt-sidebar-header'}\n style={{ height: headerHeight }}\n />\n {resolved.rows.map((row, i) => (\n <div\n key={row.key}\n className={unstyled ? undefined : 'sg-gantt-sidebar-row'}\n style={{ height: rowHeight }}\n data-row-index={i}\n data-row-key={row.key}\n >\n {row.label}\n </div>\n ))}\n </div>\n\n {/* Main: header + grid + bars (horizontal scroll lives here so the\n * sidebar stays pinned while bars scroll). */}\n <div\n className={unstyled ? undefined : 'sg-gantt-main'}\n style={{ position: 'relative', overflowX: 'auto', overflowY: 'hidden', minWidth: 0 }}\n >\n <div style={{ position: 'relative', width: resolved.totalWidth, minWidth: '100%' }}>\n <div\n className={unstyled ? undefined : 'sg-gantt-header'}\n style={{ position: 'relative', height: headerHeight, width: resolved.totalWidth }}\n >\n {ticks.map((t) => (\n <div\n key={t.time}\n className={unstyled ? undefined : 'sg-gantt-tick'}\n style={{\n position: 'absolute',\n left: t.x,\n top: 0,\n width: columnWidth,\n height: headerHeight,\n }}\n data-tick-time={t.time}\n >\n {t.label}\n </div>\n ))}\n </div>\n\n <div\n className={unstyled ? undefined : 'sg-gantt-grid'}\n style={{\n position: 'relative',\n width: resolved.totalWidth,\n height: gridHeight,\n }}\n >\n {/* Row backgrounds */}\n {resolved.rows.map((row, i) => (\n <div\n key={row.key}\n className={unstyled ? undefined : 'sg-gantt-row'}\n style={{\n position: 'absolute',\n left: 0,\n top: i * rowHeight,\n width: resolved.totalWidth,\n height: rowHeight,\n }}\n data-row-index={i}\n />\n ))}\n\n {/* Bars */}\n {taskRects.map(({ task, x, y, w, h }) => {\n const barClass = unstyled\n ? undefined\n : [\n 'sg-gantt-bar',\n draggable ? 'sg-gantt-bar-draggable' : '',\n resizable ? 'sg-gantt-bar-resizable' : '',\n ]\n .filter(Boolean)\n .join(' ')\n const progress = clamp(task.progress ?? 0, 0, 1)\n return (\n <div\n key={task.id}\n className={barClass}\n style={{\n position: 'absolute',\n left: x,\n top: y + 4,\n width: w,\n height: h - 8,\n background: task.color,\n cursor: draggable ? 'grab' : undefined,\n userSelect: draggable || resizable ? 'none' : undefined,\n }}\n role=\"button\"\n tabIndex={0}\n aria-label={task.name}\n data-task-id={task.id}\n data-row-index={resolved.rowOf(task)}\n onMouseDown={draggable ? (e) => startInteraction(e, task, 'move') : undefined}\n >\n {progress > 0 && (\n <div\n className={unstyled ? undefined : 'sg-gantt-bar-progress'}\n style={{\n position: 'absolute',\n left: 0,\n top: 0,\n bottom: 0,\n width: `${progress * 100}%`,\n }}\n data-progress={progress}\n />\n )}\n <span\n className={unstyled ? undefined : 'sg-gantt-bar-label'}\n style={{ position: 'relative', zIndex: 1 }}\n >\n {task.name}\n </span>\n {resizable && (\n <div\n className={unstyled ? undefined : 'sg-gantt-bar-resize'}\n role=\"button\"\n aria-label={ganttLocale?.resizeTask ?? 'Resize task'}\n tabIndex={-1}\n data-role=\"resize-handle\"\n style={{\n position: 'absolute',\n right: 0,\n top: 0,\n bottom: 0,\n width: 6,\n cursor: 'ew-resize',\n }}\n onMouseDown={(e) => startInteraction(e, task, 'resize')}\n />\n )}\n </div>\n )\n })}\n\n {/* Dependency arrows — rendered AFTER bars so the arrowhead is\n * never covered by the target bar. `pointer-events: none` lets\n * pointer events fall through to bars beneath the SVG layer. */}\n {dependencyPaths.length > 0 && (\n <svg\n className={unstyled ? undefined : 'sg-gantt-deps'}\n width={resolved.totalWidth}\n height={gridHeight}\n style={{\n position: 'absolute',\n inset: 0,\n pointerEvents: 'none',\n overflow: 'visible',\n }}\n aria-hidden=\"true\"\n >\n <defs>\n <marker\n id=\"sg-gantt-arrow\"\n viewBox=\"0 0 10 10\"\n refX=\"10\"\n refY=\"5\"\n markerWidth=\"6\"\n markerHeight=\"6\"\n orient=\"auto\"\n >\n <path d=\"M 0 0 L 10 5 L 0 10 z\" fill=\"currentColor\" />\n </marker>\n </defs>\n {dependencyPaths.map((p) => (\n <path\n key={p.id}\n d={p.d}\n className={unstyled ? undefined : 'sg-gantt-dep'}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n markerEnd=\"url(#sg-gantt-arrow)\"\n data-dep-id={p.id}\n />\n ))}\n </svg>\n )}\n </div>\n </div>\n </div>\n </div>\n )\n}\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type MouseEvent as ReactMouseEvent,\n} from 'react'\nimport { detectConflicts, isAvailable } from '@skygraph/core'\nimport type { CalendarConflict as Conflict } from '@skygraph/core'\nimport type { Assignment, CalendarScale, Resource, ResourceCalendarProps } from './types'\nimport { useConfig } from '../../ConfigProvider'\n\nconst DAY = 86_400_000\nconst STEP_MS: Record<CalendarScale, number> = {\n day: DAY,\n week: 7 * DAY,\n month: 30 * DAY,\n}\n\nfunction toMs(v: Date | number): number {\n return v instanceof Date ? v.getTime() : v\n}\n\nfunction alignDown(t: number, step: number): number {\n return Math.floor(t / step) * step\n}\n\nfunction alignUp(t: number, step: number): number {\n return Math.ceil(t / step) * step\n}\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\n/**\n * Resolves the visible time axis. `range` is treated as the *minimum*\n * viewport — assignments may pull it further left or right (aligned to\n * `step` so column borders stay whole). When no `range` is provided we\n * derive one purely from `assignments` (with one-step padding on each\n * side for breathing room). This matches the Vue implementation so\n * both adapters expose identical scheduling behaviour.\n */\nfunction resolveRange(\n assignments: readonly Assignment[],\n step: number,\n range: { from: Date; to: Date } | undefined,\n): { from: Date; to: Date } {\n let lo = Infinity\n let hi = -Infinity\n for (const a of assignments) {\n const s = toMs(a.start)\n const e = toMs(a.end)\n if (s < lo) lo = s\n if (e > hi) hi = e\n }\n if (range) {\n const rangeFrom = range.from.getTime()\n const rangeTo = range.to.getTime()\n if (assignments.length === 0) return { from: new Date(rangeFrom), to: new Date(rangeTo) }\n return {\n from: new Date(alignDown(Math.min(rangeFrom, lo), step)),\n to: new Date(alignUp(Math.max(rangeTo, hi), step)),\n }\n }\n if (assignments.length === 0) {\n const now = Date.now()\n return {\n from: new Date(alignDown(now, step)),\n to: new Date(alignUp(now + step * 4, step)),\n }\n }\n return {\n from: new Date(alignDown(lo - step, step)),\n to: new Date(alignUp(hi + step, step)),\n }\n}\n\n/**\n * Resource Calendar — shifts / bookings per resource lane with\n * automatic conflict detection.\n *\n * v1 capabilities:\n * - `scale` of `day | week | month` — drives header ticks AND\n * drag/resize snap (1 column = 1 step).\n * - `draggable` — drag a block to move it horizontally; both `start`\n * and `end` shift by the snapped delta. Lane (resource) is\n * preserved — vertical lane changes are out of scope for v1.\n * - `resizable` — drag the left/right edge to resize that side\n * independently. Minimum width clamped to one `scale` step.\n * - Conflict overlay — assignments participating in any conflict\n * get the `sg-rcal-assignment-conflict` modifier (red border /\n * hatched background). `onConflict` fires after every change with\n * the freshly detected `Conflict[]`.\n * - `availability-off` background bands appear on slots that fall\n * outside the configured `rules`.\n *\n * Out-of-scope (planned for v2): cross-lane drag, multi-day all-day\n * blocks, recurrence, exception dates, calendar-aware month widths.\n */\nexport function ResourceCalendar({\n resources,\n assignments,\n rules,\n scale = 'week',\n range,\n columnWidth = 120,\n rowHeight = 56,\n sidebarWidth = 200,\n draggable = false,\n resizable = false,\n onAssignmentChange,\n onConflict,\n unstyled = false,\n className,\n style,\n}: ResourceCalendarProps) {\n const resourceCalendarLocale = useConfig().locale?.resourceCalendar\n const onChangeRef = useRef(onAssignmentChange)\n onChangeRef.current = onAssignmentChange\n const onConflictRef = useRef(onConflict)\n onConflictRef.current = onConflict\n\n // Local \"ghost\" overlay during a drag so React state doesn't have to\n // round-trip through the consumer for each mousemove. The ghost is\n // cleared on mouseup; the canonical update is what `onAssignmentChange`\n // produces.\n const [ghost, setGhost] = useState<Assignment | null>(null)\n\n const step = STEP_MS[scale]\n const resolvedRange = useMemo(\n () => resolveRange(assignments, step, range),\n [range, assignments, step],\n )\n const rangeStart = resolvedRange.from.getTime()\n const rangeEnd = resolvedRange.to.getTime()\n const pxPerMs = columnWidth / step\n const totalWidth = (rangeEnd - rangeStart) * pxPerMs\n\n const ticks = useMemo(() => {\n const out: Array<{ x: number; label: string; time: number }> = []\n for (let t = rangeStart; t < rangeEnd; t += step) {\n out.push({\n x: (t - rangeStart) * pxPerMs,\n label: formatTick(t, scale),\n time: t,\n })\n }\n return out\n }, [rangeStart, rangeEnd, step, pxPerMs, scale])\n\n const rowIndexById = useMemo(() => {\n const m = new Map<string, number>()\n resources.forEach((r, i) => m.set(r.id, i))\n return m\n }, [resources])\n\n const normalizedAssignments = useMemo<Assignment[]>(() => {\n return assignments.map((a) => {\n if (ghost && ghost.id === a.id) return ghost\n return a\n })\n }, [assignments, ghost])\n\n const conflicts = useMemo<Conflict[]>(() => {\n return detectConflicts(\n {\n resources: resources.map((r) => ({\n id: r.id,\n name: r.name,\n color: r.color,\n capacityPerSlot: r.capacityPerSlot,\n meta: r.meta,\n })),\n assignments: normalizedAssignments.map((a) => ({\n id: a.id,\n resourceId: a.resourceId,\n start: toMs(a.start),\n end: toMs(a.end),\n title: a.title,\n status: a.status,\n meta: a.meta,\n })),\n },\n { scale, rules: rules ?? [] },\n )\n }, [resources, normalizedAssignments, scale, rules])\n\n const conflictingIds = useMemo(() => {\n const s = new Set<string>()\n for (const c of conflicts) for (const id of c.assignmentIds) s.add(id)\n return s\n }, [conflicts])\n\n // Fire onConflict whenever the conflict set actually changes. Using a\n // stable key (sorted ids per conflict) avoids spurious calls when\n // detection re-runs but produces the same set.\n const conflictKey = useMemo(\n () =>\n conflicts\n .map((c) => `${c.reason}:${c.assignmentIds.join(',')}`)\n .sort()\n .join('|'),\n [conflicts],\n )\n const lastKeyRef = useRef<string>('')\n useEffect(() => {\n if (lastKeyRef.current === conflictKey) return\n lastKeyRef.current = conflictKey\n onConflictRef.current?.(conflicts)\n }, [conflictKey, conflicts])\n\n // Compute the screen rectangles for each assignment.\n const assignmentRects = useMemo(() => {\n return normalizedAssignments\n .map((a) => {\n const row = rowIndexById.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 - rangeStart) * pxPerMs\n const w = Math.max(2, (endMs - startMs) * pxPerMs)\n const y = row * rowHeight\n return { assignment: a, x, y, w, h: rowHeight, row }\n })\n .filter((r): r is NonNullable<typeof r> => r !== null)\n }, [normalizedAssignments, rowIndexById, rangeStart, pxPerMs, rowHeight])\n\n // Per-row availability bands — pre-compute slot windows where the\n // resource is unavailable. Drawn as background stripes behind the\n // assignment blocks. We bucket slots so non-uniform consecutive\n // unavailable slots merge into one block visually.\n const availabilityBands = useMemo(() => {\n if (!rules || rules.length === 0)\n return [] as Array<{\n key: string\n x: number\n y: number\n w: number\n h: number\n }>\n const out: Array<{ key: string; x: number; y: number; w: number; h: number }> = []\n for (const r of resources) {\n const row = rowIndexById.get(r.id)\n if (row === undefined) continue\n const y = row * rowHeight\n let bandStart: number | null = null\n for (let t = rangeStart; t < rangeEnd; t += step) {\n const ok = isAvailable(\n { id: r.id, name: r.name, color: r.color, capacityPerSlot: r.capacityPerSlot },\n { start: t, end: t + step },\n rules,\n )\n if (!ok) {\n if (bandStart === null) bandStart = t\n } else if (bandStart !== null) {\n out.push({\n key: `${r.id}-${bandStart}`,\n x: (bandStart - rangeStart) * pxPerMs,\n y,\n w: (t - bandStart) * pxPerMs,\n h: rowHeight,\n })\n bandStart = null\n }\n }\n if (bandStart !== null) {\n out.push({\n key: `${r.id}-${bandStart}`,\n x: (bandStart - rangeStart) * pxPerMs,\n y,\n w: (rangeEnd - bandStart) * pxPerMs,\n h: rowHeight,\n })\n }\n }\n return out\n }, [rules, resources, rowIndexById, rangeStart, rangeEnd, step, pxPerMs, rowHeight])\n\n // ─── Drag / resize plumbing ─────────────────────────────────────────────\n const dragRef = useRef<{\n kind: 'move' | 'resize-start' | 'resize-end'\n assignmentId: string\n startClientX: number\n origStart: number\n origEnd: number\n lastStart: number\n lastEnd: number\n } | null>(null)\n\n const startInteraction = useCallback(\n (\n e: ReactMouseEvent<HTMLDivElement>,\n assignment: Assignment,\n kind: 'move' | 'resize-start' | 'resize-end',\n ) => {\n if (e.button !== 0) return\n if (kind === 'move' && !draggable) return\n if (kind !== 'move' && !resizable) return\n e.preventDefault()\n e.stopPropagation()\n\n const origStart = toMs(assignment.start)\n const origEnd = toMs(assignment.end)\n\n dragRef.current = {\n kind,\n assignmentId: assignment.id,\n startClientX: e.clientX,\n origStart,\n origEnd,\n lastStart: origStart,\n lastEnd: origEnd,\n }\n setGhost({ ...assignment, start: origStart, end: origEnd })\n\n function emit(nextStart: number, nextEnd: number) {\n const cb = onChangeRef.current\n if (!cb) return\n cb({\n ...assignment,\n start: nextStart,\n end: nextEnd,\n })\n }\n\n function onMove(ev: MouseEvent) {\n const d = dragRef.current\n if (!d) return\n const dxPx = ev.clientX - d.startClientX\n const dxMs = dxPx / pxPerMs\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 if (nextStart === d.lastStart && nextEnd === d.lastEnd) return\n d.lastStart = nextStart\n d.lastEnd = nextEnd\n setGhost({ ...assignment, start: nextStart, end: nextEnd })\n emit(nextStart, nextEnd)\n }\n\n function onUp() {\n dragRef.current = null\n setGhost(null)\n window.removeEventListener('mousemove', onMove)\n window.removeEventListener('mouseup', onUp)\n }\n\n window.addEventListener('mousemove', onMove)\n window.addEventListener('mouseup', onUp)\n },\n [draggable, resizable, pxPerMs, step],\n )\n\n const onAssignmentKeyDown = useCallback(\n (e: ReactKeyboardEvent<HTMLDivElement>, assignment: Assignment) => {\n if (!draggable && !resizable) return\n const cb = onChangeRef.current\n if (!cb) return\n const startMs = toMs(assignment.start)\n const endMs = toMs(assignment.end)\n // ArrowLeft / ArrowRight = move ±1 step (when draggable).\n // Shift+ArrowLeft / ArrowRight = resize end ±1 step (when resizable).\n if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') {\n const dir = e.key === 'ArrowLeft' ? -1 : 1\n e.preventDefault()\n if (e.shiftKey && resizable) {\n const nextEnd = Math.max(startMs + step, endMs + dir * step)\n cb({ ...assignment, start: startMs, end: nextEnd })\n } else if (draggable) {\n cb({\n ...assignment,\n start: startMs + dir * step,\n end: endMs + dir * step,\n })\n }\n }\n },\n [draggable, resizable, step],\n )\n\n // ─── Render ─────────────────────────────────────────────────────────────\n const wrapperClass = unstyled ? className : ['sg-rcal', className].filter(Boolean).join(' ')\n\n const headerHeight = Math.max(28, Math.round(rowHeight * 0.6))\n const gridHeight = resources.length * rowHeight\n const totalHeight = gridHeight + headerHeight\n\n const wrapperStyle: CSSProperties = {\n display: 'grid',\n gridTemplateColumns: `${sidebarWidth}px 1fr`,\n width: '100%',\n overflow: 'auto',\n height: totalHeight,\n ...style,\n }\n\n return (\n <div\n className={wrapperClass}\n style={wrapperStyle}\n role=\"region\"\n aria-label={resourceCalendarLocale?.ariaLabel ?? 'Resource calendar'}\n data-scale={scale}\n >\n {/* Sidebar (resource list) */}\n <div className={unstyled ? undefined : 'sg-rcal-sidebar'} style={{ width: sidebarWidth }}>\n <div\n className={unstyled ? undefined : 'sg-rcal-sidebar-header'}\n style={{ height: headerHeight }}\n />\n {resources.map((r, i) => (\n <div\n key={r.id}\n className={unstyled ? undefined : 'sg-rcal-sidebar-row'}\n style={{ height: rowHeight }}\n role=\"row\"\n aria-label={\n resourceCalendarLocale?.resource\n ? resourceCalendarLocale.resource(r.name)\n : `Resource ${r.name}`\n }\n data-row-index={i}\n data-resource-id={r.id}\n >\n <span\n className={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 className={unstyled ? undefined : 'sg-rcal-sidebar-name'}>{r.name}</span>\n {r.capacityPerSlot !== undefined && (\n <span\n className={unstyled ? undefined : 'sg-rcal-sidebar-capacity'}\n aria-label={\n resourceCalendarLocale?.capacity\n ? resourceCalendarLocale.capacity(r.capacityPerSlot)\n : `capacity ${r.capacityPerSlot} per slot`\n }\n >\n ×{r.capacityPerSlot}\n </span>\n )}\n </div>\n ))}\n </div>\n\n {/* Main: header + grid + assignments */}\n <div\n className={unstyled ? undefined : 'sg-rcal-main'}\n style={{ position: 'relative', width: totalWidth, minWidth: '100%' }}\n >\n <div\n className={unstyled ? undefined : 'sg-rcal-header'}\n style={{ position: 'relative', height: headerHeight, width: totalWidth }}\n >\n {ticks.map((t) => (\n <div\n key={t.time}\n className={unstyled ? undefined : 'sg-rcal-tick'}\n style={{\n position: 'absolute',\n left: t.x,\n top: 0,\n width: columnWidth,\n height: headerHeight,\n }}\n data-tick-time={t.time}\n >\n {t.label}\n </div>\n ))}\n </div>\n\n <div\n className={unstyled ? undefined : 'sg-rcal-grid'}\n style={{\n position: 'relative',\n width: totalWidth,\n height: gridHeight,\n }}\n data-conflict-count={conflicts.length}\n >\n {/* Row backgrounds */}\n {resources.map((r, i) => (\n <div\n key={r.id}\n className={unstyled ? undefined : 'sg-rcal-row'}\n style={{\n position: 'absolute',\n left: 0,\n top: i * rowHeight,\n width: totalWidth,\n height: rowHeight,\n }}\n data-row-index={i}\n data-resource-id={r.id}\n >\n {/* Vertical slot dividers */}\n {ticks.map((t) => (\n <div\n key={t.time}\n className={unstyled ? undefined : 'sg-rcal-slot'}\n style={{\n position: 'absolute',\n left: t.x,\n top: 0,\n width: columnWidth,\n height: rowHeight,\n }}\n data-slot-time={t.time}\n />\n ))}\n </div>\n ))}\n\n {/* Availability bands (off-window) */}\n {availabilityBands.map((b) => (\n <div\n key={b.key}\n className={unstyled ? undefined : 'sg-rcal-availability-off'}\n style={{\n position: 'absolute',\n left: b.x,\n top: b.y,\n width: b.w,\n height: b.h,\n pointerEvents: 'none',\n }}\n data-role=\"availability-off\"\n aria-hidden=\"true\"\n />\n ))}\n\n {/* Assignment blocks */}\n {assignmentRects.map(({ assignment, x, y, w, h }) => {\n const status = conflictingIds.has(assignment.id)\n ? 'conflict'\n : (assignment.status ?? 'tentative')\n const blockClass = unstyled\n ? undefined\n : [\n 'sg-rcal-assignment',\n `sg-rcal-assignment-${status}`,\n draggable ? 'sg-rcal-assignment-draggable' : '',\n resizable ? 'sg-rcal-assignment-resizable' : '',\n ]\n .filter(Boolean)\n .join(' ')\n const colorOverride =\n status !== 'conflict'\n ? resources.find((r) => r.id === assignment.resourceId)?.color\n : undefined\n return (\n <div\n key={assignment.id}\n className={blockClass}\n style={{\n position: 'absolute',\n left: x,\n top: y + 4,\n width: w,\n height: h - 8,\n background: colorOverride,\n cursor: draggable ? 'grab' : undefined,\n userSelect: draggable || resizable ? 'none' : undefined,\n }}\n role=\"button\"\n tabIndex={0}\n aria-label={`${assignment.title}${status === 'conflict' ? (resourceCalendarLocale?.conflictSuffix ?? ' (conflict)') : ''}`}\n data-assignment-id={assignment.id}\n data-status={status}\n data-resource-id={assignment.resourceId}\n onMouseDown={draggable ? (e) => startInteraction(e, assignment, 'move') : undefined}\n onKeyDown={(e) => onAssignmentKeyDown(e, assignment)}\n >\n {resizable && (\n <div\n className={unstyled ? undefined : 'sg-rcal-assignment-resize-start'}\n role=\"button\"\n aria-label={resourceCalendarLocale?.resizeStart ?? '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: 6,\n cursor: 'ew-resize',\n }}\n onMouseDown={(e) => startInteraction(e, assignment, 'resize-start')}\n />\n )}\n <span\n className={unstyled ? undefined : 'sg-rcal-assignment-title'}\n style={{ position: 'relative', zIndex: 1 }}\n >\n {assignment.title}\n </span>\n {resizable && (\n <div\n className={unstyled ? undefined : 'sg-rcal-assignment-resize-end'}\n role=\"button\"\n aria-label={resourceCalendarLocale?.resizeEnd ?? '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: 6,\n cursor: 'ew-resize',\n }}\n onMouseDown={(e) => startInteraction(e, assignment, 'resize-end')}\n />\n )}\n </div>\n )\n })}\n </div>\n </div>\n </div>\n )\n}\n\n// `Resource` is part of the local domain; explicitly used here so the\n// helper lives next to its only consumer (rendering).\nexport type { Resource }\n","import { Fragment, useMemo, type CSSProperties } from 'react'\nimport type { EventTimelineProps, TimelineEvent, TimelineGroupBy } from './types'\nimport { useConfig } from '../../ConfigProvider'\n\nfunction toMs(v: Date | number): number {\n return v instanceof Date ? v.getTime() : v\n}\n\nfunction bucketKey(timeMs: number, groupBy: TimelineGroupBy): string {\n const d = new Date(timeMs)\n const y = d.getUTCFullYear()\n const m = d.getUTCMonth() + 1\n const day = d.getUTCDate()\n switch (groupBy) {\n case 'day':\n return `${y}-${String(m).padStart(2, '0')}-${String(day).padStart(2, '0')}`\n case 'month':\n return `${y}-${String(m).padStart(2, '0')}`\n case 'year':\n return `${y}`\n }\n}\n\nfunction bucketLabel(timeMs: number, groupBy: TimelineGroupBy): string {\n const d = new Date(timeMs)\n const y = d.getUTCFullYear()\n const m = String(d.getUTCMonth() + 1).padStart(2, '0')\n const day = String(d.getUTCDate()).padStart(2, '0')\n switch (groupBy) {\n case 'day':\n return `${day}.${m}.${y}`\n case 'month':\n return `${m}.${y}`\n case 'year':\n return `${y}`\n }\n}\n\ninterface Group {\n key: string\n label: string\n events: TimelineEvent[]\n}\n\n/**\n * Event-driven timeline: renders a sorted list of `TimelineEvent`s with an\n * optional grouping divider (`day | month | year`) and a horizontal /\n * vertical orientation.\n *\n * Distinct from `Timeline` (the simpler step-based UI primitive in\n * `components/ui/Timeline.tsx`) — this one is for chronological event\n * streams where each item has a `Date`.\n */\nexport function EventTimeline({\n events,\n orientation = 'vertical',\n groupBy,\n renderMarker,\n renderEvent,\n unstyled = false,\n className,\n style,\n}: EventTimelineProps) {\n const timelineLocale = useConfig().locale?.timeline\n const sorted = useMemo(() => {\n return [...events].sort((a, b) => toMs(a.date) - toMs(b.date))\n }, [events])\n\n const groups = useMemo<Group[]>(() => {\n if (!groupBy) {\n return [{ key: 'all', label: '', events: sorted }]\n }\n const out: Group[] = []\n let current: Group | null = null\n for (const ev of sorted) {\n const key = bucketKey(toMs(ev.date), groupBy)\n if (!current || current.key !== key) {\n current = {\n key,\n label: bucketLabel(toMs(ev.date), groupBy),\n events: [],\n }\n out.push(current)\n }\n current.events.push(ev)\n }\n return out\n }, [sorted, groupBy])\n\n const wrapperClass = unstyled\n ? className\n : ['sg-event-timeline', `sg-event-timeline-${orientation}`, className].filter(Boolean).join(' ')\n\n const wrapperStyle: CSSProperties = {\n display: 'flex',\n flexDirection: orientation === 'horizontal' ? 'row' : 'column',\n ...style,\n }\n\n return (\n <div\n className={wrapperClass}\n style={wrapperStyle}\n role=\"list\"\n aria-label={timelineLocale?.ariaLabel ?? 'Timeline'}\n data-orientation={orientation}\n data-group-by={groupBy ?? 'none'}\n >\n {groups.map((group) => (\n <Fragment key={group.key}>\n {groupBy && (\n <div\n className={unstyled ? undefined : 'sg-event-timeline-group'}\n data-group-key={group.key}\n >\n {group.label}\n </div>\n )}\n {group.events.map((ev) => {\n const marker = renderMarker ? (\n renderMarker(ev)\n ) : (\n <span\n className={unstyled ? undefined : 'sg-event-timeline-dot'}\n style={ev.color ? { background: ev.color } : undefined}\n aria-hidden=\"true\"\n />\n )\n const body = renderEvent ? (\n renderEvent(ev)\n ) : (\n <>\n <div className={unstyled ? undefined : 'sg-event-timeline-title'}>{ev.title}</div>\n {ev.description !== undefined && (\n <div className={unstyled ? undefined : 'sg-event-timeline-description'}>\n {ev.description}\n </div>\n )}\n </>\n )\n return (\n <div\n key={ev.id}\n className={unstyled ? undefined : 'sg-event-timeline-item'}\n role=\"listitem\"\n data-event-id={ev.id}\n data-event-time={toMs(ev.date)}\n >\n <div className={unstyled ? undefined : 'sg-event-timeline-marker'}>{marker}</div>\n <div className={unstyled ? undefined : 'sg-event-timeline-content'}>{body}</div>\n </div>\n )\n })}\n </Fragment>\n ))}\n </div>\n )\n}\n","import type { CSSProperties } from 'react'\nimport type { PrintableProp } from '../../../utils/print'\nimport type { ChartActionsProp } from './ChartHoverToolbar'\nimport type { ChartContextMenuHandler, ChartSeriesContextMenuHandler } from './chartContextMenu'\n\n/** A single category along the X axis. */\nexport type ChartCategory = string | number\n\n/** Numeric value for a series at a specific category. */\nexport type ChartValue = number | null\n\n/** One series — a logical line / bar / pie slice with a label and values. */\nexport interface ChartSeries {\n /** Unique identifier (used for keying React lists and color resolution). */\n id: string\n /** Human-readable label used in legend / tooltip. */\n label: string\n /** Optional explicit colour (CSS value). Defaults to a deterministic palette by index. */\n color?: string\n /**\n * Per-category values. Index N corresponds to `categories[N]`.\n * Use `null` to mark a gap (line will be split, bar will be hidden).\n */\n values: readonly ChartValue[]\n}\n\n/**\n * X axis configuration. Off by default — when `xAxis` is omitted no axis\n * elements are rendered (backward-compat with v0).\n */\nexport interface XAxisOptions {\n /**\n * Number of category ticks to render. If omitted or larger than the number\n * of categories, every category is labelled. Otherwise N evenly-spaced\n * categories are picked (always including the first and last).\n */\n tickCount?: number\n /** Format the visible category label. Default: `String(category)`. */\n tickFormatter?: (category: ChartCategory, index: number) => string\n /** Optional axis title rendered below the plot. */\n label?: string\n}\n\n/**\n * Y axis configuration. Off by default — when `yAxis` is omitted no axis\n * elements are rendered (backward-compat with v0).\n */\nexport interface YAxisOptions {\n /** Number of evenly-spaced ticks (including endpoints). @default 5 */\n tickCount?: number\n /** Format the visible numeric tick label. Default: short numeric. */\n tickFormatter?: (value: number) => string\n /** Optional axis title rendered to the left of the plot (rotated). */\n label?: string\n /** Render horizontal gridlines at each tick. @default false */\n gridLines?: boolean\n}\n\n/**\n * Animation configuration for chart mount / data transitions.\n *\n * - `true` / omitted — enable with default duration (600ms).\n * - `false` — disable entirely (no animation classes / styles applied).\n * - `{ duration: ms }` — explicit duration in milliseconds.\n *\n * Implementation is pure CSS (no `requestAnimationFrame` loops): we pass the\n * duration as a `--sg-chart-anim-duration` custom property on the animated\n * elements and let `@keyframes` in `charts.css` handle the timing.\n */\nexport type ChartAnimation = boolean | { duration?: number }\n\n/** Default animation duration in milliseconds (when `animate` is not given a number). */\nexport const DEFAULT_CHART_ANIMATION_MS = 600\n\n/** Resolves a `ChartAnimation` value into a normalized `{ enabled, duration }` shape. */\nexport function resolveChartAnimation(animate: ChartAnimation | undefined): {\n enabled: boolean\n duration: number\n} {\n if (animate === false) return { enabled: false, duration: 0 }\n if (animate === undefined || animate === true) {\n return { enabled: true, duration: DEFAULT_CHART_ANIMATION_MS }\n }\n return {\n enabled: true,\n duration: animate.duration ?? DEFAULT_CHART_ANIMATION_MS,\n }\n}\n\n/**\n * Builds a stable string key from a list of values that re-mounts animated\n * subtrees only when the data really changes (categories / series). Used as\n * `key={...}` on animated `<g>` groups so CSS animations re-trigger on data\n * updates, not on every render.\n */\nexport function chartDataKey(parts: readonly unknown[]): string {\n let out = ''\n for (let i = 0; i < parts.length; i++) {\n if (i > 0) out += '|'\n try {\n out += JSON.stringify(parts[i])\n } catch {\n out += String(parts[i])\n }\n }\n return out\n}\n\n/** Common shape for chart props. */\nexport interface BaseChartProps {\n /** Categories along the X axis. */\n categories: readonly ChartCategory[]\n /** One or more data series. */\n series: readonly ChartSeries[]\n /** Width of the chart in CSS units. Defaults to `'100%'`. */\n width?: number | string\n /** Height of the chart in pixels. Defaults to `200`. */\n height?: number\n /** Optional class name on the root SVG. */\n className?: string\n /** Optional inline style on the root SVG. */\n style?: CSSProperties\n /** Drop default `sg-chart-*` classes (headless mode). */\n unstyled?: boolean\n /** Padding around the plot area in pixels (number or [top, right, bottom, left]). */\n padding?: number | readonly [number, number, number, number]\n /** Show a small horizontal legend below the SVG. @default false */\n legend?: boolean\n /**\n * Mount / data-change animation toggle. Pure CSS, no rAF loops.\n * @default true\n */\n animate?: ChartAnimation\n /**\n * Optional X axis configuration. When omitted, no x-axis is rendered\n * (v0 backward-compat). When provided, ticks / labels / optional title\n * are drawn inside the SVG via `<ChartAxes>`.\n */\n xAxis?: XAxisOptions\n /**\n * Optional Y axis configuration. When omitted, no y-axis is rendered.\n * Set `gridLines: true` to draw horizontal grid lines across the plot.\n */\n yAxis?: YAxisOptions\n /**\n * Включает поддержку `ref.print()`. Сама печать триггерится императивно\n * через ref. `{ fileName }` задаёт имя popup-окна.\n * @default false\n */\n printable?: PrintableProp\n /**\n * Hover-toolbar в правом верхнем углу чарта с действиями (print, export\n * SVG/PNG, сброс brush). `true` — дефолтный набор; `ChartAction[]` —\n * кастомный. По умолчанию выключено.\n */\n actions?: ChartActionsProp\n /**\n * Базовое имя файла без расширения для экспортов SVG / PNG / print.\n * @default 'chart'\n */\n fileName?: string\n /**\n * Контекстное меню (правая кнопка) по элементу серии: line-segment,\n * marker, bar, area-path. Если задано — браузерное меню блокируется\n * `event.preventDefault()`.\n */\n onSeriesContextMenu?: ChartSeriesContextMenuHandler\n /**\n * Контекстное меню (правая кнопка) по плот-области чарта (вне серий).\n * Если задано — браузерное меню блокируется `event.preventDefault()`.\n */\n onChartContextMenu?: ChartContextMenuHandler\n}\n\n/** Default colour palette — uses tokens so charts re-theme without code changes. */\nexport const DEFAULT_PALETTE = [\n 'var(--sg-color-primary)',\n 'var(--sg-color-success)',\n 'var(--sg-color-warning)',\n 'var(--sg-color-error)',\n 'var(--sg-blue-4)',\n 'var(--sg-orange-5)',\n 'var(--sg-green-5)',\n 'var(--sg-red-5)',\n] as const\n\nexport function colorForSeries(series: ChartSeries, index: number): string {\n return series.color ?? DEFAULT_PALETTE[index % DEFAULT_PALETTE.length]!\n}\n\nexport function normalizePadding(p: BaseChartProps['padding']): [number, number, number, number] {\n if (p === undefined) return [16, 16, 24, 32]\n if (typeof p === 'number') return [p, p, p, p]\n return [...p]\n}\n\n/**\n * Default formatter used by Y-axis tick labels when consumers don't supply\n * their own. Exposed so {@link estimateYAxisLabelWidth} can probe sizing\n * without coupling to the renderer.\n */\nexport function defaultYTickFormatter(value: number): string {\n if (Number.isInteger(value)) return String(value)\n if (Math.abs(value) >= 1000) return value.toFixed(0)\n if (Math.abs(value) >= 1) return value.toFixed(2).replace(/\\.?0+$/, '')\n return value.toFixed(2)\n}\n\n/**\n * Estimate the rendered width (in user-space px) of the widest Y-axis tick\n * label produced for the [`min`, `max`] range. Heuristic — assumes a ~6.5 px\n * tabular digit metric at the 11 px font-size used in `ChartAxes`. Used by\n * the chart components to grow the left padding so multi-digit labels like\n * \"2617\" don't clip against the SVG edge.\n */\nexport function estimateYAxisLabelWidth(\n min: number,\n max: number,\n tickCount: number | undefined,\n formatter?: (value: number) => string,\n): number {\n const fmt = formatter ?? defaultYTickFormatter\n const count = Math.max(2, tickCount ?? 5)\n let maxLen = 0\n for (let i = 0; i < count; i++) {\n const t = i / (count - 1)\n const value = min + t * (max - min)\n const s = fmt(value)\n if (s.length > maxLen) maxLen = s.length\n }\n // ~7 px per glyph at font-size 11 (SVG text in ChartAxes). Conservative\n // upper bound — wide system fonts (e.g. Windows Segoe UI) can render digits\n // a touch wider than the geometric ideal.\n return maxLen * 7\n}\n\n/**\n * Resolve effective chart padding. When the user did not supply `padding`,\n * grow the left side so Y-axis tick labels fit. User-supplied padding is\n * honoured verbatim. Returns `[top, right, bottom, left]`.\n */\nexport function resolveChartPadding(\n userPadding: BaseChartProps['padding'],\n yAxis: YAxisOptions | undefined,\n yMin: number,\n yMax: number,\n): [number, number, number, number] {\n const base = normalizePadding(userPadding)\n if (userPadding !== undefined || !yAxis) return base\n const labelW = estimateYAxisLabelWidth(yMin, yMax, yAxis.tickCount, yAxis.tickFormatter)\n // TICK_LEN(4) + TICK_LABEL_GAP(6) + safety(8)\n const need = Math.ceil(labelW + 18)\n if (need > base[3]) base[3] = need\n if (yAxis.label) base[3] += 16\n return base\n}\n\nexport function chartBounds(values: readonly (readonly ChartValue[])[]): {\n min: number\n max: number\n} {\n let min = Infinity\n let max = -Infinity\n for (const row of values) {\n for (const v of row) {\n if (v === null || v === undefined) continue\n if (v < min) min = v\n if (v > max) max = v\n }\n }\n if (!Number.isFinite(min)) min = 0\n if (!Number.isFinite(max)) max = 0\n if (min === max) {\n if (min === 0) max = 1\n else {\n min = Math.min(0, min)\n }\n }\n return { min, max }\n}\n","import type { CSSProperties } from 'react'\nimport { colorForSeries } from './types'\nimport type { ChartSeries } from './types'\nimport { useConfig } from '../../ConfigProvider'\n\nexport interface ChartLegendProps {\n series: readonly ChartSeries[]\n className?: string\n style?: CSSProperties\n}\n\n/**\n * Minimal horizontal legend for charts. Renders below the SVG with one\n * `<span>` per series (colored swatch + label).\n */\nexport function ChartLegend({ series, className, style }: ChartLegendProps) {\n const chartsLocale = useConfig().locale?.charts\n return (\n <div\n className={['sg-chart-legend', className].filter(Boolean).join(' ')}\n role=\"list\"\n aria-label={chartsLocale?.legend ?? 'Chart legend'}\n style={style}\n >\n {series.map((s, i) => (\n <span key={s.id} role=\"listitem\" className=\"sg-chart-legend-item\">\n <span\n aria-hidden=\"true\"\n className=\"sg-chart-legend-swatch\"\n style={{ background: colorForSeries(s, i) }}\n />\n {s.label}\n </span>\n ))}\n </div>\n )\n}\n","import { Fragment } from 'react'\nimport type { ChartCategory } from './types'\n\n/** One labelled value to display 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 (in 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 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\n/**\n * Shared SVG overlay for chart crosshair / hover tooltip.\n *\n * Renders a vertical guide line at `x`, a small dot for each non-null series\n * value at the hovered category, and a tooltip card listing the values. The\n * tooltip flips to the left of the line when there is not enough space on the\n * right inside `[plotX, plotX + plotW]`.\n *\n * Pure presentational: no state, no listeners — the parent chart owns the\n * mouse logic and decides when to render this component.\n */\nexport function ChartCrosshair({\n x,\n plotX,\n plotY,\n plotH,\n plotW,\n category,\n points,\n unstyled,\n valueFormatter = defaultValueFormatter,\n}: ChartCrosshairProps) {\n const cls = (suffix: string) => (unstyled ? undefined : `sg-chart-crosshair-${suffix}`)\n\n const headerHeight = TIP_LINE_HEIGHT + 2\n const tipHeight = TIP_PADDING * 2 + headerHeight + points.length * TIP_LINE_HEIGHT\n\n const wantRight = x + TIP_GAP + TIP_WIDTH <= plotX + plotW\n const tipX = wantRight ? x + TIP_GAP : x - TIP_GAP - TIP_WIDTH\n const tipY = Math.max(plotY, Math.min(plotY + plotH - tipHeight, plotY + 4))\n\n return (\n <g\n className={unstyled ? undefined : 'sg-chart-crosshair'}\n data-sg-chart-crosshair=\"\"\n pointerEvents=\"none\"\n >\n <line\n className={cls('line')}\n data-sg-chart-crosshair-line=\"\"\n x1={x}\n x2={x}\n y1={plotY}\n y2={plotY + plotH}\n stroke=\"var(--sg-color-text-secondary)\"\n strokeWidth={1}\n strokeDasharray=\"3 3\"\n opacity={0.7}\n />\n\n {points.map((p, i) => (\n <circle\n key={`dot-${i}`}\n className={cls('dot')}\n data-sg-chart-crosshair-dot=\"\"\n cx={x}\n cy={p.y}\n r={3.5}\n fill={p.color}\n stroke=\"var(--sg-color-bg, #fff)\"\n strokeWidth={1.5}\n />\n ))}\n\n <g className={cls('tooltip')} data-sg-chart-crosshair-tooltip=\"\">\n <rect\n className={cls('tooltip-bg')}\n x={tipX}\n y={tipY}\n width={TIP_WIDTH}\n height={tipHeight}\n rx={4}\n ry={4}\n fill=\"var(--sg-color-bg, #fff)\"\n stroke=\"var(--sg-color-border)\"\n strokeWidth={1}\n />\n <text\n className={cls('tooltip-title')}\n x={tipX + TIP_PADDING}\n y={tipY + TIP_PADDING + TIP_LINE_HEIGHT - 3}\n fontSize={11}\n fontWeight={600}\n fill=\"var(--sg-color-text)\"\n >\n {String(category)}\n </text>\n {points.map((p, i) => {\n const rowY = tipY + TIP_PADDING + headerHeight + i * TIP_LINE_HEIGHT\n return (\n <Fragment key={`row-${i}`}>\n <rect\n x={tipX + TIP_PADDING}\n y={rowY + 2}\n width={8}\n height={8}\n rx={1}\n fill={p.color}\n />\n <text\n className={cls('tooltip-label')}\n x={tipX + TIP_PADDING + 12}\n y={rowY + TIP_LINE_HEIGHT - 3}\n fontSize={11}\n fill=\"var(--sg-color-text-secondary)\"\n >\n {p.label}\n </text>\n <text\n className={cls('tooltip-value')}\n x={tipX + TIP_WIDTH - TIP_PADDING}\n y={rowY + TIP_LINE_HEIGHT - 3}\n fontSize={11}\n fontWeight={500}\n fill=\"var(--sg-color-text)\"\n textAnchor=\"end\"\n >\n {valueFormatter(p.value)}\n </text>\n </Fragment>\n )\n })}\n </g>\n </g>\n )\n}\n","import { useMemo, useRef, useState, type CSSProperties } from 'react'\n\n/** Диапазон выделения, выраженный в индексах категорий (включительно). */\nexport interface ChartBrushRange {\n /** Стартовый индекс. Всегда `<= to`. */\n from: number\n /** Конечный индекс. Всегда `>= from`. */\n to: number\n}\n\n/**\n * Конфиг brushing-prop, который чарты пробрасывают в общий `<ChartBrush>`.\n * Принимает либо `boolean` (включить uncontrolled), либо объект.\n */\nexport interface ChartBrushConfig {\n /** Контролируемый диапазон. `null` — диапазон не выбран. */\n range?: ChartBrushRange | null\n /** Стартовый диапазон в uncontrolled-режиме. */\n defaultRange?: ChartBrushRange | null\n /**\n * Срабатывает на `pointerup` после drag и на `dblclick` (reset → `null`).\n * `from`/`to` — индексы категорий (целочисленные, `from <= to`).\n */\n onRangeChange?: (range: ChartBrushRange | null) => void\n /** Цвет заливки выделения. Дефолт — `var(--sg-color-primary)` с прозрачностью. */\n fill?: string\n /** Заблокировать создание / изменение brush — но контролируемый диапазон всё равно отрисуется. */\n disabled?: boolean\n}\n\n/** Резолвит `brush` prop в `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-области в SVG user-space. */\n plotX: number\n /** Верхняя граница plot-области в SVG user-space. */\n plotY: number\n /** Ширина plot-области. */\n plotW: number\n /** Высота plot-области. */\n plotH: number\n /** Количество категорий по X. Используется для маппинга x → index. */\n categoryCount: number\n /** Текущий диапазон выделения (контролируемый). `null` — не выделено. */\n range: ChartBrushRange | null\n /** Срабатывает при каждом завершении выделения / reset. */\n onRangeChange: (range: ChartBrushRange | null) => void\n /** Сбрасывает default-классы `.sg-chart-brush-*`. */\n unstyled?: boolean\n /** Цвет заливки. */\n fill?: string\n /** Полностью выключает интерактив, оставляя только визуал. */\n disabled?: boolean\n}\n\nconst DEFAULT_FILL = 'var(--sg-color-primary)'\n\n/** Конвертирует X в SVG user-space → индекс категории. */\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\n/** Возвращает X в SVG user-space по индексу категории. */\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\n/**\n * Brushing overlay: drag по plot-области → диапазон в `[from, to]` индексах\n * категорий. Двойной клик сбрасывает диапазон в `null`.\n *\n * Презентационный компонент: владеет временным dragging-state, но финальный\n * диапазон публикует через `onRangeChange`. Контролируемый `range` приходит\n * сверху и определяет, что отрисовать.\n */\nexport function ChartBrush({\n plotX,\n plotY,\n plotW,\n plotH,\n categoryCount,\n range,\n onRangeChange,\n unstyled,\n fill,\n disabled,\n}: ChartBrushProps) {\n const overlayRef = useRef<SVGRectElement | null>(null)\n const [drag, setDrag] = useState<{ startIdx: number; endIdx: number } | null>(null)\n\n // ---- helpers ----------------------------------------------------------\n\n const cls = (suffix: string) =>\n unstyled ? undefined : `sg-chart-brush-${suffix}`\n\n const clientToCategoryIndex = (clientX: number): number | null => {\n const overlay = overlayRef.current\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 не имплементит `svg.viewBox.baseVal` корректно, поэтому читаем\n // viewBox вручную из атрибута и фоллбэчимся на 600 (стандартный для\n // наших SVG-чартов).\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 // Игнорим — используем 600.\n }\n const localX = ((clientX - r.left) / r.width) * viewW\n return xToCategoryIndex(localX, plotX, plotW, categoryCount)\n }\n\n // ---- handlers ---------------------------------------------------------\n //\n // Все события — на самом overlay <rect>. setPointerCapture гарантирует,\n // что pointermove/pointerup приходят даже если курсор покинул overlay.\n // В jsdom setPointerCapture может быть no-op — оборачиваем в try/catch.\n\n const safeSetCapture = (el: SVGRectElement, id: number) => {\n try {\n el.setPointerCapture?.(id)\n } catch {\n // jsdom / старые браузеры — игнорируем.\n }\n }\n\n const safeReleaseCapture = (el: SVGRectElement, id: number) => {\n try {\n el.releasePointerCapture?.(id)\n } catch {\n // как выше\n }\n }\n\n const handlePointerDown = (e: React.PointerEvent<SVGRectElement>) => {\n if (disabled || categoryCount === 0) return\n const idx = clientToCategoryIndex(e.clientX)\n if (idx === null) return\n e.preventDefault()\n safeSetCapture(e.currentTarget, e.pointerId)\n setDrag({ startIdx: idx, endIdx: idx })\n }\n\n const handlePointerMove = (e: React.PointerEvent<SVGRectElement>) => {\n if (!drag) return\n const idx = clientToCategoryIndex(e.clientX)\n if (idx === null) return\n setDrag((prev) => (prev ? { ...prev, endIdx: idx } : prev))\n }\n\n const handlePointerUp = (e: React.PointerEvent<SVGRectElement>) => {\n if (!drag) return\n safeReleaseCapture(e.currentTarget, e.pointerId)\n const idx = clientToCategoryIndex(e.clientX)\n const finalEnd = idx ?? drag.endIdx\n const from = Math.min(drag.startIdx, finalEnd)\n const to = Math.max(drag.startIdx, finalEnd)\n onRangeChange({ from, to })\n setDrag(null)\n }\n\n const handlePointerCancel = (e: React.PointerEvent<SVGRectElement>) => {\n if (!drag) return\n safeReleaseCapture(e.currentTarget, e.pointerId)\n setDrag(null)\n }\n\n const handleDoubleClick = (e: React.MouseEvent<SVGRectElement>) => {\n if (disabled) return\n e.preventDefault()\n onRangeChange(null)\n }\n\n // ---- visual selection -------------------------------------------------\n\n const liveSelection = useMemo<ChartBrushRange | null>(() => {\n if (drag) {\n const from = Math.min(drag.startIdx, drag.endIdx)\n const to = Math.max(drag.startIdx, drag.endIdx)\n return { from, to }\n }\n if (range) {\n const from = Math.min(range.from, range.to)\n const to = Math.max(range.from, range.to)\n return {\n from: Math.max(0, Math.min(categoryCount - 1, from)),\n to: Math.max(0, Math.min(categoryCount - 1, to)),\n }\n }\n return null\n }, [drag, range, categoryCount])\n\n const selectionRect = liveSelection\n ? (() => {\n const x1 = categoryIndexToX(liveSelection.from, plotX, plotW, categoryCount)\n const x2 = categoryIndexToX(liveSelection.to, plotX, plotW, categoryCount)\n const left = Math.min(x1, x2)\n const right = Math.max(x1, x2)\n // Минимальная ширина 2px — чтобы выделение из одной точки было видимым.\n const w = Math.max(2, right - left)\n return { left, w }\n })()\n : null\n\n const fillColor = fill ?? DEFAULT_FILL\n const overlayStyle: CSSProperties | undefined = disabled\n ? { cursor: 'not-allowed' }\n : { cursor: 'crosshair' }\n\n return (\n <g\n className={unstyled ? undefined : 'sg-chart-brush'}\n data-sg-chart-brush=\"\"\n >\n <rect\n ref={overlayRef}\n className={cls('overlay')}\n data-sg-chart-brush-overlay=\"\"\n x={plotX}\n y={plotY}\n width={Math.max(0, plotW)}\n height={Math.max(0, plotH)}\n fill=\"transparent\"\n style={overlayStyle}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerCancel}\n onDoubleClick={handleDoubleClick}\n />\n {selectionRect && (\n <rect\n className={cls('selection')}\n data-sg-chart-brush-selection=\"\"\n x={selectionRect.left}\n y={plotY}\n width={selectionRect.w}\n height={Math.max(0, plotH)}\n fill={fillColor}\n fillOpacity={0.15}\n stroke={fillColor}\n strokeOpacity={0.5}\n strokeWidth={1}\n pointerEvents=\"none\"\n />\n )}\n </g>\n )\n}\n","import { forwardRef, useMemo, useRef, useState, type CSSProperties, type ForwardedRef } from 'react'\nimport {\n chartBounds,\n chartDataKey,\n colorForSeries,\n resolveChartPadding,\n resolveChartAnimation,\n} from './types'\nimport { ChartLegend } from './ChartLegend'\nimport { ChartAxes } from './ChartAxes'\nimport { ChartCrosshair, type ChartCrosshairPoint } from './ChartCrosshair'\nimport {\n ChartBrush,\n resolveBrushConfig,\n type ChartBrushConfig,\n type ChartBrushRange,\n} from './ChartBrush'\nimport type { BaseChartProps } from './types'\nimport { useChartPrint, type ChartRef } from './chartRef'\nimport { useChartSize } from './useChartSize'\nimport { ChartHoverToolbar, resolveChartActions } from './ChartHoverToolbar'\nimport { makeChartContextMenuHandler, makeSeriesContextMenuHandler } from './chartContextMenu'\nimport { useConfig } from '../../ConfigProvider'\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\nexport interface LineChartProps extends BaseChartProps {\n /** Show small dot markers at each data point. @default true */\n markers?: boolean\n /** Stroke width in pixels. @default 2 */\n strokeWidth?: number\n /**\n * Hover crosshair with a vertical guide line and per-series value tooltip.\n * @default false\n */\n crosshair?: LineChartCrosshair\n /**\n * Brush для drag-выбора диапазона по X. `true` — uncontrolled с пустым\n * стартовым значением; объект — `ChartBrushConfig`. См. `ChartBrush`.\n */\n brush?: boolean | ChartBrushConfig\n}\n\n/**\n * SVG line chart with optional axes, legend, hover crosshair, and CSS\n * mount / data-change animation. Theming via `--sg-color-*` tokens; line\n * \"draw-in\" effect uses pure-CSS `stroke-dashoffset` per segment (no rAF).\n *\n * Responsive: SVG `viewBox` пересчитывается в реальные пиксели контейнера\n * через `useChartSize` (ResizeObserver). `preserveAspectRatio` не задан —\n * один CSS-пиксель = один user-space-unit, без растягивания. На stroke-\n * элементах включён `vector-effect=\"non-scaling-stroke\"` — толщина линии\n * стабильна при печати / zoom.\n */\nfunction LineChartInner(\n {\n categories,\n series,\n width = '100%',\n height = 200,\n className,\n style,\n unstyled = false,\n padding,\n markers = true,\n strokeWidth = 2,\n legend = false,\n xAxis,\n yAxis,\n animate,\n crosshair = false,\n brush,\n printable,\n actions,\n fileName,\n onSeriesContextMenu,\n onChartContextMenu,\n }: LineChartProps,\n forwardedRef: ForwardedRef<ChartRef>,\n) {\n const chartsLocale = useConfig().locale?.charts\n const { rootRef } = useChartPrint<Element>(forwardedRef, printable)\n const svgRef = useRef<SVGSVGElement | null>(null)\n\n const { min, max } = useMemo(() => chartBounds(series.map((s) => s.values)), [series])\n const [pt, pr, pb, pl] = useMemo(\n () => resolveChartPadding(padding, yAxis, min, max),\n [padding, yAxis, min, max],\n )\n\n const fallbackW = typeof width === 'number' && Number.isFinite(width) ? width : 600\n const fallbackH = typeof height === 'number' && Number.isFinite(height) ? height : 200\n const measured = useChartSize<SVGSVGElement>(svgRef, { width: fallbackW, height: fallbackH })\n const viewW = measured.width\n const viewH = measured.height\n const plotW = Math.max(0, viewW - pl - pr)\n const plotH = Math.max(0, viewH - pt - pb)\n\n const range = max - min || 1\n const xStep = categories.length > 1 ? plotW / (categories.length - 1) : 0\n\n function xFor(i: number) {\n return pl + i * xStep\n }\n function yFor(v: number) {\n return pt + (1 - (v - min) / range) * plotH\n }\n\n const wrapperClass = unstyled\n ? className\n : ['sg-chart', 'sg-chart-line', className].filter(Boolean).join(' ')\n\n const anim = resolveChartAnimation(animate)\n const animKey = useMemo(\n () => chartDataKey([categories, series.map((s) => s.values)]),\n [categories, series],\n )\n const animStyle: CSSProperties | undefined = anim.enabled\n ? ({ ['--sg-chart-anim-duration' as string]: `${anim.duration}ms` } as CSSProperties)\n : undefined\n const animClass = anim.enabled && !unstyled ? 'sg-chart-line-animate' : undefined\n\n const crosshairEnabled = crosshair !== false && categories.length > 0\n const crosshairFmt =\n typeof crosshair === 'object' && crosshair !== null ? crosshair.valueFormatter : undefined\n const [hoverIdx, setHoverIdx] = useState<number | null>(null)\n\n const brushConfig = resolveBrushConfig(brush)\n const isBrushControlled = brushConfig != null && 'range' in brushConfig\n const [internalBrushRange, setInternalBrushRange] = useState<ChartBrushRange | null>(\n brushConfig?.defaultRange ?? null,\n )\n const effectiveBrushRange = isBrushControlled ? (brushConfig!.range ?? null) : internalBrushRange\n const handleBrushChange = (next: ChartBrushRange | null) => {\n if (!isBrushControlled) setInternalBrushRange(next)\n brushConfig?.onRangeChange?.(next)\n }\n\n const handleMouseMove = (e: React.MouseEvent<SVGSVGElement>) => {\n if (!crosshairEnabled) return\n const svg = e.currentTarget\n const rect = svg.getBoundingClientRect()\n if (rect.width === 0) return\n const localX = ((e.clientX - rect.left) / rect.width) * viewW\n if (categories.length === 1) {\n setHoverIdx(localX >= pl - xStep / 2 && localX <= pl + xStep / 2 + plotW ? 0 : null)\n return\n }\n const rawIdx = Math.round((localX - pl) / xStep)\n if (rawIdx < 0 || rawIdx >= categories.length) {\n setHoverIdx(null)\n return\n }\n setHoverIdx(rawIdx)\n }\n\n const handleMouseLeave = () => {\n if (crosshairEnabled) setHoverIdx(null)\n }\n\n const crosshairPoints: ChartCrosshairPoint[] = useMemo(() => {\n if (hoverIdx === null) return []\n const out: ChartCrosshairPoint[] = []\n series.forEach((s, sIdx) => {\n const v = s.values[hoverIdx]\n if (v === null || v === undefined) return\n out.push({\n label: s.label,\n value: v,\n color: colorForSeries(s, sIdx),\n y: pt + (1 - (v - min) / range) * plotH,\n })\n })\n return out\n }, [hoverIdx, series, pt, plotH, min, range])\n\n // ─── toolbar / context menu wiring ──────────────────────────────────\n const brushReset = brushConfig\n ? () => {\n if (!isBrushControlled) setInternalBrushRange(null)\n brushConfig.onRangeChange?.(null)\n }\n : undefined\n const resolvedActions = resolveChartActions(actions, { fileName, brushReset })\n const [toolbarVisible, setToolbarVisible] = useState(false)\n const handleSvgContextMenu = makeChartContextMenuHandler(onChartContextMenu)\n\n const setSvgRef = (el: SVGSVGElement | null) => {\n svgRef.current = el\n if (!legend) (rootRef as React.MutableRefObject<Element | null>).current = el\n }\n\n const svg = (\n <svg\n ref={setSvgRef}\n className={wrapperClass}\n style={legend || resolvedActions ? undefined : style}\n width={width}\n height={height}\n viewBox={`0 0 ${viewW} ${viewH}`}\n role=\"img\"\n aria-label={chartsLocale?.lineChart ?? 'Line chart'}\n onMouseMove={crosshairEnabled ? handleMouseMove : undefined}\n onMouseLeave={crosshairEnabled ? handleMouseLeave : undefined}\n onContextMenu={handleSvgContextMenu}\n >\n <ChartAxes\n plotX={pl}\n plotY={pt}\n plotW={plotW}\n plotH={plotH}\n min={min}\n max={max}\n categories={categories}\n xAxis={xAxis}\n yAxis={yAxis}\n unstyled={unstyled}\n />\n {series.map((s, sIdx) => {\n const stroke = colorForSeries(s, sIdx)\n const segments: { from: [number, number]; to: [number, number]; valueIndex: number }[] = []\n let prev: { pt: [number, number]; idx: number } | null = null\n s.values.forEach((v, i) => {\n if (v === null || v === undefined) {\n prev = null\n return\n }\n const point: [number, number] = [xFor(i), yFor(v)]\n if (prev) segments.push({ from: prev.pt, to: point, valueIndex: i })\n prev = { pt: point, idx: i }\n })\n const segCount = segments.length\n return (\n <g key={`${s.id}-${animKey}`} className={animClass} style={animStyle}>\n {segments.map((seg, segIdx) => {\n const len = Math.hypot(seg.to[0] - seg.from[0], seg.to[1] - seg.from[1])\n const segStyle: CSSProperties | undefined = anim.enabled\n ? {\n strokeDasharray: len,\n strokeDashoffset: len,\n animationDelay: `${(segIdx / Math.max(1, segCount)) * anim.duration}ms`,\n animationDuration: `${anim.duration / Math.max(1, segCount)}ms`,\n }\n : undefined\n return (\n <line\n key={segIdx}\n className={\n anim.enabled && !unstyled ? 'sg-chart-line-segment-animate' : undefined\n }\n x1={seg.from[0]}\n y1={seg.from[1]}\n x2={seg.to[0]}\n y2={seg.to[1]}\n stroke={stroke}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n vectorEffect=\"non-scaling-stroke\"\n style={segStyle}\n onContextMenu={makeSeriesContextMenuHandler(onSeriesContextMenu, {\n seriesId: s.id,\n seriesIndex: sIdx,\n valueIndex: seg.valueIndex,\n value: s.values[seg.valueIndex] ?? undefined,\n })}\n />\n )\n })}\n {markers &&\n s.values.map((v, i) => {\n if (v === null || v === undefined) return null\n return (\n <circle\n key={i}\n cx={xFor(i)}\n cy={yFor(v)}\n r={Math.max(2, strokeWidth)}\n fill={stroke}\n onContextMenu={makeSeriesContextMenuHandler(onSeriesContextMenu, {\n seriesId: s.id,\n seriesIndex: sIdx,\n valueIndex: i,\n value: v,\n })}\n >\n <title>{`${s.label} · ${categories[i]}: ${v}`}</title>\n </circle>\n )\n })}\n </g>\n )\n })}\n {crosshairEnabled && hoverIdx !== null && crosshairPoints.length > 0 && (\n <ChartCrosshair\n x={xFor(hoverIdx)}\n plotX={pl}\n plotY={pt}\n plotH={plotH}\n plotW={plotW}\n category={categories[hoverIdx]!}\n points={crosshairPoints}\n unstyled={unstyled}\n valueFormatter={crosshairFmt}\n />\n )}\n {brushConfig && (\n <ChartBrush\n plotX={pl}\n plotY={pt}\n plotW={plotW}\n plotH={plotH}\n categoryCount={categories.length}\n range={effectiveBrushRange}\n onRangeChange={handleBrushChange}\n unstyled={unstyled}\n fill={brushConfig.fill}\n disabled={brushConfig.disabled}\n />\n )}\n </svg>\n )\n\n const needsWrapper = legend || !!resolvedActions\n if (!needsWrapper) return svg\n\n return (\n <div\n ref={legend ? (rootRef as React.RefObject<HTMLDivElement>) : undefined}\n className={unstyled ? undefined : 'sg-chart-wrapper'}\n style={style}\n onMouseEnter={resolvedActions ? () => setToolbarVisible(true) : undefined}\n onMouseLeave={resolvedActions ? () => setToolbarVisible(false) : undefined}\n onFocus={resolvedActions ? () => setToolbarVisible(true) : undefined}\n onBlur={resolvedActions ? () => setToolbarVisible(false) : undefined}\n >\n {resolvedActions && (\n <ChartHoverToolbar\n visible={toolbarVisible}\n actions={resolvedActions}\n fileName={fileName}\n getSvg={() => svgRef.current}\n brushReset={brushReset}\n unstyled={unstyled}\n />\n )}\n {svg}\n {legend && <ChartLegend series={series} />}\n </div>\n )\n}\n\nexport const LineChart = forwardRef<ChartRef, LineChartProps>(LineChartInner)\nLineChart.displayName = 'LineChart'\n","import { Fragment } from 'react'\r\nimport type { ChartCategory, XAxisOptions, YAxisOptions } from './types'\r\n\r\n/**\r\n * Internal helper — renders X and / or Y axes on top of an existing chart\r\n * SVG. Stays a pure presentational component (no hooks, no state) so it can\r\n * be used inside Line / Bar / Area without affecting their existing layout.\r\n *\r\n * Both `xAxis` and `yAxis` are optional; if neither is provided the\r\n * component renders nothing (preserves the v0 \"no chrome\" look).\r\n *\r\n * Coordinates are in the parent SVG's user space:\r\n * - `(plotX, plotY)` is the top-left corner of the plot area.\r\n * - `plotW` / `plotH` are the plot dimensions in pixels.\r\n * - `min` / `max` bound the numeric Y range that the plot maps to.\r\n *\r\n * `xPositions` is optional: when provided it overrides the default\r\n * \"evenly-spaced\" placement (used by Line / Area). BarChart passes its own\r\n * group centres so ticks align with the visual middle of each bar group.\r\n */\r\nexport interface ChartAxesProps {\r\n /** Top-left X of the plot area. */\r\n plotX: number\r\n /** Top-left Y of the plot area. */\r\n plotY: number\r\n /** Plot area width in pixels. */\r\n plotW: number\r\n /** Plot area height in pixels. */\r\n plotH: number\r\n /** Lower bound of the numeric Y range. */\r\n min: number\r\n /** Upper bound of the numeric Y range. */\r\n max: number\r\n /** X-axis categories. Used to label ticks. */\r\n categories: readonly ChartCategory[]\r\n /**\r\n * Optional explicit X position per category (in plot coordinates). When\r\n * omitted, ticks are placed evenly: `plotX + i * plotW / (n - 1)`.\r\n */\r\n xPositions?: readonly number[]\r\n /** X-axis configuration. Omit to skip the X axis entirely. */\r\n xAxis?: XAxisOptions\r\n /** Y-axis configuration. Omit to skip the Y axis entirely. */\r\n yAxis?: YAxisOptions\r\n /** Drop default `sg-chart-axis-*` class names. */\r\n unstyled?: boolean\r\n}\r\n\r\nconst DEFAULT_Y_TICKS = 5\r\nconst TICK_LEN = 4\r\nconst TICK_LABEL_GAP = 6\r\n\r\nfunction defaultYFormatter(value: number): string {\r\n if (Number.isInteger(value)) return String(value)\r\n if (Math.abs(value) >= 1000) return value.toFixed(0)\r\n if (Math.abs(value) >= 1) return value.toFixed(2).replace(/\\.?0+$/, '')\r\n return value.toFixed(2)\r\n}\r\n\r\nfunction pickXIndices(total: number, tickCount: number | undefined): number[] {\r\n if (total <= 0) return []\r\n if (tickCount === undefined || tickCount >= total) {\r\n return Array.from({ length: total }, (_, i) => i)\r\n }\r\n const k = Math.max(2, tickCount)\r\n const step = total - 1\r\n const seen = new Set<number>()\r\n const out: number[] = []\r\n for (let i = 0; i < k; i++) {\r\n const idx = Math.round((i / (k - 1)) * step)\r\n if (!seen.has(idx)) {\r\n seen.add(idx)\r\n out.push(idx)\r\n }\r\n }\r\n return out\r\n}\r\n\r\nexport function ChartAxes({\r\n plotX,\r\n plotY,\r\n plotW,\r\n plotH,\r\n min,\r\n max,\r\n categories,\r\n xPositions,\r\n xAxis,\r\n yAxis,\r\n unstyled = false,\r\n}: ChartAxesProps) {\r\n if (!xAxis && !yAxis) return null\r\n\r\n const yTickCount = Math.max(2, yAxis?.tickCount ?? DEFAULT_Y_TICKS)\r\n const range = max - min || 1\r\n const yTicks: { value: number; y: number }[] = []\r\n if (yAxis) {\r\n for (let i = 0; i < yTickCount; i++) {\r\n const t = i / (yTickCount - 1)\r\n const value = min + t * range\r\n const y = plotY + plotH - t * plotH\r\n yTicks.push({ value, y })\r\n }\r\n }\r\n\r\n const categoryCount = categories.length\r\n const defaultXFor = (i: number) =>\r\n categoryCount > 1 ? plotX + (i / (categoryCount - 1)) * plotW : plotX + plotW / 2\r\n const xFor = (i: number) => xPositions?.[i] ?? defaultXFor(i)\r\n\r\n const xIndices = xAxis ? pickXIndices(categoryCount, xAxis.tickCount) : []\r\n\r\n const yFmt = yAxis?.tickFormatter ?? defaultYFormatter\r\n const xFmt = xAxis?.tickFormatter\r\n\r\n const cls = (suffix: string) => (unstyled ? undefined : `sg-chart-axis-${suffix}`)\r\n\r\n return (\r\n <g\r\n className={unstyled ? undefined : 'sg-chart-axis'}\r\n data-sg-chart-axes=\"\"\r\n pointerEvents=\"none\"\r\n >\r\n {yAxis?.gridLines &&\r\n yTicks.map((t, i) => (\r\n <line\r\n key={`yg-${i}`}\r\n className={cls('grid')}\r\n data-sg-axis-grid=\"\"\r\n x1={plotX}\r\n x2={plotX + plotW}\r\n y1={t.y}\r\n y2={t.y}\r\n stroke=\"var(--sg-color-border-secondary, var(--sg-color-border))\"\r\n strokeWidth={1}\r\n strokeDasharray=\"2 2\"\r\n />\r\n ))}\r\n\r\n {yAxis && (\r\n <g className={cls('y')} data-sg-axis=\"y\">\r\n <line\r\n x1={plotX}\r\n x2={plotX}\r\n y1={plotY}\r\n y2={plotY + plotH}\r\n stroke=\"var(--sg-color-border)\"\r\n strokeWidth={1}\r\n />\r\n {yTicks.map((t, i) => (\r\n <Fragment key={`yt-${i}`}>\r\n <line\r\n className={cls('tick')}\r\n data-sg-axis-tick=\"y\"\r\n x1={plotX - TICK_LEN}\r\n x2={plotX}\r\n y1={t.y}\r\n y2={t.y}\r\n stroke=\"var(--sg-color-border)\"\r\n strokeWidth={1}\r\n />\r\n <text\r\n className={cls('tick-label')}\r\n data-sg-axis-tick-label=\"y\"\r\n x={plotX - TICK_LEN - TICK_LABEL_GAP}\r\n y={t.y}\r\n fontSize={11}\r\n fill=\"var(--sg-color-text-secondary)\"\r\n textAnchor=\"end\"\r\n dominantBaseline=\"central\"\r\n >\r\n {yFmt(t.value)}\r\n </text>\r\n </Fragment>\r\n ))}\r\n {yAxis.label && (\r\n <text\r\n className={cls('label')}\r\n data-sg-axis-label=\"y\"\r\n fontSize={11}\r\n fontWeight={600}\r\n fill=\"var(--sg-color-text)\"\r\n textAnchor=\"middle\"\r\n dominantBaseline=\"hanging\"\r\n transform={`translate(2, ${plotY + plotH / 2}) rotate(-90)`}\r\n >\r\n {yAxis.label}\r\n </text>\r\n )}\r\n </g>\r\n )}\r\n\r\n {xAxis && categoryCount > 0 && (\r\n <g className={cls('x')} data-sg-axis=\"x\">\r\n <line\r\n x1={plotX}\r\n x2={plotX + plotW}\r\n y1={plotY + plotH}\r\n y2={plotY + plotH}\r\n stroke=\"var(--sg-color-border)\"\r\n strokeWidth={1}\r\n />\r\n {xIndices.map((idx) => {\r\n const cx = xFor(idx)\r\n const cat = categories[idx]!\r\n const text = xFmt ? xFmt(cat, idx) : String(cat)\r\n return (\r\n <Fragment key={`xt-${idx}`}>\r\n <line\r\n className={cls('tick')}\r\n data-sg-axis-tick=\"x\"\r\n x1={cx}\r\n x2={cx}\r\n y1={plotY + plotH}\r\n y2={plotY + plotH + TICK_LEN}\r\n stroke=\"var(--sg-color-border)\"\r\n strokeWidth={1}\r\n />\r\n <text\r\n className={cls('tick-label')}\r\n data-sg-axis-tick-label=\"x\"\r\n x={cx}\r\n y={plotY + plotH + TICK_LEN + TICK_LABEL_GAP}\r\n fontSize={11}\r\n fill=\"var(--sg-color-text-secondary)\"\r\n textAnchor=\"middle\"\r\n dominantBaseline=\"hanging\"\r\n >\r\n {text}\r\n </text>\r\n </Fragment>\r\n )\r\n })}\r\n {xAxis.label && (\r\n <text\r\n className={cls('label')}\r\n data-sg-axis-label=\"x\"\r\n x={plotX + plotW / 2}\r\n y={plotY + plotH + TICK_LEN + TICK_LABEL_GAP + 14}\r\n fontSize={11}\r\n fontWeight={600}\r\n fill=\"var(--sg-color-text)\"\r\n textAnchor=\"middle\"\r\n dominantBaseline=\"hanging\"\r\n >\r\n {xAxis.label}\r\n </text>\r\n )}\r\n </g>\r\n )}\r\n </g>\r\n )\r\n}\r\n","import { useCallback, useImperativeHandle, useMemo, useRef, type ForwardedRef } from 'react'\nimport { printElement } from '../../../utils/print'\nimport type { PrintOptions, PrintableProp } from '../../../utils/print'\n\n/** Imperative API общая для LineChart / BarChart / AreaChart / PieChart. */\nexport interface ChartRef {\n /**\n * Открыть popup и вызвать window.print() для DOM-области графика.\n * `customStyles` / `pageSize` / `orientation` мерджатся с тем, что задано\n * в prop `printable`.\n */\n print: (opts?: PrintOptions) => void\n}\n\n/**\n * Хук, инкапсулирующий ref на корень SVG/wrapper и `useImperativeHandle`,\n * чтобы все Chart*-компоненты экспонировали одинаковый ref.print().\n */\nexport function useChartPrint<T extends Element>(\n forwardedRef: ForwardedRef<ChartRef>,\n printable: PrintableProp | undefined,\n): { rootRef: React.RefObject<T | null> } {\n const rootRef = useRef<T | null>(null)\n\n const printOptionsFromProp = useMemo<PrintOptions>(() => {\n if (typeof printable === 'object' && printable !== null) {\n return { fileName: printable.fileName }\n }\n return {}\n }, [printable])\n\n const doPrint = useCallback(\n (opts?: PrintOptions) => {\n printElement(rootRef.current, { ...printOptionsFromProp, ...(opts ?? {}) })\n },\n [printOptionsFromProp],\n )\n\n useImperativeHandle(forwardedRef, () => ({ print: doPrint }), [doPrint])\n\n return { rootRef }\n}\n","import { useEffect, useRef, useState } from 'react'\n\n/** Измеренный размер контейнера / SVG-элемента в пикселях. */\nexport interface ChartSize {\n /** Целочисленная ширина контейнера в CSS-пикселях. */\n width: number\n /** Целочисленная высота контейнера в CSS-пикселях. */\n height: number\n}\n\n/**\n * Хук, отслеживающий реальный размер DOM-элемента через `ResizeObserver`.\n *\n * Возвращает `{ width, height }` в CSS-пикселях. До первого срабатывания\n * RO (или в окружениях без `ResizeObserver` — SSR / jsdom) отдаёт\n * `fallback`. Это безопасно для рендера до mount-а: чарты используют\n * fallback-размеры (как правило, дефолтные `600 × height`-prop), а после\n * mount-а — пересчитываются по реальному размеру контейнера.\n *\n * Округление результата исключает суб-пиксельные дёрганья при resize-loop\n * (один пиксель туда-сюда из-за zoom / scrollbar).\n *\n * Не реагирует на смену самого `ref` (наблюдает только текущий\n * `ref.current`); в SkyGraph-чартах ref стабилен на всю жизнь компонента,\n * поэтому это ok.\n */\nexport function useChartSize<T extends Element>(\n ref: React.RefObject<T | null>,\n fallback: ChartSize,\n): ChartSize {\n const [size, setSize] = useState<ChartSize>(fallback)\n // Храним последнее измерение в ref, чтобы избежать setState с тем же\n // значением (и лишней перерисовки) на повторных RO-эвентах.\n const lastRef = useRef<ChartSize>(size)\n\n useEffect(() => {\n const el = ref.current\n if (!el) return undefined\n\n const apply = (w: number, h: number) => {\n if (!Number.isFinite(w) || !Number.isFinite(h)) return\n if (w <= 0 || h <= 0) return\n const next: ChartSize = { width: Math.round(w), height: Math.round(h) }\n const prev = lastRef.current\n if (prev.width === next.width && prev.height === next.height) return\n lastRef.current = next\n setSize(next)\n }\n\n if (typeof ResizeObserver === 'undefined') {\n const r = el.getBoundingClientRect()\n apply(r.width, r.height)\n return undefined\n }\n\n const ro = new ResizeObserver((entries) => {\n const entry = entries[0]\n if (!entry) return\n // `contentRect` доступен везде; `borderBoxSize` (Chrome) даёт более\n // точные данные, но `contentRect` достаточно для CSS-пикселей плот-\n // области.\n const cr = entry.contentRect\n apply(cr.width, cr.height)\n })\n\n // Сразу подхватываем текущий размер до первого RO-callback (RO\n // диспатчит первый event асинхронно).\n const r = el.getBoundingClientRect()\n apply(r.width, r.height)\n\n ro.observe(el)\n return () => ro.disconnect()\n }, [ref])\n\n return size\n}\n","/**\n * Экспорт SVG-чарта в файл (SVG / PNG) — без runtime-зависимостей.\n *\n * Используем штатный `XMLSerializer` + `URL.createObjectURL` + `Image` +\n * `<canvas>.toBlob`; выгрузка через невидимый `<a download>`. Никакого\n * `dom-to-image` / `html2canvas` / `canvg` — браузер сам всё умеет.\n */\n\nconst SVG_NS = 'http://www.w3.org/2000/svg'\nconst XLINK_NS = 'http://www.w3.org/1999/xlink'\n\n/** Размер выгружаемого PNG в CSS-пикселях. */\nexport interface PngSize {\n /** Ширина PNG в CSS-пикселях. */\n width: number\n /** Высота PNG в CSS-пикселях. */\n height: number\n}\n\n/** Параметры PNG-экспорта. */\nexport interface DownloadPngOptions {\n /** Имя файла без расширения / с `.png`. По умолчанию `chart.png`. */\n fileName?: string\n /**\n * Множитель плотности пикселей. По умолчанию `window.devicePixelRatio`\n * (или `2` если `window` нет). Файл получает `width × scale` пикселей,\n * но визуально — нормальные `width` CSS-пикселей.\n */\n scale?: number\n /** Цвет фона. По умолчанию `transparent` — экспорт с прозрачным фоном. */\n background?: string\n}\n\n/**\n * Сериализует `<svg>` в строку с inline `width` / `height` и явными\n * пространствами имён. Принимает оригинальный элемент — не модифицирует\n * его (работаем с глубокой копией).\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/** Триггерит загрузку blob-а под именем `fileName` через невидимый `<a>`. */\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 // На некоторых браузерах нужно вставить в DOM перед click().\n a.style.display = 'none'\n document.body.appendChild(a)\n a.click()\n document.body.removeChild(a)\n // Освобождаем object-URL после короткой задержки — браузер ещё может\n // тянуть данные на момент клика.\n setTimeout(() => {\n try {\n URL.revokeObjectURL(url)\n } catch {\n // ignore\n }\n }, 100)\n}\n\n/** Гарантирует расширение в имени файла. */\nfunction ensureExt(name: string, ext: string): string {\n return name.endsWith(`.${ext}`) ? name : `${name}.${ext}`\n}\n\n/** Измеряет рабочий размер SVG: real DOM size → viewBox → fallback. */\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 * Скачивает текущий SVG-чарт как `.svg`-файл с явными `width` / `height`,\n * чтобы файл нормально открывался в любом просмотрщике.\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 * Конвертирует SVG-чарт в PNG через штатный browser-canvas и скачивает\n * результат. Возвращает `Promise<void>`, который резолвится после клика\n * `<a download>` или реджектится при сбое декодирования SVG.\n *\n * Стратегия:\n * 1. Сериализуем SVG → object-URL.\n * 2. Грузим в `Image` (браузер сам декодирует SVG как растр).\n * 3. Рисуем на `<canvas>` с devicePixelRatio-масштабом → `.toBlob('image/png')`.\n * 4. Триггерим скачивание через `<a download>`.\n *\n * Альтернатива — `OffscreenCanvas`. Не используем: поддержка хуже, в\n * Safari < 17 нет, для маленьких чартов выигрыша нет. См. отчёт раунда.\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 =\n 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","import type { CSSProperties, ReactNode } from 'react'\nimport { downloadSvg, downloadSvgAsPng } from './chartExport'\nimport { printElement } from '../../../utils/print'\nimport { useConfig } from '../../ConfigProvider'\n\n/**\n * Контекст, передаваемый в `onClick` каждой `ChartAction`. Содержит ссылку\n * на корневой `<svg>` чарта, опциональное имя файла для экспортов и\n * утилиты сброса brush / переключения легенды (если эти сценарии включены\n * вызывающей стороной).\n */\nexport interface ChartActionContext {\n /** Корневой SVG-элемент текущего чарта. */\n svg: SVGSVGElement\n /** Базовое имя файла без расширения (используется print / SVG / PNG). */\n fileName?: string\n /** Сбросить активный brush — определён только если у чарта `brush` включён. */\n brushReset?: () => void\n /** Переключить отображение легенды — userland-сценарий, не определён по умолчанию. */\n toggleLegend?: () => void\n}\n\n/**\n * Декларативное описание одной кнопки в hover-toolbar чарта. UI-аватар\n * (`icon`) — любой `ReactNode` (обычно inline-SVG 16×16 stroke 1.5).\n */\nexport interface ChartAction {\n /** Уникальный id (попадает в `data-sg-action`). */\n id: string\n /** Иконка кнопки (рекомендуется inline SVG 16×16, stroke 1.5). */\n icon: ReactNode\n /** Текст для `aria-label` / `title`. */\n label: string\n /** Обработчик клика. Получает контекст с SVG-ссылкой. */\n onClick: (ctx: ChartActionContext) => void\n /** Скрыть кнопку (но оставить в массиве — для условной логики). */\n hidden?: boolean\n}\n\n/**\n * Допустимые значения prop-а `actions`:\n * - `false` / `undefined` — toolbar не рендерится.\n * - `true` — рендерится дефолтный набор (print + SVG + PNG + reset brush, если включён).\n * - массив `ChartAction[]` — кастомный набор.\n */\nexport type ChartActionsProp = boolean | readonly ChartAction[]\n\n/**\n * Иконки для дефолтных кнопок. Намеренно inline-SVG, без `lucide-react` /\n * других runtime-зависимостей. Все 16×16, `stroke=\"currentColor\"`,\n * `stroke-width=\"1.5\"`, без заливок — следуют конвенции SkyGraph.\n */\nfunction IconStroke(props: { d: string; extra?: ReactNode }) {\n return (\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d={props.d} />\n {props.extra}\n </svg>\n )\n}\n\nconst PRINT_ICON = (\n <IconStroke\n d=\"M4 6V2.5h8V6\"\n extra={\n <>\n <rect x={3} y={6} width={10} height={6} rx={1} />\n <path d=\"M4.5 10h7v3.5h-7z\" />\n </>\n }\n />\n)\n\nconst SVG_ICON = (\n <IconStroke\n d=\"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 extra={\n <>\n <path d=\"M8 2.5v7\" />\n <path d=\"M5 6.5l3 3 3-3\" />\n </>\n }\n />\n)\n\nconst PNG_ICON = (\n <IconStroke\n d=\"M2.5 3.5h11v9h-11z\"\n extra={\n <>\n <circle cx={5.5} cy={6.5} r={0.9} />\n <path d=\"M2.5 11l3-3 2.5 2.5L10.5 8l3 3\" />\n </>\n }\n />\n)\n\nconst RESET_ICON = (\n <IconStroke\n d=\"M3 8a5 5 0 1 0 1.5-3.5\"\n extra={\n <>\n <path d=\"M3 3v3h3\" />\n </>\n }\n />\n)\n\n/**\n * Возвращает дефолтный набор `ChartAction`-ов для toolbar-а. Используется\n * чартами, когда `actions=true` (sugar-форма).\n */\nexport function defaultChartActions(opts: {\n /** Передаётся в `printElement` как `fileName`. */\n fileName?: string\n /** Если задан — добавляется кнопка `resetBrush`. */\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 // Игнорим ошибку декодирования (browser-only) — пользователь\n // увидит, что файл не появился; ронять рантайм здесь смысла нет.\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\nexport interface ChartHoverToolbarProps {\n /** Видимая ли панель сейчас (родитель прокидывает по hover/focus). */\n visible: boolean\n /** Список кнопок. */\n actions: readonly ChartAction[]\n /** Базовое имя файла для экспортов / print. */\n fileName?: string\n /** Возвращает текущий SVG-элемент чарта (на момент клика). */\n getSvg: () => SVGSVGElement | null\n /** Сбросить brush (если в чарте он есть). */\n brushReset?: () => void\n /** Переключить легенду — userland решает. */\n toggleLegend?: () => void\n /** Сбросить дефолтные классы `.sg-chart-toolbar*` — headless-режим. */\n unstyled?: boolean\n /** Опциональный `className` для контейнера. */\n className?: string\n /** Опциональный inline-style на контейнере. */\n style?: CSSProperties\n}\n\n/**\n * Floating-панель действий, плавающая поверх чарта в правом верхнем углу.\n *\n * Появляется на hover/focus родителя — родитель сам управляет prop-ом\n * `visible` (через `data-sg-toolbar=\"visible|hidden\"`). CSS-анимация\n * `opacity 180ms` живёт в `charts.css`. Сама обёртка имеет `pointer-events:\n * none`, кнопки — `pointer-events: auto`, чтобы не перехватывать события\n * crosshair / brush на пустом overlay.\n */\nexport function ChartHoverToolbar({\n visible,\n actions,\n fileName,\n getSvg,\n brushReset,\n toggleLegend,\n unstyled,\n className,\n style,\n}: ChartHoverToolbarProps) {\n const chartsLocale = useConfig().locale?.charts\n const visibleActions = actions.filter((a) => !a.hidden)\n if (visibleActions.length === 0) return null\n\n const wrapperClass = unstyled\n ? className\n : ['sg-chart-toolbar', className].filter(Boolean).join(' ')\n\n const buttonClass = unstyled ? undefined : 'sg-chart-toolbar-button'\n\n return (\n <div\n className={wrapperClass}\n style={style}\n data-sg-chart-toolbar=\"\"\n data-sg-toolbar={visible ? 'visible' : 'hidden'}\n role=\"toolbar\"\n aria-label={chartsLocale?.actions ?? 'Chart actions'}\n aria-hidden={visible ? undefined : true}\n >\n {visibleActions.map((a) => (\n <button\n key={a.id}\n type=\"button\"\n className={buttonClass}\n data-sg-action={a.id}\n aria-label={a.label}\n title={a.label}\n tabIndex={visible ? 0 : -1}\n onClick={(e) => {\n e.stopPropagation()\n const svg = getSvg()\n if (!svg) return\n a.onClick({ svg, fileName, brushReset, toggleLegend })\n }}\n >\n {a.icon}\n </button>\n ))}\n </div>\n )\n}\n\n/**\n * Резолвит prop `actions` (boolean | array) в актуальный массив с учётом\n * дефолтных кнопок и опциональной кнопки `resetBrush`. Возвращает `null`,\n * если toolbar в принципе не должен рендериться.\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","import type { MouseEvent as ReactMouseEvent } from 'react'\r\n\r\n/**\r\n * Payload для контекстного меню по серии / отдельной точке. Отдаётся в\r\n * `onSeriesContextMenu` ровно тогда, когда пользователь правой кнопкой\r\n * кликнул по визуальному элементу серии (line-segment, marker, bar, slice,\r\n * area-path).\r\n */\r\nexport interface ChartSeriesContextMenuPayload {\r\n /** `id` исходного `ChartSeries` или `PieChartSlice`. */\r\n seriesId: string\r\n /** Индекс серии в массиве `series` (0-based). Для Pie — индекс slice-а. */\r\n seriesIndex: number\r\n /** Индекс категории по X (0-based). Не определён для chart-уровня pie. */\r\n valueIndex?: number\r\n /** Числовое значение в этой точке (если применимо). */\r\n value?: number\r\n}\r\n\r\n/**\r\n * Payload для контекстного меню по чарту в целом (клик правой кнопкой по\r\n * пустому месту плот-области, осям, сетке).\r\n */\r\nexport interface ChartContextMenuPayload {\r\n /** X в CSS-пикселях относительно SVG. */\r\n x: number\r\n /** Y в CSS-пикселях относительно SVG. */\r\n y: number\r\n /** X в координатах SVG user-space (то же, что и x для не-stretch SVG). */\r\n plotX: number\r\n /** Y в координатах SVG user-space. */\r\n plotY: number\r\n}\r\n\r\n/** Сигнатура коллбэка `onSeriesContextMenu`. */\r\nexport type ChartSeriesContextMenuHandler = (\r\n event: ReactMouseEvent,\r\n payload: ChartSeriesContextMenuPayload,\r\n) => void\r\n\r\n/** Сигнатура коллбэка `onChartContextMenu`. */\r\nexport type ChartContextMenuHandler = (\r\n event: ReactMouseEvent,\r\n payload: ChartContextMenuPayload,\r\n) => void\r\n\r\n/**\r\n * Создаёт `onContextMenu`-обработчик для visual-элемента серии (line-\r\n * segment / marker / bar / area-path / pie-slice).\r\n *\r\n * - Если `handler` не задан — возвращает `undefined` (нативный browser\r\n * menu остаётся валидным).\r\n * - Иначе вызывает `event.preventDefault()` + `event.stopPropagation()`,\r\n * чтобы chart-уровневый handler не сработал и не открылось браузерное\r\n * меню.\r\n */\r\nexport function makeSeriesContextMenuHandler(\r\n handler: ChartSeriesContextMenuHandler | undefined,\r\n payload: ChartSeriesContextMenuPayload,\r\n): ((e: ReactMouseEvent) => void) | undefined {\r\n if (!handler) return undefined\r\n return (e) => {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n handler(e, payload)\r\n }\r\n}\r\n\r\n/**\r\n * Создаёт `onContextMenu`-обработчик для SVG-корня (chart-уровень). Если\r\n * не задан — возвращает `undefined`, чтобы НЕ блокировать дефолтное\r\n * браузерное меню.\r\n */\r\nexport function makeChartContextMenuHandler(\r\n handler: ChartContextMenuHandler | undefined,\r\n): ((e: ReactMouseEvent<SVGSVGElement>) => void) | undefined {\r\n if (!handler) return undefined\r\n return (e) => {\r\n e.preventDefault()\r\n const svg = e.currentTarget\r\n const rect = svg.getBoundingClientRect()\r\n const x = e.clientX - rect.left\r\n const y = e.clientY - rect.top\r\n // Mapping CSS-pixel → SVG user-space через viewBox. Для не-stretch\r\n // SVG (наш случай — viewBox = реальные размеры) coords совпадают.\r\n let plotX = x\r\n let plotY = y\r\n const vb = svg.viewBox?.baseVal\r\n if (vb && vb.width > 0 && vb.height > 0 && rect.width > 0 && rect.height > 0) {\r\n plotX = (x / rect.width) * vb.width\r\n plotY = (y / rect.height) * vb.height\r\n }\r\n handler(e, { x, y, plotX, plotY })\r\n }\r\n}\r\n","import { forwardRef, useMemo, useRef, useState, type CSSProperties, type ForwardedRef } from 'react'\nimport {\n chartBounds,\n chartDataKey,\n colorForSeries,\n resolveChartPadding,\n resolveChartAnimation,\n} from './types'\nimport { ChartLegend } from './ChartLegend'\nimport { ChartAxes } from './ChartAxes'\nimport {\n ChartBrush,\n resolveBrushConfig,\n type ChartBrushConfig,\n type ChartBrushRange,\n} from './ChartBrush'\nimport type { BaseChartProps } from './types'\nimport { useChartPrint, type ChartRef } from './chartRef'\nimport { useChartSize } from './useChartSize'\nimport { ChartHoverToolbar, resolveChartActions } from './ChartHoverToolbar'\nimport { makeChartContextMenuHandler, makeSeriesContextMenuHandler } from './chartContextMenu'\nimport { useConfig } from '../../ConfigProvider'\n\nexport interface BarChartProps extends BaseChartProps {\n /** Gap between groups in [0..1] of category step. @default 0.2 */\n groupGap?: number\n /** Gap between bars within a group in [0..1] of bar slot. @default 0.1 */\n barGap?: number\n /**\n * Brush для drag-выбора диапазона по X. `true` — uncontrolled с пустым\n * стартовым значением; объект — `ChartBrushConfig`. См. `ChartBrush`.\n */\n brush?: boolean | ChartBrushConfig\n}\n\n/**\n * Minimal SVG bar chart. v0 — grouped bars per category (one bar per series),\n * no axes, no tooltip. Theming via `--sg-color-*` tokens.\n *\n * Responsive: viewBox = реальные пиксели контейнера (через\n * `useChartSize`), без `preserveAspectRatio` — bars не растягиваются.\n */\nfunction BarChartInner(\n {\n categories,\n series,\n width = '100%',\n height = 200,\n className,\n style,\n unstyled = false,\n padding,\n groupGap = 0.2,\n barGap = 0.1,\n legend = false,\n xAxis,\n yAxis,\n animate,\n brush,\n printable,\n actions,\n fileName,\n onSeriesContextMenu,\n onChartContextMenu,\n }: BarChartProps,\n forwardedRef: ForwardedRef<ChartRef>,\n) {\n const chartsLocale = useConfig().locale?.charts\n const { rootRef } = useChartPrint<Element>(forwardedRef, printable)\n const svgRef = useRef<SVGSVGElement | null>(null)\n\n const { min, max } = useMemo(() => chartBounds(series.map((s) => s.values)), [series])\n\n // Always include zero in the range so positive bars rest on the baseline.\n const baseline = Math.min(0, min)\n const top = Math.max(0, max)\n const span = top - baseline || 1\n\n const [pt, pr, pb, pl] = useMemo(\n () => resolveChartPadding(padding, yAxis, baseline, top),\n [padding, yAxis, baseline, top],\n )\n\n const fallbackW = typeof width === 'number' && Number.isFinite(width) ? width : 600\n const fallbackH = typeof height === 'number' && Number.isFinite(height) ? height : 200\n const measured = useChartSize<SVGSVGElement>(svgRef, { width: fallbackW, height: fallbackH })\n const viewW = measured.width\n const viewH = measured.height\n const plotW = Math.max(0, viewW - pl - pr)\n const plotH = Math.max(0, viewH - pt - pb)\n const yZero = pt + (top / span) * plotH\n\n const groupCount = categories.length\n const groupWidth = groupCount > 0 ? plotW / groupCount : 0\n const groupInner = groupWidth * (1 - groupGap)\n const seriesCount = series.length\n const barSlot = seriesCount > 0 ? groupInner / seriesCount : 0\n const barWidth = barSlot * (1 - barGap)\n\n const wrapperClass = unstyled\n ? className\n : ['sg-chart', 'sg-chart-bar', className].filter(Boolean).join(' ')\n\n const anim = resolveChartAnimation(animate)\n const animKey = useMemo(\n () => chartDataKey([categories, series.map((s) => s.values)]),\n [categories, series],\n )\n const animClass = anim.enabled && !unstyled ? 'sg-chart-bar-animate' : undefined\n\n const brushConfig = resolveBrushConfig(brush)\n const isBrushControlled = brushConfig != null && 'range' in brushConfig\n const [internalBrushRange, setInternalBrushRange] = useState<ChartBrushRange | null>(\n brushConfig?.defaultRange ?? null,\n )\n const effectiveBrushRange = isBrushControlled ? (brushConfig!.range ?? null) : internalBrushRange\n const handleBrushChange = (next: ChartBrushRange | null) => {\n if (!isBrushControlled) setInternalBrushRange(next)\n brushConfig?.onRangeChange?.(next)\n }\n\n const brushReset = brushConfig\n ? () => {\n if (!isBrushControlled) setInternalBrushRange(null)\n brushConfig.onRangeChange?.(null)\n }\n : undefined\n const resolvedActions = resolveChartActions(actions, { fileName, brushReset })\n const [toolbarVisible, setToolbarVisible] = useState(false)\n const handleSvgContextMenu = makeChartContextMenuHandler(onChartContextMenu)\n\n const setSvgRef = (el: SVGSVGElement | null) => {\n svgRef.current = el\n if (!legend) (rootRef as React.MutableRefObject<Element | null>).current = el\n }\n\n const svg = (\n <svg\n ref={setSvgRef}\n className={wrapperClass}\n style={legend || resolvedActions ? undefined : style}\n width={width}\n height={height}\n viewBox={`0 0 ${viewW} ${viewH}`}\n role=\"img\"\n aria-label={chartsLocale?.barChart ?? 'Bar chart'}\n onContextMenu={handleSvgContextMenu}\n >\n <ChartAxes\n plotX={pl}\n plotY={pt}\n plotW={plotW}\n plotH={plotH}\n min={baseline}\n max={top}\n categories={categories}\n xPositions={categories.map((_, gi) => pl + gi * groupWidth + groupWidth / 2)}\n xAxis={xAxis}\n yAxis={yAxis}\n unstyled={unstyled}\n />\n {/* baseline */}\n <line\n x1={pl}\n x2={pl + plotW}\n y1={yZero}\n y2={yZero}\n stroke=\"var(--sg-color-border)\"\n strokeWidth={1}\n vectorEffect=\"non-scaling-stroke\"\n />\n {categories.map((_, gi) => {\n const groupStart = pl + gi * groupWidth + (groupWidth - groupInner) / 2\n return series.map((s, si) => {\n const v = s.values[gi]\n if (v === null || v === undefined) return null\n const x = groupStart + si * barSlot + (barSlot - barWidth) / 2\n const yTop = pt + ((top - Math.max(v, 0)) / span) * plotH\n const yBottom = pt + ((top - Math.min(v, 0)) / span) * plotH\n const h = Math.max(0, yBottom - yTop)\n // Origin: zero baseline so positive bars grow upwards and negative\n // bars grow downwards. `transform-box: fill-box` (set in CSS) makes\n // pixel-space transform-origin work on SVG <rect>.\n const originY = v >= 0 ? yBottom : yTop\n const animStyle: CSSProperties | undefined = anim.enabled\n ? {\n transformOrigin: `${x + barWidth / 2}px ${originY}px`,\n animationDuration: `${anim.duration}ms`,\n animationDelay: `${(gi / Math.max(1, categories.length)) * (anim.duration * 0.3)}ms`,\n }\n : undefined\n return (\n <rect\n key={`${s.id}-${gi}-${animKey}`}\n className={animClass}\n x={x}\n y={yTop}\n width={Math.max(1, barWidth)}\n height={h}\n fill={colorForSeries(s, si)}\n rx={2}\n style={animStyle}\n onContextMenu={makeSeriesContextMenuHandler(onSeriesContextMenu, {\n seriesId: s.id,\n seriesIndex: si,\n valueIndex: gi,\n value: v,\n })}\n >\n <title>{`${s.label} · ${categories[gi]}: ${v}`}</title>\n </rect>\n )\n })\n })}\n {brushConfig && (\n <ChartBrush\n plotX={pl}\n plotY={pt}\n plotW={plotW}\n plotH={plotH}\n categoryCount={categories.length}\n range={effectiveBrushRange}\n onRangeChange={handleBrushChange}\n unstyled={unstyled}\n fill={brushConfig.fill}\n disabled={brushConfig.disabled}\n />\n )}\n </svg>\n )\n\n const needsWrapper = legend || !!resolvedActions\n if (!needsWrapper) return svg\n\n return (\n <div\n ref={legend ? (rootRef as React.RefObject<HTMLDivElement>) : undefined}\n className={unstyled ? undefined : 'sg-chart-wrapper'}\n style={style}\n onMouseEnter={resolvedActions ? () => setToolbarVisible(true) : undefined}\n onMouseLeave={resolvedActions ? () => setToolbarVisible(false) : undefined}\n onFocus={resolvedActions ? () => setToolbarVisible(true) : undefined}\n onBlur={resolvedActions ? () => setToolbarVisible(false) : undefined}\n >\n {resolvedActions && (\n <ChartHoverToolbar\n visible={toolbarVisible}\n actions={resolvedActions}\n fileName={fileName}\n getSvg={() => svgRef.current}\n brushReset={brushReset}\n unstyled={unstyled}\n />\n )}\n {svg}\n {legend && <ChartLegend series={series} />}\n </div>\n )\n}\n\nexport const BarChart = forwardRef<ChartRef, BarChartProps>(BarChartInner)\nBarChart.displayName = 'BarChart'\n","import { forwardRef, useMemo, useRef, useState, type CSSProperties, type ForwardedRef } from 'react'\nimport {\n chartBounds,\n chartDataKey,\n colorForSeries,\n resolveChartPadding,\n resolveChartAnimation,\n} from './types'\nimport { ChartLegend } from './ChartLegend'\nimport { ChartAxes } from './ChartAxes'\nimport {\n ChartBrush,\n resolveBrushConfig,\n type ChartBrushConfig,\n type ChartBrushRange,\n} from './ChartBrush'\nimport type { BaseChartProps } from './types'\nimport { useChartPrint, type ChartRef } from './chartRef'\nimport { useChartSize } from './useChartSize'\nimport { ChartHoverToolbar, resolveChartActions } from './ChartHoverToolbar'\nimport { makeChartContextMenuHandler, makeSeriesContextMenuHandler } from './chartContextMenu'\nimport { useConfig } from '../../ConfigProvider'\n\nexport interface AreaChartProps extends BaseChartProps {\n /** Stack series on top of each other (cumulative). @default false */\n stacked?: boolean\n /** Stroke width on the top edge. @default 2 */\n strokeWidth?: number\n /** Fill opacity (0..1). @default 0.25 */\n fillOpacity?: number\n /**\n * Brush для drag-выбора диапазона по X. `true` — uncontrolled с пустым\n * стартовым значением; объект — `ChartBrushConfig`. См. `ChartBrush`.\n */\n brush?: boolean | ChartBrushConfig\n}\n\n/**\n * Minimal SVG area chart. v0 — straight segments between points, optional\n * stacking. Responsive viewBox через `useChartSize`.\n */\nfunction AreaChartInner(\n {\n categories,\n series,\n width = '100%',\n height = 200,\n className,\n style,\n unstyled = false,\n padding,\n stacked = false,\n strokeWidth = 2,\n fillOpacity = 0.25,\n legend = false,\n xAxis,\n yAxis,\n animate,\n brush,\n printable,\n actions,\n fileName,\n onSeriesContextMenu,\n onChartContextMenu,\n }: AreaChartProps,\n forwardedRef: ForwardedRef<ChartRef>,\n) {\n const chartsLocale = useConfig().locale?.charts\n const { rootRef } = useChartPrint<Element>(forwardedRef, printable)\n const svgRef = useRef<SVGSVGElement | null>(null)\n\n // Effective values per series — for stacked, each series adds to the\n // running total (treating null as 0 for the stack base).\n const stackedValues = useMemo(() => {\n if (!stacked) return series.map((s) => [...s.values])\n const totals = new Array(categories.length).fill(0)\n return series.map((s) => {\n const out: (number | null)[] = []\n s.values.forEach((v, i) => {\n if (v === null || v === undefined) {\n out.push(null)\n return\n }\n totals[i] += v\n out.push(totals[i])\n })\n return out\n })\n }, [series, stacked, categories.length])\n\n const { min, max } = useMemo(() => chartBounds(stackedValues), [stackedValues])\n\n const baseline = Math.min(0, min)\n const top = Math.max(0, max)\n const span = top - baseline || 1\n\n const [pt, pr, pb, pl] = useMemo(\n () => resolveChartPadding(padding, yAxis, baseline, top),\n [padding, yAxis, baseline, top],\n )\n\n const fallbackW = typeof width === 'number' && Number.isFinite(width) ? width : 600\n const fallbackH = typeof height === 'number' && Number.isFinite(height) ? height : 200\n const measured = useChartSize<SVGSVGElement>(svgRef, { width: fallbackW, height: fallbackH })\n const viewW = measured.width\n const viewH = measured.height\n const plotW = Math.max(0, viewW - pl - pr)\n const plotH = Math.max(0, viewH - pt - pb)\n\n const xStep = categories.length > 1 ? plotW / (categories.length - 1) : 0\n function xFor(i: number) {\n return pl + i * xStep\n }\n function yFor(v: number) {\n return pt + ((top - v) / span) * plotH\n }\n const yBase = yFor(0)\n\n const wrapperClass = unstyled\n ? className\n : ['sg-chart', 'sg-chart-area', className].filter(Boolean).join(' ')\n\n const anim = resolveChartAnimation(animate)\n const animKey = useMemo(\n () => chartDataKey([categories, series.map((s) => s.values), stacked]),\n [categories, series, stacked],\n )\n const animStyle: CSSProperties | undefined = anim.enabled\n ? ({ ['--sg-chart-anim-duration' as string]: `${anim.duration}ms` } as CSSProperties)\n : undefined\n const animClass = anim.enabled && !unstyled ? 'sg-chart-area-animate' : undefined\n\n const brushConfig = resolveBrushConfig(brush)\n const isBrushControlled = brushConfig != null && 'range' in brushConfig\n const [internalBrushRange, setInternalBrushRange] = useState<ChartBrushRange | null>(\n brushConfig?.defaultRange ?? null,\n )\n const effectiveBrushRange = isBrushControlled ? (brushConfig!.range ?? null) : internalBrushRange\n const handleBrushChange = (next: ChartBrushRange | null) => {\n if (!isBrushControlled) setInternalBrushRange(next)\n brushConfig?.onRangeChange?.(next)\n }\n\n const brushReset = brushConfig\n ? () => {\n if (!isBrushControlled) setInternalBrushRange(null)\n brushConfig.onRangeChange?.(null)\n }\n : undefined\n const resolvedActions = resolveChartActions(actions, { fileName, brushReset })\n const [toolbarVisible, setToolbarVisible] = useState(false)\n const handleSvgContextMenu = makeChartContextMenuHandler(onChartContextMenu)\n\n const setSvgRef = (el: SVGSVGElement | null) => {\n svgRef.current = el\n if (!legend) (rootRef as React.MutableRefObject<Element | null>).current = el\n }\n\n const svg = (\n <svg\n ref={setSvgRef}\n className={wrapperClass}\n style={legend || resolvedActions ? undefined : style}\n width={width}\n height={height}\n viewBox={`0 0 ${viewW} ${viewH}`}\n role=\"img\"\n aria-label={chartsLocale?.areaChart ?? 'Area chart'}\n onContextMenu={handleSvgContextMenu}\n >\n <ChartAxes\n plotX={pl}\n plotY={pt}\n plotW={plotW}\n plotH={plotH}\n min={baseline}\n max={top}\n categories={categories}\n xAxis={xAxis}\n yAxis={yAxis}\n unstyled={unstyled}\n />\n {series.map((s, sIdx) => {\n const color = colorForSeries(s, sIdx)\n const vals = stackedValues[sIdx]!\n // Build \"area\" polygon: top line forward, then close along baseline backward.\n const topPoints: [number, number][] = []\n vals.forEach((v, i) => {\n if (v === null || v === undefined) return\n topPoints.push([xFor(i), yFor(v)])\n })\n if (topPoints.length === 0) return null\n const first = topPoints[0]!\n const last = topPoints[topPoints.length - 1]!\n const areaPath = [\n `M ${first[0]} ${yBase}`,\n ...topPoints.map((p) => `L ${p[0]} ${p[1]}`),\n `L ${last[0]} ${yBase}`,\n 'Z',\n ].join(' ')\n const linePath = topPoints\n .map((p, i) => (i === 0 ? `M ${p[0]} ${p[1]}` : `L ${p[0]} ${p[1]}`))\n .join(' ')\n const onSeriesCtx = makeSeriesContextMenuHandler(onSeriesContextMenu, {\n seriesId: s.id,\n seriesIndex: sIdx,\n })\n return (\n <g key={`${s.id}-${animKey}`} className={animClass} style={animStyle}>\n <path\n d={areaPath}\n fill={color}\n fillOpacity={fillOpacity}\n stroke=\"none\"\n onContextMenu={onSeriesCtx}\n />\n <path\n d={linePath}\n fill=\"none\"\n stroke={color}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n onContextMenu={onSeriesCtx}\n />\n </g>\n )\n })}\n {brushConfig && (\n <ChartBrush\n plotX={pl}\n plotY={pt}\n plotW={plotW}\n plotH={plotH}\n categoryCount={categories.length}\n range={effectiveBrushRange}\n onRangeChange={handleBrushChange}\n unstyled={unstyled}\n fill={brushConfig.fill}\n disabled={brushConfig.disabled}\n />\n )}\n </svg>\n )\n\n const needsWrapper = legend || !!resolvedActions\n if (!needsWrapper) return svg\n\n return (\n <div\n ref={legend ? (rootRef as React.RefObject<HTMLDivElement>) : undefined}\n className={unstyled ? undefined : 'sg-chart-wrapper'}\n style={style}\n onMouseEnter={resolvedActions ? () => setToolbarVisible(true) : undefined}\n onMouseLeave={resolvedActions ? () => setToolbarVisible(false) : undefined}\n onFocus={resolvedActions ? () => setToolbarVisible(true) : undefined}\n onBlur={resolvedActions ? () => setToolbarVisible(false) : undefined}\n >\n {resolvedActions && (\n <ChartHoverToolbar\n visible={toolbarVisible}\n actions={resolvedActions}\n fileName={fileName}\n getSvg={() => svgRef.current}\n brushReset={brushReset}\n unstyled={unstyled}\n />\n )}\n {svg}\n {legend && <ChartLegend series={series} />}\n </div>\n )\n}\n\nexport const AreaChart = forwardRef<ChartRef, AreaChartProps>(AreaChartInner)\nAreaChart.displayName = 'AreaChart'\n","import { forwardRef, useMemo, useRef, useState, type CSSProperties, type ForwardedRef } from 'react'\nimport { chartDataKey, colorForSeries, resolveChartAnimation, type ChartAnimation } from './types'\nimport type { ChartSeries } from './types'\nimport type { PrintableProp } from '../../../utils/print'\nimport { useChartPrint, type ChartRef } from './chartRef'\nimport { useChartSize } from './useChartSize'\nimport { ChartHoverToolbar, resolveChartActions, type ChartActionsProp } from './ChartHoverToolbar'\nimport {\n makeChartContextMenuHandler,\n makeSeriesContextMenuHandler,\n type ChartContextMenuHandler,\n type ChartSeriesContextMenuHandler,\n} from './chartContextMenu'\nimport { useConfig } from '../../ConfigProvider'\n\nexport interface PieChartSlice {\n /** Stable id for keying / legend. */\n id: string\n /** Display label (legend / accessible description). */\n label: string\n /** Numeric value. Negative values are clamped to 0. */\n value: number\n /** Optional explicit fill colour. Falls back to default palette by index. */\n color?: string\n}\n\nexport interface PieChartProps {\n data: readonly PieChartSlice[]\n /** SVG width. */\n width?: number | string\n /** SVG height. */\n height?: number | string\n /** Inner radius (donut). 0 → solid pie. @default 0 */\n innerRadius?: number\n /** Outer radius. @default 80 */\n outerRadius?: number\n /** Drop default sg-chart classes. */\n unstyled?: boolean\n className?: string\n style?: CSSProperties\n /**\n * Mount / data-change animation toggle. When enabled, slices fade-in and\n * rotate from `-90deg` to `0deg` around the pie centre.\n * @default true\n */\n animate?: ChartAnimation\n /**\n * Включает поддержку `ref.print()`. `{ fileName }` — имя popup-окна.\n * @default false\n */\n printable?: PrintableProp\n /**\n * Hover-toolbar в правом верхнем углу — print + SVG + PNG.\n */\n actions?: ChartActionsProp\n /** Базовое имя файла для экспортов. @default 'chart' */\n fileName?: string\n /**\n * Контекстное меню по slice-у (правая кнопка). Payload содержит\n * `seriesId` (равен `slice.id`), `seriesIndex` и `value`.\n */\n onSeriesContextMenu?: ChartSeriesContextMenuHandler\n /** Контекстное меню по фону pie chart (вне slice-ов). */\n onChartContextMenu?: ChartContextMenuHandler\n}\n\n/**\n * Minimal SVG pie / donut chart. Clockwise from 12 o'clock. Responsive\n * viewBox через `useChartSize`: при `width|height='100%'` радиусы пересчи-\n * тываются от реальных пикселей контейнера, чтобы pie не растягивался.\n */\nfunction PieChartInner(\n {\n data,\n width = 200,\n height = 200,\n innerRadius = 0,\n outerRadius = 80,\n unstyled = false,\n className,\n style,\n animate,\n printable,\n actions,\n fileName,\n onSeriesContextMenu,\n onChartContextMenu,\n }: PieChartProps,\n forwardedRef: ForwardedRef<ChartRef>,\n) {\n const chartsLocale = useConfig().locale?.charts\n const { rootRef } = useChartPrint<Element>(forwardedRef, printable)\n const svgRef = useRef<SVGSVGElement | null>(null)\n\n // Pie использует width / height и для viewBox, и для центрирования.\n // ResizeObserver — на случай width|height = '100%' или CSS-зависимого\n // размера; в остальных случаях возвращает сразу пиксельные значения.\n const fallbackW = typeof width === 'number' && Number.isFinite(width) ? width : 200\n const fallbackH = typeof height === 'number' && Number.isFinite(height) ? height : 200\n const measured = useChartSize<SVGSVGElement>(svgRef, { width: fallbackW, height: fallbackH })\n const viewW = measured.width\n const viewH = measured.height\n\n const total = useMemo(() => data.reduce((sum, d) => sum + Math.max(0, d.value), 0), [data])\n\n const cx = viewW / 2\n const cy = viewH / 2\n\n const wrapperClass = unstyled\n ? className\n : ['sg-chart', 'sg-chart-pie', className].filter(Boolean).join(' ')\n\n const anim = resolveChartAnimation(animate)\n const animKey = useMemo(() => chartDataKey([data]), [data])\n const animClass = anim.enabled && !unstyled ? 'sg-chart-pie-animate' : undefined\n const animStyle: CSSProperties | undefined = anim.enabled\n ? {\n transformOrigin: `${cx}px ${cy}px`,\n animationDuration: `${anim.duration}ms`,\n }\n : undefined\n\n const resolvedActions = resolveChartActions(actions, { fileName })\n const [toolbarVisible, setToolbarVisible] = useState(false)\n const handleSvgContextMenu = makeChartContextMenuHandler(onChartContextMenu)\n\n const setSvgRef = (el: SVGSVGElement | null) => {\n svgRef.current = el\n if (!resolvedActions) (rootRef as React.MutableRefObject<Element | null>).current = el\n }\n\n const isEmpty = total === 0 || data.length === 0\n let cursor = -Math.PI / 2 // start at 12 o'clock\n\n const svg = isEmpty ? (\n <svg\n ref={setSvgRef}\n className={wrapperClass}\n style={resolvedActions ? undefined : style}\n width={width}\n height={height}\n viewBox={`0 0 ${viewW} ${viewH}`}\n role=\"img\"\n aria-label={`${chartsLocale?.pieChart ?? 'Pie chart'} (empty)`}\n onContextMenu={handleSvgContextMenu}\n />\n ) : (\n <svg\n ref={setSvgRef}\n className={wrapperClass}\n style={resolvedActions ? undefined : style}\n width={width}\n height={height}\n viewBox={`0 0 ${viewW} ${viewH}`}\n role=\"img\"\n aria-label={chartsLocale?.pieChart ?? 'Pie chart'}\n onContextMenu={handleSvgContextMenu}\n >\n {data.map((slice, i) => {\n const value = Math.max(0, slice.value)\n if (value === 0) return null\n const angle = (value / total) * 2 * Math.PI\n const startAngle = cursor\n const endAngle = cursor + angle\n cursor = endAngle\n\n const x0 = cx + outerRadius * Math.cos(startAngle)\n const y0 = cy + outerRadius * Math.sin(startAngle)\n const x1 = cx + outerRadius * Math.cos(endAngle)\n const y1 = cy + outerRadius * Math.sin(endAngle)\n const largeArc = angle > Math.PI ? 1 : 0\n\n const inner = innerRadius > 0\n const ix0 = cx + innerRadius * Math.cos(startAngle)\n const iy0 = cy + innerRadius * Math.sin(startAngle)\n const ix1 = cx + innerRadius * Math.cos(endAngle)\n const iy1 = cy + innerRadius * Math.sin(endAngle)\n\n const d = inner\n ? [\n `M ${x0} ${y0}`,\n `A ${outerRadius} ${outerRadius} 0 ${largeArc} 1 ${x1} ${y1}`,\n `L ${ix1} ${iy1}`,\n `A ${innerRadius} ${innerRadius} 0 ${largeArc} 0 ${ix0} ${iy0}`,\n 'Z',\n ].join(' ')\n : [\n `M ${cx} ${cy}`,\n `L ${x0} ${y0}`,\n `A ${outerRadius} ${outerRadius} 0 ${largeArc} 1 ${x1} ${y1}`,\n 'Z',\n ].join(' ')\n\n const fakeSeries: ChartSeries = {\n id: slice.id,\n label: slice.label,\n values: [],\n color: slice.color,\n }\n const sliceStyle: CSSProperties | undefined = anim.enabled\n ? {\n ...animStyle,\n animationDelay: `${(i / Math.max(1, data.length)) * (anim.duration * 0.4)}ms`,\n }\n : undefined\n return (\n <path\n key={`${slice.id}-${animKey}`}\n className={animClass}\n d={d}\n fill={colorForSeries(fakeSeries, i)}\n data-slice-id={slice.id}\n style={sliceStyle}\n onContextMenu={makeSeriesContextMenuHandler(onSeriesContextMenu, {\n seriesId: slice.id,\n seriesIndex: i,\n value: slice.value,\n })}\n >\n <title>{`${slice.label}: ${slice.value}`}</title>\n </path>\n )\n })}\n </svg>\n )\n\n if (!resolvedActions) return svg\n\n return (\n <div\n ref={rootRef as React.RefObject<HTMLDivElement>}\n className={unstyled ? undefined : 'sg-chart-wrapper'}\n style={style}\n onMouseEnter={() => setToolbarVisible(true)}\n onMouseLeave={() => setToolbarVisible(false)}\n onFocus={() => setToolbarVisible(true)}\n onBlur={() => setToolbarVisible(false)}\n >\n <ChartHoverToolbar\n visible={toolbarVisible}\n actions={resolvedActions}\n fileName={fileName}\n getSvg={() => svgRef.current}\n unstyled={unstyled}\n />\n {svg}\n </div>\n )\n}\n\nexport const PieChart = forwardRef<ChartRef, PieChartProps>(PieChartInner)\nPieChart.displayName = 'PieChart'\n","import React from 'react'\nimport { Spin } from '../../ui/Spin'\nimport { Pagination } from '../../ui/Pagination'\nimport { Empty } from '../../ui/Empty'\nimport type { ListProps, ListItemProps, ListItemMetaProps } from './types'\n\nfunction cls(...parts: (string | false | undefined | null)[]): string {\n return parts.filter(Boolean).join(' ')\n}\n\nfunction ListItemMeta({ avatar, title, description }: ListItemMetaProps) {\n return (\n <div className=\"sg-list-item-meta\">\n {avatar && <div className=\"sg-list-item-meta-avatar\">{avatar}</div>}\n <div className=\"sg-list-item-meta-content\">\n {title && <h4 className=\"sg-list-item-meta-title\">{title}</h4>}\n {description && <div className=\"sg-list-item-meta-description\">{description}</div>}\n </div>\n </div>\n )\n}\n\nfunction ListItemComponent({ children, actions, extra, className, style }: ListItemProps) {\n return (\n <div className={cls('sg-list-item', className)} style={style}>\n <div className=\"sg-list-item-main\">\n <div className=\"sg-list-item-content\">{children}</div>\n {actions && actions.length > 0 && (\n <ul className=\"sg-list-item-actions\">\n {actions.map((action, i) => (\n <li key={i} className=\"sg-list-item-action\">\n {action}\n </li>\n ))}\n </ul>\n )}\n </div>\n {extra && <div className=\"sg-list-item-extra\">{extra}</div>}\n </div>\n )\n}\n\ntype ListItemType = typeof ListItemComponent & { Meta: typeof ListItemMeta }\n\nconst Item = ListItemComponent as ListItemType\nItem.Meta = ListItemMeta\n\nfunction ListInner<T = any>({\n dataSource,\n renderItem,\n header,\n footer,\n loading = false,\n loadMore,\n pagination,\n grid,\n size = 'default',\n split = true,\n bordered = false,\n locale,\n className,\n style,\n unstyled,\n virtual,\n selectable,\n selectedKeys: controlledSelectedKeys,\n defaultSelectedKeys,\n onSelectionChange,\n multiSelect = false,\n draggable,\n onReorder,\n hoverable = true,\n onItemClick,\n rowClassName,\n classNames: slotCls,\n styles: slotSty,\n}: ListProps<T>) {\n const sCls = slotCls ?? {}\n const sSty = slotSty ?? {}\n const [internalPage, setInternalPage] = React.useState(1)\n const [internalSelectedKeys, setInternalSelectedKeys] = React.useState<number[]>(\n () => defaultSelectedKeys ?? [],\n )\n const [dragIndex, setDragIndex] = React.useState<number | null>(null)\n const [dropIndex, setDropIndex] = React.useState<number | null>(null)\n const [scrollTop, setScrollTop] = React.useState(0)\n const virtualRef = React.useRef<HTMLDivElement>(null)\n\n const selectedKeys = controlledSelectedKeys ?? internalSelectedKeys\n\n const pageSize = pagination ? (pagination.pageSize ?? 10) : dataSource.length\n const currentPage = pagination ? (pagination.current ?? internalPage) : 1\n const total = pagination ? (pagination.total ?? dataSource.length) : dataSource.length\n\n const paginatedData = React.useMemo(() => {\n if (!pagination) return dataSource\n const start = (currentPage - 1) * pageSize\n return dataSource.slice(start, start + pageSize)\n }, [dataSource, pagination, currentPage, pageSize])\n\n const handlePageChange = (page: number) => {\n setInternalPage(page)\n if (pagination) {\n pagination.onChange?.(page, pageSize)\n }\n }\n\n const handleItemClick = React.useCallback(\n (item: T, index: number, e: React.MouseEvent) => {\n onItemClick?.(item, index)\n\n if (!selectable) return\n\n let next: number[]\n if (multiSelect && (e.ctrlKey || e.metaKey)) {\n if (selectedKeys.includes(index)) {\n next = selectedKeys.filter((k) => k !== index)\n } else {\n next = [...selectedKeys, index]\n }\n } else {\n next = selectedKeys.includes(index) ? [] : [index]\n }\n\n setInternalSelectedKeys(next)\n onSelectionChange?.(\n next,\n next.map((k) => dataSource[k]),\n )\n },\n [selectable, multiSelect, selectedKeys, dataSource, onItemClick, onSelectionChange],\n )\n\n const handleDragStart = React.useCallback(\n (e: React.DragEvent, index: number) => {\n if (!draggable) return\n setDragIndex(index)\n e.dataTransfer.effectAllowed = 'move'\n },\n [draggable],\n )\n\n const handleDragOver = React.useCallback(\n (e: React.DragEvent, index: number) => {\n if (!draggable || dragIndex === null) return\n e.preventDefault()\n setDropIndex(index)\n },\n [draggable, dragIndex],\n )\n\n const handleDrop = React.useCallback(\n (e: React.DragEvent, index: number) => {\n e.preventDefault()\n if (dragIndex === null || dragIndex === index) {\n setDragIndex(null)\n setDropIndex(null)\n return\n }\n onReorder?.(dragIndex, index)\n setDragIndex(null)\n setDropIndex(null)\n },\n [dragIndex, onReorder],\n )\n\n const handleDragEnd = React.useCallback(() => {\n setDragIndex(null)\n setDropIndex(null)\n }, [])\n\n const scrollRafRef = React.useRef<number | null>(null)\n const handleVirtualScroll = React.useCallback(() => {\n if (scrollRafRef.current != null) return\n scrollRafRef.current = requestAnimationFrame(() => {\n scrollRafRef.current = null\n if (virtualRef.current) {\n setScrollTop(virtualRef.current.scrollTop)\n }\n })\n }, [])\n\n React.useEffect(() => {\n return () => {\n if (scrollRafRef.current != null) cancelAnimationFrame(scrollRafRef.current)\n }\n }, [])\n\n const emptyText = locale?.emptyText ?? 'No Data'\n\n const gridStyle = React.useMemo((): React.CSSProperties | undefined => {\n if (!grid) return undefined\n const cols = grid.column ?? 1\n // Базовое значение кладём в отдельную переменную, чтобы media-override на\n // корне (`--sg-list-grid-columns`) мог перебить её через наследование CSS-переменных\n // и не пришлось использовать `!important`.\n return {\n ['--sg-list-grid-base-columns' as string]: `repeat(${cols}, 1fr)`,\n gap: grid.gutter ? `${grid.gutter}px` : undefined,\n } as React.CSSProperties\n }, [grid])\n\n const gridResponsiveClass = React.useMemo(() => {\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 }, [grid])\n\n const renderItemWrapper = React.useCallback(\n (item: T, index: number, extraStyle?: React.CSSProperties) => {\n const isSelected = selectable && selectedKeys.includes(index)\n const isDragging = dragIndex === index\n const isDropTarget = dropIndex === index && dragIndex !== index\n const extraCls =\n typeof rowClassName === 'function' ? rowClassName(item, index) : (rowClassName ?? '')\n\n const itemCls = cls(\n 'sg-list-item',\n selectable && 'sg-list-item-selectable',\n isSelected && 'sg-list-item-selected',\n hoverable && 'sg-list-item-hoverable',\n isDragging && 'sg-list-item-dragging',\n isDropTarget && 'sg-list-item-drop-target',\n sCls.item,\n extraCls,\n )\n\n return (\n <div\n key={index}\n className={itemCls || undefined}\n style={extraStyle ? { ...sSty.item, ...extraStyle } : sSty.item}\n onClick={(e) => handleItemClick(item, index, e)}\n draggable={draggable}\n onDragStart={(e) => handleDragStart(e, index)}\n onDragOver={(e) => handleDragOver(e, index)}\n onDrop={(e) => handleDrop(e, index)}\n onDragEnd={handleDragEnd}\n onDragLeave={() => setDropIndex(null)}\n >\n {draggable && <span className=\"sg-list-drag-handle\">⠿</span>}\n {renderItem(item, index)}\n </div>\n )\n },\n [\n selectable,\n selectedKeys,\n hoverable,\n dragIndex,\n dropIndex,\n draggable,\n rowClassName,\n handleItemClick,\n handleDragStart,\n handleDragOver,\n handleDrop,\n handleDragEnd,\n renderItem,\n sCls.item,\n sSty.item,\n ],\n )\n\n /**\n * Virtual scroll rendering.\n *\n * Каждая видимая строка позиционируется абсолютно на своём `top = index * itemHeight`\n * с фиксированной высотой `itemHeight`. Это даёт стабильную верстку независимо\n * от внутренних паддингов `.sg-list-item` и от того, оборачивает ли пользователь\n * содержимое в `<List.Item>` или возвращает голый `<div>`.\n *\n * Старый рендер (поток items внутри одного `position: absolute` блока) ломался,\n * когда фактическая высота строки не совпадала с `itemHeight` — overscan вылезал\n * за scroll-область, scroll-позиция не сходилась.\n */\n const renderVirtualList = React.useCallback(() => {\n if (!virtual) return null\n const { itemHeight, height, overscan = 5 } = virtual\n const totalHeight = paginatedData.length * itemHeight\n const startIndex = Math.max(0, Math.floor(scrollTop / itemHeight) - overscan)\n const visibleCount = Math.ceil(height / itemHeight) + overscan * 2\n const endIndex = Math.min(paginatedData.length, startIndex + visibleCount)\n\n return (\n <div\n ref={virtualRef}\n className=\"sg-list-virtual-container\"\n style={{ height, overflow: 'auto', position: 'relative' }}\n onScroll={handleVirtualScroll}\n >\n <div style={{ height: totalHeight, position: 'relative' }}>\n {paginatedData.slice(startIndex, endIndex).map((item, i) => {\n const realIndex = startIndex + i\n return renderItemWrapper(item, realIndex, {\n position: 'absolute',\n top: realIndex * itemHeight,\n left: 0,\n right: 0,\n height: itemHeight,\n boxSizing: 'border-box',\n alignItems: 'center',\n })\n })}\n </div>\n </div>\n )\n }, [virtual, paginatedData, scrollTop, handleVirtualScroll, renderItemWrapper])\n\n if (unstyled) {\n return (\n <div className={className} style={style}>\n {header}\n {loading ? (\n <Spin unstyled />\n ) : paginatedData.length === 0 ? (\n <div>{emptyText}</div>\n ) : virtual ? (\n renderVirtualList()\n ) : (\n <div className={grid ? 'sg-list-items' : undefined} style={gridStyle}>\n {paginatedData.map((item, i) => renderItemWrapper(item, i))}\n </div>\n )}\n {loadMore}\n {pagination && (\n <Pagination\n unstyled\n current={currentPage}\n total={total}\n pageSize={pageSize}\n onChange={handlePageChange}\n />\n )}\n {footer}\n </div>\n )\n }\n\n const wrapperClass = cls(\n 'sg-list',\n `sg-list-${size}`,\n split && 'sg-list-split',\n bordered && 'sg-list-bordered',\n loading && 'sg-list-loading',\n grid && 'sg-list-grid',\n selectable && 'sg-list-selectable',\n draggable && 'sg-list-draggable',\n virtual && 'sg-list-virtual',\n gridResponsiveClass,\n sCls.root,\n className,\n )\n\n return (\n <div className={wrapperClass} style={{ ...sSty.root, ...style }}>\n {header && (\n <div className={cls('sg-list-header', sCls.header)} style={sSty.header}>\n {header}\n </div>\n )}\n\n <Spin spinning={loading}>\n {paginatedData.length === 0 ? (\n <div className={cls('sg-list-empty', sCls.empty)} style={sSty.empty}>\n <Empty description={emptyText} />\n </div>\n ) : virtual ? (\n renderVirtualList()\n ) : (\n <div className={cls('sg-list-items', sCls.items)} style={{ ...gridStyle, ...sSty.items }}>\n {paginatedData.map((item, i) => renderItemWrapper(item, i))}\n </div>\n )}\n </Spin>\n\n {loadMore && <div className=\"sg-list-load-more\">{loadMore}</div>}\n\n {pagination && (\n <div className={cls('sg-list-pagination', sCls.pagination)} style={sSty.pagination}>\n <Pagination\n current={currentPage}\n total={total}\n pageSize={pageSize}\n onChange={handlePageChange}\n />\n </div>\n )}\n\n {footer && (\n <div className={cls('sg-list-footer', sCls.footer)} style={sSty.footer}>\n {footer}\n </div>\n )}\n </div>\n )\n}\n\ntype ListType = typeof ListInner & { Item: ListItemType }\n\n/**\n * Renders a vertical or grid list with optional header, footer, pagination, loading,\n * virtual scroll, selection, and drag-and-drop reorder.\n * Use `List.Item` and `List.Item.Meta` for structured rows.\n */\nexport const List = ListInner as ListType\n;(List as any).Item = Item\n","import React from 'react'\nimport { Button } from '../../ui/Button'\nimport { TransferList } from './TransferList'\nimport type { TransferProps } from './types'\nimport { DEFAULT_TRANSFER_LOCALE } from './types'\n\nfunction cls(...parts: (string | false | undefined | null)[]): string {\n return parts.filter(Boolean).join(' ')\n}\n\n/**\n * Two-column shuttle to move items between source and target key sets.\n * Supports search, pagination, one-way mode, and unstyled rendering.\n */\nexport function Transfer({\n dataSource,\n targetKeys,\n onChange,\n selectedKeys: controlledSelectedKeys,\n onSelectChange,\n titles,\n render,\n showSearch = false,\n filterOption,\n searchPlaceholder,\n showSelectAll = true,\n disabled = false,\n oneWay = false,\n pagination,\n locale,\n className,\n style,\n unstyled,\n footer,\n operations,\n operationsStyle,\n sortable,\n onSort,\n onSearch,\n listHeight,\n listClassName,\n}: TransferProps) {\n const mergedLocale = React.useMemo(() => ({\n ...DEFAULT_TRANSFER_LOCALE,\n ...locale,\n }), [locale])\n\n const [internalSourceSelected, setInternalSourceSelected] = React.useState<string[]>([])\n const [internalTargetSelected, setInternalTargetSelected] = React.useState<string[]>([])\n\n const sourceSelected = controlledSelectedKeys\n ? controlledSelectedKeys.filter(k => !targetKeys.includes(k))\n : internalSourceSelected\n const targetSelected = controlledSelectedKeys\n ? controlledSelectedKeys.filter(k => targetKeys.includes(k))\n : internalTargetSelected\n\n const setSourceSelected = (keys: string[]) => {\n if (!controlledSelectedKeys) setInternalSourceSelected(keys)\n onSelectChange?.(keys, targetSelected)\n }\n\n const setTargetSelected = (keys: string[]) => {\n if (!controlledSelectedKeys) setInternalTargetSelected(keys)\n onSelectChange?.(sourceSelected, keys)\n }\n\n const targetKeySet = React.useMemo(() => new Set(targetKeys), [targetKeys])\n\n const sourceItems = React.useMemo(\n () => dataSource.filter(item => !targetKeySet.has(item.key)),\n [dataSource, targetKeySet],\n )\n\n const targetItems = React.useMemo(\n () => dataSource.filter(item => targetKeySet.has(item.key)),\n [dataSource, targetKeySet],\n )\n\n const moveToRight = () => {\n const moveKeys = sourceSelected.filter(k => {\n const item = dataSource.find(i => i.key === k)\n return item && !item.disabled\n })\n if (moveKeys.length === 0) return\n\n const newTargetKeys = [...targetKeys, ...moveKeys]\n onChange?.(newTargetKeys, 'right', moveKeys)\n setSourceSelected([])\n }\n\n const moveToLeft = () => {\n const moveKeys = targetSelected.filter(k => {\n const item = dataSource.find(i => i.key === k)\n return item && !item.disabled\n })\n if (moveKeys.length === 0) return\n\n const moveKeySet = new Set(moveKeys)\n const newTargetKeys = targetKeys.filter(k => !moveKeySet.has(k))\n onChange?.(newTargetKeys, 'left', moveKeys)\n setTargetSelected([])\n }\n\n const canMoveRight = sourceSelected.some(k => {\n const item = dataSource.find(i => i.key === k)\n return item && !item.disabled\n })\n\n const canMoveLeft = !oneWay && targetSelected.some(k => {\n const item = dataSource.find(i => i.key === k)\n return item && !item.disabled\n })\n\n const resolveFooter = (dir: 'left' | 'right'): React.ReactNode => {\n if (!footer) return undefined\n if (typeof footer === 'function') return footer({ direction: dir })\n return dir === 'left' ? footer[0] : footer[1]\n }\n\n const listCommonProps = {\n render,\n showSearch,\n filterOption,\n searchPlaceholder,\n showSelectAll,\n disabled,\n pagination,\n locale: mergedLocale,\n sortable,\n onSort,\n onSearch,\n listHeight,\n listClassName,\n }\n\n if (unstyled) {\n return (\n <div className={className} style={style}>\n <TransferList\n unstyled\n items={sourceItems}\n selectedKeys={sourceSelected}\n onSelect={setSourceSelected}\n title={titles?.[0]}\n direction=\"left\"\n footer={resolveFooter('left')}\n {...listCommonProps}\n />\n <div>\n {operations ? operations[0] : (\n <button disabled={disabled || !canMoveRight} onClick={moveToRight}>→</button>\n )}\n {!oneWay && (operations ? operations[1] : (\n <button disabled={disabled || !canMoveLeft} onClick={moveToLeft}>←</button>\n ))}\n </div>\n <TransferList\n unstyled\n items={targetItems}\n selectedKeys={targetSelected}\n onSelect={setTargetSelected}\n title={titles?.[1]}\n direction=\"right\"\n footer={resolveFooter('right')}\n {...listCommonProps}\n />\n </div>\n )\n }\n\n return (\n <div className={cls('sg-transfer', disabled && 'sg-transfer-disabled', className)} style={style}>\n <TransferList\n items={sourceItems}\n selectedKeys={sourceSelected}\n onSelect={setSourceSelected}\n title={titles?.[0] ?? 'Source'}\n direction=\"left\"\n footer={resolveFooter('left')}\n {...listCommonProps}\n />\n\n <div className=\"sg-transfer-operations\" style={operationsStyle}>\n {operations ? operations[0] : (\n <Button\n type=\"primary\"\n size=\"small\"\n disabled={disabled || !canMoveRight}\n onClick={moveToRight}\n >\n →\n </Button>\n )}\n {!oneWay && (operations ? operations[1] : (\n <Button\n type=\"primary\"\n size=\"small\"\n disabled={disabled || !canMoveLeft}\n onClick={moveToLeft}\n >\n ←\n </Button>\n ))}\n </div>\n\n <TransferList\n items={targetItems}\n selectedKeys={targetSelected}\n onSelect={setTargetSelected}\n title={titles?.[1] ?? 'Target'}\n direction=\"right\"\n footer={resolveFooter('right')}\n {...listCommonProps}\n />\n </div>\n )\n}\n","import React from 'react'\nimport { Checkbox } from '../../ui/Checkbox'\nimport { Input } from '../../ui/Input'\nimport { Pagination } from '../../ui/Pagination'\nimport type { TransferItem, TransferListProps } from './types'\n\nfunction cls(...parts: (string | false | undefined | null)[]): string {\n return parts.filter(Boolean).join(' ')\n}\n\nconst DEFAULT_PAGE_SIZE = 10\n\n/**\n * Single-column checklist with optional search, select-all, pagination, drag-reorder, and footer.\n * Used as the source and target panes of `Transfer`.\n */\nexport function TransferList({\n items,\n selectedKeys,\n onSelect,\n title,\n render,\n showSearch,\n filterOption,\n searchPlaceholder,\n showSelectAll = true,\n disabled,\n pagination,\n locale,\n direction,\n unstyled,\n footer,\n sortable,\n onSort,\n onSearch,\n listHeight,\n listClassName,\n}: TransferListProps) {\n const [searchValue, setSearchValue] = React.useState('')\n const [currentPage, setCurrentPage] = React.useState(1)\n const [dragKey, setDragKey] = React.useState<string | null>(null)\n const [dropKey, setDropKey] = React.useState<string | null>(null)\n\n const filteredItems = React.useMemo(() => {\n if (!searchValue) return items\n const filter = filterOption ?? ((input: string, item: TransferItem) =>\n item.title.toLowerCase().includes(input.toLowerCase())\n )\n return items.filter(item => filter(searchValue, item))\n }, [items, searchValue, filterOption])\n\n React.useEffect(() => {\n setCurrentPage(1)\n }, [searchValue])\n\n const handleSearchChange = React.useCallback((value: string) => {\n setSearchValue(value)\n onSearch?.(direction, value)\n }, [onSearch, direction])\n\n const pageSize = pagination\n ? (typeof pagination === 'object' ? pagination.pageSize ?? DEFAULT_PAGE_SIZE : DEFAULT_PAGE_SIZE)\n : filteredItems.length\n\n const totalPages = Math.max(1, Math.ceil(filteredItems.length / pageSize))\n const safePage = Math.min(currentPage, totalPages)\n\n const visibleItems = React.useMemo(() => {\n if (!pagination) return filteredItems\n const start = (safePage - 1) * pageSize\n return filteredItems.slice(start, start + pageSize)\n }, [filteredItems, pagination, safePage, pageSize])\n\n const enabledItems = filteredItems.filter(i => !i.disabled)\n const allChecked = enabledItems.length > 0 && enabledItems.every(i => selectedKeys.includes(i.key))\n const someChecked = enabledItems.some(i => selectedKeys.includes(i.key))\n const indeterminate = someChecked && !allChecked\n\n const handleSelectAll = (checked: boolean) => {\n if (disabled) return\n if (checked) {\n const enabledKeys = enabledItems.map(i => i.key)\n const merged = Array.from(new Set([...selectedKeys, ...enabledKeys]))\n onSelect(merged)\n } else {\n const enabledKeySet = new Set(enabledItems.map(i => i.key))\n onSelect(selectedKeys.filter(k => !enabledKeySet.has(k)))\n }\n }\n\n const handleItemCheck = (key: string, checked: boolean) => {\n if (disabled) return\n if (checked) {\n onSelect([...selectedKeys, key])\n } else {\n onSelect(selectedKeys.filter(k => k !== key))\n }\n }\n\n const handleDragStart = React.useCallback((e: React.DragEvent, key: string) => {\n if (!sortable || disabled) return\n setDragKey(key)\n e.dataTransfer.effectAllowed = 'move'\n }, [sortable, disabled])\n\n const handleDragOver = React.useCallback((e: React.DragEvent, key: string) => {\n if (!sortable || !dragKey) return\n e.preventDefault()\n setDropKey(key)\n }, [sortable, dragKey])\n\n const handleDrop = React.useCallback((e: React.DragEvent, key: string) => {\n e.preventDefault()\n if (!sortable || !dragKey || dragKey === key) {\n setDragKey(null)\n setDropKey(null)\n return\n }\n const keys = items.map(i => i.key)\n const fromIdx = keys.indexOf(dragKey)\n const toIdx = keys.indexOf(key)\n if (fromIdx === -1 || toIdx === -1) return\n const next = [...keys]\n const [moved] = next.splice(fromIdx, 1)\n next.splice(toIdx, 0, moved)\n onSort?.(direction, next)\n setDragKey(null)\n setDropKey(null)\n }, [sortable, dragKey, items, direction, onSort])\n\n const handleDragEnd = React.useCallback(() => {\n setDragKey(null)\n setDropKey(null)\n }, [])\n\n const selectedCount = items.filter(i => selectedKeys.includes(i.key)).length\n const unitLabel = items.length === 1 ? locale.itemUnit : locale.itemsUnit\n const countText = selectedCount > 0\n ? `${selectedCount}/${items.length} ${unitLabel}`\n : `${items.length} ${unitLabel}`\n\n const resolvedListClassName = typeof listClassName === 'function' ? listClassName(direction) : (listClassName ?? '')\n\n if (unstyled) {\n return (\n <div data-direction={direction}>\n {title && <div>{title}</div>}\n {showSelectAll && (\n <Checkbox\n unstyled\n checked={allChecked}\n indeterminate={indeterminate}\n disabled={disabled || enabledItems.length === 0}\n onChange={handleSelectAll}\n >\n {allChecked ? locale.deselectAll : locale.selectAll}\n </Checkbox>\n )}\n <span>{countText}</span>\n {showSearch && (\n <Input\n unstyled\n value={searchValue}\n placeholder={searchPlaceholder ?? locale.searchPlaceholder}\n onChange={handleSearchChange}\n />\n )}\n {visibleItems.length === 0 ? (\n <div>{locale.notFoundContent}</div>\n ) : (\n <ul>\n {visibleItems.map(item => (\n <li\n key={item.key}\n draggable={sortable && !disabled && !item.disabled}\n onDragStart={(e) => handleDragStart(e, item.key)}\n onDragOver={(e) => handleDragOver(e, item.key)}\n onDrop={(e) => handleDrop(e, item.key)}\n onDragEnd={handleDragEnd}\n >\n <Checkbox\n unstyled\n checked={selectedKeys.includes(item.key)}\n disabled={disabled || item.disabled}\n onChange={checked => handleItemCheck(item.key, checked)}\n >\n {render ? render(item) : item.title}\n </Checkbox>\n </li>\n ))}\n </ul>\n )}\n {pagination && filteredItems.length > pageSize && (\n <Pagination\n unstyled\n current={safePage}\n total={filteredItems.length}\n pageSize={pageSize}\n onChange={setCurrentPage}\n simple\n />\n )}\n {footer}\n </div>\n )\n }\n\n return (\n <div className={cls('sg-transfer-list', disabled && 'sg-transfer-list-disabled', resolvedListClassName)}>\n <div className=\"sg-transfer-list-header\">\n {showSelectAll && (\n <Checkbox\n checked={allChecked}\n indeterminate={indeterminate}\n disabled={disabled || enabledItems.length === 0}\n onChange={handleSelectAll}\n />\n )}\n <span className=\"sg-transfer-list-header-count\">{countText}</span>\n {title && <span className=\"sg-transfer-list-header-title\">{title}</span>}\n </div>\n\n {showSearch && (\n <div className=\"sg-transfer-list-search\">\n <Input\n size=\"small\"\n value={searchValue}\n placeholder={searchPlaceholder ?? locale.searchPlaceholder}\n onChange={handleSearchChange}\n />\n </div>\n )}\n\n <div\n className=\"sg-transfer-list-body\"\n style={listHeight ? { height: listHeight, overflow: 'auto' } : undefined}\n >\n {visibleItems.length === 0 ? (\n <div className=\"sg-transfer-list-empty\">{locale.notFoundContent}</div>\n ) : (\n <ul className=\"sg-transfer-list-content\">\n {visibleItems.map(item => {\n const isDragging = dragKey === item.key\n const isDropTarget = dropKey === item.key && dragKey !== item.key\n\n return (\n <li\n key={item.key}\n className={cls(\n 'sg-transfer-list-item',\n selectedKeys.includes(item.key) && 'sg-transfer-list-item-selected',\n (disabled || item.disabled) && 'sg-transfer-list-item-disabled',\n isDragging && 'sg-transfer-list-item-dragging',\n isDropTarget && 'sg-transfer-list-item-drop-target',\n )}\n draggable={sortable && !disabled && !item.disabled}\n onDragStart={(e) => handleDragStart(e, item.key)}\n onDragOver={(e) => handleDragOver(e, item.key)}\n onDrop={(e) => handleDrop(e, item.key)}\n onDragEnd={handleDragEnd}\n onDragLeave={() => setDropKey(null)}\n >\n {sortable && !disabled && !item.disabled && (\n <span className=\"sg-transfer-list-item-drag-handle\">⠿</span>\n )}\n <Checkbox\n checked={selectedKeys.includes(item.key)}\n disabled={disabled || item.disabled}\n onChange={checked => handleItemCheck(item.key, checked)}\n >\n <span className=\"sg-transfer-list-item-text\">\n {render ? render(item) : item.title}\n </span>\n </Checkbox>\n </li>\n )\n })}\n </ul>\n )}\n </div>\n\n {pagination && filteredItems.length > pageSize && (\n <div className=\"sg-transfer-list-pagination\">\n <Pagination\n current={safePage}\n total={filteredItems.length}\n pageSize={pageSize}\n onChange={setCurrentPage}\n simple\n />\n </div>\n )}\n\n {footer && (\n <div className=\"sg-transfer-list-footer\">{footer}</div>\n )}\n </div>\n )\n}\n","import type React from 'react'\n\n/** One row in a transfer list. */\nexport interface TransferItem {\n /** Stable unique key. */\n key: string\n /** Primary label text. */\n title: string\n /** Secondary description line. */\n description?: string\n /** Disables selection and move for this item. */\n disabled?: boolean\n}\n\n/** Props for the `Transfer` shuttle component. */\nexport interface TransferProps {\n /** Full item list; membership in `targetKeys` determines the right column. */\n dataSource: TransferItem[]\n /** Keys currently placed in the target (right) list. */\n targetKeys: string[]\n /** Fires after items move left or right. */\n onChange?: (targetKeys: string[], direction: 'left' | 'right', moveKeys: string[]) => void\n /** Controlled selected keys in both lists combined. */\n selectedKeys?: string[]\n /** Fires when selection changes in either list. */\n onSelectChange?: (sourceSelectedKeys: string[], targetSelectedKeys: string[]) => void\n /** Titles for source and target column headers. */\n titles?: [React.ReactNode, React.ReactNode]\n /** Custom render for a list row body. */\n render?: (item: TransferItem) => React.ReactNode\n /** @default false */\n showSearch?: boolean\n /** Predicate for search filtering; defaults to title substring match. */\n filterOption?: (inputValue: string, item: TransferItem) => boolean\n /** Search input placeholder override. */\n searchPlaceholder?: string\n /** @default true */\n showSelectAll?: boolean\n /** @default false */\n disabled?: boolean\n /** When true, hides the move-to-left control. */\n oneWay?: boolean\n /** Enables client pagination for long lists. */\n pagination?: boolean | { pageSize?: number }\n /** Localized labels for list chrome. */\n locale?: {\n /** Singular unit label in counts. */\n itemUnit?: string\n /** Plural unit label in counts. */\n itemsUnit?: string\n /** Default search placeholder. */\n searchPlaceholder?: string\n /** Empty filtered list content. */\n notFoundContent?: React.ReactNode\n /** Select-all checkbox label. */\n selectAll?: string\n /** Deselect-all checkbox label. */\n deselectAll?: string\n }\n /** Root element class name. */\n className?: string\n /** Root element inline style. */\n style?: React.CSSProperties\n /** Renders semantic structure without Skygraph list styles. */\n unstyled?: boolean\n\n /** Footer content for each panel [source, target]. */\n footer?: [React.ReactNode, React.ReactNode] | ((props: { direction: 'left' | 'right' }) => React.ReactNode)\n /** Custom operations area between the lists. */\n operations?: [React.ReactNode, React.ReactNode]\n /** Style for operations area. */\n operationsStyle?: React.CSSProperties\n /** Enables drag-and-drop reorder within each list. */\n sortable?: boolean\n /** Fires when items are reordered via drag in a list. */\n onSort?: (direction: 'left' | 'right', keys: string[]) => void\n /** Shows item count per list. @default true */\n showCount?: boolean\n /** Called when search value changes in either list. */\n onSearch?: (direction: 'left' | 'right', value: string) => void\n /** Fixed height for the list body. */\n listHeight?: number\n /** Custom class per list. */\n listClassName?: string | ((direction: 'left' | 'right') => string)\n}\n\n/** Props for one column list inside `Transfer`. */\nexport interface TransferListProps {\n /** Items shown in this column after filtering. */\n items: TransferItem[]\n /** Keys selected in this column. */\n selectedKeys: string[]\n /** Replaces selection for this column. */\n onSelect: (keys: string[]) => void\n /** Column header title node. */\n title?: React.ReactNode\n /** Custom item body render. */\n render?: (item: TransferItem) => React.ReactNode\n /** Shows filter input above the list. */\n showSearch?: boolean\n /** Custom search filter predicate. */\n filterOption?: (inputValue: string, item: TransferItem) => boolean\n /** Search input placeholder. */\n searchPlaceholder?: string\n /** @default true */\n showSelectAll?: boolean\n /** Disables all interactions in the list. */\n disabled?: boolean\n /** Client pagination config or boolean to use defaults. */\n pagination?: boolean | { pageSize?: number }\n /** Resolved strings for counts and actions. */\n locale: Required<TransferLocale>\n /** Which transfer side this list represents. */\n direction: 'left' | 'right'\n /** Unstyled list rendering. */\n unstyled?: boolean\n /** Footer content. */\n footer?: React.ReactNode\n /** Enables drag-and-drop reorder. */\n sortable?: boolean\n /** Fires when items are reordered via drag. */\n onSort?: (direction: 'left' | 'right', keys: string[]) => void\n /** Called when search changes. */\n onSearch?: (direction: 'left' | 'right', value: string) => void\n /** Fixed height for the list body. */\n listHeight?: number\n /** Custom class for the list. */\n listClassName?: string | ((direction: 'left' | 'right') => string)\n}\n\n/** Optional strings merged into `DEFAULT_TRANSFER_LOCALE`. */\nexport interface TransferLocale {\n /** Singular item unit label. */\n itemUnit?: string\n /** Plural items unit label. */\n itemsUnit?: string\n /** Search field placeholder. */\n searchPlaceholder?: string\n /** Empty state when filter matches nothing. */\n notFoundContent?: React.ReactNode\n /** Select-all control label. */\n selectAll?: string\n /** Deselect-all control label. */\n deselectAll?: string\n}\n\nexport const DEFAULT_TRANSFER_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","import React, { useState, useRef, useEffect, useMemo, useCallback } from 'react'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, InteractiveProps, SizableProps } from '../../types'\n\n/** One mention candidate in the suggestion list. */\nexport interface MentionOption {\n /** Text inserted after the trigger prefix when the row is chosen. */\n value: string\n /** Optional display string; defaults to value when omitted. */\n label?: string\n}\n\n/** Props for a textarea that shows mention suggestions after a prefix. */\nexport interface MentionsProps extends BaseComponentProps, InteractiveProps, SizableProps {\n /** Controlled textarea value. */\n value?: string\n /** Initial value when uncontrolled. */\n defaultValue?: string\n /** Called when the textarea content changes. */\n onChange?: (value: string) => void\n /** Character(s) that start a mention (e.g. @ or #). */\n prefix?: string | string[]\n /** Suggestion list filtered by the text after the active prefix. */\n options?: MentionOption[]\n /** Vertical position of the suggestion dropdown relative to the field. */\n placement?: 'top' | 'bottom'\n /** Called with the current query and matched prefix while typing a mention. */\n onSearch?: (text: string, prefix: string) => void\n /** Called when a suggestion is inserted into the text. */\n onSelect?: (option: MentionOption, prefix: string) => void\n /** Textarea placeholder. */\n placeholder?: string\n /** Visible height of the textarea in rows. */\n rows?: number\n}\n\ninterface MentionState {\n active: boolean\n prefix: string\n query: string\n startIndex: number\n}\n\n/**\n * Textarea with @-style mentions: shows a filtered list after a configured prefix.\n * Supports keyboard navigation (arrows, Enter, Escape) when the list is open.\n *\n * @default defaultValue - `''`\n * @default prefix - `'@'`\n * @default options - `[]`\n * @default placement - `'bottom'`\n * @default rows - `3`\n */\nexport function Mentions({\n value,\n defaultValue = '',\n onChange,\n prefix: prefixConfig = '@',\n options = [],\n placement = 'bottom',\n onSearch,\n onSelect,\n placeholder,\n rows = 3,\n disabled: disabledProp,\n size: sizeProp,\n className,\n style,\n unstyled,\n}: MentionsProps) {\n const config = useConfig()\n const disabled = disabledProp ?? config.disabled\n const size = sizeProp ?? config.size ?? 'middle'\n\n const prefixes = useMemo(\n () => (Array.isArray(prefixConfig) ? prefixConfig : [prefixConfig]),\n [prefixConfig],\n )\n\n const [internalValue, setInternalValue] = useState(value ?? defaultValue)\n const currentValue = value ?? internalValue\n const [mentionState, setMentionState] = useState<MentionState | null>(null)\n const [activeIndex, setActiveIndex] = useState(0)\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n const dropdownRef = useRef<HTMLDivElement>(null)\n\n const filteredOptions = useMemo(() => {\n if (!mentionState) return []\n const q = mentionState.query.toLowerCase()\n return options.filter((opt) => {\n const label = (opt.label ?? opt.value).toLowerCase()\n return label.includes(q)\n })\n }, [options, mentionState])\n\n const handleChange = useCallback((e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = e.target.value\n setInternalValue(newValue)\n onChange?.(newValue)\n\n const cursorPos = e.target.selectionStart ?? 0\n const textBeforeCursor = newValue.slice(0, cursorPos)\n\n let foundMention: MentionState | null = null\n for (const p of prefixes) {\n const lastPrefixIdx = textBeforeCursor.lastIndexOf(p)\n if (lastPrefixIdx >= 0) {\n const charBefore = lastPrefixIdx > 0 ? textBeforeCursor[lastPrefixIdx - 1] : ' '\n if (charBefore === ' ' || charBefore === '\\n' || lastPrefixIdx === 0) {\n const query = textBeforeCursor.slice(lastPrefixIdx + p.length)\n if (!query.includes(' ')) {\n foundMention = { active: true, prefix: p, query, startIndex: lastPrefixIdx }\n break\n }\n }\n }\n }\n\n if (foundMention) {\n setMentionState(foundMention)\n setActiveIndex(0)\n onSearch?.(foundMention.query, foundMention.prefix)\n } else {\n setMentionState(null)\n }\n }, [onChange, prefixes, onSearch])\n\n const insertMention = useCallback((option: MentionOption) => {\n if (!mentionState || !textareaRef.current) return\n const textarea = textareaRef.current\n const before = currentValue.slice(0, mentionState.startIndex)\n const after = currentValue.slice(mentionState.startIndex + mentionState.prefix.length + mentionState.query.length)\n const insertText = `${mentionState.prefix}${option.value} `\n const newValue = before + insertText + after\n\n setInternalValue(newValue)\n onChange?.(newValue)\n onSelect?.(option, mentionState.prefix)\n setMentionState(null)\n\n requestAnimationFrame(() => {\n const pos = before.length + insertText.length\n textarea.focus()\n textarea.setSelectionRange(pos, pos)\n })\n }, [mentionState, currentValue, onChange, onSelect])\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (!mentionState || filteredOptions.length === 0) return\n\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n setActiveIndex((i) => (i + 1) % filteredOptions.length)\n } else if (e.key === 'ArrowUp') {\n e.preventDefault()\n setActiveIndex((i) => (i - 1 + filteredOptions.length) % filteredOptions.length)\n } else if (e.key === 'Enter') {\n e.preventDefault()\n insertMention(filteredOptions[activeIndex])\n } else if (e.key === 'Escape') {\n setMentionState(null)\n }\n }, [mentionState, filteredOptions, activeIndex, insertMention])\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node) &&\n textareaRef.current && !textareaRef.current.contains(e.target as Node)) {\n setMentionState(null)\n }\n }\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [])\n\n const wrapperClass = unstyled\n ? className ?? ''\n : ['sg-mentions', `sg-mentions-${size}`, disabled ? 'sg-mentions-disabled' : '', className].filter(Boolean).join(' ')\n\n return (\n <div className={wrapperClass} style={{ ...style, position: 'relative' }}>\n <textarea\n ref={textareaRef}\n className={unstyled ? '' : 'sg-input sg-textarea'}\n value={currentValue}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n rows={rows}\n disabled={disabled}\n />\n {mentionState && filteredOptions.length > 0 && (\n <div\n ref={dropdownRef}\n className={unstyled ? '' : `sg-mentions-dropdown sg-mentions-dropdown-${placement}`}\n role=\"listbox\"\n >\n {filteredOptions.map((opt, i) => (\n <div\n key={opt.value}\n className={unstyled ? '' : [\n 'sg-mentions-option',\n i === activeIndex ? 'sg-mentions-option-active' : '',\n ].filter(Boolean).join(' ')}\n role=\"option\"\n aria-selected={i === activeIndex}\n onClick={() => insertMention(opt)}\n onMouseEnter={() => setActiveIndex(i)}\n >\n {opt.label ?? opt.value}\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n","import { useState } from 'react'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, InteractiveProps, SizableProps } from '../../types'\nimport { Spin } from './Spin'\n\n/** Estimated password strength tier used for the strength meter. */\nexport type PasswordStrength = 'weak' | 'medium' | 'strong' | 'very-strong'\n\n/** Props for the password input with optional visibility toggle and strength UI. */\nexport interface InputPasswordProps extends BaseComponentProps, InteractiveProps, SizableProps {\n /** Controlled password value. */\n value?: string\n /** Initial value when uncontrolled. */\n defaultValue?: string\n /** Input placeholder text. */\n placeholder?: string\n /** Show a control to reveal or hide the password. @default true */\n visibilityToggle?: boolean\n /** Show a strength bar and label when the field has text. @default false */\n showStrength?: boolean\n /** Custom labels for each {@link PasswordStrength} tier (merged with defaults). */\n strengthLabels?: Record<PasswordStrength, string>\n /** Called when the password text changes. */\n onChange?: (value: string) => void\n /** Called when the input loses focus. */\n onBlur?: () => void\n /** Called when the input gains focus. */\n onFocus?: () => void\n /** Exposes validation state to assistive tech. */\n 'aria-invalid'?: boolean | 'false' | 'true' | 'grammar' | 'spelling'\n /** Marks the field as required for assistive tech. */\n 'aria-required'?: boolean | 'false' | 'true'\n}\n\nfunction getStrength(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 defaultStrengthLabels: Record<PasswordStrength, string> = {\n weak: 'Weak',\n medium: 'Medium',\n strong: 'Strong',\n 'very-strong': 'Very strong',\n}\n\n/**\n * Password field with optional show/hide toggle, loading state, and strength indicator.\n */\nexport function InputPassword({\n value,\n defaultValue,\n placeholder,\n visibilityToggle = true,\n showStrength = false,\n strengthLabels,\n size: sizeProp,\n disabled: disabledProp,\n loading,\n onChange,\n onBlur,\n onFocus,\n 'aria-invalid': ariaInvalid,\n 'aria-required': ariaRequired,\n className,\n style,\n unstyled,\n}: InputPasswordProps) {\n const config = useConfig()\n const size = sizeProp ?? config.size ?? 'middle'\n const disabled = disabledProp ?? config.disabled ?? false\n const [visible, setVisible] = useState(false)\n const [internal, setInternal] = useState(defaultValue ?? '')\n const current = value ?? internal\n const labels = { ...defaultStrengthLabels, ...strengthLabels }\n\n const handleChange = (v: string) => {\n setInternal(v)\n onChange?.(v)\n }\n\n const strength = getStrength(current)\n\n if (unstyled) {\n return (\n <span className={className} style={style}>\n <input\n type={visible ? 'text' : 'password'}\n value={current}\n placeholder={placeholder}\n disabled={disabled || loading}\n onChange={(e) => handleChange(e.target.value)}\n onBlur={onBlur}\n onFocus={onFocus}\n />\n {visibilityToggle && (\n <button type=\"button\" onClick={() => setVisible(!visible)}>\n {visible ? 'Hide' : 'Show'}\n </button>\n )}\n </span>\n )\n }\n\n const wrapperClasses = [\n 'sg-input-password-wrapper',\n `sg-input-password-wrapper-${size}`,\n loading ? 'sg-input-wrapper-loading' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const inputClasses = ['sg-input', 'sg-input-password', `sg-input-${size}`]\n .filter(Boolean)\n .join(' ')\n\n return (\n <div style={style}>\n <span className={wrapperClasses}>\n <input\n type={visible ? 'text' : 'password'}\n className={inputClasses}\n value={current}\n placeholder={placeholder}\n disabled={disabled || loading}\n aria-invalid={ariaInvalid}\n aria-required={ariaRequired}\n onChange={(e) => handleChange(e.target.value)}\n onBlur={onBlur}\n onFocus={onFocus}\n />\n {loading && <Spin size=\"small\" />}\n {visibilityToggle && !loading && (\n <button\n type=\"button\"\n className=\"sg-input-password-toggle\"\n onClick={() => setVisible(!visible)}\n tabIndex={-1}\n aria-label={\n visible\n ? (config.locale?.inputPassword?.hidePassword ?? 'Hide password')\n : (config.locale?.inputPassword?.showPassword ?? 'Show password')\n }\n >\n {visible ? '◉' : '○'}\n </button>\n )}\n </span>\n {showStrength && current.length > 0 && (\n <div className=\"sg-input-password-strength\">\n <div className=\"sg-input-password-strength-bar\">\n <span\n className={`sg-input-password-strength-fill sg-input-password-strength-${strength}`}\n />\n </div>\n <span\n className={`sg-input-password-strength-label sg-input-password-strength-${strength}`}\n >\n {labels[strength]}\n </span>\n </div>\n )}\n </div>\n )\n}\n","import { useState, useRef } from 'react'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, InteractiveProps, SizableProps } from '../../types'\nimport { Spin } from './Spin'\n\n/** Props for the search field with optional clear and submit affordances. */\nexport interface SearchInputProps extends BaseComponentProps, InteractiveProps, SizableProps {\n /** Controlled query string. */\n value?: string\n /** Initial query when uncontrolled. */\n defaultValue?: string\n /** Input placeholder. @default 'Search...' */\n placeholder?: string\n /** Show a clear control when there is text and not loading. @default true */\n allowClear?: boolean\n /** Add a submit button; use a string for custom button label. */\n enterButton?: boolean | string\n /** Called when the user submits (Enter or button click). */\n onSearch?: (value: string) => void\n /** Called when the query text changes. */\n onChange?: (value: string) => void\n /** Called when the input loses focus. */\n onBlur?: () => void\n /** Called when the input gains focus. */\n onFocus?: () => void\n}\n\n/**\n * Search box with icon, optional clear button, loading spinner, and optional enter-to-search button.\n */\nexport function SearchInput({\n value,\n defaultValue,\n placeholder = 'Search...',\n allowClear = true,\n enterButton,\n size: sizeProp,\n disabled: disabledProp,\n loading,\n onSearch,\n onChange,\n onBlur,\n onFocus,\n className,\n style,\n unstyled,\n}: SearchInputProps) {\n const config = useConfig()\n const size = sizeProp ?? config.size ?? 'middle'\n const disabled = disabledProp ?? config.disabled ?? false\n const [internal, setInternal] = useState(defaultValue ?? '')\n const current = value ?? internal\n const inputRef = useRef<HTMLInputElement>(null)\n\n const handleChange = (v: string) => {\n setInternal(v)\n onChange?.(v)\n }\n\n const handleSearch = () => {\n if (!disabled && !loading) onSearch?.(current)\n }\n\n const handleClear = () => {\n setInternal('')\n onChange?.('')\n onSearch?.('')\n inputRef.current?.focus()\n }\n\n if (unstyled) {\n return (\n <span className={className} style={style}>\n <input\n ref={inputRef}\n type=\"search\"\n value={current}\n placeholder={placeholder}\n disabled={disabled || loading}\n onChange={(e) => handleChange(e.target.value)}\n onKeyDown={(e) => e.key === 'Enter' && handleSearch()}\n onBlur={onBlur}\n onFocus={onFocus}\n />\n {enterButton && (\n <button type=\"button\" onClick={handleSearch} disabled={disabled || loading}>\n {typeof enterButton === 'string' ? enterButton : 'Search'}\n </button>\n )}\n </span>\n )\n }\n\n const wrapperClasses = [\n 'sg-search-input',\n `sg-search-input-${size}`,\n enterButton ? 'sg-search-input-with-button' : '',\n loading ? 'sg-search-input-loading' : '',\n disabled ? 'sg-search-input-disabled' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <span className={wrapperClasses} style={style}>\n <span className=\"sg-search-input-icon\">⌕</span>\n <input\n ref={inputRef}\n type=\"text\"\n className={`sg-input sg-input-${size} sg-search-input-field`}\n value={current}\n placeholder={placeholder}\n disabled={disabled || loading}\n onChange={(e) => handleChange(e.target.value)}\n onKeyDown={(e) => e.key === 'Enter' && handleSearch()}\n onBlur={onBlur}\n onFocus={onFocus}\n />\n {loading && <Spin size=\"small\" />}\n {allowClear && current && !loading && (\n <button\n type=\"button\"\n className=\"sg-search-input-clear\"\n onClick={handleClear}\n tabIndex={-1}\n aria-label={config.locale?.searchInput?.clear ?? 'Clear'}\n >\n ×\n </button>\n )}\n {enterButton && (\n <button\n type=\"button\"\n className=\"sg-search-input-btn\"\n onClick={handleSearch}\n disabled={disabled || loading}\n >\n {typeof enterButton === 'string' ? enterButton : '⌕'}\n </button>\n )}\n </span>\n )\n}\n","import { useState, useRef, useId } from 'react'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, InteractiveProps, SizableProps } from '../../types'\n\n/** Props for the token/tag chip input. */\nexport interface TagInputProps extends BaseComponentProps, InteractiveProps, SizableProps {\n /** Controlled list of tags. */\n value?: string[]\n /** Initial tags when uncontrolled. @default [] */\n defaultValue?: string[]\n /** Shown when there are no tags. @default 'Add tag...' */\n placeholder?: string\n /** Maximum number of tags allowed. */\n maxTags?: number\n /** Allow the same tag text more than once. @default false */\n allowDuplicates?: boolean\n /** Show remove controls on tags. @default true */\n removable?: boolean\n /** Visual variant for tag chips. @default 'default' */\n tagColor?: 'default' | 'success' | 'error' | 'warning' | 'processing'\n /** Called when the tag list changes. */\n onChange?: (tags: string[]) => void\n /** Called when the text field loses focus (pending text is committed as a tag). */\n onBlur?: () => void\n /** Called when the text field gains focus. */\n onFocus?: () => void\n}\n\n/**\n * Multi-value input where entries become removable tags (Enter/comma, paste, backspace to remove last).\n */\nexport function TagInput({\n value,\n defaultValue = [],\n placeholder = 'Add tag...',\n maxTags,\n allowDuplicates = false,\n removable = true,\n tagColor = 'default',\n size: sizeProp,\n disabled: disabledProp,\n loading,\n onChange,\n onBlur,\n onFocus,\n className,\n style,\n unstyled,\n}: TagInputProps) {\n const config = useConfig()\n const size = sizeProp ?? config.size ?? 'middle'\n const disabled = disabledProp ?? config.disabled ?? false\n const removeTagLabel = config.locale?.tagInput?.removeTag ?? ((tag: string) => `Remove ${tag}`)\n const [internalTags, setInternalTags] = useState<string[]>(defaultValue)\n const [inputValue, setInputValue] = useState('')\n const inputRef = useRef<HTMLInputElement>(null)\n const id = useId()\n const tags = value ?? internalTags\n\n const updateTags = (next: string[]) => {\n setInternalTags(next)\n onChange?.(next)\n }\n\n const addTag = (raw: string) => {\n const tag = raw.trim()\n if (!tag) return\n if (maxTags && tags.length >= maxTags) return\n if (!allowDuplicates && tags.includes(tag)) return\n updateTags([...tags, tag])\n setInputValue('')\n }\n\n const removeTag = (index: number) => {\n updateTags(tags.filter((_, i) => i !== index))\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ',') {\n e.preventDefault()\n addTag(inputValue)\n } else if (e.key === 'Backspace' && !inputValue && tags.length > 0) {\n removeTag(tags.length - 1)\n }\n }\n\n const handlePaste = (e: React.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]\n for (const t of pasted) {\n if (maxTags && next.length >= maxTags) break\n if (!allowDuplicates && next.includes(t)) continue\n next.push(t)\n }\n updateTags(next)\n }\n\n if (unstyled) {\n return (\n <div className={className} style={style}>\n {tags.map((tag, i) => (\n <span key={`${id}-${i}`}>\n {tag}\n {removable && (\n <button type=\"button\" onClick={() => removeTag(i)}>\n ×\n </button>\n )}\n </span>\n ))}\n <input\n ref={inputRef}\n value={inputValue}\n placeholder={tags.length === 0 ? placeholder : ''}\n disabled={disabled || loading}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onBlur={onBlur}\n onFocus={onFocus}\n />\n </div>\n )\n }\n\n const wrapperClasses = [\n 'sg-tag-input',\n `sg-tag-input-${size}`,\n disabled ? 'sg-tag-input-disabled' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const tagColorClass = tagColor !== 'default' ? `sg-tag-${tagColor}` : ''\n\n return (\n <div className={wrapperClasses} style={style} onClick={() => inputRef.current?.focus()}>\n {tags.map((tag, i) => (\n <span key={`${id}-${i}`} className={`sg-tag ${tagColorClass}`}>\n {tag}\n {removable && !disabled && (\n <span\n className=\"sg-tag-close\"\n onClick={(e) => {\n e.stopPropagation()\n removeTag(i)\n }}\n role=\"button\"\n aria-label={removeTagLabel(tag)}\n >\n ×\n </span>\n )}\n </span>\n ))}\n <input\n ref={inputRef}\n className=\"sg-tag-input-field\"\n value={inputValue}\n placeholder={tags.length === 0 ? placeholder : ''}\n disabled={disabled || loading}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n onBlur={() => {\n if (inputValue.trim()) addTag(inputValue)\n onBlur?.()\n }}\n onFocus={onFocus}\n />\n {maxTags && (\n <span className=\"sg-tag-input-count\">\n {tags.length}/{maxTags}\n </span>\n )}\n </div>\n )\n}\n","import { useState, useRef, useCallback, useId } from 'react'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, InteractiveProps, SizableProps } from '../../types'\n\n/** Props for the multi-cell PIN or OTP code input. */\nexport interface PinInputProps extends BaseComponentProps, InteractiveProps, SizableProps {\n /** Number of character cells. @default 6 */\n length?: number\n /** Controlled combined string value (padded/truncated to `length`). */\n value?: string\n /** Initial combined string when uncontrolled. @default '' */\n defaultValue?: string\n /** Use password masking for each cell. @default false */\n mask?: boolean\n /** Allowed character set per cell. @default 'numeric' */\n type?: 'numeric' | 'alphanumeric'\n /** Placeholder shown in empty styled cells. @default '○' */\n placeholder?: string\n /** Focus the first cell on mount. @default false */\n autoFocus?: boolean\n /** Fired once all cells are filled (non-space characters). */\n onComplete?: (value: string) => void\n /** Fired on every change with the trimmed combined value. */\n onChange?: (value: string) => void\n /** Accessible name for the input group. @default 'PIN input' */\n 'aria-label'?: string\n}\n\n/**\n * Fixed-length segmented input for PINs or one-time codes, with paste and arrow-key navigation.\n */\nexport function PinInput({\n length = 6,\n value,\n defaultValue = '',\n mask = false,\n type = 'numeric',\n placeholder = '○',\n autoFocus = false,\n size: sizeProp,\n disabled: disabledProp,\n loading,\n onComplete,\n onChange,\n className,\n style,\n unstyled,\n 'aria-label': ariaLabel = 'PIN input',\n}: PinInputProps) {\n const config = useConfig()\n const size = sizeProp ?? config.size ?? 'middle'\n const disabled = disabledProp ?? config.disabled ?? false\n const id = useId()\n\n const pad = (s: string) => s.padEnd(length, '').slice(0, length)\n const [internal, setInternal] = useState(() => pad(defaultValue))\n const current = value !== undefined ? pad(value) : internal\n const refs = useRef<(HTMLInputElement | null)[]>([])\n\n const pattern = type === 'numeric' ? /^\\d$/ : /^[a-zA-Z0-9]$/\n\n const update = useCallback(\n (next: string) => {\n setInternal(next)\n onChange?.(next.replace(/\\s/g, ''))\n const trimmed = next.replace(/\\s/g, '')\n if (trimmed.length === length) onComplete?.(trimmed)\n },\n [onChange, onComplete, length],\n )\n\n const focusAt = (i: number) => {\n if (i >= 0 && i < length) refs.current[i]?.focus()\n }\n\n const handleChange = (index: number, char: string) => {\n if (!pattern.test(char)) return\n const arr = current.split('')\n arr[index] = char\n update(arr.join(''))\n focusAt(index + 1)\n }\n\n const handleKeyDown = (index: number, e: React.KeyboardEvent) => {\n if (e.key === 'Backspace') {\n e.preventDefault()\n const arr = current.split('')\n if (arr[index] !== ' ') {\n arr[index] = ' '\n update(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\n const handlePaste = (e: React.ClipboardEvent) => {\n e.preventDefault()\n const pasted = e.clipboardData.getData('text').slice(0, length)\n const arr = current.split('')\n let cursor = 0\n for (const ch of pasted) {\n if (pattern.test(ch) && cursor < length) {\n arr[cursor] = ch\n cursor++\n }\n }\n update(arr.join(''))\n focusAt(Math.min(cursor, length - 1))\n }\n\n if (unstyled) {\n return (\n <div className={className} style={style} role=\"group\" aria-label={ariaLabel}>\n {Array.from({ length }, (_, i) => (\n <input\n key={`${id}-${i}`}\n ref={(el) => {\n refs.current[i] = el\n }}\n type={mask ? 'password' : 'text'}\n inputMode={type === 'numeric' ? 'numeric' : 'text'}\n maxLength={1}\n value={current[i] === ' ' ? '' : current[i]}\n disabled={disabled || loading}\n autoFocus={autoFocus && i === 0}\n onChange={(e) => handleChange(i, e.target.value)}\n onKeyDown={(e) => handleKeyDown(i, e)}\n onPaste={handlePaste}\n onFocus={(e) => e.target.select()}\n />\n ))}\n </div>\n )\n }\n\n const wrapperClasses = [\n 'sg-pin-input',\n `sg-pin-input-${size}`,\n disabled ? 'sg-pin-input-disabled' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <div className={wrapperClasses} style={style} role=\"group\" aria-label={ariaLabel}>\n {Array.from({ length }, (_, i) => {\n const filled = current[i] !== ' ' && current[i] !== undefined\n return (\n <input\n key={`${id}-${i}`}\n ref={(el) => {\n refs.current[i] = el\n }}\n className={[\n 'sg-pin-input-cell',\n `sg-pin-input-cell-${size}`,\n filled ? 'sg-pin-input-cell-filled' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n type={mask ? 'password' : 'text'}\n inputMode={type === 'numeric' ? 'numeric' : 'text'}\n maxLength={1}\n placeholder={placeholder}\n value={current[i] === ' ' ? '' : current[i]}\n disabled={disabled || loading}\n autoFocus={autoFocus && i === 0}\n onChange={(e) => handleChange(i, e.target.value)}\n onKeyDown={(e) => handleKeyDown(i, e)}\n onPaste={handlePaste}\n onFocus={(e) => e.target.select()}\n />\n )\n })}\n </div>\n )\n}\n","import { useState, useRef, useEffect } from 'react'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, InteractiveProps, SizableProps } from '../../types'\n\n/** Props for the inline text editor (view vs edit modes). */\nexport interface InlineEditProps extends BaseComponentProps, InteractiveProps, SizableProps {\n /** Controlled text value. */\n value?: string\n /** Initial value when uncontrolled. @default '' */\n defaultValue?: string\n /** Placeholder when the value is empty in view mode. @default 'Click to edit...' */\n placeholder?: string\n /** Whether to show save/cancel controls in edit mode. @default true */\n showButtons?: boolean\n /** Save draft when the input loses focus. @default true */\n saveOnBlur?: boolean\n /** Save draft when Enter is pressed. @default true */\n saveOnEnter?: boolean\n /** Called after a successful save with the new string. */\n onSave?: (value: string) => void\n /** Called when editing is cancelled. */\n onCancel?: () => void\n /** Custom view renderer; receives current value and a function to enter edit mode. */\n renderView?: (value: string, startEditing: () => void) => React.ReactNode\n}\n\n/**\n * Inline field that switches between a read-only view and an editable input.\n * Supports keyboard shortcuts (Enter to save, Escape to cancel).\n */\nexport function InlineEdit({\n value,\n defaultValue = '',\n placeholder = 'Click to edit...',\n showButtons = true,\n saveOnBlur = true,\n saveOnEnter = true,\n size: sizeProp,\n disabled: disabledProp,\n loading,\n onSave,\n onCancel,\n renderView,\n className,\n style,\n unstyled,\n}: InlineEditProps) {\n const config = useConfig()\n const size = sizeProp ?? config.size ?? 'middle'\n const disabled = disabledProp ?? config.disabled ?? false\n const [editing, setEditing] = useState(false)\n const [internal, setInternal] = useState(defaultValue)\n const [draft, setDraft] = useState('')\n const inputRef = useRef<HTMLInputElement>(null)\n const current = value ?? internal\n\n useEffect(() => {\n if (editing) {\n setDraft(current)\n setTimeout(() => inputRef.current?.focus(), 0)\n }\n }, [editing, current])\n\n const startEditing = () => {\n if (disabled || loading) return\n setEditing(true)\n }\n\n const save = () => {\n setEditing(false)\n setInternal(draft)\n onSave?.(draft)\n }\n\n const cancel = () => {\n setEditing(false)\n setDraft(current)\n onCancel?.()\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && saveOnEnter) {\n e.preventDefault()\n save()\n } else if (e.key === 'Escape') {\n cancel()\n }\n }\n\n if (!editing) {\n if (renderView) {\n return <>{renderView(current, startEditing)}</>\n }\n\n if (unstyled) {\n return (\n <span\n className={className}\n style={{ ...style, cursor: disabled ? 'default' : 'pointer' }}\n onClick={startEditing}\n >\n {current || placeholder}\n </span>\n )\n }\n\n return (\n <span\n className={[\n 'sg-inline-edit-view',\n `sg-inline-edit-view-${size}`,\n !current ? 'sg-inline-edit-view-placeholder' : '',\n disabled ? 'sg-inline-edit-view-disabled' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={style}\n onClick={startEditing}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') startEditing()\n }}\n >\n {current || placeholder}\n {!disabled && <span className=\"sg-inline-edit-pencil\">✎</span>}\n </span>\n )\n }\n\n if (unstyled) {\n return (\n <span className={className} style={style}>\n <input\n ref={inputRef}\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={saveOnBlur ? save : undefined}\n />\n {showButtons && (\n <>\n <button type=\"button\" onClick={save}>\n ✓\n </button>\n <button type=\"button\" onClick={cancel}>\n ✕\n </button>\n </>\n )}\n </span>\n )\n }\n\n return (\n <span\n className={['sg-inline-edit', `sg-inline-edit-${size}`, className].filter(Boolean).join(' ')}\n style={style}\n >\n <input\n ref={inputRef}\n className={`sg-input sg-input-${size} sg-inline-edit-input`}\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={saveOnBlur && !showButtons ? save : undefined}\n />\n {showButtons && (\n <span className=\"sg-inline-edit-actions\">\n <button\n type=\"button\"\n className=\"sg-inline-edit-btn sg-inline-edit-btn-save\"\n onClick={save}\n aria-label={config.locale?.inlineEdit?.save ?? 'Save'}\n >\n ✓\n </button>\n <button\n type=\"button\"\n className=\"sg-inline-edit-btn sg-inline-edit-btn-cancel\"\n onClick={cancel}\n aria-label={config.locale?.inlineEdit?.cancel ?? 'Cancel'}\n >\n ✕\n </button>\n </span>\n )}\n </span>\n )\n}\n","import React from 'react'\r\nimport { useConfig } from '../ConfigProvider'\r\nimport type { BaseComponentProps, SizableProps } from '../../types'\r\n\r\n/** Props for grouping an input with optional prefix and suffix addons. */\r\nexport interface InputGroupProps extends BaseComponentProps, SizableProps {\r\n /** Tight visual spacing between addons and the control. @default true */\r\n compact?: boolean\r\n /** Content rendered before the main child (e.g. icon or select). */\r\n before?: React.ReactNode\r\n /** Content rendered after the main child. */\r\n after?: React.ReactNode\r\n /** Primary control (typically an input). */\r\n children: React.ReactNode\r\n}\r\n\r\n/** Horizontally composes a control with optional leading and trailing slots. */\r\nexport function InputGroup({\r\n compact = true,\r\n before,\r\n after,\r\n size: sizeProp,\r\n children,\r\n className,\r\n style,\r\n unstyled,\r\n}: InputGroupProps) {\r\n const config = useConfig()\r\n const size = sizeProp ?? config.size ?? 'middle'\r\n\r\n if (unstyled) {\r\n return (\r\n <span className={className} style={style}>\r\n {before}\r\n {children}\r\n {after}\r\n </span>\r\n )\r\n }\r\n\r\n const classes = [\r\n 'sg-input-group',\r\n `sg-input-group-${size}`,\r\n compact ? 'sg-input-group-compact' : '',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ')\r\n\r\n return (\r\n <span className={classes} style={style}>\r\n {before && <span className=\"sg-input-group-addon\">{before}</span>}\r\n {children}\r\n {after && <span className=\"sg-input-group-addon\">{after}</span>}\r\n </span>\r\n )\r\n}\r\n"],"mappings":"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","names":["useState","useEffect","useState","useEffect","useState","useEffect","useMemo","useCallback","useRef","jsx","jsxs","useMemo","useState","useRef","useEffect","useCallback","useEffect","useCallback","useEffect","useRef","active","jsx","jsxs","useCallback","useEffect","React","jsx","jsxs","React","React","jsx","jsxs","React","useState","jsx","jsxs","items","useState","React","jsx","jsxs","React","clamp","useState","useRef","useEffect","useMemo","useCallback","Fragment","jsx","jsxs","isSameDay","isToday","getDaysInMonth","pad","getMonthGrid","items","useRef","useEffect","useMemo","useCallback","cls","useState","useState","useRef","useEffect","useMemo","useCallback","Fragment","jsx","jsxs","items","useRef","useEffect","cls","useState","useMemo","useCallback","useState","useRef","useEffect","jsx","jsxs","useState","useRef","useEffect","React","useRef","useCallback","jsx","jsxs","React","useRef","useCallback","React","jsx","React","useRef","jsx","jsxs","useRef","useState","useEffect","useRef","jsx","jsxs","useState","useRef","useEffect","useEffect","useCallback","useId","jsx","jsxs","useId","useCallback","useEffect","useState","useRef","useEffect","useId","jsx","jsxs","useState","useRef","useId","useEffect","jsx","jsxs","jsx","jsxs","jsx","React","jsx","jsxs","items","React","useState","useRef","useEffect","useId","jsx","jsxs","items","useState","useRef","useId","useEffect","handleClick","jsx","jsxs","useState","useRef","useEffect","useCallback","jsx","jsxs","items","isActive","useState","useRef","useEffect","jsx","jsxs","items","useState","useRef","useEffect","useState","useRef","useEffect","useCallback","jsx","jsxs","useState","useRef","useEffect","useCallback","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","useState","jsx","jsxs","useState","jsx","jsxs","items","jsx","jsxs","items","useState","useEffect","useCallback","jsx","jsxs","useState","useCallback","useEffect","React","jsx","jsxs","items","React","useEffect","useMemo","useState","useCallback","useMemo","useRef","useRef","useCallback","useMemo","jsx","jsxs","items","useCallback","useMemo","useRef","useState","Fragment","jsx","jsxs","useMemo","useState","useRef","useCallback","useMemo","jsx","jsxs","useMemo","useMemo","jsx","useMemo","jsx","jsxs","useState","useEffect","useMemo","useMemo","useRef","useSyncExternalStore","createCore","useCallback","useEffect","useMemo","useRef","useState","jsx","jsx","jsxs","useMemo","useState","useRef","useEffect","useCallback","useCallback","useEffect","useMemo","useRef","useState","jsx","jsxs","useState","useMemo","useRef","useEffect","useCallback","useMemo","useRef","useState","jsx","useRef","useState","useMemo","useCallback","useMemo","useRef","pointsToPath","jsx","jsxs","clamp","mm","useRef","useMemo","r","pointsToPath","useCallback","useCallback","useEffect","useMemo","useRef","useState","jsx","jsxs","DAY","STEP_MS","toMs","alignDown","alignUp","formatTick","useRef","useState","useMemo","useEffect","useCallback","Fragment","useMemo","Fragment","jsx","jsxs","toMs","useMemo","jsx","jsxs","Fragment","jsx","jsxs","cls","useMemo","useRef","useState","jsx","jsxs","cls","forwardRef","useMemo","useRef","useState","Fragment","jsx","jsxs","cls","useCallback","useImperativeHandle","useMemo","useRef","useRef","useMemo","useCallback","useImperativeHandle","useEffect","useRef","useState","r","Fragment","jsx","jsxs","jsx","jsxs","useRef","useMemo","useState","svg","forwardRef","forwardRef","useMemo","useRef","useState","jsx","jsxs","useRef","useMemo","useState","forwardRef","forwardRef","useMemo","useRef","useState","jsx","jsxs","useRef","useMemo","useState","forwardRef","forwardRef","useMemo","useRef","useState","jsx","jsxs","useRef","useMemo","useState","forwardRef","React","jsx","jsxs","React","React","React","jsx","jsxs","cls","items","React","jsx","jsxs","cls","React","useState","useRef","useEffect","useMemo","useCallback","jsx","jsxs","useMemo","useState","useRef","useCallback","useEffect","useState","jsx","jsxs","useState","useState","useRef","jsx","jsxs","useState","useRef","useState","useRef","useId","jsx","jsxs","useState","useRef","useId","useState","useRef","useCallback","useId","jsx","useId","pad","useState","useRef","useCallback","useState","useRef","useEffect","Fragment","jsx","jsxs","useState","useRef","useEffect","jsx","jsxs"]}
|