@orcestr/ui 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +151 -0
- package/README.ru.md +151 -0
- package/assets/orcestr-banner.webp +0 -0
- package/dist/components/Action/ActionConfirmModal.d.ts +8 -0
- package/dist/components/Action/ActionConfirmModal.d.ts.map +1 -0
- package/dist/components/Action/ActionConfirmModal.js +13 -0
- package/dist/components/Action/ActionTypes.d.ts +47 -0
- package/dist/components/Action/ActionTypes.d.ts.map +1 -0
- package/dist/components/Action/ActionTypes.js +49 -0
- package/dist/components/ActionMenu/ActionMenu.d.ts +3 -0
- package/dist/components/ActionMenu/ActionMenu.d.ts.map +1 -0
- package/dist/components/ActionMenu/ActionMenu.js +1 -0
- package/dist/components/Alert/Alert.d.ts +11 -0
- package/dist/components/Alert/Alert.d.ts.map +1 -0
- package/dist/components/Alert/Alert.js +7 -0
- package/dist/components/AppShell/AppShell.d.ts +102 -0
- package/dist/components/AppShell/AppShell.d.ts.map +1 -0
- package/dist/components/AppShell/AppShell.js +96 -0
- package/dist/components/Badge/Badge.d.ts +15 -0
- package/dist/components/Badge/Badge.d.ts.map +1 -0
- package/dist/components/Badge/Badge.js +8 -0
- package/dist/components/Box/Box.d.ts +11 -0
- package/dist/components/Box/Box.d.ts.map +1 -0
- package/dist/components/Box/Box.js +8 -0
- package/dist/components/Button/Button.d.ts +27 -0
- package/dist/components/Button/Button.d.ts.map +1 -0
- package/dist/components/Button/Button.js +13 -0
- package/dist/components/Checkbox/Checkbox.d.ts +10 -0
- package/dist/components/Checkbox/Checkbox.d.ts.map +1 -0
- package/dist/components/Checkbox/Checkbox.js +15 -0
- package/dist/components/Collapse/Collapse.d.ts +11 -0
- package/dist/components/Collapse/Collapse.d.ts.map +1 -0
- package/dist/components/Collapse/Collapse.js +33 -0
- package/dist/components/Combobox/Combobox.d.ts +17 -0
- package/dist/components/Combobox/Combobox.d.ts.map +1 -0
- package/dist/components/Combobox/Combobox.js +32 -0
- package/dist/components/CommandPalette/CommandPalette.d.ts +21 -0
- package/dist/components/CommandPalette/CommandPalette.d.ts.map +1 -0
- package/dist/components/CommandPalette/CommandPalette.js +168 -0
- package/dist/components/ConfirmDialog/ConfirmDialog.d.ts +25 -0
- package/dist/components/ConfirmDialog/ConfirmDialog.d.ts.map +1 -0
- package/dist/components/ConfirmDialog/ConfirmDialog.js +25 -0
- package/dist/components/ContextMenu/ContextMenu.d.ts +11 -0
- package/dist/components/ContextMenu/ContextMenu.d.ts.map +1 -0
- package/dist/components/ContextMenu/ContextMenu.js +68 -0
- package/dist/components/DataTable/DataTable.d.ts +88 -0
- package/dist/components/DataTable/DataTable.d.ts.map +1 -0
- package/dist/components/DataTable/DataTable.js +415 -0
- package/dist/components/DataTable/DataTableStateAdapters.d.ts +41 -0
- package/dist/components/DataTable/DataTableStateAdapters.d.ts.map +1 -0
- package/dist/components/DataTable/DataTableStateAdapters.js +192 -0
- package/dist/components/DatePicker/DatePicker.d.ts +21 -0
- package/dist/components/DatePicker/DatePicker.d.ts.map +1 -0
- package/dist/components/DatePicker/DatePicker.js +39 -0
- package/dist/components/DatePicker/DatePickerState.d.ts +30 -0
- package/dist/components/DatePicker/DatePickerState.d.ts.map +1 -0
- package/dist/components/DatePicker/DatePickerState.js +106 -0
- package/dist/components/DateRangePicker/DateRangePicker.d.ts +19 -0
- package/dist/components/DateRangePicker/DateRangePicker.d.ts.map +1 -0
- package/dist/components/DateRangePicker/DateRangePicker.js +6 -0
- package/dist/components/DateRangePresetPicker/DateRangePresetPicker.d.ts +10 -0
- package/dist/components/DateRangePresetPicker/DateRangePresetPicker.d.ts.map +1 -0
- package/dist/components/DateRangePresetPicker/DateRangePresetPicker.js +26 -0
- package/dist/components/DateRangePresetPicker/DateRangePresetPickerState.d.ts +4 -0
- package/dist/components/DateRangePresetPicker/DateRangePresetPickerState.d.ts.map +1 -0
- package/dist/components/DateRangePresetPicker/DateRangePresetPickerState.js +20 -0
- package/dist/components/Dialog/Dialog.d.ts +2 -0
- package/dist/components/Dialog/Dialog.d.ts.map +1 -0
- package/dist/components/Dialog/Dialog.js +1 -0
- package/dist/components/Drawer/Drawer.d.ts +30 -0
- package/dist/components/Drawer/Drawer.d.ts.map +1 -0
- package/dist/components/Drawer/Drawer.js +83 -0
- package/dist/components/EntityPicker/EntityPicker.d.ts +41 -0
- package/dist/components/EntityPicker/EntityPicker.d.ts.map +1 -0
- package/dist/components/EntityPicker/EntityPicker.js +17 -0
- package/dist/components/Field/Field.d.ts +12 -0
- package/dist/components/Field/Field.d.ts.map +1 -0
- package/dist/components/Field/Field.js +8 -0
- package/dist/components/Flex/Flex.d.ts +9 -0
- package/dist/components/Flex/Flex.d.ts.map +1 -0
- package/dist/components/Flex/Flex.js +8 -0
- package/dist/components/Grid/Grid.d.ts +11 -0
- package/dist/components/Grid/Grid.d.ts.map +1 -0
- package/dist/components/Grid/Grid.js +12 -0
- package/dist/components/Highlight/Highlight.d.ts +27 -0
- package/dist/components/Highlight/Highlight.d.ts.map +1 -0
- package/dist/components/Highlight/Highlight.js +26 -0
- package/dist/components/IconButton/IconButton.d.ts +25 -0
- package/dist/components/IconButton/IconButton.d.ts.map +1 -0
- package/dist/components/IconButton/IconButton.js +13 -0
- package/dist/components/IconText/IconText.d.ts +12 -0
- package/dist/components/IconText/IconText.d.ts.map +1 -0
- package/dist/components/IconText/IconText.js +7 -0
- package/dist/components/Listbox/Listbox.d.ts +13 -0
- package/dist/components/Listbox/Listbox.d.ts.map +1 -0
- package/dist/components/Listbox/Listbox.js +74 -0
- package/dist/components/Menu/Menu.d.ts +14 -0
- package/dist/components/Menu/Menu.d.ts.map +1 -0
- package/dist/components/Menu/Menu.js +168 -0
- package/dist/components/Modal/Modal.d.ts +29 -0
- package/dist/components/Modal/Modal.d.ts.map +1 -0
- package/dist/components/Modal/Modal.js +155 -0
- package/dist/components/MultiSelect/MultiSelect.d.ts +21 -0
- package/dist/components/MultiSelect/MultiSelect.d.ts.map +1 -0
- package/dist/components/MultiSelect/MultiSelect.js +139 -0
- package/dist/components/NumberField/NumberField.d.ts +4 -0
- package/dist/components/NumberField/NumberField.d.ts.map +1 -0
- package/dist/components/NumberField/NumberField.js +6 -0
- package/dist/components/Overlay/OverlayProvider.d.ts +19 -0
- package/dist/components/Overlay/OverlayProvider.d.ts.map +1 -0
- package/dist/components/Overlay/OverlayProvider.js +73 -0
- package/dist/components/PaginatedCombobox/PaginatedCombobox.d.ts +48 -0
- package/dist/components/PaginatedCombobox/PaginatedCombobox.d.ts.map +1 -0
- package/dist/components/PaginatedCombobox/PaginatedCombobox.js +223 -0
- package/dist/components/PaginatedCombobox/PaginatedComboboxReactQueryAdapter.d.ts +13 -0
- package/dist/components/PaginatedCombobox/PaginatedComboboxReactQueryAdapter.d.ts.map +1 -0
- package/dist/components/PaginatedCombobox/PaginatedComboboxReactQueryAdapter.js +10 -0
- package/dist/components/Pagination/Pagination.d.ts +7 -0
- package/dist/components/Pagination/Pagination.d.ts.map +1 -0
- package/dist/components/Pagination/Pagination.js +9 -0
- package/dist/components/Popover/Popover.d.ts +19 -0
- package/dist/components/Popover/Popover.d.ts.map +1 -0
- package/dist/components/Popover/Popover.js +83 -0
- package/dist/components/Portal/Portal.d.ts +6 -0
- package/dist/components/Portal/Portal.d.ts.map +1 -0
- package/dist/components/Portal/Portal.js +23 -0
- package/dist/components/RadioGroup/RadioGroup.d.ts +14 -0
- package/dist/components/RadioGroup/RadioGroup.d.ts.map +1 -0
- package/dist/components/RadioGroup/RadioGroup.js +6 -0
- package/dist/components/ScrollArea/ScrollArea.d.ts +36 -0
- package/dist/components/ScrollArea/ScrollArea.d.ts.map +1 -0
- package/dist/components/ScrollArea/ScrollArea.js +124 -0
- package/dist/components/Section/Section.d.ts +14 -0
- package/dist/components/Section/Section.d.ts.map +1 -0
- package/dist/components/Section/Section.js +20 -0
- package/dist/components/SegmentedControl/SegmentedControl.d.ts +13 -0
- package/dist/components/SegmentedControl/SegmentedControl.d.ts.map +1 -0
- package/dist/components/SegmentedControl/SegmentedControl.js +6 -0
- package/dist/components/Select/Select.d.ts +27 -0
- package/dist/components/Select/Select.d.ts.map +1 -0
- package/dist/components/Select/Select.js +142 -0
- package/dist/components/Separator/Separator.d.ts +6 -0
- package/dist/components/Separator/Separator.d.ts.map +1 -0
- package/dist/components/Separator/Separator.js +5 -0
- package/dist/components/Skeleton/Skeleton.d.ts +9 -0
- package/dist/components/Skeleton/Skeleton.d.ts.map +1 -0
- package/dist/components/Skeleton/Skeleton.js +8 -0
- package/dist/components/Spinner/Spinner.d.ts +7 -0
- package/dist/components/Spinner/Spinner.d.ts.map +1 -0
- package/dist/components/Spinner/Spinner.js +5 -0
- package/dist/components/Stack/Stack.d.ts +9 -0
- package/dist/components/Stack/Stack.d.ts.map +1 -0
- package/dist/components/Stack/Stack.js +7 -0
- package/dist/components/State/State.d.ts +23 -0
- package/dist/components/State/State.d.ts.map +1 -0
- package/dist/components/State/State.js +30 -0
- package/dist/components/State/stateIcon.d.ts +3 -0
- package/dist/components/State/stateIcon.d.ts.map +1 -0
- package/dist/components/State/stateIcon.js +11 -0
- package/dist/components/StepperInput/StepperInput.d.ts +13 -0
- package/dist/components/StepperInput/StepperInput.d.ts.map +1 -0
- package/dist/components/StepperInput/StepperInput.js +22 -0
- package/dist/components/Switch/Switch.d.ts +10 -0
- package/dist/components/Switch/Switch.d.ts.map +1 -0
- package/dist/components/Switch/Switch.js +14 -0
- package/dist/components/Tabs/Tabs.d.ts +18 -0
- package/dist/components/Tabs/Tabs.d.ts.map +1 -0
- package/dist/components/Tabs/Tabs.js +104 -0
- package/dist/components/Text/Text.d.ts +13 -0
- package/dist/components/Text/Text.d.ts.map +1 -0
- package/dist/components/Text/Text.js +8 -0
- package/dist/components/TextArea/TextArea.d.ts +15 -0
- package/dist/components/TextArea/TextArea.d.ts.map +1 -0
- package/dist/components/TextArea/TextArea.js +17 -0
- package/dist/components/TextField/TextField.d.ts +25 -0
- package/dist/components/TextField/TextField.d.ts.map +1 -0
- package/dist/components/TextField/TextField.js +31 -0
- package/dist/components/Toast/Toast.d.ts +43 -0
- package/dist/components/Toast/Toast.d.ts.map +1 -0
- package/dist/components/Toast/Toast.js +205 -0
- package/dist/components/Tooltip/Tooltip.d.ts +10 -0
- package/dist/components/Tooltip/Tooltip.d.ts.map +1 -0
- package/dist/components/Tooltip/Tooltip.js +24 -0
- package/dist/components/VisuallyHidden/VisuallyHidden.d.ts +8 -0
- package/dist/components/VisuallyHidden/VisuallyHidden.d.ts.map +1 -0
- package/dist/components/VisuallyHidden/VisuallyHidden.js +6 -0
- package/dist/components/Workflow/Workflow.d.ts +82 -0
- package/dist/components/Workflow/Workflow.d.ts.map +1 -0
- package/dist/components/Workflow/Workflow.js +73 -0
- package/dist/example/CodePreview.d.ts +25 -0
- package/dist/example/CodePreview.d.ts.map +1 -0
- package/dist/example/CodePreview.js +93 -0
- package/dist/example/ExampleActionsSection.d.ts +10 -0
- package/dist/example/ExampleActionsSection.d.ts.map +1 -0
- package/dist/example/ExampleActionsSection.js +10 -0
- package/dist/example/ExampleBasicsSections.d.ts +8 -0
- package/dist/example/ExampleBasicsSections.d.ts.map +1 -0
- package/dist/example/ExampleBasicsSections.js +43 -0
- package/dist/example/ExampleDataSection.d.ts +7 -0
- package/dist/example/ExampleDataSection.d.ts.map +1 -0
- package/dist/example/ExampleDataSection.js +124 -0
- package/dist/example/ExampleFieldsSection.d.ts +17 -0
- package/dist/example/ExampleFieldsSection.d.ts.map +1 -0
- package/dist/example/ExampleFieldsSection.js +10 -0
- package/dist/example/ExampleFoundationsSection.d.ts +5 -0
- package/dist/example/ExampleFoundationsSection.d.ts.map +1 -0
- package/dist/example/ExampleFoundationsSection.js +25 -0
- package/dist/example/ExampleOverlays.d.ts +30 -0
- package/dist/example/ExampleOverlays.d.ts.map +1 -0
- package/dist/example/ExampleOverlays.js +12 -0
- package/dist/example/ExampleOverlaysSection.d.ts +14 -0
- package/dist/example/ExampleOverlaysSection.d.ts.map +1 -0
- package/dist/example/ExampleOverlaysSection.js +126 -0
- package/dist/example/ExampleSelectionSection.d.ts +30 -0
- package/dist/example/ExampleSelectionSection.d.ts.map +1 -0
- package/dist/example/ExampleSelectionSection.js +66 -0
- package/dist/example/ExampleStateSection.d.ts +8 -0
- package/dist/example/ExampleStateSection.d.ts.map +1 -0
- package/dist/example/ExampleStateSection.js +76 -0
- package/dist/example/ExampleThemePlayground.d.ts +417 -0
- package/dist/example/ExampleThemePlayground.d.ts.map +1 -0
- package/dist/example/ExampleThemePlayground.js +596 -0
- package/dist/example/UiExamplePage.d.ts +2 -0
- package/dist/example/UiExamplePage.d.ts.map +1 -0
- package/dist/example/UiExamplePage.js +315 -0
- package/dist/example/UiExampleSection.d.ts +8 -0
- package/dist/example/UiExampleSection.d.ts.map +1 -0
- package/dist/example/UiExampleSection.js +5 -0
- package/dist/example/codeSamples.d.ts +30 -0
- package/dist/example/codeSamples.d.ts.map +1 -0
- package/dist/example/codeSamples.js +976 -0
- package/dist/example/exampleData.d.ts +33 -0
- package/dist/example/exampleData.d.ts.map +1 -0
- package/dist/example/exampleData.js +217 -0
- package/dist/example/styles.css +1106 -0
- package/dist/hooks/useControllableState.d.ts +6 -0
- package/dist/hooks/useControllableState.d.ts.map +1 -0
- package/dist/hooks/useControllableState.js +16 -0
- package/dist/hooks/useDisclosure.d.ts +12 -0
- package/dist/hooks/useDisclosure.d.ts.map +1 -0
- package/dist/hooks/useDisclosure.js +14 -0
- package/dist/hooks/useEscapeKey.d.ts +2 -0
- package/dist/hooks/useEscapeKey.d.ts.map +1 -0
- package/dist/hooks/useEscapeKey.js +15 -0
- package/dist/hooks/useFloatingLayer.d.ts +19 -0
- package/dist/hooks/useFloatingLayer.d.ts.map +1 -0
- package/dist/hooks/useFloatingLayer.js +26 -0
- package/dist/hooks/useFloatingPosition.d.ts +17 -0
- package/dist/hooks/useFloatingPosition.d.ts.map +1 -0
- package/dist/hooks/useFloatingPosition.js +132 -0
- package/dist/hooks/useFocusTrap.d.ts +3 -0
- package/dist/hooks/useFocusTrap.d.ts.map +1 -0
- package/dist/hooks/useFocusTrap.js +54 -0
- package/dist/hooks/useListNavigation.d.ts +17 -0
- package/dist/hooks/useListNavigation.d.ts.map +1 -0
- package/dist/hooks/useListNavigation.js +44 -0
- package/dist/hooks/useOutsidePointerDown.d.ts +3 -0
- package/dist/hooks/useOutsidePointerDown.d.ts.map +1 -0
- package/dist/hooks/useOutsidePointerDown.js +20 -0
- package/dist/hooks/usePresence.d.ts +5 -0
- package/dist/hooks/usePresence.d.ts.map +1 -0
- package/dist/hooks/usePresence.js +35 -0
- package/dist/hooks/useTypeahead.d.ts +2 -0
- package/dist/hooks/useTypeahead.d.ts.map +1 -0
- package/dist/hooks/useTypeahead.js +23 -0
- package/dist/index.d.ts +64 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +64 -0
- package/dist/locale/LocaleProvider.d.ts +89 -0
- package/dist/locale/LocaleProvider.d.ts.map +1 -0
- package/dist/locale/LocaleProvider.js +174 -0
- package/dist/provider/OrcestrUiProvider.d.ts +28 -0
- package/dist/provider/OrcestrUiProvider.d.ts.map +1 -0
- package/dist/provider/OrcestrUiProvider.js +9 -0
- package/dist/react-query.d.ts +2 -0
- package/dist/react-query.d.ts.map +1 -0
- package/dist/react-query.js +1 -0
- package/dist/styles/orcestr-ui.css +4676 -0
- package/dist/theme/ThemeProvider.d.ts +3 -0
- package/dist/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/theme/ThemeProvider.js +280 -0
- package/dist/theme/defaultTheme.d.ts +12 -0
- package/dist/theme/defaultTheme.d.ts.map +1 -0
- package/dist/theme/defaultTheme.js +516 -0
- package/dist/theme/systemProps.d.ts +53 -0
- package/dist/theme/systemProps.d.ts.map +1 -0
- package/dist/theme/systemProps.js +240 -0
- package/dist/theme/themeTypes.d.ts +197 -0
- package/dist/theme/themeTypes.d.ts.map +1 -0
- package/dist/theme/themeTypes.js +1 -0
- package/dist/theme/useTheme.d.ts +4 -0
- package/dist/theme/useTheme.d.ts.map +1 -0
- package/dist/theme/useTheme.js +10 -0
- package/dist/utils/cn.d.ts +2 -0
- package/dist/utils/cn.d.ts.map +1 -0
- package/dist/utils/cn.js +3 -0
- package/dist/utils/composeRefs.d.ts +3 -0
- package/dist/utils/composeRefs.d.ts.map +1 -0
- package/dist/utils/composeRefs.js +14 -0
- package/dist/utils/mergeProps.d.ts +4 -0
- package/dist/utils/mergeProps.d.ts.map +1 -0
- package/dist/utils/mergeProps.js +26 -0
- package/dist/utils/ownerDocument.d.ts +2 -0
- package/dist/utils/ownerDocument.d.ts.map +1 -0
- package/dist/utils/ownerDocument.js +3 -0
- package/dist/utils/polymorphic.d.ts +6 -0
- package/dist/utils/polymorphic.d.ts.map +1 -0
- package/dist/utils/polymorphic.js +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1,976 @@
|
|
|
1
|
+
export const codeSamples = {
|
|
2
|
+
typography: `import {Badge, Box, Flex, Stack, Text} from '@orcestr/ui';
|
|
3
|
+
|
|
4
|
+
<Stack g={3}>
|
|
5
|
+
<Stack g={1}>
|
|
6
|
+
<Text as='h1' fs='28px' fw={780} lh={1.1}>
|
|
7
|
+
Workflow review
|
|
8
|
+
</Text>
|
|
9
|
+
<Text as='h2' fs='20px' fw={720} lh={1.2}>
|
|
10
|
+
Review window and status
|
|
11
|
+
</Text>
|
|
12
|
+
<Text tone='muted' fs='13px' lh={1.5}>
|
|
13
|
+
Compact operational text with muted metadata.
|
|
14
|
+
</Text>
|
|
15
|
+
</Stack>
|
|
16
|
+
|
|
17
|
+
<Stack g={1}>
|
|
18
|
+
<Text fs='15px' fw={700}>Body strong text</Text>
|
|
19
|
+
<Text fs='14px' lh={1.55}>Body regular text.</Text>
|
|
20
|
+
<Text fs='12px' tone='muted' lh={1.4}>Caption text.</Text>
|
|
21
|
+
</Stack>
|
|
22
|
+
|
|
23
|
+
<Flex g={2} wrap>
|
|
24
|
+
<Text tone='brand' fw={700}>Brand</Text>
|
|
25
|
+
<Text tone='success' fw={700}>Success</Text>
|
|
26
|
+
<Text tone='warning' fw={700}>Warning</Text>
|
|
27
|
+
<Text tone='danger' fw={700}>Danger</Text>
|
|
28
|
+
<Text tone='info' fw={700}>Info</Text>
|
|
29
|
+
</Flex>
|
|
30
|
+
|
|
31
|
+
<Box w='100%' p={2} r={3}>
|
|
32
|
+
<Text display='block' truncate>
|
|
33
|
+
This is a long single line value that truncates cleanly.
|
|
34
|
+
</Text>
|
|
35
|
+
</Box>
|
|
36
|
+
|
|
37
|
+
<Flex g={2} wrap>
|
|
38
|
+
<Badge>Neutral</Badge>
|
|
39
|
+
<Badge tone='brand'>Brand</Badge>
|
|
40
|
+
<Badge tone='success'>Success</Badge>
|
|
41
|
+
<Badge tone='warning'>Warning</Badge>
|
|
42
|
+
<Badge tone='danger'>Danger</Badge>
|
|
43
|
+
<Badge tone='info'>Info</Badge>
|
|
44
|
+
</Flex>
|
|
45
|
+
</Stack>`,
|
|
46
|
+
skeleton: `import {Skeleton, Stack} from '@orcestr/ui';
|
|
47
|
+
|
|
48
|
+
<Stack g={2}>
|
|
49
|
+
<Skeleton h={16} w='80%' />
|
|
50
|
+
<Skeleton h={16} w='64%' />
|
|
51
|
+
<Skeleton h={36} />
|
|
52
|
+
</Stack>`,
|
|
53
|
+
appShell: `import {
|
|
54
|
+
AppShell,
|
|
55
|
+
AppShellContent,
|
|
56
|
+
AppShellHeader,
|
|
57
|
+
AppShellNav,
|
|
58
|
+
AppShellSidebar,
|
|
59
|
+
Button,
|
|
60
|
+
OrcestrUiProvider,
|
|
61
|
+
Stack,
|
|
62
|
+
Text,
|
|
63
|
+
} from '@orcestr/ui';
|
|
64
|
+
|
|
65
|
+
<OrcestrUiProvider surface='operations' locale='ru'>
|
|
66
|
+
<AppShell
|
|
67
|
+
sidebarOpen={mobileOpen}
|
|
68
|
+
onSidebarOpenChange={setMobileOpen}
|
|
69
|
+
header={
|
|
70
|
+
<AppShellHeader
|
|
71
|
+
visibility='mobile'
|
|
72
|
+
title='Operations'
|
|
73
|
+
sidebarOpen={mobileOpen}
|
|
74
|
+
onSidebarOpenChange={setMobileOpen}
|
|
75
|
+
actions={<Button size={1}>Create</Button>}
|
|
76
|
+
/>
|
|
77
|
+
}
|
|
78
|
+
sidebar={
|
|
79
|
+
<AppShellSidebar
|
|
80
|
+
title='Operations'
|
|
81
|
+
description='Operational module shell with themed navigation.'
|
|
82
|
+
onClose={() => setMobileOpen(false)}
|
|
83
|
+
footer={<Button fullWidth v='surface'>Settings</Button>}
|
|
84
|
+
>
|
|
85
|
+
<AppShellNav items={navigationItems} />
|
|
86
|
+
</AppShellSidebar>
|
|
87
|
+
}
|
|
88
|
+
>
|
|
89
|
+
<AppShellContent>
|
|
90
|
+
<Stack g={1}>
|
|
91
|
+
<Text as='h1' fs='22px' fw={760}>Queue</Text>
|
|
92
|
+
<Text tone='muted'>Daily workspace operations and status movement.</Text>
|
|
93
|
+
</Stack>
|
|
94
|
+
{children}
|
|
95
|
+
</AppShellContent>
|
|
96
|
+
</AppShell>
|
|
97
|
+
</OrcestrUiProvider>`,
|
|
98
|
+
layoutFlex: `import {Badge, Button, Flex, Text} from '@orcestr/ui';
|
|
99
|
+
|
|
100
|
+
<Flex col g={3}>
|
|
101
|
+
<Flex row g={2} a='c' j='sb' wrap>
|
|
102
|
+
<Flex row g={2} a='c' wrap>
|
|
103
|
+
<Badge tone='brand'>status</Badge>
|
|
104
|
+
<Text fw={700}>Task TASK-2048</Text>
|
|
105
|
+
</Flex>
|
|
106
|
+
<Flex row g={1} a='c'>
|
|
107
|
+
<Button size={1} v='surface'>Cancel</Button>
|
|
108
|
+
<Button size={1}>Apply</Button>
|
|
109
|
+
</Flex>
|
|
110
|
+
</Flex>
|
|
111
|
+
<Flex row g={2} wrap>
|
|
112
|
+
{['Intake', 'Review', 'Complete'].map((item, index) => (
|
|
113
|
+
<Flex key={item} col g={1} p={2} r={3} flex='1 1 150px'>
|
|
114
|
+
<Text fs='12px' tone='muted'>Step {index + 1}</Text>
|
|
115
|
+
<Text fw={700}>{item}</Text>
|
|
116
|
+
</Flex>
|
|
117
|
+
))}
|
|
118
|
+
</Flex>
|
|
119
|
+
</Flex>`,
|
|
120
|
+
layoutStack: `import {Box, Flex, Stack, Text} from '@orcestr/ui';
|
|
121
|
+
|
|
122
|
+
<Stack g={2}>
|
|
123
|
+
{[
|
|
124
|
+
['Created', 'Draft created from intake'],
|
|
125
|
+
['Reserved', 'Capacity is reserved for review'],
|
|
126
|
+
['Scheduled', 'Review window is confirmed'],
|
|
127
|
+
].map(([title, description]) => (
|
|
128
|
+
<Flex key={title} row g={2} p={2} r={3} a='s'>
|
|
129
|
+
<Box size={8} r={7} mt={1} />
|
|
130
|
+
<Stack g={0}>
|
|
131
|
+
<Text fs='13px' fw={700}>{title}</Text>
|
|
132
|
+
<Text fs='12px' tone='muted' lh={1.45}>{description}</Text>
|
|
133
|
+
</Stack>
|
|
134
|
+
</Flex>
|
|
135
|
+
))}
|
|
136
|
+
</Stack>`,
|
|
137
|
+
layoutCollapse: `import {useState} from 'react';
|
|
138
|
+
import {Badge, Button, Collapse, Flex, Stack, Text} from '@orcestr/ui';
|
|
139
|
+
|
|
140
|
+
const [detailsOpen, setDetailsOpen] = useState(true);
|
|
141
|
+
|
|
142
|
+
<Stack g={2}>
|
|
143
|
+
<Flex row g={2} a='c' j='sb'>
|
|
144
|
+
<Text fw={700}>Item details</Text>
|
|
145
|
+
<Button size={1} v='surface' onClick={() => setDetailsOpen((open) => !open)}>
|
|
146
|
+
{detailsOpen ? 'Hide' : 'Show'}
|
|
147
|
+
</Button>
|
|
148
|
+
</Flex>
|
|
149
|
+
<Collapse open={detailsOpen}>
|
|
150
|
+
<Stack g={2} p={2} r={3}>
|
|
151
|
+
<Flex row g={2} j='sb'>
|
|
152
|
+
<Text tone='muted'>Owner</Text>
|
|
153
|
+
<Text fw={700}>Core team</Text>
|
|
154
|
+
</Flex>
|
|
155
|
+
<Flex row g={2} j='sb'>
|
|
156
|
+
<Text tone='muted'>Window</Text>
|
|
157
|
+
<Text fw={700}>09:00 - 12:00</Text>
|
|
158
|
+
</Flex>
|
|
159
|
+
<Flex row g={2} j='sb'>
|
|
160
|
+
<Text tone='muted'>Priority</Text>
|
|
161
|
+
<Badge tone='warning'>High</Badge>
|
|
162
|
+
</Flex>
|
|
163
|
+
</Stack>
|
|
164
|
+
</Collapse>
|
|
165
|
+
</Stack>`,
|
|
166
|
+
layoutGrid: `import {Box, Grid, Text} from '@orcestr/ui';
|
|
167
|
+
|
|
168
|
+
<Grid columns='repeat(3, minmax(0, 1fr))' g={2}>
|
|
169
|
+
{['A', 'B', 'C', 'D', 'E', 'F'].map((item) => (
|
|
170
|
+
<Box key={item} p={2} r={3} ta='center'>
|
|
171
|
+
<Text fs='13px' fw={700}>{item}</Text>
|
|
172
|
+
</Box>
|
|
173
|
+
))}
|
|
174
|
+
</Grid>`,
|
|
175
|
+
highlights: `import {BottomHighlight, Text, TopHighlight} from '@orcestr/ui';
|
|
176
|
+
|
|
177
|
+
<div
|
|
178
|
+
className='oui-highlight-demo-surface'
|
|
179
|
+
style={{background: 'var(--oui-section-nested-solid-bg)'}}
|
|
180
|
+
>
|
|
181
|
+
<TopHighlight
|
|
182
|
+
h={32}
|
|
183
|
+
color='var(--oui-section-nested-solid-bg)'
|
|
184
|
+
position='absolute'
|
|
185
|
+
/>
|
|
186
|
+
<Text fs='13px' fw={700}>Top and bottom highlights</Text>
|
|
187
|
+
<Text fs='12px' tone='muted'>
|
|
188
|
+
One surface shows both edge masks at the same time.
|
|
189
|
+
</Text>
|
|
190
|
+
<BottomHighlight
|
|
191
|
+
h={32}
|
|
192
|
+
color='var(--oui-section-nested-solid-bg)'
|
|
193
|
+
position='absolute'
|
|
194
|
+
/>
|
|
195
|
+
</div>`,
|
|
196
|
+
scrollArea: `import {Badge, Flex, ScrollArea, Stack, Text} from '@orcestr/ui';
|
|
197
|
+
|
|
198
|
+
<Stack g={2}>
|
|
199
|
+
<ScrollArea h={116} pr={1}>
|
|
200
|
+
<Stack g={1}>{rows}</Stack>
|
|
201
|
+
</ScrollArea>
|
|
202
|
+
|
|
203
|
+
<ScrollArea
|
|
204
|
+
h={112}
|
|
205
|
+
pr={1}
|
|
206
|
+
highlights
|
|
207
|
+
highlightColor='var(--oui-section-nested-solid-bg)'
|
|
208
|
+
highlightTop={{h: 28, mode: 'static', maxOpacity: 0.96}}
|
|
209
|
+
highlightBottom={{h: 28, mode: 'static', maxOpacity: 0.96}}
|
|
210
|
+
>
|
|
211
|
+
<Stack g={1}>{rows}</Stack>
|
|
212
|
+
</ScrollArea>
|
|
213
|
+
|
|
214
|
+
<ScrollArea
|
|
215
|
+
h={176}
|
|
216
|
+
pr={1}
|
|
217
|
+
highlights
|
|
218
|
+
highlightColor='var(--oui-section-nested-solid-bg)'
|
|
219
|
+
highlightTop={{
|
|
220
|
+
h: 42,
|
|
221
|
+
mode: 'scroll',
|
|
222
|
+
start: 50,
|
|
223
|
+
fadeDistance: 160,
|
|
224
|
+
maxOpacity: 0.94,
|
|
225
|
+
}}
|
|
226
|
+
highlightBottom={{
|
|
227
|
+
h: 34,
|
|
228
|
+
mode: 'scroll',
|
|
229
|
+
start: 12,
|
|
230
|
+
fadeDistance: 96,
|
|
231
|
+
maxOpacity: 0.9,
|
|
232
|
+
}}
|
|
233
|
+
>
|
|
234
|
+
<Stack g={1}>
|
|
235
|
+
{rows.map((row, index) => (
|
|
236
|
+
<Flex key={row.id} row g={2} p={2} r={3} a='c'>
|
|
237
|
+
<Badge tone={index < 3 ? 'brand' : 'info'}>
|
|
238
|
+
{index + 1}
|
|
239
|
+
</Badge>
|
|
240
|
+
<Stack g={0}>
|
|
241
|
+
<Text fs='13px' fw={700}>{row.title}</Text>
|
|
242
|
+
<Text fs='12px' tone='muted'>{row.description}</Text>
|
|
243
|
+
</Stack>
|
|
244
|
+
</Flex>
|
|
245
|
+
))}
|
|
246
|
+
</Stack>
|
|
247
|
+
</ScrollArea>
|
|
248
|
+
</Stack>`,
|
|
249
|
+
systemRadius: `import {Box, Button, Flex, Text} from '@orcestr/ui';
|
|
250
|
+
|
|
251
|
+
<Flex g={2} a='c' wrap>
|
|
252
|
+
{[0, 2, 4, 6, 7].map((radius) => (
|
|
253
|
+
<Box key={radius} size={32} r={radius} display='flex' a='c' j='c'>
|
|
254
|
+
<Text fs='12px'>{radius}</Text>
|
|
255
|
+
</Box>
|
|
256
|
+
))}
|
|
257
|
+
</Flex>
|
|
258
|
+
<Button mt={2} v='pad' r={7}>
|
|
259
|
+
Button r=7
|
|
260
|
+
</Button>`,
|
|
261
|
+
buttons: `import {Button, Spinner} from '@orcestr/ui';
|
|
262
|
+
import {LuCheck, LuInfo, LuTrash2, LuTriangleAlert} from 'react-icons/lu';
|
|
263
|
+
|
|
264
|
+
<Button size={3}>Solid</Button>
|
|
265
|
+
<Button size={3} v='soft'>Soft</Button>
|
|
266
|
+
<Button size={3} v='surface'>Surface</Button>
|
|
267
|
+
<Button size={3} v='pad'>Pad</Button>
|
|
268
|
+
<Button size={3} v='outline'>Outline</Button>
|
|
269
|
+
<Button size={3} v='ghost'>Ghost</Button>
|
|
270
|
+
|
|
271
|
+
<Button tone='success' leftIcon={<LuCheck size={16} />}>Success</Button>
|
|
272
|
+
<Button tone='warning' v='soft' leftIcon={<LuTriangleAlert size={16} />}>Warning</Button>
|
|
273
|
+
<Button tone='info' v='soft' leftIcon={<LuInfo size={16} />}>Info</Button>
|
|
274
|
+
<Button tone='danger' v='soft' leftIcon={<LuTrash2 size={16} />}>Delete</Button>
|
|
275
|
+
|
|
276
|
+
<Button size={1} v='surface'>Size 1</Button>
|
|
277
|
+
<Button size={2} v='surface'>Size 2</Button>
|
|
278
|
+
<Button size={3} v='surface'>Size 3</Button>
|
|
279
|
+
<Button size={4} v='surface'>Size 4</Button>
|
|
280
|
+
|
|
281
|
+
<Button size={1}>Solid 1</Button>
|
|
282
|
+
<Button size={2} v='soft'>Soft 2</Button>
|
|
283
|
+
<Button size={3} v='surface'>Surface 3</Button>
|
|
284
|
+
<Button size={3} v='pad'>Pad 3</Button>
|
|
285
|
+
<Button size={4} v='outline'>Outline 4</Button>
|
|
286
|
+
<Button size={2} v='ghost'>Ghost 2</Button>
|
|
287
|
+
|
|
288
|
+
<Button v='surface' pressAnimation='translate'>Press translate</Button>
|
|
289
|
+
<Button v='surface' pressAnimation='scale'>Press scale</Button>
|
|
290
|
+
<Button v='surface' pressAnimation='soft'>Press soft</Button>
|
|
291
|
+
<Button v='surface' pressAnimation='none'>Press none</Button>
|
|
292
|
+
|
|
293
|
+
<Button size={3} loading>Loading</Button>
|
|
294
|
+
<Button size={3} v='surface' loading leftIcon={<LuCheck size={16} />}>Save</Button>
|
|
295
|
+
<Button size={3} tone='success' loading leftIcon={<LuCheck size={16} />}>Success</Button>
|
|
296
|
+
<Spinner />`,
|
|
297
|
+
iconButtons: `import {Button, IconButton, Menu, Tooltip} from '@orcestr/ui';
|
|
298
|
+
import {LuBell, LuCheck, LuCommand, LuEllipsis, LuInfo} from 'react-icons/lu';
|
|
299
|
+
|
|
300
|
+
<IconButton v='solid' icon={<LuCheck size={17} />} aria-label='Solid icon' />
|
|
301
|
+
<IconButton v='soft' icon={<LuBell size={17} />} aria-label='Soft icon' />
|
|
302
|
+
<IconButton v='surface' icon={<LuBell size={17} />} aria-label='Surface icon' />
|
|
303
|
+
<IconButton v='pad' icon={<LuBell size={17} />} aria-label='Pad icon' />
|
|
304
|
+
<IconButton v='outline' icon={<LuInfo size={17} />} aria-label='Outline icon' />
|
|
305
|
+
<IconButton v='ghost' icon={<LuEllipsis size={17} />} aria-label='Ghost icon' />
|
|
306
|
+
|
|
307
|
+
<IconButton size={1} v='surface' icon={<LuBell size={13} />} aria-label='Size 1 icon' />
|
|
308
|
+
<IconButton size={2} v='surface' icon={<LuBell size={15} />} aria-label='Size 2 icon' />
|
|
309
|
+
<IconButton size={3} v='surface' icon={<LuBell size={17} />} aria-label='Size 3 icon' />
|
|
310
|
+
<IconButton size={4} v='surface' icon={<LuBell size={19} />} aria-label='Size 4 icon' />
|
|
311
|
+
|
|
312
|
+
<IconButton size={3} v='pad' round={false} r={3} icon={<LuCommand size={17} />} aria-label='Square pad icon' />
|
|
313
|
+
<IconButton size={3} v='outline' loading icon={<LuBell size={17} />} aria-label='Loading icon' />
|
|
314
|
+
|
|
315
|
+
<IconButton size={1} v='ghost' icon={<LuEllipsis size={13} />} aria-label='Ghost size 1' />
|
|
316
|
+
<IconButton size={2} v='ghost' icon={<LuEllipsis size={15} />} aria-label='Ghost size 2' />
|
|
317
|
+
<IconButton size={3} v='ghost' icon={<LuEllipsis size={17} />} aria-label='Ghost size 3' />
|
|
318
|
+
<IconButton size={4} v='ghost' icon={<LuEllipsis size={19} />} aria-label='Ghost size 4' />
|
|
319
|
+
|
|
320
|
+
<Tooltip content='Notifications'>
|
|
321
|
+
<IconButton v='surface' icon={<LuBell size={17} />} aria-label='Notifications' />
|
|
322
|
+
</Tooltip>
|
|
323
|
+
<IconButton v='surface' loading icon={<LuBell size={17} />} aria-label='Loading action' />
|
|
324
|
+
<IconButton v='pad' icon={<LuBell size={17} />} aria-label='Pad action' />
|
|
325
|
+
<Menu
|
|
326
|
+
trigger={<IconButton v='surface' icon={<LuEllipsis size={17} />} aria-label='Actions' />}
|
|
327
|
+
items={menuItems}
|
|
328
|
+
/>
|
|
329
|
+
<Button v='surface' leftIcon={<LuCommand size={16} />} onClick={openPalette}>
|
|
330
|
+
Commands
|
|
331
|
+
</Button>`,
|
|
332
|
+
textFields: `import {Button, Flex, Field, TextArea, TextField} from '@orcestr/ui';
|
|
333
|
+
import {LuSearch} from 'react-icons/lu';
|
|
334
|
+
|
|
335
|
+
<Field label='Search' helperText='Clearable field with left slot.'>
|
|
336
|
+
<Flex g={2} a='c'>
|
|
337
|
+
<TextField
|
|
338
|
+
size={2}
|
|
339
|
+
placeholder='Search entity'
|
|
340
|
+
clearable
|
|
341
|
+
leftSlot={<LuSearch size={16} />}
|
|
342
|
+
/>
|
|
343
|
+
<Button size={2} v='surface'>Search</Button>
|
|
344
|
+
</Flex>
|
|
345
|
+
</Field>
|
|
346
|
+
<Field label='Comment'>
|
|
347
|
+
<TextArea rows={4} placeholder='Internal note' />
|
|
348
|
+
</Field>`,
|
|
349
|
+
groupedFields: `import {Button, Flex, Field, Grid, Section, Stack, Text, TextArea, TextField} from '@orcestr/ui';
|
|
350
|
+
|
|
351
|
+
<Section g={3}>
|
|
352
|
+
<Stack g={1}>
|
|
353
|
+
<Text fw={760}>Request details</Text>
|
|
354
|
+
<Text fs='12px' tone='muted'>
|
|
355
|
+
Layout primitives group fields without owning state.
|
|
356
|
+
</Text>
|
|
357
|
+
</Stack>
|
|
358
|
+
<Grid columns='repeat(auto-fit, minmax(min(100%, 180px), 1fr))' g={3}>
|
|
359
|
+
<Field label='Source' required error='Choose a source'>
|
|
360
|
+
<TextField placeholder='Search source' invalid />
|
|
361
|
+
</Field>
|
|
362
|
+
<Field label='Contact'>
|
|
363
|
+
<TextField placeholder='Name or email' />
|
|
364
|
+
</Field>
|
|
365
|
+
</Grid>
|
|
366
|
+
<Field label='Review note' helperText='Visible to operators.'>
|
|
367
|
+
<TextArea rows={3} placeholder='Internal instructions' />
|
|
368
|
+
</Field>
|
|
369
|
+
<Flex g={2} j='e' wrap>
|
|
370
|
+
<Button type='button' v='surface'>Cancel</Button>
|
|
371
|
+
<Button type='button'>Save request</Button>
|
|
372
|
+
</Flex>
|
|
373
|
+
</Section>`,
|
|
374
|
+
numberAndDateFields: `import {DatePicker, Field, NumberField, StepperInput} from '@orcestr/ui';
|
|
375
|
+
|
|
376
|
+
<Field label='Quantity'>
|
|
377
|
+
<StepperInput value={quantity} onChange={setQuantity} min={0} max={200} />
|
|
378
|
+
</Field>
|
|
379
|
+
<Field label='Price'>
|
|
380
|
+
<NumberField defaultValue={1250} min={0} />
|
|
381
|
+
</Field>
|
|
382
|
+
<Field label='Date'>
|
|
383
|
+
<DatePicker value={date} onValueChange={setDate} />
|
|
384
|
+
</Field>`,
|
|
385
|
+
dateRangeFields: `import {DateRangePicker, DateRangePresetPicker, Field} from '@orcestr/ui';
|
|
386
|
+
|
|
387
|
+
<Field label='Range'>
|
|
388
|
+
<DateRangePicker value={dateRange} onValueChange={setDateRange} />
|
|
389
|
+
</Field>
|
|
390
|
+
<DateRangePresetPicker
|
|
391
|
+
today='2026-06-26'
|
|
392
|
+
onValueChange={setDateRange}
|
|
393
|
+
/>`,
|
|
394
|
+
selection: `import {Combobox, EntityPicker, MultiSelect, Select, SegmentedControl} from '@orcestr/ui';
|
|
395
|
+
import {LuPlus} from 'react-icons/lu';
|
|
396
|
+
|
|
397
|
+
<Select items={items} value={status} onValueChange={setStatus} clearable />
|
|
398
|
+
<Select
|
|
399
|
+
items={items}
|
|
400
|
+
value={statusWithoutChevron}
|
|
401
|
+
onValueChange={setStatusWithoutChevron}
|
|
402
|
+
clearable
|
|
403
|
+
showChevron={false}
|
|
404
|
+
placeholder='Clearable without chevron'
|
|
405
|
+
/>
|
|
406
|
+
<Select
|
|
407
|
+
items={items}
|
|
408
|
+
value={plainStatus}
|
|
409
|
+
onValueChange={setPlainStatus}
|
|
410
|
+
clearable={false}
|
|
411
|
+
showChevron={false}
|
|
412
|
+
placeholder='Plain select'
|
|
413
|
+
/>
|
|
414
|
+
<Combobox
|
|
415
|
+
items={items}
|
|
416
|
+
value={comboValue}
|
|
417
|
+
onValueChange={setComboValue}
|
|
418
|
+
placeholder='Find status'
|
|
419
|
+
/>
|
|
420
|
+
<MultiSelect
|
|
421
|
+
items={owners}
|
|
422
|
+
value={ownerValues}
|
|
423
|
+
onValueChange={setOwnerValues}
|
|
424
|
+
placeholder='Responsible users'
|
|
425
|
+
clearable
|
|
426
|
+
renderValue={(items) =>
|
|
427
|
+
items.length === 1 ? items[0]?.label : String(items.length) + ' responsible'
|
|
428
|
+
}
|
|
429
|
+
/>
|
|
430
|
+
<EntityPicker
|
|
431
|
+
value={entity}
|
|
432
|
+
onValueChange={setEntity}
|
|
433
|
+
loadPage={(page, search) => loadEntityPage(locale, page, search)}
|
|
434
|
+
getEntityId={(item) => item.id}
|
|
435
|
+
renderValue={(item) => item.article}
|
|
436
|
+
renderEntity={(item) => (
|
|
437
|
+
<>
|
|
438
|
+
<span className='oui-entity-option-main'>
|
|
439
|
+
<span className='oui-entity-option-code'>{item.article}</span>
|
|
440
|
+
<span className='oui-entity-option-meta'>{item.name}</span>
|
|
441
|
+
</span>
|
|
442
|
+
<span className='oui-entity-option-badge'>{item.status}</span>
|
|
443
|
+
</>
|
|
444
|
+
)}
|
|
445
|
+
placeholder='Entity picker'
|
|
446
|
+
clearable
|
|
447
|
+
createAction={{
|
|
448
|
+
label: 'Create entity from search',
|
|
449
|
+
onCreate: createEntity,
|
|
450
|
+
}}
|
|
451
|
+
optionAction={{
|
|
452
|
+
icon: <LuPlus size={14} />,
|
|
453
|
+
label: (item) => 'Add ' + item.article,
|
|
454
|
+
onClick: addEntity,
|
|
455
|
+
}}
|
|
456
|
+
/>
|
|
457
|
+
<SegmentedControl
|
|
458
|
+
items={[
|
|
459
|
+
{value: 'active', label: 'Active'},
|
|
460
|
+
{value: 'drafts', label: 'Drafts'},
|
|
461
|
+
{value: 'archive', label: 'Archive'},
|
|
462
|
+
]}
|
|
463
|
+
value={segment}
|
|
464
|
+
onValueChange={setSegment}
|
|
465
|
+
/>`,
|
|
466
|
+
selectionGroup: `import {Checkbox, RadioGroup, Switch} from '@orcestr/ui';
|
|
467
|
+
|
|
468
|
+
<Checkbox defaultChecked>Confirmed</Checkbox>
|
|
469
|
+
<Checkbox>Needs review</Checkbox>
|
|
470
|
+
<Checkbox disabled>Locked option</Checkbox>
|
|
471
|
+
<Switch defaultChecked>Auto updates</Switch>
|
|
472
|
+
<Switch>Manual mode</Switch>
|
|
473
|
+
<Switch disabled>Disabled switch</Switch>
|
|
474
|
+
<RadioGroup
|
|
475
|
+
name='mode'
|
|
476
|
+
value={mode}
|
|
477
|
+
onValueChange={setMode}
|
|
478
|
+
items={[
|
|
479
|
+
{value: 'manual', label: 'Manual'},
|
|
480
|
+
{value: 'auto', label: 'Automatic'},
|
|
481
|
+
]}
|
|
482
|
+
/>`,
|
|
483
|
+
tabs: `import {Tabs} from '@orcestr/ui';
|
|
484
|
+
import {LuHistory, LuListChecks} from 'react-icons/lu';
|
|
485
|
+
|
|
486
|
+
<Tabs
|
|
487
|
+
value={tab}
|
|
488
|
+
onValueChange={setTab}
|
|
489
|
+
items={[
|
|
490
|
+
{value: 'overview', label: 'Overview', icon: <LuListChecks size={16} />, badge: '12', content},
|
|
491
|
+
{value: 'history', label: 'History', icon: <LuHistory size={16} />, content},
|
|
492
|
+
]}
|
|
493
|
+
/>`,
|
|
494
|
+
overlays: `import {Button, CommandPalette, Flex, Field, Modal, Popover, Stack, Text, TextField, Tooltip} from '@orcestr/ui';
|
|
495
|
+
import {LuChevronDown} from 'react-icons/lu';
|
|
496
|
+
|
|
497
|
+
<Popover
|
|
498
|
+
trigger={
|
|
499
|
+
<Button v='surface' rightIcon={<LuChevronDown size={16} />}>
|
|
500
|
+
Open popover
|
|
501
|
+
</Button>
|
|
502
|
+
}
|
|
503
|
+
>
|
|
504
|
+
<Stack g={2} p={1}>
|
|
505
|
+
<Text fw={700}>Popover content</Text>
|
|
506
|
+
<Text color='var(--oui-muted)' fs='13px'>Shared positioning and presence.</Text>
|
|
507
|
+
</Stack>
|
|
508
|
+
</Popover>
|
|
509
|
+
|
|
510
|
+
<Tooltip content='Tooltip uses the same floating layer'>
|
|
511
|
+
<Button v='outline'>Hover me</Button>
|
|
512
|
+
</Tooltip>
|
|
513
|
+
|
|
514
|
+
<Button onClick={() => setModalOpen(true)}>Default modal</Button>
|
|
515
|
+
<Button v='surface' onClick={() => setBlurModalOpen(true)}>Blur modal</Button>
|
|
516
|
+
<Button v='outline' onClick={() => setFastModalOpen(true)}>Fast modal</Button>
|
|
517
|
+
<Button v='outline' onClick={() => setRiseModalOpen(true)}>Rise modal</Button>
|
|
518
|
+
<Button v='outline' onClick={() => setSlowModalOpen(true)}>Very slow modal</Button>
|
|
519
|
+
<Button v='soft' tone='danger' onClick={() => setDangerModalOpen(true)}>
|
|
520
|
+
Danger modal
|
|
521
|
+
</Button>
|
|
522
|
+
|
|
523
|
+
<Modal
|
|
524
|
+
open={modalOpen}
|
|
525
|
+
onOpenChange={setModalOpen}
|
|
526
|
+
title='Custom modal'
|
|
527
|
+
description='First modal layer with the default theme blur backdrop.'
|
|
528
|
+
footer={
|
|
529
|
+
<Flex g={2} j='e' w='100%'>
|
|
530
|
+
<Button v='surface' onClick={() => setModalOpen(false)}>Close</Button>
|
|
531
|
+
<Button onClick={() => setNestedOpen(true)}>Open nested</Button>
|
|
532
|
+
</Flex>
|
|
533
|
+
}
|
|
534
|
+
>
|
|
535
|
+
<Stack g={3}>
|
|
536
|
+
<Text color='var(--oui-muted)' lh={1.5}>
|
|
537
|
+
Nested modals stack above the previous layer.
|
|
538
|
+
</Text>
|
|
539
|
+
<Field label='Modal field'>
|
|
540
|
+
<TextField placeholder='Focus stays inside modal' />
|
|
541
|
+
</Field>
|
|
542
|
+
</Stack>
|
|
543
|
+
</Modal>
|
|
544
|
+
|
|
545
|
+
<Modal
|
|
546
|
+
open={nestedOpen}
|
|
547
|
+
onOpenChange={setNestedOpen}
|
|
548
|
+
title='Nested modal'
|
|
549
|
+
description='Second layer with the same default modal animation.'
|
|
550
|
+
maxWidth={440}
|
|
551
|
+
>
|
|
552
|
+
<Stack g={3}>
|
|
553
|
+
<Text color='var(--oui-muted)' lh={1.5}>This checks layer indexes and focus trap.</Text>
|
|
554
|
+
<Button onClick={() => toast.push('Nested modal action completed', 'success')}>
|
|
555
|
+
Show toast
|
|
556
|
+
</Button>
|
|
557
|
+
</Stack>
|
|
558
|
+
</Modal>
|
|
559
|
+
|
|
560
|
+
<Modal
|
|
561
|
+
open={blurModalOpen}
|
|
562
|
+
onOpenChange={setBlurModalOpen}
|
|
563
|
+
title='Blur modal'
|
|
564
|
+
description='Default modal surface with pure backdrop blur and no overlay tint.'
|
|
565
|
+
maxWidth={560}
|
|
566
|
+
overlayColor='transparent'
|
|
567
|
+
overlayOpacity={0}
|
|
568
|
+
overlayBlur={10}
|
|
569
|
+
borderColor='color-mix(in srgb, var(--oui-brand) 34%, var(--oui-border))'
|
|
570
|
+
radius={10}
|
|
571
|
+
shadow='0 24px 90px rgb(0 0 0 / 44%)'
|
|
572
|
+
footer={
|
|
573
|
+
<Flex g={2} j='e' w='100%'>
|
|
574
|
+
<Button v='surface' onClick={() => setBlurModalOpen(false)}>Close</Button>
|
|
575
|
+
<Button onClick={() => setBlurNestedOpen(true)}>Open nested blur</Button>
|
|
576
|
+
</Flex>
|
|
577
|
+
}
|
|
578
|
+
>
|
|
579
|
+
<Stack g={3}>
|
|
580
|
+
<Text color='var(--oui-muted)' lh={1.5}>
|
|
581
|
+
This variant checks a strong backdrop blur with transparent overlay tint.
|
|
582
|
+
</Text>
|
|
583
|
+
<Field label='Reference'>
|
|
584
|
+
<TextField placeholder='ORD-2048' />
|
|
585
|
+
</Field>
|
|
586
|
+
</Stack>
|
|
587
|
+
</Modal>
|
|
588
|
+
|
|
589
|
+
<Modal
|
|
590
|
+
open={blurNestedOpen}
|
|
591
|
+
onOpenChange={setBlurNestedOpen}
|
|
592
|
+
title='Nested blur modal'
|
|
593
|
+
description='Second blur layer without overlay tint.'
|
|
594
|
+
maxWidth={500}
|
|
595
|
+
overlayColor='transparent'
|
|
596
|
+
overlayOpacity={0}
|
|
597
|
+
overlayBlur={8}
|
|
598
|
+
borderColor='color-mix(in srgb, var(--oui-brand) 38%, var(--oui-border))'
|
|
599
|
+
radius={10}
|
|
600
|
+
footer={
|
|
601
|
+
<Flex g={2} j='e' w='100%'>
|
|
602
|
+
<Button v='surface' onClick={() => setBlurNestedOpen(false)}>Close</Button>
|
|
603
|
+
<Button onClick={() => setBlurFinalOpen(true)}>Open final blur</Button>
|
|
604
|
+
</Flex>
|
|
605
|
+
}
|
|
606
|
+
>
|
|
607
|
+
<Stack g={3}>
|
|
608
|
+
<Text color='var(--oui-muted)' lh={1.5}>This layer stacks above the first blur modal.</Text>
|
|
609
|
+
<TextField placeholder='Nested value' />
|
|
610
|
+
</Stack>
|
|
611
|
+
</Modal>
|
|
612
|
+
|
|
613
|
+
<Modal
|
|
614
|
+
open={blurFinalOpen}
|
|
615
|
+
onOpenChange={setBlurFinalOpen}
|
|
616
|
+
title='Final blur modal'
|
|
617
|
+
description='Top blur layer. Toast must appear above this modal.'
|
|
618
|
+
maxWidth={440}
|
|
619
|
+
overlayColor='transparent'
|
|
620
|
+
overlayOpacity={0}
|
|
621
|
+
overlayBlur={6}
|
|
622
|
+
borderColor='color-mix(in srgb, var(--oui-brand) 42%, var(--oui-border))'
|
|
623
|
+
radius={10}
|
|
624
|
+
>
|
|
625
|
+
<Stack g={3}>
|
|
626
|
+
<Text color='var(--oui-muted)' lh={1.5}>Verify blur stacking and toast z-index.</Text>
|
|
627
|
+
<Button onClick={() => toast.push('Toast above nested blur modals', 'success')}>
|
|
628
|
+
Show toast
|
|
629
|
+
</Button>
|
|
630
|
+
</Stack>
|
|
631
|
+
</Modal>
|
|
632
|
+
|
|
633
|
+
<Modal
|
|
634
|
+
open={fastModalOpen}
|
|
635
|
+
onOpenChange={setFastModalOpen}
|
|
636
|
+
title='Fast modal'
|
|
637
|
+
description='Short animationDuration passed directly to the modal.'
|
|
638
|
+
maxWidth={460}
|
|
639
|
+
overlayColor='#0b1020'
|
|
640
|
+
overlayOpacity={0.28}
|
|
641
|
+
overlayBlur={4}
|
|
642
|
+
animationDuration='160ms'
|
|
643
|
+
>
|
|
644
|
+
<Stack g={3}>
|
|
645
|
+
<Text color='var(--oui-muted)' lh={1.5}>Fast open and close animation.</Text>
|
|
646
|
+
<Button onClick={() => setFastModalOpen(false)}>Close</Button>
|
|
647
|
+
</Stack>
|
|
648
|
+
</Modal>
|
|
649
|
+
|
|
650
|
+
<Modal
|
|
651
|
+
open={slowModalOpen}
|
|
652
|
+
onOpenChange={setSlowModalOpen}
|
|
653
|
+
title='Very slow modal'
|
|
654
|
+
description='Long animationDuration for checking smooth blur ramp.'
|
|
655
|
+
maxWidth={520}
|
|
656
|
+
overlayColor='transparent'
|
|
657
|
+
overlayOpacity={0}
|
|
658
|
+
overlayBlur={14}
|
|
659
|
+
animationDuration='1200ms'
|
|
660
|
+
borderColor='color-mix(in srgb, var(--oui-brand) 42%, var(--oui-border))'
|
|
661
|
+
radius={10}
|
|
662
|
+
>
|
|
663
|
+
<Stack g={3}>
|
|
664
|
+
<Text color='var(--oui-muted)' lh={1.5}>Slow blur ramp for animation checks.</Text>
|
|
665
|
+
<Button onClick={() => setSlowModalOpen(false)}>Close</Button>
|
|
666
|
+
</Stack>
|
|
667
|
+
</Modal>
|
|
668
|
+
|
|
669
|
+
<Modal
|
|
670
|
+
open={riseModalOpen}
|
|
671
|
+
onOpenChange={setRiseModalOpen}
|
|
672
|
+
title='Rise modal'
|
|
673
|
+
description='Legacy rise animation kept as an explicit modal animation variant.'
|
|
674
|
+
maxWidth={480}
|
|
675
|
+
overlayColor='#0b1020'
|
|
676
|
+
overlayOpacity={0.28}
|
|
677
|
+
overlayBlur={4}
|
|
678
|
+
animation='rise'
|
|
679
|
+
>
|
|
680
|
+
<Stack g={3}>
|
|
681
|
+
<Text color='var(--oui-muted)' lh={1.5}>Previous rise animation variant.</Text>
|
|
682
|
+
<Button onClick={() => setRiseModalOpen(false)}>Close</Button>
|
|
683
|
+
</Stack>
|
|
684
|
+
</Modal>
|
|
685
|
+
|
|
686
|
+
<Modal
|
|
687
|
+
open={dangerModalOpen}
|
|
688
|
+
onOpenChange={setDangerModalOpen}
|
|
689
|
+
title='Danger modal'
|
|
690
|
+
description='Strong colored overlay, danger border and compact radius.'
|
|
691
|
+
maxWidth={500}
|
|
692
|
+
overlayColor='#3b0712'
|
|
693
|
+
overlayOpacity={0.48}
|
|
694
|
+
overlayBlur={3}
|
|
695
|
+
borderColor='color-mix(in srgb, var(--oui-danger) 46%, var(--oui-border))'
|
|
696
|
+
radius={8}
|
|
697
|
+
footer={
|
|
698
|
+
<Flex g={2} j='e' w='100%'>
|
|
699
|
+
<Button v='surface' onClick={() => setDangerModalOpen(false)}>Cancel</Button>
|
|
700
|
+
<Button tone='danger' onClick={confirmDangerAction}>Confirm</Button>
|
|
701
|
+
</Flex>
|
|
702
|
+
}
|
|
703
|
+
>
|
|
704
|
+
<Stack g={3}>
|
|
705
|
+
<Text color='var(--oui-muted)' lh={1.5}>Colored backdrop without a hard flash.</Text>
|
|
706
|
+
<TextField value='Archive selected record' readOnly />
|
|
707
|
+
</Stack>
|
|
708
|
+
</Modal>
|
|
709
|
+
|
|
710
|
+
<CommandPalette
|
|
711
|
+
open={paletteOpen}
|
|
712
|
+
onOpenChange={setPaletteOpen}
|
|
713
|
+
items={[
|
|
714
|
+
{
|
|
715
|
+
key: 'create-record',
|
|
716
|
+
label: 'Create record',
|
|
717
|
+
description: 'Start a workflow.',
|
|
718
|
+
shortcut: 'C',
|
|
719
|
+
group: 'Create',
|
|
720
|
+
keywords: ['new', 'workflow'],
|
|
721
|
+
onSelect: () => toast.info('Create record action'),
|
|
722
|
+
},
|
|
723
|
+
]}
|
|
724
|
+
recentItems={recentCommands}
|
|
725
|
+
globalOpenEvents={['orcestr:open-command-palette']}
|
|
726
|
+
onSelect={(value) => toast.info('Command selected: ' + value)}
|
|
727
|
+
/>`,
|
|
728
|
+
toast: `import {Button, type ToastPosition, type ToastTone, useToast} from '@orcestr/ui';
|
|
729
|
+
|
|
730
|
+
const toast = useToast();
|
|
731
|
+
|
|
732
|
+
<Button
|
|
733
|
+
onClick={() =>
|
|
734
|
+
toast.success({
|
|
735
|
+
title: 'Saved successfully',
|
|
736
|
+
message: 'The settings are synced with the current theme.',
|
|
737
|
+
position: 'bottom-right',
|
|
738
|
+
})
|
|
739
|
+
}
|
|
740
|
+
>
|
|
741
|
+
Success
|
|
742
|
+
</Button>
|
|
743
|
+
<Button
|
|
744
|
+
onClick={() =>
|
|
745
|
+
toast.warning({
|
|
746
|
+
title: 'Needs attention',
|
|
747
|
+
message: 'Only 4 items need attention in this view.',
|
|
748
|
+
dedupeKey: 'needs-attention',
|
|
749
|
+
position: 'top-right',
|
|
750
|
+
})
|
|
751
|
+
}
|
|
752
|
+
>
|
|
753
|
+
Warning dedupe
|
|
754
|
+
</Button>
|
|
755
|
+
<Button
|
|
756
|
+
onClick={() =>
|
|
757
|
+
toast.error({
|
|
758
|
+
title: 'Export failed',
|
|
759
|
+
message: 'The report can be retried without closing this page.',
|
|
760
|
+
position: 'bottom-right',
|
|
761
|
+
action: {
|
|
762
|
+
label: 'Retry',
|
|
763
|
+
onClick: () => toast.info('Retry queued'),
|
|
764
|
+
},
|
|
765
|
+
})
|
|
766
|
+
}
|
|
767
|
+
>
|
|
768
|
+
Error action
|
|
769
|
+
</Button>
|
|
770
|
+
<Button
|
|
771
|
+
onClick={() =>
|
|
772
|
+
toast.info({
|
|
773
|
+
title: 'Pinned note',
|
|
774
|
+
message: 'duration: null keeps this toast visible.',
|
|
775
|
+
position: 'top-center',
|
|
776
|
+
duration: null,
|
|
777
|
+
closeButton: true,
|
|
778
|
+
})
|
|
779
|
+
}
|
|
780
|
+
>
|
|
781
|
+
Pinned
|
|
782
|
+
</Button>
|
|
783
|
+
<Button
|
|
784
|
+
onClick={() =>
|
|
785
|
+
toast.info({
|
|
786
|
+
title: 'Glass background',
|
|
787
|
+
message: 'Custom blur and translucent background.',
|
|
788
|
+
position: 'bottom-right',
|
|
789
|
+
background: 'rgb(18 24 34 / 72%)',
|
|
790
|
+
blur: 18,
|
|
791
|
+
borderColor: 'rgb(255 255 255 / 18%)',
|
|
792
|
+
duration: 5200,
|
|
793
|
+
})
|
|
794
|
+
}
|
|
795
|
+
>
|
|
796
|
+
Glass
|
|
797
|
+
</Button>
|
|
798
|
+
<Button
|
|
799
|
+
onClick={() =>
|
|
800
|
+
toast.info({
|
|
801
|
+
title: 'Static background',
|
|
802
|
+
message: 'Blur can be disabled per toast.',
|
|
803
|
+
position: 'bottom-left',
|
|
804
|
+
background: 'var(--oui-floating-bg)',
|
|
805
|
+
blur: false,
|
|
806
|
+
duration: 5200,
|
|
807
|
+
})
|
|
808
|
+
}
|
|
809
|
+
>
|
|
810
|
+
Static
|
|
811
|
+
</Button>
|
|
812
|
+
|
|
813
|
+
const toastPositions: Array<{position: ToastPosition; label: string}> = [
|
|
814
|
+
{position: 'top-left', label: 'Top left'},
|
|
815
|
+
{position: 'top-center', label: 'Top center'},
|
|
816
|
+
{position: 'top-right', label: 'Top right'},
|
|
817
|
+
{position: 'bottom-left', label: 'Bottom left'},
|
|
818
|
+
{position: 'bottom-center', label: 'Bottom center'},
|
|
819
|
+
{position: 'bottom-right', label: 'Bottom right'},
|
|
820
|
+
];
|
|
821
|
+
|
|
822
|
+
const toastPositionVariants: Array<{
|
|
823
|
+
position: ToastPosition;
|
|
824
|
+
label: string;
|
|
825
|
+
tone: ToastTone;
|
|
826
|
+
message: string;
|
|
827
|
+
background?: string;
|
|
828
|
+
blur?: number | string | false;
|
|
829
|
+
}> = [
|
|
830
|
+
{
|
|
831
|
+
position: 'top-left',
|
|
832
|
+
label: 'Status synced',
|
|
833
|
+
tone: 'success',
|
|
834
|
+
message: 'Glass toast from the left edge.',
|
|
835
|
+
blur: 14,
|
|
836
|
+
},
|
|
837
|
+
{
|
|
838
|
+
position: 'top-center',
|
|
839
|
+
label: 'Command ready',
|
|
840
|
+
tone: 'info',
|
|
841
|
+
message: 'Centered toast drops from the top.',
|
|
842
|
+
background: 'rgb(18 28 42 / 88%)',
|
|
843
|
+
blur: 10,
|
|
844
|
+
},
|
|
845
|
+
{
|
|
846
|
+
position: 'top-right',
|
|
847
|
+
label: 'Needs attention',
|
|
848
|
+
tone: 'warning',
|
|
849
|
+
message: 'Right edge bubble animation.',
|
|
850
|
+
blur: 12,
|
|
851
|
+
},
|
|
852
|
+
{
|
|
853
|
+
position: 'bottom-left',
|
|
854
|
+
label: 'Import queued',
|
|
855
|
+
tone: 'info',
|
|
856
|
+
message: 'Static background, no blur.',
|
|
857
|
+
blur: false,
|
|
858
|
+
},
|
|
859
|
+
{
|
|
860
|
+
position: 'bottom-center',
|
|
861
|
+
label: 'Batch completed',
|
|
862
|
+
tone: 'success',
|
|
863
|
+
message: 'Bottom center rises into place.',
|
|
864
|
+
blur: 16,
|
|
865
|
+
},
|
|
866
|
+
{
|
|
867
|
+
position: 'bottom-right',
|
|
868
|
+
label: 'Export failed',
|
|
869
|
+
tone: 'danger',
|
|
870
|
+
message: 'Actionable toast from the right edge.',
|
|
871
|
+
blur: 12,
|
|
872
|
+
},
|
|
873
|
+
];
|
|
874
|
+
|
|
875
|
+
{toastPositions.map((item) => (
|
|
876
|
+
<Button
|
|
877
|
+
key={item.position}
|
|
878
|
+
size={1}
|
|
879
|
+
v='surface'
|
|
880
|
+
onClick={() =>
|
|
881
|
+
toast.info({
|
|
882
|
+
title: item.label,
|
|
883
|
+
message: 'Positioned toast with directional bubble animation.',
|
|
884
|
+
position: item.position,
|
|
885
|
+
duration: 3600,
|
|
886
|
+
})
|
|
887
|
+
}
|
|
888
|
+
>
|
|
889
|
+
{item.label}
|
|
890
|
+
</Button>
|
|
891
|
+
))}
|
|
892
|
+
|
|
893
|
+
<Button
|
|
894
|
+
size={1}
|
|
895
|
+
tone='success'
|
|
896
|
+
v='soft'
|
|
897
|
+
onClick={() => {
|
|
898
|
+
toastPositionVariants.forEach((item, index) => {
|
|
899
|
+
window.setTimeout(() => {
|
|
900
|
+
toast.push({
|
|
901
|
+
title: item.label,
|
|
902
|
+
message: item.message,
|
|
903
|
+
position: item.position,
|
|
904
|
+
tone: item.tone,
|
|
905
|
+
background: item.background,
|
|
906
|
+
blur: item.blur,
|
|
907
|
+
duration: 4200 + index * 220,
|
|
908
|
+
});
|
|
909
|
+
}, index * 120);
|
|
910
|
+
});
|
|
911
|
+
}}
|
|
912
|
+
>
|
|
913
|
+
Show all positions
|
|
914
|
+
</Button>`,
|
|
915
|
+
overlaySettings: `import {Button, Modal} from '@orcestr/ui';
|
|
916
|
+
|
|
917
|
+
<Modal
|
|
918
|
+
open={open}
|
|
919
|
+
onOpenChange={setOpen}
|
|
920
|
+
title='Blur modal'
|
|
921
|
+
overlayColor='transparent'
|
|
922
|
+
overlayOpacity={0}
|
|
923
|
+
overlayBlur={10}
|
|
924
|
+
animation='zoom-blur'
|
|
925
|
+
animationDuration='380ms'
|
|
926
|
+
radius={10}
|
|
927
|
+
>
|
|
928
|
+
Modal content
|
|
929
|
+
</Modal>
|
|
930
|
+
|
|
931
|
+
<Button onClick={() => setOpen(true)}>Open modal</Button>`,
|
|
932
|
+
data: `import {Button, DataTable, TextField, type DataTableSort} from '@orcestr/ui';
|
|
933
|
+
|
|
934
|
+
const [sort, setSort] = useState<DataTableSort | null>({key: 'name', direction: 'asc'});
|
|
935
|
+
const [selectedRowKeys, setSelectedRowKeys] = useState<string[]>([]);
|
|
936
|
+
const [visibleColumnKeys, setVisibleColumnKeys] = useState(columns.map((column) => column.key));
|
|
937
|
+
const [columnOrder, setColumnOrder] = useState(columns.map((column) => column.key));
|
|
938
|
+
const [columnWidths, setColumnWidths] = useState<Record<string, number>>({});
|
|
939
|
+
const resetTable = () => {
|
|
940
|
+
setVisibleColumnKeys(columns.map((column) => column.key));
|
|
941
|
+
setColumnOrder(columns.map((column) => column.key));
|
|
942
|
+
setColumnWidths({});
|
|
943
|
+
};
|
|
944
|
+
|
|
945
|
+
<DataTable
|
|
946
|
+
toolbar={
|
|
947
|
+
<>
|
|
948
|
+
<TextField value={query} onChange={(event) => setQuery(event.target.value)} clearable />
|
|
949
|
+
<Button onClick={resetTable}>Reset</Button>
|
|
950
|
+
</>
|
|
951
|
+
}
|
|
952
|
+
rowKey={(row) => row.name}
|
|
953
|
+
rows={rows}
|
|
954
|
+
columns={columns}
|
|
955
|
+
sort={sort}
|
|
956
|
+
onSortChange={(nextSort) => setSort(Array.isArray(nextSort) ? nextSort[0] ?? null : nextSort)}
|
|
957
|
+
selectable
|
|
958
|
+
selectedRowKeys={selectedRowKeys}
|
|
959
|
+
onSelectedRowKeysChange={setSelectedRowKeys}
|
|
960
|
+
columnSettings={{
|
|
961
|
+
columns,
|
|
962
|
+
visibleColumnKeys,
|
|
963
|
+
onVisibleColumnKeysChange: setVisibleColumnKeys,
|
|
964
|
+
columnOrder,
|
|
965
|
+
onColumnOrderChange: setColumnOrder,
|
|
966
|
+
columnWidths,
|
|
967
|
+
onColumnWidthsChange: setColumnWidths,
|
|
968
|
+
}}
|
|
969
|
+
/>
|
|
970
|
+
|
|
971
|
+
<DataTable
|
|
972
|
+
rowKey={(row) => row.name}
|
|
973
|
+
rows={rows.slice(0, 4)}
|
|
974
|
+
columns={columns}
|
|
975
|
+
/>`,
|
|
976
|
+
};
|