@orcestr/ui 0.0.1 → 0.1.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 (179) hide show
  1. package/README.md +4 -0
  2. package/README.ru.md +4 -0
  3. package/dist/components/Alert/Alert.d.ts +5 -4
  4. package/dist/components/Alert/Alert.d.ts.map +1 -1
  5. package/dist/components/Alert/Alert.js +5 -2
  6. package/dist/components/AppShell/AppShell.d.ts +2 -0
  7. package/dist/components/AppShell/AppShell.d.ts.map +1 -1
  8. package/dist/components/AppShell/AppShell.js +9 -6
  9. package/dist/components/AppSidebar/AppSidebar.d.ts +36 -0
  10. package/dist/components/AppSidebar/AppSidebar.d.ts.map +1 -0
  11. package/dist/components/AppSidebar/AppSidebar.js +53 -0
  12. package/dist/components/Badge/Badge.d.ts +8 -6
  13. package/dist/components/Badge/Badge.d.ts.map +1 -1
  14. package/dist/components/Badge/Badge.js +4 -4
  15. package/dist/components/BadgeSelectMenu/BadgeSelectMenu.d.ts +22 -0
  16. package/dist/components/BadgeSelectMenu/BadgeSelectMenu.d.ts.map +1 -0
  17. package/dist/components/BadgeSelectMenu/BadgeSelectMenu.js +50 -0
  18. package/dist/components/Box/Box.d.ts +2 -0
  19. package/dist/components/Box/Box.d.ts.map +1 -1
  20. package/dist/components/Box/Box.js +15 -2
  21. package/dist/components/Button/Button.d.ts +7 -3
  22. package/dist/components/Button/Button.d.ts.map +1 -1
  23. package/dist/components/Button/Button.js +23 -3
  24. package/dist/components/Card/Card.d.ts +26 -0
  25. package/dist/components/Card/Card.d.ts.map +1 -0
  26. package/dist/components/Card/Card.js +25 -0
  27. package/dist/components/Checkbox/Checkbox.d.ts +6 -2
  28. package/dist/components/Checkbox/Checkbox.d.ts.map +1 -1
  29. package/dist/components/Checkbox/Checkbox.js +13 -4
  30. package/dist/components/CommandPalette/CommandPalette.d.ts.map +1 -1
  31. package/dist/components/CommandPalette/CommandPalette.js +10 -9
  32. package/dist/components/ConfirmDialog/ConfirmDialog.d.ts.map +1 -1
  33. package/dist/components/ConfirmDialog/ConfirmDialog.js +5 -2
  34. package/dist/components/ContextMenu/ContextMenu.d.ts.map +1 -1
  35. package/dist/components/ContextMenu/ContextMenu.js +2 -2
  36. package/dist/components/DatePicker/DatePicker.d.ts.map +1 -1
  37. package/dist/components/DatePicker/DatePicker.js +9 -1
  38. package/dist/components/Dialog/Dialog.d.ts +69 -1
  39. package/dist/components/Dialog/Dialog.d.ts.map +1 -1
  40. package/dist/components/Dialog/Dialog.js +48 -1
  41. package/dist/components/Drawer/Drawer.d.ts.map +1 -1
  42. package/dist/components/Drawer/Drawer.js +2 -2
  43. package/dist/components/EntityPicker/EntityPicker.d.ts +2 -1
  44. package/dist/components/EntityPicker/EntityPicker.d.ts.map +1 -1
  45. package/dist/components/EntityPicker/EntityPicker.js +2 -2
  46. package/dist/components/Flex/Flex.d.ts +5 -1
  47. package/dist/components/Flex/Flex.d.ts.map +1 -1
  48. package/dist/components/Flex/Flex.js +16 -3
  49. package/dist/components/Grid/Grid.d.ts +9 -2
  50. package/dist/components/Grid/Grid.d.ts.map +1 -1
  51. package/dist/components/Grid/Grid.js +22 -1
  52. package/dist/components/IconButton/IconButton.d.ts +19 -7
  53. package/dist/components/IconButton/IconButton.d.ts.map +1 -1
  54. package/dist/components/IconButton/IconButton.js +40 -5
  55. package/dist/components/IconTextButton/IconTextButton.d.ts +20 -0
  56. package/dist/components/IconTextButton/IconTextButton.d.ts.map +1 -0
  57. package/dist/components/IconTextButton/IconTextButton.js +24 -0
  58. package/dist/components/InlineEdit/InlineEdit.d.ts +63 -0
  59. package/dist/components/InlineEdit/InlineEdit.d.ts.map +1 -0
  60. package/dist/components/InlineEdit/InlineEdit.js +98 -0
  61. package/dist/components/LinkButton/LinkButton.d.ts +25 -0
  62. package/dist/components/LinkButton/LinkButton.d.ts.map +1 -0
  63. package/dist/components/LinkButton/LinkButton.js +12 -0
  64. package/dist/components/Modal/Modal.d.ts +29 -6
  65. package/dist/components/Modal/Modal.d.ts.map +1 -1
  66. package/dist/components/Modal/Modal.js +37 -13
  67. package/dist/components/Overlay/OverlayProvider.d.ts +1 -0
  68. package/dist/components/Overlay/OverlayProvider.d.ts.map +1 -1
  69. package/dist/components/Overlay/OverlayProvider.js +18 -1
  70. package/dist/components/PaginatedCombobox/PaginatedCombobox.d.ts +2 -1
  71. package/dist/components/PaginatedCombobox/PaginatedCombobox.d.ts.map +1 -1
  72. package/dist/components/PaginatedCombobox/PaginatedCombobox.js +3 -3
  73. package/dist/components/Popover/Popover.d.ts +37 -3
  74. package/dist/components/Popover/Popover.d.ts.map +1 -1
  75. package/dist/components/Popover/Popover.js +56 -9
  76. package/dist/components/ScrollArea/ScrollArea.d.ts +4 -0
  77. package/dist/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  78. package/dist/components/ScrollArea/ScrollArea.js +30 -4
  79. package/dist/components/Section/Section.d.ts +2 -0
  80. package/dist/components/Section/Section.d.ts.map +1 -1
  81. package/dist/components/SegmentedControl/SegmentedControl.d.ts +24 -1
  82. package/dist/components/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  83. package/dist/components/SegmentedControl/SegmentedControl.js +28 -2
  84. package/dist/components/Select/Select.d.ts +36 -4
  85. package/dist/components/Select/Select.d.ts.map +1 -1
  86. package/dist/components/Select/Select.js +70 -3
  87. package/dist/components/Separator/Separator.d.ts +3 -1
  88. package/dist/components/Separator/Separator.d.ts.map +1 -1
  89. package/dist/components/Separator/Separator.js +4 -2
  90. package/dist/components/SpecialModal/SpecialModal.d.ts +43 -0
  91. package/dist/components/SpecialModal/SpecialModal.d.ts.map +1 -0
  92. package/dist/components/SpecialModal/SpecialModal.js +34 -0
  93. package/dist/components/Spinner/Spinner.d.ts +3 -1
  94. package/dist/components/Spinner/Spinner.d.ts.map +1 -1
  95. package/dist/components/Spinner/Spinner.js +2 -2
  96. package/dist/components/State/State.d.ts +8 -1
  97. package/dist/components/State/State.d.ts.map +1 -1
  98. package/dist/components/State/State.js +2 -2
  99. package/dist/components/Switch/Switch.d.ts +2 -0
  100. package/dist/components/Switch/Switch.d.ts.map +1 -1
  101. package/dist/components/Switch/Switch.js +2 -1
  102. package/dist/components/Table/Table.d.ts +64 -0
  103. package/dist/components/Table/Table.d.ts.map +1 -0
  104. package/dist/components/Table/Table.js +38 -0
  105. package/dist/components/Tabs/Tabs.d.ts +33 -2
  106. package/dist/components/Tabs/Tabs.d.ts.map +1 -1
  107. package/dist/components/Tabs/Tabs.js +189 -4
  108. package/dist/components/Text/Text.d.ts +13 -3
  109. package/dist/components/Text/Text.d.ts.map +1 -1
  110. package/dist/components/Text/Text.js +16 -3
  111. package/dist/components/TextArea/TextArea.d.ts.map +1 -1
  112. package/dist/components/TextArea/TextArea.js +1 -1
  113. package/dist/components/TextField/TextField.d.ts.map +1 -1
  114. package/dist/components/TextField/TextField.js +1 -1
  115. package/dist/components/Toast/Toast.d.ts +1 -0
  116. package/dist/components/Toast/Toast.d.ts.map +1 -1
  117. package/dist/components/Toast/Toast.js +19 -8
  118. package/dist/components/Tooltip/Tooltip.d.ts +11 -3
  119. package/dist/components/Tooltip/Tooltip.d.ts.map +1 -1
  120. package/dist/components/Tooltip/Tooltip.js +58 -9
  121. package/dist/example/CodePreview.d.ts.map +1 -1
  122. package/dist/example/CodePreview.js +3 -3
  123. package/dist/example/ExampleActionsSection.d.ts.map +1 -1
  124. package/dist/example/ExampleActionsSection.js +3 -3
  125. package/dist/example/ExampleApplicationSection.d.ts +7 -0
  126. package/dist/example/ExampleApplicationSection.d.ts.map +1 -0
  127. package/dist/example/ExampleApplicationSection.js +68 -0
  128. package/dist/example/ExampleBasicsSections.d.ts.map +1 -1
  129. package/dist/example/ExampleBasicsSections.js +5 -9
  130. package/dist/example/ExampleDataSection.d.ts.map +1 -1
  131. package/dist/example/ExampleDataSection.js +31 -30
  132. package/dist/example/ExampleFieldsSection.d.ts.map +1 -1
  133. package/dist/example/ExampleFieldsSection.js +51 -3
  134. package/dist/example/ExampleFoundationsSection.js +1 -1
  135. package/dist/example/ExampleOverlays.d.ts.map +1 -1
  136. package/dist/example/ExampleOverlays.js +7 -2
  137. package/dist/example/ExampleOverlaysSection.d.ts.map +1 -1
  138. package/dist/example/ExampleOverlaysSection.js +5 -2
  139. package/dist/example/ExampleSelectionSection.d.ts +3 -1
  140. package/dist/example/ExampleSelectionSection.d.ts.map +1 -1
  141. package/dist/example/ExampleSelectionSection.js +10 -3
  142. package/dist/example/ExampleStateSection.d.ts +3 -0
  143. package/dist/example/ExampleStateSection.d.ts.map +1 -1
  144. package/dist/example/ExampleStateSection.js +58 -3
  145. package/dist/example/ExampleThemePlayground.d.ts +101 -71
  146. package/dist/example/ExampleThemePlayground.d.ts.map +1 -1
  147. package/dist/example/ExampleThemePlayground.js +137 -74
  148. package/dist/example/UiExamplePage.d.ts +7 -1
  149. package/dist/example/UiExamplePage.d.ts.map +1 -1
  150. package/dist/example/UiExamplePage.js +72 -27
  151. package/dist/example/codeSamples.d.ts +7 -0
  152. package/dist/example/codeSamples.d.ts.map +1 -1
  153. package/dist/example/codeSamples.js +429 -60
  154. package/dist/example/exampleData.d.ts.map +1 -1
  155. package/dist/example/exampleData.js +16 -2
  156. package/dist/example/styles.css +245 -74
  157. package/dist/hooks/useFloatingPosition.js +1 -1
  158. package/dist/hooks/usePresence.d.ts.map +1 -1
  159. package/dist/hooks/usePresence.js +9 -7
  160. package/dist/index.d.ts +8 -1
  161. package/dist/index.d.ts.map +1 -1
  162. package/dist/index.js +8 -1
  163. package/dist/styles/orcestr-ui.css +2545 -672
  164. package/dist/theme/ThemeProvider.d.ts.map +1 -1
  165. package/dist/theme/ThemeProvider.js +90 -36
  166. package/dist/theme/defaultTheme.d.ts.map +1 -1
  167. package/dist/theme/defaultTheme.js +322 -194
  168. package/dist/theme/systemProps.d.ts +48 -28
  169. package/dist/theme/systemProps.d.ts.map +1 -1
  170. package/dist/theme/systemProps.js +103 -1
  171. package/dist/theme/themeTypes.d.ts +21 -17
  172. package/dist/theme/themeTypes.d.ts.map +1 -1
  173. package/dist/utils/slot.d.ts +11 -0
  174. package/dist/utils/slot.d.ts.map +1 -0
  175. package/dist/utils/slot.js +18 -0
  176. package/package.json +2 -2
  177. package/dist/components/Workflow/Workflow.d.ts +0 -82
  178. package/dist/components/Workflow/Workflow.d.ts.map +0 -1
  179. package/dist/components/Workflow/Workflow.js +0 -73
@@ -4,7 +4,7 @@ export const codeSamples = {
4
4
  <Stack g={3}>
5
5
  <Stack g={1}>
6
6
  <Text as='h1' fs='28px' fw={780} lh={1.1}>
7
- Workflow review
7
+ Operations review
8
8
  </Text>
9
9
  <Text as='h2' fs='20px' fw={720} lh={1.2}>
10
10
  Review window and status
@@ -21,7 +21,7 @@ export const codeSamples = {
21
21
  </Stack>
22
22
 
23
23
  <Flex g={2} wrap>
24
- <Text tone='brand' fw={700}>Brand</Text>
24
+ <Text tone='primary' fw={700}>Primary</Text>
25
25
  <Text tone='success' fw={700}>Success</Text>
26
26
  <Text tone='warning' fw={700}>Warning</Text>
27
27
  <Text tone='danger' fw={700}>Danger</Text>
@@ -36,7 +36,7 @@ export const codeSamples = {
36
36
 
37
37
  <Flex g={2} wrap>
38
38
  <Badge>Neutral</Badge>
39
- <Badge tone='brand'>Brand</Badge>
39
+ <Badge tone='primary'>Primary</Badge>
40
40
  <Badge tone='success'>Success</Badge>
41
41
  <Badge tone='warning'>Warning</Badge>
42
42
  <Badge tone='danger'>Danger</Badge>
@@ -50,57 +50,112 @@ export const codeSamples = {
50
50
  <Skeleton h={16} w='64%' />
51
51
  <Skeleton h={36} />
52
52
  </Stack>`,
53
- appShell: `import {
53
+ appShell: `import {useState} from 'react';
54
+ import {
54
55
  AppShell,
55
56
  AppShellContent,
56
57
  AppShellHeader,
57
- AppShellNav,
58
- AppShellSidebar,
58
+ AppSidebar,
59
+ Badge,
59
60
  Button,
60
- OrcestrUiProvider,
61
- Stack,
61
+ Flex,
62
+ IconButton,
63
+ IconTextButton,
64
+ PageTitleBlock,
65
+ SpecialModal,
62
66
  Text,
63
67
  } from '@orcestr/ui';
68
+ import {LuBell, LuBox, LuCalendar, LuClipboardList, LuEllipsis, LuMessageSquare, LuSearch, LuTruck} from 'react-icons/lu';
64
69
 
65
- <OrcestrUiProvider surface='operations' locale='ru'>
66
- <AppShell
67
- sidebarOpen={mobileOpen}
68
- onSidebarOpenChange={setMobileOpen}
69
- header={
70
- <AppShellHeader
71
- visibility='mobile'
72
- title='Operations'
70
+ const [open, setOpen] = useState(false);
71
+ const [mobileOpen, setMobileOpen] = useState(false);
72
+ const [previewMode, setPreviewMode] = useState<'desktop' | 'phone'>('desktop');
73
+ const [activeKey, setActiveKey] = useState('requests');
74
+
75
+ const groups = [
76
+ {
77
+ key: 'demand',
78
+ items: [
79
+ {key: 'requests', label: 'Requests', icon: <LuTruck />, active: activeKey === 'requests'},
80
+ {key: 'orders', label: 'Supplier orders', icon: <LuClipboardList />, active: activeKey === 'orders'},
81
+ ],
82
+ },
83
+ {
84
+ key: 'operations',
85
+ items: [
86
+ {key: 'products', label: 'Products', icon: <LuBox />, active: activeKey === 'products'},
87
+ {key: 'calendar', label: 'Calendar', icon: <LuCalendar />, active: activeKey === 'calendar'},
88
+ ],
89
+ },
90
+ ];
91
+
92
+ <>
93
+ <Button onClick={() => setOpen(true)}>Open AppShell preview</Button>
94
+ <SpecialModal open={open} onOpenChange={setOpen} size='full' scroll='body'>
95
+ <SpecialModal.Header
96
+ title='AppShell preview'
97
+ meta={<Badge tone='primary'>{previewMode}</Badge>}
98
+ actions={(
99
+ <>
100
+ <Button size={2} v='surface' onClick={() => setPreviewMode((mode) => mode === 'desktop' ? 'phone' : 'desktop')}>
101
+ Toggle preview
102
+ </Button>
103
+ <SpecialModal.Close />
104
+ </>
105
+ )}
106
+ />
107
+ <SpecialModal.Body>
108
+ <AppShell
109
+ sidebarMode={previewMode === 'phone' ? 'mobile' : 'desktop'}
73
110
  sidebarOpen={mobileOpen}
74
111
  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>}
112
+ sidebarWidth={300}
113
+ contentInset={0}
114
+ maxWidth='100%'
115
+ header={(
116
+ <AppShellHeader
117
+ visibility='always'
118
+ sidebarOpen={mobileOpen}
119
+ onSidebarOpenChange={previewMode === 'phone' ? setMobileOpen : undefined}
120
+ actions={(
121
+ <Flex a='c' g={1}>
122
+ <IconTextButton size={2} v='soft' tone='neutral' icon={<LuSearch />}>Quick jump</IconTextButton>
123
+ <IconButton size={2} v='ghost' icon={<LuBell />} badge={64} aria-label='Notifications' />
124
+ <IconButton size={2} v='ghost' icon={<LuMessageSquare />} badge={99} aria-label='Messages' />
125
+ </Flex>
126
+ )}
127
+ >
128
+ <Text fw={760}>Deliveries</Text>
129
+ </AppShellHeader>
130
+ )}
131
+ sidebar={(
132
+ <AppSidebar
133
+ header={<div className='oui-app-sidebar-brand'><span className='oui-app-sidebar-logo'>O</span><span className='oui-app-sidebar-title'>Deliveries</span></div>}
134
+ itemH={38}
135
+ onNavigate={(item) => setActiveKey(item.key)}
136
+ groups={groups}
137
+ />
138
+ )}
84
139
  >
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>`,
140
+ <AppShellContent scroll={false}>
141
+ <PageTitleBlock
142
+ title='Requests'
143
+ caption='Module workspace with responsive header and AppSidebar navigation.'
144
+ badge='shell'
145
+ action={<IconButton size={2} v='pad' icon={<LuEllipsis />} aria-label='More actions' />}
146
+ />
147
+ {children}
148
+ </AppShellContent>
149
+ </AppShell>
150
+ </SpecialModal.Body>
151
+ </SpecialModal>
152
+ </>`,
98
153
  layoutFlex: `import {Badge, Button, Flex, Text} from '@orcestr/ui';
99
154
 
100
155
  <Flex col g={3}>
101
156
  <Flex row g={2} a='c' j='sb' wrap>
102
157
  <Flex row g={2} a='c' wrap>
103
- <Badge tone='brand'>status</Badge>
158
+ <Badge tone='primary'>status</Badge>
104
159
  <Text fw={700}>Task TASK-2048</Text>
105
160
  </Flex>
106
161
  <Flex row g={1} a='c'>
@@ -234,7 +289,7 @@ const [detailsOpen, setDetailsOpen] = useState(true);
234
289
  <Stack g={1}>
235
290
  {rows.map((row, index) => (
236
291
  <Flex key={row.id} row g={2} p={2} r={3} a='c'>
237
- <Badge tone={index < 3 ? 'brand' : 'info'}>
292
+ <Badge tone={index < 3 ? 'primary' : 'info'}>
238
293
  {index + 1}
239
294
  </Badge>
240
295
  <Stack g={0}>
@@ -258,6 +313,28 @@ const [detailsOpen, setDetailsOpen] = useState(true);
258
313
  <Button mt={2} v='pad' r={7}>
259
314
  Button r=7
260
315
  </Button>`,
316
+ surfaces: `import {Alert, Button, Card, Grid, Section, Separator, Stack, Text} from '@orcestr/ui';
317
+
318
+ <Section g={3}>
319
+ <Grid columns='repeat(auto-fit, minmax(min(100%, 180px), 1fr))' g={2}>
320
+ <Card v='surface' interactive>
321
+ <Stack g={1}>
322
+ <Text fw={760}>Surface card</Text>
323
+ <Text fs='12px' tone='muted'>Default operational surface.</Text>
324
+ </Stack>
325
+ </Card>
326
+ <Card v='soft'>
327
+ <Stack g={1}>
328
+ <Text fw={760}>Soft card</Text>
329
+ <Text fs='12px' tone='muted'>Quiet grouped content.</Text>
330
+ </Stack>
331
+ </Card>
332
+ </Grid>
333
+ <Separator />
334
+ <Alert title='Inventory sync delayed' action={<Button size={1} v='surface'>Retry</Button>}>
335
+ Check this status before creating the next shipment.
336
+ </Alert>
337
+ </Section>`,
261
338
  buttons: `import {Button, Spinner} from '@orcestr/ui';
262
339
  import {LuCheck, LuInfo, LuTrash2, LuTriangleAlert} from 'react-icons/lu';
263
340
 
@@ -295,22 +372,40 @@ import {LuCheck, LuInfo, LuTrash2, LuTriangleAlert} from 'react-icons/lu';
295
372
  <Button size={3} tone='success' loading leftIcon={<LuCheck size={16} />}>Success</Button>
296
373
  <Spinner />`,
297
374
  iconButtons: `import {Button, IconButton, Menu, Tooltip} from '@orcestr/ui';
298
- import {LuBell, LuCheck, LuCommand, LuEllipsis, LuInfo} from 'react-icons/lu';
375
+ import {
376
+ LuBell,
377
+ LuCheck,
378
+ LuCommand,
379
+ LuDownload,
380
+ LuEllipsis,
381
+ LuInfo,
382
+ LuMessageSquare,
383
+ LuRefreshCw,
384
+ LuSearch,
385
+ LuSettings,
386
+ LuShield,
387
+ LuUpload,
388
+ } from 'react-icons/lu';
299
389
 
300
390
  <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' />
391
+ <IconButton v='soft' icon={<LuSearch size={17} />} aria-label='Search icon' />
392
+ <IconButton v='surface' icon={<LuUpload size={17} />} aria-label='Upload icon' />
393
+ <IconButton v='pad' icon={<LuShield size={17} />} aria-label='Security icon' />
304
394
  <IconButton v='outline' icon={<LuInfo size={17} />} aria-label='Outline icon' />
305
395
  <IconButton v='ghost' icon={<LuEllipsis size={17} />} aria-label='Ghost icon' />
306
396
 
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' />
397
+ <IconButton size={1} v='surface' icon={<LuSearch size={13} />} aria-label='Size 1 search' />
398
+ <IconButton size={2} v='surface' icon={<LuDownload size={15} />} aria-label='Size 2 download' />
399
+ <IconButton size={3} v='surface' icon={<LuRefreshCw size={17} />} aria-label='Size 3 refresh' />
400
+ <IconButton size={4} v='surface' icon={<LuSettings size={19} />} aria-label='Size 4 settings' />
311
401
 
312
402
  <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' />
403
+ <IconButton size={3} v='outline' loading icon={<LuRefreshCw size={17} />} aria-label='Loading icon' />
404
+
405
+ <IconButton v='surface' icon={<LuBell size={17} />} badge={64} aria-label='Notifications' />
406
+ <IconButton v='surface' icon={<LuMessageSquare size={17} />} badge={99} aria-label='Unread chats' />
407
+ <IconButton v='pad' icon={<LuShield size={17} />} badge={3} badgeTone='warning' aria-label='Security warnings' />
408
+ <IconButton v='ghost' icon={<LuDownload size={17} />} badge='new' badgeTone='info' aria-label='New export' />
314
409
 
315
410
  <IconButton size={1} v='ghost' icon={<LuEllipsis size={13} />} aria-label='Ghost size 1' />
316
411
  <IconButton size={2} v='ghost' icon={<LuEllipsis size={15} />} aria-label='Ghost size 2' />
@@ -318,10 +413,10 @@ import {LuBell, LuCheck, LuCommand, LuEllipsis, LuInfo} from 'react-icons/lu';
318
413
  <IconButton size={4} v='ghost' icon={<LuEllipsis size={19} />} aria-label='Ghost size 4' />
319
414
 
320
415
  <Tooltip content='Notifications'>
321
- <IconButton v='surface' icon={<LuBell size={17} />} aria-label='Notifications' />
416
+ <IconButton v='surface' icon={<LuBell size={17} />} badge={8} aria-label='Notifications' />
322
417
  </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' />
418
+ <IconButton v='surface' loading icon={<LuRefreshCw size={17} />} aria-label='Loading action' />
419
+ <IconButton v='pad' icon={<LuSettings size={17} />} aria-label='Pad action' />
325
420
  <Menu
326
421
  trigger={<IconButton v='surface' icon={<LuEllipsis size={17} />} aria-label='Actions' />}
327
422
  items={menuItems}
@@ -329,6 +424,35 @@ import {LuBell, LuCheck, LuCommand, LuEllipsis, LuInfo} from 'react-icons/lu';
329
424
  <Button v='surface' leftIcon={<LuCommand size={16} />} onClick={openPalette}>
330
425
  Commands
331
426
  </Button>`,
427
+ iconTextButton: `import {IconTextButton} from '@orcestr/ui';
428
+ import {LuCopy, LuExternalLink, LuPackagePlus} from 'react-icons/lu';
429
+
430
+ <IconTextButton icon={<LuPackagePlus size={16} />}>
431
+ Create PO
432
+ </IconTextButton>
433
+ <IconTextButton v='soft' tone='info' icon={<LuCopy size={16} />}>
434
+ Duplicate
435
+ </IconTextButton>
436
+ <IconTextButton href='/requests' v='surface' icon={<LuExternalLink size={16} />}>
437
+ Link action
438
+ </IconTextButton>
439
+ <IconTextButton v='outline' iconSide='end' icon={<LuExternalLink size={16} />}>
440
+ Open details
441
+ </IconTextButton>`,
442
+ contextMenu: `import {ContextMenu, Text, type MenuItem} from '@orcestr/ui';
443
+
444
+ const items: MenuItem[] = [
445
+ {key: 'open', label: 'Open'},
446
+ {key: 'copy', label: 'Copy link'},
447
+ {key: 'delete', label: 'Delete', tone: 'danger', separatorBefore: true},
448
+ ];
449
+
450
+ <ContextMenu items={items}>
451
+ <div className='row'>
452
+ <Text fs='13px' fw={760}>Right-click this row</Text>
453
+ <Text fs='12px' tone='muted'>Context menu reuses Menu item styling.</Text>
454
+ </div>
455
+ </ContextMenu>`,
332
456
  textFields: `import {Button, Flex, Field, TextArea, TextField} from '@orcestr/ui';
333
457
  import {LuSearch} from 'react-icons/lu';
334
458
 
@@ -346,6 +470,120 @@ import {LuSearch} from 'react-icons/lu';
346
470
  <Field label='Comment'>
347
471
  <TextArea rows={4} placeholder='Internal note' />
348
472
  </Field>`,
473
+ inlineEdit: `import {useState} from 'react';
474
+ import {Badge, Field, IconButton, InlineEditField, InlineEditMultiField, Listbox, Popover, Stack} from '@orcestr/ui';
475
+ import {LuCheck, LuPencil} from 'react-icons/lu';
476
+
477
+ const [supplierOpen, setSupplierOpen] = useState(false);
478
+ const [paymentOpen, setPaymentOpen] = useState(false);
479
+ const [supplierKey, setSupplierKey] = useState('northwind');
480
+ const [paymentTermKey, setPaymentTermKey] = useState('net30');
481
+ const [ownerOpen, setOwnerOpen] = useState(false);
482
+ const [ownerKeys, setOwnerKeys] = useState(['michael', 'team']);
483
+ const supplier = suppliers.find((item) => item.key === supplierKey);
484
+ const paymentTerm = paymentTerms.find((item) => item.key === paymentTermKey);
485
+ const selectedOwners = owners.filter((item) => ownerKeys.includes(item.key));
486
+ const toggleOwner = (key) => {
487
+ setOwnerKeys((current) =>
488
+ current.includes(key)
489
+ ? current.filter((item) => item !== key)
490
+ : [...current, key],
491
+ );
492
+ };
493
+
494
+ <Stack g={3}>
495
+ <Field label='Single value'>
496
+ <InlineEditField
497
+ label={supplier?.label ?? 'Choose supplier'}
498
+ meta='Supplier'
499
+ onOpen={() => setSupplierOpen(true)}
500
+ action={
501
+ <Popover
502
+ open={supplierOpen}
503
+ onOpenChange={setSupplierOpen}
504
+ trigger={<IconButton size={1} v='ghost' icon={<LuPencil size={13} />} />}
505
+ className='oui-combobox-content'
506
+ >
507
+ <Listbox
508
+ className='oui-combobox-options'
509
+ items={suppliers.map((item) => ({value: item.key, label: item.label}))}
510
+ value={supplierKey}
511
+ onValueChange={(next) => {
512
+ setSupplierKey(next);
513
+ setSupplierOpen(false);
514
+ }}
515
+ />
516
+ </Popover>
517
+ }
518
+ />
519
+ </Field>
520
+ <Field label='Single value without meta'>
521
+ <InlineEditField
522
+ label={paymentTerm?.label ?? 'Choose payment terms'}
523
+ onOpen={() => setPaymentOpen(true)}
524
+ action={
525
+ <Popover
526
+ open={paymentOpen}
527
+ onOpenChange={setPaymentOpen}
528
+ trigger={<IconButton size={1} v='ghost' icon={<LuPencil size={13} />} />}
529
+ className='oui-combobox-content'
530
+ >
531
+ <Listbox
532
+ className='oui-combobox-options'
533
+ items={paymentTerms.map((item) => ({value: item.key, label: item.label}))}
534
+ value={paymentTermKey}
535
+ onValueChange={(next) => {
536
+ setPaymentTermKey(next);
537
+ setPaymentOpen(false);
538
+ }}
539
+ />
540
+ </Popover>
541
+ }
542
+ />
543
+ </Field>
544
+ <Field label='Multiple values'>
545
+ <InlineEditMultiField
546
+ onOpen={() => setOwnerOpen(true)}
547
+ action={(
548
+ <span onClick={(event) => event.stopPropagation()}>
549
+ <Popover
550
+ open={ownerOpen}
551
+ onOpenChange={setOwnerOpen}
552
+ trigger={<IconButton size={1} v='ghost' icon={<LuPencil size={13} />} />}
553
+ className='oui-combobox-content'
554
+ >
555
+ <Stack g={1} p={1}>
556
+ {owners.map((item) => {
557
+ const selected = ownerKeys.includes(item.key);
558
+ return (
559
+ <button
560
+ key={item.key}
561
+ type='button'
562
+ className='oui-combobox-option'
563
+ data-selected={selected ? 'true' : 'false'}
564
+ onClick={() => toggleOwner(item.key)}
565
+ >
566
+ <span className='oui-multi-select-check'>
567
+ {selected ? <LuCheck size={13} /> : null}
568
+ </span>
569
+ <span className='oui-combobox-option-main'>
570
+ {item.label}
571
+ </span>
572
+ </button>
573
+ );
574
+ })}
575
+ </Stack>
576
+ </Popover>
577
+ </span>
578
+ )}
579
+ col
580
+ >
581
+ {selectedOwners.map((item) => (
582
+ <Badge key={item.key} tone='neutral' v='soft'>{item.label}</Badge>
583
+ ))}
584
+ </InlineEditMultiField>
585
+ </Field>
586
+ </Stack>`,
349
587
  groupedFields: `import {Button, Flex, Field, Grid, Section, Stack, Text, TextArea, TextField} from '@orcestr/ui';
350
588
 
351
589
  <Section g={3}>
@@ -391,7 +629,7 @@ import {LuSearch} from 'react-icons/lu';
391
629
  today='2026-06-26'
392
630
  onValueChange={setDateRange}
393
631
  />`,
394
- selection: `import {Combobox, EntityPicker, MultiSelect, Select, SegmentedControl} from '@orcestr/ui';
632
+ selection: `import {Combobox, EntityPicker, MultiSelect, PaginatedCombobox, Select, SegmentedControl} from '@orcestr/ui';
395
633
  import {LuPlus} from 'react-icons/lu';
396
634
 
397
635
  <Select items={items} value={status} onValueChange={setStatus} clearable />
@@ -454,6 +692,27 @@ import {LuPlus} from 'react-icons/lu';
454
692
  onClick: addEntity,
455
693
  }}
456
694
  />
695
+ <PaginatedCombobox
696
+ value={paginatedValue}
697
+ onChange={setPaginatedValue}
698
+ loadPage={(page, search) => loadEntityPage(locale, page, search)}
699
+ getItemId={(item) => item.id}
700
+ renderSelectedLabel={(item) => item.article}
701
+ renderOption={(item) => (
702
+ <span className='oui-entity-option-main'>
703
+ <span className='oui-entity-option-code'>{item.article}</span>
704
+ <span className='oui-entity-option-meta'>{item.name}</span>
705
+ </span>
706
+ )}
707
+ placeholder='Paginated combobox'
708
+ clearable
709
+ searchAction={{label: 'Create entity from search', onClick: createEntity}}
710
+ optionAction={{
711
+ icon: <LuPlus size={14} />,
712
+ label: (item) => 'Add ' + item.article,
713
+ onClick: addEntity,
714
+ }}
715
+ />
457
716
  <SegmentedControl
458
717
  items={[
459
718
  {value: 'active', label: 'Active'},
@@ -566,7 +825,7 @@ import {LuChevronDown} from 'react-icons/lu';
566
825
  overlayColor='transparent'
567
826
  overlayOpacity={0}
568
827
  overlayBlur={10}
569
- borderColor='color-mix(in srgb, var(--oui-brand) 34%, var(--oui-border))'
828
+ borderColor='color-mix(in srgb, var(--oui-primary-base) 34%, var(--oui-border))'
570
829
  radius={10}
571
830
  shadow='0 24px 90px rgb(0 0 0 / 44%)'
572
831
  footer={
@@ -595,7 +854,7 @@ import {LuChevronDown} from 'react-icons/lu';
595
854
  overlayColor='transparent'
596
855
  overlayOpacity={0}
597
856
  overlayBlur={8}
598
- borderColor='color-mix(in srgb, var(--oui-brand) 38%, var(--oui-border))'
857
+ borderColor='color-mix(in srgb, var(--oui-primary-base) 38%, var(--oui-border))'
599
858
  radius={10}
600
859
  footer={
601
860
  <Flex g={2} j='e' w='100%'>
@@ -619,7 +878,7 @@ import {LuChevronDown} from 'react-icons/lu';
619
878
  overlayColor='transparent'
620
879
  overlayOpacity={0}
621
880
  overlayBlur={6}
622
- borderColor='color-mix(in srgb, var(--oui-brand) 42%, var(--oui-border))'
881
+ borderColor='color-mix(in srgb, var(--oui-primary-base) 42%, var(--oui-border))'
623
882
  radius={10}
624
883
  >
625
884
  <Stack g={3}>
@@ -657,7 +916,7 @@ import {LuChevronDown} from 'react-icons/lu';
657
916
  overlayOpacity={0}
658
917
  overlayBlur={14}
659
918
  animationDuration='1200ms'
660
- borderColor='color-mix(in srgb, var(--oui-brand) 42%, var(--oui-border))'
919
+ borderColor='color-mix(in srgb, var(--oui-primary-base) 42%, var(--oui-border))'
661
920
  radius={10}
662
921
  >
663
922
  <Stack g={3}>
@@ -692,7 +951,7 @@ import {LuChevronDown} from 'react-icons/lu';
692
951
  overlayColor='#3b0712'
693
952
  overlayOpacity={0.48}
694
953
  overlayBlur={3}
695
- borderColor='color-mix(in srgb, var(--oui-danger) 46%, var(--oui-border))'
954
+ borderColor='color-mix(in srgb, var(--oui-danger-base) 46%, var(--oui-border))'
696
955
  radius={8}
697
956
  footer={
698
957
  <Flex g={2} j='e' w='100%'>
@@ -714,10 +973,10 @@ import {LuChevronDown} from 'react-icons/lu';
714
973
  {
715
974
  key: 'create-record',
716
975
  label: 'Create record',
717
- description: 'Start a workflow.',
976
+ description: 'Start a new record.',
718
977
  shortcut: 'C',
719
978
  group: 'Create',
720
- keywords: ['new', 'workflow'],
979
+ keywords: ['new', 'record'],
721
980
  onSelect: () => toast.info('Create record action'),
722
981
  },
723
982
  ]}
@@ -929,6 +1188,116 @@ const toastPositionVariants: Array<{
929
1188
  </Modal>
930
1189
 
931
1190
  <Button onClick={() => setOpen(true)}>Open modal</Button>`,
1191
+ tablePagination: `import {Badge, Flex, Pagination, Stack, Table, Text} from '@orcestr/ui';
1192
+
1193
+ <Stack g={3}>
1194
+ <Table v='surface' w='100%'>
1195
+ <Table.Header>
1196
+ <Table.Row>
1197
+ <Table.ColumnHeaderCell>Document</Table.ColumnHeaderCell>
1198
+ <Table.ColumnHeaderCell>Status</Table.ColumnHeaderCell>
1199
+ <Table.ColumnHeaderCell align='right'>Qty</Table.ColumnHeaderCell>
1200
+ </Table.Row>
1201
+ </Table.Header>
1202
+ <Table.Body>
1203
+ {rows.map((row) => (
1204
+ <Table.Row key={row.name}>
1205
+ <Table.RowHeaderCell>{row.name}</Table.RowHeaderCell>
1206
+ <Table.Cell><Badge>{row.status}</Badge></Table.Cell>
1207
+ <Table.Cell align='right'>{row.quantity}</Table.Cell>
1208
+ </Table.Row>
1209
+ ))}
1210
+ </Table.Body>
1211
+ </Table>
1212
+ <Flex j='sb' a='c' wrap g={2}>
1213
+ <Text fs='13px' tone='muted'>Showing 25 items per page</Text>
1214
+ <Pagination page={page} pageCount={4} onPageChange={setPage} />
1215
+ </Flex>
1216
+ </Stack>`,
1217
+ appSidebar: `import {useState} from 'react';
1218
+ import {AppSidebar, Flex, IconButton, Text} from '@orcestr/ui';
1219
+ import {LuBell, LuBox, LuLayoutDashboard, LuSettings, LuTruck} from 'react-icons/lu';
1220
+
1221
+ const [activeKey, setActiveKey] = useState('requests');
1222
+
1223
+ <AppSidebar
1224
+ header={(
1225
+ <>
1226
+ <div className='oui-app-sidebar-brand'>
1227
+ <span className='oui-app-sidebar-logo'>O</span>
1228
+ <span className='oui-app-sidebar-title'>Deliveries</span>
1229
+ </div>
1230
+ <div className='oui-app-sidebar-actions'>
1231
+ <IconButton size={2} v='ghost' icon={<LuSettings />} />
1232
+ </div>
1233
+ </>
1234
+ )}
1235
+ itemH={38}
1236
+ onNavigate={(item) => setActiveKey(item.key)}
1237
+ groups={[
1238
+ {
1239
+ key: 'main',
1240
+ items: [
1241
+ {
1242
+ key: 'overview',
1243
+ label: 'Overview',
1244
+ icon: <LuLayoutDashboard />,
1245
+ active: activeKey === 'overview',
1246
+ },
1247
+ {
1248
+ key: 'requests',
1249
+ label: 'Requests',
1250
+ icon: <LuTruck />,
1251
+ active: activeKey === 'requests',
1252
+ },
1253
+ {
1254
+ key: 'products',
1255
+ label: 'Products',
1256
+ icon: <LuBox />,
1257
+ active: activeKey === 'products',
1258
+ },
1259
+ ],
1260
+ },
1261
+ ]}
1262
+ footer={(
1263
+ <Flex col g={2}>
1264
+ <Flex g={1}>
1265
+ <IconButton size={2} v='ghost' icon={<LuBell />} badge={64} />
1266
+ <IconButton size={2} v='ghost' icon={<LuSettings />} />
1267
+ </Flex>
1268
+ <Text fs='12px' tone='muted'>Admin workspace</Text>
1269
+ </Flex>
1270
+ )}
1271
+ />`,
1272
+ specialModal: `import {Badge, Button, Flex, SpecialModal, Stack, Text} from '@orcestr/ui';
1273
+
1274
+ <SpecialModal open={open} onOpenChange={setOpen} size='lg' scroll='body'>
1275
+ <SpecialModal.Header
1276
+ title='Request PR-2026-0900'
1277
+ meta={<Badge tone='success'>Closed</Badge>}
1278
+ actions={<SpecialModal.Close />}
1279
+ />
1280
+ <SpecialModal.Body>
1281
+ <Stack g={3}>
1282
+ <Flex g={4} wrap>
1283
+ <Stack g={0} w='min(100%, 220px)'>
1284
+ <Text fs='12px' tone='muted'>Supplier</Text>
1285
+ <Text fw={760}>Northwind Trading LLC</Text>
1286
+ </Stack>
1287
+ <Stack g={0} w='min(100%, 180px)'>
1288
+ <Text fs='12px' tone='muted'>Plan arrival</Text>
1289
+ <Text fw={760}>25.06.2026</Text>
1290
+ </Stack>
1291
+ </Flex>
1292
+ </Stack>
1293
+ </SpecialModal.Body>
1294
+ <SpecialModal.Footer>
1295
+ <Flex g={2} j='e' w='100%'>
1296
+ <Button v='surface' onClick={() => setOpen(false)}>Close</Button>
1297
+ <Button>Save</Button>
1298
+ </Flex>
1299
+ </SpecialModal.Footer>
1300
+ </SpecialModal>`,
932
1301
  data: `import {Button, DataTable, TextField, type DataTableSort} from '@orcestr/ui';
933
1302
 
934
1303
  const [sort, setSort] = useState<DataTableSort | null>({key: 'name', direction: 'asc'});
@@ -1 +1 @@
1
- {"version":3,"file":"exampleData.d.ts","sourceRoot":"","sources":["../../src/example/exampleData.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,kBAAkB,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAC,MAAM,IAAI,CAAC;AAEnF,MAAM,MAAM,cAAc,GAAG;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;CACpC,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,eAAe,EA4EtC,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,cAAc,EAA8C,CAAC;AACpF,eAAO,MAAM,aAAa,+BAAyD,CAAC;AA0GpF,MAAM,MAAM,YAAY,GAAG;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAClB,CAAC;AAgBF,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,iBAErD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,wBAEtD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe;;;IAEpD;AAMD,wBAAsB,cAAc,CAChC,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM;;;;;;GAiBjB"}
1
+ {"version":3,"file":"exampleData.d.ts","sourceRoot":"","sources":["../../src/example/exampleData.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,kBAAkB,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAC,MAAM,IAAI,CAAC;AAEnF,MAAM,MAAM,cAAc,GAAG;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;CACpC,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,eAAe,EA0FtC,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,cAAc,EAA8C,CAAC;AACpF,eAAO,MAAM,aAAa,+BAAyD,CAAC;AA0GpF,MAAM,MAAM,YAAY,GAAG;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAClB,CAAC;AAgBF,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,iBAErD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,wBAEtD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe;;;IAEpD;AAMD,wBAAsB,cAAc,CAChC,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM;;;;;;GAiBjB"}