@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,68 +0,0 @@
1
- import * as RadioGroupPrimitive from '@radix-ui/react-radio-group'
2
-
3
- import { cva, type VariantProps } from 'class-variance-authority'
4
- import * as React from 'react'
5
-
6
- import { cn } from '@lib/utils'
7
-
8
- function RadioGroup({
9
- className,
10
- __e2e_test_id__,
11
- ...props
12
- }: React.ComponentProps<typeof RadioGroupPrimitive.Root> & { __e2e_test_id__?: string }) {
13
- return (
14
- <RadioGroupPrimitive.Root
15
- data-test-id={__e2e_test_id__}
16
- data-slot="radio-group"
17
- className={cn('grid gap-3', className)}
18
- {...props}
19
- />
20
- )
21
- }
22
-
23
- const radioGroupVariants = cva(
24
- 'cursor-pointer border-input text-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 aspect-square shrink-0 rounded-full border shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50',
25
- {
26
- variants: {
27
- circleVariant: {
28
- default: '',
29
- grayThick: 'aria-checked:border-muted-foreground aria-checked:border-2',
30
- },
31
- size: {
32
- default: 'size-4',
33
- sm: 'size-3.5',
34
- },
35
- },
36
- defaultVariants: {
37
- circleVariant: 'default',
38
- size: 'default',
39
- },
40
- },
41
- )
42
-
43
- type RadioGroupItemProps = React.ComponentProps<typeof RadioGroupPrimitive.Item> &
44
- VariantProps<typeof radioGroupVariants>
45
-
46
- function RadioGroupItem({ className, circleVariant, size, ...props }: RadioGroupItemProps) {
47
- return (
48
- <RadioGroupPrimitive.Item
49
- data-slot="radio-group-item"
50
- className={cn(radioGroupVariants({ circleVariant, size, className }))}
51
- {...props}
52
- >
53
- <RadioGroupPrimitive.Indicator
54
- data-slot="radio-group-indicator"
55
- className="relative flex items-center justify-center"
56
- >
57
- <div
58
- className={`absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 rounded-full ${
59
- circleVariant === 'grayThick' ? 'bg-muted-foreground' : 'bg-primary'
60
- }
61
- ${size === 'sm' ? 'size-2' : 'size-2.25'}`}
62
- />
63
- </RadioGroupPrimitive.Indicator>
64
- </RadioGroupPrimitive.Item>
65
- )
66
- }
67
-
68
- export { RadioGroup, RadioGroupItem }
@@ -1,73 +0,0 @@
1
- import { ResizableHandle, ResizablePanel, ResizablePanelGroup } from './resizeable'
2
- import type { Meta, StoryObj } from '@storybook/react-vite'
3
- import type { ComponentProps } from 'react'
4
-
5
- type ResizableHandleProps = ComponentProps<typeof ResizableHandle>
6
- type ResizablePanelGroupProps = ComponentProps<typeof ResizablePanelGroup>
7
-
8
- // Define custom args that aren't component props
9
- type StoryArgs = ResizableHandleProps & ResizablePanelGroupProps
10
-
11
- const meta = {
12
- title: 'Resizeable',
13
- tags: ['autodocs'],
14
- component: ResizablePanelGroup,
15
- argTypes: {
16
- withHandle: {
17
- control: 'boolean',
18
- defaultValue: true,
19
- description: 'Whether to show the handle',
20
- table: {
21
- category: 'Props of "ResizableHandle"',
22
- },
23
- },
24
- direction: {
25
- control: 'radio',
26
- options: ['horizontal', 'vertical'],
27
- defaultValue: 'horizontal',
28
- description: 'The direction of the resizeable panels',
29
- table: {
30
- category: 'Props of "ResizablePanelGroup"',
31
- },
32
- },
33
- },
34
- } satisfies Meta<StoryArgs>
35
-
36
- export default meta
37
-
38
- export const Default: StoryObj<StoryArgs> = {
39
- args: {
40
- withHandle: true,
41
- direction: 'horizontal',
42
- },
43
- render: (args) => (
44
- <div className="flex items-center justify-center">
45
- <ResizablePanelGroup
46
- direction={args.direction}
47
- className="max-w-md rounded-lg border md:min-w-[450px] min-h-[300px]"
48
- >
49
- <ResizablePanel defaultSize={50}>
50
- <div className="flex h-[200px] items-center justify-center p-6">
51
- <span className="font-semibold">One</span>
52
- </div>
53
- </ResizablePanel>
54
- <ResizableHandle withHandle={args.withHandle} />
55
- <ResizablePanel defaultSize={50}>
56
- <ResizablePanelGroup direction={'horizontal'}>
57
- <ResizablePanel defaultSize={25}>
58
- <div className="flex h-full items-center justify-center p-6">
59
- <span className="font-semibold">Two</span>
60
- </div>
61
- </ResizablePanel>
62
- <ResizableHandle withHandle={args.withHandle} />
63
- <ResizablePanel defaultSize={75}>
64
- <div className="flex h-full items-center justify-center p-6">
65
- <span className="font-semibold">Three</span>
66
- </div>
67
- </ResizablePanel>
68
- </ResizablePanelGroup>
69
- </ResizablePanel>
70
- </ResizablePanelGroup>
71
- </div>
72
- ),
73
- }
@@ -1,38 +0,0 @@
1
- import { DragHandleDots2Icon } from '@radix-ui/react-icons'
2
-
3
- import * as ResizablePrimitive from 'react-resizable-panels'
4
-
5
- import { cn } from '@lib/utils'
6
-
7
- const ResizablePanelGroup = ({ className, ...props }: React.ComponentProps<typeof ResizablePrimitive.PanelGroup>) => (
8
- <ResizablePrimitive.PanelGroup
9
- className={cn('flex h-full w-full data-[panel-group-direction=vertical]:flex-col', className)}
10
- {...props}
11
- />
12
- )
13
-
14
- const ResizablePanel = ResizablePrimitive.Panel
15
-
16
- const ResizableHandle = ({
17
- withHandle,
18
- className,
19
- ...props
20
- }: React.ComponentProps<typeof ResizablePrimitive.PanelResizeHandle> & {
21
- withHandle?: boolean
22
- }) => (
23
- <ResizablePrimitive.PanelResizeHandle
24
- className={cn(
25
- 'relative flex w-px items-center justify-center bg-border after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 data-[panel-group-direction=vertical]:h-px data-[panel-group-direction=vertical]:w-full data-[panel-group-direction=vertical]:after:left-0 data-[panel-group-direction=vertical]:after:h-1 data-[panel-group-direction=vertical]:after:w-full data-[panel-group-direction=vertical]:after:-translate-y-1/2 data-[panel-group-direction=vertical]:after:translate-x-0 [&[data-panel-group-direction=vertical]>div]:rotate-90',
26
- className,
27
- )}
28
- {...props}
29
- >
30
- {withHandle && (
31
- <div className="z-10 flex h-4 w-3 items-center justify-center rounded-sm border bg-border">
32
- <DragHandleDots2Icon className="h-2.5 w-2.5" />
33
- </div>
34
- )}
35
- </ResizablePrimitive.PanelResizeHandle>
36
- )
37
-
38
- export { ResizablePanelGroup, ResizablePanel, ResizableHandle }
@@ -1,55 +0,0 @@
1
- import { ScrollArea, ScrollBar } from './scroll-area'
2
- import { Meta, type StoryObj } from '@storybook/react-vite'
3
-
4
- const meta: Meta<typeof ScrollArea> = {
5
- title: 'Scroll Area',
6
- component: ScrollArea,
7
- tags: ['autodocs'],
8
- }
9
- export default meta
10
-
11
- type Artwork = {
12
- artist: string
13
- art: string
14
- }
15
-
16
- const works: Artwork[] = [
17
- {
18
- artist: 'Ornella Binni',
19
- art: 'https://images.unsplash.com/photo-1465869185982-5a1a7522cbcb?auto=format&fit=crop&w=300&q=80',
20
- },
21
- {
22
- artist: 'Tom Byrom',
23
- art: 'https://images.unsplash.com/photo-1548516173-3cabfa4607e9?auto=format&fit=crop&w=300&q=80',
24
- },
25
- {
26
- artist: 'Vladimir Malyavko',
27
- art: 'https://images.unsplash.com/photo-1494337480532-3725c85fd2ab?auto=format&fit=crop&w=300&q=80',
28
- },
29
- ]
30
-
31
- export const Default: StoryObj<typeof meta> = {
32
- render: (args) => (
33
- <div className="flex items-center justify-center">
34
- <ScrollArea className="w-[400px] whitespace-nowrap rounded-md border">
35
- <div className="flex w-max space-x-4 p-4 ">
36
- {works.map((artwork) => (
37
- <figure key={artwork.artist} className="shrink-0">
38
- <div className="overflow-hidden rounded-md">
39
- <img
40
- src={artwork.art}
41
- alt={`Photo by ${artwork.artist}`}
42
- className="aspect-[3/4] h-[200px] object-cover"
43
- />
44
- </div>
45
- <figcaption className="pt-2 text-xs text-muted-foreground">
46
- Photo by <span className="font-semibold text-foreground">{artwork.artist}</span>
47
- </figcaption>
48
- </figure>
49
- ))}
50
- </div>
51
- <ScrollBar orientation="horizontal" />
52
- </ScrollArea>
53
- </div>
54
- ),
55
- }
@@ -1,39 +0,0 @@
1
- import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area'
2
-
3
- import * as React from 'react'
4
-
5
- import { cn } from '@lib/utils'
6
-
7
- const ScrollArea = React.forwardRef<
8
- React.ElementRef<typeof ScrollAreaPrimitive.Root>,
9
- React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>
10
- >(({ className, children, ...props }, ref) => (
11
- <ScrollAreaPrimitive.Root ref={ref} className={cn('relative overflow-hidden', className)} {...props}>
12
- <ScrollAreaPrimitive.Viewport className="h-full w-full rounded-[inherit]">{children}</ScrollAreaPrimitive.Viewport>
13
- <ScrollBar />
14
- <ScrollAreaPrimitive.Corner />
15
- </ScrollAreaPrimitive.Root>
16
- ))
17
- ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName
18
-
19
- const ScrollBar = React.forwardRef<
20
- React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,
21
- React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>
22
- >(({ className, orientation = 'vertical', ...props }, ref) => (
23
- <ScrollAreaPrimitive.ScrollAreaScrollbar
24
- ref={ref}
25
- orientation={orientation}
26
- className={cn(
27
- 'flex touch-none select-none transition-colors',
28
- orientation === 'vertical' && 'h-full w-2.5 border-l border-l-transparent p-[1px]',
29
- orientation === 'horizontal' && 'h-2.5 flex-col border-t border-t-transparent p-[1px]',
30
- className,
31
- )}
32
- {...props}
33
- >
34
- <ScrollAreaPrimitive.ScrollAreaThumb className="relative flex-1 rounded-full bg-border" />
35
- </ScrollAreaPrimitive.ScrollAreaScrollbar>
36
- ))
37
- ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName
38
-
39
- export { ScrollArea, ScrollBar }
@@ -1,297 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react-vite'
2
- import { expect, userEvent, screen } from 'storybook/test'
3
- import { useState } from 'react'
4
- import {
5
- Select,
6
- SelectContent,
7
- SelectGroup,
8
- SelectItem,
9
- SelectLabel,
10
- SelectSeparator,
11
- SelectTrigger,
12
- SelectValue,
13
- } from './select'
14
-
15
- const meta = {
16
- title: 'Select',
17
- component: Select,
18
- parameters: {
19
- layout: 'centered',
20
- },
21
- tags: ['autodocs'],
22
- argTypes: {
23
- disabled: {
24
- control: 'boolean',
25
- },
26
- selectTriggerSize: {
27
- control: 'select',
28
- options: ['default', 'xs', 'sm', 'lg'],
29
- },
30
- selectTriggerStyle: {
31
- control: 'select',
32
- options: ['default', 'simple'],
33
- },
34
- selectItemType: {
35
- control: 'select',
36
- options: ['default', 'deselect'],
37
- },
38
- selectItemSpacing: {
39
- control: 'select',
40
- options: ['sm', 'md', 'lg'],
41
- },
42
- },
43
- args: {
44
- disabled: false,
45
- selectTriggerSize: 'default',
46
- selectTriggerStyle: 'default',
47
- selectItemType: 'default',
48
- selectItemSpacing: 'md',
49
- },
50
- }
51
- export default meta
52
-
53
- interface SelectStoryArgs {
54
- disabled?: boolean
55
- selectTriggerSize?: 'default' | 'xs' | 'sm' | 'lg'
56
- selectTriggerStyle?: 'default' | 'simple'
57
- selectItemType?: 'default' | 'deselect'
58
- selectItemSpacing?: 'sm' | 'md' | 'lg'
59
- }
60
-
61
- type Story = StoryObj<SelectStoryArgs>
62
-
63
- const options = [
64
- { value: 'apple', label: 'Apple' },
65
- { value: 'banana', label: 'Banana' },
66
- { value: 'orange', label: 'Orange' },
67
- { value: 'grape', label: 'Grape' },
68
- { value: 'watermelon', label: 'Watermelon' },
69
- ]
70
-
71
- export const Default: Story = {
72
- render: (args) => (
73
- <Select {...args}>
74
- <SelectTrigger
75
- className="w-[200px]"
76
- data-testid="select-trigger"
77
- size={args.selectTriggerSize}
78
- variant={args.selectTriggerStyle}
79
- >
80
- <SelectValue placeholder="Select a fruit" />
81
- </SelectTrigger>
82
- <SelectContent>
83
- {options.map((option) => (
84
- <SelectItem
85
- key={option.value}
86
- value={option.value}
87
- spacing={args.selectItemSpacing}
88
- type={args.selectItemType}
89
- >
90
- {option.label}
91
- </SelectItem>
92
- ))}
93
- </SelectContent>
94
- </Select>
95
- ),
96
- play: async () => {
97
- const selectTrigger = screen.getByTestId('select-trigger')
98
-
99
- await userEvent.click(selectTrigger)
100
- // Wait for dropdown to appear
101
- await new Promise((resolve) => setTimeout(resolve, 100))
102
-
103
- // Check if dropdown content is visible
104
- const dropdown = document.querySelector('[role="listbox"]')
105
- await expect(dropdown).toBeInTheDocument()
106
- },
107
- }
108
-
109
- export const TriggerStyles: Story = {
110
- render: () => (
111
- <div className="flex flex-wrap gap-2 items-center">
112
- {meta.argTypes.selectTriggerStyle.options.map((style) => (
113
- <Select key={style}>
114
- <SelectTrigger className="w-[200px]" variant={style as SelectStoryArgs['selectTriggerStyle']}>
115
- <SelectValue placeholder={style.charAt(0).toUpperCase() + style.slice(1)} />
116
- </SelectTrigger>
117
- <SelectContent>
118
- {options.map((option) => (
119
- <SelectItem key={option.value} value={option.value}>
120
- {option.label}
121
- </SelectItem>
122
- ))}
123
- </SelectContent>
124
- </Select>
125
- ))}
126
- </div>
127
- ),
128
- }
129
-
130
- export const TriggerSizes: Story = {
131
- render: () => (
132
- <div className="flex flex-wrap gap-2 items-center">
133
- {meta.argTypes.selectTriggerSize.options.map((size) => (
134
- <Select key={size}>
135
- <SelectTrigger className="w-[200px]" size={size as SelectStoryArgs['selectTriggerSize']}>
136
- <SelectValue placeholder={size} />
137
- </SelectTrigger>
138
- <SelectContent>
139
- {options.map((option) => (
140
- <SelectItem key={option.value} value={option.value}>
141
- {option.label}
142
- </SelectItem>
143
- ))}
144
- </SelectContent>
145
- </Select>
146
- ))}
147
- </div>
148
- ),
149
- }
150
-
151
- export const ItemSpacings: Story = {
152
- render: () => (
153
- <div className="flex flex-wrap gap-2 items-center">
154
- {meta.argTypes.selectItemSpacing.options.map((spacing) => (
155
- <Select key={spacing}>
156
- <SelectTrigger className="w-[200px]">
157
- <SelectValue placeholder={spacing} />
158
- </SelectTrigger>
159
- <SelectContent>
160
- {options.map((option) => (
161
- <SelectItem
162
- key={option.value}
163
- value={option.value}
164
- spacing={spacing as SelectStoryArgs['selectItemSpacing']}
165
- >
166
- {option.label}
167
- </SelectItem>
168
- ))}
169
- </SelectContent>
170
- </Select>
171
- ))}
172
- </div>
173
- ),
174
- }
175
-
176
- export const WithDeselectOption: Story = {
177
- render: () => {
178
- const [selected, setSelected] = useState<string | null>(null)
179
- return (
180
- <Select value={selected ?? ''} onValueChange={(val) => setSelected(val === 'deselect' ? null : val)}>
181
- <SelectTrigger data-testid="select-trigger" className="w-[200px]">
182
- <SelectValue placeholder="Select a fruit" />
183
- </SelectTrigger>
184
- <SelectContent>
185
- <SelectItem type="deselect" value="deselect">
186
- None
187
- </SelectItem>
188
- {options.map((option) => (
189
- <SelectItem key={option.value} value={option.value}>
190
- {option.label}
191
- </SelectItem>
192
- ))}
193
- </SelectContent>
194
- </Select>
195
- )
196
- },
197
- play: async () => {
198
- const selectTrigger = screen.getByTestId('select-trigger')
199
- expect(selectTrigger).toHaveTextContent('Select a fruit')
200
- // Open select
201
- await userEvent.click(selectTrigger)
202
- // Select "Banana"
203
- const bananaOption = screen.getByText('Banana')
204
- await userEvent.click(bananaOption)
205
- expect(selectTrigger).toHaveTextContent('Banana')
206
- // Open dropdown and select "None" (deselect)
207
- await userEvent.click(selectTrigger)
208
- const noneOption = screen.getByText('None')
209
- await userEvent.click(noneOption)
210
- expect(selectTrigger).toHaveTextContent('Select a fruit')
211
- },
212
- }
213
-
214
- export const Disabled: Story = {
215
- render: () => (
216
- <Select disabled>
217
- <SelectTrigger className="w-[200px]" data-testid="disabled-select">
218
- <SelectValue placeholder="Select a fruit" />
219
- </SelectTrigger>
220
- <SelectContent>
221
- {options.map((option) => (
222
- <SelectItem key={option.value} value={option.value}>
223
- {option.label}
224
- </SelectItem>
225
- ))}
226
- </SelectContent>
227
- </Select>
228
- ),
229
- }
230
-
231
- export const WithGroupsDefaultAndDisabledOption: Story = {
232
- render: () => (
233
- <Select defaultValue="banana">
234
- <SelectTrigger className="w-[200px]">
235
- <SelectValue placeholder="Select a fruit" />
236
- </SelectTrigger>
237
- <SelectContent>
238
- <SelectGroup>
239
- <SelectLabel>Citrus Group</SelectLabel>
240
- <SelectItem value="orange">Orange</SelectItem>
241
- <SelectItem value="lemon">Lemon</SelectItem>
242
- <SelectItem value="lime" disabled>
243
- Lime (Unavailable)
244
- </SelectItem>
245
- </SelectGroup>
246
- <SelectSeparator />
247
- <SelectItem value="banana">Banana (Default)</SelectItem>
248
- <SelectItem value="watermelon">Watermelon</SelectItem>
249
- </SelectContent>
250
- </Select>
251
- ),
252
- name: 'With Groups, Default and Disabled Option',
253
- }
254
-
255
- export const InteractiveTest: Story = {
256
- render: () => (
257
- <Select>
258
- <SelectTrigger className="w-[200px]" data-testid="select-trigger">
259
- <SelectValue placeholder="Select a fruit" data-testid="select-value" />
260
- </SelectTrigger>
261
- <SelectContent>
262
- {options.map((option) => (
263
- <SelectItem key={option.value} value={option.value} data-testid={`option-${option.value}`}>
264
- {option.label}
265
- </SelectItem>
266
- ))}
267
- </SelectContent>
268
- </Select>
269
- ),
270
- play: async () => {
271
- const selectTrigger = screen.getByTestId('select-trigger')
272
- expect(selectTrigger).toHaveTextContent('Select a fruit')
273
- await userEvent.click(selectTrigger)
274
-
275
- await new Promise((resolve) => setTimeout(resolve, 100))
276
-
277
- const dropdown = document.querySelector('[role="listbox"]')
278
- expect(dropdown).toBeInTheDocument()
279
-
280
- const bananaOption = screen.getByText('Banana')
281
- await userEvent.click(bananaOption)
282
-
283
- await new Promise((resolve) => setTimeout(resolve, 100))
284
-
285
- expect(selectTrigger).toHaveTextContent('Banana')
286
-
287
- await userEvent.click(selectTrigger)
288
- await new Promise((resolve) => setTimeout(resolve, 100))
289
-
290
- const grapeOption = screen.getByText('Grape')
291
- await userEvent.click(grapeOption)
292
-
293
- await new Promise((resolve) => setTimeout(resolve, 100))
294
-
295
- expect(selectTrigger).toHaveTextContent('Grape')
296
- },
297
- }