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