@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.
- package/dist/frontend-core/frontend.generator.d.ts +0 -58
- package/dist/frontend-core/frontend.generator.js +6 -172
- package/dist/frontend-core/frontend.generator.js.map +1 -1
- package/dist/frontend-core/template/README.md +1 -1
- package/dist/frontend-core/template/src/components/admin/table-filter.tsx +1 -5
- package/dist/frontend-core/template/src/components/ui/color-mode-toggle/color-mode-toggle.tsx +10 -4
- package/dist/frontend-core/template/src/pages/dashboard/dashboard.page.tsx +2 -3
- package/dist/frontend-core/template/src/pages/error/default-error.page.tsx +1 -1
- package/dist/frontend-core/template/src/pages/error/not-found-error.page.tsx +1 -1
- package/dist/frontend-core/template/src/styles/styles.css +13 -1
- package/dist/frontend-core/template/tsconfig.json +2 -0
- package/dist/frontend-core/types/component.d.ts +1 -1
- package/dist/frontend-forms/generators/discriminated-union/fields.generator.js +4 -6
- package/dist/frontend-forms/generators/discriminated-union/fields.generator.js.map +1 -1
- package/dist/frontend-forms/generators/discriminated-union/inputs.generator.js +1 -1
- package/dist/frontend-forms/generators/discriminated-union/inputs.generator.js.map +1 -1
- package/dist/frontend-forms/generators/enum/inputs.generator.js +1 -1
- package/dist/frontend-forms/generators/enum/inputs.generator.js.map +1 -1
- package/dist/frontend-forms/generators/model/forms.generator.js +8 -12
- package/dist/frontend-forms/generators/model/forms.generator.js.map +1 -1
- package/dist/frontend-forms/generators/model/inputs.generator.js +2 -6
- package/dist/frontend-forms/generators/model/inputs.generator.js.map +1 -1
- package/dist/frontend-forms/template/src/components/ui/field/field.tsx +1 -4
- package/dist/frontend-tables/generators/model-table.generator.js +1 -5
- package/dist/frontend-tables/generators/model-table.generator.js.map +1 -1
- package/package.json +3 -2
- package/dist/frontend-core/template/src/components/ui/accordion/accordion.stories.tsx +0 -47
- package/dist/frontend-core/template/src/components/ui/accordion/accordion.tsx +0 -52
- package/dist/frontend-core/template/src/components/ui/admin-sidebar/admin-sidebar.tsx +0 -195
- package/dist/frontend-core/template/src/components/ui/alert/alert.stories.tsx +0 -61
- package/dist/frontend-core/template/src/components/ui/alert/alert.tsx +0 -45
- package/dist/frontend-core/template/src/components/ui/alert-dialog/alert-dialog.stories.tsx +0 -52
- package/dist/frontend-core/template/src/components/ui/alert-dialog/alert-dialog.tsx +0 -105
- package/dist/frontend-core/template/src/components/ui/avatar/avatar.stories.tsx +0 -30
- package/dist/frontend-core/template/src/components/ui/avatar/avatar.tsx +0 -39
- package/dist/frontend-core/template/src/components/ui/badge/badge.stories.tsx +0 -78
- package/dist/frontend-core/template/src/components/ui/badge/badge.tsx +0 -48
- package/dist/frontend-core/template/src/components/ui/breadcrumb/breadcrumb.stories.tsx +0 -67
- package/dist/frontend-core/template/src/components/ui/breadcrumb/breadcrumb.tsx +0 -85
- package/dist/frontend-core/template/src/components/ui/button/button.stories.tsx +0 -150
- package/dist/frontend-core/template/src/components/ui/button/button.tsx +0 -68
- package/dist/frontend-core/template/src/components/ui/calendar/calendar.stories.tsx +0 -160
- package/dist/frontend-core/template/src/components/ui/calendar/calendar.tsx +0 -293
- package/dist/frontend-core/template/src/components/ui/card/card.stories.tsx +0 -77
- package/dist/frontend-core/template/src/components/ui/card/card.tsx +0 -45
- package/dist/frontend-core/template/src/components/ui/card-hover/card-hover.stories.tsx +0 -29
- package/dist/frontend-core/template/src/components/ui/card-hover/card-hover.tsx +0 -28
- package/dist/frontend-core/template/src/components/ui/carousel/carousel.stories.tsx +0 -154
- package/dist/frontend-core/template/src/components/ui/carousel/carousel.tsx +0 -227
- package/dist/frontend-core/template/src/components/ui/checkbox/checkbox.stories.tsx +0 -106
- package/dist/frontend-core/template/src/components/ui/checkbox/checkbox.tsx +0 -88
- package/dist/frontend-core/template/src/components/ui/checkbox/shadcn-checkbox.stories.tsx +0 -90
- package/dist/frontend-core/template/src/components/ui/checkbox/shadcn-checkbox.tsx +0 -54
- package/dist/frontend-core/template/src/components/ui/collapse/collapse.stories.tsx +0 -52
- package/dist/frontend-core/template/src/components/ui/collapse/collapse.tsx +0 -9
- package/dist/frontend-core/template/src/components/ui/combobox/combobox.stories.tsx +0 -207
- package/dist/frontend-core/template/src/components/ui/combobox/combobox.tsx +0 -79
- package/dist/frontend-core/template/src/components/ui/command/command.stories.tsx +0 -186
- package/dist/frontend-core/template/src/components/ui/command/command.tsx +0 -165
- package/dist/frontend-core/template/src/components/ui/command-palette/command-palette.stories.tsx +0 -160
- package/dist/frontend-core/template/src/components/ui/command-palette/command-palette.tsx +0 -134
- package/dist/frontend-core/template/src/components/ui/content-frame/content-frame.stories.tsx +0 -198
- package/dist/frontend-core/template/src/components/ui/content-frame/content-frame.tsx +0 -100
- package/dist/frontend-core/template/src/components/ui/context-menu/context-menu.stories.tsx +0 -78
- package/dist/frontend-core/template/src/components/ui/context-menu/context-menu.tsx +0 -179
- package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/cell-variant-types.ts +0 -11
- package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/checkbox-cell.tsx +0 -116
- package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/date-cell.tsx +0 -157
- package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/gantt-cell.tsx +0 -82
- package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/long-text-cell.tsx +0 -180
- package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/multi-select-cell.tsx +0 -280
- package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/number-cell.tsx +0 -169
- package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/react-node-cell.tsx +0 -33
- package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/select-cell.tsx +0 -175
- package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/short-text-cell.tsx +0 -138
- package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/utils/gantt-timeline.tsx +0 -92
- package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/utils/gantt-timerange-picker.tsx +0 -330
- package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-cell-wrapper.tsx +0 -212
- package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-cell.tsx +0 -157
- package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-column-header.tsx +0 -340
- package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-context-menu.tsx +0 -271
- package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-row.tsx +0 -123
- package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-search.tsx +0 -211
- package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-types.ts +0 -159
- package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-utils.ts +0 -67
- package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-view-menu.tsx +0 -360
- package/dist/frontend-core/template/src/components/ui/data-grid/data-grid.stories.tsx +0 -780
- package/dist/frontend-core/template/src/components/ui/data-grid/data-grid.tsx +0 -217
- package/dist/frontend-core/template/src/components/ui/data-grid/hooks/use-callback-ref.ts +0 -22
- package/dist/frontend-core/template/src/components/ui/data-grid/hooks/use-data-grid.tsx +0 -1892
- package/dist/frontend-core/template/src/components/ui/data-grid/hooks/use-debounced-callback.ts +0 -19
- package/dist/frontend-core/template/src/components/ui/data-grid/styles.css +0 -3
- package/dist/frontend-core/template/src/components/ui/data-table/context-menu-simple.tsx +0 -141
- package/dist/frontend-core/template/src/components/ui/data-table/data-table.stories.tsx +0 -146
- package/dist/frontend-core/template/src/components/ui/data-table/data-table.tsx +0 -447
- package/dist/frontend-core/template/src/components/ui/data-table/renderers/country-array-cell-renderer.tsx +0 -77
- package/dist/frontend-core/template/src/components/ui/data-table/renderers/country-cell-renderer.tsx +0 -56
- package/dist/frontend-core/template/src/components/ui/data-table/renderers/favorite-cell-renderer.tsx +0 -68
- package/dist/frontend-core/template/src/components/ui/data-table/renderers/links-cell-renderer.tsx +0 -205
- package/dist/frontend-core/template/src/components/ui/data-table/utils/columns.ts +0 -351
- package/dist/frontend-core/template/src/components/ui/data-table/utils/data-table.utils.ts +0 -49
- package/dist/frontend-core/template/src/components/ui/date-picker/date-picker.stories.tsx +0 -149
- package/dist/frontend-core/template/src/components/ui/date-picker/date-picker.tsx +0 -30
- package/dist/frontend-core/template/src/components/ui/dialog/dialog.stories.tsx +0 -80
- package/dist/frontend-core/template/src/components/ui/dialog/dialog.tsx +0 -134
- package/dist/frontend-core/template/src/components/ui/drawer/drawer.stories.tsx +0 -104
- package/dist/frontend-core/template/src/components/ui/drawer/drawer.tsx +0 -87
- package/dist/frontend-core/template/src/components/ui/dropdown-menu/dropdown-menu.stories.tsx +0 -168
- package/dist/frontend-core/template/src/components/ui/dropdown-menu/dropdown-menu.tsx +0 -225
- package/dist/frontend-core/template/src/components/ui/input/input.stories.tsx +0 -141
- package/dist/frontend-core/template/src/components/ui/input/input.tsx +0 -47
- package/dist/frontend-core/template/src/components/ui/label/label.stories.tsx +0 -41
- package/dist/frontend-core/template/src/components/ui/label/label.tsx +0 -20
- package/dist/frontend-core/template/src/components/ui/loader/loader.stories.tsx +0 -45
- package/dist/frontend-core/template/src/components/ui/loader/loader.tsx +0 -17
- package/dist/frontend-core/template/src/components/ui/mark-value-renderer/mark-value-renderer.stories.tsx +0 -114
- package/dist/frontend-core/template/src/components/ui/mark-value-renderer/mark-value-renderer.tsx +0 -48
- package/dist/frontend-core/template/src/components/ui/menubar/menu.stories.tsx +0 -134
- package/dist/frontend-core/template/src/components/ui/menubar/menubar.tsx +0 -208
- package/dist/frontend-core/template/src/components/ui/modal/modal.stories.tsx +0 -297
- package/dist/frontend-core/template/src/components/ui/modal/modal.tsx +0 -80
- package/dist/frontend-core/template/src/components/ui/navigation-menu/navigation-menu.stories.tsx +0 -213
- package/dist/frontend-core/template/src/components/ui/navigation-menu/navigation-menu.tsx +0 -142
- package/dist/frontend-core/template/src/components/ui/pagination/pagination.stories.tsx +0 -49
- package/dist/frontend-core/template/src/components/ui/pagination/pagination.tsx +0 -84
- package/dist/frontend-core/template/src/components/ui/popover/popover.stories.tsx +0 -82
- package/dist/frontend-core/template/src/components/ui/popover/popover.tsx +0 -55
- package/dist/frontend-core/template/src/components/ui/progress/progress.stories.tsx +0 -80
- package/dist/frontend-core/template/src/components/ui/progress/progress.tsx +0 -17
- package/dist/frontend-core/template/src/components/ui/radio-group/radio-group.stories.tsx +0 -154
- package/dist/frontend-core/template/src/components/ui/radio-group/radio-group.tsx +0 -68
- package/dist/frontend-core/template/src/components/ui/resizable/resizable.stories.tsx +0 -73
- package/dist/frontend-core/template/src/components/ui/resizable/resizeable.tsx +0 -38
- package/dist/frontend-core/template/src/components/ui/scroll-area/scroll-area.stories.tsx +0 -55
- package/dist/frontend-core/template/src/components/ui/scroll-area/scroll-area.tsx +0 -39
- package/dist/frontend-core/template/src/components/ui/select/select.stories.tsx +0 -297
- package/dist/frontend-core/template/src/components/ui/select/select.tsx +0 -227
- package/dist/frontend-core/template/src/components/ui/separator/separator.tsx +0 -21
- package/dist/frontend-core/template/src/components/ui/separator/seperator.stories.tsx +0 -25
- package/dist/frontend-core/template/src/components/ui/sheet/sheet.stories.tsx +0 -45
- package/dist/frontend-core/template/src/components/ui/sheet/sheet.tsx +0 -107
- package/dist/frontend-core/template/src/components/ui/skeleton/skeleton.stories.tsx +0 -26
- package/dist/frontend-core/template/src/components/ui/skeleton/skeleton.tsx +0 -7
- package/dist/frontend-core/template/src/components/ui/slider/slider.stories.tsx +0 -101
- package/dist/frontend-core/template/src/components/ui/slider/slider.tsx +0 -98
- package/dist/frontend-core/template/src/components/ui/spinner/spinner.stories.tsx +0 -19
- package/dist/frontend-core/template/src/components/ui/spinner/spinner.tsx +0 -21
- package/dist/frontend-core/template/src/components/ui/switch/switch.stories.tsx +0 -33
- package/dist/frontend-core/template/src/components/ui/switch/switch.tsx +0 -28
- package/dist/frontend-core/template/src/components/ui/tabs/tabs.stories.tsx +0 -215
- package/dist/frontend-core/template/src/components/ui/tabs/tabs.tsx +0 -70
- package/dist/frontend-core/template/src/components/ui/textarea/textarea.stories.tsx +0 -138
- package/dist/frontend-core/template/src/components/ui/textarea/textarea.tsx +0 -40
- package/dist/frontend-core/template/src/components/ui/toast/toast.mdx +0 -31
- package/dist/frontend-core/template/src/components/ui/toast/toast.stories.tsx +0 -89
- package/dist/frontend-core/template/src/components/ui/toggle/toggle.stories.tsx +0 -65
- package/dist/frontend-core/template/src/components/ui/toggle/toggle.tsx +0 -38
- package/dist/frontend-core/template/src/components/ui/toggle-group/toggle-group.stories.tsx +0 -85
- package/dist/frontend-core/template/src/components/ui/toggle-group/toggle-group.tsx +0 -54
- package/dist/frontend-core/template/src/components/ui/tooltip/tooltip.stories.tsx +0 -29
- 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
|
-
}
|
package/dist/frontend-core/template/src/components/ui/navigation-menu/navigation-menu.stories.tsx
DELETED
|
@@ -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
|
-
}
|