@postxl/generators 1.1.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/dist/frontend-core/frontend.generator.d.ts +0 -58
  2. package/dist/frontend-core/frontend.generator.js +6 -172
  3. package/dist/frontend-core/frontend.generator.js.map +1 -1
  4. package/dist/frontend-core/template/README.md +1 -1
  5. package/dist/frontend-core/template/src/components/admin/table-filter.tsx +1 -5
  6. package/dist/frontend-core/template/src/components/ui/color-mode-toggle/color-mode-toggle.tsx +10 -4
  7. package/dist/frontend-core/template/src/pages/dashboard/dashboard.page.tsx +2 -3
  8. package/dist/frontend-core/template/src/pages/error/default-error.page.tsx +1 -1
  9. package/dist/frontend-core/template/src/pages/error/not-found-error.page.tsx +1 -1
  10. package/dist/frontend-core/template/src/styles/styles.css +13 -1
  11. package/dist/frontend-core/template/tsconfig.json +2 -0
  12. package/dist/frontend-core/types/component.d.ts +1 -1
  13. package/dist/frontend-forms/generators/discriminated-union/fields.generator.js +4 -6
  14. package/dist/frontend-forms/generators/discriminated-union/fields.generator.js.map +1 -1
  15. package/dist/frontend-forms/generators/discriminated-union/inputs.generator.js +1 -1
  16. package/dist/frontend-forms/generators/discriminated-union/inputs.generator.js.map +1 -1
  17. package/dist/frontend-forms/generators/enum/inputs.generator.js +1 -1
  18. package/dist/frontend-forms/generators/enum/inputs.generator.js.map +1 -1
  19. package/dist/frontend-forms/generators/model/forms.generator.js +8 -12
  20. package/dist/frontend-forms/generators/model/forms.generator.js.map +1 -1
  21. package/dist/frontend-forms/generators/model/inputs.generator.js +2 -6
  22. package/dist/frontend-forms/generators/model/inputs.generator.js.map +1 -1
  23. package/dist/frontend-forms/template/src/components/ui/field/field.tsx +1 -4
  24. package/dist/frontend-tables/generators/model-table.generator.js +1 -5
  25. package/dist/frontend-tables/generators/model-table.generator.js.map +1 -1
  26. package/package.json +3 -2
  27. package/dist/frontend-core/template/src/components/ui/accordion/accordion.stories.tsx +0 -47
  28. package/dist/frontend-core/template/src/components/ui/accordion/accordion.tsx +0 -52
  29. package/dist/frontend-core/template/src/components/ui/admin-sidebar/admin-sidebar.tsx +0 -195
  30. package/dist/frontend-core/template/src/components/ui/alert/alert.stories.tsx +0 -61
  31. package/dist/frontend-core/template/src/components/ui/alert/alert.tsx +0 -45
  32. package/dist/frontend-core/template/src/components/ui/alert-dialog/alert-dialog.stories.tsx +0 -52
  33. package/dist/frontend-core/template/src/components/ui/alert-dialog/alert-dialog.tsx +0 -105
  34. package/dist/frontend-core/template/src/components/ui/avatar/avatar.stories.tsx +0 -30
  35. package/dist/frontend-core/template/src/components/ui/avatar/avatar.tsx +0 -39
  36. package/dist/frontend-core/template/src/components/ui/badge/badge.stories.tsx +0 -78
  37. package/dist/frontend-core/template/src/components/ui/badge/badge.tsx +0 -48
  38. package/dist/frontend-core/template/src/components/ui/breadcrumb/breadcrumb.stories.tsx +0 -67
  39. package/dist/frontend-core/template/src/components/ui/breadcrumb/breadcrumb.tsx +0 -85
  40. package/dist/frontend-core/template/src/components/ui/button/button.stories.tsx +0 -150
  41. package/dist/frontend-core/template/src/components/ui/button/button.tsx +0 -68
  42. package/dist/frontend-core/template/src/components/ui/calendar/calendar.stories.tsx +0 -160
  43. package/dist/frontend-core/template/src/components/ui/calendar/calendar.tsx +0 -293
  44. package/dist/frontend-core/template/src/components/ui/card/card.stories.tsx +0 -77
  45. package/dist/frontend-core/template/src/components/ui/card/card.tsx +0 -45
  46. package/dist/frontend-core/template/src/components/ui/card-hover/card-hover.stories.tsx +0 -29
  47. package/dist/frontend-core/template/src/components/ui/card-hover/card-hover.tsx +0 -28
  48. package/dist/frontend-core/template/src/components/ui/carousel/carousel.stories.tsx +0 -154
  49. package/dist/frontend-core/template/src/components/ui/carousel/carousel.tsx +0 -227
  50. package/dist/frontend-core/template/src/components/ui/checkbox/checkbox.stories.tsx +0 -106
  51. package/dist/frontend-core/template/src/components/ui/checkbox/checkbox.tsx +0 -88
  52. package/dist/frontend-core/template/src/components/ui/checkbox/shadcn-checkbox.stories.tsx +0 -90
  53. package/dist/frontend-core/template/src/components/ui/checkbox/shadcn-checkbox.tsx +0 -54
  54. package/dist/frontend-core/template/src/components/ui/collapse/collapse.stories.tsx +0 -52
  55. package/dist/frontend-core/template/src/components/ui/collapse/collapse.tsx +0 -9
  56. package/dist/frontend-core/template/src/components/ui/combobox/combobox.stories.tsx +0 -207
  57. package/dist/frontend-core/template/src/components/ui/combobox/combobox.tsx +0 -79
  58. package/dist/frontend-core/template/src/components/ui/command/command.stories.tsx +0 -186
  59. package/dist/frontend-core/template/src/components/ui/command/command.tsx +0 -165
  60. package/dist/frontend-core/template/src/components/ui/command-palette/command-palette.stories.tsx +0 -160
  61. package/dist/frontend-core/template/src/components/ui/command-palette/command-palette.tsx +0 -134
  62. package/dist/frontend-core/template/src/components/ui/content-frame/content-frame.stories.tsx +0 -198
  63. package/dist/frontend-core/template/src/components/ui/content-frame/content-frame.tsx +0 -100
  64. package/dist/frontend-core/template/src/components/ui/context-menu/context-menu.stories.tsx +0 -78
  65. package/dist/frontend-core/template/src/components/ui/context-menu/context-menu.tsx +0 -179
  66. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/cell-variant-types.ts +0 -11
  67. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/checkbox-cell.tsx +0 -116
  68. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/date-cell.tsx +0 -157
  69. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/gantt-cell.tsx +0 -82
  70. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/long-text-cell.tsx +0 -180
  71. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/multi-select-cell.tsx +0 -280
  72. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/number-cell.tsx +0 -169
  73. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/react-node-cell.tsx +0 -33
  74. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/select-cell.tsx +0 -175
  75. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/short-text-cell.tsx +0 -138
  76. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/utils/gantt-timeline.tsx +0 -92
  77. package/dist/frontend-core/template/src/components/ui/data-grid/cell-variants/utils/gantt-timerange-picker.tsx +0 -330
  78. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-cell-wrapper.tsx +0 -212
  79. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-cell.tsx +0 -157
  80. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-column-header.tsx +0 -340
  81. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-context-menu.tsx +0 -271
  82. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-row.tsx +0 -123
  83. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-search.tsx +0 -211
  84. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-types.ts +0 -159
  85. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-utils.ts +0 -67
  86. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid-view-menu.tsx +0 -360
  87. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid.stories.tsx +0 -780
  88. package/dist/frontend-core/template/src/components/ui/data-grid/data-grid.tsx +0 -217
  89. package/dist/frontend-core/template/src/components/ui/data-grid/hooks/use-callback-ref.ts +0 -22
  90. package/dist/frontend-core/template/src/components/ui/data-grid/hooks/use-data-grid.tsx +0 -1892
  91. package/dist/frontend-core/template/src/components/ui/data-grid/hooks/use-debounced-callback.ts +0 -19
  92. package/dist/frontend-core/template/src/components/ui/data-grid/styles.css +0 -3
  93. package/dist/frontend-core/template/src/components/ui/data-table/context-menu-simple.tsx +0 -141
  94. package/dist/frontend-core/template/src/components/ui/data-table/data-table.stories.tsx +0 -146
  95. package/dist/frontend-core/template/src/components/ui/data-table/data-table.tsx +0 -447
  96. package/dist/frontend-core/template/src/components/ui/data-table/renderers/country-array-cell-renderer.tsx +0 -77
  97. package/dist/frontend-core/template/src/components/ui/data-table/renderers/country-cell-renderer.tsx +0 -56
  98. package/dist/frontend-core/template/src/components/ui/data-table/renderers/favorite-cell-renderer.tsx +0 -68
  99. package/dist/frontend-core/template/src/components/ui/data-table/renderers/links-cell-renderer.tsx +0 -205
  100. package/dist/frontend-core/template/src/components/ui/data-table/utils/columns.ts +0 -351
  101. package/dist/frontend-core/template/src/components/ui/data-table/utils/data-table.utils.ts +0 -49
  102. package/dist/frontend-core/template/src/components/ui/date-picker/date-picker.stories.tsx +0 -149
  103. package/dist/frontend-core/template/src/components/ui/date-picker/date-picker.tsx +0 -30
  104. package/dist/frontend-core/template/src/components/ui/dialog/dialog.stories.tsx +0 -80
  105. package/dist/frontend-core/template/src/components/ui/dialog/dialog.tsx +0 -134
  106. package/dist/frontend-core/template/src/components/ui/drawer/drawer.stories.tsx +0 -104
  107. package/dist/frontend-core/template/src/components/ui/drawer/drawer.tsx +0 -87
  108. package/dist/frontend-core/template/src/components/ui/dropdown-menu/dropdown-menu.stories.tsx +0 -168
  109. package/dist/frontend-core/template/src/components/ui/dropdown-menu/dropdown-menu.tsx +0 -225
  110. package/dist/frontend-core/template/src/components/ui/input/input.stories.tsx +0 -141
  111. package/dist/frontend-core/template/src/components/ui/input/input.tsx +0 -47
  112. package/dist/frontend-core/template/src/components/ui/label/label.stories.tsx +0 -41
  113. package/dist/frontend-core/template/src/components/ui/label/label.tsx +0 -20
  114. package/dist/frontend-core/template/src/components/ui/loader/loader.stories.tsx +0 -45
  115. package/dist/frontend-core/template/src/components/ui/loader/loader.tsx +0 -17
  116. package/dist/frontend-core/template/src/components/ui/mark-value-renderer/mark-value-renderer.stories.tsx +0 -114
  117. package/dist/frontend-core/template/src/components/ui/mark-value-renderer/mark-value-renderer.tsx +0 -48
  118. package/dist/frontend-core/template/src/components/ui/menubar/menu.stories.tsx +0 -134
  119. package/dist/frontend-core/template/src/components/ui/menubar/menubar.tsx +0 -208
  120. package/dist/frontend-core/template/src/components/ui/modal/modal.stories.tsx +0 -297
  121. package/dist/frontend-core/template/src/components/ui/modal/modal.tsx +0 -80
  122. package/dist/frontend-core/template/src/components/ui/navigation-menu/navigation-menu.stories.tsx +0 -213
  123. package/dist/frontend-core/template/src/components/ui/navigation-menu/navigation-menu.tsx +0 -142
  124. package/dist/frontend-core/template/src/components/ui/pagination/pagination.stories.tsx +0 -49
  125. package/dist/frontend-core/template/src/components/ui/pagination/pagination.tsx +0 -84
  126. package/dist/frontend-core/template/src/components/ui/popover/popover.stories.tsx +0 -82
  127. package/dist/frontend-core/template/src/components/ui/popover/popover.tsx +0 -55
  128. package/dist/frontend-core/template/src/components/ui/progress/progress.stories.tsx +0 -80
  129. package/dist/frontend-core/template/src/components/ui/progress/progress.tsx +0 -17
  130. package/dist/frontend-core/template/src/components/ui/radio-group/radio-group.stories.tsx +0 -154
  131. package/dist/frontend-core/template/src/components/ui/radio-group/radio-group.tsx +0 -68
  132. package/dist/frontend-core/template/src/components/ui/resizable/resizable.stories.tsx +0 -73
  133. package/dist/frontend-core/template/src/components/ui/resizable/resizeable.tsx +0 -38
  134. package/dist/frontend-core/template/src/components/ui/scroll-area/scroll-area.stories.tsx +0 -55
  135. package/dist/frontend-core/template/src/components/ui/scroll-area/scroll-area.tsx +0 -39
  136. package/dist/frontend-core/template/src/components/ui/select/select.stories.tsx +0 -297
  137. package/dist/frontend-core/template/src/components/ui/select/select.tsx +0 -227
  138. package/dist/frontend-core/template/src/components/ui/separator/separator.tsx +0 -21
  139. package/dist/frontend-core/template/src/components/ui/separator/seperator.stories.tsx +0 -25
  140. package/dist/frontend-core/template/src/components/ui/sheet/sheet.stories.tsx +0 -45
  141. package/dist/frontend-core/template/src/components/ui/sheet/sheet.tsx +0 -107
  142. package/dist/frontend-core/template/src/components/ui/skeleton/skeleton.stories.tsx +0 -26
  143. package/dist/frontend-core/template/src/components/ui/skeleton/skeleton.tsx +0 -7
  144. package/dist/frontend-core/template/src/components/ui/slider/slider.stories.tsx +0 -101
  145. package/dist/frontend-core/template/src/components/ui/slider/slider.tsx +0 -98
  146. package/dist/frontend-core/template/src/components/ui/spinner/spinner.stories.tsx +0 -19
  147. package/dist/frontend-core/template/src/components/ui/spinner/spinner.tsx +0 -21
  148. package/dist/frontend-core/template/src/components/ui/switch/switch.stories.tsx +0 -33
  149. package/dist/frontend-core/template/src/components/ui/switch/switch.tsx +0 -28
  150. package/dist/frontend-core/template/src/components/ui/tabs/tabs.stories.tsx +0 -215
  151. package/dist/frontend-core/template/src/components/ui/tabs/tabs.tsx +0 -70
  152. package/dist/frontend-core/template/src/components/ui/textarea/textarea.stories.tsx +0 -138
  153. package/dist/frontend-core/template/src/components/ui/textarea/textarea.tsx +0 -40
  154. package/dist/frontend-core/template/src/components/ui/toast/toast.mdx +0 -31
  155. package/dist/frontend-core/template/src/components/ui/toast/toast.stories.tsx +0 -89
  156. package/dist/frontend-core/template/src/components/ui/toggle/toggle.stories.tsx +0 -65
  157. package/dist/frontend-core/template/src/components/ui/toggle/toggle.tsx +0 -38
  158. package/dist/frontend-core/template/src/components/ui/toggle-group/toggle-group.stories.tsx +0 -85
  159. package/dist/frontend-core/template/src/components/ui/toggle-group/toggle-group.tsx +0 -54
  160. package/dist/frontend-core/template/src/components/ui/tooltip/tooltip.stories.tsx +0 -29
  161. package/dist/frontend-core/template/src/components/ui/tooltip/tooltip.tsx +0 -29
@@ -1,198 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite'
2
- import { ChevronLeftIcon, ChevronRightIcon } from '@radix-ui/react-icons'
3
- import { cn } from '@lib/utils'
4
-
5
- import { Button } from '@components/ui/button/button'
6
-
7
- import { ContentFrame } from './content-frame'
8
- import { expect, userEvent, screen } from 'storybook/test'
9
- import { useState } from 'react'
10
- import { Modal } from '@components/ui/modal/modal'
11
- import { Badge } from '@components/ui/badge/badge'
12
-
13
- const meta = {
14
- title: 'ContentFrame',
15
- component: ContentFrame,
16
- tags: ['autodocs'],
17
- parameters: {
18
- layout: 'centered',
19
- },
20
- argTypes: {
21
- title: {
22
- control: 'text',
23
- },
24
- variant: {
25
- control: 'select',
26
- options: ['default', 'inverted'],
27
- },
28
- },
29
- } satisfies Meta<typeof ContentFrame>
30
- export default meta
31
-
32
- type Story = StoryObj<typeof meta>
33
-
34
- export const Default: Story = {
35
- args: {
36
- title: 'Title',
37
- variant: 'default',
38
- },
39
- render: (args) => (
40
- <div className="w-[350px]">
41
- <ContentFrame {...args}>
42
- <div className="p-2">Content inside the frame</div>
43
- </ContentFrame>
44
- </div>
45
- ),
46
- play: async () => {
47
- expect(screen.getByText('Title')).toBeVisible()
48
- expect(screen.getByText('Content inside the frame')).toBeVisible()
49
- const frame = screen.getByText('Content inside the frame').closest('div')
50
- },
51
- }
52
-
53
- export const Variants: Story = {
54
- args: { title: '' },
55
- render: () => (
56
- <div className="flex gap-2">
57
- <div className="w-[200px]">
58
- <ContentFrame title="default" variant="default">
59
- <div className="p-2">Content</div>
60
- </ContentFrame>
61
- </div>
62
- <div className="w-[200px]">
63
- <ContentFrame title="inverted" variant="inverted">
64
- <div className="p-2">Content</div>
65
- </ContentFrame>
66
- </div>
67
- </div>
68
- ),
69
- }
70
-
71
- export const WithTitleLink: Story = {
72
- args: {
73
- title: '',
74
- titleLink: (
75
- <a href="https://example.com/" target="_blank" rel="noopener noreferrer">
76
- <h2 className="text-xl overflow-hidden text-ellipsis whitespace-nowrap">Title with Link</h2>
77
- </a>
78
- ),
79
- },
80
- render: (args) => (
81
- <div className="w-[350px]">
82
- <ContentFrame {...args}>
83
- <div className="p-2">Content inside the frame</div>
84
- </ContentFrame>
85
- </div>
86
- ),
87
- play: async () => {
88
- // Check that the title link exists and is correct
89
- const link = screen.getByRole('link', { name: /title with link/i })
90
- expect(link).toHaveAttribute('href', 'https://example.com/')
91
- },
92
- }
93
-
94
- export const CollapsibleAndExpandable: Story = {
95
- args: { title: '' },
96
- render: () => {
97
- const dummyText =
98
- '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. '
99
-
100
- const [isCollapsed, setIsCollapsed] = useState(false)
101
- const [isExpanded, setIsExpanded] = useState(false)
102
- return (
103
- <>
104
- <div className="w-[350px]">
105
- <div
106
- className={cn(
107
- 'relative h-[250px]',
108
- isCollapsed ? 'min-w-[60px] max-w-[60px]' : 'min-w-[350px] max-w-[350px]',
109
- )}
110
- >
111
- <ContentFrame
112
- title="Collapsible and Expandable"
113
- variant="inverted"
114
- collapsed={isCollapsed}
115
- onExpand={() => setIsExpanded(true)}
116
- >
117
- <div className="p-2">{dummyText}</div>
118
- </ContentFrame>
119
- <Button
120
- title={isCollapsed ? 'Show normal' : 'Collapse'}
121
- variant="neutral"
122
- size="iconSm"
123
- className="absolute top-1/2 right-0 transform -translate-y-1/2 translate-x-1/4 z-10 rounded-full bg-muted-foreground text-background"
124
- onClick={() => setIsCollapsed(!isCollapsed)}
125
- >
126
- {isCollapsed ? <ChevronRightIcon /> : <ChevronLeftIcon />}
127
- </Button>
128
- </div>
129
- </div>
130
- <Modal isOpen={isExpanded} setIsOpen={setIsExpanded} title="Collapsible and Expandable">
131
- <div className="p-2">{dummyText}</div>
132
- </Modal>
133
- </>
134
- )
135
- },
136
- play: async () => {
137
- // Collapse the frame
138
- const collapseBtn = screen.getByRole('button', { name: /collapse/i })
139
- await userEvent.click(collapseBtn)
140
- // After collapse, check that the ChevronRightIcon is rendered (collapsed state)
141
- expect(screen.getByRole('button', { name: /show normal/i })).toBeVisible()
142
- const expandModal = screen.getByText('Collapsible and Expandable')
143
- expect(expandModal).toBeVisible()
144
- },
145
- }
146
-
147
- export const WithControlsAndIndicators: Story = {
148
- args: {
149
- title: '',
150
- },
151
- render: (args) => {
152
- const [newsUnread, setNewsUnread] = useState(true)
153
- return (
154
- <div className="w-[350px]">
155
- <ContentFrame
156
- {...args}
157
- title={newsUnread ? 'Unread News' : 'No unread News'}
158
- controls={[
159
- <Button key="c1" variant="outline" size="sm" onClick={() => setNewsUnread(!newsUnread)}>
160
- {newsUnread ? 'Read all' : 'Unread all'}
161
- </Button>,
162
- ]}
163
- indicators={
164
- newsUnread
165
- ? [
166
- <Badge
167
- data-testid="pill-label"
168
- key="i1"
169
- className="self-center bg-(--ring) rounded-full h-5 text-background font-bold px-2"
170
- >
171
- 3
172
- </Badge>,
173
- ]
174
- : []
175
- }
176
- >
177
- <div className="p-2">
178
- {newsUnread ? (
179
- <>
180
- News 1<br />
181
- News 2<br />
182
- News 3
183
- </>
184
- ) : (
185
- 'No new content'
186
- )}
187
- </div>
188
- </ContentFrame>
189
- </div>
190
- )
191
- },
192
- play: async () => {
193
- // Check for control button
194
- expect(screen.getByRole('button', { name: /read all|unread all/i })).toBeVisible()
195
- // Check for indicator badge
196
- expect(screen.getByTestId('pill-label')).toBeVisible()
197
- },
198
- }
@@ -1,100 +0,0 @@
1
- import { EnterFullScreenIcon } from '@radix-ui/react-icons'
2
-
3
- import { cva, type VariantProps } from 'class-variance-authority'
4
- import { type PropsWithChildren, type ReactNode } from 'react'
5
-
6
- import { Button } from '@components/ui/button/button'
7
- import { Loader } from '@components/ui/loader/loader'
8
- import { cn } from '@lib/utils'
9
-
10
- const gridContentFrameVariants = cva('flex flex-col border-1 border-(--discreet-border) h-full w-full', {
11
- variants: {
12
- variant: {
13
- default: '',
14
- inverted: 'bg-sidebar-border border-background border-e-transparent border-t-0',
15
- },
16
- },
17
- defaultVariants: {
18
- variant: 'default',
19
- },
20
- })
21
-
22
- const gridContentFrameHeaderVariants = cva('flex items-center overflow-hidden p-3 min-h-10 border-b-1', {
23
- variants: {
24
- variant: {
25
- default: 'border-(--discreet-border)',
26
- inverted: 'border-t-0 border-t-sidebar-border border-b-background',
27
- },
28
- },
29
- defaultVariants: {
30
- variant: 'default',
31
- },
32
- })
33
-
34
- type Props = PropsWithChildren<{
35
- title: string
36
- controls?: ReactNode[]
37
- indicators?: ReactNode[]
38
- onExpand?: () => void
39
- collapsed?: boolean
40
- titleLink?: ReactNode
41
- isLoading?: boolean
42
- }> &
43
- VariantProps<typeof gridContentFrameVariants>
44
-
45
- export const ContentFrame = ({
46
- title = '',
47
- controls = [],
48
- indicators = [],
49
- children,
50
- onExpand,
51
- variant,
52
- collapsed,
53
- titleLink,
54
- isLoading = false,
55
- }: Props) => {
56
- return (
57
- <div className={cn(gridContentFrameVariants({ variant }))}>
58
- {collapsed ? (
59
- <div className="flex gap-2.5 min-w-0 items-center [writing-mode:vertical-lr]">
60
- <h2 className="text-xl flex self-center ms-4">{title}</h2>
61
- {indicators.length > 0 && <div className="flex gap-2 whitespace-nowrap">{indicators}</div>}
62
- </div>
63
- ) : (
64
- <>
65
- {/* header */}
66
- <div className={cn(gridContentFrameHeaderVariants({ variant }))}>
67
- {/* Title + Indicators */}
68
- <div className="flex flex-grow gap-2 overflow-hidden">
69
- <h2 className="text-xl overflow-hidden text-ellipsis whitespace-nowrap">{titleLink ?? title}</h2>
70
- {indicators.length > 0 && <div className="flex gap-2 whitespace-nowrap">{indicators}</div>}
71
- </div>
72
-
73
- {/* Controls */}
74
- {controls.length > 0 && <div className="flex gap-2 whitespace-nowrap">{controls}</div>}
75
-
76
- {/* Expand button */}
77
- {onExpand && (
78
- <Button
79
- title="Expand"
80
- onClick={onExpand}
81
- variant="outline"
82
- size="icon"
83
- className="size-6 ml-2"
84
- __e2e_test_id__={`${title.toLowerCase().replaceAll(' ', '-')}-modal-button`}
85
- >
86
- <EnterFullScreenIcon />
87
- </Button>
88
- )}
89
- </div>
90
-
91
- {/* content */}
92
- <div className="h-full min-h-0 overflow-auto relative">
93
- {children}
94
- {isLoading && <Loader label="Loading..." />}
95
- </div>
96
- </>
97
- )}
98
- </div>
99
- )
100
- }
@@ -1,78 +0,0 @@
1
- import { Meta } from '@storybook/react-vite'
2
-
3
- import {
4
- ContextMenu,
5
- ContextMenuCheckboxItem,
6
- ContextMenuContent,
7
- ContextMenuItem,
8
- ContextMenuLabel,
9
- ContextMenuRadioGroup,
10
- ContextMenuRadioItem,
11
- ContextMenuSeparator,
12
- ContextMenuShortcut,
13
- ContextMenuSub,
14
- ContextMenuSubContent,
15
- ContextMenuSubTrigger,
16
- ContextMenuTrigger,
17
- } from './context-menu'
18
- import type { StoryObj } from '@storybook/react-vite'
19
-
20
- const meta: Meta<typeof ContextMenu> = {
21
- title: 'Context Menu',
22
- component: ContextMenu,
23
- tags: ['autodocs'],
24
- } satisfies Meta<typeof ContextMenu>
25
-
26
- export default meta
27
-
28
- export const Default: StoryObj<typeof meta> = {
29
- render: () => (
30
- <div className="flex items-center justify-center">
31
- <ContextMenu>
32
- <ContextMenuTrigger className="flex h-[150px] w-[300px] items-center justify-center rounded-md border border-dashed text-sm">
33
- Right click here
34
- </ContextMenuTrigger>
35
- <ContextMenuContent className="w-64">
36
- <ContextMenuItem inset>
37
- Back
38
- <ContextMenuShortcut>⌘[</ContextMenuShortcut>
39
- </ContextMenuItem>
40
- <ContextMenuItem inset disabled>
41
- Forward
42
- <ContextMenuShortcut>⌘]</ContextMenuShortcut>
43
- </ContextMenuItem>
44
- <ContextMenuItem inset>
45
- Reload
46
- <ContextMenuShortcut>⌘R</ContextMenuShortcut>
47
- </ContextMenuItem>
48
- <ContextMenuSub>
49
- <ContextMenuSubTrigger inset>More Tools</ContextMenuSubTrigger>
50
- <ContextMenuSubContent className="w-48">
51
- <ContextMenuItem>
52
- Save Page As...
53
- <ContextMenuShortcut>⇧⌘S</ContextMenuShortcut>
54
- </ContextMenuItem>
55
- <ContextMenuItem>Create Shortcut...</ContextMenuItem>
56
- <ContextMenuItem>Name Window...</ContextMenuItem>
57
- <ContextMenuSeparator />
58
- <ContextMenuItem>Developer Tools</ContextMenuItem>
59
- </ContextMenuSubContent>
60
- </ContextMenuSub>
61
- <ContextMenuSeparator />
62
- <ContextMenuCheckboxItem checked>
63
- Show Bookmarks Bar
64
- <ContextMenuShortcut>⌘⇧B</ContextMenuShortcut>
65
- </ContextMenuCheckboxItem>
66
- <ContextMenuCheckboxItem>Show Full URLs</ContextMenuCheckboxItem>
67
- <ContextMenuSeparator />
68
- <ContextMenuRadioGroup value="pedro">
69
- <ContextMenuLabel inset>People</ContextMenuLabel>
70
- <ContextMenuSeparator />
71
- <ContextMenuRadioItem value="pedro">Pedro Duarte</ContextMenuRadioItem>
72
- <ContextMenuRadioItem value="colm">Colm Tuite</ContextMenuRadioItem>
73
- </ContextMenuRadioGroup>
74
- </ContextMenuContent>
75
- </ContextMenu>
76
- </div>
77
- ),
78
- }
@@ -1,179 +0,0 @@
1
- import * as ContextMenuPrimitive from '@radix-ui/react-context-menu'
2
- import { CheckIcon, ChevronRightIcon, DotFilledIcon } from '@radix-ui/react-icons'
3
-
4
- import * as React from 'react'
5
-
6
- import { cn } from '@lib/utils'
7
-
8
- const ContextMenu = ContextMenuPrimitive.Root
9
-
10
- const ContextMenuTrigger = ContextMenuPrimitive.Trigger
11
-
12
- const ContextMenuGroup = ContextMenuPrimitive.Group
13
-
14
- const ContextMenuPortal = ContextMenuPrimitive.Portal
15
-
16
- const ContextMenuSub = ContextMenuPrimitive.Sub
17
-
18
- const ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup
19
-
20
- const ContextMenuSubTrigger = React.forwardRef<
21
- React.ElementRef<typeof ContextMenuPrimitive.SubTrigger>,
22
- React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubTrigger> & {
23
- inset?: boolean
24
- }
25
- >(({ className, inset, children, ...props }, ref) => (
26
- <ContextMenuPrimitive.SubTrigger
27
- ref={ref}
28
- className={cn(
29
- 'flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground',
30
- inset && 'pl-8',
31
- className,
32
- )}
33
- {...props}
34
- >
35
- {children}
36
- <ChevronRightIcon className="ml-auto h-4 w-4" />
37
- </ContextMenuPrimitive.SubTrigger>
38
- ))
39
- ContextMenuSubTrigger.displayName = ContextMenuPrimitive.SubTrigger.displayName
40
-
41
- const ContextMenuSubContent = React.forwardRef<
42
- React.ElementRef<typeof ContextMenuPrimitive.SubContent>,
43
- React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubContent>
44
- >(({ className, ...props }, ref) => (
45
- <ContextMenuPrimitive.SubContent
46
- ref={ref}
47
- className={cn(
48
- 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
49
- className,
50
- )}
51
- {...props}
52
- />
53
- ))
54
- ContextMenuSubContent.displayName = ContextMenuPrimitive.SubContent.displayName
55
-
56
- const ContextMenuContent = React.forwardRef<
57
- React.ElementRef<typeof ContextMenuPrimitive.Content>,
58
- React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Content>
59
- >(({ className, ...props }, ref) => (
60
- <ContextMenuPrimitive.Portal>
61
- <ContextMenuPrimitive.Content
62
- ref={ref}
63
- className={cn(
64
- 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
65
- className,
66
- )}
67
- {...props}
68
- />
69
- </ContextMenuPrimitive.Portal>
70
- ))
71
- ContextMenuContent.displayName = ContextMenuPrimitive.Content.displayName
72
-
73
- const ContextMenuItem = React.forwardRef<
74
- React.ElementRef<typeof ContextMenuPrimitive.Item>,
75
- React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Item> & {
76
- inset?: boolean
77
- }
78
- >(({ className, inset, ...props }, ref) => (
79
- <ContextMenuPrimitive.Item
80
- ref={ref}
81
- className={cn(
82
- 'relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
83
- inset && 'pl-8',
84
- className,
85
- )}
86
- {...props}
87
- />
88
- ))
89
- ContextMenuItem.displayName = ContextMenuPrimitive.Item.displayName
90
-
91
- const ContextMenuCheckboxItem = React.forwardRef<
92
- React.ElementRef<typeof ContextMenuPrimitive.CheckboxItem>,
93
- React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.CheckboxItem>
94
- >(({ className, children, checked, ...props }, ref) => (
95
- <ContextMenuPrimitive.CheckboxItem
96
- ref={ref}
97
- className={cn(
98
- 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
99
- className,
100
- )}
101
- checked={checked}
102
- {...props}
103
- >
104
- <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
105
- <ContextMenuPrimitive.ItemIndicator>
106
- <CheckIcon className="h-4 w-4" />
107
- </ContextMenuPrimitive.ItemIndicator>
108
- </span>
109
- {children}
110
- </ContextMenuPrimitive.CheckboxItem>
111
- ))
112
- ContextMenuCheckboxItem.displayName = ContextMenuPrimitive.CheckboxItem.displayName
113
-
114
- const ContextMenuRadioItem = React.forwardRef<
115
- React.ElementRef<typeof ContextMenuPrimitive.RadioItem>,
116
- React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.RadioItem>
117
- >(({ className, children, ...props }, ref) => (
118
- <ContextMenuPrimitive.RadioItem
119
- ref={ref}
120
- className={cn(
121
- 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
122
- className,
123
- )}
124
- {...props}
125
- >
126
- <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
127
- <ContextMenuPrimitive.ItemIndicator>
128
- <DotFilledIcon className="h-4 w-4 fill-current" />
129
- </ContextMenuPrimitive.ItemIndicator>
130
- </span>
131
- {children}
132
- </ContextMenuPrimitive.RadioItem>
133
- ))
134
- ContextMenuRadioItem.displayName = ContextMenuPrimitive.RadioItem.displayName
135
-
136
- const ContextMenuLabel = React.forwardRef<
137
- React.ElementRef<typeof ContextMenuPrimitive.Label>,
138
- React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Label> & {
139
- inset?: boolean
140
- }
141
- >(({ className, inset, ...props }, ref) => (
142
- <ContextMenuPrimitive.Label
143
- ref={ref}
144
- className={cn('px-2 py-1.5 text-sm font-semibold text-foreground', inset && 'pl-8', className)}
145
- {...props}
146
- />
147
- ))
148
- ContextMenuLabel.displayName = ContextMenuPrimitive.Label.displayName
149
-
150
- const ContextMenuSeparator = React.forwardRef<
151
- React.ElementRef<typeof ContextMenuPrimitive.Separator>,
152
- React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Separator>
153
- >(({ className, ...props }, ref) => (
154
- <ContextMenuPrimitive.Separator ref={ref} className={cn('-mx-1 my-1 h-px bg-border', className)} {...props} />
155
- ))
156
- ContextMenuSeparator.displayName = ContextMenuPrimitive.Separator.displayName
157
-
158
- const ContextMenuShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => {
159
- return <span className={cn('ml-auto text-xs tracking-widest text-muted-foreground', className)} {...props} />
160
- }
161
- ContextMenuShortcut.displayName = 'ContextMenuShortcut'
162
-
163
- export {
164
- ContextMenu,
165
- ContextMenuTrigger,
166
- ContextMenuContent,
167
- ContextMenuItem,
168
- ContextMenuCheckboxItem,
169
- ContextMenuRadioItem,
170
- ContextMenuLabel,
171
- ContextMenuSeparator,
172
- ContextMenuShortcut,
173
- ContextMenuGroup,
174
- ContextMenuPortal,
175
- ContextMenuSub,
176
- ContextMenuSubContent,
177
- ContextMenuSubTrigger,
178
- ContextMenuRadioGroup,
179
- }
@@ -1,11 +0,0 @@
1
- import type { Cell, Table } from '@tanstack/react-table'
2
-
3
- export type CellVariantProps<TData, TCell> = {
4
- cell: Cell<TData, TCell>
5
- table: Table<TData>
6
- rowIndex: number
7
- columnId: string
8
- isEditing: boolean
9
- isFocused: boolean
10
- isSelected: boolean
11
- }
@@ -1,116 +0,0 @@
1
- import * as React from 'react'
2
-
3
- import { Checkbox } from '@components/ui/checkbox/checkbox'
4
- import { DataGridCellWrapper } from '@components/ui/data-grid/data-grid-cell-wrapper'
5
-
6
- import { CellVariantProps } from './cell-variant-types'
7
-
8
- export function CheckboxCell<TData>({
9
- cell,
10
- table,
11
- rowIndex,
12
- columnId,
13
- isFocused,
14
- isSelected,
15
- }: Readonly<CellVariantProps<TData, boolean>>) {
16
- const initialValue = cell.getValue()
17
- const [value, setValue] = React.useState(Boolean(initialValue))
18
- const containerRef = React.useRef<HTMLDivElement>(null)
19
- const meta = table.options.meta
20
- const colMeta = cell.column.columnDef.meta
21
- // Normalize editable to a resolver function and memoize to avoid typeof checks per cell
22
- const editableResolver = React.useMemo(() => {
23
- const v = colMeta?.editable
24
- if (v === undefined) {
25
- return () => true
26
- }
27
- return typeof v === 'function' ? (v as (row: TData) => boolean) : () => Boolean(v)
28
- }, [colMeta?.editable])
29
- const isEditable = editableResolver(cell.row.original)
30
-
31
- const onCheckedChange = React.useCallback(
32
- (checked: boolean) => {
33
- setValue(checked)
34
- meta?.onDataUpdate?.({ rowIndex, columnId, value: checked })
35
- },
36
- [meta, rowIndex, columnId],
37
- )
38
-
39
- const onWrapperKeyDown = React.useCallback(
40
- (event: React.KeyboardEvent<HTMLDivElement>) => {
41
- if (!isEditable) {
42
- return
43
- }
44
- if (isFocused && (event.key === '' || event.key === 'Enter')) {
45
- event.preventDefault()
46
- event.stopPropagation()
47
- onCheckedChange(!value)
48
- }
49
- },
50
- [isFocused, value, onCheckedChange, isEditable],
51
- )
52
-
53
- React.useEffect(() => {
54
- setValue(Boolean(initialValue))
55
- }, [initialValue])
56
-
57
- React.useEffect(() => {
58
- if (isFocused && !meta?.searchOpen && !meta?.isScrolling && containerRef.current) {
59
- containerRef.current.focus()
60
- }
61
- }, [isFocused, meta?.searchOpen, meta?.isScrolling])
62
-
63
- const onWrapperClick = React.useCallback(
64
- (event: React.MouseEvent) => {
65
- if (!isEditable) {
66
- return
67
- }
68
- if (isFocused) {
69
- event.preventDefault()
70
- event.stopPropagation()
71
- onCheckedChange(!value)
72
- }
73
- },
74
- [isFocused, value, onCheckedChange, isEditable],
75
- )
76
-
77
- const onCheckboxClick = React.useCallback((event: React.MouseEvent<HTMLInputElement>) => {
78
- event.stopPropagation()
79
- }, [])
80
-
81
- const onCheckboxMouseDown = React.useCallback((event: React.MouseEvent<HTMLInputElement>) => {
82
- event.stopPropagation()
83
- }, [])
84
-
85
- const onCheckboxDoubleClick = React.useCallback((event: React.MouseEvent<HTMLInputElement>) => {
86
- event.stopPropagation()
87
- }, [])
88
-
89
- return (
90
- <DataGridCellWrapper
91
- ref={containerRef}
92
- cell={cell}
93
- table={table}
94
- rowIndex={rowIndex}
95
- columnId={columnId}
96
- isEditing={false}
97
- isFocused={isFocused}
98
- isSelected={isSelected}
99
- onClick={onWrapperClick}
100
- onKeyDown={onWrapperKeyDown}
101
- className="flex size-full justify-center"
102
- >
103
- <Checkbox
104
- variant="simple"
105
- iconStyle="simple"
106
- checkIcon="check"
107
- checked={value}
108
- onChange={(event) => onCheckedChange(event.target.checked)}
109
- onClick={onCheckboxClick}
110
- onMouseDown={onCheckboxMouseDown}
111
- onDoubleClick={onCheckboxDoubleClick}
112
- className="border-secondary-foreground"
113
- />
114
- </DataGridCellWrapper>
115
- )
116
- }