@skygraph/react 0.0.0-placeholder.0 → 0.4.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.
Files changed (72) hide show
  1. package/LICENSE +21 -0
  2. package/dist/Table-BqN2u5ma.d.cts +1015 -0
  3. package/dist/Table-IvijKCyd.d.ts +1015 -0
  4. package/dist/chunk-2OCEO636.js +91 -0
  5. package/dist/chunk-2OCEO636.js.map +1 -0
  6. package/dist/chunk-6SHHUUAE.js +1667 -0
  7. package/dist/chunk-6SHHUUAE.js.map +1 -0
  8. package/dist/chunk-BNMJSYI2.js +54 -0
  9. package/dist/chunk-BNMJSYI2.js.map +1 -0
  10. package/dist/chunk-DRBAZI46.js +57 -0
  11. package/dist/chunk-DRBAZI46.js.map +1 -0
  12. package/dist/chunk-GJDDPZH7.js +226 -0
  13. package/dist/chunk-GJDDPZH7.js.map +1 -0
  14. package/dist/chunk-KCFWFDSP.js +847 -0
  15. package/dist/chunk-KCFWFDSP.js.map +1 -0
  16. package/dist/chunk-MJAEAFPN.js +3791 -0
  17. package/dist/chunk-MJAEAFPN.js.map +1 -0
  18. package/dist/chunk-MLEBVELO.js +1412 -0
  19. package/dist/chunk-MLEBVELO.js.map +1 -0
  20. package/dist/chunk-SEQI65CF.js +61 -0
  21. package/dist/chunk-SEQI65CF.js.map +1 -0
  22. package/dist/chunk-ZJF6SJLP.js +200 -0
  23. package/dist/chunk-ZJF6SJLP.js.map +1 -0
  24. package/dist/common-CdpocIEz.d.cts +27 -0
  25. package/dist/common-CdpocIEz.d.ts +27 -0
  26. package/dist/datagrid-B6hg5yJh.d.cts +200 -0
  27. package/dist/datagrid-B6hg5yJh.d.ts +200 -0
  28. package/dist/datagrid.cjs +1052 -0
  29. package/dist/datagrid.cjs.map +1 -0
  30. package/dist/datagrid.d.cts +2 -0
  31. package/dist/datagrid.d.ts +2 -0
  32. package/dist/datagrid.js +10 -0
  33. package/dist/datagrid.js.map +1 -0
  34. package/dist/devtools.cjs +253 -0
  35. package/dist/devtools.cjs.map +1 -0
  36. package/dist/devtools.d.cts +29 -0
  37. package/dist/devtools.d.ts +29 -0
  38. package/dist/devtools.js +9 -0
  39. package/dist/devtools.js.map +1 -0
  40. package/dist/form.cjs +1723 -0
  41. package/dist/form.cjs.map +1 -0
  42. package/dist/form.d.cts +530 -0
  43. package/dist/form.d.ts +530 -0
  44. package/dist/form.js +49 -0
  45. package/dist/form.js.map +1 -0
  46. package/dist/index.cjs +22419 -0
  47. package/dist/index.cjs.map +1 -0
  48. package/dist/index.d.cts +3671 -0
  49. package/dist/index.d.ts +3671 -0
  50. package/dist/index.js +14087 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/table.cjs +4130 -0
  53. package/dist/table.cjs.map +1 -0
  54. package/dist/table.d.cts +31 -0
  55. package/dist/table.d.ts +31 -0
  56. package/dist/table.js +26 -0
  57. package/dist/table.js.map +1 -0
  58. package/dist/tree.cjs +1821 -0
  59. package/dist/tree.cjs.map +1 -0
  60. package/dist/tree.d.cts +348 -0
  61. package/dist/tree.d.ts +348 -0
  62. package/dist/tree.js +13 -0
  63. package/dist/tree.js.map +1 -0
  64. package/dist/virtual.cjs +145 -0
  65. package/dist/virtual.cjs.map +1 -0
  66. package/dist/virtual.d.cts +50 -0
  67. package/dist/virtual.d.ts +50 -0
  68. package/dist/virtual.js +11 -0
  69. package/dist/virtual.js.map +1 -0
  70. package/package.json +108 -18
  71. package/README.md +0 -12
  72. package/index.js +0 -3
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/components/ConfigProvider.tsx","../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/useField.ts","../src/hooks/useForm.ts","../src/hooks/useComputed.ts","../src/components/complex/Form.tsx","../src/components/complex/FormContext.ts","../src/components/complex/FormProvider.tsx","../src/components/complex/Field.tsx","../src/components/ui/Spin.tsx","../src/components/ui/Input.tsx","../src/components/ui/Textarea.tsx","../src/components/ui/Tooltip.tsx","../src/components/ui/Transition.tsx","../src/components/ui/Button.tsx","../src/components/complex/SubmitButton.tsx","../src/components/complex/FormList.tsx","../src/hooks/useWatch.ts","../src/components/complex/Table/Table.tsx","../src/components/ui/Pagination.tsx","../src/components/ui/Checkbox.tsx","../src/components/complex/Table/FilterDropdown.tsx","../src/components/ui/Select.tsx","../src/components/complex/Table/TableHeader.tsx","../src/components/complex/Table/TableBody.tsx","../src/components/complex/Table/export.ts","../src/components/complex/Table/TableGroupRow.tsx","../src/components/complex/Table/VirtualTableBody.tsx","../src/components/complex/Table/ContextMenu.tsx","../src/components/complex/Table/useTableState.ts","../src/hooks/useTable.ts","../src/components/complex/Table/helpers.ts","../src/components/complex/Table/defaultIcons.tsx","../src/components/complex/Table/types.ts","../src/utils/print/printElement.ts","../src/types/slots.ts","../src/components/complex/Tree/Tree.tsx","../src/hooks/useTree.ts","../src/components/complex/Tree/TreeNodeRow.tsx","../src/components/complex/Tree/types.ts","../src/components/complex/TreeSelect/TreeSelect.tsx","../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/hooks/useFieldArray.ts","../src/components/complex/AutoField/AutoField.tsx","../src/adapters/zodAdapter.ts","../src/adapters/jsonSchemaAdapter.ts","../src/components/complex/SchemaForm.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/hooks/useVirtualScroll.ts","../src/components/complex/VirtualList/VirtualList.tsx","../src/hooks/useHistory.ts","../src/components/devtools/HistoryPanel.tsx","../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/DataGrid/DataGrid.tsx","../src/components/complex/DataGrid/useDataGridState.ts","../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":["// 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 React, { createContext, useContext, useMemo } from 'react'\nimport type { SizeType, SgLocale } from '../types'\n\n/**\n * Global Skygraph component configuration merged through React context.\n *\n * По `prefixCls`: сознательно НЕ входит в публичный API до реализации\n * (вариант A в `docs/styling-plan.md`, фаза 4). На практике все корневые классы\n * имеют стабильный префикс `.sg-*`; если нужна изоляция — используйте изолированный\n * скоуп на хосте (шадоу-рут/отдельный контейнер со своими токенами).\n */\nexport interface SgConfig {\n /** Default size token for nested components. */\n size?: SizeType\n /** Disables interactions for nested components when true. */\n disabled?: boolean\n /** Enables bordered styling for nested components when true. */\n bordered?: boolean\n /** Locale messages shallow-merged with the parent provider when set. */\n locale?: SgLocale\n}\n\nconst SgConfigContext = createContext<SgConfig>({})\n\n/** Props for `ConfigProvider`, extending `SgConfig` with React children. */\nexport interface ConfigProviderProps extends SgConfig {\n /** Tree of components that consume merged configuration from this provider. */\n children: React.ReactNode\n}\n\n/**\n * Merges Skygraph configuration with any parent provider and exposes it via context.\n * Descendants read values through `useConfig` or `useConfigWithDefaults`.\n */\nexport function ConfigProvider({ children, ...config }: ConfigProviderProps) {\n const parent = useContext(SgConfigContext)\n\n const merged = useMemo<SgConfig>(\n () => ({\n size: config.size ?? parent.size,\n disabled: config.disabled ?? parent.disabled,\n bordered: config.bordered ?? parent.bordered,\n locale: config.locale\n ? parent.locale\n ? { ...parent.locale, ...config.locale }\n : config.locale\n : parent.locale,\n }),\n [config.size, config.disabled, config.bordered, config.locale, parent],\n )\n\n return <SgConfigContext.Provider value={merged}>{children}</SgConfigContext.Provider>\n}\n\n/** Returns the merged `SgConfig` from the nearest ancestor `ConfigProvider`. */\nexport function useConfig(): SgConfig {\n return useContext(SgConfigContext)\n}\n\n/**\n * Resolves effective `size` and `disabled` from props, context, and explicit defaults.\n * Returns the original props plus `resolvedSize` and `resolvedDisabled` for consumers.\n */\nexport function useConfigWithDefaults<T extends Record<string, unknown>>(\n props: T,\n defaults: { size?: SizeType; disabled?: boolean; bordered?: boolean },\n): T & { resolvedSize: SizeType; resolvedDisabled: boolean } {\n const config = useContext(SgConfigContext)\n\n return useMemo(() => {\n const resolvedSize =\n (props as Record<string, unknown>).size as SizeType | undefined ??\n config.size ??\n defaults.size ??\n 'middle'\n const resolvedDisabled =\n ((props as Record<string, unknown>).disabled as boolean | undefined) ??\n config.disabled ??\n defaults.disabled ??\n false\n\n return { ...props, resolvedSize, resolvedDisabled }\n }, [props, config.size, config.disabled, defaults.size, defaults.disabled])\n}\n","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, useCallback, useRef } from 'react'\nimport type { Core, FormEngine, FieldMeta } from '@skygraph/core'\n\nexport interface UseFieldReturn {\n value: unknown\n errors: string[]\n warnings: string[]\n error: string | null\n touched: boolean\n dirty: boolean\n validating: boolean\n status: 'success' | 'warning' | 'error' | 'validating' | undefined\n onChange: (value: unknown) => void\n onBlur: () => void\n}\n\nexport function useField(\n core: Core,\n form: FormEngine,\n name: string,\n): UseFieldReturn {\n const [value, setValue] = useState(() => form.getValue(name))\n const [meta, setMeta] = useState<FieldMeta>(() => form.getFieldState(name))\n const nameRef = useRef(name)\n nameRef.current = name\n\n useEffect(() => {\n const unsubs: (() => void)[] = []\n\n unsubs.push(\n core.subscribe(name, (v) => {\n setValue(v)\n }),\n )\n\n unsubs.push(\n core.subscribe(`$meta.${name}.errors`, () => {\n setMeta(form.getFieldState(nameRef.current))\n }),\n )\n unsubs.push(\n core.subscribe(`$meta.${name}.warnings`, () => {\n setMeta(form.getFieldState(nameRef.current))\n }),\n )\n unsubs.push(\n core.subscribe(`$meta.${name}.touched`, () => {\n setMeta(form.getFieldState(nameRef.current))\n }),\n )\n unsubs.push(\n core.subscribe(`$meta.${name}.dirty`, () => {\n setMeta(form.getFieldState(nameRef.current))\n }),\n )\n unsubs.push(\n core.subscribe(`$meta.${name}.validating`, () => {\n setMeta(form.getFieldState(nameRef.current))\n }),\n )\n\n return () => {\n for (const u of unsubs) u()\n }\n }, [core, form, name])\n\n const onChange = useCallback(\n (v: unknown) => {\n form.setValue(nameRef.current, v)\n },\n [form],\n )\n\n const onBlur = useCallback(() => {\n form.onFieldBlur(nameRef.current)\n }, [form])\n\n return {\n value,\n errors: meta.errors,\n warnings: meta.warnings,\n error: meta.error,\n touched: meta.touched,\n dirty: meta.dirty,\n validating: meta.validating,\n status: meta.status,\n onChange,\n onBlur,\n }\n}\n","import { useState, useCallback, useMemo, useRef } from 'react'\nimport { createCore, createForm } from '@skygraph/core'\nimport type { Core, FormEngine, FormOptions, FormState, ValidationResult } from '@skygraph/core'\n\nexport interface UseFormOptions extends FormOptions {\n onSubmit?: (values: Record<string, unknown>) => void | Promise<void>\n onSubmitInvalid?: (errors: Record<string, string[]>) => void\n}\n\nexport interface UseFormReturn {\n core: Core\n form: FormEngine\n formState: FormState\n submit: () => Promise<void>\n reset: (values?: Record<string, unknown>) => void\n setFieldValue: (name: string, value: unknown) => void\n setFieldsValue: (values: Record<string, unknown>) => void\n getFieldValue: (name: string) => unknown\n getFieldsValue: () => Record<string, unknown>\n validateFields: (name?: string) => Promise<ValidationResult>\n}\n\nexport function useForm(options?: UseFormOptions): UseFormReturn {\n const optionsRef = useRef(options)\n optionsRef.current = options\n\n const [{ core, form }] = useState(() => {\n const c = createCore()\n const f = createForm(c, options)\n return { core: c, form: f }\n })\n\n const [formState, setFormState] = useState<FormState>(() => form.getFormState())\n\n const refreshState = useCallback(() => {\n setFormState(form.getFormState())\n }, [form])\n\n const submit = useCallback(async () => {\n refreshState()\n await form.submit(async (values) => {\n await optionsRef.current?.onSubmit?.(values)\n })\n\n const state = form.getFormState()\n setFormState(state)\n\n if (!state.isValid && optionsRef.current?.onSubmitInvalid) {\n optionsRef.current.onSubmitInvalid(\n (await form.validate()).errors,\n )\n }\n }, [form, refreshState])\n\n const reset = useCallback(\n (values?: Record<string, unknown>) => {\n form.reset(values)\n setFormState(form.getFormState())\n },\n [form],\n )\n\n const setFieldValue = useCallback(\n (name: string, value: unknown) => {\n form.setValue(name, value)\n },\n [form],\n )\n\n const setFieldsValue = useCallback(\n (values: Record<string, unknown>) => {\n form.setFieldsValue(values)\n },\n [form],\n )\n\n const getFieldValue = useCallback((name: string) => form.getValue(name), [form])\n\n const getFieldsValue = useCallback(() => form.getFieldsValue(), [form])\n\n const validateFields = useCallback((name?: string) => form.validate(name), [form])\n\n return useMemo(\n () => ({\n core,\n form,\n formState,\n submit,\n reset,\n setFieldValue,\n setFieldsValue,\n getFieldValue,\n getFieldsValue,\n validateFields,\n }),\n [\n core,\n form,\n formState,\n submit,\n reset,\n setFieldValue,\n setFieldsValue,\n getFieldValue,\n getFieldsValue,\n validateFields,\n ],\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, { useRef } from 'react'\nimport { FormContext } from './FormContext'\nimport { useForm } from '../../hooks/useForm'\nimport { useConfig } from '../ConfigProvider'\nimport { useFormProviderRegister } from './FormProvider'\nimport type { UseFormOptions, UseFormReturn } from '../../hooks/useForm'\nimport type { ValidationMode } from '@skygraph/core'\n\n/** Props for the root form wrapper; merges {@link UseFormOptions} with layout and UI settings. */\nexport interface FormProps extends UseFormOptions {\n /** Controlled form instance from {@link useForm}; when omitted, an internal instance is created. */\n form?: UseFormReturn\n /** `name` attribute on the native `<form>` element. */\n name?: string\n /** Arrangement of labels and controls.\n * @default 'vertical'\n */\n layout?: 'horizontal' | 'vertical' | 'inline'\n /** Field/control size for context consumers. */\n size?: 'small' | 'middle' | 'large'\n /** Disables fields that read this value from form context. */\n disabled?: boolean\n /** When `true`, appends a colon after labels that support it. */\n colon?: boolean\n /** How required fields are marked in labels (`*` vs “optional”). */\n requiredMark?: boolean | 'optional'\n /** Label column grid settings (24-column) for horizontal layout. */\n labelCol?: {\n /** Column span (out of 24). */\n span?: number\n /** Column offset (out of 24). */\n offset?: number\n }\n /** Control column grid settings (24-column) for horizontal layout. */\n wrapperCol?: {\n /** Column span (out of 24). */\n span?: number\n /** Column offset (out of 24). */\n offset?: number\n }\n /** Text alignment for the label column. */\n labelAlign?: 'left' | 'right'\n /** Additional class names on the `<form>`. */\n className?: string\n /** Inline styles on the `<form>`. */\n style?: React.CSSProperties\n /** Form body content. */\n children: React.ReactNode\n /** After submit, scroll the first invalid field into view (`true` uses smooth centering). */\n scrollToFirstError?: boolean | ScrollIntoViewOptions\n /** Keeps unmounted field values in the form store. */\n preserve?: boolean\n /** Events that trigger validation (passed through to form options). */\n validateTrigger?: ValidationMode | ValidationMode[]\n /** Custom icons shown for field feedback states. */\n feedbackIcons?: {\n /** Icon for successful validation. */\n success?: React.ReactNode\n /** Icon for warning validation. */\n warning?: React.ReactNode\n /** Icon for error validation. */\n error?: React.ReactNode\n /** Icon while async validation is running. */\n validating?: React.ReactNode\n }\n /**\n * Called with the form values when the form passes validation and submits.\n * Alias for `onSubmit`. Both fire; if both are provided, `onSubmit` runs first.\n */\n onFinish?: (values: Record<string, unknown>) => void | Promise<void>\n /**\n * Initial field values. Alias for `defaultValues` (the underlying Form\n * engine option). When both are provided, `defaultValues` wins.\n */\n initialValues?: Record<string, unknown>\n}\n\n/**\n * Renders a `<form>` and provides {@link FormContext} for fields and lists.\n * Submits via the engine’s `submit` and optionally scrolls to the first error.\n */\nexport function Form({\n form: externalForm,\n name: formName,\n layout = 'vertical',\n size: sizeProp,\n disabled: disabledProp,\n colon,\n requiredMark,\n labelCol,\n wrapperCol,\n labelAlign,\n className,\n style,\n children,\n scrollToFirstError,\n preserve,\n feedbackIcons,\n onFinish,\n initialValues,\n ...formOptions\n}: FormProps) {\n const config = useConfig()\n const size = sizeProp ?? config.size ?? 'middle'\n const disabled = disabledProp ?? config.disabled\n\n // `initialValues` is an antd-style alias for the engine's `defaultValues`.\n const mergedFormOptions = {\n ...formOptions,\n defaultValues: formOptions.defaultValues ?? initialValues,\n onSubmit: async (values: Record<string, unknown>) => {\n await formOptions.onSubmit?.(values)\n await onFinish?.(values)\n },\n }\n\n const internalForm = useForm(externalForm ? undefined : mergedFormOptions)\n const { core, form, submit } = externalForm ?? internalForm\n const formRef = useRef<HTMLFormElement>(null)\n\n useFormProviderRegister(formName, form)\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n\n await submit()\n\n if (scrollToFirstError) {\n const result = await form.validate()\n if (!result.valid) {\n const firstErrorField = Object.keys(result.errors)[0]\n if (firstErrorField && formRef.current) {\n const el =\n formRef.current.querySelector(`[data-field-name=\"${firstErrorField}\"]`) ??\n formRef.current.querySelector(`[name=\"${firstErrorField}\"]`)\n if (el) {\n const scrollOpts =\n typeof scrollToFirstError === 'object' ? scrollToFirstError : { behavior: 'smooth' as const, block: 'center' as const }\n el.scrollIntoView(scrollOpts)\n }\n }\n }\n }\n }\n\n const classes = ['sg-form', `sg-form-${layout}`, `sg-form-${size}`]\n if (disabled) classes.push('sg-form-disabled')\n if (className) classes.push(className)\n\n return (\n <FormContext.Provider\n value={{\n core,\n form,\n layout,\n size,\n disabled,\n colon,\n requiredMark,\n labelCol,\n wrapperCol,\n labelAlign,\n preserve,\n feedbackIcons,\n }}\n >\n <form\n ref={formRef}\n name={formName}\n className={classes.join(' ')}\n style={style}\n onSubmit={handleSubmit}\n noValidate\n >\n {children}\n </form>\n </FormContext.Provider>\n )\n}\n","import { createContext, useContext } from 'react'\nimport type React from 'react'\nimport type { Core, FormEngine } from '@skygraph/core'\n\n/** Values exposed by {@link FormContext} to descendant fields and hooks. */\nexport interface FormContextValue {\n /** Shared Skygraph core instance for the form tree. */\n core: Core\n /** Form engine coordinating values, validation, and submit. */\n form: FormEngine\n /** Active form layout from the nearest {@link Form}. */\n layout?: 'horizontal' | 'vertical' | 'inline'\n /** Active control size from the nearest {@link Form}. */\n size?: 'small' | 'middle' | 'large'\n /** Whether the form tree is disabled. */\n disabled?: boolean\n /** Whether labels show a trailing colon. */\n colon?: boolean\n /** Required/optional marking mode for labels. */\n requiredMark?: boolean | 'optional'\n /** Default label column grid for horizontal layout. */\n labelCol?: {\n /** Column span (out of 24). */\n span?: number\n /** Column offset (out of 24). */\n offset?: number\n }\n /** Default control column grid for horizontal layout. */\n wrapperCol?: {\n /** Column span (out of 24). */\n span?: number\n /** Column offset (out of 24). */\n offset?: number\n }\n /** Default label text alignment. */\n labelAlign?: 'left' | 'right'\n /** Whether unmounted field values are preserved. */\n preserve?: boolean\n /** Icons used for field feedback states. */\n feedbackIcons?: {\n /** Success-state icon. */\n success?: React.ReactNode\n /** Warning-state icon. */\n warning?: React.ReactNode\n /** Error-state icon. */\n error?: React.ReactNode\n /** Validating-state icon. */\n validating?: React.ReactNode\n }\n}\n\nexport const FormContext = createContext<FormContextValue | null>(null)\n\n/**\n * Returns the current `FormContextValue` from the nearest {@link Form}.\n * @throws If used outside `<Form>`.\n */\nexport function useFormContext(): FormContextValue {\n const ctx = useContext(FormContext)\n if (!ctx) {\n throw new Error('SkyGraph: useFormContext must be used inside <Form>')\n }\n return ctx\n}\n","import React, { createContext, useCallback, useContext, useMemo, useRef } from 'react'\nimport type { FormEngine } from '@skygraph/core'\n\ninterface FormProviderContextValue {\n registerForm: (name: string, form: FormEngine) => void\n unregisterForm: (name: string) => void\n onFormFinish?: (\n name: string,\n info: { values: Record<string, unknown>; forms: Record<string, FormEngine> },\n ) => void\n onFormChange?: (\n name: string,\n info: { changedFields: string[]; forms: Record<string, FormEngine> },\n ) => void\n}\n\nconst FormProviderContext = createContext<FormProviderContextValue | null>(null)\n\n/** Props for a registry of named forms and their lifecycle callbacks. */\nexport interface FormProviderProps {\n /** Called after a registered form finishes submit successfully. */\n onFormFinish?: (\n name: string,\n info: { values: Record<string, unknown>; forms: Record<string, FormEngine> },\n ) => void\n /** Called when values change in a registered form. */\n onFormChange?: (\n name: string,\n info: { changedFields: string[]; forms: Record<string, FormEngine> },\n ) => void\n /** Tree of forms and other UI that may register with this provider. */\n children: React.ReactNode\n}\n\n/**\n * Provides a context so named {@link Form} instances can register and report\n * `onFormFinish` / `onFormChange` to a single parent.\n */\nexport function FormProvider({ onFormFinish, onFormChange, children }: FormProviderProps) {\n const formsRef = useRef<Record<string, FormEngine>>({})\n\n const registerForm = useCallback((name: string, form: FormEngine) => {\n formsRef.current[name] = form\n }, [])\n\n const unregisterForm = useCallback((name: string) => {\n delete formsRef.current[name]\n }, [])\n\n const value = useMemo<FormProviderContextValue>(\n () => ({\n registerForm,\n unregisterForm,\n onFormFinish,\n onFormChange,\n }),\n [registerForm, unregisterForm, onFormFinish, onFormChange],\n )\n\n return (\n <FormProviderContext.Provider value={value}>{children}</FormProviderContext.Provider>\n )\n}\n\n/**\n * Returns the optional multi-form provider context, or `null` if there is no {@link FormProvider}.\n */\nexport function useFormProvider() {\n return useContext(FormProviderContext)\n}\n\n/**\n * Registers/unregisters a {@link FormEngine} under `name` with the parent {@link FormProvider} on mount/unmount.\n */\nexport function useFormProviderRegister(name: string | undefined, form: FormEngine) {\n const provider = useContext(FormProviderContext)\n\n React.useEffect(() => {\n if (!provider || !name) return\n provider.registerForm(name, form)\n return () => provider.unregisterForm(name)\n }, [provider, name, form])\n\n return provider\n}\n","import React, { useEffect, useId, useRef } from 'react'\nimport { useFormContext } from './FormContext'\nimport { useField } from '../../hooks/useField'\nimport { Input } from '../ui/Input'\nimport { Textarea } from '../ui/Textarea'\nimport { Tooltip } from '../ui/Tooltip'\nimport { Spin } from '../ui/Spin'\nimport { useConfig } from '../ConfigProvider'\nimport type { UseFieldReturn } from '../../hooks/useField'\nimport type { Rule } from '@skygraph/core'\nimport type { BaseComponentProps } from '../../types'\n\n/** Props for a single named field with validation, layout, and optional custom control. */\nexport interface FieldProps extends BaseComponentProps {\n /** Registered path in the form store. */\n name: string\n /** Visible label text; layout comes from {@link FormContext}. */\n label?: string\n /** When `true`, prepends a required rule in addition to `rules`. */\n required?: boolean\n /** Validation rules for this field.\n * @default []\n */\n rules?: Rule[]\n /** Rules that produce warnings without failing validation. */\n warningRules?: Rule[]\n /** Re-validates this field when any listed field changes. */\n dependencies?: string[]\n /** When `true`, the field renders nothing (values can remain registered). */\n hidden?: boolean\n /** Disables the control; falls back to form context `disabled`. */\n disabled?: boolean\n /** Placeholder for the built-in `Input` / `Textarea`. */\n placeholder?: string\n /** Built-in control type when `children` is not provided.\n * @default 'text'\n */\n type?: 'text' | 'email' | 'password' | 'number' | 'textarea'\n /** Helper text shown below the control when there are no errors/warnings. */\n help?: React.ReactNode\n /** Supplementary content below the control area. */\n extra?: React.ReactNode\n /** Tooltip title wrapping the label text. */\n tooltip?: string\n /** Custom control, render prop, or omit for default input/textarea. */\n children?: React.ReactNode | ((field: UseFieldReturn) => React.ReactNode)\n // New props\n /** Renders only the control (validation wiring) without layout chrome. */\n noStyle?: boolean\n /** Maps raw change values before committing to the store. */\n normalize?: (value: unknown, prevValue: unknown) => unknown\n /** Custom extractor for control events (reserved for controlled wrappers). */\n getValueFromEvent?: (...args: unknown[]) => unknown\n /** Prop name on the child that holds the value (for custom controls). */\n valuePropName?: string\n /** Stops after the first failing rule when validating. */\n validateFirst?: boolean\n /** Manual validation status badge; overrides engine-derived status when set. */\n validateStatus?: 'success' | 'warning' | 'error' | 'validating'\n /** Shows feedback icons when the field has been touched. */\n hasFeedback?: boolean\n /** Keeps value on unregister; overrides form-level `preserve` when set. */\n preserve?: boolean\n /** Overrides form `labelCol` for this field in horizontal layout. */\n labelCol?: {\n /** Column span (out of 24). */\n span?: number\n /** Column offset (out of 24). */\n offset?: number\n }\n /** Overrides form `wrapperCol` for this field in horizontal layout. */\n wrapperCol?: {\n /** Column span (out of 24). */\n span?: number\n /** Column offset (out of 24). */\n offset?: number\n }\n /** Template variables merged into validation messages for this field. */\n messageVariables?: Record<string, string>\n}\n\nfunction FeedbackIcon({\n status,\n icons,\n}: {\n status: 'success' | 'warning' | 'error' | 'validating' | undefined\n icons?: {\n success?: React.ReactNode\n warning?: React.ReactNode\n error?: React.ReactNode\n validating?: React.ReactNode\n }\n}) {\n if (!status) return null\n\n const defaults: Record<string, React.ReactNode> = {\n validating: <Spin size=\"small\" />,\n error: <span className=\"sg-field-feedback-icon sg-field-feedback-error\">✕</span>,\n warning: <span className=\"sg-field-feedback-icon sg-field-feedback-warning\">!</span>,\n success: <span className=\"sg-field-feedback-icon sg-field-feedback-success\">✓</span>,\n }\n\n return <span className=\"sg-field-feedback\">{icons?.[status] ?? defaults[status]}</span>\n}\n\n/**\n * Registers `name` with the form engine, renders label/help/errors, and either\n * a built-in input or custom `children` / render-prop control.\n */\nexport function Field({\n name,\n label,\n required,\n rules = [],\n warningRules,\n dependencies,\n hidden,\n disabled: fieldDisabled,\n unstyled,\n placeholder,\n type = 'text',\n help,\n extra,\n tooltip,\n children,\n noStyle,\n normalize,\n getValueFromEvent: _getValueFromEvent,\n validateFirst,\n validateStatus: manualStatus,\n hasFeedback,\n preserve,\n labelCol: fieldLabelCol,\n wrapperCol: fieldWrapperCol,\n messageVariables: _messageVariables,\n}: FieldProps) {\n const ctx = useFormContext()\n const { core, form } = ctx\n const disabled = fieldDisabled ?? ctx.disabled\n const formLocale = useConfig().locale?.form\n const requiredMarker = formLocale?.required ?? '*'\n const optionalMarker = formLocale?.optional ?? '(optional)'\n const autoId = useId()\n const fieldId = `sg-field-${autoId.replace(/:/g, '')}-${name.replace(/\\./g, '-')}`\n const helpId = `${fieldId}-help`\n const field = useField(core, form, name)\n const prevValueRef = useRef<unknown>(field.value)\n\n useEffect(() => {\n const allRules: Rule[] = [...rules]\n if (required) {\n allRules.unshift({ required: true })\n }\n form.register(name, {\n rules: allRules,\n warningRules,\n dependencies,\n validateFirst,\n label,\n preserve: preserve ?? ctx.preserve,\n })\n return () => form.unregister(name)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [name, form, required])\n\n if (hidden) return null\n\n const wrappedOnChange = normalize\n ? (v: unknown) => {\n const normalized = normalize(v, prevValueRef.current)\n prevValueRef.current = normalized\n field.onChange(normalized)\n }\n : field.onChange\n\n const effectiveStatus = manualStatus ?? field.status\n const hasErrors = field.errors.length > 0\n const hasWarnings = field.warnings.length > 0\n\n // Layout\n const layout = ctx.layout ?? 'vertical'\n const lCol = fieldLabelCol ?? ctx.labelCol\n const wCol = fieldWrapperCol ?? ctx.wrapperCol\n const labelAlign = ctx.labelAlign ?? 'right'\n\n const labelNode = label ? (\n <label\n htmlFor={fieldId}\n className=\"sg-field-label\"\n style={\n layout === 'horizontal' && lCol?.offset\n ? { marginLeft: `${(lCol.offset / 24) * 100}%` }\n : undefined\n }\n >\n {tooltip ? (\n <Tooltip title={tooltip}>\n <span>{label}</span>\n </Tooltip>\n ) : (\n label\n )}\n {(required || ctx.requiredMark === true) && (\n <span className=\"sg-field-required\">{requiredMarker}</span>\n )}\n {ctx.requiredMark === 'optional' && !required && (\n <span className=\"sg-field-optional\">{optionalMarker}</span>\n )}\n {ctx.colon && ':'}\n </label>\n ) : null\n\n const errorNodes = hasErrors ? (\n <div id={helpId} className=\"sg-field-error\" role=\"alert\">\n {field.errors.map((e, i) => (\n <div key={i}>{e}</div>\n ))}\n </div>\n ) : null\n\n const warningNodes =\n hasWarnings && !hasErrors ? (\n <div id={helpId} className=\"sg-field-warning\">\n {field.warnings.map((w, i) => (\n <div key={i}>{w}</div>\n ))}\n </div>\n ) : null\n\n const helpNode =\n errorNodes ??\n warningNodes ??\n (help ? (\n <div id={helpId} className=\"sg-field-help\">\n {help}\n </div>\n ) : null)\n const describedBy = helpNode ? helpId : undefined\n\n const extraNode = extra ? <div className=\"sg-field-extra\">{extra}</div> : null\n\n const feedbackIcon =\n hasFeedback && field.touched ? (\n <FeedbackIcon status={effectiveStatus} icons={ctx.feedbackIcons} />\n ) : null\n\n // Render children\n const renderControl = () => {\n if (typeof children === 'function') {\n return (\n <>\n {children({ ...field, onChange: wrappedOnChange })}\n {feedbackIcon}\n </>\n )\n }\n\n if (children) {\n return (\n <>\n {children}\n {feedbackIcon}\n </>\n )\n }\n\n const inputElement =\n type === 'textarea' ? (\n <Textarea\n id={fieldId}\n value={(field.value as string) ?? ''}\n onChange={(v) => wrappedOnChange(v)}\n onBlur={field.onBlur}\n disabled={disabled}\n placeholder={placeholder}\n unstyled={unstyled}\n aria-invalid={hasErrors || undefined}\n aria-required={required || undefined}\n aria-describedby={describedBy}\n />\n ) : (\n <Input\n id={fieldId}\n type={type}\n value={(field.value as string) ?? ''}\n onChange={(v) => wrappedOnChange(type === 'number' ? Number(v) : v)}\n onBlur={field.onBlur}\n disabled={disabled}\n placeholder={placeholder}\n unstyled={unstyled}\n aria-invalid={hasErrors || undefined}\n aria-required={required || undefined}\n aria-describedby={describedBy}\n />\n )\n\n return (\n <>\n {inputElement}\n {feedbackIcon}\n </>\n )\n }\n\n // noStyle — just validation, no wrapper\n if (noStyle) {\n return <>{renderControl()}</>\n }\n\n // unstyled — minimal structure\n if (unstyled) {\n return (\n <>\n {labelNode}\n {renderControl()}\n {helpNode}\n {extraNode}\n </>\n )\n }\n\n // Horizontal layout with grid\n if (layout === 'horizontal' && lCol) {\n const labelSpan = lCol.span ?? 6\n const wrapperSpan = wCol?.span ?? 24 - labelSpan\n const labelPct = `${(labelSpan / 24) * 100}%`\n const wrapperPct = `${(wrapperSpan / 24) * 100}%`\n\n return (\n <div\n className={[\n 'sg-field',\n 'sg-field-horizontal',\n hasErrors ? 'sg-field-has-error' : '',\n hasWarnings && !hasErrors ? 'sg-field-has-warning' : '',\n effectiveStatus ? `sg-field-status-${effectiveStatus}` : '',\n ]\n .filter(Boolean)\n .join(' ')}\n data-field-name={name}\n >\n <div\n className=\"sg-field-label-wrap\"\n style={{\n width: labelPct,\n textAlign: labelAlign,\n }}\n >\n {labelNode}\n </div>\n <div className=\"sg-field-control-wrap\" style={{ width: wrapperPct }}>\n <div className=\"sg-field-control\">{renderControl()}</div>\n {helpNode}\n {extraNode}\n </div>\n </div>\n )\n }\n\n // Default vertical / inline layout\n const fieldClasses = [\n 'sg-field',\n hasErrors ? 'sg-field-has-error' : '',\n hasWarnings && !hasErrors ? 'sg-field-has-warning' : '',\n effectiveStatus ? `sg-field-status-${effectiveStatus}` : '',\n ]\n\n return (\n <div className={fieldClasses.filter(Boolean).join(' ')} data-field-name={name}>\n {labelNode}\n <div className=\"sg-field-control\">{renderControl()}</div>\n {helpNode}\n {extraNode}\n </div>\n )\n}\n","import React from 'react'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, SizableProps } from '../../types'\n\n/** Props for loading spinner, overlay, and optional content blur. */\nexport interface SpinProps extends BaseComponentProps, SizableProps {\n /** When `true`, shows the loading state (subject to `delay`). @default true */\n spinning?: boolean\n /** Milliseconds to wait before showing the spinner after `spinning` becomes true. */\n delay?: number\n /** Optional text below the indicator. */\n tip?: string\n /** When `true`, covers the viewport instead of inline or wrapping children. */\n fullscreen?: boolean\n /** Custom spinner node; defaults to a styled status element. */\n indicator?: React.ReactNode\n /** When set, shows an overlay with blur on this content while loading. */\n children?: React.ReactNode\n}\n\n/**\n * Loading indicator with optional delay, tip, fullscreen mode, and child overlay.\n */\nexport function Spin({\n spinning = true,\n size: sizeProp,\n delay,\n tip,\n fullscreen,\n indicator,\n children,\n className,\n style,\n unstyled,\n}: SpinProps) {\n const config = useConfig()\n const resolvedSize = sizeProp ?? config.size ?? 'middle'\n\n const [visible, setVisible] = React.useState(delay ? false : spinning)\n\n React.useEffect(() => {\n if (!delay) {\n setVisible(spinning)\n return\n }\n\n if (spinning) {\n const timer = setTimeout(() => setVisible(true), delay)\n return () => clearTimeout(timer)\n }\n\n setVisible(false)\n }, [spinning, delay])\n\n if (!visible && !children) return null\n if (!visible && children) return <>{children}</>\n\n const spinSizeClass = resolvedSize === 'middle' ? 'default' : resolvedSize\n const spinClasses = unstyled\n ? (className ?? '')\n : ['sg-spin', `sg-spin-${spinSizeClass}`, className].filter(Boolean).join(' ')\n\n const spinElement = indicator ?? (\n <span\n className={spinClasses}\n style={style}\n role=\"status\"\n aria-live=\"polite\"\n aria-label={config.locale?.spin?.loading ?? 'Loading'}\n />\n )\n\n if (fullscreen) {\n return (\n <div className={unstyled ? '' : 'sg-spin-fullscreen'}>\n <div className={unstyled ? '' : 'sg-spin-fullscreen-inner'}>\n {spinElement}\n {tip && <div className={unstyled ? '' : 'sg-spin-tip'}>{tip}</div>}\n </div>\n </div>\n )\n }\n\n if (!children) {\n return (\n <span className={unstyled ? '' : 'sg-spin-standalone'} style={style}>\n {spinElement}\n {tip && <div className={unstyled ? '' : 'sg-spin-tip'}>{tip}</div>}\n </span>\n )\n }\n\n return (\n <div className={unstyled ? '' : 'sg-spin-container'} style={style}>\n <div className={unstyled ? '' : 'sg-spin-overlay'}>\n {spinElement}\n {tip && <div className={unstyled ? '' : 'sg-spin-tip'}>{tip}</div>}\n </div>\n <div className={visible ? (unstyled ? '' : 'sg-spin-blur') : ''}>{children}</div>\n </div>\n )\n}\n","import { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, InteractiveProps, SizableProps } from '../../types'\nimport { Spin } from './Spin'\n\n/** Props for the Input component. */\nexport interface InputProps extends BaseComponentProps, InteractiveProps, SizableProps {\n /** Controlled input value. */\n value?: string\n /** Uncontrolled initial value. */\n defaultValue?: string\n /** Placeholder text when the field is empty. */\n placeholder?: string\n /** Native HTML input type. @default 'text' */\n type?: 'text' | 'email' | 'password' | 'number'\n /**\n * Marks the field as read-only. The value is selectable and submitted\n * but cannot be edited. Sets the HTML `readonly` attribute,\n * `aria-readonly=\"true\"`, and adds the `sg-input-readonly` modifier class.\n * @default false\n */\n readOnly?: boolean\n /** DOM id forwarded to the underlying `<input>`. */\n id?: string\n /** Exposes invalid state to assistive technologies. */\n 'aria-invalid'?: boolean | 'false' | 'true' | 'grammar' | 'spelling'\n /** Marks the field as required for assistive technologies. */\n 'aria-required'?: boolean | 'false' | 'true'\n /** Connects the input to description / error nodes for assistive technologies. */\n 'aria-describedby'?: string\n /** Called when the text value 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/** Single-line text input with optional loading indicator and configurable HTML type. */\nexport function Input({\n value,\n defaultValue,\n placeholder,\n type = 'text',\n readOnly = false,\n size: sizeProp,\n disabled: disabledProp,\n loading,\n onChange,\n onBlur,\n onFocus,\n 'aria-invalid': ariaInvalid,\n 'aria-required': ariaRequired,\n 'aria-describedby': ariaDescribedBy,\n id,\n className,\n style,\n unstyled,\n}: InputProps) {\n const config = useConfig()\n const size = sizeProp ?? config.size ?? 'middle'\n const disabled = disabledProp ?? config.disabled ?? false\n\n const wrapperClasses = unstyled\n ? className ?? ''\n : [\n 'sg-input-wrapper',\n `sg-input-wrapper-${size}`,\n loading ? 'sg-input-wrapper-loading' : '',\n readOnly ? 'sg-input-wrapper-readonly' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const inputClasses = unstyled\n ? ''\n : [\n 'sg-input',\n `sg-input-${size}`,\n readOnly ? 'sg-input-readonly' : '',\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <span className={wrapperClasses} style={style}>\n <input\n id={id}\n type={type}\n className={inputClasses}\n value={value}\n defaultValue={defaultValue}\n placeholder={placeholder}\n disabled={disabled || loading}\n readOnly={readOnly}\n aria-invalid={ariaInvalid}\n aria-required={ariaRequired}\n aria-readonly={readOnly || undefined}\n aria-describedby={ariaDescribedBy}\n onChange={(e) => onChange?.(e.target.value)}\n onBlur={onBlur}\n onFocus={onFocus}\n />\n {loading && <Spin size=\"small\" unstyled={unstyled} />}\n </span>\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 multiline text field with optional character count and loading overlay. */\nexport interface TextareaProps extends BaseComponentProps, InteractiveProps, SizableProps {\n /** Controlled value; when omitted, uses internal state seeded by `defaultValue`. */\n value?: string\n /** Initial value when uncontrolled. */\n defaultValue?: string\n /** Placeholder shown when empty. */\n placeholder?: string\n /** Visible row count on the native textarea. @default 4 */\n rows?: number\n /** Hard cap on input length enforced in the change handler. */\n maxLength?: number\n /** Shows current length (and `maxLength` when set) beside the field in styled mode. */\n showCount?: boolean\n /** DOM id forwarded to the underlying `<textarea>`. */\n id?: string\n /** Exposes invalid state to assistive technologies. */\n 'aria-invalid'?: boolean | 'false' | 'true' | 'grammar' | 'spelling'\n /** Connects the textarea to description / error nodes for assistive technologies. */\n 'aria-describedby'?: string\n /** Marks the field as required for assistive technologies. */\n 'aria-required'?: boolean | 'false' | 'true'\n /** Emits the full string on each change. */\n onChange?: (value: string) => void\n /** Passed through to the textarea blur event. */\n onBlur?: () => void\n /** Passed through to the textarea focus event. */\n onFocus?: () => void\n}\n\n/**\n * Styled textarea with configurable rows, optional character count, and loading state from shared interactive props.\n */\nexport function Textarea({\n value,\n defaultValue,\n placeholder,\n rows = 4,\n maxLength,\n showCount,\n disabled: disabledProp,\n loading,\n size: sizeProp,\n onChange,\n onBlur,\n onFocus,\n id,\n 'aria-invalid': ariaInvalid,\n 'aria-describedby': ariaDescribedBy,\n 'aria-required': ariaRequired,\n className,\n style,\n unstyled,\n}: TextareaProps) {\n const config = useConfig()\n const disabled = disabledProp ?? config.disabled\n const size = sizeProp ?? config.size ?? 'middle'\n\n const [internalValue, setInternalValue] = React.useState(value ?? defaultValue ?? '')\n const currentValue = value ?? internalValue\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const v = e.target.value\n if (maxLength && v.length > maxLength) return\n setInternalValue(v)\n onChange?.(v)\n }\n\n const wrapperClass = unstyled\n ? className ?? ''\n : ['sg-textarea-wrapper', `sg-textarea-${size}`, loading ? 'sg-textarea-wrapper-loading' : '', className]\n .filter(Boolean)\n .join(' ')\n\n return (\n <div className={wrapperClass} style={style}>\n <textarea\n id={id}\n className={unstyled ? '' : 'sg-input sg-textarea'}\n value={currentValue}\n placeholder={placeholder}\n rows={rows}\n disabled={disabled || loading}\n aria-disabled={disabled || loading}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedBy}\n aria-required={ariaRequired}\n onChange={handleChange}\n onBlur={onBlur}\n onFocus={onFocus}\n />\n {loading && <Spin size=\"small\" unstyled={unstyled} />}\n {showCount && !unstyled && (\n <span className=\"sg-textarea-count\">\n {currentValue.length}{maxLength ? ` / ${maxLength}` : ''}\n </span>\n )}\n </div>\n )\n}\n","import React, { useState, useRef, useId, cloneElement, isValidElement } from 'react'\nimport { Transition } from './Transition'\nimport type { BaseComponentProps } from '../../types'\n\n/** Props for the Tooltip component. */\nexport interface TooltipProps extends BaseComponentProps {\n /** Content shown in the tooltip on hover. */\n title: React.ReactNode\n /** Tooltip position relative to the trigger. @default 'top' */\n placement?: 'top' | 'bottom' | 'left' | 'right'\n /** Single React element that receives hover / focus handlers as the trigger. */\n children: React.ReactElement\n}\n\ntype TriggerProps = {\n 'aria-describedby'?: string\n onFocus?: (e: React.FocusEvent) => void\n onBlur?: (e: React.FocusEvent) => void\n}\n\n/**\n * Shows floating help text on hover or keyboard focus, with optional placement and fade transition.\n * The `aria-describedby` link is forwarded to the trigger element so assistive tech reads it on focus.\n */\nexport function Tooltip({\n title,\n placement = 'top',\n children,\n className,\n unstyled,\n}: TooltipProps) {\n const [visible, setVisible] = useState(false)\n const ref = useRef<HTMLDivElement>(null)\n const tooltipId = useId()\n\n const triggerWithAria = isValidElement(children)\n ? cloneElement(children as React.ReactElement<TriggerProps>, {\n 'aria-describedby': visible\n ? [(children.props as TriggerProps)['aria-describedby'], tooltipId].filter(Boolean).join(' ')\n : (children.props as TriggerProps)['aria-describedby'],\n onFocus: (e: React.FocusEvent) => {\n setVisible(true)\n ;(children.props as TriggerProps).onFocus?.(e)\n },\n onBlur: (e: React.FocusEvent) => {\n setVisible(false)\n ;(children.props as TriggerProps).onBlur?.(e)\n },\n })\n : children\n\n if (unstyled) {\n return (\n <div\n className={className}\n onMouseEnter={() => setVisible(true)}\n onMouseLeave={() => setVisible(false)}\n style={{ position: 'relative', display: 'inline-block' }}\n >\n {triggerWithAria}\n {visible && <div id={tooltipId} role=\"tooltip\">{title}</div>}\n </div>\n )\n }\n\n return (\n <div\n className={['sg-tooltip-wrapper', className].filter(Boolean).join(' ')}\n onMouseEnter={() => setVisible(true)}\n onMouseLeave={() => setVisible(false)}\n ref={ref}\n >\n {triggerWithAria}\n <Transition visible={visible} name=\"sg-fade\" unmountOnExit>\n <div id={tooltipId} role=\"tooltip\" className={`sg-tooltip sg-tooltip-${placement}`}>\n <div className=\"sg-tooltip-content\">{title}</div>\n <div className=\"sg-tooltip-arrow\" />\n </div>\n </Transition>\n </div>\n )\n}\n","import React, { useState, useEffect, useRef, useCallback } from 'react'\n\n/** Props for class-based enter/leave animation on a single child element. */\nexport interface TransitionProps {\n /** When `true`, runs enter; when `false`, runs leave (and may unmount). */\n visible: boolean\n /** Base class name prefix for default enter/leave classes (e.g. `sg-fade-enter-from`). @default 'sg-fade' */\n name?: string\n /** Animation length in ms before idle phase and after callbacks. @default 200 */\n duration?: number\n /** Custom initial class for the enter frame (with `-enter-active`). */\n enterFrom?: string\n /** Custom final class for the enter-active frame. */\n enterTo?: string\n /** Custom initial class for the leave frame (with `-leave-active`). */\n leaveFrom?: string\n /** Custom final class for the leave-active frame. */\n leaveTo?: string\n /** Fires once the enter transition timer completes. */\n onAfterEnter?: () => void\n /** Fires once the leave transition timer completes. */\n onAfterLeave?: () => void\n /** Single React element whose `className` will be merged with transition classes. */\n children: React.ReactElement<{ className?: string; ref?: React.Ref<HTMLElement> }>\n /** When `true`, removes the child from the tree after leave; when `false`, keeps it mounted. @default true */\n unmountOnExit?: boolean\n}\n\ntype Phase = 'idle' | 'enter' | 'enter-active' | 'leave' | 'leave-active'\n\n/**\n * Clones a single child and toggles CSS classes over `duration` when `visible` changes, optionally unmounting after leave.\n */\nexport function Transition({\n visible,\n name = 'sg-fade',\n duration = 200,\n enterFrom,\n enterTo,\n leaveFrom,\n leaveTo,\n onAfterEnter,\n onAfterLeave,\n children,\n unmountOnExit = true,\n}: TransitionProps) {\n const [mounted, setMounted] = useState(visible)\n const [phase, setPhase] = useState<Phase>(visible ? 'idle' : 'idle')\n const nodeRef = useRef<HTMLElement | null>(null)\n const timerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n const prevVisible = useRef(visible)\n\n const getEnterClasses = useCallback(() => {\n if (enterFrom && enterTo) return { from: enterFrom, active: `${name}-enter-active`, to: enterTo }\n return { from: `${name}-enter-from`, active: `${name}-enter-active`, to: `${name}-enter-to` }\n }, [name, enterFrom, enterTo])\n\n const getLeaveClasses = useCallback(() => {\n if (leaveFrom && leaveTo) return { from: leaveFrom, active: `${name}-leave-active`, to: leaveTo }\n return { from: `${name}-leave-from`, active: `${name}-leave-active`, to: `${name}-leave-to` }\n }, [name, leaveFrom, leaveTo])\n\n useEffect(() => {\n if (visible === prevVisible.current) return\n prevVisible.current = visible\n clearTimeout(timerRef.current)\n\n if (visible) {\n setMounted(true)\n setPhase('enter')\n requestAnimationFrame(() => {\n requestAnimationFrame(() => setPhase('enter-active'))\n })\n timerRef.current = setTimeout(() => {\n setPhase('idle')\n onAfterEnter?.()\n }, duration)\n } else {\n setPhase('leave')\n requestAnimationFrame(() => {\n requestAnimationFrame(() => setPhase('leave-active'))\n })\n timerRef.current = setTimeout(() => {\n setPhase('idle')\n if (unmountOnExit) setMounted(false)\n onAfterLeave?.()\n }, duration)\n }\n }, [visible, duration, unmountOnExit, onAfterEnter, onAfterLeave])\n\n useEffect(() => {\n return () => clearTimeout(timerRef.current)\n }, [])\n\n if (!mounted && unmountOnExit) return null\n\n const enterC = getEnterClasses()\n const leaveC = getLeaveClasses()\n\n let transitionClass = ''\n switch (phase) {\n case 'enter':\n transitionClass = `${enterC.from} ${enterC.active}`\n break\n case 'enter-active':\n transitionClass = `${enterC.to} ${enterC.active}`\n break\n case 'leave':\n transitionClass = `${leaveC.from} ${leaveC.active}`\n break\n case 'leave-active':\n transitionClass = `${leaveC.to} ${leaveC.active}`\n break\n }\n\n return React.cloneElement(children, {\n ref: nodeRef,\n className: [children.props.className, transitionClass].filter(Boolean).join(' '),\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 Button component. */\nexport interface ButtonProps extends BaseComponentProps, InteractiveProps, SizableProps {\n /** Visual style variant. @default 'default' */\n type?: 'default' | 'primary' | 'dashed' | 'text' | 'link'\n /** Native HTML button type attribute. @default 'button' */\n htmlType?: 'button' | 'submit' | 'reset'\n /**\n * Visually flags a destructive action. Combines with `type` (e.g. a\n * `danger` `primary` button is solid red, a `danger` `text` is red text).\n * Adds the `sg-button-danger` modifier class.\n * @default false\n */\n danger?: boolean\n /** Stretches the button to fill its parent container. @default false */\n block?: boolean\n /** Click event handler. */\n onClick?: (e: React.MouseEvent<HTMLButtonElement>) => void\n /** Button content. */\n children?: React.ReactNode\n}\n\n/** General-purpose button with multiple visual variants, sizes, and loading state. */\nexport function Button({\n type = 'default',\n size: sizeProp,\n disabled: disabledProp,\n loading,\n htmlType = 'button',\n danger = false,\n block = false,\n onClick,\n children,\n className,\n style,\n unstyled,\n}: ButtonProps) {\n const config = useConfig()\n const size = sizeProp ?? config.size ?? 'middle'\n const disabled = disabledProp ?? config.disabled ?? false\n\n const classes = unstyled\n ? className ?? ''\n : [\n 'sg-button',\n `sg-button-${type}`,\n `sg-button-${size}`,\n danger ? 'sg-button-danger' : '',\n block ? 'sg-button-block' : '',\n loading ? 'sg-button-loading' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <button\n type={htmlType}\n className={classes}\n style={style}\n disabled={disabled || loading}\n aria-disabled={disabled || loading}\n aria-busy={loading}\n onClick={onClick}\n >\n {loading && <Spin size=\"small\" unstyled={unstyled} />}\n {children}\n </button>\n )\n}\n","import React from 'react'\nimport { Button } from '../ui/Button'\n\n/** Props for a primary-styled submit {@link Button} used inside {@link Form}. */\nexport interface SubmitButtonProps {\n /** Button label; falls back when omitted in destructuring.\n * @default 'Submit'\n */\n children?: React.ReactNode\n /** Disables the button. */\n disabled?: boolean\n /** Shows a loading state on the button. */\n loading?: boolean\n /** Extra class names passed to {@link Button}. */\n className?: string\n /** Inline styles forwarded to the underlying {@link Button}. */\n style?: React.CSSProperties\n /** Strips built-in button styles on the underlying {@link Button}. */\n unstyled?: boolean\n}\n\n/**\n * `type=\"submit\"` primary button; forwards disabled/loading and styling to {@link Button}.\n */\nexport function SubmitButton({\n children = 'Submit',\n disabled,\n loading,\n className,\n style,\n unstyled,\n}: SubmitButtonProps) {\n return (\n <Button\n type=\"primary\"\n htmlType=\"submit\"\n disabled={disabled}\n loading={loading}\n className={className}\n style={style}\n unstyled={unstyled}\n >\n {children}\n </Button>\n )\n}\n","import React, { useState, useCallback, useMemo, useRef } from 'react'\nimport { useFormContext } from './FormContext'\nimport { useWatch } from '../../hooks/useWatch'\nimport type { FormListOperation } from '@skygraph/core'\n\nlet listUid = 0\nfunction genKey(): string {\n return `fl_${++listUid}`\n}\n\n/** Stable identity and position of one row in a {@link FormList}. */\nexport interface FormListField {\n /** Stable React key for list reconciliation. */\n key: string\n /** Zero-based index in the list value array. */\n index: number\n}\n\n/** Props for a dynamic array field bound to form state. */\nexport interface FormListProps {\n /** Field path in the form store holding the array value. */\n name: string\n /** Seeds the store when the path is unset on first mount. */\n initialValue?: unknown[]\n /** When `true`, each row receives `dragProps` for HTML5 drag-and-drop reordering. */\n draggable?: boolean\n /** Render function receiving fields, list operations, and validation meta. */\n children: (\n fields: FormListField[],\n operation: FormListOperation,\n meta: { errors: string[] },\n ) => React.ReactNode\n}\n\n/**\n * Manages an array at `name` with stable keys, add/remove/move/replace helpers,\n * and optional drag reordering when `draggable` is enabled.\n */\nexport function FormList({ name, initialValue, draggable, children }: FormListProps) {\n const { core, form } = useFormContext()\n\n React.useEffect(() => {\n if (initialValue && !Array.isArray(core.get(name))) {\n core.set(name, initialValue)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const listValue = useWatch(core, name)\n const items = Array.isArray(listValue) ? listValue : []\n\n const [keys, setKeys] = useState<string[]>(() => items.map(() => genKey()))\n\n React.useEffect(() => {\n setKeys((prev) => {\n if (prev.length === items.length) return prev\n if (items.length > prev.length) {\n return [...prev, ...Array.from({ length: items.length - prev.length }, () => genKey())]\n }\n return prev.slice(0, items.length)\n })\n }, [items.length])\n\n const fields = useMemo(\n () => keys.slice(0, items.length).map((key, index) => ({ key, index })),\n [keys, items.length],\n )\n\n const add = useCallback(\n (defaultValue?: unknown, insertIndex?: number) => {\n form.listAdd(name, defaultValue, insertIndex)\n setKeys((prev) => {\n const k = genKey()\n if (insertIndex !== undefined && insertIndex >= 0 && insertIndex <= prev.length) {\n const next = [...prev]\n next.splice(insertIndex, 0, k)\n return next\n }\n return [...prev, k]\n })\n },\n [form, name],\n )\n\n const remove = useCallback(\n (index: number | number[]) => {\n form.listRemove(name, index)\n setKeys((prev) => {\n if (Array.isArray(index)) {\n const indices = new Set(index)\n return prev.filter((_, i) => !indices.has(i))\n }\n return prev.filter((_, i) => i !== index)\n })\n },\n [form, name],\n )\n\n const move = useCallback(\n (from: number, to: number) => {\n form.listMove(name, from, to)\n setKeys((prev) => {\n const next = [...prev]\n const [item] = next.splice(from, 1)\n next.splice(to, 0, item)\n return next\n })\n },\n [form, name],\n )\n\n const replace = useCallback(\n (values: unknown[]) => {\n form.listReplace(name, values)\n setKeys(values.map(() => genKey()))\n },\n [form, name],\n )\n\n const operation: FormListOperation = useMemo(\n () => ({ add, remove, move, replace }),\n [add, remove, move, replace],\n )\n\n const meta = useMemo(() => ({ errors: form.getFieldErrors(name) }), [form, name])\n\n // Drag reorder support\n const dragIdx = useRef<number>(-1)\n const dragOverIdx = useRef<number>(-1)\n\n if (!draggable) {\n return <>{children(fields, operation, meta)}</>\n }\n\n const dragFields = fields.map((f) => ({\n ...f,\n dragProps: {\n draggable: true,\n onDragStart: () => {\n dragIdx.current = f.index\n },\n onDragOver: (e: React.DragEvent) => {\n e.preventDefault()\n dragOverIdx.current = f.index\n },\n onDrop: () => {\n if (dragIdx.current !== -1 && dragOverIdx.current !== -1 && dragIdx.current !== dragOverIdx.current) {\n move(dragIdx.current, dragOverIdx.current)\n }\n dragIdx.current = -1\n dragOverIdx.current = -1\n },\n onDragEnd: () => {\n dragIdx.current = -1\n dragOverIdx.current = -1\n },\n },\n }))\n\n return <>{children(dragFields, operation, meta)}</>\n}\n","import { useEffect, useState } from 'react'\nimport type { Core } from '@skygraph/core'\n\nexport function useWatch(core: Core, name: string): unknown {\n const [value, setValue] = useState(() => core.get(name))\n\n useEffect(() => {\n setValue(core.get(name))\n return core.subscribe(name, (v) => {\n setValue(v)\n })\n }, [core, name])\n\n return value\n}\n","import React, { forwardRef, useCallback, useImperativeHandle, useMemo, useRef } from 'react'\nimport { Input } from '../../ui/Input'\nimport { Pagination } from '../../ui/Pagination'\nimport { Spin } from '../../ui/Spin'\nimport { Checkbox } from '../../ui/Checkbox'\nimport { TableHeader } from './TableHeader'\nimport { TableBody } from './TableBody'\nimport { VirtualTableBody } from './VirtualTableBody'\nimport { ContextMenu } from './ContextMenu'\nimport { useTableState } from './useTableState'\nimport { useConfig } from '../../ConfigProvider'\nimport {\n toCSVString,\n downloadCSV,\n toTSVString,\n toJSONString,\n downloadJSON,\n copyToClipboard,\n} from './export'\nimport { printElement } from '../../../utils/print'\nimport type { PrintOptions } from '../../../utils/print'\nimport { slotClass, slotStyle } from '../../../types'\nimport type { TableProps, TableClassNames, TableStyles } from './types'\n\n/**\n * Императивный API таблицы для ref.print() и других ref-методов.\n */\nexport interface TableRef {\n /**\n * Открыть popup и вызвать window.print() для текущей DOM-области таблицы.\n * Опции мерджатся с теми, что заданы через prop `printable`\n * (на уровне prop приоритетен `fileName`).\n */\n print: (opts?: PrintOptions) => void\n}\n\nconst DRAG_HANDLE_WIDTH = '32px'\nconst ROW_NUMBER_WIDTH = '48px'\n\n/**\n * Data table with sorting, filtering, selection, grouping, virtualization, and export tools.\n * Layout and behavior are driven by `TableProps` and internal `useTableState`.\n */\nfunction TableInner(props: TableProps, forwardedRef: React.ForwardedRef<TableRef>) {\n const {\n rowSelection,\n expandable,\n sticky,\n draggable,\n searchable,\n showPagination = true,\n bordered: borderedProp,\n size: sizeProp,\n scroll,\n summary,\n onRowClick,\n onCellEdit,\n loading: loadingProp,\n rowClassName,\n className,\n style,\n unstyled,\n rowDraggable,\n onRowOrderChange,\n headerContextMenu,\n cellContextMenu,\n columnVisibility,\n virtual: virtualProp,\n exportable,\n onExport,\n selectionSummary,\n selectionActions,\n striped,\n showSizeChanger,\n pageSizeOptions,\n showQuickJumper,\n showTotal,\n onPageSizeChange,\n showRowNumber,\n footer,\n fullscreenable,\n densityToggle,\n groupBy,\n groupByOptions,\n onGroupByChange,\n keyboardNavigation,\n emptyContent,\n printable,\n exportJSON,\n highlightOnHover,\n columnAutoResize,\n columnPinning,\n classNames: slotCls,\n styles: slotSty,\n } = props\n\n const sCls: TableClassNames = slotCls ?? {}\n const sSty: TableStyles = slotSty ?? {}\n\n const config = useConfig()\n const sizeFromProp = sizeProp ?? config.size ?? 'middle'\n const bordered = borderedProp ?? config.bordered ?? false\n const loading = loadingProp ?? false\n\n const state = useTableState(props)\n const tableRef = useRef<HTMLDivElement>(null)\n const scrollRef = useRef<HTMLDivElement>(null)\n\n const effectiveSize = densityToggle ? state.density : sizeFromProp\n\n // Memoised so the empty `{}` literal stays referentially stable across\n // renders — otherwise `useMemo(gridTemplate, [rowNumConfig, ...])` below\n // would invalidate every render whenever `showRowNumber === true`.\n const rowNumConfig = useMemo(\n () => (showRowNumber ? (typeof showRowNumber === 'object' ? showRowNumber : {}) : null),\n [showRowNumber],\n )\n\n const getExportData = useCallback(() => {\n const cols = state.columns.map((c) => c.key)\n const headers = state.columns.map((c) => (typeof c.title === 'string' ? c.title : c.key))\n const rows = state.flatRows\n .filter((r) => !r.__groupRow)\n .map((row) =>\n cols.map((k) => {\n const v = row.data[k]\n return v == null ? '' : String(v)\n }),\n )\n return { cols, headers, rows }\n }, [state.columns, state.flatRows])\n\n const handleExportCSV = useCallback(() => {\n const { headers, rows } = getExportData()\n const data = [headers, ...rows]\n if (onExport) {\n onExport(data)\n } else {\n downloadCSV(toCSVString(data))\n }\n }, [getExportData, onExport])\n\n const handleExportJSON = useCallback(() => {\n const { headers, rows } = getExportData()\n downloadJSON(toJSONString(headers, rows))\n }, [getExportData])\n\n const handleCopy = useCallback(async () => {\n const { headers, rows } = getExportData()\n await copyToClipboard(toTSVString([headers, ...rows]))\n }, [getExportData])\n\n const printOptionsFromProp: PrintOptions = 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(tableRef.current, { ...printOptionsFromProp, ...(opts ?? {}) })\n },\n [printOptionsFromProp],\n )\n\n const handlePrint = useCallback(() => {\n doPrint()\n }, [doPrint])\n\n useImperativeHandle(forwardedRef, () => ({ print: doPrint }), [doPrint])\n\n // Grid template\n const gridTemplate = useMemo(() => {\n const parts: string[] = []\n if (rowDraggable) parts.push(DRAG_HANDLE_WIDTH)\n if (rowNumConfig) parts.push(rowNumConfig.width ? `${rowNumConfig.width}px` : ROW_NUMBER_WIDTH)\n parts.push(state.gridTemplate)\n return parts.join(' ')\n }, [rowDraggable, rowNumConfig, state.gridTemplate])\n\n const totalCols = state.totalCols + (rowDraggable ? 1 : 0) + (rowNumConfig ? 1 : 0)\n\n const virtualConfig = virtualProp\n ? {\n rowHeight: typeof virtualProp === 'object' ? (virtualProp.rowHeight ?? 40) : 40,\n estimateRowHeight:\n typeof virtualProp === 'object' ? virtualProp.estimateRowHeight : undefined,\n overscan: typeof virtualProp === 'object' ? (virtualProp.overscan ?? 5) : 5,\n height: typeof virtualProp === 'object' ? virtualProp.height : undefined,\n }\n : null\n\n // Fixed-height fast path: number `rowHeight` + no measurement estimate.\n // We pin every visible cell to that height via CSS so the rendered DOM's\n // `scrollHeight` matches the engine's `totalHeight` exactly — without\n // this, natural cell padding makes the two drift apart by a few pixels\n // per row and the scrollbar thumb lags behind the cursor while dragged.\n const virtualFixedRowHeight =\n virtualConfig &&\n typeof virtualConfig.rowHeight === 'number' &&\n virtualConfig.estimateRowHeight == null\n ? virtualConfig.rowHeight\n : null\n\n // Unstyled\n if (unstyled) {\n return (\n <div className={className} style={style} role=\"table\">\n <div role=\"rowgroup\">\n <div role=\"row\">\n {state.columns.map((col) => (\n <span\n key={col.key}\n role=\"columnheader\"\n onClick={(e) => state.handleSort(col, e.shiftKey)}\n >\n {col.title}\n </span>\n ))}\n </div>\n </div>\n <div role=\"rowgroup\">\n {state.flatRows.map((row) => (\n <div key={row.id} role=\"row\">\n {state.columns.map((col) => (\n <span key={col.key} role=\"cell\">\n {col.render\n ? col.render(row.data[col.key], row.data, row.id)\n : String(row.data[col.key] ?? '')}\n </span>\n ))}\n </div>\n ))}\n </div>\n </div>\n )\n }\n\n const hasToolbar =\n searchable ||\n columnVisibility ||\n exportable ||\n exportJSON ||\n fullscreenable ||\n densityToggle ||\n printable ||\n groupBy ||\n (groupByOptions && groupByOptions.length > 0)\n\n const wrapperCls = [\n 'sg-table-wrapper',\n `sg-table-${effectiveSize}`,\n bordered ? 'sg-table-bordered' : '',\n sticky || virtualConfig ? 'sg-table-sticky' : '',\n loading ? 'sg-table-loading' : '',\n striped ? 'sg-table-striped' : '',\n state.isFullscreen ? 'sg-table-fullscreen' : '',\n highlightOnHover === false ? '' : 'sg-table-hoverable',\n sCls.root,\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const scrollStyle: React.CSSProperties = {}\n if (scroll?.x) scrollStyle.overflowX = 'auto'\n if (virtualConfig) {\n // Virtualization needs an owned vertical scroll so it can observe the\n // viewport. `virtual.height` wins over `scroll.y` for the body window.\n scrollStyle.overflowY = 'auto'\n scrollStyle.height = virtualConfig.height ?? scroll?.y ?? 400\n } else if (scroll?.y) {\n scrollStyle.overflowY = 'auto'\n scrollStyle.maxHeight = scroll.y\n }\n\n const selectedCount = rowSelection?.selectedKeys.length ?? 0\n\n return (\n <div\n className={wrapperCls}\n style={slotStyle(sSty.root, style)}\n ref={(el) => {\n ;(tableRef as React.MutableRefObject<HTMLDivElement | null>).current = el\n ;(state.wrapperRef as React.MutableRefObject<HTMLDivElement | null>).current = el\n }}\n onKeyDown={keyboardNavigation ? state.handleKeyNav : undefined}\n tabIndex={keyboardNavigation ? 0 : undefined}\n >\n {/* Toolbar */}\n {hasToolbar && (\n <div className={slotClass('sg-table-toolbar', sCls.toolbar)} style={sSty.toolbar}>\n {searchable && (\n <Input\n placeholder={state.t.searchPlaceholder}\n size=\"small\"\n value={state.searchText}\n onChange={state.setSearchText}\n style={{ maxWidth: 240 }}\n />\n )}\n <div className=\"sg-table-toolbar-right\">\n {groupByOptions && groupByOptions.length > 0 && (\n <GroupByDropdown\n value={groupBy ?? null}\n options={groupByOptions}\n onChange={onGroupByChange ?? (() => {})}\n t={state.t}\n />\n )}\n {groupBy && (\n <div className=\"sg-table-toolbar-group\">\n <button className=\"sg-table-toolbar-btn\" onClick={state.expandAllGroups}>\n {state.t.groupExpand}\n </button>\n <button className=\"sg-table-toolbar-btn\" onClick={state.collapseAllGroups}>\n {state.t.groupCollapse}\n </button>\n </div>\n )}\n {densityToggle && (\n <DensityDropdown value={state.density} onChange={state.setDensity} t={state.t} />\n )}\n {columnVisibility && (\n <ColumnVisibilityDropdown\n leafColumns={state.leafColumns}\n hiddenSet={state.hiddenSet}\n onToggle={state.toggleColumnVisibility}\n label={state.t.showColumns}\n />\n )}\n {exportable && (\n <>\n <button className=\"sg-table-toolbar-btn\" onClick={handleExportCSV}>\n {state.t.exportCSV}\n </button>\n <button className=\"sg-table-toolbar-btn\" onClick={handleCopy}>\n {state.t.copyTable}\n </button>\n </>\n )}\n {exportJSON && (\n <button className=\"sg-table-toolbar-btn\" onClick={handleExportJSON}>\n {state.t.exportJSON}\n </button>\n )}\n {printable && (\n <button className=\"sg-table-toolbar-btn\" onClick={handlePrint}>\n {state.t.print}\n </button>\n )}\n {fullscreenable && (\n <button className=\"sg-table-toolbar-btn\" onClick={state.toggleFullscreen}>\n {state.isFullscreen ? state.t.exitFullscreen : state.t.fullscreen}\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Selection Summary Bar */}\n {selectionSummary && selectedCount > 0 && (\n <div className=\"sg-table-selection-bar\">\n <span className=\"sg-table-selection-count\">{state.t.selectedRows(selectedCount)}</span>\n {selectionActions?.map((action) => (\n <button\n key={action.key}\n className={`sg-table-selection-action${action.danger ? ' sg-table-selection-action-danger' : ''}`}\n onClick={() =>\n action.onClick(\n rowSelection!.selectedKeys,\n state.visibleRows\n .filter((r) => rowSelection!.selectedKeys.includes(r.id))\n .map((r) => r.data),\n )\n }\n >\n {action.label}\n </button>\n ))}\n <button\n className=\"sg-table-selection-clear\"\n onClick={() => rowSelection?.onChange([], [])}\n >\n ✕\n </button>\n </div>\n )}\n\n <div\n ref={scrollRef}\n className={slotClass('sg-table-scroll', scroll?.x ? 'sg-table-scroll-x' : '', sCls.scroll)}\n style={slotStyle(\n Object.keys(scrollStyle).length > 0 ? scrollStyle : undefined,\n sSty.scroll,\n )}\n >\n {/* Pinned top rows */}\n {state.pinnedTop.length > 0 && (\n <div\n className=\"sg-table-pinned-top\"\n style={{ gridTemplateColumns: gridTemplate, minWidth: scroll?.x }}\n >\n <TableBody\n columns={state.columns}\n flatRows={state.pinnedTop}\n rowSelection={rowSelection}\n expandable={expandable}\n isTreeMode={state.isTreeMode}\n indentSize={state.indentSize}\n treeExpanded={state.treeExpanded}\n expandedKeys={state.expandedKeys}\n totalCols={totalCols}\n spanMap={state.spanMap}\n hiddenCells={state.hiddenCells}\n t={state.t}\n rowClassName={rowClassName}\n fixedStyle={state.fixedStyle}\n onRowClick={onRowClick}\n onCellEdit={onCellEdit}\n onSelectRow={state.handleSelectRow}\n onToggleExpand={state.handleToggleExpand}\n onToggleTreeExpand={state.handleToggleTreeExpand}\n onContextMenu={state.setContextMenu}\n striped={false}\n isPinnedSection\n slotClassNames={sCls}\n slotStyles={sSty}\n />\n </div>\n )}\n\n <div\n className={slotClass(\n 'sg-table-grid',\n virtualFixedRowHeight != null ? 'sg-table-grid-virtual-fixed' : '',\n sCls.grid,\n )}\n style={slotStyle(\n {\n gridTemplateColumns: gridTemplate,\n minWidth: scroll?.x,\n ...(virtualFixedRowHeight != null\n ? ({\n ['--sg-virtual-row-height' as string]: `${virtualFixedRowHeight}px`,\n } as React.CSSProperties)\n : null),\n },\n sSty.grid,\n )}\n role=\"table\"\n >\n <TableHeader\n columns={state.columns}\n headerRows={state.headerRows}\n hasColumnGroups={state.hasColumnGroups}\n rowSelection={rowSelection}\n expandable={expandable}\n draggable={draggable}\n allSelected={state.allSelected}\n someSelected={state.someSelected}\n dragOver={state.dragOver}\n t={state.t}\n fixedStyle={state.fixedStyle}\n onSort={state.handleSort}\n onSelectAll={state.handleSelectAll}\n onDragStart={state.handleDragStart}\n onDragOver={state.handleDragOver}\n onDragLeave={state.setDragOver}\n onDrop={state.handleDrop}\n onDragEnd={state.handleDragEnd}\n onResizeStart={state.handleResizeStart}\n filterState={state.filterState}\n filterActions={state.filterActions}\n filterRef={state.filterRef}\n sorts={state.sorts}\n getSortIndex={state.getSortIndex}\n getSortDirection={state.getSortDirection}\n headerContextMenu={headerContextMenu}\n onContextMenu={state.setContextMenu}\n showRowNumber={!!rowNumConfig}\n rowDraggable={rowDraggable}\n columnPinning={columnPinning}\n onPinColumn={state.handlePinColumn}\n onAutoResize={columnAutoResize ? state.handleAutoResize : undefined}\n slotClassNames={sCls}\n slotStyles={sSty}\n />\n\n {virtualConfig ? (\n <VirtualTableBody\n columns={state.columns}\n flatRows={state.flatRows}\n rowHeight={virtualConfig.rowHeight}\n estimateRowHeight={virtualConfig.estimateRowHeight}\n overscan={virtualConfig.overscan}\n scrollContainerRef={scrollRef}\n rowSelection={rowSelection}\n expandable={expandable}\n isTreeMode={state.isTreeMode}\n indentSize={state.indentSize}\n treeExpanded={state.treeExpanded}\n expandedKeys={state.expandedKeys}\n totalCols={totalCols}\n spanMap={state.spanMap}\n hiddenCells={state.hiddenCells}\n t={state.t}\n rowClassName={rowClassName}\n fixedStyle={state.fixedStyle}\n onRowClick={onRowClick}\n onCellEdit={onCellEdit}\n onSelectRow={state.handleSelectRow}\n onToggleExpand={state.handleToggleExpand}\n onToggleTreeExpand={state.handleToggleTreeExpand}\n rowDraggable={rowDraggable}\n showRowNumber={!!rowNumConfig}\n cellContextMenu={cellContextMenu}\n onContextMenu={state.setContextMenu}\n striped={striped}\n groupBy={groupBy}\n onToggleGroup={state.toggleGroupExpand}\n focusedCell={state.focusedCell}\n onFocusCell={state.setFocusedCell}\n keyboardNavigation={keyboardNavigation}\n emptyContent={emptyContent}\n slotClassNames={sCls}\n slotStyles={sSty}\n />\n ) : (\n <TableBody\n columns={state.columns}\n flatRows={state.flatRows}\n rowSelection={rowSelection}\n expandable={expandable}\n isTreeMode={state.isTreeMode}\n indentSize={state.indentSize}\n treeExpanded={state.treeExpanded}\n expandedKeys={state.expandedKeys}\n totalCols={totalCols}\n spanMap={state.spanMap}\n hiddenCells={state.hiddenCells}\n t={state.t}\n rowClassName={rowClassName}\n fixedStyle={state.fixedStyle}\n onRowClick={onRowClick}\n onCellEdit={onCellEdit}\n onSelectRow={state.handleSelectRow}\n onToggleExpand={state.handleToggleExpand}\n onToggleTreeExpand={state.handleToggleTreeExpand}\n rowDraggable={rowDraggable}\n onRowOrderChange={onRowOrderChange}\n cellContextMenu={cellContextMenu}\n onContextMenu={state.setContextMenu}\n striped={striped}\n showRowNumber={!!rowNumConfig}\n groupBy={groupBy}\n onToggleGroup={state.toggleGroupExpand}\n focusedCell={state.focusedCell}\n onFocusCell={state.setFocusedCell}\n keyboardNavigation={keyboardNavigation}\n emptyContent={emptyContent}\n slotClassNames={sCls}\n slotStyles={sSty}\n />\n )}\n\n {/* Aggregation footer */}\n {footer && state.aggregates && (\n <div\n className={['sg-table-footer-row', sCls.footer].filter(Boolean).join(' ')}\n role=\"row\"\n style={{ display: 'contents', ...sSty.footer }}\n >\n {rowDraggable && <div className=\"sg-table-td sg-table-footer-cell\" role=\"cell\" />}\n {rowNumConfig && <div className=\"sg-table-td sg-table-footer-cell\" role=\"cell\" />}\n {rowSelection && <div className=\"sg-table-td sg-table-footer-cell\" role=\"cell\" />}\n {expandable && <div className=\"sg-table-td sg-table-footer-cell\" role=\"cell\" />}\n {state.columns.map((col) => (\n <div\n key={col.key}\n className=\"sg-table-td sg-table-footer-cell\"\n role=\"cell\"\n style={state.fixedStyle(col)}\n >\n {state.aggregates![col.key] != null ? (\n <span className=\"sg-table-aggregate-value\">\n <span className=\"sg-table-aggregate-label\">\n {typeof col.aggregate === 'string' ? state.t[col.aggregate] : ''}\n </span>{' '}\n {String(state.aggregates![col.key])}\n </span>\n ) : null}\n </div>\n ))}\n </div>\n )}\n\n {/* Summary rows (custom) */}\n {summary &&\n state.visibleRows &&\n summary(state.visibleRows).map((cells, ri) => (\n <div\n key={`sum-${ri}`}\n className=\"sg-table-summary-row\"\n role=\"row\"\n style={{ display: 'contents' }}\n >\n {cells.map((cell, ci) => (\n <div\n key={ci}\n className=\"sg-table-td sg-table-summary-cell\"\n role=\"cell\"\n style={{\n gridColumn: cell.colSpan ? `span ${cell.colSpan}` : undefined,\n textAlign: cell.align,\n }}\n >\n {cell.content}\n </div>\n ))}\n </div>\n ))}\n </div>\n\n {/* Pinned bottom rows */}\n {state.pinnedBottom.length > 0 && (\n <div\n className=\"sg-table-pinned-bottom\"\n style={{ gridTemplateColumns: gridTemplate, minWidth: scroll?.x }}\n >\n <TableBody\n columns={state.columns}\n flatRows={state.pinnedBottom}\n rowSelection={rowSelection}\n expandable={expandable}\n isTreeMode={state.isTreeMode}\n indentSize={state.indentSize}\n treeExpanded={state.treeExpanded}\n expandedKeys={state.expandedKeys}\n totalCols={totalCols}\n spanMap={state.spanMap}\n hiddenCells={state.hiddenCells}\n t={state.t}\n rowClassName={rowClassName}\n fixedStyle={state.fixedStyle}\n onRowClick={onRowClick}\n onCellEdit={onCellEdit}\n onSelectRow={state.handleSelectRow}\n onToggleExpand={state.handleToggleExpand}\n onToggleTreeExpand={state.handleToggleTreeExpand}\n onContextMenu={state.setContextMenu}\n striped={false}\n isPinnedSection\n slotClassNames={sCls}\n slotStyles={sSty}\n />\n </div>\n )}\n </div>\n\n {/* Context Menu */}\n <ContextMenu state={state.contextMenu} onClose={() => state.setContextMenu(null)} />\n\n {loading && (\n <div className=\"sg-table-loading-mask\">\n <Spin size=\"large\" />\n </div>\n )}\n\n {showPagination && state.tableState.totalPages > 1 && (\n <div className={slotClass('sg-table-pagination', sCls.pagination)} style={sSty.pagination}>\n <span className=\"sg-table-pagination-total\">\n {state.t.totalRows(state.tableState.filteredRows)}\n </span>\n <Pagination\n current={state.tableState.page}\n total={state.tableState.filteredRows}\n pageSize={state.tableState.pageSize}\n onChange={state.setPage}\n showSizeChanger={showSizeChanger}\n pageSizeOptions={pageSizeOptions}\n showQuickJumper={showQuickJumper}\n showTotal={showTotal}\n onPageSizeChange={onPageSizeChange}\n />\n </div>\n )}\n </div>\n )\n}\n\n/**\n * Data table — основная экспортная функция (forwardRef-обёртка над `TableInner`).\n * Ref-методы — см. `TableRef`.\n */\nexport const Table = forwardRef<TableRef, TableProps>(TableInner)\nTable.displayName = 'Table'\n\nfunction ColumnVisibilityDropdown({\n leafColumns,\n hiddenSet,\n onToggle,\n label,\n}: {\n leafColumns: { key: string; title: React.ReactNode }[]\n hiddenSet: Set<string>\n onToggle: (key: string) => void\n label: string\n}) {\n const [open, setOpen] = React.useState(false)\n const ref = React.useRef<HTMLDivElement>(null)\n\n React.useEffect(() => {\n if (!open) return\n const h = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false)\n }\n document.addEventListener('mousedown', h)\n return () => document.removeEventListener('mousedown', h)\n }, [open])\n\n return (\n <div ref={ref} style={{ position: 'relative' }}>\n <button className=\"sg-table-toolbar-btn\" onClick={() => setOpen(!open)}>\n {label}\n </button>\n {open && (\n <div className=\"sg-table-col-visibility-dropdown\">\n {leafColumns.map((col) => (\n <label key={col.key} className=\"sg-table-col-visibility-item\">\n <Checkbox checked={!hiddenSet.has(col.key)} onChange={() => onToggle(col.key)} />\n <span>{typeof col.title === 'string' ? col.title : col.key}</span>\n </label>\n ))}\n </div>\n )}\n </div>\n )\n}\n\nfunction GroupByDropdown({\n value,\n options,\n onChange,\n t,\n}: {\n value: string | null\n options: Array<{ key: string; label: React.ReactNode }>\n onChange: (field: string | null) => void\n t: { groupByLabel: string; groupByNone: string }\n}) {\n const [open, setOpen] = React.useState(false)\n const ref = React.useRef<HTMLDivElement>(null)\n\n React.useEffect(() => {\n if (!open) return\n const h = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false)\n }\n document.addEventListener('mousedown', h)\n return () => document.removeEventListener('mousedown', h)\n }, [open])\n\n const current = value ? options.find((o) => o.key === value) : null\n\n return (\n <div ref={ref} style={{ position: 'relative' }}>\n <button className=\"sg-table-toolbar-btn\" onClick={() => setOpen(!open)}>\n {t.groupByLabel}\n {current ? `: ${typeof current.label === 'string' ? current.label : current.key}` : ''}\n </button>\n {open && (\n <div className=\"sg-table-group-by-dropdown\" role=\"menu\">\n <button\n type=\"button\"\n className={`sg-table-group-by-option${value === null ? ' sg-table-group-by-active' : ''}`}\n onClick={() => {\n onChange(null)\n setOpen(false)\n }}\n >\n {t.groupByNone}\n </button>\n {options.map((opt) => (\n <button\n key={opt.key}\n type=\"button\"\n className={`sg-table-group-by-option${value === opt.key ? ' sg-table-group-by-active' : ''}`}\n onClick={() => {\n onChange(opt.key)\n setOpen(false)\n }}\n >\n {opt.label}\n </button>\n ))}\n </div>\n )}\n </div>\n )\n}\n\nfunction DensityDropdown({\n value,\n onChange,\n t,\n}: {\n value: 'small' | 'middle' | 'large'\n onChange: (v: 'small' | 'middle' | 'large') => void\n t: { density: string; densitySmall: string; densityMiddle: string; densityLarge: string }\n}) {\n const [open, setOpen] = React.useState(false)\n const ref = React.useRef<HTMLDivElement>(null)\n\n React.useEffect(() => {\n if (!open) return\n const h = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false)\n }\n document.addEventListener('mousedown', h)\n return () => document.removeEventListener('mousedown', h)\n }, [open])\n\n const options: Array<{ key: 'small' | 'middle' | 'large'; label: string }> = [\n { key: 'small', label: t.densitySmall },\n { key: 'middle', label: t.densityMiddle },\n { key: 'large', label: t.densityLarge },\n ]\n\n return (\n <div ref={ref} style={{ position: 'relative' }}>\n <button className=\"sg-table-toolbar-btn\" onClick={() => setOpen(!open)}>\n {t.density}\n </button>\n {open && (\n <div className=\"sg-table-density-dropdown\">\n {options.map((opt) => (\n <button\n key={opt.key}\n className={`sg-table-density-option${value === opt.key ? ' sg-table-density-active' : ''}`}\n onClick={() => {\n onChange(opt.key)\n setOpen(false)\n }}\n >\n {opt.label}\n </button>\n ))}\n </div>\n )}\n </div>\n )\n}\n","import { useState } from 'react'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps } from '../../types'\nimport type React from 'react'\n\n/** Props for page navigation, optional total text, page size, and quick jump. */\nexport interface PaginationProps extends BaseComponentProps {\n /** Current page number (1-based). */\n current: number\n /** Total number of records across all pages. */\n total: number\n /** Number of items per page. @default 10 */\n pageSize?: number\n /** Called when the user selects a different page. */\n onChange?: (page: number) => void\n /** Called when the user picks a new value from the size changer. */\n onPageSizeChange?: (size: number) => void\n /** Renders total count text, or a custom node from total and visible range. */\n showTotal?: boolean | ((total: number, range: [number, number]) => React.ReactNode)\n /** Disables all controls; falls back to ConfigProvider when omitted. */\n disabled?: boolean\n /** Renders prev/next with current/total only, hiding page numbers. */\n simple?: boolean\n /** Shows a select to change `pageSize`. */\n showSizeChanger?: boolean\n /** Options for the page size select. @default [10, 20, 50, 100] */\n pageSizeOptions?: number[]\n /** Shows an input to jump to a page by number. */\n showQuickJumper?: boolean\n}\n\n/**\n * Page controls with numbered pages, ellipsis folding, and optional size changer and jumper.\n * Clamps the current page into valid range for the given total and page size.\n */\nexport function Pagination({\n current,\n total,\n pageSize = 10,\n onChange,\n onPageSizeChange,\n showTotal,\n disabled: disabledProp,\n simple,\n showSizeChanger,\n pageSizeOptions = [10, 20, 50, 100],\n showQuickJumper,\n className,\n style,\n unstyled,\n}: PaginationProps) {\n const config = useConfig()\n const disabled = disabledProp ?? config.disabled ?? false\n const locale = config.locale?.pagination\n const totalPrefix = locale?.totalPrefix ?? 'Total'\n const itemsPerPageLabel = locale?.itemsPerPage ?? '/ page'\n const jumpLabel = locale?.jump ?? 'Go to'\n const ariaLabel = locale?.ariaLabel ?? 'Pagination'\n const [jumpValue, setJumpValue] = useState('')\n\n const totalPages = Math.max(1, Math.ceil(total / pageSize))\n const safeCurrentPage = Math.min(Math.max(1, current), totalPages)\n const rangeStart = (safeCurrentPage - 1) * pageSize + 1\n const rangeEnd = Math.min(safeCurrentPage * pageSize, total)\n\n const go = (page: number) => {\n if (disabled || page < 1 || page > totalPages || page === safeCurrentPage) return\n onChange?.(page)\n }\n\n const handleJump = () => {\n const num = parseInt(jumpValue, 10)\n if (!isNaN(num)) {\n go(num)\n }\n setJumpValue('')\n }\n\n const pages = buildPages(safeCurrentPage, totalPages)\n\n const renderTotal = () => {\n if (!showTotal) return null\n if (typeof showTotal === 'function') {\n return <span className=\"sg-pagination-total\">{showTotal(total, [rangeStart, rangeEnd])}</span>\n }\n return (\n <span className=\"sg-pagination-total\">\n {totalPrefix} {total}\n </span>\n )\n }\n\n const renderSizeChanger = () => {\n if (!showSizeChanger) return null\n return (\n <select\n className=\"sg-pagination-size-changer\"\n value={pageSize}\n onChange={(e) => onPageSizeChange?.(Number(e.target.value))}\n disabled={disabled}\n >\n {pageSizeOptions.map((opt) => (\n <option key={opt} value={opt}>\n {opt} {itemsPerPageLabel}\n </option>\n ))}\n </select>\n )\n }\n\n const renderQuickJumper = () => {\n if (!showQuickJumper) return null\n return (\n <span className=\"sg-pagination-quick-jumper\">\n {jumpLabel}\n <input\n type=\"text\"\n value={jumpValue}\n onChange={(e) => setJumpValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleJump()\n }}\n onBlur={handleJump}\n disabled={disabled}\n className=\"sg-pagination-jumper-input\"\n />\n </span>\n )\n }\n\n if (unstyled) {\n return (\n <nav className={className} style={style} aria-label={ariaLabel}>\n <button disabled={safeCurrentPage <= 1} onClick={() => go(safeCurrentPage - 1)}>\n ‹\n </button>\n {pages.map((p, i) =>\n p === '...' ? (\n <span key={`e${i}`}>…</span>\n ) : (\n <button\n key={p}\n onClick={() => go(p as number)}\n aria-current={p === safeCurrentPage ? 'page' : undefined}\n >\n {p}\n </button>\n ),\n )}\n <button disabled={safeCurrentPage >= totalPages} onClick={() => go(safeCurrentPage + 1)}>\n ›\n </button>\n </nav>\n )\n }\n\n if (simple) {\n return (\n <nav\n className={[\n 'sg-pagination sg-pagination-simple',\n disabled ? 'sg-pagination-disabled' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n style={style}\n aria-label={ariaLabel}\n >\n <button\n className=\"sg-pagination-item sg-pagination-prev\"\n disabled={safeCurrentPage <= 1}\n onClick={() => go(safeCurrentPage - 1)}\n >\n ‹\n </button>\n <span className=\"sg-pagination-simple-pager\">\n {safeCurrentPage} / {totalPages}\n </span>\n <button\n className=\"sg-pagination-item sg-pagination-next\"\n disabled={safeCurrentPage >= totalPages}\n onClick={() => go(safeCurrentPage + 1)}\n >\n ›\n </button>\n </nav>\n )\n }\n\n return (\n <nav\n className={['sg-pagination', disabled ? 'sg-pagination-disabled' : '', className]\n .filter(Boolean)\n .join(' ')}\n style={style}\n aria-label={ariaLabel}\n >\n {renderTotal()}\n <button\n className=\"sg-pagination-item sg-pagination-prev\"\n disabled={safeCurrentPage <= 1}\n onClick={() => go(safeCurrentPage - 1)}\n >\n ‹\n </button>\n {pages.map((p, i) =>\n p === '...' ? (\n <span key={`e${i}`} className=\"sg-pagination-ellipsis\">\n …\n </span>\n ) : (\n <button\n key={p}\n className={`sg-pagination-item${p === safeCurrentPage ? ' sg-pagination-item-active' : ''}`}\n onClick={() => go(p as number)}\n aria-current={p === safeCurrentPage ? 'page' : undefined}\n >\n {p}\n </button>\n ),\n )}\n <button\n className=\"sg-pagination-item sg-pagination-next\"\n disabled={safeCurrentPage >= totalPages}\n onClick={() => go(safeCurrentPage + 1)}\n >\n ›\n </button>\n {renderSizeChanger()}\n {renderQuickJumper()}\n </nav>\n )\n}\n\n/**\n * Build a 7-slot page strip so the control width stays stable when the\n * user jumps between pages. Layouts:\n * • near start: [1] [2] [3] [4] [5] [...] [N]\n * • middle: [1] [...] [c-1] [c] [c+1] [...] [N]\n * • near end: [1] [...] [N-4] [N-3] [N-2] [N-1] [N]\n * Totals < 8 are rendered as a contiguous range — the strip is already\n * narrow enough that prev/next jumps cannot shift the surrounding layout.\n */\nfunction buildPages(current: number, total: number): (number | '...')[] {\n if (total <= 7) {\n return Array.from({ length: total }, (_, i) => i + 1)\n }\n if (current <= 4) {\n return [1, 2, 3, 4, 5, '...', total]\n }\n if (current >= total - 3) {\n return [1, '...', total - 4, total - 3, total - 2, total - 1, total]\n }\n return [1, '...', current - 1, current, current + 1, '...', total]\n}\n","import React from 'react'\nimport { useConfig } from '../ConfigProvider'\nimport type { BaseComponentProps, InteractiveProps } from '../../types'\nimport { Spin } from './Spin'\n\n/** Props for the Checkbox component. */\nexport interface CheckboxProps extends BaseComponentProps, InteractiveProps {\n /** Controlled checked state. */\n checked?: boolean\n /** Uncontrolled initial checked state. */\n defaultChecked?: boolean\n /** Renders the native checkbox in indeterminate state. */\n indeterminate?: boolean\n /** Called when the checked state changes. */\n onChange?: (checked: boolean) => void\n /** Label content beside the control. */\n children?: React.ReactNode\n}\n\n/** Labeled checkbox with indeterminate support and optional loading state. */\nexport function Checkbox({\n checked,\n defaultChecked,\n disabled: disabledProp,\n loading,\n indeterminate,\n onChange,\n children,\n className,\n style,\n unstyled,\n}: CheckboxProps) {\n const config = useConfig()\n const disabled = disabledProp ?? config.disabled ?? false\n\n const inputRef = React.useRef<HTMLInputElement>(null)\n\n React.useEffect(() => {\n if (inputRef.current) {\n inputRef.current.indeterminate = indeterminate ?? false\n }\n }, [indeterminate])\n\n const wrapperClass = unstyled\n ? className ?? ''\n : [\n 'sg-checkbox',\n disabled || loading ? 'sg-checkbox-disabled' : '',\n loading ? 'sg-checkbox-loading' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <label className={wrapperClass} style={style}>\n <input\n ref={inputRef}\n type=\"checkbox\"\n aria-checked={checked}\n className={unstyled ? '' : 'sg-checkbox-input'}\n checked={checked}\n defaultChecked={defaultChecked}\n disabled={disabled || loading}\n onChange={(e) => onChange?.(e.target.checked)}\n />\n {children && (\n <span className={unstyled ? '' : 'sg-checkbox-label'}>{children}</span>\n )}\n {loading && <Spin size=\"small\" unstyled={unstyled} />}\n </label>\n )\n}\n","import React from 'react'\nimport { createPortal } from 'react-dom'\nimport { Checkbox } from '../../ui/Checkbox'\nimport { Input } from '../../ui/Input'\nimport { Button } from '../../ui/Button'\nimport { Select } from '../../ui/Select'\nimport type {\n AdvancedFilter,\n FilterDropdownProps,\n FilterOperator,\n TableColumn,\n TableLocale,\n} from './types'\n\n/** Column filter UI state from table state hook. */\ninterface FilterState {\n /** Selected filter values keyed by column. */\n activeFilters: Record<string, unknown[]>\n /** Filter-list search strings keyed by column. */\n filterSearchText: Record<string, string>\n /** Column key with an open filter popover. */\n openFilterDropdown: string | null\n /** Active advanced filters keyed by column. */\n advancedFilters: Record<string, AdvancedFilter>\n /** Anchor элемент (FilterTrigger), используется для позиционирования portal. */\n filterAnchor: HTMLElement | null\n}\n\n/** Callbacks that mutate filter UI state. */\ninterface FilterActions {\n /** Opens or closes a column filter popover. */\n setOpenFilterDropdown: (key: string | null) => void\n /** Сохраняет DOM-элемент-якорь для портального позиционирования popover'а. */\n setFilterAnchor: (el: HTMLElement | null) => void\n /** Toggles a preset filter value. */\n handleFilterToggle: (colKey: string, value: unknown, multiple: boolean) => void\n /** Confirms the current filter selection. */\n handleFilterConfirm: (colKey: string) => void\n /** Clears active filters for a column. */\n handleFilterReset: (colKey: string) => void\n /** Closes the filter popover. */\n handleFilterClose: (colKey: string) => void\n /** Updates search-mode filter text. */\n handleSearchFilterChange: (colKey: string, text: string) => void\n /** Updates filter list search text. */\n setFilterSearchText: React.Dispatch<React.SetStateAction<Record<string, string>>>\n /** Builds props for custom filter dropdown renderers. */\n getFilterDropdownProps: (col: TableColumn) => FilterDropdownProps\n /** Sets / clears the advanced filter for a column. */\n setAdvancedFilter: (colKey: string, filter: AdvancedFilter | null) => void\n}\n\n/** Shared props for filter trigger and dropdown content. */\ninterface FilterTriggerProps {\n /** Target column. */\n col: TableColumn\n /** Resolved table locale. */\n t: Required<TableLocale>\n /** Filter popover state. */\n state: FilterState\n /** Filter state mutators. */\n actions: FilterActions\n /**\n * Ref on the dropdown for outside-click detection. Typed as nullable so\n * `useRef<HTMLDivElement>(null)` callers compile under\n * `strictNullChecks` / `useDefineForClassFields` without `as` casts.\n */\n filterRef: React.RefObject<HTMLDivElement | null>\n}\n\n/** Default operators offered for textual columns. */\nconst TEXT_OPS: FilterOperator[] = [\n 'eq',\n 'neq',\n 'contains',\n 'startsWith',\n 'endsWith',\n 'in',\n 'notIn',\n 'isEmpty',\n 'isNotEmpty',\n]\n\n/** Default operators offered for numeric columns. */\nconst NUMBER_OPS: FilterOperator[] = [\n 'eq',\n 'neq',\n 'lt',\n 'lte',\n 'gt',\n 'gte',\n 'between',\n 'in',\n 'notIn',\n 'isEmpty',\n 'isNotEmpty',\n]\n\n/** Operators that don't need a value input. */\nconst NO_VALUE_OPS = new Set<FilterOperator>(['isEmpty', 'isNotEmpty'])\n\n/** Filter icon in the header; toggles the column filter popover. */\nexport function FilterTrigger({ col, t, state, actions }: FilterTriggerProps) {\n const hasFilter =\n col.filterDropdown ||\n col.filterMode === 'search' ||\n col.filterMode === 'advanced' ||\n (col.filters && col.filters.length > 0)\n if (!hasFilter) return null\n\n const filtered =\n col.filterMode === 'advanced'\n ? state.advancedFilters[col.key] != null\n : (state.activeFilters[col.key]?.length ?? 0) > 0\n const iconNode = col.filterIcon\n ? typeof col.filterIcon === 'function'\n ? col.filterIcon(filtered)\n : col.filterIcon\n : col.filterMode === 'search'\n ? t.searchIcon\n : t.filterIcon\n\n return (\n <span\n className={`sg-table-filter-trigger${filtered ? ' sg-table-filter-active' : ''}`}\n onClick={(e) => {\n e.stopPropagation()\n const isOpen = state.openFilterDropdown === col.key\n if (isOpen) {\n actions.setOpenFilterDropdown(null)\n actions.setFilterAnchor(null)\n } else {\n actions.setFilterAnchor(e.currentTarget)\n actions.setOpenFilterDropdown(col.key)\n }\n }}\n >\n {iconNode}\n </span>\n )\n}\n\n/**\n * Обёртка над `createPortal`, которая позиционирует children как `position: fixed`\n * у нижнего края `anchor`. Пересчитывает координаты на scroll/resize.\n * Без портала advanced-фильтр клипается scroll-контейнером таблицы.\n */\nfunction FilterPortal({\n anchor,\n children,\n}: {\n anchor: HTMLElement | null\n children: React.ReactNode\n}) {\n const [coords, setCoords] = React.useState<{ top: number; left: number } | null>(null)\n\n React.useLayoutEffect(() => {\n if (!anchor) return\n const update = () => {\n const r = anchor.getBoundingClientRect()\n setCoords({ top: r.bottom + 4, left: r.left })\n }\n update()\n window.addEventListener('scroll', update, true)\n window.addEventListener('resize', update)\n return () => {\n window.removeEventListener('scroll', update, true)\n window.removeEventListener('resize', update)\n }\n }, [anchor])\n\n if (!anchor || !coords || typeof document === 'undefined') return null\n\n return createPortal(\n <div\n className=\"sg-table-filter-portal\"\n style={{ position: 'fixed', top: coords.top, left: coords.left, zIndex: 1100 }}\n >\n {children}\n </div>,\n document.body,\n )\n}\n\n/** Filter popover body: custom dropdown, search field, advanced builder, or preset checklist. */\nexport function FilterDropdownContent({ col, t, state, actions, filterRef }: FilterTriggerProps) {\n if (state.openFilterDropdown !== col.key) return null\n\n if (col.filterDropdown) {\n const props = actions.getFilterDropdownProps(col)\n const content =\n typeof col.filterDropdown === 'function' ? col.filterDropdown(props) : col.filterDropdown\n return (\n <FilterPortal anchor={state.filterAnchor}>\n <div\n className=\"sg-table-filter-dropdown\"\n ref={filterRef}\n onClick={(e) => e.stopPropagation()}\n >\n {content}\n </div>\n </FilterPortal>\n )\n }\n\n if (col.filterMode === 'advanced') {\n return (\n <FilterPortal anchor={state.filterAnchor}>\n <AdvancedFilterPanel\n col={col}\n t={t}\n state={state}\n actions={actions}\n filterRef={filterRef}\n />\n </FilterPortal>\n )\n }\n\n if (col.filterMode === 'search') {\n const searchVal = (state.activeFilters[col.key]?.[0] as string) ?? ''\n return (\n <FilterPortal anchor={state.filterAnchor}>\n <div\n className=\"sg-table-filter-dropdown sg-table-filter-search-mode\"\n ref={filterRef}\n onClick={(e) => e.stopPropagation()}\n >\n <Input\n placeholder={`${t.searchPlaceholder.replace('...', '')} ${typeof col.title === 'string' ? col.title : ''}...`}\n size=\"small\"\n value={searchVal}\n onChange={(v) => actions.handleSearchFilterChange(col.key, v)}\n />\n <div className=\"sg-table-filter-actions\">\n <Button\n size=\"small\"\n onClick={() => {\n actions.handleFilterReset(col.key)\n actions.handleFilterClose(col.key)\n }}\n >\n {t.filterReset}\n </Button>\n <Button\n size=\"small\"\n type=\"primary\"\n onClick={() => actions.handleFilterConfirm(col.key)}\n >\n {t.filterConfirm}\n </Button>\n </div>\n </div>\n </FilterPortal>\n )\n }\n\n if (!col.filters || col.filters.length === 0) return null\n\n const multiple = col.filterMultiple !== false\n const currentVals = state.activeFilters[col.key] ?? []\n const searchTxt = state.filterSearchText[col.key] ?? ''\n\n let visibleFilters = col.filters\n if (col.filterSearch && searchTxt) {\n visibleFilters = col.filters.filter((f) => {\n if (typeof col.filterSearch === 'function') {\n return col.filterSearch(searchTxt, f)\n }\n return f.text.toLowerCase().includes(searchTxt.toLowerCase())\n })\n }\n\n return (\n <FilterPortal anchor={state.filterAnchor}>\n <div\n className=\"sg-table-filter-dropdown\"\n ref={filterRef}\n onClick={(e) => e.stopPropagation()}\n >\n {col.filterSearch !== undefined && col.filterSearch !== false && (\n <div className=\"sg-table-filter-search\">\n <Input\n placeholder={t.filterSearchPlaceholder}\n size=\"small\"\n value={searchTxt}\n onChange={(v) => actions.setFilterSearchText((prev) => ({ ...prev, [col.key]: v }))}\n />\n </div>\n )}\n <div className=\"sg-table-filter-list\">\n {visibleFilters.map((f) => {\n const checked = currentVals.includes(f.value)\n return (\n <label key={String(f.value)} className=\"sg-table-filter-item\">\n {multiple ? (\n <Checkbox\n checked={checked}\n onChange={() => actions.handleFilterToggle(col.key, f.value, true)}\n />\n ) : (\n <input\n type=\"radio\"\n checked={checked}\n onChange={() => actions.handleFilterToggle(col.key, f.value, false)}\n />\n )}\n <span>{f.text}</span>\n </label>\n )\n })}\n {visibleFilters.length === 0 && (\n <div className=\"sg-table-filter-empty\">{t.filterEmptyText}</div>\n )}\n </div>\n <div className=\"sg-table-filter-actions\">\n <Button\n size=\"small\"\n onClick={() => {\n actions.handleFilterReset(col.key)\n actions.handleFilterClose(col.key)\n }}\n >\n {t.filterReset}\n </Button>\n <Button size=\"small\" type=\"primary\" onClick={() => actions.handleFilterConfirm(col.key)}>\n {t.filterConfirm}\n </Button>\n </div>\n </div>\n </FilterPortal>\n )\n}\n\n/**\n * Расширенный фильтр: пользователь выбирает оператор и значение.\n * Управляет локальным черновиком (`draftOp`/`draftValue`) и применяет\n * результат через `actions.setAdvancedFilter` по нажатию на «OK».\n */\nfunction AdvancedFilterPanel({ col, t, state, actions, filterRef }: FilterTriggerProps) {\n const isNumeric = col.advancedFilterType === 'number'\n const defaultOps = isNumeric ? NUMBER_OPS : TEXT_OPS\n const ops = col.advancedFilterOperators ?? defaultOps\n\n const current = state.advancedFilters[col.key]\n const [draftOp, setDraftOp] = React.useState<FilterOperator>(current?.op ?? ops[0])\n const [draftValue, setDraftValue] = React.useState<string>(() => formatDraftValue(current?.value))\n const [draftValue2, setDraftValue2] = React.useState<string>(() => {\n const v = current?.value\n if (Array.isArray(v) && v.length === 2) return String(v[1] ?? '')\n return ''\n })\n\n React.useEffect(() => {\n if (current) {\n setDraftOp(current.op)\n setDraftValue(formatDraftValue(current.value))\n if (Array.isArray(current.value) && current.value.length === 2) {\n setDraftValue2(String(current.value[1] ?? ''))\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [state.openFilterDropdown])\n\n const reset = () => {\n setDraftOp(ops[0])\n setDraftValue('')\n setDraftValue2('')\n actions.setAdvancedFilter(col.key, null)\n actions.handleFilterClose(col.key)\n }\n\n const confirm = () => {\n if (NO_VALUE_OPS.has(draftOp)) {\n actions.setAdvancedFilter(col.key, { op: draftOp })\n } else if (draftOp === 'between') {\n const a = parseValue(draftValue, isNumeric)\n const b = parseValue(draftValue2, isNumeric)\n actions.setAdvancedFilter(col.key, { op: 'between', value: [a, b] })\n } else if (draftOp === 'in' || draftOp === 'notIn') {\n const list = draftValue\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0)\n .map((s) => parseValue(s, isNumeric))\n actions.setAdvancedFilter(col.key, { op: draftOp, value: list })\n } else {\n actions.setAdvancedFilter(col.key, {\n op: draftOp,\n value: parseValue(draftValue, isNumeric),\n })\n }\n actions.setOpenFilterDropdown(null)\n }\n\n const showValueInput = !NO_VALUE_OPS.has(draftOp)\n const showSecondInput = draftOp === 'between'\n const isValueRequired = showValueInput\n const valueIsEmpty = isValueRequired && draftValue.trim() === ''\n const secondValueIsEmpty = showSecondInput && draftValue2.trim() === ''\n const confirmDisabled = valueIsEmpty || secondValueIsEmpty\n\n return (\n <div\n className=\"sg-table-filter-dropdown sg-table-filter-advanced-mode\"\n ref={filterRef}\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"sg-table-filter-advanced-row\">\n <Select\n size=\"small\"\n value={draftOp}\n onChange={(v) => setDraftOp(v as FilterOperator)}\n options={ops.map((op) => ({ label: operatorLabel(op, t), value: op }))}\n aria-label=\"Filter operator\"\n />\n </div>\n {showValueInput && (\n <div className=\"sg-table-filter-advanced-row\">\n <Input\n size=\"small\"\n type={\n isNumeric && draftOp !== 'in' && draftOp !== 'notIn' && draftOp !== 'between'\n ? 'number'\n : 'text'\n }\n value={draftValue}\n onChange={setDraftValue}\n placeholder={\n draftOp === 'in' || draftOp === 'notIn'\n ? t.filterAdvancedInPlaceholder\n : t.filterAdvancedValuePlaceholder\n }\n />\n </div>\n )}\n {showSecondInput && (\n <div className=\"sg-table-filter-advanced-row\">\n <Input\n size=\"small\"\n type={isNumeric ? 'number' : 'text'}\n value={draftValue2}\n onChange={setDraftValue2}\n placeholder={t.filterAdvancedBetweenMaxPlaceholder}\n />\n </div>\n )}\n <div className=\"sg-table-filter-actions\">\n <Button size=\"small\" onClick={reset}>\n {t.filterReset}\n </Button>\n <Button size=\"small\" type=\"primary\" disabled={confirmDisabled} onClick={confirm}>\n {t.filterConfirm}\n </Button>\n </div>\n </div>\n )\n}\n\nfunction formatDraftValue(value: unknown): string {\n if (value == null) return ''\n if (Array.isArray(value)) return value.map((v) => String(v ?? '')).join(', ')\n return String(value)\n}\n\nfunction parseValue(raw: string, numeric: boolean): unknown {\n const trimmed = raw.trim()\n if (trimmed === '') return ''\n if (numeric) {\n const n = Number(trimmed)\n return Number.isNaN(n) ? trimmed : n\n }\n return trimmed\n}\n\nfunction operatorLabel(op: FilterOperator, t: Required<TableLocale>): string {\n const map: Record<FilterOperator, string> = {\n eq: t.filterOpEq,\n neq: t.filterOpNeq,\n lt: t.filterOpLt,\n lte: t.filterOpLte,\n gt: t.filterOpGt,\n gte: t.filterOpGte,\n between: t.filterOpBetween,\n in: t.filterOpIn,\n notIn: t.filterOpNotIn,\n contains: t.filterOpContains,\n startsWith: t.filterOpStartsWith,\n endsWith: t.filterOpEndsWith,\n isEmpty: t.filterOpIsEmpty,\n isNotEmpty: t.filterOpIsNotEmpty,\n }\n return map[op]\n}\n","import { useState, useRef, useEffect, useId } from 'react'\r\nimport { useConfig } from '../ConfigProvider'\r\nimport { Transition } from './Transition'\r\nimport type { BaseComponentProps, InteractiveProps, SizableProps } from '../../types'\r\nimport { Spin } from './Spin'\r\n\r\n/** Single selectable entry in a Select dropdown or native option list. */\r\nexport interface SelectOption {\r\n /** Display text for the option. */\r\n label: string\r\n /** Value submitted with the form and returned by onChange. */\r\n value: string | number\r\n /** When true, the option cannot be selected. */\r\n disabled?: boolean\r\n /** When true, shows a loading state for the option. */\r\n loading?: boolean\r\n}\r\n\r\n/** Props shared by single and multiple modes. */\r\ninterface SelectPropsBase extends BaseComponentProps, InteractiveProps, SizableProps {\r\n /** Options shown in the dropdown or native select. */\r\n options: SelectOption[]\r\n /** Text shown when nothing is selected. */\r\n placeholder?: string\r\n /** Called when the control loses focus. */\r\n onBlur?: () => void\r\n /**\r\n * Accessible name for the control. Required for the styled (non-`unstyled`)\r\n * variant when there is no surrounding `<label htmlFor=...>` — the styled\r\n * trigger is a `<div role=\"combobox\">` and a parent `<label>` cannot\r\n * associate. WCAG 4.1.2 expects a name for every interactive control;\r\n * provide either `'aria-label'` or `'aria-labelledby'`.\r\n *\r\n * In the `unstyled` variant the underlying native `<select>` is fully\r\n * labelable, so this prop is purely informational there.\r\n */\r\n 'aria-label'?: string\r\n /** Id(s) of the element(s) that describe this control. Mirrors `aria-label`. */\r\n 'aria-labelledby'?: string\r\n}\r\n\r\n/** Single-select variant. `value` is one option value. */\r\nexport interface SelectPropsSingle extends SelectPropsBase {\r\n /** When false/omitted, the component is single-select. */\r\n multiple?: false\r\n /** Controlled selected value. */\r\n value?: string | number\r\n /** Initial value when uncontrolled. */\r\n defaultValue?: string | number\r\n /** Called when the selection changes. */\r\n onChange?: (value: string | number) => void\r\n}\r\n\r\n/**\r\n * Multiple-select variant. `value` is an array. Selecting an option\r\n * toggles its presence in the array; the dropdown stays open while picking.\r\n */\r\nexport interface SelectPropsMultiple extends SelectPropsBase {\r\n /** Enables multi-select mode. Render shows chips per selected option. */\r\n multiple: true\r\n /** Controlled selected values. */\r\n value?: (string | number)[]\r\n /** Initial selection when uncontrolled. */\r\n defaultValue?: (string | number)[]\r\n /** Called when the selection set changes. */\r\n onChange?: (values: (string | number)[]) => void\r\n}\r\n\r\n/** Props for the Select combobox; supports styled or native unstyled rendering. */\r\nexport type SelectProps = SelectPropsSingle | SelectPropsMultiple\r\n\r\n/**\r\n * Dropdown or native select for choosing one option (default) or many\r\n * options when `multiple` is set. Keyboard and click-outside behavior apply\r\n * in the styled (non-unstyled) mode.\r\n *\r\n * @default placeholder - `'Select...'`\r\n */\r\nexport function Select(props: SelectProps) {\r\n const {\r\n options,\r\n placeholder = 'Select...',\r\n disabled: disabledProp,\r\n loading,\r\n size: sizeProp,\r\n onBlur,\r\n className,\r\n style,\r\n unstyled,\r\n 'aria-label': ariaLabel,\r\n 'aria-labelledby': ariaLabelledBy,\r\n } = props\r\n\r\n const isMultiple = props.multiple === true\r\n const config = useConfig()\r\n const size = sizeProp ?? config.size ?? 'middle'\r\n const disabled = disabledProp ?? config.disabled ?? false\r\n\r\n const initialSingle = isMultiple\r\n ? undefined\r\n : (props.value ?? props.defaultValue)\r\n const initialMultiple: (string | number)[] = isMultiple\r\n ? (props.value ?? props.defaultValue ?? [])\r\n : []\r\n\r\n const [internalSingle, setInternalSingle] = useState<string | number | undefined>(initialSingle)\r\n const [internalMultiple, setInternalMultiple] = useState<(string | number)[]>(initialMultiple)\r\n const [open, setOpen] = useState(false)\r\n const [focusedIndex, setFocusedIndex] = useState(-1)\r\n const ref = useRef<HTMLDivElement>(null)\r\n const listboxId = useId()\r\n\r\n const currentSingle = isMultiple\r\n ? undefined\r\n : ((props.value ?? internalSingle) as string | number | undefined)\r\n const currentMultiple: (string | number)[] = isMultiple\r\n ? ((props.value ?? internalMultiple) as (string | number)[])\r\n : []\r\n\r\n const selectedOption = isMultiple\r\n ? undefined\r\n : options.find((o) => o.value === currentSingle)\r\n const selectedOptions = isMultiple\r\n ? options.filter((o) => currentMultiple.includes(o.value))\r\n : []\r\n\r\n useEffect(() => {\r\n const handleClickOutside = (e: MouseEvent) => {\r\n if (ref.current && !ref.current.contains(e.target as Node)) {\r\n setOpen(false)\r\n }\r\n }\r\n document.addEventListener('mousedown', handleClickOutside)\r\n return () => document.removeEventListener('mousedown', handleClickOutside)\r\n }, [])\r\n\r\n useEffect(() => {\r\n if (!open) setFocusedIndex(-1)\r\n }, [open])\r\n\r\n const emitSingle = (val: string | number) => {\r\n setInternalSingle(val)\r\n if (!isMultiple) props.onChange?.(val)\r\n }\r\n\r\n const emitMultiple = (vals: (string | number)[]) => {\r\n setInternalMultiple(vals)\r\n if (isMultiple) props.onChange?.(vals)\r\n }\r\n\r\n const handleSelect = (opt: SelectOption) => {\r\n if (opt.disabled || opt.loading) return\r\n if (isMultiple) {\r\n const exists = currentMultiple.includes(opt.value)\r\n const next = exists\r\n ? currentMultiple.filter((v) => v !== opt.value)\r\n : [...currentMultiple, opt.value]\r\n emitMultiple(next)\r\n } else {\r\n emitSingle(opt.value)\r\n setOpen(false)\r\n }\r\n }\r\n\r\n const handleRemoveTag = (val: string | number, e: React.MouseEvent) => {\r\n e.stopPropagation()\r\n if (disabled || loading) return\r\n emitMultiple(currentMultiple.filter((v) => v !== val))\r\n }\r\n\r\n if (unstyled) {\r\n if (isMultiple) {\r\n return (\r\n <select\r\n className={className}\r\n style={style}\r\n multiple\r\n value={currentMultiple.map(String)}\r\n disabled={disabled || loading}\r\n aria-label={ariaLabel}\r\n aria-labelledby={ariaLabelledBy}\r\n onChange={(e) => {\r\n const picked = Array.from(e.target.selectedOptions).map((o) => {\r\n const v = o.value\r\n const numVal = Number(v)\r\n return options.some((opt) => opt.value === numVal) ? numVal : v\r\n })\r\n emitMultiple(picked)\r\n }}\r\n onBlur={onBlur}\r\n >\r\n {options.map((opt) => (\r\n <option key={opt.value} value={opt.value} disabled={opt.disabled}>\r\n {opt.label}\r\n </option>\r\n ))}\r\n </select>\r\n )\r\n }\r\n return (\r\n <select\r\n className={className}\r\n style={style}\r\n value={currentSingle as string}\r\n disabled={disabled || loading}\r\n aria-label={ariaLabel}\r\n aria-labelledby={ariaLabelledBy}\r\n onChange={(e) => {\r\n const v = e.target.value\r\n const numVal = Number(v)\r\n const finalVal = options.some((o) => o.value === numVal) ? numVal : v\r\n emitSingle(finalVal)\r\n }}\r\n onBlur={onBlur}\r\n >\r\n {!selectedOption && <option value=\"\">{placeholder}</option>}\r\n {options.map((opt) => (\r\n <option key={opt.value} value={opt.value} disabled={opt.disabled}>\r\n {opt.label}\r\n </option>\r\n ))}\r\n </select>\r\n )\r\n }\r\n\r\n const wrapperClass = [\r\n 'sg-select',\r\n `sg-select-${size}`,\r\n isMultiple ? 'sg-select-multiple' : '',\r\n open ? 'sg-select-open' : '',\r\n disabled || loading ? 'sg-select-disabled' : '',\r\n loading ? 'sg-select-loading' : '',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ')\r\n\r\n const isOptionSelected = (opt: SelectOption) =>\r\n isMultiple ? currentMultiple.includes(opt.value) : opt.value === currentSingle\r\n\r\n const renderTrigger = () => {\r\n if (isMultiple) {\r\n if (selectedOptions.length === 0) {\r\n return <span className=\"sg-select-placeholder\">{placeholder}</span>\r\n }\r\n return (\r\n <span className=\"sg-select-tags\">\r\n {selectedOptions.map((opt) => (\r\n <span key={opt.value} className=\"sg-select-tag\">\r\n <span className=\"sg-select-tag-label\">{opt.label}</span>\r\n <button\r\n type=\"button\"\r\n className=\"sg-select-tag-remove\"\r\n aria-label={`Remove ${opt.label}`}\r\n tabIndex={-1}\r\n onClick={(e) => handleRemoveTag(opt.value, e)}\r\n >\r\n ×\r\n </button>\r\n </span>\r\n ))}\r\n </span>\r\n )\r\n }\r\n return (\r\n <span\r\n className={\r\n selectedOption ? 'sg-select-selection-item' : 'sg-select-placeholder'\r\n }\r\n >\r\n {selectedOption?.label ?? placeholder}\r\n </span>\r\n )\r\n }\r\n\r\n return (\r\n <div className={wrapperClass} ref={ref} style={style} onBlur={onBlur}>\r\n <div\r\n className=\"sg-select-selector\"\r\n role=\"combobox\"\r\n aria-expanded={open}\r\n aria-haspopup=\"listbox\"\r\n aria-controls={listboxId}\r\n aria-multiselectable={isMultiple || undefined}\r\n aria-label={ariaLabel}\r\n aria-labelledby={ariaLabelledBy}\r\n aria-disabled={disabled || loading || undefined}\r\n tabIndex={disabled || loading ? -1 : 0}\r\n onClick={() => !disabled && !loading && setOpen(!open)}\r\n onKeyDown={(e) => {\r\n if (disabled || loading) return\r\n switch (e.key) {\r\n case 'Enter':\r\n case ' ':\r\n e.preventDefault()\r\n if (open && focusedIndex >= 0) {\r\n handleSelect(options[focusedIndex])\r\n } else {\r\n setOpen(!open)\r\n }\r\n break\r\n case 'Escape':\r\n e.preventDefault()\r\n setOpen(false)\r\n break\r\n case 'ArrowDown':\r\n e.preventDefault()\r\n if (!open) setOpen(true)\r\n else setFocusedIndex((i) => (i + 1) % options.length)\r\n break\r\n case 'ArrowUp':\r\n e.preventDefault()\r\n if (!open) setOpen(true)\r\n else\r\n setFocusedIndex(\r\n (i) => (i - 1 + options.length) % options.length,\r\n )\r\n break\r\n case 'Backspace':\r\n if (isMultiple && currentMultiple.length > 0) {\r\n emitMultiple(currentMultiple.slice(0, -1))\r\n }\r\n break\r\n }\r\n }}\r\n >\r\n {renderTrigger()}\r\n {loading ? (\r\n <Spin size=\"small\" unstyled={unstyled} />\r\n ) : (\r\n <span className=\"sg-select-arrow\">{open ? '\\u25B2' : '\\u25BC'}</span>\r\n )}\r\n </div>\r\n <Transition visible={open} name=\"sg-slide-up\" unmountOnExit>\r\n <div className=\"sg-select-dropdown\" role=\"listbox\" id={listboxId} aria-multiselectable={isMultiple || undefined}>\r\n {options.map((opt, idx) => (\r\n <div\r\n key={opt.value}\r\n role=\"option\"\r\n aria-selected={isOptionSelected(opt)}\r\n className={[\r\n 'sg-select-option',\r\n isOptionSelected(opt) ? 'sg-select-option-selected' : '',\r\n idx === focusedIndex ? 'sg-select-option-focused' : '',\r\n opt.disabled || opt.loading ? 'sg-select-option-disabled' : '',\r\n opt.loading ? 'sg-select-option-loading' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n onClick={() => handleSelect(opt)}\r\n >\r\n <span>{opt.label}</span>\r\n {opt.loading && <Spin size=\"small\" unstyled={unstyled} />}\r\n </div>\r\n ))}\r\n </div>\r\n </Transition>\r\n </div>\r\n )\r\n}\r\n","import React from 'react'\nimport { Checkbox } from '../../ui/Checkbox'\nimport { FilterTrigger, FilterDropdownContent } from './FilterDropdown'\nimport type {\n AdvancedFilter,\n TableColumn,\n HeaderCell,\n RowSelectionConfig,\n ExpandableConfig,\n TableLocale,\n SortDirection,\n SortConfig,\n FilterDropdownProps,\n TableClassNames,\n TableStyles,\n} from './types'\nimport type { ContextMenuItem, ContextMenuState } from './ContextMenu'\n\n/** Internal props for the table header row(s). */\ninterface HeaderProps {\n /** Visible leaf columns in flat header mode. */\n columns: TableColumn[]\n /** Multi-row header grid when columns are grouped. */\n headerRows: HeaderCell[][] | null\n /** Whether grouped header rows are used. */\n hasColumnGroups: boolean\n /** Selection column state when enabled. */\n rowSelection?: RowSelectionConfig\n /** Expand column spacer when enabled. */\n expandable?: ExpandableConfig\n /** Enables column drag reorder. */\n draggable?: boolean\n /** All visible rows are selected. */\n allSelected: boolean\n /** Some but not all visible rows are selected. */\n someSelected: boolean\n /** Column key currently highlighted as drag target. */\n dragOver: string | null\n /** Resolved locale strings. */\n t: Required<TableLocale>\n /** Sticky/fixed styles for header cells. */\n fixedStyle: (col: TableColumn, isHeader?: boolean) => React.CSSProperties\n /** Sort click handler (supports multi-sort via shift). */\n onSort: (col: TableColumn, shiftKey?: boolean) => void\n /** Select-all checkbox toggle. */\n onSelectAll: () => void\n /** Column drag start. */\n onDragStart: (e: React.DragEvent, key: string) => void\n /** Column drag over. */\n onDragOver: (e: React.DragEvent, key: string) => void\n /** Clears drag-over highlight. */\n onDragLeave: () => void\n /** Column drop to reorder. */\n onDrop: (e: React.DragEvent, key: string) => void\n /** Column drag end cleanup. */\n onDragEnd: () => void\n /** Begins column resize drag. */\n onResizeStart: (e: React.MouseEvent, colKey: string) => void\n /** Filter dropdown UI state. */\n filterState: {\n /** Active filter values per column key. */\n activeFilters: Record<string, unknown[]>\n /** Per-column filter search box text. */\n filterSearchText: Record<string, string>\n /** Column key with open filter dropdown, if any. */\n openFilterDropdown: string | null\n /** Active advanced filters keyed by column. */\n advancedFilters: Record<string, AdvancedFilter>\n /** Anchor элемент для портального позиционирования popover'а. */\n filterAnchor: HTMLElement | null\n }\n /** Filter dropdown callbacks and helpers. */\n filterActions: {\n /** Opens or closes a column filter popover. */\n setOpenFilterDropdown: (key: string | null) => void\n /** Сохраняет DOM-якорь для позиционирования portal'нутого popover'а. */\n setFilterAnchor: (el: HTMLElement | null) => void\n /** Toggles a value in multi-select filters. */\n handleFilterToggle: (colKey: string, value: unknown, multiple: boolean) => void\n /** Applies filters and closes the dropdown. */\n handleFilterConfirm: (colKey: string) => void\n /** Clears filters for a column. */\n handleFilterReset: (colKey: string) => void\n /** Closes the dropdown for a column. */\n handleFilterClose: (colKey: string) => void\n /** Updates search-mode filter text. */\n handleSearchFilterChange: (colKey: string, text: string) => void\n /** Updates filter list search text state. */\n setFilterSearchText: React.Dispatch<React.SetStateAction<Record<string, string>>>\n /** Builds props for custom `filterDropdown` renderers. */\n getFilterDropdownProps: (col: TableColumn) => FilterDropdownProps\n /** Sets / clears the advanced filter for a column. */\n setAdvancedFilter: (colKey: string, filter: AdvancedFilter | null) => void\n }\n /** Ref attached to the open filter panel for outside click. */\n filterRef: React.RefObject<HTMLDivElement | null>\n /** Active multi-sort configuration. */\n sorts: SortConfig[]\n /** 0-based sort priority index for a column, or -1. */\n getSortIndex: (colKey: string) => number\n /** Current sort direction for a column, if any. */\n getSortDirection: (colKey: string) => SortDirection | null\n /** Extra context menu items for a header cell. */\n headerContextMenu?: (column: TableColumn) => ContextMenuItem[]\n /** Opens the shared context menu. */\n onContextMenu: (state: ContextMenuState | null) => void\n /** Renders row number header cell. */\n showRowNumber?: boolean\n /** Spacer column for row drag handle. */\n rowDraggable?: boolean\n /** Enables pin/unpin items in the header menu. */\n columnPinning?: boolean\n /** Pins a column left, right, or unpins. */\n onPinColumn?: (key: string, fixed: 'left' | 'right' | undefined) => void\n /** Auto-fits column width to measured content. */\n onAutoResize?: (colKey: string) => void\n /** Публичные классы по слотам Table (передаются из Table.tsx). */\n slotClassNames?: TableClassNames\n /** Публичные стили по слотам Table. */\n slotStyles?: TableStyles\n}\n\nfunction SortIndicator({\n col,\n sorts,\n getSortIndex,\n getSortDirection,\n t,\n}: {\n col: TableColumn\n sorts: SortConfig[]\n getSortIndex: (colKey: string) => number\n getSortDirection: (colKey: string) => SortDirection | null\n t: Required<TableLocale>\n}) {\n if (!col.sortable) return null\n const dir = getSortDirection(col.key)\n const idx = getSortIndex(col.key)\n const isActive = dir !== null\n\n return (\n <span className={`sg-table-sort-arrows${isActive ? ' sg-table-sort-active' : ''}`}>\n <span className={`sg-table-sort-asc${dir === 'asc' ? ' sg-table-sort-current' : ''}`}>\n {t.sortAsc}\n </span>\n <span className={`sg-table-sort-desc${dir === 'desc' ? ' sg-table-sort-current' : ''}`}>\n {t.sortDesc}\n </span>\n {idx >= 0 && sorts.length > 1 && <span className=\"sg-table-sort-index\">{idx + 1}</span>}\n </span>\n )\n}\n\nfunction ColumnTooltip({ content }: { content: string | React.ReactNode }) {\n if (!content) return null\n return (\n <span className=\"sg-table-th-tooltip\" title={typeof content === 'string' ? content : undefined}>\n ⓘ\n </span>\n )\n}\n\n/** Renders flat or grouped header cells with sort, filter, resize, and drag handles. */\nexport function TableHeader(props: HeaderProps) {\n const {\n columns,\n headerRows,\n hasColumnGroups,\n rowSelection,\n expandable,\n draggable,\n allSelected,\n someSelected,\n dragOver,\n t,\n fixedStyle,\n onSort,\n onSelectAll,\n onDragStart,\n onDragOver,\n onDragLeave,\n onDrop,\n onDragEnd,\n onResizeStart,\n filterState,\n filterActions,\n filterRef,\n sorts,\n getSortIndex,\n getSortDirection,\n headerContextMenu,\n onContextMenu,\n showRowNumber,\n rowDraggable,\n columnPinning,\n onPinColumn,\n onAutoResize,\n slotClassNames,\n slotStyles,\n } = props\n\n const sCls = slotClassNames ?? {}\n const sSty = slotStyles ?? {}\n\n const filterProps = (col: TableColumn) => ({\n col,\n t,\n state: filterState,\n actions: filterActions,\n filterRef,\n })\n\n const sortProps = {\n sorts,\n getSortIndex,\n getSortDirection,\n t,\n }\n\n const buildContextMenu = (col: TableColumn, e: React.MouseEvent) => {\n e.preventDefault()\n const items: ContextMenuItem[] = []\n\n if (headerContextMenu) {\n items.push(...headerContextMenu(col))\n }\n\n if (columnPinning && onPinColumn) {\n if (items.length > 0) {\n items.push({ key: 'pin-divider', label: '', divider: true })\n }\n if (col.fixed !== 'left') {\n items.push({\n key: 'pin-left',\n label: t.pinLeft,\n onClick: () => onPinColumn(col.key, 'left'),\n })\n }\n if (col.fixed !== 'right') {\n items.push({\n key: 'pin-right',\n label: t.pinRight,\n onClick: () => onPinColumn(col.key, 'right'),\n })\n }\n if (col.fixed) {\n items.push({\n key: 'unpin',\n label: t.unpin,\n onClick: () => onPinColumn(col.key, undefined),\n })\n }\n }\n\n if (items.length > 0) {\n onContextMenu({ x: e.clientX, y: e.clientY, items })\n }\n }\n\n if (hasColumnGroups && headerRows) {\n return (\n <>\n {headerRows.map((row, ri) => (\n <div\n key={`hdr-${ri}`}\n className={['sg-table-header-row', sCls.headerRow].filter(Boolean).join(' ')}\n role=\"row\"\n style={{ display: 'contents', ...sSty.headerRow }}\n >\n {ri === 0 && rowDraggable && (\n <div\n className=\"sg-table-th\"\n role=\"columnheader\"\n style={{ gridRow: `span ${headerRows.length}` }}\n />\n )}\n {ri === 0 && showRowNumber && (\n <div\n className=\"sg-table-th sg-table-cell-row-number\"\n role=\"columnheader\"\n style={{ gridRow: `span ${headerRows.length}` }}\n >\n {t.rowNumber}\n </div>\n )}\n {ri === 0 && rowSelection && (\n <div\n className=\"sg-table-th sg-table-cell-selection\"\n role=\"columnheader\"\n style={{ gridRow: `span ${headerRows.length}` }}\n >\n {rowSelection.type !== 'radio' && (\n <Checkbox\n checked={allSelected}\n indeterminate={someSelected}\n onChange={onSelectAll}\n />\n )}\n </div>\n )}\n {ri === 0 && expandable && (\n <div\n className=\"sg-table-th sg-table-cell-expand\"\n role=\"columnheader\"\n style={{ gridRow: `span ${headerRows.length}` }}\n />\n )}\n {row.map((cell, ci) => {\n const isLeaf = !cell.col.children || cell.col.children.length === 0\n return (\n <div\n key={cell.col.key ?? `g-${ri}-${ci}`}\n className={[\n 'sg-table-th',\n isLeaf && cell.col.sortable ? 'sg-table-th-sortable' : '',\n cell.col.fixed ? 'sg-table-cell-fixed' : '',\n cell.col.fixed ? `sg-table-cell-fixed-${cell.col.fixed}` : '',\n cell.colSpan > 1 ? 'sg-table-th-group' : '',\n sCls.headerCell,\n cell.col.headerClassName,\n ]\n .filter(Boolean)\n .join(' ')}\n style={{\n ...(isLeaf ? fixedStyle(cell.col, true) : {}),\n gridColumn: cell.colSpan > 1 ? `span ${cell.colSpan}` : undefined,\n gridRow: cell.rowSpan > 1 ? `span ${cell.rowSpan}` : undefined,\n justifyContent: cell.colSpan > 1 ? 'center' : undefined,\n ...sSty.headerCell,\n }}\n role=\"columnheader\"\n onClick={isLeaf ? (e) => onSort(cell.col, e.shiftKey) : undefined}\n onContextMenu={isLeaf ? (e) => buildContextMenu(cell.col, e) : undefined}\n >\n <span\n className={['sg-table-th-content', sCls.headerCellContent]\n .filter(Boolean)\n .join(' ')}\n style={sSty.headerCellContent}\n >\n {cell.col.title}\n {isLeaf && cell.col.tooltip && <ColumnTooltip content={cell.col.tooltip} />}\n {isLeaf && <SortIndicator col={cell.col} {...sortProps} />}\n </span>\n {isLeaf && <FilterTrigger {...filterProps(cell.col)} />}\n {isLeaf && <FilterDropdownContent {...filterProps(cell.col)} />}\n {isLeaf && cell.col.resizable && (\n <div\n className=\"sg-table-resize-handle\"\n onMouseDown={(e) => onResizeStart(e, cell.col.key)}\n onDoubleClick={\n onAutoResize\n ? (e) => {\n e.stopPropagation()\n onAutoResize(cell.col.key)\n }\n : undefined\n }\n />\n )}\n </div>\n )\n })}\n </div>\n ))}\n </>\n )\n }\n\n return (\n <div\n className={['sg-table-header-row', sCls.headerRow].filter(Boolean).join(' ')}\n role=\"row\"\n style={{ display: 'contents', ...sSty.headerRow }}\n >\n {rowDraggable && <div className=\"sg-table-th\" role=\"columnheader\" />}\n {showRowNumber && (\n <div className=\"sg-table-th sg-table-cell-row-number\" role=\"columnheader\">\n {t.rowNumber}\n </div>\n )}\n {rowSelection && (\n <div className=\"sg-table-th sg-table-cell-selection\" role=\"columnheader\">\n {rowSelection.type !== 'radio' && (\n <Checkbox checked={allSelected} indeterminate={someSelected} onChange={onSelectAll} />\n )}\n </div>\n )}\n {expandable && <div className=\"sg-table-th sg-table-cell-expand\" role=\"columnheader\" />}\n {columns.map((col) => (\n <div\n key={col.key}\n className={[\n 'sg-table-th',\n col.sortable ? 'sg-table-th-sortable' : '',\n dragOver === col.key ? 'sg-table-th-drag-over' : '',\n col.fixed ? 'sg-table-cell-fixed' : '',\n col.fixed ? `sg-table-cell-fixed-${col.fixed}` : '',\n sCls.headerCell,\n col.headerClassName,\n ]\n .filter(Boolean)\n .join(' ')}\n style={{ ...fixedStyle(col, true), ...sSty.headerCell }}\n role=\"columnheader\"\n onClick={(e) => onSort(col, e.shiftKey)}\n onContextMenu={(e) => buildContextMenu(col, e)}\n draggable={draggable && !col.fixed}\n onDragStart={draggable ? (e) => onDragStart(e, col.key) : undefined}\n onDragOver={draggable ? (e) => onDragOver(e, col.key) : undefined}\n onDragLeave={draggable ? () => onDragLeave() : undefined}\n onDrop={draggable ? (e) => onDrop(e, col.key) : undefined}\n onDragEnd={draggable ? () => onDragEnd() : undefined}\n >\n <span\n className={['sg-table-th-content', sCls.headerCellContent].filter(Boolean).join(' ')}\n style={sSty.headerCellContent}\n >\n {col.title}\n {col.tooltip && <ColumnTooltip content={col.tooltip} />}\n <SortIndicator col={col} {...sortProps} />\n </span>\n <FilterTrigger {...filterProps(col)} />\n <FilterDropdownContent {...filterProps(col)} />\n {col.resizable && (\n <div\n className=\"sg-table-resize-handle\"\n onMouseDown={(e) => onResizeStart(e, col.key)}\n onDoubleClick={\n onAutoResize\n ? (e) => {\n e.stopPropagation()\n onAutoResize(col.key)\n }\n : undefined\n }\n />\n )}\n </div>\n ))}\n </div>\n )\n}\n","import React, { useRef, useState, useEffect, useCallback } from 'react'\nimport { Checkbox } from '../../ui/Checkbox'\nimport { copyToClipboard } from './export'\nimport { TableGroupRow } from './TableGroupRow'\nimport type {\n TableColumn,\n RowSelectionConfig,\n ExpandableConfig,\n FlatRow,\n CellSpan,\n RowId,\n TableLocale,\n TableClassNames,\n TableStyles,\n} from './types'\nimport type { ContextMenuItem, ContextMenuState } from './ContextMenu'\n\n/** Internal props for the non-virtual table body grid. */\nexport interface BodyProps {\n /** Visible columns in render order. */\n columns: TableColumn[]\n /** Flattened rows including group headers. */\n flatRows: FlatRow[]\n /** Row selection config when selection column is shown. */\n rowSelection?: RowSelectionConfig\n /** Expandable row config when expand column is shown. */\n expandable?: ExpandableConfig\n /** Renders first column with tree indent and toggles. */\n isTreeMode: boolean\n /** Pixels per tree nesting level. */\n indentSize: number\n /** Keys of expanded tree nodes. */\n treeExpanded: Set<RowId>\n /** Keys of expanded detail rows. */\n expandedKeys: Set<RowId>\n /** Total grid columns including leading utility cells. */\n totalCols: number\n /** Map of cell key to rowspan/colspan. */\n spanMap: Map<string, CellSpan>\n /** Keys of cells covered by spans and not rendered. */\n hiddenCells: Set<string>\n /** Resolved locale strings. */\n t: Required<TableLocale>\n /** Optional row class or resolver. */\n rowClassName?: string | ((row: Record<string, unknown>, id: RowId) => string)\n /** Sticky/fixed/ellipsis styles per column. */\n fixedStyle: (col: TableColumn) => React.CSSProperties\n /** Row click handler. */\n onRowClick?: (id: RowId, data: Record<string, unknown>) => void\n /** Inline edit commit handler. */\n onCellEdit?: (id: RowId, column: string, value: unknown) => void\n /** Toggles a row in the selection model. */\n onSelectRow: (id: RowId, row: Record<string, unknown>) => void\n /** Toggles expanded row content. */\n onToggleExpand: (id: RowId) => void\n /** Toggles tree node expansion. */\n onToggleTreeExpand: (id: RowId) => void\n /** Enables row drag reorder handle column. */\n rowDraggable?: boolean\n /** Called after a row drag reorder. */\n onRowOrderChange?: (fromIndex: number, toIndex: number) => void\n /** Builds cell context menu items. */\n cellContextMenu?: (\n id: RowId,\n column: string,\n data: Record<string, unknown>,\n ) => ContextMenuItem[]\n /** Opens or closes the shared context menu. */\n onContextMenu: (state: ContextMenuState | null) => void\n /** Zebra striping for data rows. */\n striped?: boolean\n /** Renders leading row number cells. */\n showRowNumber?: boolean\n /** Group-by field name for header label. */\n groupBy?: string\n /** Toggles a grouped section expanded state. */\n onToggleGroup?: (groupKey: string) => void\n /** Current keyboard-focused cell coordinates. */\n focusedCell?: { row: number; col: number } | null\n /** Updates keyboard-focused cell. */\n onFocusCell?: (cell: { row: number; col: number } | null) => void\n /** Enables focus outlines and cell focus moves. */\n keyboardNavigation?: boolean\n /** Custom empty state when no rows. */\n emptyContent?: React.ReactNode\n /** Renders pinned top/bottom sections without zebra. */\n isPinnedSection?: boolean\n /** Публичные классы по слотам Table. */\n slotClassNames?: TableClassNames\n /** Публичные стили по слотам Table. */\n slotStyles?: TableStyles\n /**\n * Сдвиг локальных индексов до абсолютных. Передаётся `VirtualTableBody`\n * для виртуализации с динамическими высотами — при наличии оффсета\n * каждая строка получает атрибут `data-sg-virtual-row-index`, который\n * читает `ResizeObserver` для отчёта обратно в движок.\n */\n rowIndexOffset?: number\n}\n\n/** Renders the main or pinned table body rows, cells, and expand regions. */\nexport function TableBody(props: BodyProps) {\n const {\n columns,\n flatRows,\n rowSelection,\n expandable,\n isTreeMode,\n indentSize,\n treeExpanded,\n expandedKeys,\n totalCols,\n spanMap,\n hiddenCells,\n t,\n rowClassName,\n fixedStyle,\n onRowClick,\n onCellEdit,\n onSelectRow,\n onToggleExpand,\n onToggleTreeExpand,\n rowDraggable,\n onRowOrderChange,\n cellContextMenu,\n onContextMenu,\n striped,\n showRowNumber,\n groupBy,\n onToggleGroup,\n focusedCell,\n onFocusCell,\n keyboardNavigation,\n emptyContent,\n slotClassNames,\n slotStyles,\n isPinnedSection,\n rowIndexOffset,\n } = props\n\n const sCls = slotClassNames ?? {}\n const sSty = slotStyles ?? {}\n\n const [editingCell, setEditingCell] = useState<{\n rowId: RowId\n col: string\n } | null>(null)\n const [editValue, setEditValue] = useState('')\n const editRef = useRef<HTMLInputElement>(null)\n\n const [dragRowIdx, setDragRowIdx] = useState<number | null>(null)\n const [dragOverRowIdx, setDragOverRowIdx] = useState<number | null>(null)\n\n const [copiedCell, setCopiedCell] = useState<string | null>(null)\n\n useEffect(() => {\n if (editingCell && editRef.current) editRef.current.focus()\n }, [editingCell])\n\n const handleEditStart = (rowId: RowId, col: string, val: unknown) => {\n setEditingCell({ rowId, col })\n setEditValue(String(val ?? ''))\n }\n\n const handleEditSave = () => {\n if (editingCell && onCellEdit) {\n onCellEdit(editingCell.rowId, editingCell.col, editValue)\n }\n setEditingCell(null)\n }\n\n const handleEditCancel = () => setEditingCell(null)\n\n const handleRowDragStart = (e: React.DragEvent, idx: number) => {\n setDragRowIdx(idx)\n e.dataTransfer.effectAllowed = 'move'\n e.dataTransfer.setData('text/plain', String(idx))\n }\n\n const handleRowDragOver = (e: React.DragEvent, idx: number) => {\n e.preventDefault()\n e.dataTransfer.dropEffect = 'move'\n setDragOverRowIdx(idx)\n }\n\n const handleRowDrop = (_e: React.DragEvent, toIdx: number) => {\n if (dragRowIdx !== null && dragRowIdx !== toIdx) {\n onRowOrderChange?.(dragRowIdx, toIdx)\n }\n setDragRowIdx(null)\n setDragOverRowIdx(null)\n }\n\n const handleRowDragEnd = () => {\n setDragRowIdx(null)\n setDragOverRowIdx(null)\n }\n\n const handleCellContext = (\n e: React.MouseEvent,\n id: RowId,\n colKey: string,\n data: Record<string, unknown>,\n ) => {\n if (!cellContextMenu) return\n e.preventDefault()\n const items = cellContextMenu(id, colKey, data)\n if (items.length > 0) {\n onContextMenu({ x: e.clientX, y: e.clientY, items })\n }\n }\n\n const handleCellCopy = useCallback(\n async (rowId: RowId, colKey: string, value: unknown) => {\n await copyToClipboard(String(value ?? ''))\n setCopiedCell(`${rowId}:${colKey}`)\n setTimeout(() => setCopiedCell(null), 1500)\n },\n [],\n )\n\n if (flatRows.length === 0) {\n return (\n <div\n className={['sg-table-empty', sCls.empty].filter(Boolean).join(' ')}\n style={{ gridColumn: `1 / ${totalCols + 1}`, ...sSty.empty }}\n role=\"row\"\n >\n <span role=\"cell\">{emptyContent ?? t.emptyText}</span>\n </div>\n )\n }\n\n let dataRowIndex = 0\n\n return (\n <>\n {flatRows.map((row, rowIdx) => {\n // Group row rendering\n if (row.__groupRow) {\n return (\n <TableGroupRow\n key={row.id}\n group={row.__groupRow}\n groupBy={groupBy}\n totalCols={totalCols}\n t={t}\n onToggle={onToggleGroup ?? (() => {})}\n />\n )\n }\n\n const currentDataIdx = dataRowIndex++\n const isExpanded = expandedKeys.has(row.id)\n const isSelected = rowSelection?.selectedKeys.includes(row.id)\n const canExpand = expandable?.rowExpandable\n ? expandable.rowExpandable(row.data)\n : !!expandable\n\n const rowCls =\n typeof rowClassName === 'function'\n ? rowClassName(row.data, row.id)\n : (rowClassName ?? '')\n\n const isZebra = striped && currentDataIdx % 2 === 1\n const isDragOver = dragOverRowIdx === rowIdx && dragRowIdx !== rowIdx\n const isPinned = isPinnedSection\n\n const virtualIndexAttr =\n rowIndexOffset !== undefined ? rowIndexOffset + rowIdx : undefined\n\n return (\n <React.Fragment key={row.id}>\n <div\n className={[\n 'sg-table-row',\n isSelected ? 'sg-table-row-selected' : '',\n onRowClick ? 'sg-table-row-clickable' : '',\n isZebra ? 'sg-table-row-striped' : '',\n isDragOver ? 'sg-table-row-drag-over' : '',\n isPinned ? 'sg-table-row-pinned' : '',\n sCls.row,\n rowCls,\n ]\n .filter(Boolean)\n .join(' ')}\n role=\"row\"\n style={{ display: 'contents', ...sSty.row }}\n data-sg-virtual-row-index={virtualIndexAttr}\n draggable={rowDraggable}\n onDragStart={\n rowDraggable ? (e) => handleRowDragStart(e, rowIdx) : undefined\n }\n onDragOver={\n rowDraggable ? (e) => handleRowDragOver(e, rowIdx) : undefined\n }\n onDrop={rowDraggable ? (e) => handleRowDrop(e, rowIdx) : undefined}\n onDragEnd={rowDraggable ? handleRowDragEnd : undefined}\n >\n {rowDraggable && (\n <div\n className=\"sg-table-td sg-table-cell-drag-handle\"\n role=\"cell\"\n style={{ cursor: 'grab', userSelect: 'none', display: 'flex', alignItems: 'center', justifyContent: 'center' }}\n >\n ⠿\n </div>\n )}\n\n {showRowNumber && (\n <div className=\"sg-table-td sg-table-cell-row-number\" role=\"cell\">\n {currentDataIdx + 1}\n </div>\n )}\n\n {rowSelection && (\n <div\n className=\"sg-table-td sg-table-cell-selection\"\n role=\"cell\"\n onClick={(e) => {\n e.stopPropagation()\n onSelectRow(row.id, row.data)\n }}\n >\n {rowSelection.type === 'radio' ? (\n <input type=\"radio\" checked={!!isSelected} readOnly />\n ) : (\n <Checkbox checked={!!isSelected} onChange={() => {}} />\n )}\n </div>\n )}\n\n {expandable && (\n <div className=\"sg-table-td sg-table-cell-expand\" role=\"cell\">\n {canExpand && (\n <button\n className={`sg-table-expand-btn${isExpanded ? ' sg-table-expand-open' : ''}`}\n onClick={(e) => {\n e.stopPropagation()\n onToggleExpand(row.id)\n }}\n >\n {t.expandIcon}\n </button>\n )}\n </div>\n )}\n\n {columns.map((col, colIndex) => {\n const cellKey = `${row.id}:${col.key}`\n if (hiddenCells.has(cellKey)) return null\n\n const span = spanMap.get(cellKey)\n const val = row.data[col.key]\n const isEditing =\n editingCell?.rowId === row.id && editingCell?.col === col.key\n const isFocused =\n keyboardNavigation &&\n focusedCell?.row === rowIdx &&\n focusedCell?.col === colIndex\n const isCopied = copiedCell === cellKey\n\n const cellStyle: React.CSSProperties = { ...fixedStyle(col) }\n if (span?.colSpan && span.colSpan > 1)\n cellStyle.gridColumn = `span ${span.colSpan}`\n if (span?.rowSpan && span.rowSpan > 1)\n cellStyle.gridRow = `span ${span.rowSpan}`\n\n const isFirstCol = colIndex === 0\n const treeIndent =\n isTreeMode && isFirstCol ? row.depth * indentSize : 0\n\n const cellClsExtra =\n typeof col.cellClassName === 'function'\n ? col.cellClassName(val, row.data, row.id)\n : col.cellClassName ?? ''\n\n return (\n <div\n key={col.key}\n className={[\n 'sg-table-td',\n col.fixed ? 'sg-table-cell-fixed' : '',\n col.fixed ? `sg-table-cell-fixed-${col.fixed}` : '',\n col.editable ? 'sg-table-td-editable' : '',\n isFocused ? 'sg-table-cell-focused' : '',\n isCopied ? 'sg-table-cell-copied' : '',\n col.copyable ? 'sg-table-cell-copyable' : '',\n sCls.bodyCell,\n cellClsExtra,\n ]\n .filter(Boolean)\n .join(' ')}\n style={{ ...cellStyle, ...sSty.bodyCell }}\n role=\"cell\"\n tabIndex={keyboardNavigation ? -1 : undefined}\n onClick={() => {\n onRowClick?.(row.id, row.data)\n if (keyboardNavigation) {\n onFocusCell?.({ row: rowIdx, col: colIndex })\n }\n }}\n onContextMenu={(e) =>\n handleCellContext(e, row.id, col.key, row.data)\n }\n onDoubleClick={\n col.editable && onCellEdit\n ? (e) => {\n e.stopPropagation()\n handleEditStart(row.id, col.key, val)\n }\n : undefined\n }\n >\n {isTreeMode && isFirstCol && (\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n minWidth: treeIndent + 20,\n flexShrink: 0,\n }}\n >\n <span style={{ width: treeIndent }} />\n {row.hasChildren ? (\n <button\n className={`sg-table-expand-btn${treeExpanded.has(row.id) ? ' sg-table-expand-open' : ''}`}\n onClick={(e) => {\n e.stopPropagation()\n onToggleTreeExpand(row.id)\n }}\n >\n {t.expandIcon}\n </button>\n ) : (\n <span style={{ width: 20 }} />\n )}\n </span>\n )}\n <span className=\"sg-table-cell-content\">\n {isEditing ? (\n <input\n ref={editRef}\n className=\"sg-table-edit-input\"\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n onBlur={handleEditSave}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleEditSave()\n if (e.key === 'Escape') handleEditCancel()\n }}\n />\n ) : col.render ? (\n col.render(val, row.data, row.id)\n ) : (\n String(val ?? '')\n )}\n </span>\n {col.copyable && !isEditing && (\n <button\n className=\"sg-table-copy-btn\"\n onClick={(e) => {\n e.stopPropagation()\n handleCellCopy(row.id, col.key, val)\n }}\n title=\"Copy\"\n >\n {isCopied ? '✓' : '⎘'}\n </button>\n )}\n </div>\n )\n })}\n </div>\n\n {expandable && isExpanded && (\n <div\n className=\"sg-table-expanded-row\"\n style={{ gridColumn: `1 / ${totalCols + 1}` }}\n role=\"row\"\n >\n <div role=\"cell\">\n {expandable.expandedRowRender(row.data, row.id)}\n </div>\n </div>\n )}\n </React.Fragment>\n )\n })}\n </>\n )\n}\n","/** Serializes a 2D string matrix to CSV with RFC-style quoting. */\nexport function toCSVString(data: string[][]): string {\n return data\n .map((row) =>\n row\n .map((cell) => {\n if (cell.includes(',') || cell.includes('\"') || cell.includes('\\n')) {\n return `\"${cell.replace(/\"/g, '\"\"')}\"`\n }\n return cell\n })\n .join(','),\n )\n .join('\\n')\n}\n\n/** Serializes a 2D string matrix to tab-separated lines. */\nexport function toTSVString(data: string[][]): string {\n return data.map((row) => row.join('\\t')).join('\\n')\n}\n\n/**\n * Builds a JSON array of row objects using string headers as keys.\n * @param pretty - Pretty-print with indentation when true.\n * @default true\n */\nexport function toJSONString(\n headers: string[],\n rows: string[][],\n pretty = true,\n): string {\n const objects = rows.map((row) => {\n const obj: Record<string, string> = {}\n headers.forEach((h, i) => {\n obj[h] = row[i] ?? ''\n })\n return obj\n })\n return pretty ? JSON.stringify(objects, null, 2) : JSON.stringify(objects)\n}\n\n/**\n * Triggers a CSV file download in the browser.\n * @default filename `'export.csv'`\n */\nexport function downloadCSV(content: string, filename = 'export.csv'): void {\n const blob = new Blob([content], { type: 'text/csv;charset=utf-8;' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = filename\n a.click()\n URL.revokeObjectURL(url)\n}\n\n/**\n * Triggers a JSON file download in the browser.\n * @default filename `'export.json'`\n */\nexport function downloadJSON(content: string, filename = 'export.json'): void {\n const blob = new Blob([content], { type: 'application/json;charset=utf-8;' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = filename\n a.click()\n URL.revokeObjectURL(url)\n}\n\n/** Copies text using the Clipboard API when available. */\nexport async function copyToClipboard(text: string): Promise<void> {\n if (navigator.clipboard) {\n await navigator.clipboard.writeText(text)\n }\n}\n\n/** Opens a print dialog with the table DOM and current document styles. */\nexport function printTable(tableEl: HTMLElement | null): void {\n if (!tableEl) return\n const printWindow = window.open('', '_blank')\n if (!printWindow) return\n\n const styles = Array.from(document.querySelectorAll('style, link[rel=\"stylesheet\"]'))\n .map((el) => el.outerHTML)\n .join('\\n')\n\n printWindow.document.write(`<!DOCTYPE html><html><head>${styles}\n <style>\n body { padding: 20px; }\n .sg-table-toolbar, .sg-table-pagination, .sg-table-selection-bar { display: none !important; }\n .sg-table-wrapper { overflow: visible !important; }\n .sg-table-scroll { overflow: visible !important; max-height: none !important; }\n @media print { @page { size: landscape; margin: 1cm; } }\n </style>\n </head><body>${tableEl.outerHTML}</body></html>`)\n printWindow.document.close()\n printWindow.focus()\n setTimeout(() => {\n printWindow.print()\n printWindow.close()\n }, 300)\n}\n","import type { GroupRow, TableLocale } from './types'\n\n/** Props for the synthetic group header row. */\nexport interface TableGroupRowProps {\n /** Group metadata (key, value, count, aggregates). */\n group: GroupRow\n /** Field used to derive the group, displayed in the title. */\n groupBy?: string\n /** Number of grid columns the group row should span. */\n totalCols: number\n /** Resolved table locale strings. */\n t: Required<TableLocale>\n /** Toggle expand / collapse for this group key. */\n onToggle: (groupKey: string) => void\n}\n\n/**\n * Group header row rendered above each set of grouped data rows.\n * Spans the entire row, shows expand/collapse affordance, group title,\n * row count, and aggregate values when configured.\n */\nexport function TableGroupRow({ group, groupBy, totalCols, t, onToggle }: TableGroupRowProps) {\n return (\n <div\n className=\"sg-table-group-row\"\n role=\"row\"\n style={{ display: 'contents' }}\n >\n <div\n className=\"sg-table-td sg-table-group-cell\"\n role=\"cell\"\n style={{ gridColumn: `1 / ${totalCols + 1}` }}\n onClick={() => onToggle(group.groupKey)}\n >\n <button\n type=\"button\"\n className={`sg-table-expand-btn${group.expanded ? ' sg-table-expand-open' : ''}`}\n aria-label={group.expanded ? t.groupCollapse : t.groupExpand}\n aria-expanded={group.expanded}\n onClick={(e) => {\n e.stopPropagation()\n onToggle(group.groupKey)\n }}\n >\n {t.expandIcon}\n </button>\n <span className=\"sg-table-group-title\">\n {groupBy ? `${groupBy}: ` : null}\n <strong>{String(group.groupValue)}</strong>\n </span>\n <span className=\"sg-table-group-count\">({group.count})</span>\n {Object.keys(group.aggregates).length > 0 && (\n <span className=\"sg-table-group-aggregates\">\n {Object.entries(group.aggregates).map(([key, val]) => (\n <span key={key} className=\"sg-table-group-agg-item\">\n {key}: {String(val)}\n </span>\n ))}\n </span>\n )}\n </div>\n </div>\n )\n}\n","import React, { useEffect, useLayoutEffect, useMemo, useReducer, useRef, useState } from 'react'\r\nimport { createVirtual } from '@skygraph/core'\r\nimport type { VirtualEngine } from '@skygraph/core'\r\nimport { TableBody, type BodyProps } from './TableBody'\r\nimport type { FlatRow } from './types'\r\n\r\n/**\r\n * Сигнатура функций оценки/измерения высоты строки. Принимает данные строки\r\n * + её id (как в `TableEngine.getEstimatedRowHeight`).\r\n */\r\nexport type VirtualRowHeightFn = (row: Record<string, unknown>, id: string) => number\r\n\r\ninterface VirtualBodyProps extends BodyProps {\r\n /**\r\n * Высота строки.\r\n *\r\n * - `number` — фиксированная одинаковая высота для всех строк (быстрый\r\n * путь, CSS-локается на стороне `Table.tsx`).\r\n * - `function` — **декларативная** per-row высота: значение, которое\r\n * возвращает функция, трактуется как точная высота строки. Высота\r\n * жёстко локается в DOM через inline-style, чтобы `scrollHeight`\r\n * контейнера ВСЕГДА совпадал с `engine.totalHeight` (это убирает\r\n * дрейф ползунка при drag и тремор от посторонних reflow'ов).\r\n * ResizeObserver в этом режиме не используется — если контент\r\n * сильно выше декларируемой высоты, он будет обрезан\r\n * (`overflow: hidden`).\r\n */\r\n rowHeight: number | VirtualRowHeightFn\r\n /**\r\n * Эстимейт высоты для off-screen строк, когда `rowHeight` — число\r\n * (или не задан). Если задан вместе с `rowHeight`-функцией, функция\r\n * используется для видимых строк (как точная высота, см. выше),\r\n * а `estimateRowHeight` — для строк за пределами viewport.\r\n */\r\n estimateRowHeight?: VirtualRowHeightFn\r\n /** Сколько лишних строк рендерить выше / ниже viewport. */\r\n overscan: number\r\n /** Ref на родительский `.sg-table-scroll`, чей scroll-контекст мы наблюдаем. */\r\n scrollContainerRef: React.RefObject<HTMLDivElement | null>\r\n}\r\n\r\nconst DEFAULT_ROW_HEIGHT = 40\r\n\r\n/**\r\n * Резолвит эстимейт-функцию для `createVirtual`. Использует измеренную /\r\n * уже виденную ранее высоту, если она прокидывается извне; иначе вызывает\r\n * пользовательский callback.\r\n */\r\nfunction buildEstimate(\r\n rowHeight: number | VirtualRowHeightFn,\r\n estimate: VirtualRowHeightFn | undefined,\r\n flatRows: FlatRow[],\r\n): number | ((index: number) => number) {\r\n if (typeof rowHeight === 'number' && estimate == null) {\r\n return rowHeight\r\n }\r\n const fallback = typeof rowHeight === 'number' ? rowHeight : DEFAULT_ROW_HEIGHT\r\n const fn: VirtualRowHeightFn | undefined =\r\n estimate ?? (typeof rowHeight === 'function' ? rowHeight : undefined)\r\n if (!fn) return fallback\r\n return (index: number) => {\r\n const row = flatRows[index]\r\n if (!row) return fallback\r\n const v = fn(row.data, row.id)\r\n return Number.isFinite(v) && v >= 0 ? v : fallback\r\n }\r\n}\r\n\r\n/**\r\n * Виртуализированное тело таблицы. Живёт в той же CSS Grid, что и `TableHeader`,\r\n * поэтому ширины колонок остаются согласованными автоматически. Скролл\r\n * наблюдается на родительском `.sg-table-scroll` — мы не вводим вложенный\r\n * scrollbox.\r\n *\r\n * **Динамические высоты:** если `rowHeight` — функция, или передан\r\n * `estimateRowHeight`, движок переходит на путь с измерениями. Каждая\r\n * отрендеренная строка получает `data-sg-virtual-row-index` и наблюдается\r\n * через `ResizeObserver`. Префикс-сумма offsets пересобирается лениво при\r\n * первом запросе после `setMeasuredHeight`.\r\n */\r\nexport function VirtualTableBody(props: VirtualBodyProps) {\r\n const {\r\n rowHeight,\r\n estimateRowHeight,\r\n overscan,\r\n scrollContainerRef,\r\n flatRows,\r\n totalCols,\r\n ...bodyProps\r\n } = props\r\n\r\n const isDeclarative = typeof rowHeight === 'function'\r\n const isDynamic = isDeclarative || estimateRowHeight != null\r\n\r\n // VirtualEngine создаётся один раз и переиспользуется. setItemCount /\r\n // setItemHeight применяются в эффектах.\r\n const virtual = useMemo<VirtualEngine>(\r\n () =>\r\n createVirtual({\r\n itemCount: flatRows.length,\r\n itemHeight: buildEstimate(rowHeight, estimateRowHeight, flatRows),\r\n overscan,\r\n }),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [],\r\n )\r\n\r\n const [, forceUpdate] = useReducer((n: number) => n + 1, 0)\r\n\r\n // Подписка на инвалидации движка — единственный путь, по которому новый\r\n // measurement вызывает перерисовку. Эффект подключается один раз.\r\n //\r\n // В declarative-mode (rowHeight как функция) sync-prime в useLayoutEffect\r\n // выставляет engine-size до paint'а, а subscribe тут же триггерит\r\n // forceUpdate — React обработает его внутри того же task'а до paint'а,\r\n // так что DOM-расчёты (bottomPad, topPad) уезжают в одну итерацию,\r\n // synchronously, без лишних кадров. Это и обеспечивает совпадение\r\n // scrollHeight ↔ totalHeight на каждом кадре скролла.\r\n useEffect(() => virtual.subscribe(() => forceUpdate()), [virtual])\r\n\r\n useEffect(() => {\r\n virtual.setItemCount(flatRows.length)\r\n virtual.setItemHeight(buildEstimate(rowHeight, estimateRowHeight, flatRows))\r\n }, [virtual, flatRows, rowHeight, estimateRowHeight])\r\n\r\n // В declarative-mode пред-заполняем engine значениями rowHeight для ВСЕХ\r\n // строк, а не только видимых. Без этого totalHeight «доуточнялся»\r\n // постепенно при появлении новых строк в viewport, ergo scrollHeight\r\n // менялся прямо во время drag'а ползунка → курсор уезжал от него.\r\n // Стоимость: O(N) function-вызовов один раз на data change. Для 4000\r\n // строк это ~4000 setMeasuredHeight, событий движок отправит ровно\r\n // столько, сколько реально новых значений — последующие вызовы с тем\r\n // же h возвращают `false` без emit'а.\r\n useEffect(() => {\r\n if (!isDeclarative) return\r\n const fn = rowHeight as VirtualRowHeightFn\r\n for (let i = 0; i < flatRows.length; i++) {\r\n const row = flatRows[i]\r\n if (!row) continue\r\n const h = fn(row.data, row.id)\r\n if (Number.isFinite(h) && h >= 0) {\r\n virtual.setMeasuredHeight(i, Math.round(h))\r\n }\r\n }\r\n }, [virtual, flatRows, rowHeight, isDeclarative])\r\n\r\n const [scrollTop, setScrollTop] = useState(0)\r\n const [viewportHeight, setViewportHeight] = useState(0)\r\n\r\n useEffect(() => {\r\n const el = scrollContainerRef.current\r\n if (!el) return\r\n\r\n setViewportHeight(el.clientHeight)\r\n setScrollTop(el.scrollTop)\r\n\r\n const onScroll = () => setScrollTop(el.scrollTop)\r\n el.addEventListener('scroll', onScroll, { passive: true })\r\n\r\n let ro: ResizeObserver | null = null\r\n if (typeof ResizeObserver !== 'undefined') {\r\n ro = new ResizeObserver(() => setViewportHeight(el.clientHeight))\r\n ro.observe(el)\r\n }\r\n\r\n return () => {\r\n el.removeEventListener('scroll', onScroll)\r\n ro?.disconnect()\r\n }\r\n }, [scrollContainerRef])\r\n\r\n const range = virtual.getRange(scrollTop, viewportHeight || 400)\r\n const visibleRows = flatRows.slice(range.startIndex, range.endIndex + 1)\r\n const totalHeight = range.totalHeight\r\n const topPad = range.offsetTop\r\n const visibleSize = visibleRows.reduce(\r\n (sum, _row, idx) => sum + virtual.getItemSize(range.startIndex + idx),\r\n 0,\r\n )\r\n const bottomPad = Math.max(0, totalHeight - topPad - visibleSize)\r\n\r\n // Чтобы измерения не входили в петлю из субпиксельного дребезга\r\n // (`getBoundingClientRect` периодически возвращает 47.5 ↔ 48.0 на одних\r\n // и тех же DOM-узлах), стабилизируем высоту до целых пикселей. Math.round\r\n // симметричен относительно 0.5 (устойчивее `Math.ceil`, которая ловила\r\n // дрожь 48.0 ↔ 48.001 как 48 ↔ 49).\r\n const normalizeHeight = (h: number) => Math.round(h)\r\n\r\n // Стабильный ResizeObserver. Нужен ТОЛЬКО в measurement-mode\r\n // (`rowHeight: number + estimateRowHeight: function`), где реальные\r\n // высоты неизвестны до layout'а. В declarative-mode (rowHeight как\r\n // функция) высоты декларируются пользователем напрямую → RO не нужен,\r\n // его наблюдение лишь будит цикл re-render'ов от субпиксельных\r\n // изменений во время неродственных reflow'ов (например, появление\r\n // page-scrollbar при прокрутке страницы пересчитывает ширину колонок\r\n // и высоту длинных строк — отсюда и был «тремор всего блока»).\r\n const roRef = useRef<ResizeObserver | null>(null)\r\n const observedCellsRef = useRef<Set<HTMLElement>>(new Set())\r\n\r\n useEffect(() => {\r\n if (!isDynamic) return\r\n if (isDeclarative) return\r\n if (typeof ResizeObserver === 'undefined') return\r\n\r\n const ro = new ResizeObserver((entries) => {\r\n for (const entry of entries) {\r\n const target = entry.target as HTMLElement\r\n const rowEl = target.closest('[data-sg-virtual-row-index]') as HTMLElement | null\r\n if (!rowEl) continue\r\n const idx = Number(rowEl.getAttribute('data-sg-virtual-row-index'))\r\n virtual.setMeasuredHeight(idx, normalizeHeight(entry.contentRect.height))\r\n }\r\n })\r\n roRef.current = ro\r\n return () => {\r\n ro.disconnect()\r\n roRef.current = null\r\n observedCellsRef.current.clear()\r\n }\r\n }, [isDynamic, isDeclarative, virtual])\r\n\r\n // На каждый ре-рендер:\r\n // 1) Sync-prime engine значениями для видимых строк:\r\n // - declarative: значение из `rowHeight(row.data, row.id)` — это\r\n // пользовательский контракт «вот точная высота строки».\r\n // - measurement: реальная высота первой ячейки через\r\n // `getBoundingClientRect`, только для НЕ-измеренных раньше строк.\r\n // 2) Inline-locking всех ячеек ряда к engine-размеру: устанавливаем\r\n // `style.height = ${size}px`. Это и есть ключевой ингредиент,\r\n // благодаря которому `DOM.scrollHeight ≡ engine.totalHeight` — без\r\n // этого замечательного равенства браузер при drag-е ползунка\r\n // мапит cursorY → scrollTop по «вранному» scrollHeight и ползунок\r\n // уезжает от курсора, а RO-callback'и от внешних layout-возмущений\r\n // дёргают bottomPad и провоцируют тремор.\r\n // 3) Diff observe/unobserve ячеек RO (только в measurement-mode).\r\n useLayoutEffect(() => {\r\n if (!isDynamic) return\r\n const grid = scrollContainerRef.current?.querySelector('.sg-table-grid')\r\n if (!grid) return\r\n\r\n const rowEls = grid.querySelectorAll<HTMLElement>('[data-sg-virtual-row-index]')\r\n const ro = roRef.current\r\n const currentCells = new Set<HTMLElement>()\r\n\r\n rowEls.forEach((rowEl) => {\r\n const firstCell = rowEl.firstElementChild as HTMLElement | null\r\n if (!firstCell) return\r\n const idx = Number(rowEl.getAttribute('data-sg-virtual-row-index'))\r\n currentCells.add(firstCell)\r\n\r\n // 1) sync-prime engine size\r\n if (isDeclarative) {\r\n const row = flatRows[idx]\r\n if (row) {\r\n const declared = (rowHeight as VirtualRowHeightFn)(row.data, row.id)\r\n if (Number.isFinite(declared) && declared >= 0) {\r\n virtual.setMeasuredHeight(idx, Math.round(declared))\r\n }\r\n }\r\n } else if (!virtual.hasMeasured(idx)) {\r\n virtual.setMeasuredHeight(idx, normalizeHeight(firstCell.getBoundingClientRect().height))\r\n }\r\n\r\n // 2) lock cell heights to engine size to keep DOM.scrollHeight in\r\n // sync with engine.totalHeight. Only applies once engine knows the\r\n // size — для впервые-видимых measurement-строк до RO-сheck размер\r\n // ещё estimate'ный, локать его смысла нет.\r\n if (isDeclarative || virtual.hasMeasured(idx)) {\r\n const h = virtual.getItemSize(idx)\r\n const px = `${h}px`\r\n const children = rowEl.children\r\n for (let c = 0; c < children.length; c++) {\r\n const cell = children[c] as HTMLElement\r\n if (cell.style.height !== px) cell.style.height = px\r\n if (cell.style.minHeight !== '0px') cell.style.minHeight = '0px'\r\n if (cell.style.overflow !== 'hidden') cell.style.overflow = 'hidden'\r\n }\r\n }\r\n\r\n // 3) RO observe (measurement-mode only)\r\n if (ro && !observedCellsRef.current.has(firstCell)) {\r\n ro.observe(firstCell)\r\n }\r\n })\r\n\r\n if (ro) {\r\n for (const cell of observedCellsRef.current) {\r\n if (!currentCells.has(cell)) ro.unobserve(cell)\r\n }\r\n }\r\n observedCellsRef.current = currentCells\r\n\r\n // Фоллбэк для jsdom / runtime без RO — одноразовое измерение, чтобы\r\n // initial-render тестов отчитался.\r\n if (!isDeclarative && typeof ResizeObserver === 'undefined') {\r\n rowEls.forEach((rowEl) => {\r\n const firstCell = rowEl.firstElementChild as HTMLElement | null\r\n if (!firstCell) return\r\n const idx = Number(rowEl.getAttribute('data-sg-virtual-row-index'))\r\n virtual.setMeasuredHeight(idx, normalizeHeight(firstCell.getBoundingClientRect().height))\r\n })\r\n }\r\n }, [isDynamic, isDeclarative, virtual, scrollContainerRef, visibleRows, flatRows, rowHeight])\r\n\r\n const spacerColumn = `1 / ${totalCols + 1}`\r\n\r\n return (\r\n <>\r\n {topPad > 0 && (\r\n <div style={{ gridColumn: spacerColumn, height: topPad }} role=\"presentation\" aria-hidden />\r\n )}\r\n <TableBody\r\n {...bodyProps}\r\n flatRows={visibleRows}\r\n totalCols={totalCols}\r\n rowIndexOffset={range.startIndex}\r\n />\r\n {bottomPad > 0 && (\r\n <div\r\n style={{ gridColumn: spacerColumn, height: bottomPad }}\r\n role=\"presentation\"\r\n aria-hidden\r\n />\r\n )}\r\n </>\r\n )\r\n}\r\n","import React, { useEffect, useRef, useState } from 'react'\n\n/** One entry in a table context menu. */\nexport interface ContextMenuItem {\n /** Unique key among siblings. */\n key: string\n /** Primary label. */\n label: React.ReactNode\n /** Optional leading icon. */\n icon?: React.ReactNode\n /** Destructive styling. */\n danger?: boolean\n /** Disables click handling. */\n disabled?: boolean\n /** Renders a separator instead of a row. */\n divider?: boolean\n /** Invoked on item activate. */\n onClick?: () => void\n /** Nested submenu items. */\n children?: ContextMenuItem[]\n}\n\n/** Open context menu position and items. */\nexport interface ContextMenuState {\n /** Viewport X in pixels. */\n x: number\n /** Viewport Y in pixels. */\n y: number\n /** Root menu items. */\n items: ContextMenuItem[]\n}\n\n/** Props for the floating context menu overlay. */\ninterface ContextMenuProps {\n /** Current menu state, or null when closed. */\n state: ContextMenuState | null\n /** Closes the menu on outside interaction. */\n onClose: () => void\n}\n\n/**\n * Fixed-position menu for header/cell context actions.\n * Closes on outside click, Escape, or window scroll.\n */\nexport function ContextMenu({ state, onClose }: ContextMenuProps) {\n const ref = useRef<HTMLDivElement>(null)\n const [subMenu, setSubMenu] = useState<{ key: string; x: number; y: number; items: ContextMenuItem[] } | null>(null)\n\n useEffect(() => {\n if (!state) return\n const handle = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) {\n onClose()\n }\n }\n const handleKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n }\n const handleScroll = () => onClose()\n\n document.addEventListener('mousedown', handle)\n document.addEventListener('keydown', handleKey)\n window.addEventListener('scroll', handleScroll, true)\n return () => {\n document.removeEventListener('mousedown', handle)\n document.removeEventListener('keydown', handleKey)\n window.removeEventListener('scroll', handleScroll, true)\n }\n }, [state, onClose])\n\n if (!state) return null\n\n // Runtime-only positioning: coordinates come from the click event and the\n // submenu hangs off the parent's right edge. Every other visual property\n // lives in `packages/styles/components/context-menu.css`.\n const rootStyle: React.CSSProperties = {\n position: 'fixed',\n top: state.y,\n left: state.x,\n }\n const submenuStyle: React.CSSProperties = {\n position: 'absolute',\n top: 0,\n left: '100%',\n }\n\n const itemClass = (item: ContextMenuItem) => {\n const classes = ['sg-context-menu-item']\n if (item.danger) classes.push('sg-context-menu-item--danger')\n if (item.disabled) classes.push('sg-context-menu-item--disabled')\n return classes.join(' ')\n }\n\n const renderItems = (items: ContextMenuItem[], isSubmenu = false) => (\n <div\n ref={isSubmenu ? undefined : ref}\n className=\"sg-context-menu\"\n style={isSubmenu ? submenuStyle : rootStyle}\n role=\"menu\"\n >\n {items.map((item) => {\n if (item.divider) {\n return <div key={item.key} className=\"sg-context-menu-divider\" />\n }\n\n return (\n <div\n key={item.key}\n className={itemClass(item)}\n role=\"menuitem\"\n onClick={() => {\n if (item.disabled) return\n item.onClick?.()\n if (!item.children) onClose()\n }}\n onMouseEnter={(e) => {\n if (item.children) {\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect()\n setSubMenu({ key: item.key, x: rect.right, y: rect.top, items: item.children })\n } else {\n setSubMenu(null)\n }\n }}\n >\n {item.icon && <span className=\"sg-context-menu-icon\">{item.icon}</span>}\n <span className=\"sg-context-menu-label\">{item.label}</span>\n {item.children && <span className=\"sg-context-menu-submenu-arrow\">›</span>}\n {subMenu?.key === item.key && item.children && renderItems(item.children, true)}\n </div>\n )\n })}\n </div>\n )\n\n return renderItems(state.items)\n}\n","import { useState, useRef, useEffect, useMemo, useCallback } from 'react'\nimport { useTable } from '../../../hooks/useTable'\nimport {\n flattenLeafColumns,\n buildHeaderRows,\n flattenTreeRows,\n collectAllTreeIds,\n computeSpanMap,\n computeHiddenCells,\n getFixedStyle,\n groupByColumn,\n separatePinnedRows,\n computeColumnAggregates,\n} from './helpers'\nimport type {\n AdvancedFilter,\n TableColumn,\n TableProps,\n FlatRow,\n HeaderCell,\n FilterDropdownProps,\n SortDirection,\n SortConfig,\n RowId,\n} from './types'\nimport { DEFAULT_COL_WIDTH, MIN_COL_WIDTH, SELECTION_COL_WIDTH, DEFAULT_LOCALE } from './types'\nimport type { ContextMenuState } from './ContextMenu'\n\n/**\n * Derives table UI state: columns, sorting, filters, selection, grouping, and layout helpers.\n * Bridges `useTable` engine data with header/body presentation props.\n */\nexport function useTableState(props: TableProps) {\n const {\n columns: columnsProp,\n rowSelection,\n expandable,\n tree,\n draggable: _draggable,\n searchable,\n locale,\n onColumnOrderChange,\n onCellEdit: _onCellEdit,\n multiSort,\n sorts: controlledSorts,\n onSortsChange,\n hiddenColumns: hiddenColumnsProp,\n onHiddenColumnsChange,\n onColumnPinChange,\n groupBy,\n defaultGroupExpanded,\n onGroupExpandChange,\n pinnedRows: pinnedRowsConfig,\n keyboardNavigation,\n scroll,\n footer: _footer,\n showRowNumber: _showRowNumber,\n fullscreenable: _fullscreenable,\n densityToggle: _densityToggle,\n emptyContent: _emptyContent,\n printable: _printable,\n exportJSON: _exportJSON,\n highlightOnHover: _highlightOnHover,\n columnAutoResize: _columnAutoResize,\n ...tableOptions\n } = props\n\n /** When `scroll.x` is set, the author opts into hard pixel columns with a\n * horizontal scrollbar. Otherwise the table flexes to fit its container. */\n const hasScrollX = scroll?.x != null\n\n const {\n table,\n visibleRows,\n tableState,\n columnWidths: persistedColWidths,\n setSort,\n setSorts,\n clearSort,\n setPage,\n setFilterFn,\n setColumnWidth: persistColumnWidth,\n refresh,\n } = useTable(tableOptions)\n\n const t = useMemo(() => ({ ...DEFAULT_LOCALE, ...locale }), [locale])\n\n const hasColumnGroups = columnsProp.some((c) => c.children && c.children.length > 0)\n const leafColumns = useMemo(() => flattenLeafColumns(columnsProp), [columnsProp])\n const headerRows = useMemo<HeaderCell[][] | null>(\n () => (hasColumnGroups ? buildHeaderRows(columnsProp) : null),\n [columnsProp, hasColumnGroups],\n )\n\n // Multi-sort state\n const [internalSorts, setInternalSorts] = useState<SortConfig[]>([])\n const sorts = controlledSorts ?? internalSorts\n\n // Initial widths come from three sources, in order of precedence:\n // 1. engine-persisted widths (`$table.<id>.state.columnWidths`)\n // 2. column defaults (`column.width`)\n // 3. global default (`DEFAULT_COL_WIDTH`)\n // A column with a persisted width is treated as user-resized so it\n // keeps its exact px under flex-layout (otherwise it would snap back\n // to the auto track).\n const [colWidths, setColWidths] = useState<Record<string, number>>(() => {\n const w: Record<string, number> = {}\n for (const c of leafColumns) {\n w[c.key] = persistedColWidths[c.key] ?? c.width ?? DEFAULT_COL_WIDTH\n }\n return w\n })\n /** Columns the user has drag/auto-resized. Pinned to exact px — wins over auto-layout. */\n const [userResizedCols, setUserResizedCols] = useState<Set<string>>(\n () => new Set(Object.keys(persistedColWidths)),\n )\n\n const [colOrder, setColOrder] = useState<string[]>(() => leafColumns.map((c) => c.key))\n const [dragCol, setDragCol] = useState<string | null>(null)\n const [dragOver, setDragOver] = useState<string | null>(null)\n\n // Hidden columns\n const [internalHidden, setInternalHidden] = useState<Set<string>>(\n () => new Set(hiddenColumnsProp ?? []),\n )\n const hiddenSet = useMemo(\n () => (hiddenColumnsProp ? new Set(hiddenColumnsProp) : internalHidden),\n [hiddenColumnsProp, internalHidden],\n )\n\n const toggleColumnVisibility = useCallback(\n (key: string) => {\n if (onHiddenColumnsChange) {\n const current = hiddenColumnsProp ?? []\n const next = current.includes(key) ? current.filter((k) => k !== key) : [...current, key]\n onHiddenColumnsChange(next)\n } else {\n setInternalHidden((prev) => {\n const next = new Set(prev)\n if (next.has(key)) {\n next.delete(key)\n } else {\n next.add(key)\n }\n return next\n })\n }\n },\n [hiddenColumnsProp, onHiddenColumnsChange],\n )\n\n const [internalExpanded, setInternalExpanded] = useState<Set<RowId>>(() => {\n if (tree?.defaultExpandAllRows) {\n const childrenKey = tree.childrenColumnName ?? 'children'\n return new Set(collectAllTreeIds(props.data ?? [], childrenKey))\n }\n return new Set(expandable?.defaultExpandedRowKeys ?? [])\n })\n const expandedKeys = expandable?.expandedKeys\n ? new Set(expandable.expandedKeys)\n : internalExpanded\n\n const [treeExpanded, setTreeExpanded] = useState<Set<RowId>>(() => {\n if (tree?.defaultExpandAllRows) {\n const childrenKey = tree.childrenColumnName ?? 'children'\n return new Set(collectAllTreeIds(props.data ?? [], childrenKey))\n }\n return new Set()\n })\n\n const [searchText, setSearchText] = useState('')\n\n const [activeFilters, setActiveFilters] = useState<Record<string, unknown[]>>(() => {\n const init: Record<string, unknown[]> = {}\n for (const col of leafColumns) {\n if (col.filteredValue) {\n init[col.key] = [...col.filteredValue]\n } else if (col.defaultFilteredValue) {\n init[col.key] = [...col.defaultFilteredValue]\n }\n }\n return init\n })\n const [filterSearchText, setFilterSearchText] = useState<Record<string, string>>({})\n const [openFilterDropdown, setOpenFilterDropdown] = useState<string | null>(null)\n const [advancedFilters, setAdvancedFiltersState] = useState<Record<string, AdvancedFilter>>({})\n const filterRef = useRef<HTMLDivElement>(null)\n // Anchor элемент (FilterTrigger span). Используется FilterDropdownContent\n // для расчёта координат при рендере popover'а через React Portal в\n // document.body — иначе scroll-контейнер таблицы клипает popover и dropdown\n // вложенного <Select>.\n const [filterAnchor, setFilterAnchor] = useState<HTMLElement | null>(null)\n\n /**\n * Apply / clear an advanced column filter through the engine and mirror\n * it into local state so the trigger lights up. Engine path takes\n * precedence over the legacy `customFilterFn` path because the engine\n * runs filters before sort and pagination.\n */\n const setAdvancedFilter = useCallback(\n (colKey: string, filter: AdvancedFilter | null) => {\n setAdvancedFiltersState((prev) => {\n const next = { ...prev }\n if (filter == null) delete next[colKey]\n else next[colKey] = filter\n return next\n })\n table.setColumnFilter(colKey, filter)\n // Engine.setColumnFilter пересчитывает filteredOrder, но React-стейт\n // visibleRows живёт в useTable и обновляется только через refresh().\n // Без него таблица не перерисуется, пока пользователь не сделает любое\n // другое действие, которое случайно дернёт refresh.\n refresh()\n },\n [table, refresh],\n )\n\n const resizeRef = useRef<{ col: string; startX: number; startW: number } | null>(null)\n\n // Context menu state\n const [contextMenu, setContextMenu] = useState<ContextMenuState | null>(null)\n\n const columns = useMemo(() => {\n const base = hasColumnGroups\n ? leafColumns\n : (() => {\n const map = new Map(leafColumns.map((c) => [c.key, c]))\n return colOrder.filter((k) => map.has(k)).map((k) => map.get(k)!)\n })()\n return base.filter((c) => !hiddenSet.has(c.key) && !c.hidden)\n }, [leafColumns, colOrder, hasColumnGroups, hiddenSet])\n\n useEffect(() => {\n const keys = leafColumns.map((c) => c.key)\n setColOrder((prev) => {\n const prevSet = new Set(prev)\n const added = keys.filter((k) => !prevSet.has(k))\n const valid = prev.filter((k) => keys.includes(k))\n return [...valid, ...added]\n })\n }, [leafColumns])\n\n useEffect(() => {\n for (const col of leafColumns) {\n if (col.filteredValue !== undefined) {\n setActiveFilters((prev) => {\n if (JSON.stringify(prev[col.key]) === JSON.stringify(col.filteredValue)) return prev\n return { ...prev, [col.key]: [...col.filteredValue!] }\n })\n }\n }\n }, [leafColumns])\n\n useEffect(() => {\n const colFilters = columns.filter((c) => c.onFilter && activeFilters[c.key]?.length)\n const hasSearch = searchable && searchText.length > 0\n\n if (colFilters.length === 0 && !hasSearch) {\n setFilterFn(null)\n return\n }\n\n const lower = hasSearch ? searchText.toLowerCase() : ''\n\n setFilterFn((row) => {\n for (const col of colFilters) {\n const vals = activeFilters[col.key]\n const fn = col.onFilter!\n if (!vals.some((v) => fn(v, row))) return false\n }\n if (hasSearch) {\n const match = Object.values(row).some(\n (v) => v != null && String(v).toLowerCase().includes(lower),\n )\n if (!match) return false\n }\n return true\n })\n }, [activeFilters, searchText, searchable, setFilterFn, columns])\n\n useEffect(() => {\n if (!openFilterDropdown) return\n const handle = (e: MouseEvent) => {\n if (filterRef.current && !filterRef.current.contains(e.target as Node)) {\n setOpenFilterDropdown(null)\n }\n }\n document.addEventListener('mousedown', handle)\n return () => document.removeEventListener('mousedown', handle)\n }, [openFilterDropdown])\n\n // ---- Sort handler (multi-sort aware) ----\n\n const handleSort = useCallback(\n (col: TableColumn, shiftKey?: boolean) => {\n if (!col.sortable) return\n\n if (multiSort && shiftKey) {\n const existing = sorts.find((s) => s.column === col.key)\n let next: SortConfig[]\n if (!existing) {\n next = [...sorts, { column: col.key, direction: 'asc' as SortDirection }]\n } else if (existing.direction === 'asc') {\n next = sorts.map((s) =>\n s.column === col.key ? { ...s, direction: 'desc' as SortDirection } : s,\n )\n } else {\n next = sorts.filter((s) => s.column !== col.key)\n }\n\n if (onSortsChange) {\n onSortsChange(next)\n } else {\n setInternalSorts(next)\n }\n\n if (next.length === 0) {\n clearSort()\n } else {\n setSorts(next)\n }\n } else {\n const current = sorts.length === 1 ? sorts[0] : null\n let next: SortConfig[]\n\n if (!current || current.column !== col.key) {\n next = [{ column: col.key, direction: 'asc' }]\n } else if (current.direction === 'asc') {\n next = [{ column: col.key, direction: 'desc' }]\n } else {\n next = []\n }\n\n if (onSortsChange) {\n onSortsChange(next)\n } else {\n setInternalSorts(next)\n }\n\n if (next.length === 0) {\n clearSort()\n } else {\n setSort(next[0].column, next[0].direction)\n }\n }\n },\n [multiSort, sorts, onSortsChange, setSort, setSorts, clearSort],\n )\n\n const getSortIndex = useCallback(\n (colKey: string): number => {\n if (!multiSort || sorts.length <= 1) return -1\n return sorts.findIndex((s) => s.column === colKey)\n },\n [multiSort, sorts],\n )\n\n const getSortDirection = useCallback(\n (colKey: string): SortDirection | null => {\n const found = sorts.find((s) => s.column === colKey)\n return found?.direction ?? null\n },\n [sorts],\n )\n\n // ---- Other handlers ----\n\n const handleToggleExpand = (id: RowId) => {\n const open = expandedKeys.has(id)\n if (expandable?.onExpand) {\n expandable.onExpand(!open, id)\n } else {\n setInternalExpanded((prev) => {\n const next = new Set(prev)\n if (open) {\n next.delete(id)\n } else {\n next.add(id)\n }\n return next\n })\n }\n }\n\n const handleToggleTreeExpand = (id: RowId) => {\n setTreeExpanded((prev) => {\n const next = new Set(prev)\n if (next.has(id)) {\n next.delete(id)\n } else {\n next.add(id)\n }\n return next\n })\n }\n\n const handleSelectRow = (id: RowId, row: Record<string, unknown>) => {\n if (!rowSelection) return\n const { selectedKeys, onChange, type = 'checkbox' } = rowSelection\n if (type === 'radio') {\n onChange([id], [row])\n return\n }\n const next = selectedKeys.includes(id)\n ? selectedKeys.filter((k) => k !== id)\n : [...selectedKeys, id]\n onChange(\n next,\n visibleRows.filter((r) => next.includes(r.id)).map((r) => r.data),\n )\n }\n\n const handleSelectAll = () => {\n if (!rowSelection) return\n const ids = visibleRows.map((r) => r.id)\n const all = ids.every((id) => rowSelection.selectedKeys.includes(id))\n rowSelection.onChange(all ? [] : ids, all ? [] : visibleRows.map((r) => r.data))\n }\n\n const handleFilterToggle = (colKey: string, value: unknown, multiple: boolean) => {\n setActiveFilters((prev) => {\n const current = prev[colKey] ?? []\n if (!multiple) return { ...prev, [colKey]: [value] }\n const idx = current.indexOf(value)\n const next = idx >= 0 ? current.filter((_, i) => i !== idx) : [...current, value]\n return { ...prev, [colKey]: next }\n })\n }\n\n const handleFilterConfirm = (colKey: string) => {\n setOpenFilterDropdown(null)\n setFilterSearchText((prev) => ({ ...prev, [colKey]: '' }))\n }\n\n const handleFilterReset = (colKey: string) => {\n setActiveFilters((prev) => ({ ...prev, [colKey]: [] }))\n setFilterSearchText((prev) => ({ ...prev, [colKey]: '' }))\n }\n\n const handleFilterClose = (colKey: string) => {\n setOpenFilterDropdown(null)\n setFilterSearchText((prev) => ({ ...prev, [colKey]: '' }))\n }\n\n const handleSearchFilterChange = (colKey: string, text: string) => {\n setActiveFilters((prev) => ({ ...prev, [colKey]: text ? [text] : [] }))\n }\n\n const getFilterDropdownProps = (col: TableColumn): FilterDropdownProps => ({\n selectedKeys: activeFilters[col.key] ?? [],\n setSelectedKeys: (keys) => setActiveFilters((prev) => ({ ...prev, [col.key]: keys })),\n confirm: () => handleFilterConfirm(col.key),\n clearFilters: () => handleFilterReset(col.key),\n close: () => handleFilterClose(col.key),\n })\n\n const handleResizeStart = (e: React.MouseEvent, colKey: string) => {\n e.preventDefault()\n e.stopPropagation()\n resizeRef.current = {\n col: colKey,\n startX: e.clientX,\n startW: colWidths[colKey] ?? DEFAULT_COL_WIDTH,\n }\n\n const onMove = (ev: MouseEvent) => {\n if (!resizeRef.current) return\n const diff = ev.clientX - resizeRef.current.startX\n const min =\n leafColumns.find((c) => c.key === resizeRef.current!.col)?.minWidth ?? MIN_COL_WIDTH\n setColWidths((prev) => ({\n ...prev,\n [resizeRef.current!.col]: Math.max(min, resizeRef.current!.startW + diff),\n }))\n setUserResizedCols((prev) =>\n prev.has(resizeRef.current!.col) ? prev : new Set(prev).add(resizeRef.current!.col),\n )\n }\n const onUp = () => {\n const ref = resizeRef.current\n resizeRef.current = null\n document.removeEventListener('mousemove', onMove)\n document.removeEventListener('mouseup', onUp)\n if (!ref) return\n // Mirror the final user-resized width into the engine so it survives\n // remounts when the host persists `$table.<id>.state.columnWidths`.\n // Functional updater is used to avoid stale closure on `colWidths`.\n setColWidths((prev) => {\n const w = prev[ref.col]\n if (typeof w === 'number') persistColumnWidth(ref.col, w)\n return prev\n })\n }\n document.addEventListener('mousemove', onMove)\n document.addEventListener('mouseup', onUp)\n }\n\n const handleDragStart = (e: React.DragEvent, key: string) => {\n setDragCol(key)\n e.dataTransfer.effectAllowed = 'move'\n e.dataTransfer.setData('text/plain', key)\n }\n\n const handleDragOver = (e: React.DragEvent, key: string) => {\n e.preventDefault()\n e.dataTransfer.dropEffect = 'move'\n setDragOver(key)\n }\n\n const handleDrop = (e: React.DragEvent, targetKey: string) => {\n e.preventDefault()\n if (!dragCol || dragCol === targetKey) {\n setDragCol(null)\n setDragOver(null)\n return\n }\n setColOrder((prev) => {\n const next = prev.filter((k) => k !== dragCol)\n const idx = next.indexOf(targetKey)\n next.splice(idx, 0, dragCol)\n onColumnOrderChange?.(next)\n return next\n })\n setDragCol(null)\n setDragOver(null)\n }\n\n const handleDragEnd = () => {\n setDragCol(null)\n setDragOver(null)\n }\n\n // Column pin\n const handlePinColumn = useCallback(\n (key: string, fixed: 'left' | 'right' | undefined) => {\n onColumnPinChange?.(key, fixed)\n },\n [onColumnPinChange],\n )\n\n // ---- Fullscreen ----\n const [isFullscreen, setIsFullscreen] = useState(false)\n const wrapperRef = useRef<HTMLDivElement>(null)\n\n const toggleFullscreen = useCallback(() => {\n setIsFullscreen((prev) => !prev)\n }, [])\n\n // ---- Density ----\n const [density, setDensity] = useState<'small' | 'middle' | 'large'>('middle')\n\n // ---- Group By ----\n // Engine-side grouping: keep core in sync so Core consumers (subscribers,\n // exports, snapshot) see the same `groupBy` field as the React UI.\n // Aggregates are passed through from `column.aggregate` when configured —\n // engine recomputes them after each filter / sort change.\n useEffect(() => {\n if (!groupBy) {\n table.clearGroupBy()\n return\n }\n const aggregates = leafColumns\n .filter((c) => c.aggregate)\n .map((c) => ({\n column: c.key,\n type:\n typeof c.aggregate === 'function'\n ? (c.aggregate as (vals: unknown[]) => unknown)\n : (c.aggregate as 'sum' | 'avg' | 'count' | 'min' | 'max'),\n }))\n table.groupBy(groupBy, aggregates)\n }, [groupBy, leafColumns, table])\n\n const [expandedGroups, setExpandedGroups] = useState<Set<string>>(() => {\n return defaultGroupExpanded ? new Set(['__all__']) : new Set()\n })\n\n const toggleGroupExpand = useCallback(\n (groupKey: string) => {\n setExpandedGroups((prev) => {\n const next = new Set(prev)\n const wasExpanded = next.has(groupKey)\n if (wasExpanded) {\n next.delete(groupKey)\n } else {\n next.add(groupKey)\n }\n onGroupExpandChange?.(groupKey, !wasExpanded)\n return next\n })\n },\n [onGroupExpandChange],\n )\n\n const expandAllGroups = useCallback(() => {\n setExpandedGroups((prev) => {\n const next = new Set(prev)\n next.add('__all__')\n return next\n })\n }, [])\n\n const collapseAllGroups = useCallback(() => {\n setExpandedGroups(new Set())\n }, [])\n\n // ---- Keyboard navigation ----\n const [focusedCell, setFocusedCell] = useState<{ row: number; col: number } | null>(null)\n\n const handleKeyNav = useCallback(\n (e: React.KeyboardEvent) => {\n if (!keyboardNavigation || !focusedCell) return\n const maxRow = visibleRows.length - 1\n const maxCol = columns.length - 1\n let { row, col } = focusedCell\n\n switch (e.key) {\n case 'ArrowUp':\n e.preventDefault()\n row = Math.max(0, row - 1)\n break\n case 'ArrowDown':\n e.preventDefault()\n row = Math.min(maxRow, row + 1)\n break\n case 'ArrowLeft':\n e.preventDefault()\n col = Math.max(0, col - 1)\n break\n case 'ArrowRight':\n e.preventDefault()\n col = Math.min(maxCol, col + 1)\n break\n case 'Tab':\n e.preventDefault()\n if (e.shiftKey) {\n col -= 1\n if (col < 0) {\n col = maxCol\n row = Math.max(0, row - 1)\n }\n } else {\n col += 1\n if (col > maxCol) {\n col = 0\n row = Math.min(maxRow, row + 1)\n }\n }\n break\n case 'Home':\n e.preventDefault()\n col = 0\n if (e.ctrlKey) row = 0\n break\n case 'End':\n e.preventDefault()\n col = maxCol\n if (e.ctrlKey) row = maxRow\n break\n default:\n return\n }\n setFocusedCell({ row, col })\n },\n [keyboardNavigation, focusedCell, visibleRows.length, columns.length],\n )\n\n // Column auto-resize: measure content and set optimal width\n const handleAutoResize = useCallback(\n (colKey: string) => {\n const maxLen = visibleRows.reduce((max, row) => {\n const val = String(row.data[colKey] ?? '')\n return Math.max(max, val.length)\n }, 0)\n const headerCol = leafColumns.find((c) => c.key === colKey)\n const headerLen = typeof headerCol?.title === 'string' ? headerCol.title.length : 6\n const charWidth = 8\n const padding = 32\n const min = headerCol?.minWidth ?? MIN_COL_WIDTH\n const optimal = Math.max(min, Math.max(maxLen, headerLen) * charWidth + padding)\n setColWidths((prev) => ({ ...prev, [colKey]: optimal }))\n setUserResizedCols((prev) => (prev.has(colKey) ? prev : new Set(prev).add(colKey)))\n },\n [visibleRows, leafColumns],\n )\n\n // ---- Tree data ----\n\n const isTreeMode = !!tree\n const childrenKey = tree?.childrenColumnName ?? 'children'\n const indentSize = tree?.indentSize ?? 20\n\n const baseFlatRows: FlatRow[] = useMemo(() => {\n if (!isTreeMode) {\n return visibleRows.map((r) => ({\n id: r.id,\n data: r.data,\n depth: 0,\n hasChildren: false,\n }))\n }\n return flattenTreeRows(visibleRows, childrenKey, treeExpanded)\n }, [visibleRows, isTreeMode, childrenKey, treeExpanded])\n\n // Apply group-by if configured\n const groupedRows: FlatRow[] = useMemo(() => {\n if (!groupBy) return baseFlatRows\n const allExpanded = expandedGroups.has('__all__')\n const effectiveExpanded = allExpanded\n ? new Set([...expandedGroups, ...baseFlatRows.map((r) => String(r.data[groupBy] ?? 'Other'))])\n : expandedGroups\n return groupByColumn(baseFlatRows, groupBy, columns, effectiveExpanded)\n }, [baseFlatRows, groupBy, columns, expandedGroups])\n\n // Separate pinned rows\n const {\n top: pinnedTop,\n middle: middleRows,\n bottom: pinnedBottom,\n } = useMemo(\n () => separatePinnedRows(groupedRows, pinnedRowsConfig?.top, pinnedRowsConfig?.bottom),\n [groupedRows, pinnedRowsConfig],\n )\n\n const flatRows = groupedRows\n\n // Aggregation footer data\n const aggregates = useMemo(\n () => computeColumnAggregates(columns, baseFlatRows),\n [columns, baseFlatRows],\n )\n\n // ---- Grid ----\n\n const extraBefore: string[] = []\n if (rowSelection) extraBefore.push(SELECTION_COL_WIDTH)\n if (expandable) extraBefore.push(SELECTION_COL_WIDTH)\n\n // Grid-template rules:\n //\n // Mode A — `scroll.x` is SET (author wants a horizontal scrollbar):\n // • Widths are hard pixels by default — columns never shrink. Sticky\n // offsets for fixed columns stay stable, table punches out of the\n // container and the scroll handles overflow.\n // • If numeric `scroll.x` is wider than the declared tracks, regular\n // columns flex to absorb the remainder instead of leaving blank space.\n //\n // Mode B — `scroll.x` is NOT set (fluid layout):\n // • No `width` / not resized → `minmax(MIN, 1fr)` — flex column.\n // • Mixed explicit/auto widths → explicit widths stay px while auto\n // columns share the remaining space.\n // • All regular columns have widths → those widths become fr weights,\n // so the table fills the container without leaving a blank tail.\n // • Fixed/resized columns keep their exact px (sticky offsets / user\n // resize must not be disturbed by auto-layout).\n const hasAutoColumns = columns.some(\n (c) => !c.fixed && !userResizedCols.has(c.key) && c.width == null,\n )\n const shouldFlexExplicitWidths = !hasScrollX && !hasAutoColumns\n const scrollXMinWidth =\n typeof scroll?.x === 'number'\n ? scroll.x\n : typeof scroll?.x === 'string' && scroll.x.trim().endsWith('px')\n ? Number.parseFloat(scroll.x)\n : null\n const declaredGridWidth =\n extraBefore.reduce((sum, w) => sum + Number.parseFloat(w), 0) +\n columns.reduce((sum, c) => sum + (colWidths[c.key] ?? c.width ?? DEFAULT_COL_WIDTH), 0)\n const shouldFillScrollX =\n hasScrollX &&\n scrollXMinWidth !== null &&\n Number.isFinite(scrollXMinWidth) &&\n scrollXMinWidth > declaredGridWidth\n\n const colTemplates = columns.map((c) => {\n const resized = userResizedCols.has(c.key)\n const w = colWidths[c.key] ?? c.width ?? DEFAULT_COL_WIDTH\n\n if (hasScrollX) {\n if (c.fixed || resized) {\n return `${w}px`\n }\n return shouldFillScrollX ? `minmax(${w}px, ${w}fr)` : `${w}px`\n }\n\n if (c.fixed || resized) {\n return `${w}px`\n }\n if (c.width == null) {\n return `minmax(${MIN_COL_WIDTH}px, 1fr)`\n }\n if (shouldFlexExplicitWidths) {\n return `minmax(${MIN_COL_WIDTH}px, ${w}fr)`\n }\n return `minmax(${MIN_COL_WIDTH}px, ${w}px)`\n })\n const gridTemplate = [...extraBefore, ...colTemplates].join(' ')\n const totalCols = extraBefore.length + columns.length\n\n // ---- Fixed offsets ----\n\n const fixedLeftOffsets = useMemo(() => {\n const o: Record<string, number> = {}\n const selW = parseInt(SELECTION_COL_WIDTH)\n let left = (rowSelection ? selW : 0) + (expandable ? selW : 0)\n for (const col of columns) {\n if (col.fixed === 'left') {\n o[col.key] = left\n left += colWidths[col.key] ?? col.width ?? DEFAULT_COL_WIDTH\n }\n }\n return o\n }, [columns, colWidths, rowSelection, expandable])\n\n const fixedRightOffsets = useMemo(() => {\n const o: Record<string, number> = {}\n let right = 0\n for (let i = columns.length - 1; i >= 0; i--) {\n if (columns[i].fixed === 'right') {\n o[columns[i].key] = right\n right += colWidths[columns[i].key] ?? columns[i].width ?? DEFAULT_COL_WIDTH\n }\n }\n return o\n }, [columns, colWidths])\n\n const fixedStyle = (col: TableColumn, isHeader?: boolean): React.CSSProperties =>\n getFixedStyle(col, fixedLeftOffsets, fixedRightOffsets, isHeader)\n\n const allSelected = rowSelection\n ? visibleRows.length > 0 && visibleRows.every((r) => rowSelection.selectedKeys.includes(r.id))\n : false\n const someSelected = rowSelection\n ? visibleRows.some((r) => rowSelection.selectedKeys.includes(r.id)) && !allSelected\n : false\n\n const spanMap = useMemo(() => computeSpanMap(columns, flatRows), [columns, flatRows])\n const hiddenCells = useMemo(\n () => computeHiddenCells(columns, flatRows, spanMap),\n [columns, flatRows, spanMap],\n )\n\n return {\n visibleRows,\n tableState,\n columns,\n leafColumns,\n flatRows,\n headerRows,\n hasColumnGroups,\n t,\n // Multi-sort\n sorts,\n getSortIndex,\n getSortDirection,\n handleSort,\n // Selection\n allSelected,\n someSelected,\n handleSelectAll,\n handleSelectRow,\n // Expand\n expandedKeys,\n handleToggleExpand,\n // Tree\n isTreeMode,\n indentSize,\n treeExpanded,\n handleToggleTreeExpand,\n // Filters\n filterState: {\n activeFilters,\n filterSearchText,\n openFilterDropdown,\n advancedFilters,\n filterAnchor,\n },\n filterActions: {\n setOpenFilterDropdown,\n handleFilterToggle,\n handleFilterConfirm,\n handleFilterReset,\n handleFilterClose,\n handleSearchFilterChange,\n setFilterSearchText,\n getFilterDropdownProps,\n setAdvancedFilter,\n setFilterAnchor,\n },\n filterRef,\n // Drag columns\n dragOver,\n handleDragStart,\n handleDragOver,\n handleDragEnd,\n handleDrop,\n setDragOver: () => setDragOver(null),\n // Resize\n colWidths,\n handleResizeStart,\n // Grid\n gridTemplate,\n totalCols,\n // Fixed\n fixedStyle,\n // Span\n spanMap,\n hiddenCells,\n // Search\n searchText,\n setSearchText,\n // Pagination\n setPage,\n // Column visibility\n hiddenSet,\n toggleColumnVisibility,\n // Column pin\n handlePinColumn,\n // Context menu\n contextMenu,\n setContextMenu,\n // Fullscreen\n isFullscreen,\n toggleFullscreen,\n wrapperRef,\n // Density\n density,\n setDensity,\n // Group by\n expandedGroups,\n toggleGroupExpand,\n expandAllGroups,\n collapseAllGroups,\n // Keyboard\n focusedCell,\n setFocusedCell,\n handleKeyNav,\n // Auto-resize\n handleAutoResize,\n // Aggregation\n aggregates,\n // Pinned\n pinnedTop,\n pinnedBottom,\n middleRows,\n }\n}\n","import { useState, useCallback, useMemo, useEffect, useRef } from 'react'\nimport { createCore, createTable } from '@skygraph/core'\nimport type {\n Core,\n TableEngine,\n TableState,\n TableOptions,\n RowId,\n SortDirection,\n SortConfig,\n ColumnFilter,\n} from '@skygraph/core'\n\nexport interface UseTableOptions extends TableOptions {\n data?: Array<{ id: RowId; data: Record<string, unknown> }>\n}\n\nexport type FilterFn = (row: Record<string, unknown>) => boolean\n\nexport interface UseTableReturn {\n core: Core\n table: TableEngine\n visibleRows: Array<{ id: RowId; data: Record<string, unknown> }>\n tableState: TableState\n /** Snapshot of pinned columns; refreshes after `pinColumn` / `clearPinned`. */\n pinnedColumns: { left: string[]; right: string[] }\n /** Snapshot of persisted column widths; refreshes after `setColumnWidth` /\n * `clearColumnWidths`. */\n columnWidths: Record<string, number>\n setSort: (column: string, direction: SortDirection) => void\n setSorts: (sorts: SortConfig[]) => void\n clearSort: () => void\n addFilter: (filter: ColumnFilter) => void\n removeFilter: (column: string) => void\n clearFilters: () => void\n setFilterFn: (fn: FilterFn | null) => void\n setPage: (page: number) => void\n nextPage: () => void\n prevPage: () => void\n pinColumn: (column: string, side: 'left' | 'right' | null) => void\n clearPinned: () => void\n setColumnWidth: (column: string, width: number) => void\n clearColumnWidths: () => void\n refresh: () => void\n}\n\nexport function useTable(options?: UseTableOptions): UseTableReturn {\n const [{ core, table }] = useState(() => {\n const c = createCore()\n const t = createTable(c, options)\n if (options?.data) {\n t.addRows(options.data)\n }\n return { core: c, table: t }\n })\n\n const [visibleRows, setVisibleRows] = useState(() => table.getVisibleRows())\n const [tableState, setTableState] = useState(() => table.getTableState())\n const [pinnedColumns, setPinnedColumns] = useState(() => table.getPinnedColumns())\n const [columnWidths, setColumnWidthsState] = useState<Record<string, number>>(\n () => table.getColumnWidths(),\n )\n\n const prevDataRef = useRef(options?.data)\n useEffect(() => {\n const newData = options?.data\n if (newData === prevDataRef.current) return\n prevDataRef.current = newData\n\n table.reset()\n if (newData) {\n table.addRows(newData)\n }\n setVisibleRows(table.getVisibleRows())\n setTableState(table.getTableState())\n }, [options?.data, table])\n\n const refresh = useCallback(() => {\n setVisibleRows(table.getVisibleRows())\n setTableState(table.getTableState())\n setPinnedColumns(table.getPinnedColumns())\n setColumnWidthsState(table.getColumnWidths())\n }, [table])\n\n const pinColumn = useCallback(\n (column: string, side: 'left' | 'right' | null) => {\n table.pinColumn(column, side)\n setPinnedColumns(table.getPinnedColumns())\n },\n [table],\n )\n\n const clearPinned = useCallback(() => {\n table.clearPinned()\n setPinnedColumns(table.getPinnedColumns())\n }, [table])\n\n const setColumnWidth = useCallback(\n (column: string, width: number) => {\n table.setColumnWidth(column, width)\n setColumnWidthsState(table.getColumnWidths())\n },\n [table],\n )\n\n const clearColumnWidths = useCallback(() => {\n table.clearColumnWidths()\n setColumnWidthsState(table.getColumnWidths())\n }, [table])\n\n const setSort = useCallback(\n (column: string, direction: SortDirection) => {\n table.setSort(column, direction)\n refresh()\n },\n [table, refresh]\n )\n\n const setSorts = useCallback(\n (sorts: SortConfig[]) => {\n table.setSorts(sorts)\n refresh()\n },\n [table, refresh]\n )\n\n const clearSort = useCallback(() => {\n table.clearSort()\n refresh()\n }, [table, refresh])\n\n const addFilter = useCallback(\n (filter: ColumnFilter) => {\n table.addFilter(filter)\n refresh()\n },\n [table, refresh]\n )\n\n const removeFilter = useCallback(\n (column: string) => {\n table.removeFilter(column)\n refresh()\n },\n [table, refresh]\n )\n\n const clearFilters = useCallback(() => {\n table.clearFilters()\n refresh()\n }, [table, refresh])\n\n const setFilterFn = useCallback(\n (fn: FilterFn | null) => {\n table.setFilterFn(fn)\n refresh()\n },\n [table, refresh]\n )\n\n const setPage = useCallback(\n (page: number) => {\n table.setPage(page)\n refresh()\n },\n [table, refresh]\n )\n\n const nextPage = useCallback(() => {\n table.nextPage()\n refresh()\n }, [table, refresh])\n\n const prevPage = useCallback(() => {\n table.prevPage()\n refresh()\n }, [table, refresh])\n\n return useMemo(\n () => ({\n core,\n table,\n visibleRows,\n tableState,\n pinnedColumns,\n columnWidths,\n setSort,\n setSorts,\n clearSort,\n addFilter,\n removeFilter,\n clearFilters,\n setFilterFn,\n setPage,\n nextPage,\n prevPage,\n pinColumn,\n clearPinned,\n setColumnWidth,\n clearColumnWidths,\n refresh,\n }),\n [\n core,\n table,\n visibleRows,\n tableState,\n pinnedColumns,\n columnWidths,\n setSort,\n setSorts,\n clearSort,\n addFilter,\n removeFilter,\n clearFilters,\n setFilterFn,\n setPage,\n nextPage,\n prevPage,\n pinColumn,\n clearPinned,\n setColumnWidth,\n clearColumnWidths,\n refresh,\n ]\n )\n}\n","import type React from 'react'\nimport type { RowId } from '@skygraph/core'\nimport type { TableColumn, HeaderCell, FlatRow, CellSpan, AggregateType, GroupRow } from './types'\n\n/** Returns leaf columns in visual order, flattening grouped definitions. */\nexport function flattenLeafColumns(cols: TableColumn[]): TableColumn[] {\n const result: TableColumn[] = []\n for (const col of cols) {\n if (col.children && col.children.length > 0) {\n result.push(...flattenLeafColumns(col.children))\n } else {\n result.push(col)\n }\n }\n return result\n}\n\n/** Builds a row-major grid of header cells for grouped columns. */\nexport function buildHeaderRows(cols: TableColumn[]): HeaderCell[][] {\n function getDepth(c: TableColumn): number {\n if (!c.children || c.children.length === 0) return 1\n return 1 + Math.max(...c.children.map(getDepth))\n }\n\n const maxDepth = cols.length > 0 ? Math.max(...cols.map(getDepth)) : 1\n\n function getLeafCount(c: TableColumn): number {\n if (!c.children || c.children.length === 0) return 1\n return c.children.reduce((sum, ch) => sum + getLeafCount(ch), 0)\n }\n\n const rows: HeaderCell[][] = Array.from({ length: maxDepth }, () => [])\n\n function fill(list: TableColumn[], depth: number) {\n for (const c of list) {\n if (c.children && c.children.length > 0) {\n rows[depth].push({ col: c, colSpan: getLeafCount(c), rowSpan: 1 })\n fill(c.children, depth + 1)\n } else {\n rows[depth].push({ col: c, colSpan: 1, rowSpan: maxDepth - depth })\n }\n }\n }\n\n fill(cols, 0)\n return rows\n}\n\n/** Flattens nested row data into visible rows respecting `expandedSet`. */\nexport function flattenTreeRows(\n rows: Array<{ id: RowId; data: Record<string, unknown> }>,\n childrenKey: string,\n expandedSet: Set<RowId>,\n depth = 0,\n): FlatRow[] {\n const result: FlatRow[] = []\n for (const row of rows) {\n const children = row.data[childrenKey] as Array<{ id: RowId; data: Record<string, unknown> }> | undefined\n const hasChildren = Array.isArray(children) && children.length > 0\n result.push({ id: row.id, data: row.data, depth, hasChildren })\n if (hasChildren && expandedSet.has(row.id)) {\n result.push(...flattenTreeRows(children!, childrenKey, expandedSet, depth + 1))\n }\n }\n return result\n}\n\n/** Returns every row id that has nested children (for expand-all). */\nexport function collectAllTreeIds(\n rows: Array<{ id: RowId; data: Record<string, unknown> }>,\n childrenKey: string,\n): RowId[] {\n const ids: RowId[] = []\n for (const row of rows) {\n const children = row.data[childrenKey] as Array<{ id: RowId; data: Record<string, unknown> }> | undefined\n if (Array.isArray(children) && children.length > 0) {\n ids.push(row.id)\n ids.push(...collectAllTreeIds(children, childrenKey))\n }\n }\n return ids\n}\n\n/** Maps `${rowId}:${colKey}` to rowspan/colspan from `column.onCell`. */\nexport function computeSpanMap(\n columns: TableColumn[],\n flatRows: FlatRow[],\n): Map<string, CellSpan> {\n const map = new Map<string, CellSpan>()\n const hasOnCell = columns.some((c) => c.onCell)\n if (!hasOnCell) return map\n flatRows.forEach((row, rowIndex) => {\n for (const col of columns) {\n if (col.onCell) {\n const span = col.onCell(row.data, rowIndex)\n if (span && (span.rowSpan !== undefined || span.colSpan !== undefined)) {\n map.set(`${row.id}:${col.key}`, span)\n }\n }\n }\n })\n return map\n}\n\n/** Keys of cells that should not render because they are covered by spans. */\nexport function computeHiddenCells(\n columns: TableColumn[],\n flatRows: FlatRow[],\n spanMap: Map<string, CellSpan>,\n): Set<string> {\n const hidden = new Set<string>()\n const hasOnCell = columns.some((c) => c.onCell)\n if (!hasOnCell) return hidden\n flatRows.forEach((row, rowIndex) => {\n for (let ci = 0; ci < columns.length; ci++) {\n const key = `${row.id}:${columns[ci].key}`\n const span = spanMap.get(key)\n if (!span) continue\n if (span.rowSpan === 0 || span.colSpan === 0) {\n hidden.add(key)\n continue\n }\n const rs = span.rowSpan ?? 1\n const cs = span.colSpan ?? 1\n for (let dr = 0; dr < rs; dr++) {\n for (let dc = 0; dc < cs; dc++) {\n if (dr === 0 && dc === 0) continue\n const targetRow = flatRows[rowIndex + dr]\n const targetCol = columns[ci + dc]\n if (targetRow && targetCol) {\n hidden.add(`${targetRow.id}:${targetCol.key}`)\n }\n }\n }\n }\n })\n return hidden\n}\n\n/** Computes sticky left/right, alignment, and ellipsis styles for a column. */\nexport function getFixedStyle(\n col: TableColumn,\n fixedLeftOffsets: Record<string, number>,\n fixedRightOffsets: Record<string, number>,\n isHeader?: boolean,\n): React.CSSProperties {\n const s: React.CSSProperties = {}\n if (col.align) s.textAlign = col.align\n if (col.ellipsis) {\n s.overflow = 'hidden'\n s.textOverflow = 'ellipsis'\n s.whiteSpace = 'nowrap'\n }\n if (col.fixed === 'left') {\n s.position = 'sticky'\n s.left = fixedLeftOffsets[col.key]\n s.zIndex = isHeader ? 4 : 2\n }\n if (col.fixed === 'right') {\n s.position = 'sticky'\n s.right = fixedRightOffsets[col.key]\n s.zIndex = isHeader ? 4 : 2\n }\n return s\n}\n\n/** Reduces numeric column values with a built-in aggregate type. */\nexport function computeAggregate(\n values: unknown[],\n type: AggregateType,\n): number | string {\n const nums = values.map(Number).filter((n) => !isNaN(n))\n if (nums.length === 0) return type === 'count' ? values.length : '-'\n\n switch (type) {\n case 'sum':\n return Math.round(nums.reduce((a, b) => a + b, 0) * 100) / 100\n case 'avg':\n return Math.round((nums.reduce((a, b) => a + b, 0) / nums.length) * 100) / 100\n case 'count':\n return values.length\n case 'min':\n return Math.min(...nums)\n case 'max':\n return Math.max(...nums)\n }\n}\n\n/** Inserts group header rows and optional child rows for one group-by field. */\nexport function groupByColumn(\n flatRows: FlatRow[],\n groupByKey: string,\n columns: TableColumn[],\n expandedGroups: Set<string>,\n): FlatRow[] {\n const groups = new Map<string, FlatRow[]>()\n const groupOrder: string[] = []\n\n for (const row of flatRows) {\n const val = String(row.data[groupByKey] ?? 'Other')\n if (!groups.has(val)) {\n groups.set(val, [])\n groupOrder.push(val)\n }\n groups.get(val)!.push(row)\n }\n\n const result: FlatRow[] = []\n for (const gKey of groupOrder) {\n const rows = groups.get(gKey)!\n const expanded = expandedGroups.has(gKey)\n\n const aggregates: Record<string, React.ReactNode> = {}\n for (const col of columns) {\n if (col.aggregate) {\n const values = rows.map((r) => r.data[col.key])\n if (typeof col.aggregate === 'function') {\n aggregates[col.key] = col.aggregate(values)\n } else {\n aggregates[col.key] = computeAggregate(values, col.aggregate)\n }\n }\n }\n\n const groupRow: GroupRow = {\n __isGroup: true,\n groupKey: gKey,\n groupValue: gKey,\n count: rows.length,\n expanded,\n aggregates,\n }\n\n result.push({\n id: `__group_${gKey}` as RowId,\n data: {},\n depth: 0,\n hasChildren: false,\n __groupRow: groupRow,\n })\n\n if (expanded) {\n result.push(...rows)\n }\n }\n return result\n}\n\n/** Splits rows into top-pinned, middle, and bottom-pinned lists. */\nexport function separatePinnedRows(\n flatRows: FlatRow[],\n topIds?: RowId[],\n bottomIds?: RowId[],\n): { top: FlatRow[]; middle: FlatRow[]; bottom: FlatRow[] } {\n const topSet = new Set(topIds ?? [])\n const bottomSet = new Set(bottomIds ?? [])\n\n const top: FlatRow[] = []\n const middle: FlatRow[] = []\n const bottom: FlatRow[] = []\n\n for (const row of flatRows) {\n if (topSet.has(row.id)) top.push(row)\n else if (bottomSet.has(row.id)) bottom.push(row)\n else middle.push(row)\n }\n\n if (topIds) {\n top.sort((a, b) => topIds.indexOf(a.id) - topIds.indexOf(b.id))\n }\n if (bottomIds) {\n bottom.sort((a, b) => bottomIds.indexOf(a.id) - bottomIds.indexOf(b.id))\n }\n\n return { top, middle, bottom }\n}\n\n/** Footer aggregate values per column, or null when no aggregates configured. */\nexport function computeColumnAggregates(\n columns: TableColumn[],\n flatRows: FlatRow[],\n): Record<string, React.ReactNode> | null {\n const hasAny = columns.some((c) => c.aggregate)\n if (!hasAny) return null\n\n const result: Record<string, React.ReactNode> = {}\n for (const col of columns) {\n if (!col.aggregate) continue\n const values = flatRows.filter((r) => !r.__groupRow).map((r) => r.data[col.key])\n if (typeof col.aggregate === 'function') {\n result[col.key] = col.aggregate(values)\n } else {\n result[col.key] = computeAggregate(values, col.aggregate)\n }\n }\n return result\n}\n","import type React from 'react'\n\n/**\n * Дефолтные иконки заголовка таблицы. Хранятся как React-ноды, чтобы их\n * можно было передавать через `TableLocale` (типизировано как\n * `React.ReactNode`). Все иконки используют `currentColor`, поэтому цвет\n * задаётся CSS-классом контейнера (`.sg-table-filter-trigger`,\n * `.sg-table-filter-active`).\n */\n\n/** Воронка фильтра. */\nexport const FilterIcon: React.ReactElement = (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M2 3h12l-5 6.5V14l-2 1V9.5L2 3z\" />\n </svg>\n)\n\n/** Лупа поиска. */\nexport const SearchIcon: React.ReactElement = (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <circle cx=\"7\" cy=\"7\" r=\"4.5\" />\n <path d=\"M10.5 10.5L14 14\" />\n </svg>\n)\n","import type React from 'react'\r\nimport { FilterIcon, SearchIcon } from './defaultIcons'\r\nimport type { UseTableOptions } from '../../../hooks/useTable'\r\nimport type {\r\n AdvancedFilter,\r\n ColumnFilter,\r\n ColumnAggregate,\r\n FilterOperator,\r\n RowId,\r\n SortConfig,\r\n SortDirection,\r\n TableGroup,\r\n} from '@skygraph/core'\r\nimport type {\r\n BaseComponentProps,\r\n InteractiveProps,\r\n SizableProps,\r\n SlotClassNames,\r\n SlotStyles,\r\n} from '../../../types'\r\nimport type { TableLocale } from '../../../types/locale'\r\nimport type { ContextMenuItem } from './ContextMenu'\r\nimport type { PrintableProp } from '../../../utils/print'\r\n\r\n/**\r\n * Re-exports the canonical TableLocale from `types/locale.ts`. The two\r\n * declarations were unified during the post-stream cleanup; keep using\r\n * `from '../../../types/locale'` for new code.\r\n */\r\nexport type { TableLocale }\r\n\r\n/**\r\n * Имена слотов `Table` для пропов `classNames` / `styles`.\r\n * Полный список и описания — `docs/styling-contract.md` §4.1.\r\n */\r\nexport type TableSlot =\r\n | 'root'\r\n | 'toolbar'\r\n | 'scroll'\r\n | 'grid'\r\n | 'headerRow'\r\n | 'headerCell'\r\n | 'headerCellContent'\r\n | 'row'\r\n | 'bodyCell'\r\n | 'empty'\r\n | 'pagination'\r\n | 'footer'\r\n\r\n/** Мапа `слот → className` для `Table`. */\r\nexport type TableClassNames = SlotClassNames<TableSlot>\r\n\r\n/** Мапа `слот → inline-style` для `Table`. */\r\nexport type TableStyles = SlotStyles<TableSlot>\r\n\r\n/** Re-exports core row and sort types used by the table. */\r\nexport type {\r\n RowId,\r\n SortDirection,\r\n SortConfig,\r\n AdvancedFilter,\r\n ColumnFilter,\r\n ColumnAggregate,\r\n FilterOperator,\r\n TableGroup,\r\n}\r\n\r\n/** Cell merge span metadata from `onCell`. */\r\nexport interface CellSpan {\r\n /** Vertical span count; `0` hides the cell. */\r\n rowSpan?: number\r\n /** Horizontal span count; `0` hides the cell. */\r\n colSpan?: number\r\n}\r\n\r\n/** Props passed to a custom column filter dropdown. */\r\nexport interface FilterDropdownProps {\r\n /** Filter values currently selected in the dropdown. */\r\n selectedKeys: unknown[]\r\n /** Updates selected filter values before confirm. */\r\n setSelectedKeys: (keys: unknown[]) => void\r\n /** Applies the current selection and closes the dropdown. */\r\n confirm: () => void\r\n /** Clears active filters for the column. */\r\n clearFilters: () => void\r\n /** Closes the dropdown without applying. */\r\n close: () => void\r\n}\r\n\r\n/** Built-in footer aggregate operation identifiers. */\r\nexport type AggregateType = 'sum' | 'avg' | 'count' | 'min' | 'max'\r\n\r\n/** Column definition for `Table` (leaf or group parent). */\r\nexport interface TableColumn {\r\n /** Unique column key matching row data fields. */\r\n key: string\r\n /** Header label or node. */\r\n title: React.ReactNode\r\n /** Default column width in pixels. */\r\n width?: number\r\n /** Minimum width when resizing. */\r\n minWidth?: number\r\n /** Enables click-to-sort on this column. */\r\n sortable?: boolean\r\n /** Shows a drag handle to resize the column. */\r\n resizable?: boolean\r\n /** Allows in-cell editing when `onCellEdit` is set on the table. */\r\n editable?: boolean\r\n /** Sticky column position. */\r\n fixed?: 'left' | 'right'\r\n /** Truncates overflowing cell text with ellipsis. */\r\n ellipsis?: boolean\r\n /** Cell text alignment. */\r\n align?: 'left' | 'center' | 'right'\r\n /** Hides the column when true. */\r\n hidden?: boolean\r\n /** Preset filter options for the column filter menu. */\r\n filters?: Array<{ text: string; value: unknown }>\r\n /** Predicate to test if a row matches a filter value. */\r\n onFilter?: (value: unknown, row: Record<string, unknown>) => boolean\r\n /** Custom filter dropdown UI or render function. */\r\n filterDropdown?: React.ReactNode | ((props: FilterDropdownProps) => React.ReactNode)\r\n /** Custom filter icon in the header. */\r\n filterIcon?: React.ReactNode | ((filtered: boolean) => React.ReactNode)\r\n /** When false, filter mode is single-select radio. */\r\n filterMultiple?: boolean\r\n /** Enables or customizes filter option search in the menu. */\r\n filterSearch?: boolean | ((input: string, record: { text: string; value: unknown }) => boolean)\r\n /**\r\n * Filter UI mode:\r\n * - `'menu'` — preset list with checkboxes (default).\r\n * - `'search'` — single search input.\r\n * - `'advanced'` — operator picker + value input (`AdvancedFilter`).\r\n */\r\n filterMode?: 'menu' | 'search' | 'advanced'\r\n /**\r\n * Список доступных операторов в `advanced`-моде. По умолчанию выводится\r\n * полный набор кроме строгих строковых операторов (для нестроковых полей).\r\n * Передайте свой массив, чтобы ограничить пользователя.\r\n */\r\n advancedFilterOperators?: FilterOperator[]\r\n /**\r\n * Тип значения колонки — подсказка для `advanced`-режима, чтобы выбрать\r\n * корректный input (`number` / `text`) и стартовый набор операторов.\r\n * @default 'text'\r\n */\r\n advancedFilterType?: 'text' | 'number'\r\n /** Controlled active filter values for the column. */\r\n filteredValue?: unknown[]\r\n /** Initial filter values for uncontrolled usage. */\r\n defaultFilteredValue?: unknown[]\r\n /** Custom cell content renderer. */\r\n render?: (value: unknown, row: Record<string, unknown>, id: RowId) => React.ReactNode\r\n /** Returns rowspan/colspan for the cell at this row index. */\r\n onCell?: (row: Record<string, unknown>, rowIndex: number) => CellSpan\r\n /** Child columns for grouped headers. */\r\n children?: TableColumn[]\r\n /** Small info icon with this content in the header. */\r\n tooltip?: string | React.ReactNode\r\n /** Extra class for body cells. */\r\n cellClassName?: string | ((value: unknown, row: Record<string, unknown>, id: RowId) => string)\r\n /** Extra class for header cell of this column. */\r\n headerClassName?: string\r\n /** Shows a copy-to-clipboard control on the cell. */\r\n copyable?: boolean\r\n /** Footer aggregate for this column (built-in name or custom reducer). */\r\n aggregate?: AggregateType | ((values: unknown[]) => React.ReactNode)\r\n}\r\n\r\n/** Controlled row selection configuration. */\r\nexport interface RowSelectionConfig {\r\n /** Keys of currently selected rows. */\r\n selectedKeys: RowId[]\r\n /** Called when selection changes. */\r\n onChange: (keys: RowId[], rows: Array<Record<string, unknown>>) => void\r\n /** Selection control type. */\r\n type?: 'checkbox' | 'radio'\r\n}\r\n\r\n/** Expandable row configuration. */\r\nexport interface ExpandableConfig {\r\n /** Renders content below the row when expanded. */\r\n expandedRowRender: (row: Record<string, unknown>, id: RowId) => React.ReactNode\r\n /** Controlled expanded row keys. */\r\n expandedKeys?: RowId[]\r\n /** Keys expanded on first mount when `expandedKeys` is not controlled. */\r\n defaultExpandedRowKeys?: RowId[]\r\n /** Fires when a row expand state toggles. */\r\n onExpand?: (expanded: boolean, id: RowId) => void\r\n /** Limits which rows show an expand control. */\r\n rowExpandable?: (row: Record<string, unknown>) => boolean\r\n}\r\n\r\n/** Tree-shaped row data options for the table. */\r\nexport interface TreeConfig {\r\n /** Row field holding nested rows (default `children`). */\r\n childrenColumnName?: string\r\n /** Pixels per tree depth level. */\r\n indentSize?: number\r\n /** Starts with all tree nodes expanded. */\r\n defaultExpandAllRows?: boolean\r\n}\r\n\r\n/** One cell in a custom summary row from `summary`. */\r\nexport interface SummaryCell {\r\n /** Cell body. */\r\n content: React.ReactNode\r\n /** Horizontal span in the summary grid. */\r\n colSpan?: number\r\n /** Text alignment. */\r\n align?: 'left' | 'center' | 'right'\r\n}\r\n\r\n/** Configuration for the optional row number column. */\r\nexport interface RowNumberConfig {\r\n /** Header title for the row number column. */\r\n title?: React.ReactNode\r\n /** Column width in pixels. */\r\n width?: number\r\n /** Pins the row number column. */\r\n fixed?: 'left'\r\n}\r\n\r\n/** Row ids pinned to the top or bottom of the scroll area. */\r\nexport interface PinnedRowsConfig {\r\n /** Row ids rendered in a block above the main body. */\r\n top?: RowId[]\r\n /** Row ids rendered in a block below the main body. */\r\n bottom?: RowId[]\r\n}\r\n\r\n/** Internal metadata for a grouped header row in the body. */\r\nexport interface GroupRow {\r\n /** Marks this synthetic row as a group header. */\r\n __isGroup: true\r\n /** Stable key for the group (stringified value). */\r\n groupKey: string\r\n /** Raw grouping value. */\r\n groupValue: unknown\r\n /** Number of rows in the group. */\r\n count: number\r\n /** Whether child rows are visible. */\r\n expanded: boolean\r\n /** Per-column aggregate display for the group header. */\r\n aggregates: Record<string, React.ReactNode>\r\n}\r\n\r\nexport const DEFAULT_LOCALE: Required<TableLocale> = {\r\n emptyText: 'No data',\r\n filterReset: 'Reset',\r\n filterConfirm: 'OK',\r\n filterSearchPlaceholder: 'Search filters...',\r\n filterEmptyText: 'No filters',\r\n searchPlaceholder: 'Search...',\r\n sortAsc: '▲',\r\n sortDesc: '▼',\r\n expandIcon: '›',\r\n filterIcon: FilterIcon,\r\n searchIcon: SearchIcon,\r\n totalRows: (count) => `${count} rows`,\r\n selectedRows: (count) => `${count} selected`,\r\n exportCSV: 'Export CSV',\r\n exportJSON: 'Export JSON',\r\n copyTable: 'Copy',\r\n pinLeft: 'Pin Left',\r\n pinRight: 'Pin Right',\r\n unpin: 'Unpin',\r\n showColumns: 'Show Columns',\r\n print: 'Print',\r\n fullscreen: 'Fullscreen',\r\n exitFullscreen: 'Exit Fullscreen',\r\n density: 'Density',\r\n densitySmall: 'Compact',\r\n densityMiddle: 'Default',\r\n densityLarge: 'Comfortable',\r\n groupCollapse: 'Collapse All',\r\n groupExpand: 'Expand All',\r\n sum: 'Sum',\r\n avg: 'Avg',\r\n count: 'Count',\r\n min: 'Min',\r\n max: 'Max',\r\n copiedToClipboard: 'Copied!',\r\n rowNumber: '#',\r\n groupByLabel: 'Group by',\r\n groupByNone: 'No grouping',\r\n filterAdvancedValuePlaceholder: 'Value',\r\n filterAdvancedInPlaceholder: 'value1, value2, ...',\r\n filterAdvancedBetweenMaxPlaceholder: 'Max',\r\n filterOpEq: '=',\r\n filterOpNeq: '!=',\r\n filterOpLt: '<',\r\n filterOpLte: '<=',\r\n filterOpGt: '>',\r\n filterOpGte: '>=',\r\n filterOpBetween: 'between',\r\n filterOpIn: 'in',\r\n filterOpNotIn: 'not in',\r\n filterOpContains: 'contains',\r\n filterOpStartsWith: 'starts with',\r\n filterOpEndsWith: 'ends with',\r\n filterOpIsEmpty: 'is empty',\r\n filterOpIsNotEmpty: 'is not empty',\r\n}\r\n\r\nexport const DEFAULT_COL_WIDTH = 150\r\nexport const MIN_COL_WIDTH = 50\r\nexport const SELECTION_COL_WIDTH = '40px'\r\n\r\n/** Action button in the selection summary bar. */\r\nexport interface SelectionSummaryAction {\r\n /** Stable action key. */\r\n key: string\r\n /** Button label. */\r\n label: React.ReactNode\r\n /** Invoked with current selection when the action is clicked. */\r\n onClick: (selectedKeys: RowId[], selectedRows: Array<Record<string, unknown>>) => void\r\n /** Destructive styling hint. */\r\n danger?: boolean\r\n}\r\n\r\n/**\r\n * Props for the `Table` component: column model, selection, scrolling, and toolbar features.\r\n * Styling and interaction props from `BaseComponentProps`, `InteractiveProps`, and `SizableProps` are inherited without per-prop docs here.\r\n */\r\nexport interface TableProps\r\n extends Omit<UseTableOptions, 'columns'>, BaseComponentProps, InteractiveProps, SizableProps {\r\n /** Column definitions (leaf and/or grouped). */\r\n columns: TableColumn[]\r\n /** Dataset rows bound to the table engine (from `useTable` options). */\r\n data?: Array<{ id: RowId; data: Record<string, unknown> }>\r\n /** Page size for built-in pagination (from table engine options). */\r\n pageSize?: number\r\n /** Row selection state and callbacks. */\r\n rowSelection?: RowSelectionConfig\r\n /** Optional expandable row renderer. */\r\n expandable?: ExpandableConfig\r\n /** Renders hierarchical rows from nested data. */\r\n tree?: TreeConfig\r\n /** Sticky header while scrolling vertically. */\r\n sticky?: boolean\r\n /** Enables column reorder by drag-and-drop in the header. */\r\n draggable?: boolean\r\n /** Shows toolbar search across visible columns. */\r\n searchable?: boolean\r\n /** @default true */\r\n showPagination?: boolean\r\n /** Outlined table borders. */\r\n bordered?: boolean\r\n\r\n /** Horizontal and/or vertical scroll constraints. */\r\n scroll?: { x?: number | string; y?: number | string }\r\n /** Custom summary rows below the body. */\r\n summary?: (data: Array<{ id: RowId; data: Record<string, unknown> }>) => SummaryCell[][]\r\n /** Row click handler. */\r\n onRowClick?: (id: RowId, data: Record<string, unknown>) => void\r\n /** Commits inline cell edit values. */\r\n onCellEdit?: (id: RowId, column: string, value: unknown) => void\r\n /** Called after header columns are reordered by drag-and-drop. */\r\n onColumnOrderChange?: (order: string[]) => void\r\n /** Extra class for each body row. */\r\n rowClassName?: string | ((row: Record<string, unknown>, id: RowId) => string)\r\n /** Overrides default locale strings. */\r\n locale?: TableLocale\r\n\r\n /** Enables shift-click multi-column sort. */\r\n multiSort?: boolean\r\n /** Controlled multi-sort model. */\r\n sorts?: SortConfig[]\r\n /** Fires when multi-sort state changes. */\r\n onSortsChange?: (sorts: SortConfig[]) => void\r\n\r\n /** Enables dragging body rows to reorder. */\r\n rowDraggable?: boolean\r\n /** Called after row reorder via drag-and-drop. */\r\n onRowOrderChange?: (fromIndex: number, toIndex: number) => void\r\n\r\n /** Builds context menu items for a header cell. */\r\n headerContextMenu?: (column: TableColumn) => ContextMenuItem[]\r\n /** Builds context menu items for a body cell. */\r\n cellContextMenu?: (id: RowId, column: string, data: Record<string, unknown>) => ContextMenuItem[]\r\n\r\n /** Shows column visibility controls in the toolbar. */\r\n columnVisibility?: boolean\r\n /** Controlled hidden column keys. */\r\n hiddenColumns?: string[]\r\n /** Fires when visible columns change. */\r\n onHiddenColumnsChange?: (keys: string[]) => void\r\n\r\n /** Enables pin/unpin via header context menu. */\r\n columnPinning?: boolean\r\n /** Fires when a column pin side changes. */\r\n onColumnPinChange?: (key: string, fixed: 'left' | 'right' | undefined) => void\r\n\r\n /**\r\n * Виртуализирует тело таблицы для больших датасетов.\r\n *\r\n * - `true` — фиксированная высота 40px.\r\n * - `{ rowHeight: 60 }` — фиксированная высота 60px.\r\n * - `{ rowHeight: (row, id) => h }` — динамическая высота, переданная\r\n * функция используется как эстимейт до того, как `ResizeObserver`\r\n * отчитается о реальной высоте каждой строки.\r\n * - `{ rowHeight: 40, estimateRowHeight: (row) => h }` — то же самое,\r\n * но с явным разделением \"первое значение / эстимейт-callback\".\r\n */\r\n virtual?:\r\n | boolean\r\n | {\r\n /**\r\n * Стартовое значение высоты строки. Число — фиксированный фоллбэк\r\n * (быстрый путь). Функция — включает динамическое измерение через\r\n * ResizeObserver, вызываясь как эстимейт до первого реального\r\n * измерения.\r\n */\r\n rowHeight?: number | ((row: Record<string, unknown>, id: RowId) => number)\r\n /**\r\n * Дополнительный эстимейт высоты, разрешает динамическое измерение\r\n * даже при числовом `rowHeight`. Имеет приоритет над `rowHeight`-\r\n * фоллбэком при выборе размера до измерения.\r\n */\r\n estimateRowHeight?: (row: Record<string, unknown>, id: RowId) => number\r\n overscan?: number\r\n height?: number | string\r\n }\r\n\r\n /** Shows CSV export and copy actions in the toolbar. */\r\n exportable?: boolean\r\n /** Custom export handler; default downloads CSV. */\r\n onExport?: (data: string[][]) => void\r\n\r\n /** Shows a bar when rows are selected. */\r\n selectionSummary?: boolean\r\n /** Buttons rendered in the selection summary bar. */\r\n selectionActions?: SelectionSummaryAction[]\r\n\r\n /** Zebra striping on body rows. */\r\n striped?: boolean\r\n\r\n /** Page size selector on the pagination control. */\r\n showSizeChanger?: boolean\r\n /** Options for page size selector. */\r\n pageSizeOptions?: number[]\r\n /** Quick jump to page input on pagination. */\r\n showQuickJumper?: boolean\r\n /** Total / range label on pagination. */\r\n showTotal?: boolean | ((total: number, range: [number, number]) => React.ReactNode)\r\n /** Fires when page size changes. */\r\n onPageSizeChange?: (size: number) => void\r\n\r\n /** Prepends a row index column. */\r\n showRowNumber?: boolean | RowNumberConfig\r\n\r\n /** Shows aggregate values in a footer row. */\r\n footer?: boolean\r\n\r\n /** Fullscreen toggle in the toolbar. */\r\n fullscreenable?: boolean\r\n\r\n /** Density (row height) selector in the toolbar. */\r\n densityToggle?: boolean\r\n\r\n /** Field key to group rows by. */\r\n groupBy?: string\r\n /** Starts with all groups expanded. */\r\n defaultGroupExpanded?: boolean\r\n /** Fires when a group expand state changes. */\r\n onGroupExpandChange?: (groupKey: string, expanded: boolean) => void\r\n /**\r\n * Optional list of fields the user can pick to group by from the toolbar\r\n * dropdown. When omitted, the dropdown is hidden and only the controlled\r\n * `groupBy` value is used.\r\n */\r\n groupByOptions?: Array<{ key: string; label: React.ReactNode }>\r\n /** Called when the user picks a different `groupBy` field from the toolbar. */\r\n onGroupByChange?: (field: string | null) => void\r\n\r\n /** Arrow-key focus navigation between cells. */\r\n keyboardNavigation?: boolean\r\n\r\n /** Pins specific row ids to top or bottom. */\r\n pinnedRows?: PinnedRowsConfig\r\n\r\n /** Replaces default empty state content. */\r\n emptyContent?: React.ReactNode\r\n\r\n /**\r\n * Print action in the toolbar и/или включение `ref.print()`.\r\n *\r\n * `true` — стандартная кнопка в тулбаре.\r\n * `{ fileName?: string }` — кнопка + имя popup-окна (используется браузером\r\n * как заголовок и дефолтное имя файла в \"Save as PDF\").\r\n * `false` / `undefined` — кнопки нет; `ref.print()` всё равно работает.\r\n */\r\n printable?: PrintableProp\r\n\r\n /** JSON export action in the toolbar. */\r\n exportJSON?: boolean\r\n\r\n /** Row hover highlight; set false to disable. */\r\n highlightOnHover?: boolean\r\n\r\n /** Double-click resize handle fits column to content. */\r\n columnAutoResize?: boolean\r\n\r\n /**\r\n * Дополнительные классы по слотам. Публичный API — см. `docs/styling-contract.md` §4.1.\r\n * Имена слотов стабильны, классы-значения применяются поверх встроенных `.sg-table-*`.\r\n */\r\n classNames?: TableClassNames\r\n /** Инлайн-стили по слотам. Публичный API — см. `docs/styling-contract.md` §4.1. */\r\n styles?: TableStyles\r\n}\r\n\r\n/** One cell in a multi-row header grid. */\r\nexport interface HeaderCell {\r\n /** Column at this header position. */\r\n col: TableColumn\r\n /** Horizontal span in header grid units. */\r\n colSpan: number\r\n /** Vertical span in header grid units. */\r\n rowSpan: number\r\n}\r\n\r\n/** Flattened row model passed to body renderers. */\r\nexport interface FlatRow {\r\n /** Row id. */\r\n id: RowId\r\n /** Row field values. */\r\n data: Record<string, unknown>\r\n /** Tree depth when tree mode is enabled. */\r\n depth: number\r\n /** Whether the row has nested children in tree mode. */\r\n hasChildren: boolean\r\n /** Present when this row is a group header. */\r\n __groupRow?: GroupRow\r\n}\r\n","import type { PrintOptions } from './types'\n\n/**\n * Вычисляет CSS `@page` блок для popup-страницы по `PrintOptions`. Вынесено\n * в отдельную функцию ради тестируемости (snapshot-тест без `window.open`).\n */\nexport function buildPageRule(opts: PrintOptions = {}): string {\n const orientation = opts.orientation ?? 'portrait'\n const pageSize = opts.pageSize ?? 'A4'\n const margins = opts.margins ?? '1cm'\n return `@page { size: ${pageSize} ${orientation}; margin: ${margins}; }`\n}\n\n/**\n * Собирает HTML-документ popup-страницы. Используется `printElement` и\n * напрямую тестами — поэтому никаких `window.*` побочных эффектов.\n *\n * Стратегия:\n * 1. Клонируем `<style>` и `<link rel=\"stylesheet\">` из текущего\n * документа, чтобы popup увидел SkyGraph-стили (включая `print.css`).\n * 2. Дописываем нашу `@page`-секцию + `body` reset.\n * 3. Опциональный `transform: scale(...)` на обёртке.\n * 4. Подставляем `outerHTML` исходного `node`.\n * 5. Триггерим `print()` после `load`-события, чтобы шрифты и стили\n * успели приехать в popup.\n */\nexport function buildPrintHtml(\n fragment: string,\n opts: PrintOptions = {},\n documentRef: Document | null = typeof document !== 'undefined' ? document : null,\n): string {\n const styles =\n documentRef === null\n ? ''\n : Array.from(documentRef.querySelectorAll('style, link[rel=\"stylesheet\"]'))\n .map((el) => el.outerHTML)\n .join('\\n')\n\n const pageRule = buildPageRule(opts)\n const scale = opts.scale && opts.scale !== 1 ? opts.scale : null\n const title = escapeHtml(opts.fileName ?? 'SkyGraph print')\n const customStyles = opts.customStyles ?? ''\n\n const wrapperOpen = scale\n ? `<div class=\"sg-print-root\" style=\"transform: scale(${scale}); transform-origin: 0 0;\">`\n : `<div class=\"sg-print-root\">`\n\n return `<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\" />\n<title>${title}</title>\n${styles}\n<style>\n ${pageRule}\n html, body { margin: 0; padding: 0; background: #fff; }\n body { padding: 0; }\n .sg-print-root { width: 100%; }\n ${customStyles}\n</style>\n</head>\n<body>\n${wrapperOpen}\n${fragment}\n</div>\n</body>\n</html>`\n}\n\nfunction escapeHtml(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;')\n}\n\n/**\n * Открывает popup-окно, инжектирует SkyGraph-стили + `outerHTML` `node`-а,\n * и вызывает `window.print()`. Возвращает popup-окно или `null`, если\n * браузер заблокировал открытие нового окна.\n *\n * Пример:\n * ```ts\n * const ref = useRef<HTMLDivElement>(null)\n * <button onClick={() => printElement(ref.current, { fileName: 'report.pdf' })}>\n * Print\n * </button>\n * ```\n *\n * Никаких runtime-зависимостей: всё на штатном `window.open` + CSS\n * `@media print`. PDF получается через системный диалог печати → \"Save as PDF\".\n */\nexport function printElement(\n node: Element | null,\n opts: PrintOptions = {},\n): Window | null {\n if (!node) return null\n if (typeof window === 'undefined') return null\n\n const popup = window.open('', '_blank')\n if (!popup) return null\n\n const html = buildPrintHtml(node.outerHTML, opts)\n popup.document.open()\n popup.document.write(html)\n popup.document.close()\n popup.focus()\n\n if (opts.skipPrint) return popup\n\n // Дать браузеру время подгрузить linked-stylesheet'ы. `setTimeout(0)`\n // достаточно для inline `<style>` блоков; для `<link>` лучше ждать `load`.\n const trigger = () => {\n try {\n popup.print()\n } catch {\n // Печать может быть заблокирована; popup всё равно остаётся открытым,\n // пользователь может вызвать \"печать\" из меню браузера вручную.\n }\n if (!opts.keepOpen) {\n try {\n popup.close()\n } catch {\n // Closed by user already / blocked — игнорируем.\n }\n }\n }\n\n // `load` срабатывает после линковки стилей. Если popup уже `complete`,\n // запускаем сразу. Минимальный fallback на `setTimeout` — на случай\n // окружений (jsdom), где `load` не диспатчится.\n if (popup.document.readyState === 'complete') {\n setTimeout(trigger, 0)\n } else {\n popup.addEventListener('load', () => setTimeout(trigger, 0), { once: true })\n setTimeout(trigger, 300)\n }\n\n return popup\n}\n","import type React from 'react'\r\n\r\n/**\r\n * Слот-API: публичный контракт для точечной стилизации сложных компонентов.\r\n * См. `docs/styling-contract.md` §2.2, §4.\r\n *\r\n * - `classNames?: XxxClassNames` — дополнительный класс на конкретный слот;\r\n * - `styles?: XxxStyles` — инлайн-стили на конкретный слот;\r\n * - `className` / `style` (на корне) — применяются дополнительно к `classNames.root` / `styles.root`;\r\n * - порядок: дефолтный класс библиотеки → пользовательский слот-класс → корневой `className`.\r\n */\r\n\r\n/** Мапа `слот → className`. */\r\nexport type SlotClassNames<K extends string> = Partial<Record<K, string>>\r\n\r\n/** Мапа `слот → React.CSSProperties`. */\r\nexport type SlotStyles<K extends string> = Partial<Record<K, React.CSSProperties>>\r\n\r\n/**\r\n * Объединяет базовый класс, пользовательский класс для слота и (опционально)\r\n * дополнительные модификаторы в один className.\r\n *\r\n * ```ts\r\n * const cls = slotClass('sg-table-th', classNames?.headerCell, extraMod && 'sg-table-th-sortable')\r\n * ```\r\n */\r\nexport function slotClass(\r\n ...parts: Array<string | false | null | undefined>\r\n): string | undefined {\r\n const filtered = parts.filter((p): p is string => typeof p === 'string' && p.length > 0)\r\n return filtered.length ? filtered.join(' ') : undefined\r\n}\r\n\r\n/**\r\n * Мержит пользовательские стили слота с базовым `style`.\r\n * Пользовательские стили переопределяют базовые.\r\n */\r\nexport function slotStyle(\r\n base: React.CSSProperties | undefined,\r\n custom: React.CSSProperties | undefined,\r\n): React.CSSProperties | undefined {\r\n if (!base && !custom) return undefined\r\n if (!base) return custom\r\n if (!custom) return base\r\n return { ...base, ...custom }\r\n}\r\n","import React, { useState, useEffect, useMemo, useCallback, useRef } from 'react'\nimport { useTree } from '../../../hooks/useTree'\nimport { TreeNodeRow } from './TreeNodeRow'\nimport type { TreeProps, TreeKey, TreeNodeData } from './types'\nimport { DEFAULT_TREE_LOCALE, DEFAULT_INDENT, NODE_HEIGHT } from './types'\n\n/**\n * Hierarchical list with expand/collapse, checkboxes, selection, search, keyboard focus, and optional drag-and-drop.\n * State is managed by `useTree`; rows are rendered through `TreeNodeRow`.\n */\nexport function Tree(props: TreeProps) {\n const {\n treeData,\n fieldNames,\n checkable = false,\n checkStrictly = false,\n checkedKeys: controlledCheckedKeys,\n defaultCheckedKeys,\n onCheck,\n selectable = true,\n multiple = false,\n selectedKeys: controlledSelectedKeys,\n defaultSelectedKeys,\n onSelect,\n expandedKeys: controlledExpandedKeys,\n defaultExpandedKeys,\n defaultExpandAll = false,\n autoExpandParent = false,\n onExpand,\n draggable = false,\n allowDrop,\n onDragStart,\n onDragOver,\n onDragLeave,\n onDragEnd,\n onDrop,\n loadData,\n showLine = false,\n showIcon = false,\n icon: globalIcon,\n switcherIcon,\n blockNode = false,\n height,\n virtual = true,\n disabled = false,\n indentSize = DEFAULT_INDENT,\n directory = false,\n onRightClick,\n // Search\n showSearch = false,\n searchValue: controlledSearchValue,\n defaultSearchValue = '',\n onSearch,\n filterTreeNode,\n highlightSearch = true,\n // Keyboard\n keyboard = true,\n // Editable\n editable = false,\n onEdit,\n onEditCancel,\n // Custom render\n titleRender,\n // Actions\n actions,\n // Toolbar\n showToolbar = false,\n toolbarExtra,\n // Animation\n animated = true,\n // Focus\n autoFocus = false,\n focusedKey: controlledFocusedKey,\n onFocus: onFocusCallback,\n // Scroll\n scrollToKey,\n // Status\n nodeStatus,\n locale,\n className,\n style,\n unstyled,\n } = props\n\n const t = useMemo(() => ({ ...DEFAULT_TREE_LOCALE, ...locale }), [locale])\n\n const showLineConfig = typeof showLine === 'object' ? showLine : { showLeafIcon: false }\n const isShowLine = !!showLine\n\n const {\n tree,\n treeState,\n flatNodes,\n toggleExpand,\n setExpandedKeys,\n expandAll,\n collapseAll,\n toggleCheck,\n setCheckedKeys,\n select,\n setSelectedKeys,\n markLoading,\n markLoaded,\n moveNode,\n filterNodes,\n refresh,\n } = useTree({\n data: treeData,\n fieldNames,\n checkStrictly,\n defaultExpandAll,\n defaultExpandedKeys,\n defaultCheckedKeys,\n defaultSelectedKeys,\n })\n\n // ═══════════════════════════════════════════\n // SEARCH STATE\n // ═══════════════════════════════════════════\n const [internalSearchValue, setInternalSearchValue] = useState(defaultSearchValue)\n const searchValue = controlledSearchValue ?? internalSearchValue\n\n const handleSearchChange = useCallback(\n (value: string) => {\n if (controlledSearchValue === undefined) {\n setInternalSearchValue(value)\n }\n onSearch?.(value)\n\n if (!value) {\n filterNodes(null)\n return\n }\n\n const predicate = filterTreeNode\n ? (node: TreeNodeData) => filterTreeNode(node, value)\n : (node: TreeNodeData) => {\n const title = String(node.title ?? '')\n return title.toLowerCase().includes(value.toLowerCase())\n }\n\n filterNodes(predicate)\n\n if (autoExpandParent) {\n const filtered = tree.getFilteredKeys()\n if (filtered) {\n setExpandedKeys(filtered)\n }\n }\n },\n [\n controlledSearchValue,\n onSearch,\n filterTreeNode,\n filterNodes,\n autoExpandParent,\n tree,\n setExpandedKeys,\n ],\n )\n\n useEffect(() => {\n if (controlledSearchValue !== undefined && controlledSearchValue !== internalSearchValue) {\n handleSearchChange(controlledSearchValue)\n }\n }, [controlledSearchValue]) // eslint-disable-line react-hooks/exhaustive-deps\n\n // ═══════════════════════════════════════════\n // SYNC DATA CHANGES\n // ═══════════════════════════════════════════\n const prevDataRef = useRef(treeData)\n useEffect(() => {\n if (prevDataRef.current !== treeData) {\n prevDataRef.current = treeData\n tree.setData(treeData)\n refresh()\n }\n }, [treeData, tree, refresh])\n\n // Controlled keys\n useEffect(() => {\n if (controlledExpandedKeys !== undefined) setExpandedKeys(controlledExpandedKeys)\n }, [controlledExpandedKeys, setExpandedKeys])\n\n useEffect(() => {\n if (controlledCheckedKeys !== undefined) setCheckedKeys(controlledCheckedKeys)\n }, [controlledCheckedKeys, setCheckedKeys])\n\n useEffect(() => {\n if (controlledSelectedKeys !== undefined) setSelectedKeys(controlledSelectedKeys)\n }, [controlledSelectedKeys, setSelectedKeys])\n\n // ═══════════════════════════════════════════\n // FOCUS STATE\n // ═══════════════════════════════════════════\n const [internalFocusedKey, setInternalFocusedKey] = useState<TreeKey | null>(null)\n const focusedKey = controlledFocusedKey ?? internalFocusedKey\n const treeRef = useRef<HTMLDivElement>(null)\n\n const setFocusedKey = useCallback(\n (key: TreeKey | null) => {\n setInternalFocusedKey(key)\n if (key !== null) onFocusCallback?.(key)\n },\n [onFocusCallback],\n )\n\n useEffect(() => {\n if (autoFocus && flatNodes.length > 0 && focusedKey === null) {\n setFocusedKey(flatNodes[0].key)\n }\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n // ═══════════════════════════════════════════\n // EDITING STATE\n // ═══════════════════════════════════════════\n const [editingKey, setEditingKey] = useState<TreeKey | null>(null)\n\n const isNodeEditable = useCallback(\n (node: TreeNodeData): boolean => {\n if (typeof editable === 'function') return editable(node)\n return !!editable\n },\n [editable],\n )\n\n const handleEditStart = useCallback((key: TreeKey) => {\n setEditingKey(key)\n }, [])\n\n const handleEditConfirm = useCallback(\n (key: TreeKey, value: string) => {\n const node = tree.getNode(key)\n if (node && onEdit) {\n onEdit({ key, node, value, oldValue: String(node.title ?? '') })\n }\n setEditingKey(null)\n },\n [tree, onEdit],\n )\n\n const handleEditCancelInternal = useCallback(\n (key: TreeKey) => {\n setEditingKey(null)\n onEditCancel?.(key)\n },\n [onEditCancel],\n )\n\n // ═══════════════════════════════════════════\n // DRAG STATE\n // ═══════════════════════════════════════════\n const [dragKey, setDragKey] = useState<TreeKey | null>(null)\n const [dropKey, setDropKey] = useState<TreeKey | null>(null)\n const [dropPosition, setDropPosition] = useState<-1 | 0 | 1>(0)\n\n // ═══════════════════════════════════════════\n // EVENT HANDLERS\n // ═══════════════════════════════════════════\n const handleExpand = useCallback(\n (key: TreeKey) => {\n toggleExpand(key)\n const node = tree.getNode(key)\n if (node && onExpand) {\n const newState = tree.getState()\n const expanded = newState.expandedKeys.includes(key)\n onExpand(newState.expandedKeys, { expanded, node })\n }\n },\n [toggleExpand, tree, onExpand],\n )\n\n const handleCheck = useCallback(\n (key: TreeKey) => {\n toggleCheck(key)\n if (onCheck) {\n const newState = tree.getState()\n const node = tree.getNode(key)!\n const checkedNodes = newState.checkedKeys\n .map((ck: TreeKey) => tree.getNode(ck))\n .filter(Boolean) as TreeNodeData[]\n onCheck(newState.checkedKeys, {\n checked: newState.checkedKeys.includes(key),\n node,\n checkedNodes,\n halfCheckedKeys: newState.halfCheckedKeys,\n })\n }\n },\n [toggleCheck, tree, onCheck],\n )\n\n const handleSelect = useCallback(\n (key: TreeKey) => {\n select(key, multiple)\n if (onSelect) {\n const newState = tree.getState()\n const node = tree.getNode(key)!\n const selectedNodes = newState.selectedKeys\n .map((sk: TreeKey) => tree.getNode(sk))\n .filter(Boolean) as TreeNodeData[]\n onSelect(newState.selectedKeys, {\n selected: newState.selectedKeys.includes(key),\n node,\n selectedNodes,\n })\n }\n },\n [select, multiple, tree, onSelect],\n )\n\n const handleLoadData = useCallback(\n (node: TreeNodeData) => {\n if (!loadData) return\n const key = node.key\n if (treeState.loadedKeys.includes(key) || treeState.loadingKeys.includes(key)) return\n markLoading(key)\n loadData(node).then(() => {\n markLoaded(key)\n })\n },\n [loadData, treeState.loadedKeys, treeState.loadingKeys, markLoading, markLoaded],\n )\n\n // Drag handlers\n const handleDragStart = useCallback(\n (e: React.DragEvent, key: TreeKey) => {\n setDragKey(key)\n e.dataTransfer.effectAllowed = 'move'\n const node = tree.getNode(key)\n if (node) onDragStart?.({ event: e, node })\n },\n [tree, onDragStart],\n )\n\n const handleDragOver = useCallback(\n (e: React.DragEvent, key: TreeKey) => {\n e.preventDefault()\n setDropKey(key)\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect()\n const y = e.clientY - rect.top\n const h = rect.height\n let pos: -1 | 0 | 1 = 0\n if (y < h * 0.25) pos = -1\n else if (y > h * 0.75) pos = 1\n setDropPosition(pos)\n const node = tree.getNode(key)\n if (node) onDragOver?.({ event: e, node })\n },\n [tree, onDragOver],\n )\n\n const handleDragLeave = useCallback(\n (e: React.DragEvent, key: TreeKey) => {\n setDropKey(null)\n const node = tree.getNode(key)\n if (node) onDragLeave?.({ event: e, node })\n },\n [tree, onDragLeave],\n )\n\n const handleDragEnd = useCallback(\n (e: React.DragEvent, key: TreeKey) => {\n setDragKey(null)\n setDropKey(null)\n const node = tree.getNode(key)\n if (node) onDragEnd?.({ event: e, node })\n },\n [tree, onDragEnd],\n )\n\n const handleDrop = useCallback(\n (e: React.DragEvent, key: TreeKey) => {\n e.preventDefault()\n if (dragKey === null || dragKey === key) {\n setDragKey(null)\n setDropKey(null)\n return\n }\n\n const dragNode = tree.getNode(dragKey)\n const dropNode = tree.getNode(key)\n if (!dragNode || !dropNode) return\n\n if (allowDrop && !allowDrop({ dragNode, dropNode, dropPosition })) {\n setDragKey(null)\n setDropKey(null)\n return\n }\n\n moveNode(dragKey, key, dropPosition)\n\n if (onDrop) {\n onDrop({ event: e, node: dropNode, dragNode, dropPosition })\n }\n\n setDragKey(null)\n setDropKey(null)\n },\n [dragKey, dropPosition, tree, allowDrop, moveNode, onDrop],\n )\n\n const handleRightClick = useCallback(\n (e: React.MouseEvent, node: TreeNodeData) => {\n onRightClick?.({ event: e, node })\n },\n [onRightClick],\n )\n\n const isDraggable = (node: TreeNodeData): boolean => {\n if (typeof draggable === 'function') return draggable(node)\n return !!draggable\n }\n\n // ═══════════════════════════════════════════\n // VIRTUAL SCROLL (refs declared early — used by keyboard handlers below)\n // ═══════════════════════════════════════════\n const containerRef = useRef<HTMLDivElement>(null)\n const [scrollTop, setScrollTop] = useState(0)\n const itemHeight = NODE_HEIGHT\n\n // Scrolls the virtual viewport so the row for `key` is visible. Declared\n // before `handleKeyDown` so it can be listed in the callback's deps array\n // (otherwise eslint-react-hooks/exhaustive-deps complains).\n const scrollToFocused = useCallback(\n (key: TreeKey) => {\n const index = flatNodes.findIndex((item) => item.key === key)\n if (index === -1) return\n const el = containerRef.current ?? treeRef.current\n if (!el) return\n const targetTop = index * itemHeight\n const { scrollTop: st, clientHeight: ch } = el\n if (targetTop < st) {\n el.scrollTop = targetTop\n } else if (targetTop + itemHeight > st + ch) {\n el.scrollTop = targetTop + itemHeight - ch\n }\n },\n [flatNodes, itemHeight],\n )\n\n // ═══════════════════════════════════════════\n // KEYBOARD NAVIGATION\n // ═══════════════════════════════════════════\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (!keyboard || disabled || editingKey !== null) return\n\n const currentIndex = flatNodes.findIndex((item) => item.key === focusedKey)\n if (currentIndex === -1 && flatNodes.length === 0) return\n\n const focusNode = (index: number) => {\n if (index >= 0 && index < flatNodes.length) {\n setFocusedKey(flatNodes[index].key)\n scrollToFocused(flatNodes[index].key)\n }\n }\n\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault()\n focusNode(currentIndex === -1 ? 0 : Math.min(currentIndex + 1, flatNodes.length - 1))\n break\n }\n case 'ArrowUp': {\n e.preventDefault()\n focusNode(currentIndex === -1 ? 0 : Math.max(currentIndex - 1, 0))\n break\n }\n case 'ArrowRight': {\n e.preventDefault()\n if (currentIndex === -1) break\n const item = flatNodes[currentIndex]\n if (!item.isLeaf && !treeState.expandedKeys.includes(item.key)) {\n handleExpand(item.key)\n } else if (!item.isLeaf && treeState.expandedKeys.includes(item.key)) {\n focusNode(currentIndex + 1)\n }\n break\n }\n case 'ArrowLeft': {\n e.preventDefault()\n if (currentIndex === -1) break\n const item = flatNodes[currentIndex]\n if (!item.isLeaf && treeState.expandedKeys.includes(item.key)) {\n handleExpand(item.key)\n } else if (item.parentKey !== null) {\n const parentIndex = flatNodes.findIndex((n) => n.key === item.parentKey)\n if (parentIndex !== -1) focusNode(parentIndex)\n }\n break\n }\n case 'Home': {\n e.preventDefault()\n focusNode(0)\n break\n }\n case 'End': {\n e.preventDefault()\n focusNode(flatNodes.length - 1)\n break\n }\n case 'Enter': {\n e.preventDefault()\n if (currentIndex === -1) break\n const item = flatNodes[currentIndex]\n if (selectable) handleSelect(item.key)\n break\n }\n case ' ': {\n e.preventDefault()\n if (currentIndex === -1) break\n const item = flatNodes[currentIndex]\n if (checkable) handleCheck(item.key)\n else if (!item.isLeaf) handleExpand(item.key)\n break\n }\n case '*': {\n e.preventDefault()\n expandAll()\n break\n }\n case 'F2': {\n e.preventDefault()\n if (currentIndex === -1) break\n const item = flatNodes[currentIndex]\n if (isNodeEditable(item.node)) {\n handleEditStart(item.key)\n }\n break\n }\n }\n },\n [\n keyboard,\n disabled,\n editingKey,\n flatNodes,\n focusedKey,\n treeState.expandedKeys,\n handleExpand,\n handleCheck,\n handleSelect,\n expandAll,\n setFocusedKey,\n checkable,\n selectable,\n scrollToFocused,\n isNodeEditable,\n handleEditStart,\n ],\n )\n\n // ═══════════════════════════════════════════\n // VIRTUAL SCROLL (handlers + memoized slices)\n // ═══════════════════════════════════════════\n const handleScroll = useCallback(() => {\n if (containerRef.current) {\n setScrollTop(containerRef.current.scrollTop)\n }\n }, [])\n\n const useVirtual = virtual && height !== undefined && flatNodes.length > 50\n\n // Larger overscan keeps rows mounted during fast scroll. `+ overscan*2` so\n // the visible window has padding both above and below the viewport.\n const VIRTUAL_OVERSCAN = 5\n\n const visibleSlice = useMemo(() => {\n if (!useVirtual || !height) {\n return { nodes: flatNodes, startIndex: 0 }\n }\n const rawStart = Math.floor(scrollTop / itemHeight)\n const startIndex = Math.max(0, rawStart - VIRTUAL_OVERSCAN)\n const visibleCount = Math.ceil(height / itemHeight) + VIRTUAL_OVERSCAN * 2\n const endIndex = Math.min(flatNodes.length, startIndex + visibleCount)\n return { nodes: flatNodes.slice(startIndex, endIndex), startIndex }\n }, [flatNodes, useVirtual, height, scrollTop, itemHeight])\n\n const visibleNodes = visibleSlice.nodes\n const virtualOffset = visibleSlice.startIndex * itemHeight\n\n const totalHeight = flatNodes.length * itemHeight\n const virtualBottomPad = Math.max(\n 0,\n totalHeight - virtualOffset - visibleNodes.length * itemHeight,\n )\n\n // scrollToKey prop\n useEffect(() => {\n if (scrollToKey !== undefined) {\n const index = flatNodes.findIndex((item) => item.key === scrollToKey)\n if (index !== -1) {\n scrollToFocused(scrollToKey)\n setFocusedKey(scrollToKey)\n }\n }\n }, [scrollToKey]) // eslint-disable-line react-hooks/exhaustive-deps\n\n // ═══════════════════════════════════════════\n // TOOLBAR HANDLERS\n // ═══════════════════════════════════════════\n const handleExpandAll = useCallback(() => {\n expandAll()\n if (onExpand) onExpand(tree.getState().expandedKeys, { expanded: true, node: treeData[0] })\n }, [expandAll, onExpand, tree, treeData])\n\n const handleCollapseAll = useCallback(() => {\n collapseAll()\n if (onExpand) onExpand([], { expanded: false, node: treeData[0] })\n }, [collapseAll, onExpand, treeData])\n\n const handleCheckAll = useCallback(() => {\n const allKeys = tree.getAllKeys()\n setCheckedKeys(allKeys)\n if (onCheck) {\n const allNodes = allKeys\n .map((k: TreeKey) => tree.getNode(k))\n .filter(Boolean) as TreeNodeData[]\n onCheck(allKeys, {\n checked: true,\n node: allNodes[0],\n checkedNodes: allNodes,\n halfCheckedKeys: [],\n })\n }\n }, [tree, setCheckedKeys, onCheck])\n\n const handleUncheckAll = useCallback(() => {\n setCheckedKeys([])\n if (onCheck) {\n onCheck([], { checked: false, node: treeData[0], checkedNodes: [], halfCheckedKeys: [] })\n }\n }, [setCheckedKeys, onCheck, treeData])\n\n // ═══════════════════════════════════════════\n // RENDER HELPERS\n // ═══════════════════════════════════════════\n const siblingsMap = useMemo(() => {\n if (!isShowLine) return null\n const map = new Map<TreeKey, { isLast: boolean; parentIsLast: boolean[] }>()\n function walk(list: TreeNodeData[], depth: number, parentIsLast: boolean[]) {\n for (let i = 0; i < list.length; i++) {\n const node = list[i]\n const key = node.key\n const isLast = i === list.length - 1\n map.set(key, { isLast, parentIsLast: [...parentIsLast] })\n const children = node.children\n if (children && children.length > 0) {\n walk(children, depth + 1, [...parentIsLast, isLast])\n }\n }\n }\n walk(treeData, 0, [])\n return map\n }, [treeData, isShowLine])\n\n const renderNode = (item: {\n node: TreeNodeData\n key: TreeKey\n depth: number\n isLeaf: boolean\n parentKey?: TreeKey | null\n }) => {\n const lineInfo = siblingsMap?.get(item.key)\n return (\n <TreeNodeRow\n key={item.key}\n node={item.node}\n nodeKey={item.key}\n depth={item.depth}\n isLeaf={item.isLeaf}\n indentSize={indentSize}\n expanded={treeState.expandedKeys.includes(item.key)}\n checked={treeState.checkedKeys.includes(item.key)}\n halfChecked={treeState.halfCheckedKeys.includes(item.key)}\n selected={treeState.selectedKeys.includes(item.key)}\n loading={treeState.loadingKeys.includes(item.key)}\n disabled={disabled || !!item.node.disabled}\n focused={focusedKey === item.key}\n checkable={checkable}\n selectable={selectable}\n showLine={isShowLine}\n showLeafIcon={showLineConfig.showLeafIcon ?? false}\n showIcon={showIcon || directory}\n blockNode={blockNode}\n directory={directory}\n animated={animated}\n globalIcon={globalIcon}\n nodeIcon={\n item.node.icon as\n | React.ReactNode\n | ((props: { expanded: boolean; selected: boolean }) => React.ReactNode)\n | undefined\n }\n switcherIcon={switcherIcon}\n draggable={isDraggable(item.node)}\n dropPosition={dropKey === item.key ? dropPosition : null}\n dragKey={dragKey}\n t={t}\n onExpand={handleExpand}\n onCheck={handleCheck}\n onSelect={handleSelect}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDragEnd={handleDragEnd}\n onDrop={handleDrop}\n onRightClick={onRightClick ? handleRightClick : undefined}\n onLoadData={loadData ? handleLoadData : undefined}\n nodeClassName={item.node.className as string | undefined}\n nodeStyle={item.node.style as React.CSSProperties | undefined}\n // New features\n titleRender={titleRender}\n searchValue={highlightSearch ? searchValue : ''}\n editable={isNodeEditable(item.node)}\n editing={editingKey === item.key}\n onEditStart={handleEditStart}\n onEditConfirm={handleEditConfirm}\n onEditCancel={handleEditCancelInternal}\n actions={actions}\n status={nodeStatus?.(item.node) ?? 'default'}\n lineIsLast={lineInfo?.isLast ?? false}\n lineParentIsLast={lineInfo?.parentIsLast ?? []}\n onFocusNode={setFocusedKey}\n />\n )\n }\n\n // ═══════════════════════════════════════════\n // UNSTYLED RENDER\n // ═══════════════════════════════════════════\n if (unstyled) {\n return (\n <div\n ref={treeRef}\n className={className}\n style={style}\n role=\"tree\"\n tabIndex={0}\n onKeyDown={handleKeyDown}\n >\n {flatNodes.map((item) => renderNode(item))}\n </div>\n )\n }\n\n // ═══════════════════════════════════════════\n // STYLED RENDER\n // ═══════════════════════════════════════════\n const wrapperCls = [\n 'sg-tree',\n isShowLine ? 'sg-tree-show-line' : '',\n blockNode ? 'sg-tree-block-node' : '',\n directory ? 'sg-tree-directory' : '',\n disabled ? 'sg-tree-disabled' : '',\n animated ? 'sg-tree-animated' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const renderSearch = () => {\n if (!showSearch) return null\n return (\n <div className=\"sg-tree-search\">\n <input\n className=\"sg-tree-search-input\"\n type=\"text\"\n value={searchValue}\n onChange={(e) => handleSearchChange(e.target.value)}\n placeholder={t.searchPlaceholder}\n aria-label={t.searchPlaceholder}\n />\n {searchValue && (\n <button\n className=\"sg-tree-search-clear\"\n onClick={() => handleSearchChange('')}\n aria-label={t.clearSearch}\n type=\"button\"\n >\n ×\n </button>\n )}\n </div>\n )\n }\n\n const renderToolbar = () => {\n if (!showToolbar) return null\n return (\n <div className=\"sg-tree-toolbar\">\n <div className=\"sg-tree-toolbar-actions\">\n <button\n className=\"sg-tree-toolbar-btn\"\n onClick={handleExpandAll}\n title={t.expandAllText}\n type=\"button\"\n >\n ⊞\n </button>\n <button\n className=\"sg-tree-toolbar-btn\"\n onClick={handleCollapseAll}\n title={t.collapseAllText}\n type=\"button\"\n >\n ⊟\n </button>\n {checkable && (\n <>\n <span className=\"sg-tree-toolbar-divider\" />\n <button\n className=\"sg-tree-toolbar-btn\"\n onClick={handleCheckAll}\n title={t.checkAllText}\n type=\"button\"\n >\n ☑\n </button>\n <button\n className=\"sg-tree-toolbar-btn\"\n onClick={handleUncheckAll}\n title={t.uncheckAllText}\n type=\"button\"\n >\n ☐\n </button>\n </>\n )}\n </div>\n {toolbarExtra && <div className=\"sg-tree-toolbar-extra\">{toolbarExtra}</div>}\n </div>\n )\n }\n\n const renderNodes = (list: typeof visibleNodes) => list.map((item) => renderNode(item))\n\n if (flatNodes.length === 0) {\n return (\n <div className={wrapperCls} style={style} role=\"tree\">\n {renderSearch()}\n {renderToolbar()}\n <div className=\"sg-tree-empty\">{t.emptyText}</div>\n </div>\n )\n }\n\n if (useVirtual && height) {\n return (\n <div className={wrapperCls} style={style}>\n {renderSearch()}\n {renderToolbar()}\n <div\n ref={containerRef}\n className=\"sg-tree-virtual-container\"\n style={{ height, overflow: 'auto' }}\n onScroll={handleScroll}\n onKeyDown={handleKeyDown}\n role=\"tree\"\n tabIndex={0}\n >\n <div\n style={{\n paddingTop: virtualOffset,\n paddingBottom: virtualBottomPad,\n boxSizing: 'border-box',\n }}\n >\n {renderNodes(visibleNodes)}\n </div>\n </div>\n </div>\n )\n }\n\n return (\n <div\n ref={treeRef}\n className={wrapperCls}\n style={style}\n role=\"tree\"\n tabIndex={0}\n onKeyDown={handleKeyDown}\n >\n {renderSearch()}\n {renderToolbar()}\n {renderNodes(visibleNodes)}\n </div>\n )\n}\n","import { useState, useCallback, useMemo } from 'react'\nimport { createCore, createTree } from '@skygraph/core'\nimport type {\n Core,\n TreeEngine,\n TreeState,\n TreeEngineOptions,\n TreeKey,\n TreeNodeData,\n} from '@skygraph/core'\n\nexport interface UseTreeOptions extends TreeEngineOptions {\n data?: TreeNodeData[]\n}\n\nexport interface UseTreeReturn {\n core: Core\n tree: TreeEngine\n treeState: TreeState\n flatNodes: ReturnType<TreeEngine['getFlatNodes']>\n expand: (key: TreeKey) => void\n collapse: (key: TreeKey) => void\n toggleExpand: (key: TreeKey) => void\n setExpandedKeys: (keys: TreeKey[]) => void\n expandAll: () => void\n collapseAll: () => void\n expandToLevel: (level: number) => void\n check: (key: TreeKey) => void\n uncheck: (key: TreeKey) => void\n toggleCheck: (key: TreeKey) => void\n setCheckedKeys: (keys: TreeKey[]) => void\n checkAll: () => void\n uncheckAll: () => void\n select: (key: TreeKey, multiple?: boolean) => void\n deselect: (key: TreeKey) => void\n setSelectedKeys: (keys: TreeKey[]) => void\n markLoading: (key: TreeKey) => void\n markLoaded: (key: TreeKey) => void\n addChildren: (parentKey: TreeKey, children: TreeNodeData[]) => void\n moveNode: (dragKey: TreeKey, dropKey: TreeKey, position: -1 | 0 | 1) => TreeNodeData[] | null\n filterNodes: (predicate: ((node: TreeNodeData) => boolean) | null) => void\n getNodePath: (key: TreeKey) => TreeKey[]\n refresh: () => void\n}\n\nexport function useTree(options?: UseTreeOptions): UseTreeReturn {\n const [{ core, tree }] = useState(() => {\n const c = createCore()\n const t = createTree(c, options)\n if (options?.data) {\n t.setData(options.data)\n }\n return { core: c, tree: t }\n })\n\n const [treeState, setTreeState] = useState(() => tree.getState())\n const [flatNodes, setFlatNodes] = useState(() => tree.getFlatNodes())\n\n const refresh = useCallback(() => {\n setTreeState(tree.getState())\n setFlatNodes(tree.getFlatNodes())\n }, [tree])\n\n const expand = useCallback((key: TreeKey) => { tree.expand(key); refresh() }, [tree, refresh])\n const collapse = useCallback((key: TreeKey) => { tree.collapse(key); refresh() }, [tree, refresh])\n const toggleExpand = useCallback((key: TreeKey) => { tree.toggleExpand(key); refresh() }, [tree, refresh])\n const setExpandedKeys = useCallback((keys: TreeKey[]) => { tree.setExpandedKeys(keys); refresh() }, [tree, refresh])\n const expandAll = useCallback(() => { tree.expandAll(); refresh() }, [tree, refresh])\n const collapseAll = useCallback(() => { tree.collapseAll(); refresh() }, [tree, refresh])\n\n const check = useCallback((key: TreeKey) => { tree.check(key); refresh() }, [tree, refresh])\n const uncheck = useCallback((key: TreeKey) => { tree.uncheck(key); refresh() }, [tree, refresh])\n const toggleCheck = useCallback((key: TreeKey) => { tree.toggleCheck(key); refresh() }, [tree, refresh])\n const setCheckedKeys = useCallback((keys: TreeKey[]) => { tree.setCheckedKeys(keys); refresh() }, [tree, refresh])\n\n const select = useCallback((key: TreeKey, multiple?: boolean) => { tree.select(key, multiple); refresh() }, [tree, refresh])\n const deselect = useCallback((key: TreeKey) => { tree.deselect(key); refresh() }, [tree, refresh])\n const setSelectedKeys = useCallback((keys: TreeKey[]) => { tree.setSelectedKeys(keys); refresh() }, [tree, refresh])\n\n const markLoading = useCallback((key: TreeKey) => { tree.markLoading(key); refresh() }, [tree, refresh])\n const markLoaded = useCallback((key: TreeKey) => { tree.markLoaded(key); refresh() }, [tree, refresh])\n const addChildren = useCallback((parentKey: TreeKey, children: TreeNodeData[]) => { tree.addChildren(parentKey, children); refresh() }, [tree, refresh])\n\n const moveNode = useCallback((dragKey: TreeKey, dropKey: TreeKey, position: -1 | 0 | 1) => {\n const result = tree.moveNode(dragKey, dropKey, position)\n refresh()\n return result\n }, [tree, refresh])\n\n const filterNodes = useCallback((predicate: ((node: TreeNodeData) => boolean) | null) => {\n tree.filterNodes(predicate)\n refresh()\n }, [tree, refresh])\n\n const expandToLevel = useCallback((level: number) => {\n const flat = tree.getFlatNodes()\n const keys: TreeKey[] = []\n for (const item of flat) {\n if (item.depth < level && !item.isLeaf) {\n keys.push(item.key)\n }\n }\n tree.expandAll()\n const allFlat = tree.getFlatNodes()\n const expandKeys: TreeKey[] = []\n for (const item of allFlat) {\n if (item.depth < level && !item.isLeaf) {\n expandKeys.push(item.key)\n }\n }\n tree.setExpandedKeys(expandKeys)\n refresh()\n }, [tree, refresh])\n\n const checkAll = useCallback(() => {\n const allKeys = tree.getAllKeys()\n tree.setCheckedKeys(allKeys)\n refresh()\n }, [tree, refresh])\n\n const uncheckAll = useCallback(() => {\n tree.setCheckedKeys([])\n refresh()\n }, [tree, refresh])\n\n const getNodePath = useCallback((key: TreeKey): TreeKey[] => {\n const path: TreeKey[] = []\n let current: TreeKey | null = key\n while (current !== null) {\n path.unshift(current)\n current = tree.getParentKey(current)\n }\n return path\n }, [tree])\n\n return useMemo(() => ({\n core, tree, treeState, flatNodes,\n expand, collapse, toggleExpand, setExpandedKeys, expandAll, collapseAll, expandToLevel,\n check, uncheck, toggleCheck, setCheckedKeys, checkAll, uncheckAll,\n select, deselect, setSelectedKeys,\n markLoading, markLoaded, addChildren,\n moveNode, filterNodes, getNodePath, refresh,\n }), [\n core, tree, treeState, flatNodes,\n expand, collapse, toggleExpand, setExpandedKeys, expandAll, collapseAll, expandToLevel,\n check, uncheck, toggleCheck, setCheckedKeys, checkAll, uncheckAll,\n select, deselect, setSelectedKeys,\n markLoading, markLoaded, addChildren,\n moveNode, filterNodes, getNodePath, refresh,\n ])\n}\n","import React, { useState, useRef, useEffect, useCallback } from 'react'\nimport { Checkbox } from '../../ui/Checkbox'\nimport { Spin } from '../../ui/Spin'\nimport type { TreeKey, TreeNodeData, TreeLocale, TreeNodeAction, TreeNodeStatus } from './types'\n\n/** Internal props for a single rendered tree node row. */\ninterface TreeNodeRowProps {\n /** Node data. */\n node: TreeNodeData\n /** Node key. */\n nodeKey: TreeKey\n /** Nesting depth for layout. */\n depth: number\n /** Whether this node is a leaf in the flattened list. */\n isLeaf: boolean\n /** Indentation step in pixels. */\n indentSize: number\n\n /** Expanded state. */\n expanded: boolean\n /** Checked state. */\n checked: boolean\n /** Indeterminate checkbox state. */\n halfChecked: boolean\n /** Selected state. */\n selected: boolean\n /** Async children loading flag. */\n loading: boolean\n /** Row interaction disabled. */\n disabled: boolean\n /** Whether this row has keyboard focus. */\n focused: boolean\n\n /** Checkbox column visible. */\n checkable: boolean\n /** Title click selects the node. */\n selectable: boolean\n /** Vertical guide lines enabled. */\n showLine: boolean\n /** Custom leaf connector when `showLine` is on. */\n showLeafIcon: boolean | React.ReactNode\n /** Leading custom or folder icon. */\n showIcon: boolean\n /** Full row hit target for selection. */\n blockNode: boolean\n /** Directory-style expand-on-select for folders. */\n directory: boolean\n /** Animate expand/collapse affordance. */\n animated: boolean\n\n /** Tree-level default icon. */\n globalIcon?: React.ReactNode | ((props: { expanded: boolean; selected: boolean }) => React.ReactNode)\n /** Per-node icon override. */\n nodeIcon?: React.ReactNode | ((props: { expanded: boolean; selected: boolean }) => React.ReactNode)\n /** Custom expander icon. */\n switcherIcon?: React.ReactNode | ((props: { expanded: boolean; loading: boolean; isLeaf: boolean }) => React.ReactNode)\n\n /** Row is draggable. */\n draggable: boolean\n /** Active drop indicator band on this row. */\n dropPosition: -1 | 0 | 1 | null\n /** Key of the row currently being dragged, if any. */\n dragKey: TreeKey | null\n\n /** Resolved locale strings. */\n t: Required<TreeLocale>\n\n /** Toggle expand. */\n onExpand: (key: TreeKey) => void\n /** Toggle check. */\n onCheck: (key: TreeKey) => void\n /** Toggle select. */\n onSelect: (key: TreeKey) => void\n /** Native drag start. */\n onDragStart: (e: React.DragEvent, key: TreeKey) => void\n /** Native drag over. */\n onDragOver: (e: React.DragEvent, key: TreeKey) => void\n /** Native drag leave. */\n onDragLeave: (e: React.DragEvent, key: TreeKey) => void\n /** Native drag end. */\n onDragEnd: (e: React.DragEvent, key: TreeKey) => void\n /** Native drop. */\n onDrop: (e: React.DragEvent, key: TreeKey) => void\n /** Context menu handler. */\n onRightClick?: (e: React.MouseEvent, node: TreeNodeData) => void\n /** Lazy-load children on expand. */\n onLoadData?: (node: TreeNodeData) => void\n /** Moves roving tabindex / focus highlight. */\n onFocusNode: (key: TreeKey | null) => void\n\n /** Custom title render replacing default text. */\n titleRender?: (node: TreeNodeData, info: { expanded: boolean; selected: boolean; checked: boolean; halfChecked: boolean }) => React.ReactNode\n /** Current filter string for search highlighting. */\n searchValue?: string\n\n /** Inline edit allowed for this row. */\n editable: boolean\n /** Row is currently in edit mode. */\n editing: boolean\n /** Enter edit mode. */\n onEditStart: (key: TreeKey) => void\n /** Commit edited title. */\n onEditConfirm: (key: TreeKey, value: string) => void\n /** Cancel edit mode. */\n onEditCancel: (key: TreeKey) => void\n\n /** Hover action buttons. */\n actions?: TreeNodeAction[]\n\n /** Semantic status styling for the row. */\n status: TreeNodeStatus\n\n /** Whether this node is the last child of its parent (line drawing). */\n lineIsLast: boolean\n /** Ancestor “last child” flags for line drawing. */\n lineParentIsLast: boolean[]\n\n /** Unstyled row. */\n unstyled?: boolean\n /** Extra class from node. */\n nodeClassName?: string\n /** Inline style from node. */\n nodeStyle?: React.CSSProperties\n}\n\n/** Renders one tree row: lines, switcher, checkbox, icon, title, edit field, and actions. */\nexport function TreeNodeRow(props: TreeNodeRowProps) {\n const {\n node, nodeKey, depth, isLeaf, indentSize,\n expanded, checked, halfChecked, selected, loading, disabled, focused,\n checkable, selectable, showLine, showLeafIcon, showIcon, blockNode, directory,\n globalIcon, nodeIcon, switcherIcon,\n draggable, dropPosition, dragKey,\n onExpand, onCheck, onSelect,\n onDragStart, onDragOver, onDragLeave, onDragEnd, onDrop,\n onRightClick, onLoadData, onFocusNode,\n titleRender, searchValue,\n editable, editing, onEditStart, onEditConfirm, onEditCancel,\n actions,\n status,\n lineIsLast, lineParentIsLast,\n unstyled, nodeClassName, nodeStyle,\n } = props\n\n const rowRef = useRef<HTMLDivElement>(null)\n const editInputRef = useRef<HTMLInputElement>(null)\n const [editValue, setEditValue] = useState('')\n\n useEffect(() => {\n if (editing) {\n setEditValue(String(node.title ?? ''))\n setTimeout(() => editInputRef.current?.focus(), 0)\n }\n }, [editing, node.title])\n\n useEffect(() => {\n if (focused && rowRef.current) {\n rowRef.current.scrollIntoView?.({ block: 'nearest' })\n }\n }, [focused])\n\n const handleSwitcherClick = (e: React.MouseEvent) => {\n e.stopPropagation()\n if (isLeaf) return\n if (!expanded && loading) return\n onExpand(nodeKey)\n if (!expanded && !isLeaf && onLoadData) {\n onLoadData(node)\n }\n }\n\n const handleCheckChange = () => {\n if (disabled || node.disableCheckbox) return\n onCheck(nodeKey)\n }\n\n const handleSelect = () => {\n if (disabled || (node.selectable === false)) return\n if (!selectable) return\n onSelect(nodeKey)\n if (directory && !isLeaf) {\n onExpand(nodeKey)\n }\n }\n\n const handleClick = () => {\n onFocusNode(nodeKey)\n handleSelect()\n }\n\n const handleDoubleClick = () => {\n if (editable && !editing) {\n onEditStart(nodeKey)\n }\n }\n\n const handleContextMenu = (e: React.MouseEvent) => {\n if (onRightClick) {\n e.preventDefault()\n onRightClick(e, node)\n }\n }\n\n const handleEditKeyDown = useCallback((e: React.KeyboardEvent) => {\n e.stopPropagation()\n if (e.key === 'Enter') {\n onEditConfirm(nodeKey, editValue)\n } else if (e.key === 'Escape') {\n onEditCancel(nodeKey)\n }\n }, [nodeKey, editValue, onEditConfirm, onEditCancel])\n\n const handleEditBlur = useCallback(() => {\n onEditConfirm(nodeKey, editValue)\n }, [nodeKey, editValue, onEditConfirm])\n\n // Highlighted title with search match\n const renderHighlightedTitle = (title: string) => {\n if (!searchValue) return title\n const index = title.toLowerCase().indexOf(searchValue.toLowerCase())\n if (index === -1) return title\n const before = title.slice(0, index)\n const match = title.slice(index, index + searchValue.length)\n const after = title.slice(index + searchValue.length)\n return (\n <>\n {before}\n <span className=\"sg-tree-highlight\">{match}</span>\n {after}\n </>\n )\n }\n\n // Switcher icon\n const renderSwitcher = () => {\n if (isLeaf) {\n if (showLine) {\n if (showLeafIcon === false) return <span className=\"sg-tree-switcher sg-tree-switcher-noop\" />\n if (showLeafIcon && typeof showLeafIcon !== 'boolean') {\n return <span className=\"sg-tree-switcher sg-tree-switcher-leaf-icon\">{showLeafIcon}</span>\n }\n return <span className=\"sg-tree-switcher sg-tree-switcher-leaf\">─</span>\n }\n return <span className=\"sg-tree-switcher sg-tree-switcher-noop\" />\n }\n\n if (loading) {\n return <span className=\"sg-tree-switcher sg-tree-switcher-loading\"><Spin size=\"small\" /></span>\n }\n\n let iconContent: React.ReactNode\n if (switcherIcon) {\n iconContent = typeof switcherIcon === 'function'\n ? switcherIcon({ expanded, loading, isLeaf })\n : switcherIcon\n } else {\n iconContent = (\n <svg\n className={`sg-tree-switcher-arrow${expanded ? ' sg-tree-switcher-arrow-open' : ''}`}\n width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\"\n >\n <path d=\"M3 2L7 5L3 8\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n )\n }\n\n return (\n <span\n className={`sg-tree-switcher${expanded ? ' sg-tree-switcher-open' : ' sg-tree-switcher-close'}`}\n onClick={handleSwitcherClick}\n >\n {iconContent}\n </span>\n )\n }\n\n // Node icon\n const renderIcon = () => {\n if (!showIcon && !directory) return null\n const iconSource = nodeIcon ?? globalIcon\n let iconContent: React.ReactNode = null\n\n if (iconSource) {\n iconContent = typeof iconSource === 'function'\n ? iconSource({ expanded, selected })\n : iconSource\n } else if (directory) {\n iconContent = expanded ? '📂' : '📁'\n }\n\n if (!iconContent) return null\n return <span className=\"sg-tree-icon\">{iconContent}</span>\n }\n\n // Title content\n const renderTitle = () => {\n if (editing) {\n return (\n <input\n ref={editInputRef}\n className=\"sg-tree-edit-input\"\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n onKeyDown={handleEditKeyDown}\n onBlur={handleEditBlur}\n onClick={(e) => e.stopPropagation()}\n />\n )\n }\n\n if (titleRender) {\n return titleRender(node, { expanded, selected, checked, halfChecked })\n }\n\n const titleText = String(node.title ?? nodeKey)\n return renderHighlightedTitle(titleText)\n }\n\n // Action buttons\n const renderActions = () => {\n if (!actions || actions.length === 0) return null\n const visibleActions = actions.filter((a) => !a.visible || a.visible(node))\n if (visibleActions.length === 0) return null\n\n return (\n <span className=\"sg-tree-actions\" onClick={(e) => e.stopPropagation()}>\n {visibleActions.map((action) => {\n const isDisabled = action.disabled?.(node) ?? false\n return (\n <button\n key={action.key}\n className={`sg-tree-action-btn${action.danger ? ' sg-tree-action-danger' : ''}${isDisabled ? ' sg-tree-action-disabled' : ''}`}\n title={action.title}\n onClick={(e) => {\n e.stopPropagation()\n if (!isDisabled) action.onClick(node, nodeKey)\n }}\n disabled={isDisabled}\n type=\"button\"\n >\n {action.icon ?? action.title ?? action.key}\n </button>\n )\n })}\n </span>\n )\n }\n\n // Connecting lines\n const renderIndentLines = () => {\n if (!showLine) return null\n const lines: React.ReactNode[] = []\n for (let i = 0; i < depth; i++) {\n const isParentLast = lineParentIsLast[i] ?? false\n lines.push(\n <span\n key={i}\n className={`sg-tree-indent-line${isParentLast ? ' sg-tree-indent-line-hidden' : ''}`}\n style={{ left: i * indentSize + indentSize / 2 }}\n />\n )\n }\n if (depth > 0) {\n lines.push(\n <span\n key=\"branch\"\n className={`sg-tree-indent-branch${lineIsLast ? ' sg-tree-indent-branch-last' : ''}`}\n style={{ left: (depth - 1) * indentSize + indentSize / 2 }}\n />\n )\n }\n return <>{lines}</>\n }\n\n // Status dot\n const renderStatus = () => {\n if (status === 'default') return null\n return <span className={`sg-tree-status sg-tree-status-${status}`} />\n }\n\n if (unstyled) {\n return (\n <div\n ref={rowRef}\n role=\"treeitem\"\n aria-expanded={isLeaf ? undefined : expanded}\n aria-selected={selected}\n aria-checked={checkable ? checked : undefined}\n aria-level={depth + 1}\n data-key={nodeKey}\n >\n {checkable && (\n <Checkbox\n checked={checked}\n indeterminate={halfChecked}\n disabled={disabled || node.disableCheckbox}\n onChange={handleCheckChange}\n unstyled\n />\n )}\n <span onClick={handleClick}>{renderTitle()}</span>\n </div>\n )\n }\n\n const isDragging = dragKey === nodeKey\n\n const rowCls = [\n 'sg-tree-node',\n selected ? 'sg-tree-node-selected' : '',\n disabled ? 'sg-tree-node-disabled' : '',\n isLeaf ? 'sg-tree-node-leaf' : '',\n expanded ? 'sg-tree-node-expanded' : '',\n draggable ? 'sg-tree-node-draggable' : '',\n isDragging ? 'sg-tree-node-dragging' : '',\n dropPosition === 0 ? 'sg-tree-node-drop-inner' : '',\n dropPosition === -1 ? 'sg-tree-node-drop-before' : '',\n dropPosition === 1 ? 'sg-tree-node-drop-after' : '',\n showLine ? 'sg-tree-node-show-line' : '',\n blockNode ? 'sg-tree-node-block' : '',\n directory ? 'sg-tree-node-directory' : '',\n focused ? 'sg-tree-node-focused' : '',\n editing ? 'sg-tree-node-editing' : '',\n status !== 'default' ? `sg-tree-node-status-${status}` : '',\n nodeClassName,\n ].filter(Boolean).join(' ')\n\n return (\n <div\n ref={rowRef}\n className={rowCls}\n style={{ ...nodeStyle, paddingLeft: depth * indentSize }}\n role=\"treeitem\"\n aria-expanded={isLeaf ? undefined : expanded}\n aria-selected={selected}\n aria-checked={checkable ? checked : undefined}\n aria-level={depth + 1}\n data-key={nodeKey}\n draggable={draggable && !editing}\n onDragStart={draggable ? (e) => onDragStart(e, nodeKey) : undefined}\n onDragOver={draggable ? (e) => { e.preventDefault(); onDragOver(e, nodeKey) } : undefined}\n onDragLeave={draggable ? (e) => onDragLeave(e, nodeKey) : undefined}\n onDragEnd={draggable ? (e) => onDragEnd(e, nodeKey) : undefined}\n onDrop={draggable ? (e) => { e.preventDefault(); onDrop(e, nodeKey) } : undefined}\n onContextMenu={handleContextMenu}\n onClick={handleClick}\n onDoubleClick={editable ? handleDoubleClick : undefined}\n >\n {renderIndentLines()}\n {renderSwitcher()}\n\n {checkable && node.checkable !== false && (\n <Checkbox\n checked={checked}\n indeterminate={halfChecked}\n disabled={disabled || node.disableCheckbox}\n onChange={handleCheckChange}\n />\n )}\n\n {renderIcon()}\n {renderStatus()}\n\n <span\n className={`sg-tree-title${selectable && !editing ? ' sg-tree-title-selectable' : ''}`}\n >\n {renderTitle()}\n </span>\n\n {renderActions()}\n </div>\n )\n}\n","import type React from 'react'\nimport type { TreeKey, TreeNodeData, TreeFieldNames } from '@skygraph/core'\n\n/** Re-exports core tree data types. */\nexport type { TreeKey, TreeNodeData, TreeFieldNames }\n\n/** Payload for `onCheck` describing the toggle and affected nodes. */\nexport interface CheckInfo {\n /** Whether the toggled node ended checked. */\n checked: boolean\n /** Node whose checkbox was toggled. */\n node: TreeNodeData\n /** All fully checked nodes after the update. */\n checkedNodes: TreeNodeData[]\n /** Keys in indeterminate half-checked state. */\n halfCheckedKeys: TreeKey[]\n}\n\n/** Payload for `onSelect` after a selection change. */\nexport interface SelectInfo {\n /** Whether the node ended selected. */\n selected: boolean\n /** Node that was clicked for selection. */\n node: TreeNodeData\n /** All selected nodes after the update. */\n selectedNodes: TreeNodeData[]\n}\n\n/** Payload for `onExpand` after an expand/collapse. */\nexport interface ExpandInfo {\n /** Whether the node ended expanded. */\n expanded: boolean\n /** Node whose expander was toggled. */\n node: TreeNodeData\n}\n\n/** Drag lifecycle event payload with DOM event and node. */\nexport interface DragInfo {\n /** Browser drag event. */\n event: React.DragEvent\n /** Associated tree node. */\n node: TreeNodeData\n}\n\n/** Drop completion payload including dragged node and position. */\nexport interface DropInfo {\n /** Browser drop event. */\n event: React.DragEvent\n /** Drop target node. */\n node: TreeNodeData\n /** Node that was dragged. */\n dragNode: TreeNodeData\n /** Insert position relative to the target. */\n dropPosition: -1 | 0 | 1\n}\n\n/** Payload when an inline edit is committed (if editing is used). */\nexport interface EditInfo {\n /** Edited node key. */\n key: TreeKey\n /** Edited node. */\n node: TreeNodeData\n /** New title text. */\n value: string\n /** Previous title text. */\n oldValue: string\n}\n\n/** Visual status hint for a node row. */\nexport type TreeNodeStatus = 'default' | 'success' | 'warning' | 'error' | 'info'\n\n/** Declarative action button on a tree node row. */\nexport interface TreeNodeAction {\n /** Action identifier. */\n key: string\n /** Button icon. */\n icon?: React.ReactNode\n /** Tooltip or aria label text. */\n title?: string\n /** Click handler receiving node and key. */\n onClick: (node: TreeNodeData, key: TreeKey) => void\n /** Hides the action for nodes where this returns false. */\n visible?: (node: TreeNodeData) => boolean\n /** Disables the action per node. */\n disabled?: (node: TreeNodeData) => boolean\n /** Destructive styling. */\n danger?: boolean\n}\n\n/** Localizable strings for built-in tree UI. */\nexport interface TreeLocale {\n /** Empty tree placeholder. */\n emptyText?: React.ReactNode\n /** Async loading label. */\n loadingText?: string\n /** Search field placeholder. */\n searchPlaceholder?: string\n /** Toolbar control to expand all nodes. */\n expandAllText?: string\n /** Toolbar control to collapse all nodes. */\n collapseAllText?: string\n /** Toolbar control to check all checkboxes. */\n checkAllText?: string\n /** Toolbar control to clear all checks. */\n uncheckAllText?: string\n /** Accessible label for the clear-search (×) button. */\n clearSearch?: string\n}\n\n/** Default English strings for `Tree`. */\nexport const DEFAULT_TREE_LOCALE: Required<TreeLocale> = {\n emptyText: 'No data',\n loadingText: 'Loading...',\n searchPlaceholder: 'Search...',\n expandAllText: 'Expand All',\n collapseAllText: 'Collapse All',\n checkAllText: 'Check All',\n uncheckAllText: 'Uncheck All',\n clearSearch: 'Clear search',\n}\n\n/** Default indent between tree levels in pixels. */\nexport const DEFAULT_INDENT = 24\n/** Default node row height used for virtual scroll estimates. */\nexport const NODE_HEIGHT = 28\n\n/** Props for the `Tree` component. */\nexport interface TreeProps {\n /** Hierarchical data with keys and optional children. */\n treeData: TreeNodeData[]\n /** Renames `title`, `key`, `children`, and other field accessors. */\n fieldNames?: TreeFieldNames\n\n /** Shows checkboxes on nodes. @default false */\n checkable?: boolean\n /** When true, parent and child checks are independent. @default false */\n checkStrictly?: boolean\n /** Controlled checked keys. */\n checkedKeys?: TreeKey[]\n /** Initial checked keys in uncontrolled mode. */\n defaultCheckedKeys?: TreeKey[]\n /** Fires after check state changes. */\n onCheck?: (checkedKeys: TreeKey[], info: CheckInfo) => void\n\n /** Allows clicking titles to select nodes. @default true */\n selectable?: boolean\n /** Allows multiple selected nodes. @default false */\n multiple?: boolean\n /** Controlled selected keys. */\n selectedKeys?: TreeKey[]\n /** Initial selected keys in uncontrolled mode. */\n defaultSelectedKeys?: TreeKey[]\n /** Fires after selection changes. */\n onSelect?: (selectedKeys: TreeKey[], info: SelectInfo) => void\n\n /** Controlled expanded keys. */\n expandedKeys?: TreeKey[]\n /** Initial expanded keys in uncontrolled mode. */\n defaultExpandedKeys?: TreeKey[]\n /** Expands every parent on first render when uncontrolled. @default false */\n defaultExpandAll?: boolean\n /** Expands ancestors of the focused or matched node when filtering. @default false */\n autoExpandParent?: boolean\n /** Fires after expand/collapse. */\n onExpand?: (expandedKeys: TreeKey[], info: ExpandInfo) => void\n\n /** Enables drag handles per node or per node predicate. @default false */\n draggable?: boolean | ((node: TreeNodeData) => boolean)\n /** Validates whether a drop is allowed. */\n allowDrop?: (info: {\n dragNode: TreeNodeData\n dropNode: TreeNodeData\n dropPosition: -1 | 0 | 1\n }) => boolean\n /** Drag start callback. */\n onDragStart?: (info: DragInfo) => void\n /** Drag enter callback. */\n onDragEnter?: (info: DragInfo) => void\n /** Drag over callback. */\n onDragOver?: (info: DragInfo) => void\n /** Drag leave callback. */\n onDragLeave?: (info: DragInfo) => void\n /** Drag end callback. */\n onDragEnd?: (info: DragInfo) => void\n /** Drop callback after a successful internal move. */\n onDrop?: (info: DropInfo) => void\n\n /** Loads children asynchronously; return promise resolves when data is ready. */\n loadData?: (node: TreeNodeData) => Promise<void>\n /** Keys whose children have finished loading. */\n loadedKeys?: TreeKey[]\n\n /** Renders guide lines between levels or configures leaf icons. @default false */\n showLine?: boolean | { showLeafIcon?: boolean | React.ReactNode }\n /** Shows a leading icon column. @default false */\n showIcon?: boolean\n /** Default node icon render or element. */\n icon?: React.ReactNode | ((props: { expanded: boolean; selected: boolean }) => React.ReactNode)\n /** Custom expand/collapse control. */\n switcherIcon?:\n | React.ReactNode\n | ((props: { expanded: boolean; loading: boolean; isLeaf: boolean }) => React.ReactNode)\n /** Makes the whole row clickable for selection. @default false */\n blockNode?: boolean\n /** Fixed viewport height enabling internal virtual scroll. */\n height?: number\n /** Uses windowed rendering when `height` is set and the list is large. @default true */\n virtual?: boolean\n /** Disables all interactions. @default false */\n disabled?: boolean\n /** Horizontal indent per depth level in pixels. @default 24 */\n indentSize?: number\n\n /** Directory-style selection expands folders on click. @default false */\n directory?: boolean\n\n /** Context menu handler on node rows. */\n onRightClick?: (info: { event: React.MouseEvent; node: TreeNodeData }) => void\n\n /** Shows the toolbar search field. @default false */\n showSearch?: boolean\n /** Controlled filter text. */\n searchValue?: string\n /** Initial filter text when uncontrolled. @default '' */\n defaultSearchValue?: string\n /** Emits filter text changes. */\n onSearch?: (value: string) => void\n /** Predicate to include nodes while searching. */\n filterTreeNode?: (node: TreeNodeData, searchValue: string) => boolean\n /** Highlights matched text in titles. @default true */\n highlightSearch?: boolean\n\n /** Enables built-in keyboard navigation helpers. @default true */\n keyboard?: boolean\n\n /** Enables inline editing of titles per node or predicate. @default false */\n editable?: boolean | ((node: TreeNodeData) => boolean)\n /** Commit handler for inline edits. */\n onEdit?: (info: EditInfo) => void\n /** Cancel handler for inline edits. */\n onEditCancel?: (key: TreeKey) => void\n\n /** Custom title area render. */\n titleRender?: (\n node: TreeNodeData,\n info: { expanded: boolean; selected: boolean; checked: boolean; halfChecked: boolean },\n ) => React.ReactNode\n\n /** Inline action buttons on node rows. */\n actions?: TreeNodeAction[]\n\n /** Shows toolbar with expand/collapse/check-all controls. @default false */\n showToolbar?: boolean\n /** Extra toolbar nodes after built-ins. */\n toolbarExtra?: React.ReactNode\n\n /** Enables expand/collapse animations. @default true */\n animated?: boolean\n\n /** Focuses a node on mount when supported. @default false */\n autoFocus?: boolean\n /** Controlled focused node key. */\n focusedKey?: TreeKey\n /** Fires when focus moves to a node. */\n onFocus?: (key: TreeKey) => void\n\n /** Scrolls the given key into view when it changes. */\n scrollToKey?: TreeKey\n\n /** Maps a node to a status color variant. */\n nodeStatus?: (node: TreeNodeData) => TreeNodeStatus\n\n /** Overrides default locale strings. */\n locale?: TreeLocale\n\n /** Root wrapper class name. */\n className?: string\n /** Root wrapper style. */\n style?: React.CSSProperties\n /** Renders semantic tree without Skygraph styles. */\n unstyled?: boolean\n}\n","import React, { useState, useEffect, useRef, useCallback, useMemo } from 'react'\nimport { Tree } from '../Tree'\nimport { useConfig } from '../../ConfigProvider'\nimport type { TreeSelectProps, TreeKey, TreeNodeData } from './types'\n\nfunction toArray(val: TreeKey | TreeKey[] | undefined): TreeKey[] {\n if (val === undefined) return []\n return Array.isArray(val) ? val : [val]\n}\n\nfunction collectAllKeys(nodes: TreeNodeData[]): TreeKey[] {\n const keys: TreeKey[] = []\n const walk = (list: TreeNodeData[]) => {\n for (const n of list) {\n keys.push(n.key)\n if (n.children) walk(n.children)\n }\n }\n walk(nodes)\n return keys\n}\n\nfunction findNode(nodes: TreeNodeData[], key: TreeKey): TreeNodeData | undefined {\n for (const n of nodes) {\n if (n.key === key) return n\n if (n.children) {\n const found = findNode(n.children, key)\n if (found) return found\n }\n }\n return undefined\n}\n\nfunction getNodeLabel(node: TreeNodeData | undefined): React.ReactNode {\n if (!node) return ''\n return node.title ?? String(node.key)\n}\n\nfunction filterTreeKeepMatches(\n nodes: TreeNodeData[],\n predicate: (node: TreeNodeData) => boolean,\n): TreeNodeData[] {\n const result: TreeNodeData[] = []\n for (const node of nodes) {\n const childResult = node.children ? filterTreeKeepMatches(node.children, predicate) : []\n if (predicate(node) || childResult.length > 0) {\n result.push({\n ...node,\n children: childResult.length > 0 ? childResult : undefined,\n })\n }\n }\n return result\n}\n\nfunction getParentKeys(nodes: TreeNodeData[], targetKey: TreeKey): TreeKey[] {\n const parents: TreeKey[] = []\n const walk = (list: TreeNodeData[], path: TreeKey[]): boolean => {\n for (const n of list) {\n if (n.key === targetKey) {\n parents.push(...path)\n return true\n }\n if (n.children && walk(n.children, [...path, n.key])) return true\n }\n return false\n }\n walk(nodes, [])\n return parents\n}\n\nfunction applyStrategy(\n checkedKeys: TreeKey[],\n treeData: TreeNodeData[],\n strategy: 'SHOW_ALL' | 'SHOW_PARENT' | 'SHOW_CHILD',\n): TreeKey[] {\n if (strategy === 'SHOW_ALL') return checkedKeys\n\n const checkedSet = new Set(checkedKeys)\n\n if (strategy === 'SHOW_CHILD') {\n return checkedKeys.filter((key) => {\n const node = findNode(treeData, key)\n return !node?.children || node.children.length === 0\n })\n }\n\n if (strategy === 'SHOW_PARENT') {\n return checkedKeys.filter((key) => {\n const parentKeys = getParentKeys(treeData, key)\n return !parentKeys.some((pk) => checkedSet.has(pk))\n })\n }\n\n return checkedKeys\n}\n\n/**\n * Dropdown that embeds `Tree` for single or multiple selection, optional checkboxes, and search.\n * Manages open state, filtering, and tag display for multi-value modes.\n */\nexport function TreeSelect(props: TreeSelectProps) {\n const {\n treeData,\n value: controlledValue,\n defaultValue,\n onChange,\n fieldNames,\n multiple = false,\n treeCheckable = false,\n treeCheckStrictly = false,\n treeDefaultExpandAll = false,\n treeDefaultExpandedKeys,\n showSearch = false,\n filterTreeNode,\n placeholder = 'Please select',\n allowClear = false,\n disabled = false,\n size = 'middle',\n maxTagCount,\n dropdownStyle,\n treeLine = false,\n showCheckedStrategy = 'SHOW_ALL',\n onSearch,\n className,\n style,\n unstyled,\n } = props\n\n const treeSelectLocale = useConfig().locale?.treeSelect\n const searchPlaceholder = treeSelectLocale?.searchPlaceholder ?? 'Search...'\n const noMatchesText = treeSelectLocale?.noMatches ?? 'No matches'\n\n const isMultiple = multiple || treeCheckable\n\n const [internalValue, setInternalValue] = useState<TreeKey[]>(() =>\n toArray(controlledValue ?? defaultValue),\n )\n const [open, setOpen] = useState(false)\n const [searchValue, setSearchValue] = useState('')\n const wrapperRef = useRef<HTMLDivElement>(null)\n const searchRef = useRef<HTMLInputElement>(null)\n\n const currentValue = useMemo(\n () => toArray(controlledValue ?? internalValue),\n [controlledValue, internalValue],\n )\n\n useEffect(() => {\n if (controlledValue !== undefined) {\n setInternalValue(toArray(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 && showSearch && searchRef.current) {\n searchRef.current.focus()\n }\n }, [open, showSearch])\n\n const defaultFilter = useCallback((input: string, node: TreeNodeData): boolean => {\n const title = String(node.title ?? node.key).toLowerCase()\n return title.includes(input.toLowerCase())\n }, [])\n\n const filterFn = filterTreeNode ?? defaultFilter\n\n const filteredTreeData = useMemo(() => {\n if (!searchValue) return treeData\n return filterTreeKeepMatches(treeData, (node) => filterFn(searchValue, node))\n }, [treeData, searchValue, filterFn])\n\n const filteredExpandedKeys = useMemo(() => {\n if (!searchValue) return undefined\n return collectAllKeys(filteredTreeData)\n }, [searchValue, filteredTreeData])\n\n const fireChange = useCallback(\n (keys: TreeKey[], triggerNode: TreeNodeData) => {\n setInternalValue(keys)\n const labels = keys.map((k) => getNodeLabel(findNode(treeData, k)))\n if (onChange) {\n const result = isMultiple ? keys : keys[0]\n onChange(result as TreeKey & TreeKey[], labels, { triggerNode })\n }\n },\n [treeData, onChange, isMultiple],\n )\n\n const handleTreeSelect = useCallback(\n (\n _selectedKeys: TreeKey[],\n info: { selected: boolean; node: TreeNodeData; selectedNodes: TreeNodeData[] },\n ) => {\n if (treeCheckable) return\n const node = info.node\n if (isMultiple) {\n const newKeys = info.selected\n ? [...currentValue, node.key]\n : currentValue.filter((k) => k !== node.key)\n fireChange(newKeys, node)\n } else {\n fireChange([node.key], node)\n setOpen(false)\n setSearchValue('')\n }\n },\n [treeCheckable, isMultiple, currentValue, fireChange],\n )\n\n const handleTreeCheck = useCallback(\n (\n checkedKeys: TreeKey[],\n info: {\n checked: boolean\n node: TreeNodeData\n checkedNodes: TreeNodeData[]\n halfCheckedKeys: TreeKey[]\n },\n ) => {\n const displayed = applyStrategy(checkedKeys, treeData, showCheckedStrategy)\n fireChange(displayed, info.node)\n },\n [treeData, showCheckedStrategy, fireChange],\n )\n\n const handleRemoveTag = useCallback(\n (key: TreeKey, e: React.MouseEvent) => {\n e.stopPropagation()\n if (disabled) return\n const node = findNode(treeData, key) ?? ({ key } as TreeNodeData)\n const newKeys = currentValue.filter((k) => k !== key)\n fireChange(newKeys, node)\n },\n [disabled, treeData, currentValue, fireChange],\n )\n\n const handleClear = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation()\n if (disabled) return\n const node = treeData[0] ?? ({ key: '' } as TreeNodeData)\n fireChange([], node)\n setSearchValue('')\n },\n [disabled, treeData, fireChange],\n )\n\n const handleSearchChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value\n setSearchValue(val)\n onSearch?.(val)\n },\n [onSearch],\n )\n\n const handleTriggerClick = useCallback(() => {\n if (disabled) return\n setOpen((prev) => !prev)\n }, [disabled])\n\n const displayedValues = useMemo(() => {\n if (!isMultiple) return currentValue\n return applyStrategy(currentValue, treeData, showCheckedStrategy)\n }, [isMultiple, currentValue, treeData, showCheckedStrategy])\n\n const treeCheckedKeys = useMemo(() => {\n if (!treeCheckable) return undefined\n return currentValue\n }, [treeCheckable, currentValue])\n\n const treeSelectedKeys = useMemo(() => {\n if (treeCheckable) return undefined\n return currentValue\n }, [treeCheckable, currentValue])\n\n // Unstyled render\n if (unstyled) {\n return (\n <div ref={wrapperRef} className={className} style={style}>\n <div onClick={handleTriggerClick}>\n {displayedValues.length === 0 && <span>{placeholder}</span>}\n {!isMultiple && displayedValues.length > 0 && (\n <span>{getNodeLabel(findNode(treeData, displayedValues[0]))}</span>\n )}\n {isMultiple &&\n displayedValues.map((key) => (\n <span key={String(key)}>\n {getNodeLabel(findNode(treeData, key))}\n <span onClick={(e) => handleRemoveTag(key, e)}>&times;</span>\n </span>\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 <Tree\n treeData={filteredTreeData}\n fieldNames={fieldNames}\n checkable={treeCheckable}\n checkStrictly={treeCheckStrictly}\n checkedKeys={treeCheckedKeys}\n selectedKeys={treeSelectedKeys}\n multiple={isMultiple}\n defaultExpandAll={treeDefaultExpandAll}\n defaultExpandedKeys={treeDefaultExpandedKeys}\n expandedKeys={filteredExpandedKeys}\n showLine={treeLine}\n onSelect={handleTreeSelect}\n onCheck={handleTreeCheck}\n unstyled\n />\n </div>\n )}\n </div>\n )\n }\n\n // Styled render\n const wrapperCls = [\n 'sg-treeselect',\n `sg-treeselect-${size}`,\n open ? 'sg-treeselect-open' : '',\n disabled ? 'sg-treeselect-disabled' : '',\n isMultiple ? 'sg-treeselect-multiple' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n const visibleTags =\n maxTagCount !== undefined && isMultiple\n ? displayedValues.slice(0, maxTagCount)\n : displayedValues\n\n const hiddenCount =\n maxTagCount !== undefined && isMultiple ? Math.max(0, displayedValues.length - maxTagCount) : 0\n\n return (\n <div className={wrapperCls} style={style} ref={wrapperRef}>\n <div className=\"sg-treeselect-selector\" onClick={handleTriggerClick}>\n <div className=\"sg-treeselect-selection-wrap\">\n {displayedValues.length === 0 && !searchValue && (\n <span className=\"sg-treeselect-placeholder\">{placeholder}</span>\n )}\n\n {!isMultiple && displayedValues.length > 0 && !searchValue && (\n <span className=\"sg-treeselect-selection-item\">\n {getNodeLabel(findNode(treeData, displayedValues[0]))}\n </span>\n )}\n\n {isMultiple &&\n visibleTags.map((key) => (\n <span key={String(key)} className=\"sg-treeselect-tag\">\n <span className=\"sg-treeselect-tag-label\">\n {getNodeLabel(findNode(treeData, key))}\n </span>\n <span className=\"sg-treeselect-tag-close\" onClick={(e) => handleRemoveTag(key, e)}>\n &times;\n </span>\n </span>\n ))}\n\n {hiddenCount > 0 && (\n <span className=\"sg-treeselect-tag sg-treeselect-tag-rest\">+{hiddenCount}...</span>\n )}\n\n {showSearch && open && (\n <input\n ref={searchRef}\n className=\"sg-treeselect-search-input\"\n value={searchValue}\n onChange={handleSearchChange}\n placeholder={displayedValues.length === 0 ? '' : ''}\n />\n )}\n </div>\n\n <div className=\"sg-treeselect-actions\">\n {allowClear && displayedValues.length > 0 && (\n <span className=\"sg-treeselect-clear\" onClick={handleClear}>\n &times;\n </span>\n )}\n <span className=\"sg-treeselect-arrow\">{open ? '\\u25B2' : '\\u25BC'}</span>\n </div>\n </div>\n\n {open && (\n <div className=\"sg-treeselect-dropdown\" style={dropdownStyle}>\n {filteredTreeData.length === 0 ? (\n <div className=\"sg-treeselect-empty\">{noMatchesText}</div>\n ) : (\n <Tree\n treeData={filteredTreeData}\n fieldNames={fieldNames}\n checkable={treeCheckable}\n checkStrictly={treeCheckStrictly}\n checkedKeys={treeCheckedKeys}\n selectedKeys={treeSelectedKeys}\n multiple={isMultiple}\n defaultExpandAll={treeDefaultExpandAll}\n defaultExpandedKeys={treeDefaultExpandedKeys}\n expandedKeys={filteredExpandedKeys}\n showLine={treeLine}\n onSelect={handleTreeSelect}\n onCheck={handleTreeCheck}\n />\n )}\n </div>\n )}\n </div>\n )\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)}>&times;</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 &times;\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 &times;\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}>&laquo;</button>\n {currentMode === 'month' && <button onClick={handlePrevMonth}>&lsaquo;</button>}\n <span>\n {monthNames[panelMonth]} {panelYear}\n </span>\n {currentMode === 'month' && <button onClick={handleNextMonth}>&rsaquo;</button>}\n <button onClick={handleNextYear}>&raquo;</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 &laquo;\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 &lsaquo;\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 &rsaquo;\n </button>\n )}\n <button\n className=\"sg-calendar-nav-btn\"\n onClick={handleNextYear}\n title={nextYearLabel}\n aria-label={nextYearLabel}\n >\n &raquo;\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 &times;\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(\n value ?? defaultValue\n )\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 <span className={unstyled ? '' : 'sg-radio-label'}>{opt.label}</span>\n {loading && currentValue === opt.value && (\n <Spin size=\"small\" unstyled={unstyled} />\n )}\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 &laquo;\n </button>\n <button\n className={unstyled ? '' : 'sg-dp-nav-btn'}\n onClick={() => onMonthChange(-1)}\n title={prevMonthLabel}\n aria-label={prevMonthLabel}\n >\n &lsaquo;\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 &rsaquo;\n </button>\n <button\n className={unstyled ? '' : 'sg-dp-nav-btn'}\n onClick={() => onYearChange(1)}\n title={nextYearLabel}\n aria-label={nextYearLabel}\n >\n &raquo;\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 &laquo;\n </button>\n <span className={unstyled ? '' : 'sg-dp-panel-title'}>{viewYear}</span>\n <button className={unstyled ? '' : 'sg-dp-nav-btn'} onClick={() => onYearChange(1)}>\n &raquo;\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 &laquo;\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 &raquo;\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 &times;\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 &times;\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}>&times;</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}>&times;</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 &times;\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 { useState, useCallback, useMemo, useRef } from 'react'\nimport type { FormEngine } from '@skygraph/core'\n\nexport interface UseFieldArrayReturn {\n fields: { key: string; index: number }[]\n append: (defaultValue?: unknown) => void\n remove: (index: number) => void\n move: (from: number, to: number) => void\n replace: (values: unknown[]) => void\n}\n\nexport function useFieldArray(form: FormEngine, name: string): UseFieldArrayReturn {\n const counterRef = useRef(0)\n const genKey = useCallback(() => `fa_${name}_${++counterRef.current}`, [name])\n\n const [keys, setKeys] = useState<string[]>(() => {\n const list = form.getListValue(name)\n return list.map(() => genKey())\n })\n\n const fields = useMemo(\n () => keys.map((key, index) => ({ key, index })),\n [keys],\n )\n\n const append = useCallback(\n (defaultValue?: unknown) => {\n form.listAdd(name, defaultValue)\n setKeys((prev) => [...prev, genKey()])\n },\n [form, name, genKey],\n )\n\n const remove = useCallback(\n (index: number) => {\n form.listRemove(name, index)\n setKeys((prev) => prev.filter((_, i) => i !== index))\n },\n [form, name],\n )\n\n const move = useCallback(\n (from: number, to: number) => {\n form.listMove(name, from, to)\n setKeys((prev) => {\n const next = [...prev]\n const [item] = next.splice(from, 1)\n next.splice(to, 0, item)\n return next\n })\n },\n [form, name],\n )\n\n const replace = useCallback(\n (values: unknown[]) => {\n const currentLen = form.getListValue(name).length\n for (let i = currentLen - 1; i >= 0; i--) {\n form.listRemove(name, i)\n }\n const newKeys: string[] = []\n for (const v of values) {\n form.listAdd(name, v)\n newKeys.push(genKey())\n }\n setKeys(newKeys)\n },\n [form, name, genKey],\n )\n\n return useMemo(\n () => ({ fields, append, remove, move, replace }),\n [fields, append, remove, move, replace],\n )\n}\n","import React, { useMemo } from 'react'\nimport { useFormContext } from '../FormContext'\nimport { useConfig } from '../../ConfigProvider'\nimport type { BaseComponentProps, InteractiveProps } from '../../../types'\n\n/** Supported input kinds for form field rendering and inference. */\nexport type FieldType =\n | 'string'\n | 'number'\n | 'boolean'\n | 'email'\n | 'url'\n | 'date'\n | 'time'\n | 'textarea'\n | 'select'\n | 'multiselect'\n | 'password'\n | 'color'\n | 'slider'\n | 'rate'\n | 'file'\n | 'switch'\n | 'radio'\n\n/** Single choice label/value pair for select, multiselect, or radio fields. */\nexport interface AutoFieldOption {\n /** Display text for the option. */\n label: string\n /** Stored value when the option is selected. */\n value: string | number\n}\n\n/** Props for a form field that picks its control from field name, value shape, and `type`. */\nexport interface AutoFieldProps extends BaseComponentProps, InteractiveProps {\n /** Form field key used with `useFormContext`. */\n name: string\n /** Caption shown above the control (or inline for checkbox/switch). */\n label?: React.ReactNode\n /** Forces a control type; otherwise inferred from value and `options`. */\n type?: FieldType\n /** Options for select, multiselect, or radio types. */\n options?: AutoFieldOption[]\n /** Placeholder or empty-option label where applicable. */\n placeholder?: string\n /** Minimum numeric or range value. */\n min?: number\n /** Maximum numeric, range, or star rating count. */\n max?: number\n /** Step for number inputs and range sliders. */\n step?: number\n /** `accept` attribute for file inputs. */\n accept?: string\n /** Allows multiple files when type is `file`. */\n multiple?: boolean\n}\n\n/**\n * Renders an appropriate input for a form field based on `type`, options, and current value.\n * Reads and writes through `FormContext` using `name`.\n */\nexport function AutoField(props: AutoFieldProps) {\n const {\n name,\n label,\n type: forcedType,\n options,\n placeholder,\n disabled: disabledProp,\n className,\n style,\n min,\n max,\n step,\n accept,\n multiple,\n } = props\n const config = useConfig()\n const disabled = disabledProp ?? config.disabled\n const { form } = useFormContext()\n\n const value = form.getValue(name)\n const meta = form.getFieldState(name)\n\n const inferredType = useMemo((): FieldType => {\n if (forcedType) return forcedType\n if (options && options.length > 0) return 'select'\n if (typeof value === 'boolean') return 'boolean'\n if (typeof value === 'number') return 'number'\n if (typeof value === 'string') {\n if (value.includes('@')) return 'email'\n if (value.startsWith('http')) return 'url'\n }\n return 'string'\n }, [forcedType, options, value])\n\n const handleChange = (newValue: unknown) => {\n form.setValue(name, newValue)\n }\n\n const errorId = `${name}-error`\n const hasErrors = meta.errors.length > 0\n const hasWarnings = meta.warnings.length > 0\n\n const wrapperStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n ...style,\n }\n\n const inputStyle: React.CSSProperties = {\n padding: '6px 12px',\n border: `1px solid ${hasErrors ? 'var(--sg-error, #ff4d4f)' : hasWarnings ? 'var(--sg-warning, #faad14)' : 'var(--sg-border, #d9d9d9)'}`,\n borderRadius: 'var(--sg-radius, 6px)',\n fontSize: 14,\n outline: 'none',\n background: disabled ? 'var(--sg-bg-disabled, #f5f5f5)' : 'var(--sg-bg, #fff)',\n }\n\n function renderInput() {\n switch (inferredType) {\n case 'boolean':\n case 'switch':\n return (\n <label style={{ display: 'flex', alignItems: 'center', gap: 8, cursor: 'pointer' }}>\n <input\n type=\"checkbox\"\n checked={!!value}\n onChange={(e) => handleChange(e.target.checked)}\n disabled={disabled}\n role={inferredType === 'switch' ? 'switch' : undefined}\n />\n {label}\n </label>\n )\n\n case 'number':\n return (\n <input\n type=\"number\"\n value={value == null ? '' : String(value)}\n onChange={(e) => handleChange(e.target.value === '' ? null : Number(e.target.value))}\n onBlur={() => form.onFieldBlur(name)}\n placeholder={placeholder}\n disabled={disabled}\n min={min}\n max={max}\n step={step}\n style={inputStyle}\n aria-invalid={hasErrors}\n aria-describedby={hasErrors ? errorId : undefined}\n />\n )\n\n case 'textarea':\n return (\n <textarea\n value={value == null ? '' : String(value)}\n onChange={(e) => handleChange(e.target.value)}\n onBlur={() => form.onFieldBlur(name)}\n placeholder={placeholder}\n disabled={disabled}\n style={{ ...inputStyle, minHeight: 80, resize: 'vertical' }}\n aria-invalid={hasErrors}\n aria-describedby={hasErrors ? errorId : undefined}\n />\n )\n\n case 'select':\n return (\n <select\n value={value == null ? '' : String(value)}\n onChange={(e) => handleChange(e.target.value)}\n disabled={disabled}\n style={inputStyle}\n aria-invalid={hasErrors}\n aria-describedby={hasErrors ? errorId : undefined}\n >\n <option value=\"\">{placeholder ?? '-- Select --'}</option>\n {options?.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n )\n\n case 'multiselect':\n return (\n <select\n multiple\n value={Array.isArray(value) ? value.map(String) : []}\n onChange={(e) => {\n const selected = Array.from(e.target.selectedOptions, (o) => o.value)\n handleChange(selected)\n }}\n disabled={disabled}\n style={{ ...inputStyle, minHeight: 80 }}\n aria-invalid={hasErrors}\n aria-describedby={hasErrors ? errorId : undefined}\n >\n {options?.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n )\n\n case 'radio':\n return (\n <div role=\"radiogroup\" style={{ display: 'flex', gap: 12, flexWrap: 'wrap' }}>\n {options?.map((opt) => (\n <label key={opt.value} style={{ display: 'flex', alignItems: 'center', gap: 4, cursor: 'pointer' }}>\n <input\n type=\"radio\"\n name={name}\n value={opt.value}\n checked={value === opt.value}\n onChange={() => handleChange(opt.value)}\n disabled={disabled}\n />\n {opt.label}\n </label>\n ))}\n </div>\n )\n\n case 'date':\n return (\n <input\n type=\"date\"\n value={value == null ? '' : String(value)}\n onChange={(e) => handleChange(e.target.value)}\n disabled={disabled}\n style={inputStyle}\n aria-invalid={hasErrors}\n aria-describedby={hasErrors ? errorId : undefined}\n />\n )\n\n case 'time':\n return (\n <input\n type=\"time\"\n value={value == null ? '' : String(value)}\n onChange={(e) => handleChange(e.target.value)}\n disabled={disabled}\n style={inputStyle}\n aria-invalid={hasErrors}\n aria-describedby={hasErrors ? errorId : undefined}\n />\n )\n\n case 'password':\n return (\n <input\n type=\"password\"\n value={value == null ? '' : String(value)}\n onChange={(e) => handleChange(e.target.value)}\n onBlur={() => form.onFieldBlur(name)}\n placeholder={placeholder}\n disabled={disabled}\n style={inputStyle}\n aria-invalid={hasErrors}\n aria-describedby={hasErrors ? errorId : undefined}\n />\n )\n\n case 'color':\n return (\n <input\n type=\"color\"\n value={value == null ? '#000000' : String(value)}\n onChange={(e) => handleChange(e.target.value)}\n disabled={disabled}\n style={{ ...inputStyle, padding: 2, width: 48, height: 32 }}\n />\n )\n\n case 'slider':\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <input\n type=\"range\"\n value={value == null ? (min ?? 0) : Number(value)}\n onChange={(e) => handleChange(Number(e.target.value))}\n min={min ?? 0}\n max={max ?? 100}\n step={step ?? 1}\n disabled={disabled}\n style={{ flex: 1 }}\n />\n <span style={{ minWidth: 32, textAlign: 'right', fontSize: 14 }}>\n {String(value ?? min ?? 0)}\n </span>\n </div>\n )\n\n case 'rate': {\n const maxStars = max ?? 5\n const currentRate = typeof value === 'number' ? value : 0\n return (\n <div style={{ display: 'flex', gap: 2 }}>\n {Array.from({ length: maxStars }, (_, i) => (\n <button\n key={i}\n type=\"button\"\n onClick={() => !disabled && handleChange(i + 1)}\n disabled={disabled}\n style={{\n background: 'none',\n border: 'none',\n cursor: disabled ? 'default' : 'pointer',\n fontSize: 20,\n color: i < currentRate ? 'var(--sg-warning, #faad14)' : 'var(--sg-border, #d9d9d9)',\n padding: 0,\n }}\n aria-label={`${i + 1} star${i !== 0 ? 's' : ''}`}\n >\n ★\n </button>\n ))}\n </div>\n )\n }\n\n case 'file':\n return (\n <input\n type=\"file\"\n accept={accept}\n multiple={multiple}\n onChange={(e) => {\n const files = e.target.files\n if (files) handleChange(multiple ? Array.from(files) : files[0] ?? null)\n }}\n disabled={disabled}\n style={inputStyle}\n />\n )\n\n case 'email':\n case 'url':\n case 'string':\n default:\n return (\n <input\n type={inferredType === 'email' ? 'email' : inferredType === 'url' ? 'url' : 'text'}\n value={value == null ? '' : String(value)}\n onChange={(e) => handleChange(e.target.value)}\n onBlur={() => form.onFieldBlur(name)}\n placeholder={placeholder}\n disabled={disabled}\n style={inputStyle}\n aria-invalid={hasErrors}\n aria-describedby={hasErrors ? errorId : undefined}\n />\n )\n }\n }\n\n return (\n <div className={`sg-autofield ${className ?? ''}`} style={wrapperStyle}>\n {inferredType !== 'boolean' && inferredType !== 'switch' && label && (\n <label style={{ fontWeight: 500, fontSize: 14 }}>{label}</label>\n )}\n {renderInput()}\n {hasErrors && (\n <span id={errorId} role=\"alert\" style={{ color: 'var(--sg-error, #ff4d4f)', fontSize: 12 }}>\n {meta.errors.join('; ')}\n </span>\n )}\n {hasWarnings && !hasErrors && (\n <span style={{ color: 'var(--sg-warning, #faad14)', fontSize: 12 }}>\n {meta.warnings.join('; ')}\n </span>\n )}\n </div>\n )\n}\n","import type { Rule, RuleFn } from '@skygraph/core'\n\n/**\n * Zod schema adapter. Converts a Zod schema (or any schema with .safeParse)\n * into SkyGraph form rules.\n *\n * Works with Zod v3/v4 or any library that implements:\n * { safeParse(value: unknown): { success: boolean; error?: { issues: Array<{ message: string }> } } }\n */\nexport interface ZodLikeSchema {\n safeParse(value: unknown): {\n success: boolean\n error?: { issues: Array<{ message: string; path?: (string | number)[] }> }\n }\n}\n\nexport interface ZodAdapterOptions {\n /** Custom error message override */\n message?: string\n /** Which issue to pick when multiple exist (default: 'first') */\n pick?: 'first' | 'all'\n}\n\n/**\n * Convert a single Zod schema into a SkyGraph Rule for one field.\n */\nexport function zodRule(schema: ZodLikeSchema, options?: ZodAdapterOptions): Rule {\n const rule: RuleFn = (value) => {\n const result = schema.safeParse(value)\n if (result.success) return null\n\n const issues = result.error?.issues ?? []\n if (issues.length === 0) return options?.message ?? 'Validation failed'\n\n if (options?.pick === 'all') {\n return issues.map((i) => i.message).join('; ')\n }\n\n return options?.message ?? issues[0].message\n }\n return rule\n}\n\n/**\n * Convert a Zod object schema into a map of field name -> Rule[].\n * Useful for auto-registering all fields from a schema.\n */\nexport interface ZodObjectLikeSchema {\n shape: Record<string, ZodLikeSchema>\n}\n\nexport function zodRules(\n schema: ZodObjectLikeSchema,\n options?: ZodAdapterOptions,\n): Record<string, Rule[]> {\n const result: Record<string, Rule[]> = {}\n for (const [key, fieldSchema] of Object.entries(schema.shape)) {\n result[key] = [zodRule(fieldSchema, options)]\n }\n return result\n}\n\n/**\n * Extract default values from a Zod schema.\n * Uses safeParse(undefined) to trigger Zod's .default() mechanism,\n * then reads the parsed data for the actual default value.\n */\nexport function zodDefaults(schema: ZodObjectLikeSchema): Record<string, unknown> {\n const defaults: Record<string, unknown> = {}\n for (const [key, fieldSchema] of Object.entries(schema.shape)) {\n try {\n const result = fieldSchema.safeParse(undefined) as {\n success: boolean\n data?: unknown\n error?: { issues: Array<{ message: string }> }\n }\n if (result.success && result.data !== undefined) {\n defaults[key] = result.data\n }\n } catch {\n // skip fields without defaults\n }\n }\n return defaults\n}\n\ninterface ZodDef {\n typeName?: string\n checks?: Array<{ kind: string; value?: unknown; regex?: RegExp; message?: string }>\n values?: unknown[]\n innerType?: { _def: ZodDef }\n type?: { _def: ZodDef }\n options?: Array<{ _def: ZodDef }>\n}\n\ninterface ZodFieldSchema {\n _def: ZodDef\n description?: string\n}\n\ninterface ZodObjectSchema {\n _def: ZodDef\n shape?: Record<string, ZodFieldSchema>\n}\n\n/**\n * Converts a Zod schema to a minimal JSON Schema representation for SchemaForm.\n */\nexport function zodToJsonSchema(\n schema: ZodObjectSchema,\n): import('../adapters/jsonSchemaAdapter').JSONSchema {\n const properties: Record<string, Record<string, unknown>> = {}\n const required: string[] = []\n\n const shape = schema.shape ?? (schema as unknown as { shape: Record<string, ZodFieldSchema> }).shape\n if (!shape) return { properties, required }\n\n for (const [key, field] of Object.entries(shape)) {\n const prop: Record<string, unknown> = { title: key }\n let def: ZodDef = field._def\n\n if (def.typeName === 'ZodOptional' || def.typeName === 'ZodNullable') {\n def = def.innerType?._def ?? def\n } else {\n required.push(key)\n }\n\n if (def.typeName === 'ZodDefault') {\n prop.default = (def as unknown as { defaultValue: () => unknown }).defaultValue?.()\n def = def.innerType?._def ?? def\n }\n\n switch (def.typeName) {\n case 'ZodString':\n prop.type = 'string'\n for (const check of def.checks ?? []) {\n if (check.kind === 'min') prop.minLength = check.value\n if (check.kind === 'max') prop.maxLength = check.value\n if (check.kind === 'email') prop.format = 'email'\n if (check.kind === 'url') prop.format = 'url'\n if (check.kind === 'regex' && check.regex) prop.pattern = check.regex.source\n }\n break\n case 'ZodNumber':\n prop.type = 'number'\n for (const check of def.checks ?? []) {\n if (check.kind === 'min') prop.minimum = check.value\n if (check.kind === 'max') prop.maximum = check.value\n }\n break\n case 'ZodBoolean':\n prop.type = 'boolean'\n break\n case 'ZodEnum':\n prop.type = 'string'\n prop.enum = def.values ?? []\n break\n case 'ZodDate':\n prop.type = 'string'\n prop.format = 'date'\n break\n default:\n prop.type = 'string'\n }\n\n if (field.description) prop.description = field.description\n\n properties[key] = prop\n }\n\n return { properties, required }\n}\n","import type { Rule } from '@skygraph/core'\nimport type { FieldType, AutoFieldOption } from '../components/complex/AutoField/AutoField'\n\nexport interface JSONSchemaProperty {\n type?: string\n title?: string\n description?: string\n default?: unknown\n enum?: unknown[]\n enumNames?: string[]\n minimum?: number\n maximum?: number\n minLength?: number\n maxLength?: number\n pattern?: string\n format?: string\n items?: JSONSchemaProperty\n required?: string[]\n properties?: Record<string, JSONSchemaProperty>\n oneOf?: Array<{ const: unknown; title?: string }>\n}\n\nexport interface JSONSchema extends JSONSchemaProperty {\n $schema?: string\n}\n\nexport interface AutoFieldConfig {\n name: string\n label?: string\n type: FieldType\n placeholder?: string\n options?: AutoFieldOption[]\n min?: number\n max?: number\n step?: number\n}\n\nfunction jsonTypeToFieldType(schema: JSONSchemaProperty): FieldType {\n if (schema.enum || schema.oneOf) return 'select'\n if (schema.format === 'email') return 'email'\n if (schema.format === 'uri' || schema.format === 'url') return 'url'\n if (schema.format === 'date') return 'date'\n if (schema.format === 'time') return 'time'\n if (schema.format === 'password') return 'password'\n if (schema.format === 'color') return 'color'\n\n switch (schema.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 (schema.maxLength && schema.maxLength > 200) return 'textarea'\n return 'string'\n }\n}\n\nfunction buildOptions(schema: JSONSchemaProperty): AutoFieldOption[] | undefined {\n if (schema.oneOf) {\n return schema.oneOf.map((item) => ({\n value: item.const as string | number,\n label: item.title ?? String(item.const),\n }))\n }\n if (schema.enum) {\n return schema.enum.map((val, i) => ({\n value: val as string | number,\n label: schema.enumNames?.[i] ?? String(val),\n }))\n }\n return undefined\n}\n\nexport function jsonSchemaToFields(schema: JSONSchema): AutoFieldConfig[] {\n const result: AutoFieldConfig[] = []\n const props = schema.properties ?? {}\n\n for (const [name, prop] of Object.entries(props)) {\n result.push({\n name,\n label: prop.title ?? name,\n type: jsonTypeToFieldType(prop),\n placeholder: prop.description,\n options: buildOptions(prop),\n min: prop.minimum,\n max: prop.maximum,\n })\n }\n\n return result\n}\n\nexport function jsonSchemaToRules(schema: JSONSchema): Record<string, Rule[]> {\n const result: Record<string, Rule[]> = {}\n const props = schema.properties ?? {}\n const requiredFields = new Set(schema.required ?? [])\n\n for (const [name, prop] of Object.entries(props)) {\n const rules: Rule[] = []\n\n if (requiredFields.has(name)) {\n rules.push({ required: true, message: `${prop.title ?? name} is required` })\n }\n\n if (prop.type === 'string') {\n if (prop.minLength !== undefined) {\n rules.push({ min: prop.minLength, message: `Minimum ${prop.minLength} characters` })\n }\n if (prop.maxLength !== undefined) {\n rules.push({ max: prop.maxLength, message: `Maximum ${prop.maxLength} characters` })\n }\n if (prop.pattern) {\n rules.push({ pattern: new RegExp(prop.pattern), message: `Invalid format` })\n }\n }\n\n if (prop.type === 'number' || prop.type === 'integer') {\n if (prop.minimum !== undefined) {\n rules.push({ min: prop.minimum, type: 'number' })\n }\n if (prop.maximum !== undefined) {\n rules.push({ max: prop.maximum, type: 'number' })\n }\n }\n\n if (prop.format === 'email') {\n rules.push({ type: 'email' })\n }\n if (prop.format === 'uri' || prop.format === 'url') {\n rules.push({ type: 'url' })\n }\n\n if (rules.length > 0) {\n result[name] = rules\n }\n }\n\n return result\n}\n\nexport function jsonSchemaToDefaults(schema: JSONSchema): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n const props = schema.properties ?? {}\n\n for (const [name, prop] of Object.entries(props)) {\n if (prop.default !== undefined) {\n result[name] = prop.default\n }\n }\n\n return result\n}\n","import React from 'react'\nimport { Form } from './Form'\nimport { Field } from './Field'\nimport { AutoField } from './AutoField/AutoField'\nimport { useForm } from '../../hooks/useForm'\nimport { useConfig } from '../ConfigProvider'\nimport {\n jsonSchemaToFields,\n jsonSchemaToRules,\n jsonSchemaToDefaults,\n} from '../../adapters/jsonSchemaAdapter'\nimport { zodToJsonSchema } from '../../adapters/zodAdapter'\nimport type { JSONSchema } from '../../adapters/jsonSchemaAdapter'\nimport type { UseFormReturn } from '../../hooks/useForm'\nimport type { BaseComponentProps, SizableProps } from '../../types'\n\n/** Builds a {@link Form} from JSON Schema or Zod (converted to JSON Schema) with {@link Field} + {@link AutoField} rows. */\nexport interface SchemaFormProps extends BaseComponentProps, SizableProps {\n /** JSON Schema object or a Zod schema (`_def` present) to derive fields and rules. */\n schema: JSONSchema | { _def?: unknown }\n /** Called with all values on successful submit. */\n onSubmit?: (values: Record<string, unknown>) => void | Promise<void>\n /** Passed through to the inner {@link Form}. */\n layout?: 'horizontal' | 'vertical' | 'inline'\n /** Disables generated controls and the inner {@link Form}. */\n disabled?: boolean\n /** External form instance; otherwise an internal `useForm` is created with schema defaults. */\n form?: UseFormReturn\n /** Passed through to the inner {@link Form}. */\n labelCol?: {\n /** Column span (out of 24). */\n span?: number\n /** Column offset (out of 24). */\n offset?: number\n }\n /** Passed through to the inner {@link Form}. */\n wrapperCol?: {\n /** Column span (out of 24). */\n span?: number\n /** Column offset (out of 24). */\n offset?: number\n }\n className?: string\n style?: React.CSSProperties\n /** Label for the default submit button when `children` is omitted.\n * @default 'Submit'\n */\n submitText?: string\n /** Replaces the default submit button; omit to use a primary `<button type=\"submit\">`. */\n children?: React.ReactNode\n}\n\nfunction isZodSchema(schema: unknown): boolean {\n return typeof schema === 'object' && schema !== null && '_def' in schema\n}\n\n/**\n * Generates fields from `schema`, wires validation, and wraps them in {@link Form}.\n * Supports Zod input by converting it to JSON Schema first.\n */\nexport function SchemaForm({\n schema: rawSchema,\n onSubmit,\n layout,\n size,\n disabled,\n form: externalForm,\n labelCol,\n wrapperCol,\n className,\n style,\n submitText: submitTextProp,\n children,\n}: SchemaFormProps) {\n const config = useConfig()\n const submitText = submitTextProp ?? config.locale?.form?.submitText ?? 'Submit'\n const jsonSchema: JSONSchema = isZodSchema(rawSchema)\n ? zodToJsonSchema(rawSchema as Parameters<typeof zodToJsonSchema>[0])\n : (rawSchema as JSONSchema)\n\n const fields = jsonSchemaToFields(jsonSchema)\n const rulesMap = jsonSchemaToRules(jsonSchema)\n const defaults = jsonSchemaToDefaults(jsonSchema)\n\n const internalForm = useForm({\n defaultValues: defaults,\n onSubmit: onSubmit as (values: Record<string, unknown>) => Promise<void>,\n })\n\n const formInstance = externalForm ?? internalForm\n\n return (\n <Form\n form={formInstance}\n layout={layout}\n size={size}\n disabled={disabled}\n labelCol={labelCol}\n wrapperCol={wrapperCol}\n className={className}\n style={style}\n >\n {fields.map((fieldConfig) => (\n <Field\n key={fieldConfig.name}\n name={fieldConfig.name}\n label={typeof fieldConfig.label === 'string' ? fieldConfig.label : undefined}\n rules={rulesMap[fieldConfig.name]}\n >\n {(field) => (\n <AutoField\n name={fieldConfig.name}\n type={fieldConfig.type}\n options={fieldConfig.options}\n placeholder={fieldConfig.placeholder}\n min={fieldConfig.min}\n max={fieldConfig.max}\n disabled={disabled ?? field.validating}\n />\n )}\n </Field>\n ))}\n {children ?? (\n <button type=\"submit\" className=\"sg-button sg-button-primary\">\n {submitText}\n </button>\n )}\n </Form>\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","import { useState, useCallback, useRef, useEffect, useMemo } from 'react'\nimport { createVirtual } from '@skygraph/core'\nimport type { VirtualEngine, VirtualRange } from '@skygraph/core'\n\nexport interface UseVirtualScrollOptions {\n itemCount: number\n itemHeight: number | ((index: number) => number)\n overscan?: number\n}\n\nexport interface UseVirtualScrollReturn {\n range: VirtualRange\n containerRef: React.RefObject<HTMLElement | null>\n scrollToIndex: (index: number, align?: 'start' | 'center' | 'end') => void\n engine: VirtualEngine\n}\n\nexport function useVirtualScroll(options: UseVirtualScrollOptions): UseVirtualScrollReturn {\n const containerRef = useRef<HTMLElement | null>(null)\n const engineRef = useRef<VirtualEngine | null>(null)\n\n if (!engineRef.current) {\n engineRef.current = createVirtual({\n itemCount: options.itemCount,\n itemHeight: options.itemHeight,\n overscan: options.overscan,\n })\n }\n\n const engine = engineRef.current\n\n useEffect(() => {\n engine.setItemCount(options.itemCount)\n }, [engine, options.itemCount])\n\n useEffect(() => {\n engine.setItemHeight(options.itemHeight)\n }, [engine, options.itemHeight])\n\n const [range, setRange] = useState<VirtualRange>(() =>\n engine.getRange(0, 0),\n )\n\n const recalc = useCallback(() => {\n const el = containerRef.current\n if (!el) return\n setRange(engine.getRange(el.scrollTop, el.clientHeight))\n }, [engine])\n\n useEffect(() => {\n const el = containerRef.current\n if (!el) return\n\n recalc()\n\n el.addEventListener('scroll', recalc, { passive: true })\n const ro = new ResizeObserver(recalc)\n ro.observe(el)\n\n return () => {\n el.removeEventListener('scroll', recalc)\n ro.disconnect()\n }\n }, [recalc])\n\n useEffect(() => {\n recalc()\n }, [options.itemCount, recalc])\n\n const scrollToIndex = useCallback(\n (index: number, align: 'start' | 'center' | 'end' = 'start') => {\n const el = containerRef.current\n if (!el) return\n el.scrollTop = engine.scrollToIndex(index, el.clientHeight, align)\n },\n [engine],\n )\n\n return useMemo(\n () => ({ range, containerRef, scrollToIndex, engine }),\n [range, scrollToIndex, engine],\n )\n}\n","import React, { forwardRef, useImperativeHandle } from 'react'\nimport { useVirtualScroll } from '../../../hooks/useVirtualScroll'\nimport type { VirtualItem } from '@skygraph/core'\n\n/** Props for the virtualized fixed-height item list. */\nexport interface VirtualListProps<T = unknown> {\n /** Full dataset; only visible indices are rendered. */\n data: T[]\n /** Fixed row height or per-index height resolver in pixels. */\n itemHeight: number | ((index: number) => number)\n /** Extra rows rendered above and below the viewport. */\n overscan?: number\n /** Renders one item with absolute positioning styles applied by the list. */\n renderItem: (item: T, index: number, style: React.CSSProperties) => React.ReactNode\n /** Scrolling container class name. */\n className?: string\n /** Scrolling container inline style. */\n style?: React.CSSProperties\n /** Stable React key for each item; defaults to row index. */\n itemKey?: (item: T, index: number) => React.Key\n}\n\n/** Imperative API for `VirtualList`. */\nexport interface VirtualListRef {\n /**\n * Scrolls so the item at `index` is visible.\n * @param align - Where to place the item in the viewport.\n */\n scrollToIndex: (index: number, align?: 'start' | 'center' | 'end') => void\n}\n\nfunction VirtualListInner<T>(\n props: VirtualListProps<T>,\n ref: React.ForwardedRef<VirtualListRef>,\n) {\n const {\n data,\n itemHeight,\n overscan,\n renderItem,\n className,\n style,\n itemKey,\n } = props\n\n const { range, containerRef, scrollToIndex } = useVirtualScroll({\n itemCount: data.length,\n itemHeight,\n overscan,\n })\n\n useImperativeHandle(ref, () => ({ scrollToIndex }), [scrollToIndex])\n\n return (\n <div\n ref={containerRef as React.RefObject<HTMLDivElement>}\n className={className}\n style={{\n overflow: 'auto',\n position: 'relative',\n ...style,\n }}\n >\n <div style={{ height: range.totalHeight, position: 'relative' }}>\n {range.visibleItems.map((vi: VirtualItem) => {\n const item = data[vi.index]\n const key = itemKey ? itemKey(item, vi.index) : vi.index\n const itemStyle: React.CSSProperties = {\n position: 'absolute',\n top: vi.offsetTop,\n left: 0,\n right: 0,\n height: vi.height,\n }\n return (\n <React.Fragment key={key}>\n {renderItem(item, vi.index, itemStyle)}\n </React.Fragment>\n )\n })}\n </div>\n </div>\n )\n}\n\n/**\n * Virtualized scroll container: mounts row content only for items near the viewport.\n * Forwards a ref with `scrollToIndex` for programmatic scrolling.\n */\nexport const VirtualList = forwardRef(VirtualListInner) as <T>(\n props: VirtualListProps<T> & { ref?: React.Ref<VirtualListRef> },\n) => React.ReactElement\n","import { useState, useCallback, useEffect, useRef, useMemo } from 'react'\nimport type { Core } from '@skygraph/core'\nimport { createHistory } from '@skygraph/core'\nimport type { HistoryPlugin, HistoryOptions } from '@skygraph/core'\n\nexport interface UseHistoryReturn {\n history: HistoryPlugin\n canUndo: boolean\n canRedo: boolean\n cursor: number\n entries: HistoryPlugin['entries']\n undo: () => void\n redo: () => void\n jumpTo: (index: number) => void\n clear: () => void\n}\n\nexport function useHistory(core: Core, options?: HistoryOptions): UseHistoryReturn {\n const [, forceUpdate] = useState(0)\n const historyRef = useRef<HistoryPlugin | null>(null)\n const optionsRef = useRef(options)\n\n if (!historyRef.current) {\n historyRef.current = createHistory(core, optionsRef.current)\n }\n\n const tick = useCallback(() => forceUpdate((n) => n + 1), [])\n\n const undo = useCallback(() => {\n historyRef.current!.undo()\n tick()\n }, [tick])\n\n const redo = useCallback(() => {\n historyRef.current!.redo()\n tick()\n }, [tick])\n\n const jumpTo = useCallback(\n (index: number) => {\n historyRef.current!.jumpTo(index)\n tick()\n },\n [tick],\n )\n\n const clear = useCallback(() => {\n historyRef.current!.clear()\n tick()\n }, [tick])\n\n useEffect(() => {\n return () => {\n historyRef.current?.destroy()\n }\n }, [])\n\n const h = historyRef.current\n\n return useMemo(\n () => ({\n history: h,\n canUndo: h.canUndo,\n canRedo: h.canRedo,\n cursor: h.cursor,\n entries: h.entries,\n undo,\n redo,\n jumpTo,\n clear,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [h, h.cursor, h.entries.length, undo, redo, jumpTo, clear],\n )\n}\n","import React, { useState } from 'react'\nimport type { UseHistoryReturn } from '../../hooks/useHistory'\nimport type { BaseComponentProps } from '../../types'\n\n/** Props for the devtools time-travel history panel (base layout props come from `BaseComponentProps`). */\nexport interface HistoryPanelProps extends BaseComponentProps {\n /** History controller from `useHistory` (entries, cursor, undo/redo, jump, clear). */\n history: UseHistoryReturn\n}\n\nconst styles: Record<string, React.CSSProperties> = {\n root: {\n fontFamily: 'ui-monospace, \"Cascadia Code\", \"Fira Code\", monospace',\n fontSize: 12,\n border: '1px solid var(--sg-border, #d9d9d9)',\n borderRadius: 8,\n background: 'var(--sg-bg-elevated, #fff)',\n overflow: 'hidden',\n },\n header: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '8px 12px',\n borderBottom: '1px solid var(--sg-border, #d9d9d9)',\n fontWeight: 600,\n fontSize: 13,\n },\n controls: {\n display: 'flex',\n gap: 4,\n },\n btn: {\n padding: '2px 8px',\n border: '1px solid var(--sg-border, #d9d9d9)',\n borderRadius: 4,\n background: 'var(--sg-bg, #fafafa)',\n cursor: 'pointer',\n fontSize: 11,\n },\n btnDisabled: {\n opacity: 0.4,\n cursor: 'not-allowed',\n },\n list: {\n maxHeight: 300,\n overflowY: 'auto' as const,\n margin: 0,\n padding: 0,\n listStyle: 'none',\n },\n entry: {\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '4px 12px',\n cursor: 'pointer',\n borderBottom: '1px solid var(--sg-border-light, #f0f0f0)',\n transition: 'background 0.15s',\n },\n entryActive: {\n background: 'var(--sg-primary-bg, #e6f4ff)',\n fontWeight: 600,\n },\n entryFuture: {\n opacity: 0.5,\n },\n badge: {\n display: 'inline-block',\n padding: '1px 6px',\n borderRadius: 4,\n fontSize: 10,\n background: 'var(--sg-primary-bg, #e6f4ff)',\n color: 'var(--sg-primary, #1677ff)',\n },\n patches: {\n padding: '4px 12px 8px 32px',\n background: 'var(--sg-bg-subtle, #fafafa)',\n fontSize: 11,\n lineHeight: 1.6,\n },\n empty: {\n padding: '24px 12px',\n textAlign: 'center' as const,\n color: 'var(--sg-text-tertiary, #999)',\n },\n}\n\n/**\n * Time-travel UI listing history entries with undo/redo controls and expandable patch details.\n */\nexport function HistoryPanel({ history, className, style }: HistoryPanelProps) {\n const { entries, cursor, canUndo, canRedo, undo, redo, jumpTo, clear } = history\n const [expanded, setExpanded] = useState<number | null>(null)\n\n return (\n <div className={className} style={{ ...styles.root, ...style }}>\n <div style={styles.header}>\n <span>Time-Travel ({entries.length})</span>\n <div style={styles.controls}>\n <button\n style={{ ...styles.btn, ...(canUndo ? {} : styles.btnDisabled) }}\n disabled={!canUndo}\n onClick={undo}\n >\n Undo\n </button>\n <button\n style={{ ...styles.btn, ...(canRedo ? {} : styles.btnDisabled) }}\n disabled={!canRedo}\n onClick={redo}\n >\n Redo\n </button>\n <button style={styles.btn} onClick={clear}>\n Clear\n </button>\n </div>\n </div>\n\n {entries.length === 0 ? (\n <div style={styles.empty}>No history yet</div>\n ) : (\n <ul style={styles.list}>\n {entries.map((entry, i) => {\n const isCurrent = i === cursor\n const isFuture = i > cursor\n\n return (\n <li key={i}>\n <div\n style={{\n ...styles.entry,\n ...(isCurrent ? styles.entryActive : {}),\n ...(isFuture ? styles.entryFuture : {}),\n }}\n onClick={() => jumpTo(i)}\n onDoubleClick={() => setExpanded(expanded === i ? null : i)}\n >\n <span style={styles.badge}>{i}</span>\n <span>\n {entry.patches.length} write{entry.patches.length !== 1 ? 's' : ''}\n </span>\n <span style={{ marginLeft: 'auto', fontSize: 10, opacity: 0.6 }}>\n {formatTime(entry.timestamp)}\n </span>\n </div>\n\n {expanded === i && (\n <div style={styles.patches}>\n {entry.patches.map((p, pi) => (\n <div key={pi}>\n <code>{p.path}</code>:{' '}\n <span style={{ opacity: 0.5 }}>{formatValue(p.oldValue)}</span>\n {' → '}\n <span>{formatValue(p.value)}</span>\n </div>\n ))}\n </div>\n )}\n </li>\n )\n })}\n </ul>\n )}\n </div>\n )\n}\n\nfunction formatTime(ts: number): string {\n const d = new Date(ts)\n return d.toLocaleTimeString(undefined, {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n })\n}\n\nfunction formatValue(v: unknown): string {\n if (v === undefined) return 'undefined'\n if (v === null) return 'null'\n if (typeof v === 'string') return `\"${v}\"`\n try {\n return JSON.stringify(v)\n } catch {\n return String(v)\n }\n}\n","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 {\r\n forwardRef,\r\n useCallback,\r\n useEffect,\r\n useImperativeHandle,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from 'react'\r\nimport type {\r\n CSSProperties,\r\n DragEvent as ReactDragEvent,\r\n ForwardedRef,\r\n MouseEvent as ReactMouseEvent,\r\n PointerEvent as ReactPointerEvent,\r\n ReactNode,\r\n WheelEvent as ReactWheelEvent,\r\n} from 'react'\r\nimport {\r\n routeOrthogonal,\r\n pointsToPath,\r\n pointsToRoundedPath,\r\n getBezierPath,\r\n nearestSide,\r\n} from '@skygraph/core'\r\nimport type { Side } from '@skygraph/core'\r\nimport type {\r\n AABB,\r\n Anchor,\r\n AnchorId,\r\n EdgeEndpoint,\r\n GraphEdge,\r\n GraphEngine,\r\n GraphNode,\r\n GraphState,\r\n NodeId,\r\n Point,\r\n} from '@skygraph/core'\r\nimport { printElement } from '../../../utils/print'\r\nimport type { PrintOptions, PrintableProp } from '../../../utils/print'\r\nimport {\r\n EdgeHoverActions,\r\n NodeHoverActions,\r\n type EdgeAction,\r\n type NodeAction,\r\n} from './HoverActions'\r\nimport {\r\n nodesInBox,\r\n rectFromCorners,\r\n screenRectToWorld,\r\n selectionsEqual,\r\n toggleSelection,\r\n type ScreenRect,\r\n} from './selection'\r\n\r\n/** Imperative API of {@link Diagram}. */\r\nexport interface DiagramRef {\r\n /**\r\n * Открыть popup и вызвать window.print() на DOM-области диаграммы. Объекты\r\n * `customStyles` / `pageSize` / `orientation` мерджатся с тем, что пришло\r\n * через prop `printable`.\r\n */\r\n print: (opts?: PrintOptions) => void\r\n}\r\n\r\n/**\r\n * Per-node renderer. Receives the engine node and returns the React content\r\n * placed inside the absolutely-positioned wrapper. If omitted, a default\r\n * label (`node.id`) is rendered.\r\n */\r\nexport type DiagramNodeRenderer = (node: GraphNode) => ReactNode\r\n\r\n/** Selection management mode for the diagram. */\r\nexport type DiagramSelectionMode = 'single' | 'multi' | 'lasso'\r\n\r\n/**\r\n * Argument passed to {@link DiagramProps.onCanvasContextMenu} — combines\r\n * world-space and screen-space coordinates so consumers can position a\r\n * floating menu without re-projecting.\r\n */\r\nexport interface DiagramCanvasContextPoint {\r\n /** World-space x (matches `node.transform.x`). */\r\n x: number\r\n /** World-space y. */\r\n y: number\r\n /** Browser-screen x (`event.clientX`). */\r\n screenX: number\r\n /** Browser-screen y (`event.clientY`). */\r\n screenY: number\r\n}\r\n\r\n/**\r\n * Argument passed to {@link DiagramProps.onDropNode} when a draggable\r\n * HTML5 element is dropped on the canvas. Combines world-space\r\n * coordinates (already adjusted for pan / zoom) with the underlying\r\n * `DragEvent` so consumers can pull whatever payload they encoded.\r\n */\r\nexport interface DiagramDropPoint {\r\n /** World-space x where the cursor was released. */\r\n x: number\r\n /** World-space y where the cursor was released. */\r\n y: number\r\n /** Browser-screen x (`event.clientX`). */\r\n screenX: number\r\n /** Browser-screen y (`event.clientY`). */\r\n screenY: number\r\n /** The original native `DataTransfer` so the consumer can decode the payload. */\r\n dataTransfer: DataTransfer | null\r\n}\r\n\r\nexport interface DiagramProps {\r\n /** GraphEngine driving the diagram (e.g. from `useGraph()`). */\r\n graph: GraphEngine\r\n /**\r\n * Snapshot of the graph state (from `useGraph().state`). Required so that\r\n * the component re-renders on every commit.\r\n */\r\n state: GraphState\r\n /** Width of the canvas; defaults to a flexible 100%. */\r\n width?: number | string\r\n /** Height of the canvas; defaults to 400. */\r\n height?: number | string\r\n /** Optional content renderer per node. */\r\n renderNode?: DiagramNodeRenderer\r\n /** Root wrapper className. */\r\n className?: string\r\n /** Root wrapper inline style. */\r\n style?: CSSProperties\r\n /** Drop the default `sg-diagram-*` class names. */\r\n unstyled?: boolean\r\n /**\r\n * Enable click-and-drag to move nodes. The handler receives the new\r\n * position in the parent's coordinate space and is expected to call\r\n * `graph.moveNode(...)` (the default handler does exactly this).\r\n *\r\n * Set `true` for the default behaviour, `false` (default) to disable,\r\n * or pass a custom function for richer drag logic (e.g. snap-to-grid,\r\n * permission checks).\r\n *\r\n * @default false\r\n */\r\n draggable?: boolean | ((id: NodeId, x: number, y: number) => void)\r\n /**\r\n * Enable mouse-wheel zoom (`Ctrl + wheel`) and pinch-zoom-style scaling.\r\n * The internal canvas is wrapped in a `<g>` / `<div>` whose CSS\r\n * transform reflects the current zoom factor.\r\n *\r\n * @default false\r\n */\r\n zoomable?: boolean\r\n /**\r\n * Enable panning. Plain mouse-wheel scrolls the canvas; the middle\r\n * mouse button drags it. `Ctrl + wheel` is reserved for zoom (when\r\n * `zoomable` is also on), so the two flags compose cleanly.\r\n *\r\n * @default false\r\n */\r\n panable?: boolean\r\n /**\r\n * Snap node coordinates to a grid of this size (world units). When set,\r\n * `moveNode` is called with rounded `(x, y)` and the wrapper picks up\r\n * the `sg-diagram-grid` class so a CSS background pattern renders.\r\n *\r\n * Pass `0` or `undefined` to disable.\r\n */\r\n snapToGrid?: number\r\n /**\r\n * When `true`, orthogonal edges receive the AABBs of every other node\r\n * as obstacles so the A*-based router can avoid them. Off by default to\r\n * keep the cheap L-route path the norm; opt in only when the diagram\r\n * tends to have crossings worth avoiding.\r\n *\r\n * Independent of `routing` per edge — edges with `routing !== 'orthogonal'`\r\n * ignore this flag.\r\n */\r\n routeAroundNodes?: boolean\r\n /**\r\n * Tuning knobs forwarded to the edge router. `gridSize` / `inflate` /\r\n * `maxNodes` only apply to `routing: 'orthogonal'` when\r\n * `routeAroundNodes` is on (see `routeOrthogonal` in `@skygraph/core`).\r\n *\r\n * • `cornerRadius` — radius of rounded corners on orthogonal\r\n * edges. Defaults to `8` world units. Pass `0` for sharp\r\n * right-angle corners.\r\n * • `curvature` — control-handle intensity for `routing: 'bezier'`.\r\n * Defaults to React Flow's `0.25`. Range: `0..1`.\r\n */\r\n routingOptions?: {\r\n gridSize?: number\r\n inflate?: number\r\n maxNodes?: number\r\n cornerRadius?: number\r\n curvature?: number\r\n }\r\n /**\r\n * When `true`, every rendered edge gets an arrow marker on its target\r\n * end (matches the visual norm of mainstream diagram libraries).\r\n * The marker reuses the edge stroke colour through `currentColor`\r\n * so hover / selected styles propagate automatically.\r\n *\r\n * @default true\r\n */\r\n edgeArrows?: boolean\r\n /**\r\n * Включает поддержку печати через `ref.print()`. Если `true` — без\r\n * визуальных изменений; объект `{ fileName }` задаёт имя popup-окна\r\n * (используется как title и дефолт для \"Save as PDF\").\r\n *\r\n * Сама печать триггерится императивно через `ref.print()`.\r\n * @default false\r\n */\r\n printable?: PrintableProp\r\n\r\n /**\r\n * Right-click on a node — fired with the original mouse event and the\r\n * engine node. If defined, the component calls `event.preventDefault()`\r\n * and the browser's native context menu is suppressed. If omitted, the\r\n * native menu shows as usual.\r\n */\r\n onNodeContextMenu?: (event: ReactMouseEvent<HTMLDivElement>, node: GraphNode) => void\r\n /**\r\n * Right-click on an edge path. Same suppression contract as\r\n * {@link DiagramProps.onNodeContextMenu}.\r\n */\r\n onEdgeContextMenu?: (event: ReactMouseEvent<SVGPathElement>, edge: GraphEdge) => void\r\n /**\r\n * Right-click on the empty canvas (i.e. neither a node nor an edge).\r\n * The point combines world and screen coordinates so a floating menu\r\n * can be positioned without re-projection.\r\n */\r\n onCanvasContextMenu?: (\r\n event: ReactMouseEvent<HTMLDivElement>,\r\n point: DiagramCanvasContextPoint,\r\n ) => void\r\n\r\n /**\r\n * Mini-toolbar entries shown above a hovered node. The overlay is\r\n * rendered in screen-space, so its size stays constant under\r\n * pan / zoom. Show / hide use a 200 ms enter delay and 150 ms leave\r\n * grace so the cursor can hop from the node to the overlay.\r\n */\r\n nodeActions?: readonly NodeAction[]\r\n /** Same as {@link DiagramProps.nodeActions} but rendered next to a hovered edge. */\r\n edgeActions?: readonly EdgeAction[]\r\n\r\n /**\r\n * Controlled selection: array of selected node ids. Pair with\r\n * {@link DiagramProps.onSelectionChange}. If left undefined, the\r\n * component manages selection internally (uncontrolled).\r\n */\r\n selection?: readonly NodeId[]\r\n /** Initial selection for the uncontrolled mode. */\r\n defaultSelection?: readonly NodeId[]\r\n /** Fired whenever the selection changes (both controlled and uncontrolled). */\r\n onSelectionChange?: (selection: NodeId[]) => void\r\n /**\r\n * - `'single'` (default) — legacy behaviour; no multi-select, no lasso.\r\n * - `'multi'` — `Ctrl+click` toggles selection; dragging a selected\r\n * node moves all selected together.\r\n * - `'lasso'` — same as `'multi'` plus a left-button drag on empty\r\n * canvas opens a rubber-band rectangle selecting nodes whose AABBs\r\n * intersect it.\r\n *\r\n * Defaults to `'single'` for backwards compatibility — existing drag\r\n * code keeps working unchanged.\r\n */\r\n selectionMode?: DiagramSelectionMode\r\n\r\n /**\r\n * Fired when an HTML5 drag-and-drop ends on the canvas. The handler\r\n * receives world-space coordinates (already adjusted for pan / zoom)\r\n * plus the raw `DataTransfer` so the consumer can decode whatever\r\n * payload it set on `dragStart`.\r\n *\r\n * The wrapper automatically wires `onDragOver = preventDefault` so\r\n * drop targets work without extra config. Passing `undefined` leaves\r\n * the canvas inert.\r\n */\r\n onDropNode?: (point: DiagramDropPoint) => void\r\n /**\r\n * Comma-separated list of MIME types accepted by the canvas. When the\r\n * dragged payload doesn't include any of these types, the drop is\r\n * ignored (the cursor falls back to \"no-drop\"). Defaults to\r\n * `['application/x-sg-node']` — the convention used by Skygraph\r\n * palette items. Pass `'*'` (string) or `null` to accept everything.\r\n */\r\n dropTypes?: readonly string[] | '*' | null\r\n}\r\n\r\ninterface ViewState {\r\n zoom: number\r\n panX: number\r\n panY: number\r\n}\r\n\r\ninterface ResolvedAnchor {\r\n point: Point\r\n}\r\n\r\nfunction resolveAnchor(\r\n graph: GraphEngine,\r\n nodeId: NodeId,\r\n ref: AnchorId | { s: number },\r\n): ResolvedAnchor | null {\r\n const anchors = graph.anchorsOf(nodeId)\r\n let anchor: Anchor | undefined\r\n if (typeof ref === 'string') {\r\n anchor = anchors.find((a) => a.id === ref)\r\n } else {\r\n let best: Anchor | undefined\r\n let bestDiff = Infinity\r\n for (const a of anchors) {\r\n const diff = Math.abs(a.s - ref.s)\r\n if (diff < bestDiff) {\r\n bestDiff = diff\r\n best = a\r\n }\r\n }\r\n anchor = best\r\n }\r\n if (!anchor) return null\r\n return { point: anchor.point }\r\n}\r\n\r\nfunction endpointWorldPoint(graph: GraphEngine, ep: EdgeEndpoint): Point | null {\r\n const node = graph.getNode(ep.node)\r\n if (!node) return null\r\n const local = resolveAnchor(graph, ep.node, ep.anchor)\r\n if (!local) return null\r\n const bounds = graph.boundsOf(ep.node)\r\n return [\r\n bounds.x + (local.point[0] - localOriginOffset(node).x),\r\n bounds.y + (local.point[1] - localOriginOffset(node).y),\r\n ]\r\n}\r\n\r\n/**\r\n * Offset between the outline-local origin and the bounding-box top-left.\r\n * For `rect`/`polygon`/`path` the origin is at `(0, 0)` which IS the\r\n * top-left, so the offset is zero. For `ellipse` the origin is the centre,\r\n * so the offset is `(-rx, -ry)` — i.e. the local anchor (rx*cos, ry*sin)\r\n * has to be shifted by `(-(-rx), -(-ry)) = (rx, ry)` to land relative to\r\n * the bbox top-left.\r\n */\r\nfunction localOriginOffset(node: GraphNode): { x: number; y: number } {\r\n const o = node.outline\r\n if (o.kind === 'ellipse') return { x: -o.rx, y: -o.ry }\r\n return { x: 0, y: 0 }\r\n}\r\n\r\nfunction defaultRenderNode(node: GraphNode): ReactNode {\r\n return <span className=\"sg-diagram-node-label\">{node.id}</span>\r\n}\r\n\r\n/**\r\n * Default corner radius for rounded orthogonal corners. Matches the\r\n * value React Flow uses (`5px`) which gives a visible smoothing\r\n * without rounding the path into mush.\r\n */\r\nconst ORTHOGONAL_CORNER_RADIUS = 8\r\n\r\nfunction buildEdgePath(\r\n edge: GraphEdge,\r\n start: Point,\r\n end: Point,\r\n obstacles: readonly AABB[] | undefined,\r\n sourceBounds: AABB | undefined,\r\n targetBounds: AABB | undefined,\r\n routerOpts: DiagramProps['routingOptions'],\r\n): string {\r\n switch (edge.routing) {\r\n case 'orthogonal': {\r\n const points = routeOrthogonal(start, end, {\r\n obstacles,\r\n gridSize: routerOpts?.gridSize,\r\n inflate: routerOpts?.inflate,\r\n maxNodes: routerOpts?.maxNodes,\r\n sourceBounds,\r\n targetBounds,\r\n })\r\n return pointsToRoundedPath(points, routerOpts?.cornerRadius ?? ORTHOGONAL_CORNER_RADIUS)\r\n }\r\n case 'bezier': {\r\n // Pick the exit/enter side from each endpoint's AABB. When the\r\n // bounds aren't available (rare — only happens for nodes with\r\n // exotic outlines) the curve falls back to \"right → left\",\r\n // which still looks reasonable for horizontal layouts.\r\n const sourceSide: Side = sourceBounds ? nearestSide(sourceBounds, end) : 'right'\r\n const targetSide: Side = targetBounds ? nearestSide(targetBounds, start) : 'left'\r\n return getBezierPath({\r\n source: start,\r\n sourceSide,\r\n target: end,\r\n targetSide,\r\n curvature: routerOpts?.curvature,\r\n })\r\n }\r\n case 'manual': {\r\n const wp = edge.waypoints ?? []\r\n return pointsToPath([start, ...wp, end])\r\n }\r\n case 'straight':\r\n default:\r\n return `M ${start[0]} ${start[1]} L ${end[0]} ${end[1]}`\r\n }\r\n}\r\n\r\nfunction unionBounds(boxes: AABB[]): AABB {\r\n if (boxes.length === 0) return { x: 0, y: 0, w: 0, h: 0 }\r\n let x0 = Infinity\r\n let y0 = Infinity\r\n let x1 = -Infinity\r\n let y1 = -Infinity\r\n for (const b of boxes) {\r\n if (b.x < x0) x0 = b.x\r\n if (b.y < y0) y0 = b.y\r\n if (b.x + b.w > x1) x1 = b.x + b.w\r\n if (b.y + b.h > y1) y1 = b.y + b.h\r\n }\r\n return { x: x0, y: y0, w: x1 - x0, h: y1 - y0 }\r\n}\r\n\r\nconst HOVER_SHOW_DELAY_MS = 200\r\nconst HOVER_HIDE_GRACE_MS = 150\r\n\r\n/**\r\n * Reactive diagram view: DOM nodes for shapes + an SVG overlay for edges.\r\n *\r\n * Capabilities:\r\n * - Straight / orthogonal / manual edge routing (with optional A*\r\n * obstacle-aware routing via `routeAroundNodes`)\r\n * - Drag-and-drop with optional snap-to-grid; multi-drag when the\r\n * dragged node is part of the current selection\r\n * - Mouse-wheel zoom (`Ctrl+wheel`) and pan (plain wheel /\r\n * middle-button drag)\r\n * - Selection management: single / multi (Ctrl+click) / lasso\r\n * (rubber-band on empty canvas)\r\n * - Hover mini-toolbars (`nodeActions` / `edgeActions`) and right-click\r\n * callbacks (`onNodeContextMenu` / `onEdgeContextMenu` /\r\n * `onCanvasContextMenu`) for custom context menus\r\n */\r\nfunction DiagramInner(\r\n {\r\n graph,\r\n state,\r\n width = '100%',\r\n height = 400,\r\n renderNode = defaultRenderNode,\r\n className,\r\n style,\r\n unstyled = false,\r\n draggable = false,\r\n zoomable = false,\r\n panable = false,\r\n snapToGrid,\r\n routeAroundNodes = false,\r\n routingOptions,\r\n printable,\r\n onNodeContextMenu,\r\n onEdgeContextMenu,\r\n onCanvasContextMenu,\r\n nodeActions,\r\n edgeActions,\r\n selection,\r\n defaultSelection,\r\n onSelectionChange,\r\n selectionMode = 'single',\r\n onDropNode,\r\n dropTypes,\r\n edgeArrows = true,\r\n }: DiagramProps,\r\n forwardedRef: ForwardedRef<DiagramRef>,\r\n) {\r\n const nodes = useMemo(() => Array.from(state.nodes.values()), [state])\r\n const edges = useMemo(() => Array.from(state.edges.values()), [state])\r\n\r\n const allBounds = useMemo(() => nodes.map((n) => graph.boundsOf(n.id)), [nodes, graph])\r\n const canvasBounds = useMemo(() => unionBounds(allBounds), [allBounds])\r\n\r\n // Pre-index node bounds by id so each edge's obstacle list (which excludes\r\n // its own endpoint nodes) can be assembled in O(N) rather than O(N²).\r\n const boundsById = useMemo(() => {\r\n const m = new Map<NodeId, AABB>()\r\n nodes.forEach((n, i) => m.set(n.id, allBounds[i]!))\r\n return m\r\n }, [nodes, allBounds])\r\n\r\n const [view, setView] = useState<ViewState>({ zoom: 1, panX: 0, panY: 0 })\r\n\r\n const wrapperRef = useRef<HTMLDivElement>(null)\r\n\r\n // ─── Selection (controlled / uncontrolled) ────────────────────────────────\r\n const isSelectionControlled = selection !== undefined\r\n const [internalSelection, setInternalSelection] = useState<readonly NodeId[]>(\r\n () => defaultSelection ?? [],\r\n )\r\n const currentSelection = isSelectionControlled\r\n ? (selection as readonly NodeId[])\r\n : internalSelection\r\n const selectionSet = useMemo(() => new Set(currentSelection), [currentSelection])\r\n\r\n const onSelectionChangeRef = useRef(onSelectionChange)\r\n useEffect(() => {\r\n onSelectionChangeRef.current = onSelectionChange\r\n }, [onSelectionChange])\r\n\r\n const commitSelection = useCallback(\r\n (next: readonly NodeId[]) => {\r\n if (selectionsEqual(currentSelection, next)) return\r\n const arr = Array.isArray(next) ? (next as NodeId[]) : Array.from(next)\r\n if (!isSelectionControlled) setInternalSelection(arr)\r\n onSelectionChangeRef.current?.(arr)\r\n },\r\n [currentSelection, isSelectionControlled],\r\n )\r\n\r\n // Drop dropped/removed ids from the internal selection so it never holds\r\n // stale references after `removeNode`.\r\n useEffect(() => {\r\n if (isSelectionControlled) return\r\n const filtered = internalSelection.filter((id) => state.nodes.has(id))\r\n if (filtered.length !== internalSelection.length) {\r\n setInternalSelection(filtered)\r\n onSelectionChangeRef.current?.(filtered as NodeId[])\r\n }\r\n }, [isSelectionControlled, internalSelection, state])\r\n\r\n // ─── Print plumbing ───────────────────────────────────────────────────────\r\n const printOptionsFromProp = useMemo(() => {\r\n if (typeof printable === 'object' && printable !== null) {\r\n return { fileName: printable.fileName }\r\n }\r\n return {}\r\n }, [printable])\r\n\r\n const doPrint = useCallback(\r\n (opts?: PrintOptions) => {\r\n printElement(wrapperRef.current, { ...printOptionsFromProp, ...(opts ?? {}) })\r\n },\r\n [printOptionsFromProp],\r\n )\r\n\r\n useImperativeHandle(forwardedRef, () => ({ print: doPrint }), [doPrint])\r\n\r\n const wrapperClass = unstyled\r\n ? className\r\n : ['sg-diagram', snapToGrid ? 'sg-diagram-grid' : '', className].filter(Boolean).join(' ')\r\n\r\n const wrapperStyle: CSSProperties = {\r\n position: 'relative',\r\n width,\r\n height,\r\n overflow: 'hidden',\r\n // CSS variables consumed by `.sg-diagram-grid` so the visual grid\r\n // matches the snap step and follows the current pan / zoom.\r\n ...(snapToGrid\r\n ? ({\r\n '--sg-grid-size': `${snapToGrid * view.zoom}px`,\r\n backgroundPosition: `${view.panX}px ${view.panY}px`,\r\n } as CSSProperties)\r\n : null),\r\n ...style,\r\n }\r\n\r\n const canvasStyle: CSSProperties = {\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n transform: `translate(${view.panX}px, ${view.panY}px) scale(${view.zoom})`,\r\n transformOrigin: '0 0',\r\n width: '100%',\r\n height: '100%',\r\n }\r\n\r\n // ─── Drag state (single + multi) ──────────────────────────────────────────\r\n //\r\n // The drag pipeline is built on Pointer Events rather than the older\r\n // mousedown / window-mousemove dance. The rationale:\r\n //\r\n // • Pointer Events unify mouse / touch / pen so the same path\r\n // handles trackpads, touchscreens, drawing tablets and Mac\r\n // \"right-click via two-finger tap\" — these all delivered the\r\n // mouse fallback erratically, which is the \"не у всех работает\"\r\n // symptom users were hitting on Macs and tablets.\r\n // • `setPointerCapture` guarantees `pointermove` / `pointerup`\r\n // keep firing on the original target even if the cursor leaves\r\n // the wrapper or the user releases over another window.\r\n // • Browser drag-and-drop (HTML5 DnD) and Pointer Events never\r\n // conflict on the same element — we already wire `onDragOver` /\r\n // `onDrop` on the wrapper for palette → canvas drops.\r\n interface DragSession {\r\n primaryId: NodeId\r\n pointerId: number\r\n target: HTMLElement\r\n startX: number\r\n startY: number\r\n startZoom: number\r\n /** Per-node initial world position; iterated on every move. */\r\n members: Array<{ id: NodeId; x0: number; y0: number }>\r\n moved: boolean\r\n }\r\n const dragRef = useRef<DragSession | null>(null)\r\n const [draggingId, setDraggingId] = useState<NodeId | null>(null)\r\n\r\n /** Pointer movement (in CSS pixels) before a click \"counts\" as a drag. */\r\n const DRAG_THRESHOLD_PX = 0.5\r\n\r\n function applyMove(id: NodeId, x: number, y: number) {\r\n let nx = x\r\n let ny = y\r\n if (snapToGrid && snapToGrid > 0) {\r\n nx = Math.round(nx / snapToGrid) * snapToGrid\r\n ny = Math.round(ny / snapToGrid) * snapToGrid\r\n }\r\n if (typeof draggable === 'function') draggable(id, nx, ny)\r\n else graph.moveNode(id, nx, ny)\r\n }\r\n\r\n function handleNodePointerDown(id: NodeId) {\r\n return (e: ReactPointerEvent<HTMLDivElement>) => {\r\n // Left button only — middle is reserved for pan, right is context menu.\r\n // Touch / pen always report `button === 0`.\r\n if (e.button !== 0) return\r\n\r\n const node = graph.getNode(id)\r\n if (!node) return\r\n\r\n const multiCapable = selectionMode !== 'single'\r\n const isCtrl = e.ctrlKey || e.metaKey\r\n\r\n if (multiCapable && isCtrl) {\r\n // Toggle membership — never start a drag on Ctrl+click.\r\n e.preventDefault()\r\n e.stopPropagation()\r\n commitSelection(toggleSelection(currentSelection, id))\r\n return\r\n }\r\n\r\n // If the node is part of the active selection, drag the whole group;\r\n // otherwise drag just this one (and, in multi modes, replace the\r\n // selection with `[id]` so the visual cue tracks the focus).\r\n if (multiCapable) {\r\n if (!selectionSet.has(id)) commitSelection([id])\r\n }\r\n\r\n if (!draggable) return\r\n e.preventDefault()\r\n e.stopPropagation()\r\n\r\n const groupIds =\r\n multiCapable && selectionSet.has(id) ? Array.from(new Set([id, ...currentSelection])) : [id]\r\n const members = groupIds\r\n .map((mid) => {\r\n const n = graph.getNode(mid)\r\n return n ? { id: mid, x0: n.transform.x, y0: n.transform.y } : null\r\n })\r\n .filter((m): m is { id: NodeId; x0: number; y0: number } => m !== null)\r\n\r\n const target = e.currentTarget\r\n // Capture the pointer on the node element so subsequent\r\n // `pointermove` / `pointerup` keep reaching us even if the user\r\n // drags fast or releases outside the wrapper. Without capture,\r\n // touch pointers commonly \"escape\" once the finger leaves the\r\n // initial element bounds, which is the root cause of the \"drag\r\n // freezes\" reports on Android/iOS.\r\n try {\r\n target.setPointerCapture(e.pointerId)\r\n } catch {\r\n // Some browsers throw if the pointer is already released — the\r\n // session is still valid, we just lose capture; ignore.\r\n }\r\n\r\n dragRef.current = {\r\n primaryId: id,\r\n pointerId: e.pointerId,\r\n target,\r\n startX: e.clientX,\r\n startY: e.clientY,\r\n startZoom: view.zoom,\r\n members,\r\n moved: false,\r\n }\r\n setDraggingId(id)\r\n }\r\n }\r\n\r\n function handleNodePointerMove(e: ReactPointerEvent<HTMLDivElement>) {\r\n const d = dragRef.current\r\n if (!d || d.pointerId !== e.pointerId) return\r\n const dx = (e.clientX - d.startX) / d.startZoom\r\n const dy = (e.clientY - d.startY) / d.startZoom\r\n if (!d.moved && (Math.abs(dx) > DRAG_THRESHOLD_PX || Math.abs(dy) > DRAG_THRESHOLD_PX)) {\r\n d.moved = true\r\n }\r\n // Group commits into a single transaction so undo restores the whole\r\n // multi-drag rather than one node at a time.\r\n if (d.members.length > 1) {\r\n graph.transaction(() => {\r\n for (const m of d.members) applyMove(m.id, m.x0 + dx, m.y0 + dy)\r\n })\r\n } else {\r\n const m = d.members[0]!\r\n applyMove(m.id, m.x0 + dx, m.y0 + dy)\r\n }\r\n }\r\n\r\n function endDrag(e: ReactPointerEvent<HTMLDivElement>) {\r\n const d = dragRef.current\r\n if (!d || d.pointerId !== e.pointerId) return\r\n try {\r\n d.target.releasePointerCapture(d.pointerId)\r\n } catch {\r\n // Already released — ignore.\r\n }\r\n dragRef.current = null\r\n setDraggingId(null)\r\n }\r\n\r\n // Safety net — if the component unmounts mid-drag, the captured\r\n // pointer would otherwise linger and the next click on the same\r\n // element would behave oddly.\r\n useEffect(() => {\r\n return () => {\r\n const d = dragRef.current\r\n if (d) {\r\n try {\r\n d.target.releasePointerCapture(d.pointerId)\r\n } catch {\r\n // pointer might already be gone — nothing to do\r\n }\r\n dragRef.current = null\r\n }\r\n }\r\n }, [])\r\n\r\n // ─── Wheel: zoom (Ctrl) / pan (plain) ────────────────────────────────────\r\n function handleWheel(e: ReactWheelEvent<HTMLDivElement>) {\r\n if (!zoomable && !panable) return\r\n if (zoomable && (e.ctrlKey || e.metaKey)) {\r\n e.preventDefault()\r\n const factor = e.deltaY < 0 ? 1.1 : 1 / 1.1\r\n setView((v) => ({\r\n ...v,\r\n zoom: Math.max(0.1, Math.min(10, v.zoom * factor)),\r\n }))\r\n return\r\n }\r\n if (panable) {\r\n e.preventDefault()\r\n setView((v) => ({\r\n ...v,\r\n panX: v.panX - e.deltaX,\r\n panY: v.panY - e.deltaY,\r\n }))\r\n }\r\n }\r\n\r\n // ─── Lasso state ──────────────────────────────────────────────────────────\r\n const [lasso, setLasso] = useState<ScreenRect | null>(null)\r\n const lassoRef = useRef<{\r\n startX: number\r\n startY: number\r\n initial: readonly NodeId[]\r\n additive: boolean\r\n } | null>(null)\r\n const boundsByIdRef = useRef(boundsById)\r\n useEffect(() => {\r\n boundsByIdRef.current = boundsById\r\n }, [boundsById])\r\n const viewRef = useRef(view)\r\n useEffect(() => {\r\n viewRef.current = view\r\n }, [view])\r\n\r\n // Wrapper-level pointer session (lasso OR middle-button pan). We\r\n // keep one session at a time — both gestures emit `pointerdown` from\r\n // the same target so swapping modes is just a discriminator.\r\n type WrapperSession =\r\n | { kind: 'lasso'; pointerId: number }\r\n | { kind: 'pan'; pointerId: number; startX: number; startY: number; panX: number; panY: number }\r\n const wrapperSessionRef = useRef<WrapperSession | null>(null)\r\n\r\n function startLasso(e: ReactPointerEvent<HTMLDivElement>) {\r\n const rect = wrapperRef.current?.getBoundingClientRect()\r\n if (!rect) return\r\n const sx = e.clientX - rect.left\r\n const sy = e.clientY - rect.top\r\n e.preventDefault()\r\n try {\r\n e.currentTarget.setPointerCapture(e.pointerId)\r\n } catch {\r\n // ignored — capture is best-effort\r\n }\r\n lassoRef.current = {\r\n startX: sx,\r\n startY: sy,\r\n initial: currentSelection,\r\n additive: e.shiftKey || e.ctrlKey || e.metaKey,\r\n }\r\n wrapperSessionRef.current = { kind: 'lasso', pointerId: e.pointerId }\r\n setLasso({ x: sx, y: sy, w: 0, h: 0 })\r\n }\r\n\r\n function startPan(e: ReactPointerEvent<HTMLDivElement>) {\r\n e.preventDefault()\r\n try {\r\n e.currentTarget.setPointerCapture(e.pointerId)\r\n } catch {\r\n // ignored\r\n }\r\n wrapperSessionRef.current = {\r\n kind: 'pan',\r\n pointerId: e.pointerId,\r\n startX: e.clientX,\r\n startY: e.clientY,\r\n panX: view.panX,\r\n panY: view.panY,\r\n }\r\n }\r\n\r\n // ─── Wrapper pointerdown: middle-pan / lasso / clear-selection ────────────\r\n function handleWrapperPointerDown(e: ReactPointerEvent<HTMLDivElement>) {\r\n if (panable && e.button === 1) {\r\n startPan(e)\r\n return\r\n }\r\n\r\n if (e.button !== 0) return\r\n\r\n // Empty-canvas left click — only meaningful when selection management\r\n // is active. The pointerdown originates on the wrapper / canvas, never\r\n // on a node (those stop propagation in `handleNodePointerDown`).\r\n if (selectionMode === 'lasso') {\r\n startLasso(e)\r\n return\r\n }\r\n if (selectionMode === 'multi' && currentSelection.length > 0) {\r\n // Shift / Ctrl preserve the current selection; plain click clears.\r\n if (!(e.shiftKey || e.ctrlKey || e.metaKey)) commitSelection([])\r\n }\r\n }\r\n\r\n function handleWrapperPointerMove(e: ReactPointerEvent<HTMLDivElement>) {\r\n const s = wrapperSessionRef.current\r\n if (!s || s.pointerId !== e.pointerId) return\r\n if (s.kind === 'pan') {\r\n const dx = e.clientX - s.startX\r\n const dy = e.clientY - s.startY\r\n setView((v) => ({ ...v, panX: s.panX + dx, panY: s.panY + dy }))\r\n return\r\n }\r\n // lasso\r\n const r = wrapperRef.current?.getBoundingClientRect()\r\n const l = lassoRef.current\r\n if (!r || !l) return\r\n const cx = e.clientX - r.left\r\n const cy = e.clientY - r.top\r\n const screen = rectFromCorners(l.startX, l.startY, cx, cy)\r\n setLasso(screen)\r\n const world = screenRectToWorld(screen, viewRef.current)\r\n const hits = nodesInBox(boundsByIdRef.current, world)\r\n const next = l.additive ? Array.from(new Set([...l.initial, ...hits])) : hits\r\n commitSelection(next)\r\n }\r\n\r\n function handleWrapperPointerUp(e: ReactPointerEvent<HTMLDivElement>) {\r\n const s = wrapperSessionRef.current\r\n if (!s || s.pointerId !== e.pointerId) return\r\n try {\r\n e.currentTarget.releasePointerCapture(s.pointerId)\r\n } catch {\r\n // ignored\r\n }\r\n wrapperSessionRef.current = null\r\n if (s.kind === 'lasso') {\r\n lassoRef.current = null\r\n setLasso(null)\r\n }\r\n }\r\n\r\n // ─── HTML5 drag-and-drop (palette → canvas) ───────────────────────────────\r\n // The wrapper accepts drops by default — see `onDropNode` / `dropTypes`.\r\n // `dragover` MUST `preventDefault` for the browser to fire `drop` and\r\n // for the cursor to switch out of \"no-drop\".\r\n const acceptedTypes = useMemo<readonly string[] | null>(() => {\r\n if (dropTypes === '*' || dropTypes === null) return null\r\n if (dropTypes === undefined) return ['application/x-sg-node']\r\n return dropTypes\r\n }, [dropTypes])\r\n\r\n const dropEnabled = !!onDropNode\r\n\r\n function dragHasAcceptedType(e: ReactDragEvent<HTMLDivElement>): boolean {\r\n if (!acceptedTypes) return true\r\n const types = e.dataTransfer?.types\r\n if (!types || types.length === 0) return false\r\n for (const t of acceptedTypes) {\r\n // `types` is a DOMStringList in some browsers; `includes` works on the proxy too.\r\n for (let i = 0; i < types.length; i++) {\r\n if (types[i] === t) return true\r\n }\r\n }\r\n return false\r\n }\r\n\r\n function handleDragOver(e: ReactDragEvent<HTMLDivElement>) {\r\n if (!dropEnabled) return\r\n if (!dragHasAcceptedType(e)) return\r\n e.preventDefault()\r\n if (e.dataTransfer) e.dataTransfer.dropEffect = 'copy'\r\n }\r\n\r\n function handleDrop(e: ReactDragEvent<HTMLDivElement>) {\r\n if (!onDropNode) return\r\n if (!dragHasAcceptedType(e)) return\r\n e.preventDefault()\r\n const rect = wrapperRef.current?.getBoundingClientRect()\r\n if (!rect) return\r\n const sx = e.clientX - rect.left\r\n const sy = e.clientY - rect.top\r\n const wx = (sx - view.panX) / (view.zoom || 1)\r\n const wy = (sy - view.panY) / (view.zoom || 1)\r\n onDropNode({\r\n x: wx,\r\n y: wy,\r\n screenX: e.clientX,\r\n screenY: e.clientY,\r\n dataTransfer: e.dataTransfer,\r\n })\r\n }\r\n\r\n // ─── Context menu plumbing ────────────────────────────────────────────────\r\n function handleWrapperContextMenu(e: ReactMouseEvent<HTMLDivElement>) {\r\n if (!onCanvasContextMenu) return\r\n const rect = wrapperRef.current?.getBoundingClientRect()\r\n if (!rect) return\r\n const sx = e.clientX - rect.left\r\n const sy = e.clientY - rect.top\r\n const wx = (sx - view.panX) / (view.zoom || 1)\r\n const wy = (sy - view.panY) / (view.zoom || 1)\r\n e.preventDefault()\r\n onCanvasContextMenu(e, { x: wx, y: wy, screenX: e.clientX, screenY: e.clientY })\r\n }\r\n\r\n function handleNodeContextMenu(node: GraphNode) {\r\n return (e: ReactMouseEvent<HTMLDivElement>) => {\r\n // Always stop propagation so the wrapper-level handler doesn't also\r\n // fire and treat the node as if it were the canvas. We only suppress\r\n // the native menu when a per-node callback is registered.\r\n e.stopPropagation()\r\n if (!onNodeContextMenu) return\r\n e.preventDefault()\r\n onNodeContextMenu(e, node)\r\n }\r\n }\r\n\r\n function handleEdgeContextMenu(edge: GraphEdge) {\r\n return (e: ReactMouseEvent<SVGPathElement>) => {\r\n e.stopPropagation()\r\n if (!onEdgeContextMenu) return\r\n e.preventDefault()\r\n onEdgeContextMenu(e, edge)\r\n }\r\n }\r\n\r\n // ─── Hover overlays (nodes / edges) ───────────────────────────────────────\r\n const [hoveredNode, setHoveredNode] = useState<NodeId | null>(null)\r\n const [hoveredEdge, setHoveredEdge] = useState<string | null>(null)\r\n const nodeHoverShowTimer = useRef<number | null>(null)\r\n const nodeHoverHideTimer = useRef<number | null>(null)\r\n const edgeHoverShowTimer = useRef<number | null>(null)\r\n const edgeHoverHideTimer = useRef<number | null>(null)\r\n\r\n const clearTimer = (ref: React.MutableRefObject<number | null>) => {\r\n if (ref.current != null) {\r\n window.clearTimeout(ref.current)\r\n ref.current = null\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n return () => {\r\n clearTimer(nodeHoverShowTimer)\r\n clearTimer(nodeHoverHideTimer)\r\n clearTimer(edgeHoverShowTimer)\r\n clearTimer(edgeHoverHideTimer)\r\n }\r\n }, [])\r\n\r\n const showNodeHover = (id: NodeId) => {\r\n clearTimer(nodeHoverHideTimer)\r\n if (hoveredNode === id) return\r\n clearTimer(nodeHoverShowTimer)\r\n nodeHoverShowTimer.current = window.setTimeout(() => {\r\n setHoveredNode(id)\r\n nodeHoverShowTimer.current = null\r\n }, HOVER_SHOW_DELAY_MS)\r\n }\r\n\r\n const hideNodeHover = () => {\r\n clearTimer(nodeHoverShowTimer)\r\n clearTimer(nodeHoverHideTimer)\r\n nodeHoverHideTimer.current = window.setTimeout(() => {\r\n setHoveredNode(null)\r\n nodeHoverHideTimer.current = null\r\n }, HOVER_HIDE_GRACE_MS)\r\n }\r\n\r\n const showEdgeHover = (id: string) => {\r\n clearTimer(edgeHoverHideTimer)\r\n if (hoveredEdge === id) return\r\n clearTimer(edgeHoverShowTimer)\r\n edgeHoverShowTimer.current = window.setTimeout(() => {\r\n setHoveredEdge(id)\r\n edgeHoverShowTimer.current = null\r\n }, HOVER_SHOW_DELAY_MS)\r\n }\r\n\r\n const hideEdgeHover = () => {\r\n clearTimer(edgeHoverShowTimer)\r\n clearTimer(edgeHoverHideTimer)\r\n edgeHoverHideTimer.current = window.setTimeout(() => {\r\n setHoveredEdge(null)\r\n edgeHoverHideTimer.current = null\r\n }, HOVER_HIDE_GRACE_MS)\r\n }\r\n\r\n // ─── Render — nodes / edges / overlays ────────────────────────────────────\r\n const hasNodeActions = !!nodeActions && nodeActions.length > 0\r\n const hasEdgeActions = !!edgeActions && edgeActions.length > 0\r\n const edgesInteractive = !!onEdgeContextMenu || hasEdgeActions\r\n\r\n const hoveredNodeRecord = hoveredNode != null ? (state.nodes.get(hoveredNode) ?? null) : null\r\n const hoveredNodeBounds = hoveredNode != null ? (boundsById.get(hoveredNode) ?? null) : null\r\n\r\n const hoveredEdgeRecord = hoveredEdge != null ? (state.edges.get(hoveredEdge) ?? null) : null\r\n const hoveredEdgeMid = useMemo(() => {\r\n if (!hoveredEdgeRecord) return null\r\n const a = endpointWorldPoint(graph, hoveredEdgeRecord.from)\r\n const b = endpointWorldPoint(graph, hoveredEdgeRecord.to)\r\n if (!a || !b) return null\r\n return { x: (a[0] + b[0]) / 2, y: (a[1] + b[1]) / 2 }\r\n }, [graph, hoveredEdgeRecord])\r\n\r\n return (\r\n <div\r\n ref={wrapperRef}\r\n className={wrapperClass}\r\n style={wrapperStyle}\r\n onWheel={zoomable || panable ? handleWheel : undefined}\r\n onPointerDown={\r\n panable || selectionMode === 'lasso' || selectionMode === 'multi'\r\n ? handleWrapperPointerDown\r\n : undefined\r\n }\r\n onPointerMove={panable || selectionMode === 'lasso' ? handleWrapperPointerMove : undefined}\r\n onPointerUp={panable || selectionMode === 'lasso' ? handleWrapperPointerUp : undefined}\r\n onPointerCancel={panable || selectionMode === 'lasso' ? handleWrapperPointerUp : undefined}\r\n onLostPointerCapture={\r\n panable || selectionMode === 'lasso' ? handleWrapperPointerUp : undefined\r\n }\r\n onContextMenu={onCanvasContextMenu ? handleWrapperContextMenu : undefined}\r\n onDragOver={dropEnabled ? handleDragOver : undefined}\r\n onDrop={dropEnabled ? handleDrop : undefined}\r\n data-selection-mode={selectionMode}\r\n data-sg-drop={dropEnabled ? 'true' : undefined}\r\n >\r\n <div\r\n className={unstyled ? undefined : 'sg-diagram-canvas'}\r\n style={canvasStyle}\r\n data-zoom={view.zoom}\r\n data-pan-x={view.panX}\r\n data-pan-y={view.panY}\r\n >\r\n <svg\r\n className={unstyled ? undefined : 'sg-diagram-edges'}\r\n width={Math.max(canvasBounds.w + canvasBounds.x, 0) || '100%'}\r\n height={Math.max(canvasBounds.h + canvasBounds.y, 0) || '100%'}\r\n style={{\r\n position: 'absolute',\r\n inset: 0,\r\n // The SVG layer never grabs pointer events itself — only\r\n // its child `path[data-edge-hit]` elements opt in via\r\n // `pointer-events: stroke` so nodes underneath stay\r\n // interactive across edge gaps.\r\n pointerEvents: 'none',\r\n }}\r\n aria-hidden=\"true\"\r\n >\r\n {/*\r\n * Marker defs — one arrow per visual state. We keep them\r\n * on every diagram (cheap; one defs block, zero render\r\n * cost when `edgeArrows={false}`) and let CSS swap them\r\n * out via the marker-end attribute on the path.\r\n *\r\n * The arrow shape uses `context-stroke` so it inherits\r\n * the edge's stroke colour automatically when supported,\r\n * with a `fill` fallback for browsers that lack it. The\r\n * marker viewport is 10×10 with `refX={9}` so the arrow\r\n * tip lands on the path's endpoint instead of overshooting.\r\n */}\r\n {edgeArrows && (\r\n <defs>\r\n <marker\r\n id=\"sg-diagram-arrow\"\r\n viewBox=\"0 0 10 10\"\r\n refX=\"9\"\r\n refY=\"5\"\r\n markerWidth=\"7\"\r\n markerHeight=\"7\"\r\n orient=\"auto-start-reverse\"\r\n markerUnits=\"userSpaceOnUse\"\r\n >\r\n <path\r\n d=\"M 0 0 L 10 5 L 0 10 Z\"\r\n fill=\"context-stroke\"\r\n className=\"sg-diagram-arrow-fill\"\r\n />\r\n </marker>\r\n <marker\r\n id=\"sg-diagram-arrow-hover\"\r\n viewBox=\"0 0 10 10\"\r\n refX=\"9\"\r\n refY=\"5\"\r\n markerWidth=\"8\"\r\n markerHeight=\"8\"\r\n orient=\"auto-start-reverse\"\r\n markerUnits=\"userSpaceOnUse\"\r\n >\r\n <path\r\n d=\"M 0 0 L 10 5 L 0 10 Z\"\r\n fill=\"context-stroke\"\r\n className=\"sg-diagram-arrow-fill\"\r\n />\r\n </marker>\r\n </defs>\r\n )}\r\n {edges.map((edge) =>\r\n renderEdge(\r\n graph,\r\n edge,\r\n boundsById,\r\n routeAroundNodes,\r\n routingOptions,\r\n edgesInteractive,\r\n edgeArrows,\r\n edgesInteractive ? handleEdgeContextMenu(edge) : undefined,\r\n hasEdgeActions ? () => showEdgeHover(String(edge.id)) : undefined,\r\n hasEdgeActions ? () => hideEdgeHover() : undefined,\r\n ),\r\n )}\r\n </svg>\r\n {nodes.map((node) => {\r\n const bounds = graph.boundsOf(node.id)\r\n const isSelected = selectionSet.has(node.id)\r\n const isDragging = draggingId === node.id\r\n const nodeClass = unstyled\r\n ? undefined\r\n : [\r\n 'sg-diagram-node',\r\n `sg-diagram-node-${node.outline.kind}`,\r\n draggable ? 'sg-diagram-node-draggable' : '',\r\n isSelected ? 'sg-diagram-node-selected' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')\r\n return (\r\n <div\r\n key={node.id}\r\n data-node-id={node.id}\r\n data-selected={isSelected ? 'true' : undefined}\r\n data-sg-dragging={isDragging ? 'true' : undefined}\r\n className={nodeClass}\r\n style={{\r\n position: 'absolute',\r\n left: bounds.x,\r\n top: bounds.y,\r\n width: bounds.w,\r\n height: bounds.h,\r\n cursor: draggable ? (isDragging ? 'grabbing' : 'grab') : undefined,\r\n userSelect: draggable ? 'none' : undefined,\r\n }}\r\n onPointerDown={\r\n draggable || selectionMode !== 'single' ? handleNodePointerDown(node.id) : undefined\r\n }\r\n onPointerMove={draggable ? handleNodePointerMove : undefined}\r\n onPointerUp={draggable ? endDrag : undefined}\r\n onPointerCancel={draggable ? endDrag : undefined}\r\n onLostPointerCapture={draggable ? endDrag : undefined}\r\n onContextMenu={onNodeContextMenu ? handleNodeContextMenu(node) : undefined}\r\n onMouseEnter={hasNodeActions ? () => showNodeHover(node.id) : undefined}\r\n onMouseLeave={hasNodeActions ? () => hideNodeHover() : undefined}\r\n >\r\n {renderNode(node)}\r\n </div>\r\n )\r\n })}\r\n </div>\r\n\r\n {/* Hover overlays — live in the wrapper (screen-space), so size /\r\n font don't track zoom. */}\r\n {hasNodeActions && hoveredNodeRecord && hoveredNodeBounds && (\r\n <NodeHoverActions\r\n node={hoveredNodeRecord}\r\n actions={nodeActions!}\r\n screenX={view.panX + hoveredNodeBounds.x * view.zoom}\r\n screenY={view.panY + hoveredNodeBounds.y * view.zoom}\r\n width={hoveredNodeBounds.w * view.zoom}\r\n unstyled={unstyled}\r\n onPointerEnter={() => showNodeHover(hoveredNodeRecord.id)}\r\n onPointerLeave={() => hideNodeHover()}\r\n />\r\n )}\r\n\r\n {hasEdgeActions && hoveredEdgeRecord && hoveredEdgeMid && (\r\n <EdgeHoverActions\r\n edge={hoveredEdgeRecord}\r\n actions={edgeActions!}\r\n screenX={view.panX + hoveredEdgeMid.x * view.zoom}\r\n screenY={view.panY + hoveredEdgeMid.y * view.zoom}\r\n unstyled={unstyled}\r\n onPointerEnter={() => showEdgeHover(String(hoveredEdgeRecord.id))}\r\n onPointerLeave={() => hideEdgeHover()}\r\n />\r\n )}\r\n\r\n {/* Lasso rubber band (only while dragging on empty canvas). */}\r\n {lasso && (\r\n <div\r\n className={unstyled ? undefined : 'sg-diagram-lasso'}\r\n style={{\r\n position: 'absolute',\r\n left: lasso.x,\r\n top: lasso.y,\r\n width: lasso.w,\r\n height: lasso.h,\r\n pointerEvents: 'none',\r\n }}\r\n />\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\nfunction renderEdge(\r\n graph: GraphEngine,\r\n edge: GraphEdge,\r\n boundsById: ReadonlyMap<NodeId, AABB>,\r\n routeAroundNodes: boolean,\r\n routerOpts: DiagramProps['routingOptions'],\r\n interactive: boolean,\r\n arrows: boolean,\r\n onContextMenu: ((e: ReactMouseEvent<SVGPathElement>) => void) | undefined,\r\n onMouseEnter: (() => void) | undefined,\r\n onMouseLeave: (() => void) | undefined,\r\n): ReactNode {\r\n const a = endpointWorldPoint(graph, edge.from)\r\n const b = endpointWorldPoint(graph, edge.to)\r\n if (!a || !b) return null\r\n\r\n // Build the obstacle list (every node except this edge's two endpoints).\r\n // We only do this for `orthogonal` routing AND only when `routeAroundNodes`\r\n // is on — straight/manual ignore it.\r\n let obstacles: AABB[] | undefined\r\n if (routeAroundNodes && edge.routing === 'orthogonal') {\r\n const skip = new Set<NodeId>([edge.from.node, edge.to.node])\r\n obstacles = []\r\n for (const [id, bb] of boundsById) {\r\n if (!skip.has(id)) obstacles.push(bb)\r\n }\r\n }\r\n\r\n // Always pass source/target bounds for orthogonal/bezier routing —\r\n // the router uses them to pick the side of each rectangle nearest\r\n // to the other endpoint, so edges exit from the closest face instead\r\n // of from a corner-anchor like `s = 0.25` / `s = 0.75`.\r\n const needsBounds = edge.routing === 'orthogonal' || edge.routing === 'bezier'\r\n const sourceBounds = needsBounds ? boundsById.get(edge.from.node) : undefined\r\n const targetBounds = needsBounds ? boundsById.get(edge.to.node) : undefined\r\n\r\n const d = buildEdgePath(edge, a, b, obstacles, sourceBounds, targetBounds, routerOpts)\r\n\r\n const markerEnd = arrows ? 'url(#sg-diagram-arrow)' : undefined\r\n\r\n if (!interactive) {\r\n return (\r\n <path\r\n key={edge.id}\r\n d={d}\r\n className={`sg-diagram-edge sg-diagram-edge-${edge.routing}`}\r\n fill=\"none\"\r\n markerEnd={markerEnd}\r\n data-edge-id={edge.id}\r\n data-obstacle-count={obstacles ? obstacles.length : 0}\r\n />\r\n )\r\n }\r\n\r\n return (\r\n <g key={edge.id} data-edge-id={edge.id}>\r\n {/* Wide invisible underlay for easier hit-testing on the thin edge. */}\r\n <path\r\n d={d}\r\n className=\"sg-diagram-edge-hit\"\r\n fill=\"none\"\r\n stroke=\"transparent\"\r\n strokeWidth={16}\r\n data-edge-hit=\"true\"\r\n style={{ pointerEvents: 'stroke', cursor: onContextMenu ? 'context-menu' : undefined }}\r\n onContextMenu={onContextMenu}\r\n onMouseEnter={onMouseEnter}\r\n onMouseLeave={onMouseLeave}\r\n />\r\n <path\r\n d={d}\r\n className={`sg-diagram-edge sg-diagram-edge-${edge.routing}`}\r\n fill=\"none\"\r\n markerEnd={markerEnd}\r\n data-edge-id={edge.id}\r\n data-obstacle-count={obstacles ? obstacles.length : 0}\r\n style={{ pointerEvents: 'none' }}\r\n />\r\n </g>\r\n )\r\n}\r\n\r\n/**\r\n * Reactive diagram view (forwardRef-обёртка над `DiagramInner`). Обновлять\r\n * данные нужно через `graph` / `state`; для печати — `ref.print()`.\r\n */\r\nexport const Diagram = forwardRef<DiagramRef, DiagramProps>(DiagramInner)\r\nDiagram.displayName = 'Diagram'\r\n\r\nexport type { NodeAction, EdgeAction } from './HoverActions'\r\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 { routeOrthogonal, 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): 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 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),\n time: t,\n })\n }\n return out\n }, [resolved, scale])\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 const dependencyPaths = useMemo(() => {\n const out: Array<{ id: string; d: string }> = []\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 // Arrow from source END → dependent START.\n const startPt: readonly [number, number] = [src.x + src.w, src.y + src.h / 2]\n const endPt: readonly [number, number] = [r.x, r.y + r.h / 2]\n const points = routeOrthogonal(startPt, endPt, {\n preferred: 'hv',\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 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={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 */}\n <div\n className={unstyled ? undefined : 'sg-gantt-main'}\n style={{ position: 'relative', width: resolved.totalWidth, minWidth: '100%' }}\n >\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 {/* Dependency arrows */}\n {dependencyPaths.length > 0 && (\n <svg\n className={unstyled ? undefined : 'sg-gantt-deps'}\n width={resolved.totalWidth}\n height={gridHeight}\n style={{ position: 'absolute', inset: 0, pointerEvents: 'none', overflow: 'visible' }}\n aria-hidden=\"true\"\n >\n <defs>\n <marker\n id=\"sg-gantt-arrow\"\n viewBox=\"0 0 10 10\"\n refX=\"8\"\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\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 </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\nfunction deriveRange(assignments: readonly Assignment[], step: number): { from: Date; to: Date } {\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 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 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 () => range ?? deriveRange(assignments, step),\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'\r\nimport type { PrintableProp } from '../../../utils/print'\r\nimport type { ChartActionsProp } from './ChartHoverToolbar'\r\nimport type {\r\n ChartContextMenuHandler,\r\n ChartSeriesContextMenuHandler,\r\n} from './chartContextMenu'\r\n\r\n/** A single category along the X axis. */\r\nexport type ChartCategory = string | number\r\n\r\n/** Numeric value for a series at a specific category. */\r\nexport type ChartValue = number | null\r\n\r\n/** One series — a logical line / bar / pie slice with a label and values. */\r\nexport interface ChartSeries {\r\n /** Unique identifier (used for keying React lists and color resolution). */\r\n id: string\r\n /** Human-readable label used in legend / tooltip. */\r\n label: string\r\n /** Optional explicit colour (CSS value). Defaults to a deterministic palette by index. */\r\n color?: string\r\n /**\r\n * Per-category values. Index N corresponds to `categories[N]`.\r\n * Use `null` to mark a gap (line will be split, bar will be hidden).\r\n */\r\n values: readonly ChartValue[]\r\n}\r\n\r\n/**\r\n * X axis configuration. Off by default — when `xAxis` is omitted no axis\r\n * elements are rendered (backward-compat with v0).\r\n */\r\nexport interface XAxisOptions {\r\n /**\r\n * Number of category ticks to render. If omitted or larger than the number\r\n * of categories, every category is labelled. Otherwise N evenly-spaced\r\n * categories are picked (always including the first and last).\r\n */\r\n tickCount?: number\r\n /** Format the visible category label. Default: `String(category)`. */\r\n tickFormatter?: (category: ChartCategory, index: number) => string\r\n /** Optional axis title rendered below the plot. */\r\n label?: string\r\n}\r\n\r\n/**\r\n * Y axis configuration. Off by default — when `yAxis` is omitted no axis\r\n * elements are rendered (backward-compat with v0).\r\n */\r\nexport interface YAxisOptions {\r\n /** Number of evenly-spaced ticks (including endpoints). @default 5 */\r\n tickCount?: number\r\n /** Format the visible numeric tick label. Default: short numeric. */\r\n tickFormatter?: (value: number) => string\r\n /** Optional axis title rendered to the left of the plot (rotated). */\r\n label?: string\r\n /** Render horizontal gridlines at each tick. @default false */\r\n gridLines?: boolean\r\n}\r\n\r\n/**\r\n * Animation configuration for chart mount / data transitions.\r\n *\r\n * - `true` / omitted — enable with default duration (600ms).\r\n * - `false` — disable entirely (no animation classes / styles applied).\r\n * - `{ duration: ms }` — explicit duration in milliseconds.\r\n *\r\n * Implementation is pure CSS (no `requestAnimationFrame` loops): we pass the\r\n * duration as a `--sg-chart-anim-duration` custom property on the animated\r\n * elements and let `@keyframes` in `charts.css` handle the timing.\r\n */\r\nexport type ChartAnimation = boolean | { duration?: number }\r\n\r\n/** Default animation duration in milliseconds (when `animate` is not given a number). */\r\nexport const DEFAULT_CHART_ANIMATION_MS = 600\r\n\r\n/** Resolves a `ChartAnimation` value into a normalized `{ enabled, duration }` shape. */\r\nexport function resolveChartAnimation(animate: ChartAnimation | undefined): {\r\n enabled: boolean\r\n duration: number\r\n} {\r\n if (animate === false) return { enabled: false, duration: 0 }\r\n if (animate === undefined || animate === true) {\r\n return { enabled: true, duration: DEFAULT_CHART_ANIMATION_MS }\r\n }\r\n return {\r\n enabled: true,\r\n duration: animate.duration ?? DEFAULT_CHART_ANIMATION_MS,\r\n }\r\n}\r\n\r\n/**\r\n * Builds a stable string key from a list of values that re-mounts animated\r\n * subtrees only when the data really changes (categories / series). Used as\r\n * `key={...}` on animated `<g>` groups so CSS animations re-trigger on data\r\n * updates, not on every render.\r\n */\r\nexport function chartDataKey(parts: readonly unknown[]): string {\r\n let out = ''\r\n for (let i = 0; i < parts.length; i++) {\r\n if (i > 0) out += '|'\r\n try {\r\n out += JSON.stringify(parts[i])\r\n } catch {\r\n out += String(parts[i])\r\n }\r\n }\r\n return out\r\n}\r\n\r\n/** Common shape for chart props. */\r\nexport interface BaseChartProps {\r\n /** Categories along the X axis. */\r\n categories: readonly ChartCategory[]\r\n /** One or more data series. */\r\n series: readonly ChartSeries[]\r\n /** Width of the chart in CSS units. Defaults to `'100%'`. */\r\n width?: number | string\r\n /** Height of the chart in pixels. Defaults to `200`. */\r\n height?: number\r\n /** Optional class name on the root SVG. */\r\n className?: string\r\n /** Optional inline style on the root SVG. */\r\n style?: CSSProperties\r\n /** Drop default `sg-chart-*` classes (headless mode). */\r\n unstyled?: boolean\r\n /** Padding around the plot area in pixels (number or [top, right, bottom, left]). */\r\n padding?: number | readonly [number, number, number, number]\r\n /** Show a small horizontal legend below the SVG. @default false */\r\n legend?: boolean\r\n /**\r\n * Mount / data-change animation toggle. Pure CSS, no rAF loops.\r\n * @default true\r\n */\r\n animate?: ChartAnimation\r\n /**\r\n * Optional X axis configuration. When omitted, no x-axis is rendered\r\n * (v0 backward-compat). When provided, ticks / labels / optional title\r\n * are drawn inside the SVG via `<ChartAxes>`.\r\n */\r\n xAxis?: XAxisOptions\r\n /**\r\n * Optional Y axis configuration. When omitted, no y-axis is rendered.\r\n * Set `gridLines: true` to draw horizontal grid lines across the plot.\r\n */\r\n yAxis?: YAxisOptions\r\n /**\r\n * Включает поддержку `ref.print()`. Сама печать триггерится императивно\r\n * через ref. `{ fileName }` задаёт имя popup-окна.\r\n * @default false\r\n */\r\n printable?: PrintableProp\r\n /**\r\n * Hover-toolbar в правом верхнем углу чарта с действиями (print, export\r\n * SVG/PNG, сброс brush). `true` — дефолтный набор; `ChartAction[]` —\r\n * кастомный. По умолчанию выключено.\r\n */\r\n actions?: ChartActionsProp\r\n /**\r\n * Базовое имя файла без расширения для экспортов SVG / PNG / print.\r\n * @default 'chart'\r\n */\r\n fileName?: string\r\n /**\r\n * Контекстное меню (правая кнопка) по элементу серии: line-segment,\r\n * marker, bar, area-path. Если задано — браузерное меню блокируется\r\n * `event.preventDefault()`.\r\n */\r\n onSeriesContextMenu?: ChartSeriesContextMenuHandler\r\n /**\r\n * Контекстное меню (правая кнопка) по плот-области чарта (вне серий).\r\n * Если задано — браузерное меню блокируется `event.preventDefault()`.\r\n */\r\n onChartContextMenu?: ChartContextMenuHandler\r\n}\r\n\r\n/** Default colour palette — uses tokens so charts re-theme without code changes. */\r\nexport const DEFAULT_PALETTE = [\r\n 'var(--sg-color-primary)',\r\n 'var(--sg-color-success)',\r\n 'var(--sg-color-warning)',\r\n 'var(--sg-color-error)',\r\n 'var(--sg-blue-4)',\r\n 'var(--sg-orange-5)',\r\n 'var(--sg-green-5)',\r\n 'var(--sg-red-5)',\r\n] as const\r\n\r\nexport function colorForSeries(series: ChartSeries, index: number): string {\r\n return series.color ?? DEFAULT_PALETTE[index % DEFAULT_PALETTE.length]!\r\n}\r\n\r\nexport function normalizePadding(p: BaseChartProps['padding']): [number, number, number, number] {\r\n if (p === undefined) return [16, 16, 24, 32]\r\n if (typeof p === 'number') return [p, p, p, p]\r\n return [...p]\r\n}\r\n\r\nexport function chartBounds(values: readonly (readonly ChartValue[])[]): { min: number; max: number } {\r\n let min = Infinity\r\n let max = -Infinity\r\n for (const row of values) {\r\n for (const v of row) {\r\n if (v === null || v === undefined) continue\r\n if (v < min) min = v\r\n if (v > max) max = v\r\n }\r\n }\r\n if (!Number.isFinite(min)) min = 0\r\n if (!Number.isFinite(max)) max = 0\r\n if (min === max) {\r\n if (min === 0) max = 1\r\n else {\r\n min = Math.min(0, min)\r\n }\r\n }\r\n return { min, max }\r\n}\r\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 normalizePadding,\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 const [pt, pr, pb, pl] = normalizePadding(padding)\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 { min, max } = useMemo(() => chartBounds(series.map((s) => s.values)), [series])\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 normalizePadding,\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 const [pt, pr, pb, pl] = normalizePadding(padding)\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 { 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 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 normalizePadding,\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 const [pt, pr, pb, pl] = normalizePadding(padding)\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 // 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 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, { forwardRef, useImperativeHandle, useCallback, useRef, useMemo, useState } from 'react'\nimport { useVirtualScroll } from '../../../hooks/useVirtualScroll'\nimport { Spin } from '../../ui/Spin'\nimport { Checkbox } from '../../ui/Checkbox'\nimport { useDataGridState } from './useDataGridState'\nimport type {\n DataGridProps,\n DataGridRef,\n CellPosition,\n CellValue,\n DataGridColumn,\n CellEditorProps,\n DataGridContextMenuItem,\n} from './types'\n\nconst cls = {\n root: 'sg-datagrid',\n header: 'sg-datagrid-header',\n headerCell: 'sg-datagrid-header-cell',\n body: 'sg-datagrid-body',\n row: 'sg-datagrid-row',\n rowEven: 'sg-datagrid-row--even',\n rowOdd: 'sg-datagrid-row--odd',\n rowHoverable: 'sg-datagrid-row--hoverable',\n rowSelected: 'sg-datagrid-row--selected',\n cell: 'sg-datagrid-cell',\n cellActive: 'sg-datagrid-cell--active',\n cellEditing: 'sg-datagrid-cell--editing',\n cellSelected: 'sg-datagrid-cell--selected',\n frozen: 'sg-datagrid-cell--frozen',\n sortable: 'sg-datagrid-header-cell--sortable',\n sortAsc: 'sg-datagrid-header-cell--asc',\n sortDesc: 'sg-datagrid-header-cell--desc',\n resizer: 'sg-datagrid-resizer',\n empty: 'sg-datagrid-empty',\n summary: 'sg-datagrid-summary',\n summaryRow: 'sg-datagrid-summary-row',\n summaryCell: 'sg-datagrid-summary-cell',\n contextMenu: 'sg-datagrid-context-menu',\n contextMenuItem: 'sg-datagrid-context-menu-item',\n contextMenuDanger: 'sg-datagrid-context-menu-item--danger',\n contextMenuDisabled: 'sg-datagrid-context-menu-item--disabled',\n contextMenuDivider: 'sg-datagrid-context-menu-divider',\n loading: 'sg-datagrid-loading',\n selectionCell: 'sg-datagrid-selection-cell',\n rowNumberCell: 'sg-datagrid-row-number-cell',\n headerDragOver: 'sg-datagrid-header-cell--drag-over',\n}\n\nconst SELECTION_COL_WIDTH = 40\nconst ROW_NUMBER_COL_WIDTH = 48\n\nfunction DefaultEditor({ value, onChange, onCommit, onCancel }: CellEditorProps) {\n return (\n <input\n autoFocus\n defaultValue={value == null ? '' : String(value)}\n onChange={(e) => onChange(e.target.value)}\n onBlur={onCommit}\n onKeyDown={(e) => {\n if (e.key === 'Enter') onCommit()\n if (e.key === 'Escape') onCancel()\n }}\n style={{\n width: '100%',\n height: '100%',\n border: 'none',\n outline: 'none',\n padding: '0 8px',\n background: 'transparent',\n font: 'inherit',\n }}\n />\n )\n}\n\nfunction isCellInRange(row: number, col: number, range: { start: CellPosition; end: CellPosition } | null): boolean {\n if (!range) return false\n const minRow = Math.min(range.start.row, range.end.row)\n const maxRow = Math.max(range.start.row, range.end.row)\n const minCol = Math.min(range.start.col, range.end.col)\n const maxCol = Math.max(range.start.col, range.end.col)\n return row >= minRow && row <= maxRow && col >= minCol && col <= maxCol\n}\n\nfunction ContextMenuPopup({\n items,\n position,\n onClose,\n}: {\n items: DataGridContextMenuItem[]\n position: { x: number; y: number }\n onClose: () => void\n}) {\n const ref = useRef<HTMLDivElement>(null)\n\n React.useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) onClose()\n }\n document.addEventListener('mousedown', handler)\n return () => document.removeEventListener('mousedown', handler)\n }, [onClose])\n\n // Only the coordinates are runtime-computed; visuals (z-index, padding,\n // colours, hover, danger/disabled state) live in\n // `packages/styles/components/context-menu.css` under\n // `.sg-datagrid-context-menu*`.\n return (\n <div\n ref={ref}\n className={cls.contextMenu}\n style={{ position: 'fixed', top: position.y, left: position.x }}\n >\n {items.map((item) =>\n item.divider ? (\n <div key={item.key} className={cls.contextMenuDivider} />\n ) : (\n <div\n key={item.key}\n className={[\n cls.contextMenuItem,\n item.danger ? cls.contextMenuDanger : '',\n item.disabled ? cls.contextMenuDisabled : '',\n ].filter(Boolean).join(' ')}\n onClick={() => {\n if (!item.disabled) {\n item.onClick()\n onClose()\n }\n }}\n >\n {item.label}\n </div>\n ),\n )}\n </div>\n )\n}\n\nfunction DataGridInner<R extends Record<string, unknown>>(\n props: DataGridProps<R>,\n ref: React.ForwardedRef<DataGridRef>,\n) {\n const {\n columns,\n data,\n rowKey,\n rowHeight = 36,\n headerHeight = 40,\n width = '100%',\n height = 400,\n className,\n style,\n onCellEdit,\n sortColumn,\n sortDirection,\n onSort,\n onCopy,\n onPaste,\n overscan = 5,\n locale,\n rowSelection,\n selectedRows,\n onSelectedRowsChange,\n striped,\n highlightOnHover = true,\n showRowNumber,\n summaryRows,\n cellClassName,\n cellStyle: cellStyleFn,\n columnReorder,\n onColumnOrderChange,\n onContextMenu,\n onRowClick,\n onRowDoubleClick,\n rowClassName,\n loading,\n emptyContent,\n } = props\n\n const containerRef = useRef<HTMLDivElement>(null)\n\n const state = useDataGridState(columns, data)\n const {\n activeCell,\n setActiveCell,\n editingCell,\n startEditing,\n stopEditing,\n editValueRef,\n selection,\n navigate,\n resizeColumn,\n getColumnWidth,\n columnOrder,\n reorderColumns,\n dragColumnRef,\n } = state\n\n const [ctxMenu, setCtxMenu] = useState<{\n items: DataGridContextMenuItem[]\n position: { x: number; y: number }\n } | null>(null)\n\n const [dragOverCol, setDragOverCol] = useState<string | null>(null)\n\n const { range, containerRef: scrollRef, scrollToIndex } = useVirtualScroll({\n itemCount: data.length,\n itemHeight: rowHeight,\n overscan,\n })\n\n const getRowKey = useCallback(\n (row: R, index: number): React.Key => {\n if (typeof rowKey === 'function') return rowKey(row, index)\n return row[rowKey] as React.Key\n },\n [rowKey],\n )\n\n const frozenLeft = useMemo(\n () => columns.filter((c) => c.frozen === 'left'),\n [columns],\n )\n const frozenRight = useMemo(\n () => columns.filter((c) => c.frozen === 'right'),\n [columns],\n )\n const scrollable = useMemo(\n () => columns.filter((c) => !c.frozen),\n [columns],\n )\n\n const orderedColumns = useMemo(() => {\n const base = [...frozenLeft, ...scrollable, ...frozenRight]\n if (!columnOrder) return base\n const map = new Map(base.map((c) => [c.key, c]))\n const ordered: DataGridColumn<R>[] = []\n for (const key of columnOrder) {\n const col = map.get(key)\n if (col) ordered.push(col)\n }\n for (const col of base) {\n if (!columnOrder.includes(col.key)) ordered.push(col)\n }\n return ordered\n }, [frozenLeft, scrollable, frozenRight, columnOrder])\n\n const extraColsWidth = (rowSelection ? SELECTION_COL_WIDTH : 0) + (showRowNumber ? ROW_NUMBER_COL_WIDTH : 0)\n\n const totalWidth = useMemo(\n () => orderedColumns.reduce((sum, col) => sum + getColumnWidth(col.key), 0) + extraColsWidth,\n [orderedColumns, getColumnWidth, extraColsWidth],\n )\n\n const allSelected = useMemo(() => {\n if (!selectedRows || data.length === 0) return false\n return data.every((row, i) => selectedRows.has(getRowKey(row, i)))\n }, [selectedRows, data, getRowKey])\n\n const someSelected = useMemo(() => {\n if (!selectedRows || data.length === 0) return false\n const count = data.filter((row, i) => selectedRows.has(getRowKey(row, i))).length\n return count > 0 && count < data.length\n }, [selectedRows, data, getRowKey])\n\n const handleSelectAll = useCallback(() => {\n if (!onSelectedRowsChange) return\n if (allSelected) {\n onSelectedRowsChange(new Set())\n } else {\n const all = new Set<React.Key>(data.map((row, i) => getRowKey(row, i)))\n onSelectedRowsChange(all)\n }\n }, [allSelected, data, getRowKey, onSelectedRowsChange])\n\n const handleSelectRow = useCallback(\n (row: R, index: number) => {\n if (!onSelectedRowsChange || !selectedRows) return\n const key = getRowKey(row, index)\n const next = new Set(selectedRows)\n if (next.has(key)) next.delete(key)\n else next.add(key)\n onSelectedRowsChange(next)\n },\n [getRowKey, onSelectedRowsChange, selectedRows],\n )\n\n const handleCellClick = useCallback(\n (rowIndex: number, colIndex: number) => {\n if (editingCell) {\n if (onCellEdit && editValueRef.current !== undefined) {\n onCellEdit(editingCell.row, orderedColumns[editingCell.col].key, editValueRef.current)\n }\n stopEditing()\n }\n setActiveCell({ row: rowIndex, col: colIndex })\n },\n [editingCell, onCellEdit, editValueRef, orderedColumns, stopEditing, setActiveCell],\n )\n\n const handleCellDoubleClick = useCallback(\n (rowIndex: number, colIndex: number) => {\n startEditing({ row: rowIndex, col: colIndex })\n },\n [startEditing],\n )\n\n const handleCommitEdit = useCallback(() => {\n if (editingCell && onCellEdit && editValueRef.current !== undefined) {\n onCellEdit(editingCell.row, orderedColumns[editingCell.col].key, editValueRef.current)\n }\n stopEditing()\n }, [editingCell, onCellEdit, editValueRef, orderedColumns, stopEditing])\n\n const handleCancelEdit = useCallback(() => {\n stopEditing()\n }, [stopEditing])\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (!activeCell) return\n\n if (editingCell) return\n\n switch (e.key) {\n case 'ArrowUp':\n e.preventDefault()\n navigate(activeCell, 'up', e.shiftKey)\n break\n case 'ArrowDown':\n e.preventDefault()\n navigate(activeCell, 'down', e.shiftKey)\n break\n case 'ArrowLeft':\n e.preventDefault()\n navigate(activeCell, 'left', e.shiftKey)\n break\n case 'ArrowRight':\n e.preventDefault()\n navigate(activeCell, 'right', e.shiftKey)\n break\n case 'Enter':\n e.preventDefault()\n startEditing(activeCell)\n break\n case 'Tab':\n e.preventDefault()\n navigate(activeCell, e.shiftKey ? 'left' : 'right')\n break\n case 'Escape':\n setActiveCell(null)\n break\n case ' ':\n if (rowSelection && selectedRows) {\n e.preventDefault()\n const row = data[activeCell.row]\n if (row) handleSelectRow(row, activeCell.row)\n }\n break\n case 'a':\n if ((e.ctrlKey || e.metaKey) && rowSelection) {\n e.preventDefault()\n handleSelectAll()\n }\n break\n case 'c':\n if ((e.ctrlKey || e.metaKey) && onCopy) {\n e.preventDefault()\n const col = orderedColumns[activeCell.col]\n const val = data[activeCell.row]?.[col.key]\n onCopy(val == null ? '' : String(val))\n }\n break\n case 'v':\n if ((e.ctrlKey || e.metaKey) && onPaste) {\n e.preventDefault()\n navigator.clipboard?.readText().then((text) => {\n onPaste(text, activeCell)\n })\n }\n break\n }\n },\n [activeCell, editingCell, navigate, startEditing, setActiveCell, onCopy, onPaste,\n orderedColumns, data, rowSelection, selectedRows, handleSelectRow, handleSelectAll],\n )\n\n const handleSort = useCallback(\n (col: DataGridColumn<R>) => {\n if (!col.sortable || !onSort) return\n const dir = sortColumn === col.key && sortDirection === 'asc' ? 'desc' : 'asc'\n onSort(col.key, dir)\n },\n [sortColumn, sortDirection, onSort],\n )\n\n const handleCellContextMenu = useCallback(\n (e: React.MouseEvent, rowIndex: number, col: DataGridColumn<R>) => {\n if (!onContextMenu) return\n e.preventDefault()\n const row = data[rowIndex]\n if (!row) return\n const items = onContextMenu(rowIndex, col.key, row)\n if (items.length === 0) return\n setCtxMenu({ items, position: { x: e.clientX, y: e.clientY } })\n },\n [onContextMenu, data],\n )\n\n const handleHeaderDragStart = useCallback(\n (e: React.DragEvent, colKey: string) => {\n if (!columnReorder) return\n dragColumnRef.current = colKey\n e.dataTransfer.effectAllowed = 'move'\n },\n [columnReorder, dragColumnRef],\n )\n\n const handleHeaderDragOver = useCallback(\n (e: React.DragEvent, colKey: string) => {\n if (!columnReorder || !dragColumnRef.current) return\n e.preventDefault()\n setDragOverCol(colKey)\n },\n [columnReorder, dragColumnRef],\n )\n\n const handleHeaderDrop = useCallback(\n (e: React.DragEvent, colKey: string) => {\n e.preventDefault()\n if (!columnReorder || !dragColumnRef.current) return\n const newOrder = reorderColumns(dragColumnRef.current, colKey)\n dragColumnRef.current = null\n setDragOverCol(null)\n onColumnOrderChange?.(newOrder)\n },\n [columnReorder, dragColumnRef, reorderColumns, onColumnOrderChange],\n )\n\n const handleHeaderDragEnd = useCallback(() => {\n dragColumnRef.current = null\n setDragOverCol(null)\n }, [dragColumnRef])\n\n useImperativeHandle(\n ref,\n () => ({\n scrollToRow: scrollToIndex,\n scrollToColumn: () => {},\n getActiveCell: () => activeCell,\n setActiveCell,\n }),\n [scrollToIndex, activeCell, setActiveCell],\n )\n\n const handleResizeStart = useCallback(\n (colKey: string, startX: number) => {\n const startWidth = getColumnWidth(colKey)\n\n const onMouseMove = (e: MouseEvent) => {\n const delta = e.clientX - startX\n resizeColumn(colKey, startWidth + delta)\n }\n const onMouseUp = () => {\n document.removeEventListener('mousemove', onMouseMove)\n document.removeEventListener('mouseup', onMouseUp)\n }\n document.addEventListener('mousemove', onMouseMove)\n document.addEventListener('mouseup', onMouseUp)\n },\n [getColumnWidth, resizeColumn],\n )\n\n const renderCell = useCallback(\n (row: R, rowIndex: number, col: DataGridColumn<R>, colIndex: number) => {\n const isActive = activeCell?.row === rowIndex && activeCell?.col === colIndex\n const isEditing = editingCell?.row === rowIndex && editingCell?.col === colIndex\n const isSelected = isCellInRange(rowIndex, colIndex, selection)\n\n const rawValue = col.formula\n ? col.formula(row)\n : (row[col.key] as CellValue)\n\n const extraClass = cellClassName?.(rawValue, row, rowIndex, col) ?? ''\n const extraStyle = cellStyleFn?.(rawValue, row, rowIndex, col)\n\n const cellClassNames = [\n cls.cell,\n isActive ? cls.cellActive : '',\n isEditing ? cls.cellEditing : '',\n isSelected ? cls.cellSelected : '',\n col.frozen ? cls.frozen : '',\n col.className ?? '',\n extraClass,\n ]\n .filter(Boolean)\n .join(' ')\n\n const baseCellStyle: React.CSSProperties = {\n width: getColumnWidth(col.key),\n minWidth: getColumnWidth(col.key),\n textAlign: col.align ?? 'left',\n ...extraStyle,\n }\n\n return (\n <div\n key={col.key}\n className={cellClassNames}\n style={baseCellStyle}\n onClick={() => handleCellClick(rowIndex, colIndex)}\n onDoubleClick={() => handleCellDoubleClick(rowIndex, colIndex)}\n onContextMenu={(e) => handleCellContextMenu(e, rowIndex, col)}\n role=\"gridcell\"\n aria-colindex={colIndex + 1 + (rowSelection ? 1 : 0) + (showRowNumber ? 1 : 0)}\n aria-selected={isActive || isSelected}\n >\n {isEditing ? (\n (col.editor ?? (DefaultEditor as (props: CellEditorProps<R>) => React.ReactNode))({\n value: rawValue,\n row,\n rowIndex,\n column: col,\n onChange: (v) => {\n editValueRef.current = v\n },\n onCommit: handleCommitEdit,\n onCancel: handleCancelEdit,\n })\n ) : col.render ? (\n col.render(rawValue, row, rowIndex)\n ) : (\n <span>{rawValue == null ? '' : String(rawValue)}</span>\n )}\n </div>\n )\n },\n [\n activeCell, editingCell, selection, getColumnWidth,\n handleCellClick, handleCellDoubleClick, handleCommitEdit,\n handleCancelEdit, editValueRef, cellClassName, cellStyleFn,\n handleCellContextMenu, rowSelection, showRowNumber,\n ],\n )\n\n const heightValue = typeof height === 'number' ? height : undefined\n const bodyHeight = heightValue ? heightValue - headerHeight : undefined\n\n const rootCls = [\n cls.root,\n striped ? 'sg-datagrid--striped' : '',\n loading ? 'sg-datagrid--loading' : '',\n className ?? '',\n ].filter(Boolean).join(' ')\n\n return (\n <div\n ref={containerRef}\n className={rootCls}\n style={{ width, height, display: 'flex', flexDirection: 'column', position: 'relative', ...style }}\n onKeyDown={handleKeyDown}\n tabIndex={0}\n role=\"grid\"\n aria-rowcount={data.length}\n aria-colcount={orderedColumns.length}\n >\n {/* Header */}\n <div\n className={cls.header}\n style={{\n display: 'flex',\n height: headerHeight,\n minHeight: headerHeight,\n minWidth: totalWidth,\n }}\n role=\"row\"\n >\n {rowSelection && (\n <div\n className={`${cls.headerCell} ${cls.selectionCell}`}\n style={{ width: SELECTION_COL_WIDTH, minWidth: SELECTION_COL_WIDTH, display: 'flex', alignItems: 'center', justifyContent: 'center' }}\n role=\"columnheader\"\n >\n <Checkbox\n checked={allSelected}\n indeterminate={someSelected}\n onChange={handleSelectAll}\n />\n </div>\n )}\n {showRowNumber && (\n <div\n className={`${cls.headerCell} ${cls.rowNumberCell}`}\n style={{ width: ROW_NUMBER_COL_WIDTH, minWidth: ROW_NUMBER_COL_WIDTH, display: 'flex', alignItems: 'center', justifyContent: 'center', userSelect: 'none' }}\n role=\"columnheader\"\n >\n #\n </div>\n )}\n {orderedColumns.map((col) => {\n const isSorted = sortColumn === col.key\n const headerCls = [\n cls.headerCell,\n col.sortable ? cls.sortable : '',\n isSorted && sortDirection === 'asc' ? cls.sortAsc : '',\n isSorted && sortDirection === 'desc' ? cls.sortDesc : '',\n col.headerClassName ?? '',\n dragOverCol === col.key ? cls.headerDragOver : '',\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <div\n key={col.key}\n className={headerCls}\n style={{\n width: getColumnWidth(col.key),\n minWidth: getColumnWidth(col.key),\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n padding: '0 8px',\n cursor: col.sortable ? 'pointer' : 'default',\n userSelect: 'none',\n }}\n onClick={() => handleSort(col)}\n draggable={!!columnReorder}\n onDragStart={(e) => handleHeaderDragStart(e, col.key)}\n onDragOver={(e) => handleHeaderDragOver(e, col.key)}\n onDrop={(e) => handleHeaderDrop(e, col.key)}\n onDragEnd={handleHeaderDragEnd}\n onDragLeave={() => setDragOverCol(null)}\n role=\"columnheader\"\n >\n {col.title}\n {isSorted && (\n <span style={{ marginLeft: 4, fontSize: 10 }}>\n {sortDirection === 'asc' ? '▲' : '▼'}\n </span>\n )}\n {col.resizable !== false && (\n <div\n className={cls.resizer}\n style={{\n position: 'absolute',\n right: 0,\n top: 0,\n bottom: 0,\n width: 4,\n cursor: 'col-resize',\n }}\n onMouseDown={(e) => {\n e.stopPropagation()\n handleResizeStart(col.key, e.clientX)\n }}\n />\n )}\n </div>\n )\n })}\n </div>\n\n {/* Body */}\n <div\n ref={scrollRef as React.RefObject<HTMLDivElement>}\n className={cls.body}\n style={{\n flex: 1,\n overflow: 'auto',\n position: 'relative',\n height: bodyHeight,\n }}\n >\n {data.length === 0 ? (\n <div className={cls.empty} style={{ padding: 24, textAlign: 'center' }}>\n {emptyContent ?? locale?.noData ?? 'No data'}\n </div>\n ) : (\n <div style={{ height: range.totalHeight, position: 'relative', minWidth: totalWidth }}>\n {range.visibleItems.map((vi) => {\n const row = data[vi.index]\n if (!row) return null\n const rKey = getRowKey(row, vi.index)\n const isRowSelected = selectedRows?.has(rKey) ?? false\n const rowExtraClass = typeof rowClassName === 'function' ? rowClassName(row, vi.index) : (rowClassName ?? '')\n\n const rowCls = [\n cls.row,\n striped ? (vi.index % 2 === 0 ? cls.rowEven : cls.rowOdd) : '',\n highlightOnHover ? cls.rowHoverable : '',\n isRowSelected ? cls.rowSelected : '',\n rowExtraClass,\n ].filter(Boolean).join(' ')\n\n return (\n <div\n key={rKey}\n className={rowCls}\n style={{\n display: 'flex',\n position: 'absolute',\n top: vi.offsetTop,\n height: vi.height,\n width: '100%',\n }}\n role=\"row\"\n aria-rowindex={vi.index + 1}\n aria-selected={isRowSelected}\n onClick={() => onRowClick?.(row, vi.index)}\n onDoubleClick={() => onRowDoubleClick?.(row, vi.index)}\n >\n {rowSelection && (\n <div\n className={`${cls.cell} ${cls.selectionCell}`}\n style={{ width: SELECTION_COL_WIDTH, minWidth: SELECTION_COL_WIDTH, display: 'flex', alignItems: 'center', justifyContent: 'center' }}\n onClick={(e) => e.stopPropagation()}\n >\n <Checkbox\n checked={isRowSelected}\n onChange={() => handleSelectRow(row, vi.index)}\n />\n </div>\n )}\n {showRowNumber && (\n <div\n className={`${cls.cell} ${cls.rowNumberCell}`}\n style={{ width: ROW_NUMBER_COL_WIDTH, minWidth: ROW_NUMBER_COL_WIDTH, display: 'flex', alignItems: 'center', justifyContent: 'center', color: 'var(--sg-text-tertiary, #999)' }}\n >\n {vi.index + 1}\n </div>\n )}\n {orderedColumns.map((col, ci) => renderCell(row, vi.index, col, ci))}\n </div>\n )\n })}\n </div>\n )}\n </div>\n\n {/* Summary Footer */}\n {summaryRows && summaryRows.length > 0 && data.length > 0 && (\n <div className={cls.summary} style={{ minWidth: totalWidth }}>\n {summaryRows.map((sr, sri) => (\n <div\n key={sri}\n className={`${cls.summaryRow} ${sr.className ?? ''}`}\n style={{ display: 'flex', height: rowHeight }}\n >\n {rowSelection && (\n <div className={`${cls.summaryCell}`} style={{ width: SELECTION_COL_WIDTH, minWidth: SELECTION_COL_WIDTH }} />\n )}\n {showRowNumber && (\n <div className={`${cls.summaryCell}`} style={{ width: ROW_NUMBER_COL_WIDTH, minWidth: ROW_NUMBER_COL_WIDTH }} />\n )}\n {orderedColumns.map((col) => (\n <div\n key={col.key}\n className={cls.summaryCell}\n style={{\n width: getColumnWidth(col.key),\n minWidth: getColumnWidth(col.key),\n textAlign: col.align ?? 'left',\n }}\n >\n {sr.render(col.key, data)}\n </div>\n ))}\n </div>\n ))}\n </div>\n )}\n\n {/* Context Menu */}\n {ctxMenu && (\n <ContextMenuPopup\n items={ctxMenu.items}\n position={ctxMenu.position}\n onClose={() => setCtxMenu(null)}\n />\n )}\n\n {/* Loading */}\n {loading && (\n <div className={cls.loading} style={{ position: 'absolute', inset: 0, display: 'flex', alignItems: 'center', justifyContent: 'center', background: 'rgba(255,255,255,0.6)', zIndex: 10 }}>\n <Spin size=\"large\" />\n </div>\n )}\n </div>\n )\n}\n\n/**\n * Virtualized table grid with sortable headers, resizable columns, inline editing,\n * row selection, striped rows, summary footer, context menu, column reorder, and clipboard hooks.\n */\nexport const DataGrid = forwardRef(DataGridInner) as <R extends Record<string, unknown>>(\n props: DataGridProps<R> & { ref?: React.Ref<DataGridRef> },\n) => React.ReactElement\n","import { useState, useCallback, useRef } from 'react'\nimport type { CellPosition, CellRange, CellValue, DataGridColumn } from './types'\n\n/**\n * Holds active cell, edit session, range selection, column width, and column order state for `DataGrid`.\n */\nexport function useDataGridState<R>(columns: DataGridColumn<R>[], data: R[]) {\n const [activeCell, setActiveCell] = useState<CellPosition | null>(null)\n const [editingCell, setEditingCell] = useState<CellPosition | null>(null)\n const [selection, setSelection] = useState<CellRange | null>(null)\n const [columnWidths, setColumnWidths] = useState<Map<string, number>>(() => {\n const map = new Map<string, number>()\n for (const col of columns) {\n if (col.width) map.set(col.key, col.width)\n }\n return map\n })\n const [columnOrder, setColumnOrder] = useState<string[] | null>(null)\n\n const editValueRef = useRef<CellValue>(undefined)\n const dragColumnRef = useRef<string | null>(null)\n\n const startEditing = useCallback(\n (pos: CellPosition) => {\n const col = columns[pos.col]\n if (!col) return\n\n const isEditable =\n typeof col.editable === 'function'\n ? col.editable(data[pos.row], pos.row)\n : col.editable !== false\n\n if (!isEditable) return\n\n editValueRef.current = (data[pos.row] as Record<string, unknown>)[col.key] as CellValue\n setEditingCell(pos)\n },\n [columns, data],\n )\n\n const stopEditing = useCallback(() => {\n setEditingCell(null)\n editValueRef.current = undefined\n }, [])\n\n const navigate = useCallback(\n (\n from: CellPosition,\n direction: 'up' | 'down' | 'left' | 'right',\n shiftKey = false,\n ): CellPosition => {\n let { row, col } = from\n switch (direction) {\n case 'up':\n row = Math.max(0, row - 1)\n break\n case 'down':\n row = Math.min(data.length - 1, row + 1)\n break\n case 'left':\n col = Math.max(0, col - 1)\n break\n case 'right':\n col = Math.min(columns.length - 1, col + 1)\n break\n }\n const next = { row, col }\n\n if (shiftKey) {\n setSelection((prev) => ({\n start: prev?.start ?? from,\n end: next,\n }))\n } else {\n setSelection(null)\n }\n\n setActiveCell(next)\n return next\n },\n [data.length, columns.length],\n )\n\n const resizeColumn = useCallback(\n (key: string, width: number) => {\n const col = columns.find((c) => c.key === key)\n const minW = col?.minWidth ?? 50\n const maxW = col?.maxWidth ?? Infinity\n const clamped = Math.max(minW, Math.min(maxW, width))\n setColumnWidths((prev) => new Map(prev).set(key, clamped))\n },\n [columns],\n )\n\n const getColumnWidth = useCallback(\n (key: string): number => {\n return columnWidths.get(key) ?? columns.find((c) => c.key === key)?.width ?? 120\n },\n [columnWidths, columns],\n )\n\n const reorderColumns = useCallback(\n (fromKey: string, toKey: string) => {\n const order = columnOrder ?? columns.map((c) => c.key)\n const fromIdx = order.indexOf(fromKey)\n const toIdx = order.indexOf(toKey)\n if (fromIdx === -1 || toIdx === -1 || fromIdx === toIdx) return order\n const next = [...order]\n const [moved] = next.splice(fromIdx, 1)\n next.splice(toIdx, 0, moved)\n setColumnOrder(next)\n return next\n },\n [columnOrder, columns],\n )\n\n return {\n activeCell,\n setActiveCell,\n editingCell,\n startEditing,\n stopEditing,\n editValueRef,\n selection,\n setSelection,\n navigate,\n resizeColumn,\n getColumnWidth,\n columnOrder,\n setColumnOrder,\n reorderColumns,\n dragColumnRef,\n }\n}\n","import React from 'react'\r\nimport { Spin } from '../../ui/Spin'\r\nimport { Pagination } from '../../ui/Pagination'\r\nimport { Empty } from '../../ui/Empty'\r\nimport type { ListProps, ListItemProps, ListItemMetaProps } from './types'\r\n\r\nfunction cls(...parts: (string | false | undefined | null)[]): string {\r\n return parts.filter(Boolean).join(' ')\r\n}\r\n\r\nfunction ListItemMeta({ avatar, title, description }: ListItemMetaProps) {\r\n return (\r\n <div className=\"sg-list-item-meta\">\r\n {avatar && <div className=\"sg-list-item-meta-avatar\">{avatar}</div>}\r\n <div className=\"sg-list-item-meta-content\">\r\n {title && <h4 className=\"sg-list-item-meta-title\">{title}</h4>}\r\n {description && <div className=\"sg-list-item-meta-description\">{description}</div>}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nfunction ListItemComponent({ children, actions, extra, className, style }: ListItemProps) {\r\n return (\r\n <div className={cls('sg-list-item', className)} style={style}>\r\n <div className=\"sg-list-item-main\">\r\n <div className=\"sg-list-item-content\">{children}</div>\r\n {actions && actions.length > 0 && (\r\n <ul className=\"sg-list-item-actions\">\r\n {actions.map((action, i) => (\r\n <li key={i} className=\"sg-list-item-action\">\r\n {action}\r\n </li>\r\n ))}\r\n </ul>\r\n )}\r\n </div>\r\n {extra && <div className=\"sg-list-item-extra\">{extra}</div>}\r\n </div>\r\n )\r\n}\r\n\r\ntype ListItemType = typeof ListItemComponent & { Meta: typeof ListItemMeta }\r\n\r\nconst Item = ListItemComponent as ListItemType\r\nItem.Meta = ListItemMeta\r\n\r\nfunction ListInner<T = any>({\r\n dataSource,\r\n renderItem,\r\n header,\r\n footer,\r\n loading = false,\r\n loadMore,\r\n pagination,\r\n grid,\r\n size = 'default',\r\n split = true,\r\n bordered = false,\r\n locale,\r\n className,\r\n style,\r\n unstyled,\r\n virtual,\r\n selectable,\r\n selectedKeys: controlledSelectedKeys,\r\n defaultSelectedKeys,\r\n onSelectionChange,\r\n multiSelect = false,\r\n draggable,\r\n onReorder,\r\n hoverable = true,\r\n onItemClick,\r\n rowClassName,\r\n classNames: slotCls,\r\n styles: slotSty,\r\n}: ListProps<T>) {\r\n const sCls = slotCls ?? {}\r\n const sSty = slotSty ?? {}\r\n const [internalPage, setInternalPage] = React.useState(1)\r\n const [internalSelectedKeys, setInternalSelectedKeys] = React.useState<number[]>(\r\n () => defaultSelectedKeys ?? [],\r\n )\r\n const [dragIndex, setDragIndex] = React.useState<number | null>(null)\r\n const [dropIndex, setDropIndex] = React.useState<number | null>(null)\r\n const [scrollTop, setScrollTop] = React.useState(0)\r\n const virtualRef = React.useRef<HTMLDivElement>(null)\r\n\r\n const selectedKeys = controlledSelectedKeys ?? internalSelectedKeys\r\n\r\n const pageSize = pagination ? (pagination.pageSize ?? 10) : dataSource.length\r\n const currentPage = pagination ? (pagination.current ?? internalPage) : 1\r\n const total = pagination ? (pagination.total ?? dataSource.length) : dataSource.length\r\n\r\n const paginatedData = React.useMemo(() => {\r\n if (!pagination) return dataSource\r\n const start = (currentPage - 1) * pageSize\r\n return dataSource.slice(start, start + pageSize)\r\n }, [dataSource, pagination, currentPage, pageSize])\r\n\r\n const handlePageChange = (page: number) => {\r\n setInternalPage(page)\r\n if (pagination) {\r\n pagination.onChange?.(page, pageSize)\r\n }\r\n }\r\n\r\n const handleItemClick = React.useCallback(\r\n (item: T, index: number, e: React.MouseEvent) => {\r\n onItemClick?.(item, index)\r\n\r\n if (!selectable) return\r\n\r\n let next: number[]\r\n if (multiSelect && (e.ctrlKey || e.metaKey)) {\r\n if (selectedKeys.includes(index)) {\r\n next = selectedKeys.filter((k) => k !== index)\r\n } else {\r\n next = [...selectedKeys, index]\r\n }\r\n } else {\r\n next = selectedKeys.includes(index) ? [] : [index]\r\n }\r\n\r\n setInternalSelectedKeys(next)\r\n onSelectionChange?.(\r\n next,\r\n next.map((k) => dataSource[k]),\r\n )\r\n },\r\n [selectable, multiSelect, selectedKeys, dataSource, onItemClick, onSelectionChange],\r\n )\r\n\r\n const handleDragStart = React.useCallback(\r\n (e: React.DragEvent, index: number) => {\r\n if (!draggable) return\r\n setDragIndex(index)\r\n e.dataTransfer.effectAllowed = 'move'\r\n },\r\n [draggable],\r\n )\r\n\r\n const handleDragOver = React.useCallback(\r\n (e: React.DragEvent, index: number) => {\r\n if (!draggable || dragIndex === null) return\r\n e.preventDefault()\r\n setDropIndex(index)\r\n },\r\n [draggable, dragIndex],\r\n )\r\n\r\n const handleDrop = React.useCallback(\r\n (e: React.DragEvent, index: number) => {\r\n e.preventDefault()\r\n if (dragIndex === null || dragIndex === index) {\r\n setDragIndex(null)\r\n setDropIndex(null)\r\n return\r\n }\r\n onReorder?.(dragIndex, index)\r\n setDragIndex(null)\r\n setDropIndex(null)\r\n },\r\n [dragIndex, onReorder],\r\n )\r\n\r\n const handleDragEnd = React.useCallback(() => {\r\n setDragIndex(null)\r\n setDropIndex(null)\r\n }, [])\r\n\r\n const handleVirtualScroll = React.useCallback(() => {\r\n if (virtualRef.current) {\r\n setScrollTop(virtualRef.current.scrollTop)\r\n }\r\n }, [])\r\n\r\n const emptyText = locale?.emptyText ?? 'No Data'\r\n\r\n const gridStyle = React.useMemo((): React.CSSProperties | undefined => {\r\n if (!grid) return undefined\r\n const cols = grid.column ?? 1\r\n // Базовое значение кладём в отдельную переменную, чтобы media-override на\r\n // корне (`--sg-list-grid-columns`) мог перебить её через наследование CSS-переменных\r\n // и не пришлось использовать `!important`.\r\n return {\r\n ['--sg-list-grid-base-columns' as string]: `repeat(${cols}, 1fr)`,\r\n gap: grid.gutter ? `${grid.gutter}px` : undefined,\r\n } as React.CSSProperties\r\n }, [grid])\r\n\r\n const gridResponsiveClass = React.useMemo(() => {\r\n if (!grid) return ''\r\n const parts: string[] = []\r\n if (grid.xs) parts.push(`sg-list-grid-xs-${grid.xs}`)\r\n if (grid.sm) parts.push(`sg-list-grid-sm-${grid.sm}`)\r\n if (grid.md) parts.push(`sg-list-grid-md-${grid.md}`)\r\n if (grid.lg) parts.push(`sg-list-grid-lg-${grid.lg}`)\r\n return parts.join(' ')\r\n }, [grid])\r\n\r\n const renderItemWrapper = React.useCallback(\r\n (item: T, index: number, extraStyle?: React.CSSProperties) => {\r\n const isSelected = selectable && selectedKeys.includes(index)\r\n const isDragging = dragIndex === index\r\n const isDropTarget = dropIndex === index && dragIndex !== index\r\n const extraCls =\r\n typeof rowClassName === 'function' ? rowClassName(item, index) : (rowClassName ?? '')\r\n\r\n const itemCls = cls(\r\n 'sg-list-item',\r\n selectable && 'sg-list-item-selectable',\r\n isSelected && 'sg-list-item-selected',\r\n hoverable && 'sg-list-item-hoverable',\r\n isDragging && 'sg-list-item-dragging',\r\n isDropTarget && 'sg-list-item-drop-target',\r\n sCls.item,\r\n extraCls,\r\n )\r\n\r\n return (\r\n <div\r\n key={index}\r\n className={itemCls || undefined}\r\n style={extraStyle ? { ...sSty.item, ...extraStyle } : sSty.item}\r\n onClick={(e) => handleItemClick(item, index, e)}\r\n draggable={draggable}\r\n onDragStart={(e) => handleDragStart(e, index)}\r\n onDragOver={(e) => handleDragOver(e, index)}\r\n onDrop={(e) => handleDrop(e, index)}\r\n onDragEnd={handleDragEnd}\r\n onDragLeave={() => setDropIndex(null)}\r\n >\r\n {draggable && <span className=\"sg-list-drag-handle\">⠿</span>}\r\n {renderItem(item, index)}\r\n </div>\r\n )\r\n },\r\n [\r\n selectable,\r\n selectedKeys,\r\n hoverable,\r\n dragIndex,\r\n dropIndex,\r\n draggable,\r\n rowClassName,\r\n handleItemClick,\r\n handleDragStart,\r\n handleDragOver,\r\n handleDrop,\r\n handleDragEnd,\r\n renderItem,\r\n sCls.item,\r\n sSty.item,\r\n ],\r\n )\r\n\r\n /**\r\n * Virtual scroll rendering.\r\n *\r\n * Каждая видимая строка позиционируется абсолютно на своём `top = index * itemHeight`\r\n * с фиксированной высотой `itemHeight`. Это даёт стабильную верстку независимо\r\n * от внутренних паддингов `.sg-list-item` и от того, оборачивает ли пользователь\r\n * содержимое в `<List.Item>` или возвращает голый `<div>`.\r\n *\r\n * Старый рендер (поток items внутри одного `position: absolute` блока) ломался,\r\n * когда фактическая высота строки не совпадала с `itemHeight` — overscan вылезал\r\n * за scroll-область, scroll-позиция не сходилась.\r\n */\r\n const renderVirtualList = React.useCallback(() => {\r\n if (!virtual) return null\r\n const { itemHeight, height, overscan = 5 } = virtual\r\n const totalHeight = paginatedData.length * itemHeight\r\n const startIndex = Math.max(0, Math.floor(scrollTop / itemHeight) - overscan)\r\n const visibleCount = Math.ceil(height / itemHeight) + overscan * 2\r\n const endIndex = Math.min(paginatedData.length, startIndex + visibleCount)\r\n\r\n return (\r\n <div\r\n ref={virtualRef}\r\n className=\"sg-list-virtual-container\"\r\n style={{ height, overflow: 'auto', position: 'relative' }}\r\n onScroll={handleVirtualScroll}\r\n >\r\n <div style={{ height: totalHeight, position: 'relative' }}>\r\n {paginatedData.slice(startIndex, endIndex).map((item, i) => {\r\n const realIndex = startIndex + i\r\n return renderItemWrapper(item, realIndex, {\r\n position: 'absolute',\r\n top: realIndex * itemHeight,\r\n left: 0,\r\n right: 0,\r\n height: itemHeight,\r\n boxSizing: 'border-box',\r\n alignItems: 'center',\r\n })\r\n })}\r\n </div>\r\n </div>\r\n )\r\n }, [virtual, paginatedData, scrollTop, handleVirtualScroll, renderItemWrapper])\r\n\r\n if (unstyled) {\r\n return (\r\n <div className={className} style={style}>\r\n {header}\r\n {loading ? (\r\n <Spin unstyled />\r\n ) : paginatedData.length === 0 ? (\r\n <div>{emptyText}</div>\r\n ) : virtual ? (\r\n renderVirtualList()\r\n ) : (\r\n <div className={grid ? 'sg-list-items' : undefined} style={gridStyle}>\r\n {paginatedData.map((item, i) => renderItemWrapper(item, i))}\r\n </div>\r\n )}\r\n {loadMore}\r\n {pagination && (\r\n <Pagination\r\n unstyled\r\n current={currentPage}\r\n total={total}\r\n pageSize={pageSize}\r\n onChange={handlePageChange}\r\n />\r\n )}\r\n {footer}\r\n </div>\r\n )\r\n }\r\n\r\n const wrapperClass = cls(\r\n 'sg-list',\r\n `sg-list-${size}`,\r\n split && 'sg-list-split',\r\n bordered && 'sg-list-bordered',\r\n loading && 'sg-list-loading',\r\n grid && 'sg-list-grid',\r\n selectable && 'sg-list-selectable',\r\n draggable && 'sg-list-draggable',\r\n virtual && 'sg-list-virtual',\r\n gridResponsiveClass,\r\n sCls.root,\r\n className,\r\n )\r\n\r\n return (\r\n <div className={wrapperClass} style={{ ...sSty.root, ...style }}>\r\n {header && (\r\n <div className={cls('sg-list-header', sCls.header)} style={sSty.header}>\r\n {header}\r\n </div>\r\n )}\r\n\r\n <Spin spinning={loading}>\r\n {paginatedData.length === 0 ? (\r\n <div className={cls('sg-list-empty', sCls.empty)} style={sSty.empty}>\r\n <Empty description={emptyText} />\r\n </div>\r\n ) : virtual ? (\r\n renderVirtualList()\r\n ) : (\r\n <div className={cls('sg-list-items', sCls.items)} style={{ ...gridStyle, ...sSty.items }}>\r\n {paginatedData.map((item, i) => renderItemWrapper(item, i))}\r\n </div>\r\n )}\r\n </Spin>\r\n\r\n {loadMore && <div className=\"sg-list-load-more\">{loadMore}</div>}\r\n\r\n {pagination && (\r\n <div className={cls('sg-list-pagination', sCls.pagination)} style={sSty.pagination}>\r\n <Pagination\r\n current={currentPage}\r\n total={total}\r\n pageSize={pageSize}\r\n onChange={handlePageChange}\r\n />\r\n </div>\r\n )}\r\n\r\n {footer && (\r\n <div className={cls('sg-list-footer', sCls.footer)} style={sSty.footer}>\r\n {footer}\r\n </div>\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\ntype ListType = typeof ListInner & { Item: ListItemType }\r\n\r\n/**\r\n * Renders a vertical or grid list with optional header, footer, pagination, loading,\r\n * virtual scroll, selection, and drag-and-drop reorder.\r\n * Use `List.Item` and `List.Item.Meta` for structured rows.\r\n */\r\nexport const List = ListInner as ListType\r\n;(List as any).Item = Item\r\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":["import_react","import_react","import_react","import_react","import_react","import_react","import_jsx_runtime","React","import_jsx_runtime","import_react","import_react","import_jsx_runtime","React","import_jsx_runtime","import_react","import_jsx_runtime","React","import_react","import_react","React","import_jsx_runtime","import_jsx_runtime","icons","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_jsx_runtime","React","items","import_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","React","import_react","import_react","import_jsx_runtime","import_jsx_runtime","React","import_jsx_runtime","items","import_react","import_jsx_runtime","import_jsx_runtime","items","React","import_react","import_core","import_jsx_runtime","import_react","import_jsx_runtime","items","import_react","import_react","import_core","import_jsx_runtime","childrenKey","aggregates","styles","import_jsx_runtime","React","import_react","import_react","import_core","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","import_react","import_react","active","import_jsx_runtime","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","items","import_react","import_jsx_runtime","React","clamp","import_react","import_jsx_runtime","isSameDay","isToday","getDaysInMonth","pad","getMonthGrid","items","cls","import_react","import_jsx_runtime","items","cls","import_react","import_jsx_runtime","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","items","React","import_react","import_jsx_runtime","items","handleClick","import_jsx_runtime","import_react","import_jsx_runtime","items","isActive","import_react","import_jsx_runtime","toArray","items","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","items","import_jsx_runtime","items","import_react","import_jsx_runtime","import_react","import_jsx_runtime","items","React","import_react","genKey","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_core","import_jsx_runtime","items","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_core","import_react","import_jsx_runtime","React","import_core","import_react","import_core","import_react","import_jsx_runtime","formatTime","import_react","import_core","import_react","import_core","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_core","import_jsx_runtime","clamp","r","import_react","import_core","import_jsx_runtime","DAY","STEP_MS","toMs","alignDown","alignUp","formatTick","deriveRange","import_react","import_jsx_runtime","toMs","import_jsx_runtime","import_react","import_jsx_runtime","cls","import_react","import_jsx_runtime","cls","import_react","import_react","import_jsx_runtime","cls","import_react","import_react","r","import_jsx_runtime","import_jsx_runtime","svg","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_react","import_jsx_runtime","SELECTION_COL_WIDTH","items","React","import_react","import_jsx_runtime","cls","React","import_react","import_react","import_jsx_runtime","cls","items","React","import_jsx_runtime","cls","React","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","pad","import_react","import_jsx_runtime","import_jsx_runtime"]}