@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,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
- }