@boxcustodia/library 2.0.0-alpha.13 → 2.0.0-alpha.15

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 (174) hide show
  1. package/dist/index.cjs.js +1 -138
  2. package/dist/index.d.ts +1083 -717
  3. package/dist/index.es.js +7059 -56179
  4. package/dist/theme.css +1 -1
  5. package/package.json +34 -26
  6. package/src/__doc__/Changelog.mdx +6 -6
  7. package/src/__doc__/Examples.tsx +1 -1
  8. package/src/__doc__/Intro.mdx +3 -3
  9. package/src/__doc__/Tabs.mdx +112 -0
  10. package/src/__doc__/V2.mdx +1245 -0
  11. package/src/components/accordion/accordion.stories.tsx +143 -0
  12. package/src/components/accordion/accordion.tsx +135 -0
  13. package/src/components/accordion/index.ts +1 -0
  14. package/src/components/alert/alert.stories.tsx +24 -4
  15. package/src/components/alert/alert.tsx +17 -9
  16. package/src/components/alert-dialog/alert-dialog.stories.tsx +24 -0
  17. package/src/components/alert-dialog/alert-dialog.test.tsx +1 -1
  18. package/src/components/alert-dialog/alert-dialog.tsx +58 -10
  19. package/src/components/auto-complete/auto-complete.stories.tsx +615 -200
  20. package/src/components/auto-complete/auto-complete.tsx +420 -68
  21. package/src/components/auto-complete/index.ts +0 -1
  22. package/src/components/avatar/avatar.stories.tsx +162 -21
  23. package/src/components/avatar/avatar.tsx +79 -20
  24. package/src/components/button/button.stories.tsx +236 -294
  25. package/src/components/button/button.test.tsx +10 -17
  26. package/src/components/button/button.tsx +53 -18
  27. package/src/components/button/components/base-button.tsx +25 -53
  28. package/src/components/button/index.ts +0 -1
  29. package/src/components/calendar/calendar.stories.tsx +1 -1
  30. package/src/components/calendar/calendar.tsx +4 -4
  31. package/src/components/card/card.stories.tsx +140 -69
  32. package/src/components/card/card.tsx +155 -54
  33. package/src/components/center/center.stories.tsx +22 -39
  34. package/src/components/checkbox/checkbox.stories.tsx +25 -5
  35. package/src/components/checkbox/checkbox.tsx +76 -15
  36. package/src/components/checkbox-group/checkbox-group.stories.tsx +116 -28
  37. package/src/components/checkbox-group/checkbox-group.tsx +84 -3
  38. package/src/components/combobox/combobox.stories.tsx +33 -23
  39. package/src/components/combobox/combobox.tsx +120 -104
  40. package/src/components/date-picker/date-input.stories.tsx +14 -6
  41. package/src/components/date-picker/date-input.tsx +3 -3
  42. package/src/components/date-picker/date-picker.model.ts +13 -4
  43. package/src/components/date-picker/date-picker.stories.tsx +38 -12
  44. package/src/components/date-picker/date-picker.tsx +29 -15
  45. package/src/components/dialog/dialog.stories.tsx +18 -0
  46. package/src/components/dialog/dialog.test.tsx +1 -1
  47. package/src/components/dialog/dialog.tsx +51 -20
  48. package/src/components/divider/divider.stories.tsx +6 -0
  49. package/src/components/dropzone/dropzone.stories.tsx +70 -90
  50. package/src/components/dropzone/dropzone.tsx +383 -105
  51. package/src/components/dropzone/index.ts +0 -1
  52. package/src/components/empty/empty.stories.tsx +164 -0
  53. package/src/components/empty/empty.tsx +156 -0
  54. package/src/components/empty/index.ts +1 -0
  55. package/src/components/field/field.stories.tsx +226 -3
  56. package/src/components/field/field.tsx +77 -42
  57. package/src/components/form/form.stories.tsx +320 -197
  58. package/src/components/form/form.tsx +3 -23
  59. package/src/components/index.ts +2 -6
  60. package/src/components/input/input.stories.tsx +5 -5
  61. package/src/components/input/input.tsx +5 -5
  62. package/src/components/kbd/kbd.stories.tsx +1 -0
  63. package/src/components/label/label.stories.tsx +16 -0
  64. package/src/components/label/label.tsx +13 -2
  65. package/src/components/loader/loader.stories.tsx +7 -5
  66. package/src/components/loader/loader.tsx +8 -3
  67. package/src/components/menu/menu-primitives.tsx +207 -196
  68. package/src/components/menu/menu.stories.tsx +275 -146
  69. package/src/components/menu/menu.tsx +146 -54
  70. package/src/components/number-input/number-input.stories.tsx +27 -4
  71. package/src/components/number-input/number-input.test.tsx +2 -2
  72. package/src/components/number-input/number-input.tsx +29 -33
  73. package/src/components/otp/index.ts +1 -0
  74. package/src/components/otp/otp.stories.tsx +209 -0
  75. package/src/components/otp/otp.tsx +100 -0
  76. package/src/components/pagination/index.ts +1 -0
  77. package/src/components/pagination/pagination.model.ts +2 -0
  78. package/src/components/pagination/pagination.stories.tsx +153 -59
  79. package/src/components/pagination/pagination.test.tsx +122 -57
  80. package/src/components/pagination/pagination.tsx +575 -77
  81. package/src/components/password/password.stories.tsx +18 -3
  82. package/src/components/password/password.tsx +26 -10
  83. package/src/components/popover/popover.stories.tsx +26 -5
  84. package/src/components/popover/popover.tsx +15 -23
  85. package/src/components/progress/progress.stories.tsx +1 -0
  86. package/src/components/radio-group/index.ts +1 -0
  87. package/src/components/radio-group/radio-group.stories.tsx +251 -0
  88. package/src/components/radio-group/radio-group.tsx +212 -0
  89. package/src/components/scroll-area/scroll-area.stories.tsx +1 -0
  90. package/src/components/select/select.stories.tsx +118 -19
  91. package/src/components/select/select.tsx +67 -62
  92. package/src/components/skeleton/skeleton.stories.tsx +1 -0
  93. package/src/components/stack/stack.stories.tsx +179 -89
  94. package/src/components/stack/stack.tsx +2 -2
  95. package/src/components/stepper/index.ts +1 -1
  96. package/src/components/stepper/stepper.stories.tsx +766 -83
  97. package/src/components/stepper/stepper.test.tsx +18 -18
  98. package/src/components/stepper/stepper.tsx +554 -0
  99. package/src/components/switch/switch.stories.tsx +15 -1
  100. package/src/components/switch/switch.tsx +17 -4
  101. package/src/components/table/index.ts +0 -2
  102. package/src/components/table/table.stories.tsx +131 -18
  103. package/src/components/table/table.test.tsx +1 -1
  104. package/src/components/table/table.tsx +183 -77
  105. package/src/components/tabs/tabs.stories.tsx +372 -155
  106. package/src/components/tabs/tabs.test.tsx +12 -12
  107. package/src/components/tabs/tabs.tsx +72 -149
  108. package/src/components/tag/index.ts +0 -1
  109. package/src/components/tag/tag.stories.tsx +147 -120
  110. package/src/components/tag/tag.tsx +47 -95
  111. package/src/components/textarea/textarea.stories.tsx +8 -22
  112. package/src/components/textarea/textarea.tsx +17 -79
  113. package/src/components/timeline/timeline.stories.tsx +322 -42
  114. package/src/components/timeline/timeline.tsx +359 -132
  115. package/src/components/toast/toast.stories.tsx +1 -0
  116. package/src/components/tooltip/tooltip.tsx +11 -9
  117. package/src/components/tree/index.ts +0 -1
  118. package/src/components/tree/tree.stories.tsx +364 -408
  119. package/src/components/tree/tree.test.tsx +163 -0
  120. package/src/components/tree/tree.tsx +212 -36
  121. package/src/hooks/useAsync/__doc__/useAsync.stories.tsx +5 -5
  122. package/src/hooks/useClipboard/__doc__/useClipboard.stories.tsx +1 -3
  123. package/src/hooks/useDebounceCallback/__doc__/useDebouncedCallback.stories.tsx +6 -6
  124. package/src/hooks/useDocumentTitle/__doc__/useDocumentTitle.stories.tsx +1 -1
  125. package/src/hooks/useEventListener/__test__/useEventListener.test.tsx +1 -1
  126. package/src/hooks/useLocalStorage/__doc__/useLocalStorage.stories.tsx +1 -1
  127. package/src/hooks/usePagination/usePagination.tsx +36 -24
  128. package/src/styles/theme.css +1 -1
  129. package/src/utils/form.tsx +69 -37
  130. package/src/utils/index.ts +1 -1
  131. package/src/__doc__/Migration.mdx +0 -451
  132. package/src/components/auto-complete/auto-complete-primitives.tsx +0 -155
  133. package/src/components/background-image/background-image.stories.tsx +0 -21
  134. package/src/components/background-image/background-image.test.tsx +0 -29
  135. package/src/components/background-image/background-image.tsx +0 -23
  136. package/src/components/background-image/index.ts +0 -1
  137. package/src/components/button/button.variants.ts +0 -44
  138. package/src/components/button/components/loader-overlay.tsx +0 -21
  139. package/src/components/button/components/loading-icon.tsx +0 -47
  140. package/src/components/dropzone/upload-primitives.tsx +0 -310
  141. package/src/components/dropzone/use-dropzone.ts +0 -122
  142. package/src/components/empty-state/empty-state.stories.tsx +0 -56
  143. package/src/components/empty-state/empty-state.tsx +0 -39
  144. package/src/components/empty-state/index.ts +0 -1
  145. package/src/components/heading/heading.stories.tsx +0 -74
  146. package/src/components/heading/heading.tsx +0 -28
  147. package/src/components/heading/heading.variants.ts +0 -27
  148. package/src/components/heading/index.ts +0 -1
  149. package/src/components/kbd/kbd.variants.ts +0 -26
  150. package/src/components/menu/util/render-menu-item.tsx +0 -54
  151. package/src/components/multi-select/hooks/use-multi-select.ts +0 -66
  152. package/src/components/multi-select/index.ts +0 -1
  153. package/src/components/multi-select/multi-select.stories.tsx +0 -294
  154. package/src/components/multi-select/multi-select.tsx +0 -300
  155. package/src/components/multi-select/multi-select.variants.ts +0 -22
  156. package/src/components/pagination/components/pagination-option.tsx +0 -27
  157. package/src/components/show/index.ts +0 -1
  158. package/src/components/show/show.stories.tsx +0 -197
  159. package/src/components/show/show.test.tsx +0 -41
  160. package/src/components/show/show.tsx +0 -16
  161. package/src/components/stepper/Stepper.tsx +0 -190
  162. package/src/components/stepper/context/stepper-context.tsx +0 -11
  163. package/src/components/table/table-primitives.tsx +0 -122
  164. package/src/components/table/table.model.ts +0 -20
  165. package/src/components/table-pagination/index.ts +0 -2
  166. package/src/components/table-pagination/table-pagination.model.ts +0 -2
  167. package/src/components/table-pagination/table-pagination.stories.tsx +0 -23
  168. package/src/components/table-pagination/table-pagination.test.tsx +0 -32
  169. package/src/components/table-pagination/table-pagination.tsx +0 -108
  170. package/src/components/tabs/context/tabs-context.tsx +0 -14
  171. package/src/components/tag/tag.variants.ts +0 -31
  172. package/src/components/timeline/timeline-status.ts +0 -5
  173. package/src/components/tree/hooks/use-controllable-tree-state.ts +0 -80
  174. package/src/components/tree/tree-primitives.tsx +0 -126
@@ -1,11 +1,14 @@
1
+ import type { Meta, StoryObj } from "@storybook/react-vite";
2
+ import { MoreHorizontal } from "lucide-react";
3
+ import { useState } from "react";
4
+ import { action } from "storybook/actions";
1
5
  import {
2
6
  Button,
3
7
  Menu,
4
- MenuContent,
5
8
  MenuGroup,
6
9
  MenuItem,
7
10
  MenuLabel,
8
- MenuPortal,
11
+ MenuPopup,
9
12
  MenuRoot,
10
13
  MenuSeparator,
11
14
  MenuShortcut,
@@ -14,190 +17,316 @@ import {
14
17
  MenuSubTrigger,
15
18
  MenuTrigger,
16
19
  } from "../../components";
17
- import { createToastManager, ToastProvider } from "../toast";
18
-
19
- const toastManager = createToastManager();
20
-
21
- import type { Meta, StoryObj } from "@storybook/react-vite";
22
- import {
23
- Archive,
24
- Bell,
25
- Calendar,
26
- CheckCircle,
27
- Clipboard,
28
- LogOut,
29
- PlusCircle,
30
- Settings,
31
- Tag,
32
- Trash2,
33
- } from "lucide-react";
34
- import { useMemo, useState } from "react";
35
- import { MenuItemType } from ".";
36
20
 
21
+ /**
22
+ * Data-driven dropdown menu. Pass an `items` array to declaratively render all
23
+ * supported types: `"item"`, `"checkbox"`, `"radio"`, `"radio-group"`, `"group"`,
24
+ * `"label"`, `"separator"`, `"submenu"`. Primitives are also exported for direct
25
+ * composition — see the `Primitive` story.
26
+ */
37
27
  const meta: Meta<typeof Menu> = {
38
- title: "Data display/Menu",
28
+ title: "Components/Menu",
39
29
  component: Menu,
30
+ parameters: {
31
+ layout: "centered",
32
+ },
33
+ args: {
34
+ trigger: (
35
+ <Button variant="ghost" size="icon">
36
+ <MoreHorizontal />
37
+ </Button>
38
+ ),
39
+ },
40
+ argTypes: {
41
+ classNames: { control: false },
42
+ },
40
43
  };
41
44
 
42
45
  export default meta;
43
46
  type Story = StoryObj<typeof Menu>;
44
47
 
48
+ export const Default: Story = {
49
+ render: (args) => (
50
+ <Menu
51
+ {...args}
52
+ items={[
53
+ { type: "item", label: "Profile", onSelect: action("profile") },
54
+ { type: "item", label: "Settings", onSelect: action("settings") },
55
+ { type: "separator" },
56
+ { type: "item", label: "Log out", onSelect: action("logout") },
57
+ ]}
58
+ />
59
+ ),
60
+ };
61
+
45
62
  /**
46
- * ```tsx
47
- * type ItemType = "item" | "checkbox" | "radio" | "label" | "separator" | "submenu"
48
- * ```
63
+ * `className` estila el popup. `classNames` expone el slot `popup` con la
64
+ * misma semántica usá uno o el otro, lo que sea más cómodo.
49
65
  */
50
- export const Generic: Story = {
51
- decorators: [
52
- (Story) => (
53
- <ToastProvider toastManager={toastManager}>
54
- <Story />
55
- </ToastProvider>
56
- ),
57
- ],
58
- render: (args) => {
59
- const [autosave, setAutosave] = useState<boolean>(true);
66
+ export const WithClassNames: Story = {
67
+ render: (args) => (
68
+ <Menu
69
+ {...args}
70
+ classNames={{ popup: "w-56" }}
71
+ items={[
72
+ { type: "item", label: "Profile", onSelect: action("profile") },
73
+ { type: "item", label: "Settings", onSelect: action("settings") },
74
+ ]}
75
+ />
76
+ ),
77
+ };
60
78
 
61
- const items: MenuItemType[] = useMemo(
62
- () => [
63
- { type: "item", label: "File" },
79
+ /**
80
+ * `shortcut` is display-only — rendered as a `MenuShortcut` span with no keyboard binding.
81
+ */
82
+ export const Shortcuts: Story = {
83
+ render: (args) => (
84
+ <Menu
85
+ {...args}
86
+ items={[
87
+ {
88
+ type: "item",
89
+ label: "New",
90
+ shortcut: "Ctrl+N",
91
+ onSelect: action("new"),
92
+ },
64
93
  {
65
94
  type: "item",
66
- label: "New File",
95
+ label: "Open",
67
96
  shortcut: "Ctrl+O",
68
- onShortcut: () =>
69
- toastManager.add({
70
- variant: "success",
71
- description: "New file created successfully",
72
- }),
97
+ onSelect: action("open"),
73
98
  },
74
- { type: "item", label: "Open File..." },
75
- { type: "separator" },
76
99
  {
77
- type: "checkbox",
78
- label: "Autosave",
79
- checked: autosave,
80
- onCheckedChange: setAutosave,
100
+ type: "item",
101
+ label: "Save",
102
+ shortcut: "Ctrl+S",
103
+ onSelect: action("save"),
81
104
  },
82
105
  { type: "separator" },
83
106
  {
84
- type: "submenu",
85
- label: "Export",
86
- items: [
87
- { type: "item", label: "PDF" },
88
- { type: "item", label: "Word Document" },
89
- ],
107
+ type: "item",
108
+ label: "Close",
109
+ shortcut: "Ctrl+W",
110
+ onSelect: action("close"),
90
111
  },
91
- ],
92
- [autosave],
112
+ ]}
113
+ />
114
+ ),
115
+ };
116
+
117
+ /**
118
+ * Checkbox items are controlled — pass `checked` and `onCheckedChange` per item.
119
+ */
120
+ export const Checkboxes: Story = {
121
+ render: (args) => {
122
+ const [notifications, setNotifications] = useState(true);
123
+ const [autosave, setAutosave] = useState(false);
124
+ const [spellcheck, setSpellcheck] = useState(true);
125
+
126
+ return (
127
+ <Menu
128
+ {...args}
129
+ items={[
130
+ { type: "label", label: "Editor" },
131
+ {
132
+ type: "checkbox",
133
+ label: "Notifications",
134
+ checked: notifications,
135
+ onCheckedChange: setNotifications,
136
+ },
137
+ {
138
+ type: "checkbox",
139
+ label: "Autosave",
140
+ checked: autosave,
141
+ onCheckedChange: setAutosave,
142
+ },
143
+ {
144
+ type: "checkbox",
145
+ label: "Spell check",
146
+ checked: spellcheck,
147
+ onCheckedChange: setSpellcheck,
148
+ },
149
+ ]}
150
+ />
93
151
  );
152
+ },
153
+ };
154
+
155
+ /**
156
+ * Radio items must be wrapped in a `"radio-group"` entry. Controlled via `value` and
157
+ * `onValueChange` on the group — not per item.
158
+ */
159
+ export const RadioGroup: Story = {
160
+ render: (args) => {
161
+ const [theme, setTheme] = useState("system");
94
162
 
95
163
  return (
96
- <Menu {...args} trigger={<Button>Open Menu</Button>} items={items} />
164
+ <Menu
165
+ {...args}
166
+ items={[
167
+ { type: "label", label: "Appearance" },
168
+ {
169
+ type: "radio-group",
170
+ value: theme,
171
+ onValueChange: setTheme,
172
+ items: [
173
+ { type: "radio", label: "Light", value: "light" },
174
+ { type: "radio", label: "Dark", value: "dark" },
175
+ { type: "radio", label: "System", value: "system" },
176
+ ],
177
+ },
178
+ ]}
179
+ />
97
180
  );
98
181
  },
99
182
  };
100
183
 
101
184
  /**
102
- * Se exportan los primitivos para poder construir cualquier tipo de Menu
185
+ * `"group"` wraps related items under an optional label rendered as `MenuLabel`.
186
+ */
187
+ export const Groups: Story = {
188
+ render: (args) => (
189
+ <Menu
190
+ {...args}
191
+ items={[
192
+ {
193
+ type: "group",
194
+ label: "Clipboard",
195
+ items: [
196
+ {
197
+ type: "item",
198
+ label: "Cut",
199
+ shortcut: "Ctrl+X",
200
+ onSelect: action("cut"),
201
+ },
202
+ {
203
+ type: "item",
204
+ label: "Copy",
205
+ shortcut: "Ctrl+C",
206
+ onSelect: action("copy"),
207
+ },
208
+ {
209
+ type: "item",
210
+ label: "Paste",
211
+ shortcut: "Ctrl+V",
212
+ onSelect: action("paste"),
213
+ },
214
+ ],
215
+ },
216
+ { type: "separator" },
217
+ {
218
+ type: "group",
219
+ label: "Selection",
220
+ items: [
221
+ {
222
+ type: "item",
223
+ label: "Select All",
224
+ shortcut: "Ctrl+A",
225
+ onSelect: action("select-all"),
226
+ },
227
+ { type: "item", label: "Deselect", onSelect: action("deselect") },
228
+ ],
229
+ },
230
+ ]}
231
+ />
232
+ ),
233
+ };
234
+
235
+ export const Submenu: Story = {
236
+ render: (args) => (
237
+ <Menu
238
+ {...args}
239
+ items={[
240
+ { type: "item", label: "Copy link", onSelect: action("copy-link") },
241
+ {
242
+ type: "submenu",
243
+ label: "Export as",
244
+ items: [
245
+ { type: "item", label: "PDF", onSelect: action("export-pdf") },
246
+ { type: "item", label: "CSV", onSelect: action("export-csv") },
247
+ { type: "item", label: "JSON", onSelect: action("export-json") },
248
+ ],
249
+ },
250
+ ]}
251
+ />
252
+ ),
253
+ };
254
+
255
+ /**
256
+ * `variant="error"` applies destructive styling via `data-[variant=error]` on the item.
257
+ */
258
+ export const Error: Story = {
259
+ render: (args) => (
260
+ <Menu
261
+ {...args}
262
+ items={[
263
+ { type: "item", label: "Profile", onSelect: action("profile") },
264
+ { type: "item", label: "Billing", onSelect: action("billing") },
265
+ { type: "separator" },
266
+ {
267
+ type: "item",
268
+ label: "Delete account",
269
+ variant: "error",
270
+ onSelect: action("delete"),
271
+ },
272
+ ]}
273
+ />
274
+ ),
275
+ };
276
+
277
+ /**
278
+ * Direct primitive composition for fully custom menu layouts.
279
+ *
280
+ * ```tsx
281
+ * <MenuRoot>
282
+ * <MenuTrigger render={<Button variant="ghost" size="icon"><MoreHorizontal /></Button>} />
283
+ * <MenuPopup>
284
+ * <MenuGroup>
285
+ * <MenuLabel>Section</MenuLabel>
286
+ * <MenuItem onSelect={() => {}}>Item</MenuItem>
287
+ * </MenuGroup>
288
+ * </MenuPopup>
289
+ * </MenuRoot>
290
+ * ```
103
291
  */
104
292
  export const Primitive: Story = {
105
- decorators: [
106
- (Story) => (
107
- <ToastProvider toastManager={toastManager}>
108
- <Story />
109
- </ToastProvider>
110
- ),
111
- ],
112
293
  render: () => (
113
294
  <MenuRoot>
114
- <MenuTrigger asChild>
115
- <Button variant="outline">Menu</Button>
116
- </MenuTrigger>
117
- <MenuContent className="w-56">
118
- <MenuLabel>Task Manager</MenuLabel>
119
- <MenuSeparator />
295
+ <MenuTrigger
296
+ render={
297
+ <Button variant="ghost" size="icon">
298
+ <MoreHorizontal />
299
+ </Button>
300
+ }
301
+ />
302
+ <MenuPopup className="w-56">
120
303
  <MenuGroup>
121
- <MenuItem>
122
- <Clipboard className="mr-2 h-4 w-4" />
123
- <span>All Tasks</span>
124
- </MenuItem>
125
- <MenuItem>
126
- <CheckCircle className="mr-2 h-4 w-4" />
127
- <span>Completed</span>
128
- </MenuItem>
129
- <MenuItem>
130
- <Calendar className="mr-2 h-4 w-4" />
131
- <span>Upcoming</span>
132
- </MenuItem>
304
+ <MenuLabel>Workspace</MenuLabel>
133
305
  </MenuGroup>
134
306
  <MenuSeparator />
135
307
  <MenuGroup>
136
- <MenuSub>
137
- <MenuSubTrigger>
138
- <Tag className="mr-2 h-4 w-4" />
139
- <span>Categories</span>
140
- </MenuSubTrigger>
141
- <MenuPortal>
142
- <MenuSubContent>
143
- <MenuItem>
144
- <Tag className="mr-2 h-4 w-4" />
145
- <span>Work</span>
146
- </MenuItem>
147
- <MenuItem>
148
- <Tag className="mr-2 h-4 w-4" />
149
- <span>Personal</span>
150
- </MenuItem>
151
- <MenuItem>
152
- <Tag className="mr-2 h-4 w-4" />
153
- <span>Shopping</span>
154
- </MenuItem>
155
- <MenuItem>
156
- <PlusCircle className="mr-2 h-4 w-4" />
157
- <span>Create category</span>
158
- </MenuItem>
159
- </MenuSubContent>
160
- </MenuPortal>
161
- </MenuSub>
162
- <MenuItem>
163
- <PlusCircle className="mr-2 h-4 w-4" />
164
- <span>Add Task</span>
165
- <MenuShortcut
166
- keys="ctrl+b"
167
- handler={() =>
168
- toastManager.add({
169
- variant: "success",
170
- description: "Creando tarea...",
171
- })
172
- }
173
- >
174
- Ctrl+B
175
- </MenuShortcut>
176
- </MenuItem>
308
+ <MenuItem onSelect={action("tasks")}>All Tasks</MenuItem>
309
+ <MenuItem onSelect={action("completed")}>Completed</MenuItem>
310
+ <MenuItem onSelect={action("upcoming")}>Upcoming</MenuItem>
177
311
  </MenuGroup>
178
312
  <MenuSeparator />
179
- <MenuItem>
180
- <Bell className="mr-2 h-4 w-4" />
181
- <span>Notifications</span>
182
- </MenuItem>
183
- <MenuItem>
184
- <Settings className="mr-2 h-4 w-4" />
185
- <span>Settings</span>
186
- </MenuItem>
187
- <MenuItem>
188
- <Trash2 className="mr-2 h-4 w-4" />
189
- <span>Trash</span>
190
- </MenuItem>
191
- <MenuItem disabled>
192
- <Archive className="mr-2 h-4 w-4" />
193
- <span>Archived</span>
194
- </MenuItem>
313
+ <MenuSub>
314
+ <MenuSubTrigger>Categories</MenuSubTrigger>
315
+ <MenuSubContent>
316
+ <MenuItem onSelect={action("work")}>Work</MenuItem>
317
+ <MenuItem onSelect={action("personal")}>Personal</MenuItem>
318
+ <MenuItem onSelect={action("shopping")}>Shopping</MenuItem>
319
+ </MenuSubContent>
320
+ </MenuSub>
195
321
  <MenuSeparator />
196
- <MenuItem>
197
- <LogOut className="mr-2 h-4 w-4" />
198
- <span>Log out</span>
322
+ <MenuItem onSelect={action("settings")}>
323
+ Settings
324
+ <MenuShortcut>Ctrl+,</MenuShortcut>
325
+ </MenuItem>
326
+ <MenuItem disabled onSelect={action("archived")}>
327
+ Archived
199
328
  </MenuItem>
200
- </MenuContent>
329
+ </MenuPopup>
201
330
  </MenuRoot>
202
331
  ),
203
332
  };