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