@postxl/generators 1.1.0 → 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 (169) hide show
  1. package/dist/backend-core/template/apps/api/src/e2e.ts +13 -4
  2. package/dist/e2e/e2e.generator.js +2 -14
  3. package/dist/e2e/e2e.generator.js.map +1 -1
  4. package/dist/e2e/generators/docker-sh.generator.d.ts +2 -0
  5. package/dist/e2e/generators/docker-sh.generator.js +25 -0
  6. package/dist/e2e/generators/docker-sh.generator.js.map +1 -0
  7. package/dist/frontend-core/frontend.generator.d.ts +0 -58
  8. package/dist/frontend-core/frontend.generator.js +6 -172
  9. package/dist/frontend-core/frontend.generator.js.map +1 -1
  10. package/dist/frontend-core/template/README.md +1 -1
  11. package/dist/frontend-core/template/src/components/admin/table-filter.tsx +1 -5
  12. package/dist/frontend-core/template/src/components/ui/color-mode-toggle/color-mode-toggle.tsx +10 -4
  13. package/dist/frontend-core/template/src/context-providers/auth-context-provider.tsx +2 -5
  14. package/dist/frontend-core/template/src/pages/dashboard/dashboard.page.tsx +2 -3
  15. package/dist/frontend-core/template/src/pages/error/default-error.page.tsx +1 -1
  16. package/dist/frontend-core/template/src/pages/error/not-found-error.page.tsx +1 -1
  17. package/dist/frontend-core/template/src/styles/styles.css +13 -1
  18. package/dist/frontend-core/template/tsconfig.json +2 -0
  19. package/dist/frontend-core/types/component.d.ts +1 -1
  20. package/dist/frontend-forms/generators/discriminated-union/fields.generator.js +4 -6
  21. package/dist/frontend-forms/generators/discriminated-union/fields.generator.js.map +1 -1
  22. package/dist/frontend-forms/generators/discriminated-union/inputs.generator.js +1 -1
  23. package/dist/frontend-forms/generators/discriminated-union/inputs.generator.js.map +1 -1
  24. package/dist/frontend-forms/generators/enum/inputs.generator.js +1 -1
  25. package/dist/frontend-forms/generators/enum/inputs.generator.js.map +1 -1
  26. package/dist/frontend-forms/generators/model/forms.generator.js +8 -12
  27. package/dist/frontend-forms/generators/model/forms.generator.js.map +1 -1
  28. package/dist/frontend-forms/generators/model/inputs.generator.js +2 -6
  29. package/dist/frontend-forms/generators/model/inputs.generator.js.map +1 -1
  30. package/dist/frontend-forms/template/src/components/ui/field/field.tsx +1 -4
  31. package/dist/frontend-tables/generators/model-table.generator.js +1 -5
  32. package/dist/frontend-tables/generators/model-table.generator.js.map +1 -1
  33. package/package.json +3 -2
  34. package/dist/e2e/template/scripts/docker.sh +0 -17
  35. package/dist/frontend-core/template/src/components/ui/accordion/accordion.stories.tsx +0 -47
  36. package/dist/frontend-core/template/src/components/ui/accordion/accordion.tsx +0 -52
  37. package/dist/frontend-core/template/src/components/ui/admin-sidebar/admin-sidebar.tsx +0 -195
  38. package/dist/frontend-core/template/src/components/ui/alert/alert.stories.tsx +0 -61
  39. package/dist/frontend-core/template/src/components/ui/alert/alert.tsx +0 -45
  40. package/dist/frontend-core/template/src/components/ui/alert-dialog/alert-dialog.stories.tsx +0 -52
  41. package/dist/frontend-core/template/src/components/ui/alert-dialog/alert-dialog.tsx +0 -105
  42. package/dist/frontend-core/template/src/components/ui/avatar/avatar.stories.tsx +0 -30
  43. package/dist/frontend-core/template/src/components/ui/avatar/avatar.tsx +0 -39
  44. package/dist/frontend-core/template/src/components/ui/badge/badge.stories.tsx +0 -78
  45. package/dist/frontend-core/template/src/components/ui/badge/badge.tsx +0 -48
  46. package/dist/frontend-core/template/src/components/ui/breadcrumb/breadcrumb.stories.tsx +0 -67
  47. package/dist/frontend-core/template/src/components/ui/breadcrumb/breadcrumb.tsx +0 -85
  48. package/dist/frontend-core/template/src/components/ui/button/button.stories.tsx +0 -150
  49. package/dist/frontend-core/template/src/components/ui/button/button.tsx +0 -68
  50. package/dist/frontend-core/template/src/components/ui/calendar/calendar.stories.tsx +0 -160
  51. package/dist/frontend-core/template/src/components/ui/calendar/calendar.tsx +0 -293
  52. package/dist/frontend-core/template/src/components/ui/card/card.stories.tsx +0 -77
  53. package/dist/frontend-core/template/src/components/ui/card/card.tsx +0 -45
  54. package/dist/frontend-core/template/src/components/ui/card-hover/card-hover.stories.tsx +0 -29
  55. package/dist/frontend-core/template/src/components/ui/card-hover/card-hover.tsx +0 -28
  56. package/dist/frontend-core/template/src/components/ui/carousel/carousel.stories.tsx +0 -154
  57. package/dist/frontend-core/template/src/components/ui/carousel/carousel.tsx +0 -227
  58. package/dist/frontend-core/template/src/components/ui/checkbox/checkbox.stories.tsx +0 -106
  59. package/dist/frontend-core/template/src/components/ui/checkbox/checkbox.tsx +0 -88
  60. package/dist/frontend-core/template/src/components/ui/checkbox/shadcn-checkbox.stories.tsx +0 -90
  61. package/dist/frontend-core/template/src/components/ui/checkbox/shadcn-checkbox.tsx +0 -54
  62. package/dist/frontend-core/template/src/components/ui/collapse/collapse.stories.tsx +0 -52
  63. package/dist/frontend-core/template/src/components/ui/collapse/collapse.tsx +0 -9
  64. package/dist/frontend-core/template/src/components/ui/combobox/combobox.stories.tsx +0 -207
  65. package/dist/frontend-core/template/src/components/ui/combobox/combobox.tsx +0 -79
  66. package/dist/frontend-core/template/src/components/ui/command/command.stories.tsx +0 -186
  67. package/dist/frontend-core/template/src/components/ui/command/command.tsx +0 -165
  68. package/dist/frontend-core/template/src/components/ui/command-palette/command-palette.stories.tsx +0 -160
  69. package/dist/frontend-core/template/src/components/ui/command-palette/command-palette.tsx +0 -134
  70. package/dist/frontend-core/template/src/components/ui/content-frame/content-frame.stories.tsx +0 -198
  71. package/dist/frontend-core/template/src/components/ui/content-frame/content-frame.tsx +0 -100
  72. package/dist/frontend-core/template/src/components/ui/context-menu/context-menu.stories.tsx +0 -78
  73. package/dist/frontend-core/template/src/components/ui/context-menu/context-menu.tsx +0 -179
  74. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/cell-variant-types.ts +0 -11
  75. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/checkbox-cell.tsx +0 -116
  76. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/date-cell.tsx +0 -157
  77. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/gantt-cell.tsx +0 -82
  78. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/long-text-cell.tsx +0 -180
  79. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/multi-select-cell.tsx +0 -280
  80. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/number-cell.tsx +0 -169
  81. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/react-node-cell.tsx +0 -33
  82. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/select-cell.tsx +0 -175
  83. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/short-text-cell.tsx +0 -138
  84. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/utils/gantt-timeline.tsx +0 -92
  85. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/utils/gantt-timerange-picker.tsx +0 -330
  86. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-cell-wrapper.tsx +0 -212
  87. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-cell.tsx +0 -157
  88. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-column-header.tsx +0 -340
  89. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-context-menu.tsx +0 -271
  90. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-row.tsx +0 -123
  91. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-search.tsx +0 -211
  92. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-types.ts +0 -159
  93. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-utils.ts +0 -67
  94. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-view-menu.tsx +0 -360
  95. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid.stories.tsx +0 -780
  96. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid.tsx +0 -217
  97. package/dist/frontend-core/template/src/components/ui/data-grid/hooks/use-callback-ref.ts +0 -22
  98. package/dist/frontend-core/template/src/components/ui/data-grid/hooks/use-data-grid.tsx +0 -1892
  99. package/dist/frontend-core/template/src/components/ui/data-grid/hooks/use-debounced-callback.ts +0 -19
  100. package/dist/frontend-core/template/src/components/ui/data-grid/styles.css +0 -3
  101. package/dist/frontend-core/template/src/components/ui/data-table/context-menu-simple.tsx +0 -141
  102. package/dist/frontend-core/template/src/components/ui/data-table/data-table.stories.tsx +0 -146
  103. package/dist/frontend-core/template/src/components/ui/data-table/data-table.tsx +0 -447
  104. package/dist/frontend-core/template/src/components/ui/data-table/renderers/country-array-cell-renderer.tsx +0 -77
  105. package/dist/frontend-core/template/src/components/ui/data-table/renderers/country-cell-renderer.tsx +0 -56
  106. package/dist/frontend-core/template/src/components/ui/data-table/renderers/favorite-cell-renderer.tsx +0 -68
  107. package/dist/frontend-core/template/src/components/ui/data-table/renderers/links-cell-renderer.tsx +0 -205
  108. package/dist/frontend-core/template/src/components/ui/data-table/utils/columns.ts +0 -351
  109. package/dist/frontend-core/template/src/components/ui/data-table/utils/data-table.utils.ts +0 -49
  110. package/dist/frontend-core/template/src/components/ui/date-picker/date-picker.stories.tsx +0 -149
  111. package/dist/frontend-core/template/src/components/ui/date-picker/date-picker.tsx +0 -30
  112. package/dist/frontend-core/template/src/components/ui/dialog/dialog.stories.tsx +0 -80
  113. package/dist/frontend-core/template/src/components/ui/dialog/dialog.tsx +0 -134
  114. package/dist/frontend-core/template/src/components/ui/drawer/drawer.stories.tsx +0 -104
  115. package/dist/frontend-core/template/src/components/ui/drawer/drawer.tsx +0 -87
  116. package/dist/frontend-core/template/src/components/ui/dropdown-menu/dropdown-menu.stories.tsx +0 -168
  117. package/dist/frontend-core/template/src/components/ui/dropdown-menu/dropdown-menu.tsx +0 -225
  118. package/dist/frontend-core/template/src/components/ui/input/input.stories.tsx +0 -141
  119. package/dist/frontend-core/template/src/components/ui/input/input.tsx +0 -47
  120. package/dist/frontend-core/template/src/components/ui/label/label.stories.tsx +0 -41
  121. package/dist/frontend-core/template/src/components/ui/label/label.tsx +0 -20
  122. package/dist/frontend-core/template/src/components/ui/loader/loader.stories.tsx +0 -45
  123. package/dist/frontend-core/template/src/components/ui/loader/loader.tsx +0 -17
  124. package/dist/frontend-core/template/src/components/ui/mark-value-renderer/mark-value-renderer.stories.tsx +0 -114
  125. package/dist/frontend-core/template/src/components/ui/mark-value-renderer/mark-value-renderer.tsx +0 -48
  126. package/dist/frontend-core/template/src/components/ui/menubar/menu.stories.tsx +0 -134
  127. package/dist/frontend-core/template/src/components/ui/menubar/menubar.tsx +0 -208
  128. package/dist/frontend-core/template/src/components/ui/modal/modal.stories.tsx +0 -297
  129. package/dist/frontend-core/template/src/components/ui/modal/modal.tsx +0 -80
  130. package/dist/frontend-core/template/src/components/ui/navigation-menu/navigation-menu.stories.tsx +0 -213
  131. package/dist/frontend-core/template/src/components/ui/navigation-menu/navigation-menu.tsx +0 -142
  132. package/dist/frontend-core/template/src/components/ui/pagination/pagination.stories.tsx +0 -49
  133. package/dist/frontend-core/template/src/components/ui/pagination/pagination.tsx +0 -84
  134. package/dist/frontend-core/template/src/components/ui/popover/popover.stories.tsx +0 -82
  135. package/dist/frontend-core/template/src/components/ui/popover/popover.tsx +0 -55
  136. package/dist/frontend-core/template/src/components/ui/progress/progress.stories.tsx +0 -80
  137. package/dist/frontend-core/template/src/components/ui/progress/progress.tsx +0 -17
  138. package/dist/frontend-core/template/src/components/ui/radio-group/radio-group.stories.tsx +0 -154
  139. package/dist/frontend-core/template/src/components/ui/radio-group/radio-group.tsx +0 -68
  140. package/dist/frontend-core/template/src/components/ui/resizable/resizable.stories.tsx +0 -73
  141. package/dist/frontend-core/template/src/components/ui/resizable/resizeable.tsx +0 -38
  142. package/dist/frontend-core/template/src/components/ui/scroll-area/scroll-area.stories.tsx +0 -55
  143. package/dist/frontend-core/template/src/components/ui/scroll-area/scroll-area.tsx +0 -39
  144. package/dist/frontend-core/template/src/components/ui/select/select.stories.tsx +0 -297
  145. package/dist/frontend-core/template/src/components/ui/select/select.tsx +0 -227
  146. package/dist/frontend-core/template/src/components/ui/separator/separator.tsx +0 -21
  147. package/dist/frontend-core/template/src/components/ui/separator/seperator.stories.tsx +0 -25
  148. package/dist/frontend-core/template/src/components/ui/sheet/sheet.stories.tsx +0 -45
  149. package/dist/frontend-core/template/src/components/ui/sheet/sheet.tsx +0 -107
  150. package/dist/frontend-core/template/src/components/ui/skeleton/skeleton.stories.tsx +0 -26
  151. package/dist/frontend-core/template/src/components/ui/skeleton/skeleton.tsx +0 -7
  152. package/dist/frontend-core/template/src/components/ui/slider/slider.stories.tsx +0 -101
  153. package/dist/frontend-core/template/src/components/ui/slider/slider.tsx +0 -98
  154. package/dist/frontend-core/template/src/components/ui/spinner/spinner.stories.tsx +0 -19
  155. package/dist/frontend-core/template/src/components/ui/spinner/spinner.tsx +0 -21
  156. package/dist/frontend-core/template/src/components/ui/switch/switch.stories.tsx +0 -33
  157. package/dist/frontend-core/template/src/components/ui/switch/switch.tsx +0 -28
  158. package/dist/frontend-core/template/src/components/ui/tabs/tabs.stories.tsx +0 -215
  159. package/dist/frontend-core/template/src/components/ui/tabs/tabs.tsx +0 -70
  160. package/dist/frontend-core/template/src/components/ui/textarea/textarea.stories.tsx +0 -138
  161. package/dist/frontend-core/template/src/components/ui/textarea/textarea.tsx +0 -40
  162. package/dist/frontend-core/template/src/components/ui/toast/toast.mdx +0 -31
  163. package/dist/frontend-core/template/src/components/ui/toast/toast.stories.tsx +0 -89
  164. package/dist/frontend-core/template/src/components/ui/toggle/toggle.stories.tsx +0 -65
  165. package/dist/frontend-core/template/src/components/ui/toggle/toggle.tsx +0 -38
  166. package/dist/frontend-core/template/src/components/ui/toggle-group/toggle-group.stories.tsx +0 -85
  167. package/dist/frontend-core/template/src/components/ui/toggle-group/toggle-group.tsx +0 -54
  168. package/dist/frontend-core/template/src/components/ui/tooltip/tooltip.stories.tsx +0 -29
  169. 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
- }