@postxl/generators 1.1.1 → 1.2.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 (161) hide show
  1. package/dist/frontend-core/frontend.generator.d.ts +0 -58
  2. package/dist/frontend-core/frontend.generator.js +6 -172
  3. package/dist/frontend-core/frontend.generator.js.map +1 -1
  4. package/dist/frontend-core/template/README.md +1 -1
  5. package/dist/frontend-core/template/src/components/admin/table-filter.tsx +1 -5
  6. package/dist/frontend-core/template/src/components/ui/color-mode-toggle/color-mode-toggle.tsx +10 -4
  7. package/dist/frontend-core/template/src/pages/dashboard/dashboard.page.tsx +2 -3
  8. package/dist/frontend-core/template/src/pages/error/default-error.page.tsx +1 -1
  9. package/dist/frontend-core/template/src/pages/error/not-found-error.page.tsx +1 -1
  10. package/dist/frontend-core/template/src/styles/styles.css +13 -1
  11. package/dist/frontend-core/template/tsconfig.json +2 -0
  12. package/dist/frontend-core/types/component.d.ts +1 -1
  13. package/dist/frontend-forms/generators/discriminated-union/fields.generator.js +4 -6
  14. package/dist/frontend-forms/generators/discriminated-union/fields.generator.js.map +1 -1
  15. package/dist/frontend-forms/generators/discriminated-union/inputs.generator.js +1 -1
  16. package/dist/frontend-forms/generators/discriminated-union/inputs.generator.js.map +1 -1
  17. package/dist/frontend-forms/generators/enum/inputs.generator.js +1 -1
  18. package/dist/frontend-forms/generators/enum/inputs.generator.js.map +1 -1
  19. package/dist/frontend-forms/generators/model/forms.generator.js +8 -12
  20. package/dist/frontend-forms/generators/model/forms.generator.js.map +1 -1
  21. package/dist/frontend-forms/generators/model/inputs.generator.js +2 -6
  22. package/dist/frontend-forms/generators/model/inputs.generator.js.map +1 -1
  23. package/dist/frontend-forms/template/src/components/ui/field/field.tsx +1 -4
  24. package/dist/frontend-tables/generators/model-table.generator.js +1 -5
  25. package/dist/frontend-tables/generators/model-table.generator.js.map +1 -1
  26. package/package.json +3 -2
  27. package/dist/frontend-core/template/src/components/ui/accordion/accordion.stories.tsx +0 -47
  28. package/dist/frontend-core/template/src/components/ui/accordion/accordion.tsx +0 -52
  29. package/dist/frontend-core/template/src/components/ui/admin-sidebar/admin-sidebar.tsx +0 -195
  30. package/dist/frontend-core/template/src/components/ui/alert/alert.stories.tsx +0 -61
  31. package/dist/frontend-core/template/src/components/ui/alert/alert.tsx +0 -45
  32. package/dist/frontend-core/template/src/components/ui/alert-dialog/alert-dialog.stories.tsx +0 -52
  33. package/dist/frontend-core/template/src/components/ui/alert-dialog/alert-dialog.tsx +0 -105
  34. package/dist/frontend-core/template/src/components/ui/avatar/avatar.stories.tsx +0 -30
  35. package/dist/frontend-core/template/src/components/ui/avatar/avatar.tsx +0 -39
  36. package/dist/frontend-core/template/src/components/ui/badge/badge.stories.tsx +0 -78
  37. package/dist/frontend-core/template/src/components/ui/badge/badge.tsx +0 -48
  38. package/dist/frontend-core/template/src/components/ui/breadcrumb/breadcrumb.stories.tsx +0 -67
  39. package/dist/frontend-core/template/src/components/ui/breadcrumb/breadcrumb.tsx +0 -85
  40. package/dist/frontend-core/template/src/components/ui/button/button.stories.tsx +0 -150
  41. package/dist/frontend-core/template/src/components/ui/button/button.tsx +0 -68
  42. package/dist/frontend-core/template/src/components/ui/calendar/calendar.stories.tsx +0 -160
  43. package/dist/frontend-core/template/src/components/ui/calendar/calendar.tsx +0 -293
  44. package/dist/frontend-core/template/src/components/ui/card/card.stories.tsx +0 -77
  45. package/dist/frontend-core/template/src/components/ui/card/card.tsx +0 -45
  46. package/dist/frontend-core/template/src/components/ui/card-hover/card-hover.stories.tsx +0 -29
  47. package/dist/frontend-core/template/src/components/ui/card-hover/card-hover.tsx +0 -28
  48. package/dist/frontend-core/template/src/components/ui/carousel/carousel.stories.tsx +0 -154
  49. package/dist/frontend-core/template/src/components/ui/carousel/carousel.tsx +0 -227
  50. package/dist/frontend-core/template/src/components/ui/checkbox/checkbox.stories.tsx +0 -106
  51. package/dist/frontend-core/template/src/components/ui/checkbox/checkbox.tsx +0 -88
  52. package/dist/frontend-core/template/src/components/ui/checkbox/shadcn-checkbox.stories.tsx +0 -90
  53. package/dist/frontend-core/template/src/components/ui/checkbox/shadcn-checkbox.tsx +0 -54
  54. package/dist/frontend-core/template/src/components/ui/collapse/collapse.stories.tsx +0 -52
  55. package/dist/frontend-core/template/src/components/ui/collapse/collapse.tsx +0 -9
  56. package/dist/frontend-core/template/src/components/ui/combobox/combobox.stories.tsx +0 -207
  57. package/dist/frontend-core/template/src/components/ui/combobox/combobox.tsx +0 -79
  58. package/dist/frontend-core/template/src/components/ui/command/command.stories.tsx +0 -186
  59. package/dist/frontend-core/template/src/components/ui/command/command.tsx +0 -165
  60. package/dist/frontend-core/template/src/components/ui/command-palette/command-palette.stories.tsx +0 -160
  61. package/dist/frontend-core/template/src/components/ui/command-palette/command-palette.tsx +0 -134
  62. package/dist/frontend-core/template/src/components/ui/content-frame/content-frame.stories.tsx +0 -198
  63. package/dist/frontend-core/template/src/components/ui/content-frame/content-frame.tsx +0 -100
  64. package/dist/frontend-core/template/src/components/ui/context-menu/context-menu.stories.tsx +0 -78
  65. package/dist/frontend-core/template/src/components/ui/context-menu/context-menu.tsx +0 -179
  66. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/cell-variant-types.ts +0 -11
  67. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/checkbox-cell.tsx +0 -116
  68. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/date-cell.tsx +0 -157
  69. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/gantt-cell.tsx +0 -82
  70. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/long-text-cell.tsx +0 -180
  71. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/multi-select-cell.tsx +0 -280
  72. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/number-cell.tsx +0 -169
  73. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/react-node-cell.tsx +0 -33
  74. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/select-cell.tsx +0 -175
  75. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/short-text-cell.tsx +0 -138
  76. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/utils/gantt-timeline.tsx +0 -92
  77. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/utils/gantt-timerange-picker.tsx +0 -330
  78. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-cell-wrapper.tsx +0 -212
  79. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-cell.tsx +0 -157
  80. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-column-header.tsx +0 -340
  81. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-context-menu.tsx +0 -271
  82. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-row.tsx +0 -123
  83. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-search.tsx +0 -211
  84. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-types.ts +0 -159
  85. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-utils.ts +0 -67
  86. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-view-menu.tsx +0 -360
  87. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid.stories.tsx +0 -780
  88. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid.tsx +0 -217
  89. package/dist/frontend-core/template/src/components/ui/data-grid/hooks/use-callback-ref.ts +0 -22
  90. package/dist/frontend-core/template/src/components/ui/data-grid/hooks/use-data-grid.tsx +0 -1892
  91. package/dist/frontend-core/template/src/components/ui/data-grid/hooks/use-debounced-callback.ts +0 -19
  92. package/dist/frontend-core/template/src/components/ui/data-grid/styles.css +0 -3
  93. package/dist/frontend-core/template/src/components/ui/data-table/context-menu-simple.tsx +0 -141
  94. package/dist/frontend-core/template/src/components/ui/data-table/data-table.stories.tsx +0 -146
  95. package/dist/frontend-core/template/src/components/ui/data-table/data-table.tsx +0 -447
  96. package/dist/frontend-core/template/src/components/ui/data-table/renderers/country-array-cell-renderer.tsx +0 -77
  97. package/dist/frontend-core/template/src/components/ui/data-table/renderers/country-cell-renderer.tsx +0 -56
  98. package/dist/frontend-core/template/src/components/ui/data-table/renderers/favorite-cell-renderer.tsx +0 -68
  99. package/dist/frontend-core/template/src/components/ui/data-table/renderers/links-cell-renderer.tsx +0 -205
  100. package/dist/frontend-core/template/src/components/ui/data-table/utils/columns.ts +0 -351
  101. package/dist/frontend-core/template/src/components/ui/data-table/utils/data-table.utils.ts +0 -49
  102. package/dist/frontend-core/template/src/components/ui/date-picker/date-picker.stories.tsx +0 -149
  103. package/dist/frontend-core/template/src/components/ui/date-picker/date-picker.tsx +0 -30
  104. package/dist/frontend-core/template/src/components/ui/dialog/dialog.stories.tsx +0 -80
  105. package/dist/frontend-core/template/src/components/ui/dialog/dialog.tsx +0 -134
  106. package/dist/frontend-core/template/src/components/ui/drawer/drawer.stories.tsx +0 -104
  107. package/dist/frontend-core/template/src/components/ui/drawer/drawer.tsx +0 -87
  108. package/dist/frontend-core/template/src/components/ui/dropdown-menu/dropdown-menu.stories.tsx +0 -168
  109. package/dist/frontend-core/template/src/components/ui/dropdown-menu/dropdown-menu.tsx +0 -225
  110. package/dist/frontend-core/template/src/components/ui/input/input.stories.tsx +0 -141
  111. package/dist/frontend-core/template/src/components/ui/input/input.tsx +0 -47
  112. package/dist/frontend-core/template/src/components/ui/label/label.stories.tsx +0 -41
  113. package/dist/frontend-core/template/src/components/ui/label/label.tsx +0 -20
  114. package/dist/frontend-core/template/src/components/ui/loader/loader.stories.tsx +0 -45
  115. package/dist/frontend-core/template/src/components/ui/loader/loader.tsx +0 -17
  116. package/dist/frontend-core/template/src/components/ui/mark-value-renderer/mark-value-renderer.stories.tsx +0 -114
  117. package/dist/frontend-core/template/src/components/ui/mark-value-renderer/mark-value-renderer.tsx +0 -48
  118. package/dist/frontend-core/template/src/components/ui/menubar/menu.stories.tsx +0 -134
  119. package/dist/frontend-core/template/src/components/ui/menubar/menubar.tsx +0 -208
  120. package/dist/frontend-core/template/src/components/ui/modal/modal.stories.tsx +0 -297
  121. package/dist/frontend-core/template/src/components/ui/modal/modal.tsx +0 -80
  122. package/dist/frontend-core/template/src/components/ui/navigation-menu/navigation-menu.stories.tsx +0 -213
  123. package/dist/frontend-core/template/src/components/ui/navigation-menu/navigation-menu.tsx +0 -142
  124. package/dist/frontend-core/template/src/components/ui/pagination/pagination.stories.tsx +0 -49
  125. package/dist/frontend-core/template/src/components/ui/pagination/pagination.tsx +0 -84
  126. package/dist/frontend-core/template/src/components/ui/popover/popover.stories.tsx +0 -82
  127. package/dist/frontend-core/template/src/components/ui/popover/popover.tsx +0 -55
  128. package/dist/frontend-core/template/src/components/ui/progress/progress.stories.tsx +0 -80
  129. package/dist/frontend-core/template/src/components/ui/progress/progress.tsx +0 -17
  130. package/dist/frontend-core/template/src/components/ui/radio-group/radio-group.stories.tsx +0 -154
  131. package/dist/frontend-core/template/src/components/ui/radio-group/radio-group.tsx +0 -68
  132. package/dist/frontend-core/template/src/components/ui/resizable/resizable.stories.tsx +0 -73
  133. package/dist/frontend-core/template/src/components/ui/resizable/resizeable.tsx +0 -38
  134. package/dist/frontend-core/template/src/components/ui/scroll-area/scroll-area.stories.tsx +0 -55
  135. package/dist/frontend-core/template/src/components/ui/scroll-area/scroll-area.tsx +0 -39
  136. package/dist/frontend-core/template/src/components/ui/select/select.stories.tsx +0 -297
  137. package/dist/frontend-core/template/src/components/ui/select/select.tsx +0 -227
  138. package/dist/frontend-core/template/src/components/ui/separator/separator.tsx +0 -21
  139. package/dist/frontend-core/template/src/components/ui/separator/seperator.stories.tsx +0 -25
  140. package/dist/frontend-core/template/src/components/ui/sheet/sheet.stories.tsx +0 -45
  141. package/dist/frontend-core/template/src/components/ui/sheet/sheet.tsx +0 -107
  142. package/dist/frontend-core/template/src/components/ui/skeleton/skeleton.stories.tsx +0 -26
  143. package/dist/frontend-core/template/src/components/ui/skeleton/skeleton.tsx +0 -7
  144. package/dist/frontend-core/template/src/components/ui/slider/slider.stories.tsx +0 -101
  145. package/dist/frontend-core/template/src/components/ui/slider/slider.tsx +0 -98
  146. package/dist/frontend-core/template/src/components/ui/spinner/spinner.stories.tsx +0 -19
  147. package/dist/frontend-core/template/src/components/ui/spinner/spinner.tsx +0 -21
  148. package/dist/frontend-core/template/src/components/ui/switch/switch.stories.tsx +0 -33
  149. package/dist/frontend-core/template/src/components/ui/switch/switch.tsx +0 -28
  150. package/dist/frontend-core/template/src/components/ui/tabs/tabs.stories.tsx +0 -215
  151. package/dist/frontend-core/template/src/components/ui/tabs/tabs.tsx +0 -70
  152. package/dist/frontend-core/template/src/components/ui/textarea/textarea.stories.tsx +0 -138
  153. package/dist/frontend-core/template/src/components/ui/textarea/textarea.tsx +0 -40
  154. package/dist/frontend-core/template/src/components/ui/toast/toast.mdx +0 -31
  155. package/dist/frontend-core/template/src/components/ui/toast/toast.stories.tsx +0 -89
  156. package/dist/frontend-core/template/src/components/ui/toggle/toggle.stories.tsx +0 -65
  157. package/dist/frontend-core/template/src/components/ui/toggle/toggle.tsx +0 -38
  158. package/dist/frontend-core/template/src/components/ui/toggle-group/toggle-group.stories.tsx +0 -85
  159. package/dist/frontend-core/template/src/components/ui/toggle-group/toggle-group.tsx +0 -54
  160. package/dist/frontend-core/template/src/components/ui/tooltip/tooltip.stories.tsx +0 -29
  161. package/dist/frontend-core/template/src/components/ui/tooltip/tooltip.tsx +0 -29
@@ -1,297 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite'
2
- import { expect, userEvent, screen, waitFor } from 'storybook/test'
3
- import { SunIcon } from '@radix-ui/react-icons'
4
- import { Tabs, TabsContent, TabsList, TabsTrigger } from '@components/ui/tabs/tabs'
5
-
6
- import { Modal } from './modal'
7
- import { Button } from '@components/ui/button/button'
8
- import { RadioGroup, RadioGroupItem } from '@components/ui/radio-group/radio-group'
9
- import { Label } from '@components/ui/label/label'
10
-
11
- import { useState } from 'react'
12
-
13
- const meta = {
14
- title: 'Modal',
15
- component: Modal,
16
- tags: ['autodocs'],
17
- parameters: {
18
- layout: 'centered',
19
- },
20
- argTypes: {
21
- isOpen: {
22
- control: { disable: true },
23
- },
24
- setIsOpen: {
25
- control: { disable: true },
26
- },
27
- title: {
28
- control: 'text',
29
- },
30
- subtitle: {
31
- control: 'text',
32
- },
33
- showCloseButton: {
34
- control: 'boolean',
35
- },
36
- preventClickOutsideToDismiss: {
37
- control: 'boolean',
38
- },
39
- size: {
40
- control: 'select',
41
- options: [undefined, 'fit-content', 'full-height', 'full-size', 'fit-content-width'],
42
- },
43
- onOpenAutoFocus: {
44
- control: { disable: true },
45
- },
46
- },
47
- args: {
48
- title: 'Modal Title',
49
- subtitle: 'This is the modal subtitle',
50
- showCloseButton: true,
51
- preventClickOutsideToDismiss: false,
52
- },
53
- } satisfies Meta<typeof Modal>
54
- export default meta
55
-
56
- type Story = StoryObj<typeof meta>
57
-
58
- const dummyText =
59
- 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam rutrum laoreet erat ac sodales. Pellentesque nec nunc in ipsum tincidunt congue sit amet in augue. Sed interdum consequat arcu, ac tempor nisl eleifend sed. Mauris gravida ipsum orci, sed vestibulum nisl commodo in. Aliquam ut dolor dui. Donec fermentum viverra faucibus. In aliquet erat et quam ornare, et accumsan magna ornare. Suspendisse potenti. Etiam a elit dui. Mauris et lectus vel metus lobortis luctus. Vestibulum elementum sit amet augue vel rutrum. Aenean sem turpis, viverra hendrerit consequat eget, vulputate sed nunc. Pellentesque sollicitudin diam nunc, vel pretium massa mattis at. Curabitur fringilla convallis mollis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam rutrum laoreet erat ac sodales. Pellentesque nec nunc in ipsum tincidunt congue sit amet in augue. Sed interdum consequat arcu, ac tempor nisl eleifend sed. Mauris gravida ipsum orci, sed vestibulum nisl commodo in. Aliquam ut dolor dui. Donec fermentum viverra faucibus. In aliquet erat et quam ornare, et accumsan magna ornare. Suspendisse potenti. Etiam a elit dui. Mauris et lectus vel metus lobortis luctus. Vestibulum elementum sit amet augue vel rutrum. Aenean sem turpis, viverra hendrerit consequat eget, vulputate sed nunc. Pellentesque sollicitudin diam nunc, vel pretium massa mattis at. Curabitur fringilla convallis mollis. '
60
-
61
- export const Default: Story = {
62
- args: {
63
- isOpen: false,
64
- setIsOpen: () => {},
65
- title: 'Modal Title',
66
- subtitle: 'This is the modal subtitle',
67
- showCloseButton: true,
68
- preventClickOutsideToDismiss: false,
69
- },
70
- render: (args) => {
71
- const [isOpen, setIsOpen] = useState(false)
72
- return (
73
- <>
74
- <Button onClick={() => setIsOpen(true)}>Open Modal</Button>
75
- <Modal
76
- isOpen={isOpen}
77
- setIsOpen={setIsOpen}
78
- title={args.title}
79
- subtitle={args.subtitle}
80
- showCloseButton={args.showCloseButton}
81
- preventClickOutsideToDismiss={args.preventClickOutsideToDismiss}
82
- size={args.size}
83
- onOpenAutoFocus={args.onOpenAutoFocus}
84
- controls={args.controls}
85
- >
86
- <div className="bg-primary/20 p-4">
87
- <p>Modal Content</p>
88
- <br />
89
- <p>{dummyText}</p>
90
- </div>
91
- </Modal>
92
- </>
93
- )
94
- },
95
- play: async () => {
96
- // Open modal
97
- const openButton = screen.getByText('Open Modal')
98
- await userEvent.click(openButton)
99
- // Wait for modal content to appear and be visible
100
- await waitFor(() => {
101
- const modalContent = screen.queryByText('Modal Content')
102
- expect(modalContent).toBeTruthy()
103
- expect(modalContent).toBeVisible()
104
- })
105
- // Close modal (via close button)
106
- const closeButton = screen.getByRole('button', { name: /close/i })
107
- await userEvent.click(closeButton)
108
- // Wait for modal content to be hidden or removed
109
- await waitFor(() => {
110
- const modalContent = screen.queryByText('Modal Content')
111
- if (modalContent) {
112
- expect(modalContent).not.toBeVisible()
113
- }
114
- })
115
- },
116
- }
117
-
118
- export const Sizes: Story = {
119
- args: { isOpen: false, setIsOpen: () => {} },
120
- render: () => {
121
- const [isOpen, setIsOpen] = useState(false)
122
- const [size, setSize] = useState<'fit-content' | 'full-height' | 'full-size' | 'fit-content-width' | undefined>(
123
- undefined,
124
- )
125
- const sizeOptions = [
126
- { value: '', label: 'undefined' },
127
- { value: 'fit-content', label: 'fit-content' },
128
- { value: 'full-height', label: 'full-height' },
129
- { value: 'full-size', label: 'full-size' },
130
- { value: 'fit-content-width', label: 'fit-content-width' },
131
- ]
132
- return (
133
- <div className="flex flex-col gap-3 items-center">
134
- <RadioGroup
135
- defaultValue=""
136
- value={size ?? ''}
137
- onValueChange={(val) => setSize(val === '' ? undefined : (val as typeof size))}
138
- className="flex flex-row gap-2"
139
- >
140
- {sizeOptions.map((opt) => (
141
- <div key={opt.value} className="flex items-center gap-2">
142
- <RadioGroupItem value={opt.value} id={`modal-size-${opt.value}`} />
143
- <Label htmlFor={`modal-size-${opt.value}`} className="cursor-pointer">
144
- {opt.label}
145
- </Label>
146
- </div>
147
- ))}
148
- </RadioGroup>
149
- <Button onClick={() => setIsOpen(true)}>Open Modal</Button>
150
- <Modal
151
- isOpen={isOpen}
152
- setIsOpen={setIsOpen}
153
- title="Modal Title"
154
- subtitle="This is the modal subtitle"
155
- showCloseButton={true}
156
- preventClickOutsideToDismiss={false}
157
- size={size}
158
- >
159
- <div className="bg-primary/20 w-[900px] min-w-0 h-full p-4">
160
- <p>Modal Content with w-[900px]</p>
161
- <br />
162
- <p>{dummyText}</p>
163
- </div>
164
- </Modal>
165
- </div>
166
- )
167
- },
168
- }
169
-
170
- export const WithControlsAndFooter: Story = {
171
- args: {
172
- isOpen: false,
173
- setIsOpen: () => {},
174
- title: 'Modal Title',
175
- showCloseButton: true,
176
- preventClickOutsideToDismiss: false,
177
- controls: [
178
- <Button key="c1" variant="outline" size="xs" onClick={() => alert('Cancel clicked')}>
179
- Cancel
180
- </Button>,
181
- <Button key="c2" variant="default" size="xs" onClick={() => alert('Save clicked')}>
182
- Save
183
- </Button>,
184
- ],
185
- footer: (
186
- <div className="flex items-center justify-center gap-3">
187
- This is the modal footer
188
- <SunIcon className="size-5 text-yellow-500" />
189
- </div>
190
- ),
191
- },
192
- render: (args) => {
193
- const [isOpen, setIsOpen] = useState(false)
194
- return (
195
- <>
196
- <Button onClick={() => setIsOpen(true)}>Open Modal</Button>
197
- <Modal
198
- isOpen={isOpen}
199
- setIsOpen={setIsOpen}
200
- title={args.title}
201
- subtitle={args.subtitle}
202
- showCloseButton={args.showCloseButton}
203
- preventClickOutsideToDismiss={args.preventClickOutsideToDismiss}
204
- size={args.size}
205
- onOpenAutoFocus={args.onOpenAutoFocus}
206
- controls={args.controls}
207
- footer={args.footer}
208
- >
209
- <div className="bg-primary/20 p-4">
210
- <p>Modal Content</p>
211
- <br />
212
- <p>{dummyText}</p>
213
- </div>
214
- </Modal>
215
- </>
216
- )
217
- },
218
- }
219
-
220
- export const ComplexSubtitleExample: Story = {
221
- args: {
222
- isOpen: false,
223
- setIsOpen: () => {},
224
- title: 'Subtitle to navigate menu of multi page modal',
225
- showCloseButton: true,
226
- preventClickOutsideToDismiss: false,
227
- },
228
- render: (args) => {
229
- const [isOpen, setIsOpen] = useState(false)
230
- const [activeTab, setActiveTab] = useState('tab1')
231
- return (
232
- <>
233
- <Button onClick={() => setIsOpen(true)}>Open Modal</Button>
234
- <Modal
235
- isOpen={isOpen}
236
- setIsOpen={setIsOpen}
237
- title={args.title}
238
- showCloseButton={args.showCloseButton}
239
- preventClickOutsideToDismiss={args.preventClickOutsideToDismiss}
240
- size={args.size}
241
- onOpenAutoFocus={args.onOpenAutoFocus}
242
- controls={args.controls}
243
- footer={args.footer}
244
- subtitle={
245
- <Tabs value={activeTab} onValueChange={setActiveTab} className="mt-2">
246
- <TabsList variant="protocol" size="sm" className="justify-start relative">
247
- <TabsTrigger variant="protocol" value="tab1" className="px-4 cursor-pointer">
248
- Tab 1
249
- </TabsTrigger>
250
- <TabsTrigger variant="protocol" value="tab2" className="px-4 cursor-pointer">
251
- Tab 2
252
- </TabsTrigger>
253
- </TabsList>
254
- </Tabs>
255
- }
256
- >
257
- <div className="p-3 pb-2">
258
- <Tabs value={activeTab} onValueChange={setActiveTab}>
259
- <TabsContent value="tab1">
260
- <h3>Modal page 1</h3>
261
- </TabsContent>
262
- <TabsContent value="tab2">
263
- <h3>Modal page 2</h3>
264
- </TabsContent>
265
- </Tabs>
266
- </div>
267
- </Modal>
268
- </>
269
- )
270
- },
271
- }
272
-
273
- export const ScrollableModal: Story = {
274
- args: {
275
- isOpen: false,
276
- setIsOpen: () => {},
277
- },
278
- render: (args) => {
279
- const [isOpen, setIsOpen] = useState(false)
280
- let repeatedText = ''
281
- for (let i = 0; i < 20; i++) {
282
- repeatedText += dummyText
283
- }
284
- return (
285
- <>
286
- <Button onClick={() => setIsOpen(true)}>Open Modal</Button>
287
- <Modal isOpen={isOpen} setIsOpen={setIsOpen} title="Modal Title">
288
- <div className="bg-primary/20 p-4">
289
- <p>Modal Content</p>
290
- <br />
291
- <p>{repeatedText}</p>
292
- </div>
293
- </Modal>
294
- </>
295
- )
296
- },
297
- }
@@ -1,80 +0,0 @@
1
- import { type Dispatch, type PropsWithChildren, type ReactNode, type SetStateAction } from 'react'
2
-
3
- import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from '@components/ui/dialog/dialog'
4
- import { cn } from '@lib/utils'
5
-
6
- type ModalProps = {
7
- title?: ReactNode | string
8
- subtitle?: ReactNode
9
- showCloseButton?: boolean
10
- isOpen: boolean
11
- setIsOpen: Dispatch<SetStateAction<boolean>>
12
- __e2e_test_id__?: string
13
- footer?: ReactNode
14
- controls?: ReactNode[]
15
- preventClickOutsideToDismiss?: boolean
16
- size?: 'fit-content' | 'full-height' | 'full-size' | 'fit-content-width'
17
- contentClass?: string
18
- onOpenAutoFocus?: (event: Event) => void
19
- }
20
-
21
- export const Modal = ({
22
- title = '',
23
- subtitle,
24
- isOpen,
25
- showCloseButton = true,
26
- setIsOpen,
27
- children,
28
- controls = [],
29
- footer,
30
- preventClickOutsideToDismiss,
31
- size = 'fit-content',
32
- contentClass = '',
33
- __e2e_test_id__,
34
- onOpenAutoFocus,
35
- }: PropsWithChildren<ModalProps>) => {
36
- return (
37
- <Dialog open={isOpen} onOpenChange={setIsOpen}>
38
- <DialogContent
39
- onOpenAutoFocus={onOpenAutoFocus}
40
- className={cn(
41
- 'sm:max-w-xl min-w-[425px] max-h-[95vh] flex flex-col p-0 gap-0 border-(--discreet-border) rounded',
42
- size === 'full-height' && 'h-[95vh]',
43
- size === 'full-size' && 'w-[95vw] h-[95vh] sm:max-w-[95vw]',
44
- size === 'fit-content-width' && 'max-w-fit w-auto sm:max-w-fit',
45
- contentClass,
46
- )}
47
- showCloseButton={showCloseButton}
48
- __e2e_test_id__={__e2e_test_id__}
49
- onInteractOutside={preventClickOutsideToDismiss ? (e) => e.preventDefault() : undefined}
50
- onEscapeKeyDown={preventClickOutsideToDismiss ? (e) => e.preventDefault() : undefined}
51
- >
52
- <DialogHeader
53
- className={cn(
54
- 'flex flex-row flex-shrink-0 items-center gap-2 p-3 min-h-10 border-b-1 border-(--discreet-border)',
55
- showCloseButton ? 'pr-12' : '',
56
- subtitle ? 'pb-0' : '',
57
- )}
58
- >
59
- <div className="overflow-hidden">
60
- {title && (
61
- <DialogTitle className="text-xl overflow-hidden text-ellipsis whitespace-nowrap">{title}</DialogTitle>
62
- )}
63
- {subtitle}
64
- </div>
65
- {controls.length > 0 && (
66
- <div className="flex flex-grow justify-end items-baseline gap-2 whitespace-nowrap flex-1">{controls}</div>
67
- )}
68
- </DialogHeader>
69
-
70
- <div className="max-h-full h-full overflow-auto flex-grow">{children}</div>
71
-
72
- {footer && (
73
- <DialogFooter className="sm:justify-center flex-shrink-0 p-3 border-t-1 border-(--discreet-border)">
74
- {footer}
75
- </DialogFooter>
76
- )}
77
- </DialogContent>
78
- </Dialog>
79
- )
80
- }
@@ -1,213 +0,0 @@
1
- import { CheckCircledIcon, QuestionMarkCircledIcon, CircleIcon } from '@radix-ui/react-icons'
2
-
3
- import {
4
- NavigationMenu,
5
- NavigationMenuContent,
6
- NavigationMenuItem,
7
- NavigationMenuLink,
8
- NavigationMenuList,
9
- NavigationMenuTrigger,
10
- navigationMenuTriggerStyle,
11
- } from './navigation-menu'
12
- import { Meta, StoryObj } from '@storybook/react-vite'
13
- import { cn } from '@lib/utils'
14
-
15
- const meta: Meta<typeof NavigationMenu> = {
16
- title: 'Navigation Menu',
17
- tags: ['autodocs'],
18
- component: NavigationMenu,
19
- argTypes: {
20
- viewport: {
21
- control: 'boolean',
22
- description: 'optimize for small devices',
23
- },
24
- },
25
- }
26
- export default meta
27
-
28
- // DATA ------------------------------------------------------------------------
29
- const components: { title: string; href: string; description: string }[] = [
30
- {
31
- title: 'Alert Dialog',
32
- href: '/docs/primitives/alert-dialog',
33
- description: 'A modal dialog that interrupts the user with important content and expects a response.',
34
- },
35
- {
36
- title: 'Hover Card',
37
- href: '/docs/primitives/hover-card',
38
- description: 'For sighted users to preview content available behind a link.',
39
- },
40
- {
41
- title: 'Progress',
42
- href: '/docs/primitives/progress',
43
- description:
44
- 'Displays an indicator showing the completion progress of a task, typically displayed as a progress bar.',
45
- },
46
- {
47
- title: 'Scroll-area',
48
- href: '/docs/primitives/scroll-area',
49
- description: 'Visually or semantically separates content.',
50
- },
51
- {
52
- title: 'Tabs',
53
- href: '/docs/primitives/tabs',
54
- description: 'A set of layered sections of content—known as tab panels—that are displayed one at a time.',
55
- },
56
- {
57
- title: 'Tooltip',
58
- href: '/docs/primitives/tooltip',
59
- description:
60
- 'A popup that displays information related to an element when the element receives keyboard focus or the mouse hovers over it.',
61
- },
62
- ]
63
-
64
- // STORIES ---------------------------------------------------------------------
65
-
66
- export const Default: StoryObj<typeof meta> = {
67
- args: {
68
- viewport: false,
69
- },
70
- render: (args) => (
71
- <div
72
- className={cn('flex items-center justify-center border-border border relative', {
73
- 'w-[320px]': args.viewport,
74
- })}
75
- >
76
- <NavigationMenu orientation={'horizontal'} viewport={args.viewport}>
77
- <NavigationMenuList className="flex-wrap">
78
- <NavigationMenuItem>
79
- <NavigationMenuTrigger>Home</NavigationMenuTrigger>
80
- <NavigationMenuContent>
81
- <ul className="grid gap-2 md:w-[400px] lg:w-[500px] lg:grid-cols-[.75fr_1fr]">
82
- <li className="row-span-3">
83
- <NavigationMenuLink asChild>
84
- <a
85
- className="from-muted/50 to-muted flex h-full w-full flex-col justify-end rounded-md bg-linear-to-b p-4 no-underline outline-hidden transition-all duration-200 select-none focus:shadow-md md:p-6"
86
- href="/"
87
- >
88
- <div className="mb-2 text-lg font-medium sm:mt-4">shadcn/ui</div>
89
- <p className="text-muted-foreground text-sm leading-tight">
90
- Beautifully designed components built with Tailwind CSS.
91
- </p>
92
- </a>
93
- </NavigationMenuLink>
94
- </li>
95
- <ListItem href="/docs" title="Introduction">
96
- Re-usable components built using Radix UI and Tailwind CSS.
97
- </ListItem>
98
- <ListItem href="/docs/installation" title="Installation">
99
- How to install dependencies and structure your app.
100
- </ListItem>
101
- <ListItem href="/docs/primitives/typography" title="Typography">
102
- Styles for headings, paragraphs, lists...etc
103
- </ListItem>
104
- </ul>
105
- </NavigationMenuContent>
106
- </NavigationMenuItem>
107
- <NavigationMenuItem>
108
- <NavigationMenuTrigger>Components</NavigationMenuTrigger>
109
- <NavigationMenuContent>
110
- <ul className="grid gap-2 sm:w-[400px] md:w-[500px] md:grid-cols-2 lg:w-[600px]">
111
- {components.map((component) => (
112
- <ListItem key={component.title} title={component.title} href={component.href}>
113
- {component.description}
114
- </ListItem>
115
- ))}
116
- </ul>
117
- </NavigationMenuContent>
118
- </NavigationMenuItem>
119
- <NavigationMenuItem>
120
- <NavigationMenuLink asChild className={navigationMenuTriggerStyle()}>
121
- <a href="/docs">Docs</a>
122
- </NavigationMenuLink>
123
- </NavigationMenuItem>
124
- <NavigationMenuItem className="hidden md:block">
125
- <NavigationMenuTrigger>List</NavigationMenuTrigger>
126
- <NavigationMenuContent>
127
- <ul className="grid w-[300px] gap-4">
128
- <li>
129
- <NavigationMenuLink asChild>
130
- <a href="#">
131
- <div className="font-medium">Components</div>
132
- <div className="text-muted-foreground">Browse all components in the library.</div>
133
- </a>
134
- </NavigationMenuLink>
135
- <NavigationMenuLink asChild>
136
- <a href="#">
137
- <div className="font-medium">Documentation</div>
138
- <div className="text-muted-foreground">Learn how to use the library.</div>
139
- </a>
140
- </NavigationMenuLink>
141
- <NavigationMenuLink asChild>
142
- <a href="#">
143
- <div className="font-medium">Blog</div>
144
- <div className="text-muted-foreground">Read our latest blog posts.</div>
145
- </a>
146
- </NavigationMenuLink>
147
- </li>
148
- </ul>
149
- </NavigationMenuContent>
150
- </NavigationMenuItem>
151
- <NavigationMenuItem className="hidden md:block">
152
- <NavigationMenuTrigger>Simple</NavigationMenuTrigger>
153
- <NavigationMenuContent>
154
- <ul className="grid w-[200px] gap-4">
155
- <li>
156
- <NavigationMenuLink asChild>
157
- <a href="#">Components</a>
158
- </NavigationMenuLink>
159
- <NavigationMenuLink asChild>
160
- <a href="#">Documentation</a>
161
- </NavigationMenuLink>
162
- <NavigationMenuLink asChild>
163
- <a href="#">Blocks</a>
164
- </NavigationMenuLink>
165
- </li>
166
- </ul>
167
- </NavigationMenuContent>
168
- </NavigationMenuItem>
169
- <NavigationMenuItem className="hidden md:block">
170
- <NavigationMenuTrigger>With Icon</NavigationMenuTrigger>
171
- <NavigationMenuContent>
172
- <ul className="grid w-[200px] gap-4">
173
- <li>
174
- <NavigationMenuLink asChild>
175
- <a href="#" className="flex-row items-center gap-2">
176
- <QuestionMarkCircledIcon />
177
- Backlog
178
- </a>
179
- </NavigationMenuLink>
180
- <NavigationMenuLink asChild>
181
- <a href="#" className="flex-row items-center gap-2">
182
- <CircleIcon />
183
- To Do
184
- </a>
185
- </NavigationMenuLink>
186
- <NavigationMenuLink asChild>
187
- <a href="#" className="flex-row items-center gap-2">
188
- <CheckCircledIcon />
189
- Done
190
- </a>
191
- </NavigationMenuLink>
192
- </li>
193
- </ul>
194
- </NavigationMenuContent>
195
- </NavigationMenuItem>
196
- </NavigationMenuList>
197
- </NavigationMenu>
198
- </div>
199
- ),
200
- }
201
-
202
- function ListItem({ title, children, href, ...props }: React.ComponentPropsWithoutRef<'li'> & { href: string }) {
203
- return (
204
- <li {...props}>
205
- <NavigationMenuLink asChild>
206
- <a href={href}>
207
- <div className="text-sm leading-none font-medium">{title}</div>
208
- <p className="text-muted-foreground line-clamp-2 text-sm leading-snug">{children}</p>
209
- </a>
210
- </NavigationMenuLink>
211
- </li>
212
- )
213
- }