@postxl/generators 1.1.1 → 1.2.1

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