@nationaldesignstudio/react 0.6.0 → 0.7.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/accordion/index.d.ts +95 -0
- package/dist/accordion/index.js +143 -0
- package/dist/accordion/index.js.map +1 -0
- package/dist/background/index.d.ts +149 -0
- package/dist/background/index.js +200 -0
- package/dist/background/index.js.map +1 -0
- package/dist/banner/index.d.ts +101 -0
- package/dist/banner/index.js +81 -0
- package/dist/banner/index.js.map +1 -0
- package/dist/blurred-video-backdrop/index.d.ts +233 -0
- package/dist/blurred-video-backdrop/index.js +266 -0
- package/dist/blurred-video-backdrop/index.js.map +1 -0
- package/dist/button/index.d.ts +180 -0
- package/dist/button/index.js +169 -0
- package/dist/button/index.js.map +1 -0
- package/dist/button-B2g5fH9b.d.ts +152 -0
- package/dist/card/index.d.ts +406 -0
- package/dist/card/index.js +219 -0
- package/dist/card/index.js.map +1 -0
- package/dist/card-grid/index.d.ts +90 -0
- package/dist/card-grid/index.js +74 -0
- package/dist/card-grid/index.js.map +1 -0
- package/dist/component-registry.md +136 -2
- package/dist/dev-toolbar/index.d.ts +8 -0
- package/dist/dev-toolbar/index.js +206 -0
- package/dist/dev-toolbar/index.js.map +1 -0
- package/dist/dialog/index.d.ts +268 -0
- package/dist/dialog/index.js +288 -0
- package/dist/dialog/index.js.map +1 -0
- package/dist/faq-section/index.d.ts +47 -0
- package/dist/faq-section/index.js +152 -0
- package/dist/faq-section/index.js.map +1 -0
- package/dist/grid-overlay/index.d.ts +10 -0
- package/dist/grid-overlay/index.js +38 -0
- package/dist/grid-overlay/index.js.map +1 -0
- package/dist/hero/index.d.ts +462 -0
- package/dist/hero/index.js +494 -0
- package/dist/hero/index.js.map +1 -0
- package/dist/hooks/index.d.ts +150 -0
- package/dist/hooks/index.js +339 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.d.ts +46 -5339
- package/dist/index.js +157 -4080
- package/dist/index.js.map +1 -1
- package/dist/input/index.d.ts +404 -0
- package/dist/input/index.js +393 -0
- package/dist/input/index.js.map +1 -0
- package/dist/navbar/index.d.ts +68 -0
- package/dist/navbar/index.js +227 -0
- package/dist/navbar/index.js.map +1 -0
- package/dist/ndstudio-footer/index.d.ts +32 -0
- package/dist/ndstudio-footer/index.js +35 -0
- package/dist/ndstudio-footer/index.js.map +1 -0
- package/dist/pager-control/index.d.ts +173 -0
- package/dist/pager-control/index.js +267 -0
- package/dist/pager-control/index.js.map +1 -0
- package/dist/popover/index.d.ts +200 -0
- package/dist/popover/index.js +290 -0
- package/dist/popover/index.js.map +1 -0
- package/dist/prose/index.d.ts +39 -0
- package/dist/prose/index.js +56 -0
- package/dist/prose/index.js.map +1 -0
- package/dist/quote-block/index.d.ts +156 -0
- package/dist/quote-block/index.js +321 -0
- package/dist/quote-block/index.js.map +1 -0
- package/dist/river/index.d.ts +100 -0
- package/dist/river/index.js +107 -0
- package/dist/river/index.js.map +1 -0
- package/dist/select/index.d.ts +188 -0
- package/dist/select/index.js +295 -0
- package/dist/select/index.js.map +1 -0
- package/dist/theme/index.d.ts +149 -0
- package/dist/theme/index.js +211 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme-CzBPUlh_.d.ts +332 -0
- package/dist/tooltip/index.d.ts +166 -0
- package/dist/tooltip/index.js +200 -0
- package/dist/tooltip/index.js.map +1 -0
- package/dist/tout/index.d.ts +157 -0
- package/dist/tout/index.js +315 -0
- package/dist/tout/index.js.map +1 -0
- package/dist/two-column-section/index.d.ts +122 -0
- package/dist/two-column-section/index.js +121 -0
- package/dist/two-column-section/index.js.map +1 -0
- package/dist/us-gov-banner/index.d.ts +141 -0
- package/dist/us-gov-banner/index.js +74 -0
- package/dist/us-gov-banner/index.js.map +1 -0
- package/dist/use-captions-AkKlJhov.d.ts +71 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.js +12 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/video-dialog/index.d.ts +106 -0
- package/dist/video-dialog/index.js +1305 -0
- package/dist/video-dialog/index.js.map +1 -0
- package/dist/video-player/index.d.ts +115 -0
- package/dist/video-player/index.js +879 -0
- package/dist/video-player/index.js.map +1 -0
- package/dist/video-player-qxf-BURH.d.ts +236 -0
- package/dist/video-with-backdrop/index.d.ts +267 -0
- package/dist/video-with-backdrop/index.js +1284 -0
- package/dist/video-with-backdrop/index.js.map +1 -0
- package/package.json +13 -2
- package/src/components/organisms/us-gov-banner/us-gov-banner.tsx +5 -27
- package/src/theme/hooks.ts +2 -0
- package/src/theme/index.ts +2 -0
- package/src/theme/theme-provider.tsx +2 -0
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as tailwind_variants from 'tailwind-variants';
|
|
3
|
+
import { VariantProps } from 'tailwind-variants';
|
|
4
|
+
import * as tailwind_variants_dist_config_js from 'tailwind-variants/dist/config.js';
|
|
5
|
+
import { Select as Select$1 } from '@base-ui-components/react/select';
|
|
6
|
+
import * as React from 'react';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Select trigger variants based on Figma BaseKit / Interface / Dropdown
|
|
10
|
+
*
|
|
11
|
+
* States:
|
|
12
|
+
* - Default: White background, subtle border
|
|
13
|
+
* - Hover: Light gray background
|
|
14
|
+
* - Focus/Open: Accent border with focus ring
|
|
15
|
+
* - Selected: Has a value selected (darker text)
|
|
16
|
+
* - Disabled: Reduced opacity, not interactive
|
|
17
|
+
* - Invalid: Error border and styling
|
|
18
|
+
*/
|
|
19
|
+
declare const selectTriggerVariants: tailwind_variants.TVReturnType<{
|
|
20
|
+
size: {
|
|
21
|
+
readonly sm: "h-spatial-ui-control-height-small px-spatial-ui-control-padding-x-small py-spatial-ui-control-padding-y-small text-14";
|
|
22
|
+
readonly default: "h-spatial-ui-control-height-medium px-spatial-ui-control-padding-x-medium py-spatial-ui-control-padding-y-medium";
|
|
23
|
+
readonly lg: "h-spatial-ui-control-height-large px-spatial-ui-control-padding-x-large py-spatial-ui-control-padding-y-large text-18";
|
|
24
|
+
};
|
|
25
|
+
error: {
|
|
26
|
+
readonly true: "border-ui-error-color focus-visible:border-ui-error-color focus-visible:ring-ui-error-color/20 text-ui-error-color";
|
|
27
|
+
readonly false: "";
|
|
28
|
+
};
|
|
29
|
+
}, undefined, string[], tailwind_variants_dist_config_js.TVConfig<{
|
|
30
|
+
size: {
|
|
31
|
+
readonly sm: "h-spatial-ui-control-height-small px-spatial-ui-control-padding-x-small py-spatial-ui-control-padding-y-small text-14";
|
|
32
|
+
readonly default: "h-spatial-ui-control-height-medium px-spatial-ui-control-padding-x-medium py-spatial-ui-control-padding-y-medium";
|
|
33
|
+
readonly lg: "h-spatial-ui-control-height-large px-spatial-ui-control-padding-x-large py-spatial-ui-control-padding-y-large text-18";
|
|
34
|
+
};
|
|
35
|
+
error: {
|
|
36
|
+
readonly true: "border-ui-error-color focus-visible:border-ui-error-color focus-visible:ring-ui-error-color/20 text-ui-error-color";
|
|
37
|
+
readonly false: "";
|
|
38
|
+
};
|
|
39
|
+
}, {
|
|
40
|
+
size: {
|
|
41
|
+
readonly sm: "h-spatial-ui-control-height-small px-spatial-ui-control-padding-x-small py-spatial-ui-control-padding-y-small text-14";
|
|
42
|
+
readonly default: "h-spatial-ui-control-height-medium px-spatial-ui-control-padding-x-medium py-spatial-ui-control-padding-y-medium";
|
|
43
|
+
readonly lg: "h-spatial-ui-control-height-large px-spatial-ui-control-padding-x-large py-spatial-ui-control-padding-y-large text-18";
|
|
44
|
+
};
|
|
45
|
+
error: {
|
|
46
|
+
readonly true: "border-ui-error-color focus-visible:border-ui-error-color focus-visible:ring-ui-error-color/20 text-ui-error-color";
|
|
47
|
+
readonly false: "";
|
|
48
|
+
};
|
|
49
|
+
}>, {
|
|
50
|
+
size: {
|
|
51
|
+
readonly sm: "h-spatial-ui-control-height-small px-spatial-ui-control-padding-x-small py-spatial-ui-control-padding-y-small text-14";
|
|
52
|
+
readonly default: "h-spatial-ui-control-height-medium px-spatial-ui-control-padding-x-medium py-spatial-ui-control-padding-y-medium";
|
|
53
|
+
readonly lg: "h-spatial-ui-control-height-large px-spatial-ui-control-padding-x-large py-spatial-ui-control-padding-y-large text-18";
|
|
54
|
+
};
|
|
55
|
+
error: {
|
|
56
|
+
readonly true: "border-ui-error-color focus-visible:border-ui-error-color focus-visible:ring-ui-error-color/20 text-ui-error-color";
|
|
57
|
+
readonly false: "";
|
|
58
|
+
};
|
|
59
|
+
}, undefined, tailwind_variants.TVReturnType<{
|
|
60
|
+
size: {
|
|
61
|
+
readonly sm: "h-spatial-ui-control-height-small px-spatial-ui-control-padding-x-small py-spatial-ui-control-padding-y-small text-14";
|
|
62
|
+
readonly default: "h-spatial-ui-control-height-medium px-spatial-ui-control-padding-x-medium py-spatial-ui-control-padding-y-medium";
|
|
63
|
+
readonly lg: "h-spatial-ui-control-height-large px-spatial-ui-control-padding-x-large py-spatial-ui-control-padding-y-large text-18";
|
|
64
|
+
};
|
|
65
|
+
error: {
|
|
66
|
+
readonly true: "border-ui-error-color focus-visible:border-ui-error-color focus-visible:ring-ui-error-color/20 text-ui-error-color";
|
|
67
|
+
readonly false: "";
|
|
68
|
+
};
|
|
69
|
+
}, undefined, string[], tailwind_variants_dist_config_js.TVConfig<{
|
|
70
|
+
size: {
|
|
71
|
+
readonly sm: "h-spatial-ui-control-height-small px-spatial-ui-control-padding-x-small py-spatial-ui-control-padding-y-small text-14";
|
|
72
|
+
readonly default: "h-spatial-ui-control-height-medium px-spatial-ui-control-padding-x-medium py-spatial-ui-control-padding-y-medium";
|
|
73
|
+
readonly lg: "h-spatial-ui-control-height-large px-spatial-ui-control-padding-x-large py-spatial-ui-control-padding-y-large text-18";
|
|
74
|
+
};
|
|
75
|
+
error: {
|
|
76
|
+
readonly true: "border-ui-error-color focus-visible:border-ui-error-color focus-visible:ring-ui-error-color/20 text-ui-error-color";
|
|
77
|
+
readonly false: "";
|
|
78
|
+
};
|
|
79
|
+
}, {
|
|
80
|
+
size: {
|
|
81
|
+
readonly sm: "h-spatial-ui-control-height-small px-spatial-ui-control-padding-x-small py-spatial-ui-control-padding-y-small text-14";
|
|
82
|
+
readonly default: "h-spatial-ui-control-height-medium px-spatial-ui-control-padding-x-medium py-spatial-ui-control-padding-y-medium";
|
|
83
|
+
readonly lg: "h-spatial-ui-control-height-large px-spatial-ui-control-padding-x-large py-spatial-ui-control-padding-y-large text-18";
|
|
84
|
+
};
|
|
85
|
+
error: {
|
|
86
|
+
readonly true: "border-ui-error-color focus-visible:border-ui-error-color focus-visible:ring-ui-error-color/20 text-ui-error-color";
|
|
87
|
+
readonly false: "";
|
|
88
|
+
};
|
|
89
|
+
}>, unknown, unknown, undefined>>;
|
|
90
|
+
/**
|
|
91
|
+
* Select popup/menu variants
|
|
92
|
+
*
|
|
93
|
+
* Uses overlay tokens for consistent floating panel styling:
|
|
94
|
+
* - color.overlay.background - Light background
|
|
95
|
+
* - color.overlay.border - Subtle border
|
|
96
|
+
* - surface.overlay.radius - Rounded corners
|
|
97
|
+
*/
|
|
98
|
+
declare const selectPopupVariants: tailwind_variants.TVReturnType<{} | {} | {}, undefined, string[], tailwind_variants_dist_config_js.TVConfig<unknown, {} | {}>, {} | {}, undefined, tailwind_variants.TVReturnType<unknown, undefined, string[], tailwind_variants_dist_config_js.TVConfig<unknown, {} | {}>, unknown, unknown, undefined>>;
|
|
99
|
+
/**
|
|
100
|
+
* Select option/item variants based on Figma Menu Items
|
|
101
|
+
*
|
|
102
|
+
* States:
|
|
103
|
+
* - Default: White background
|
|
104
|
+
* - Hover/Highlighted: Light indigo tint background
|
|
105
|
+
* - Selected: Stronger indigo tint with blue text and checkmark
|
|
106
|
+
* - Disabled: Reduced opacity
|
|
107
|
+
*/
|
|
108
|
+
declare const selectOptionVariants: tailwind_variants.TVReturnType<{} | {} | {}, undefined, string[], tailwind_variants_dist_config_js.TVConfig<unknown, {} | {}>, {} | {}, undefined, tailwind_variants.TVReturnType<unknown, undefined, string[], tailwind_variants_dist_config_js.TVConfig<unknown, {} | {}>, unknown, unknown, undefined>>;
|
|
109
|
+
/**
|
|
110
|
+
* Select separator variants
|
|
111
|
+
*/
|
|
112
|
+
declare const selectSeparatorVariants: tailwind_variants.TVReturnType<{} | {} | {}, undefined, string[], tailwind_variants_dist_config_js.TVConfig<unknown, {} | {}>, {} | {}, undefined, tailwind_variants.TVReturnType<unknown, undefined, string[], tailwind_variants_dist_config_js.TVConfig<unknown, {} | {}>, unknown, unknown, undefined>>;
|
|
113
|
+
/**
|
|
114
|
+
* Select scroll arrow variants (shared by up and down)
|
|
115
|
+
*/
|
|
116
|
+
declare const selectScrollArrowVariants: tailwind_variants.TVReturnType<{} | {} | {}, undefined, string[], tailwind_variants_dist_config_js.TVConfig<unknown, {} | {}>, {} | {}, undefined, tailwind_variants.TVReturnType<unknown, undefined, string[], tailwind_variants_dist_config_js.TVConfig<unknown, {} | {}>, unknown, unknown, undefined>>;
|
|
117
|
+
interface SelectProps<Value = string> extends Select$1.Root.Props<Value> {
|
|
118
|
+
children: React.ReactNode;
|
|
119
|
+
}
|
|
120
|
+
declare const SelectRoot: <Value = string>({ children, ...props }: SelectProps<Value>) => react_jsx_runtime.JSX.Element;
|
|
121
|
+
interface SelectTriggerProps extends Omit<React.ComponentProps<typeof Select$1.Trigger>, "className">, VariantProps<typeof selectTriggerVariants> {
|
|
122
|
+
className?: string;
|
|
123
|
+
placeholder?: string;
|
|
124
|
+
/**
|
|
125
|
+
* Accessible label for the select trigger.
|
|
126
|
+
* Required for accessibility when no visible label is present.
|
|
127
|
+
*/
|
|
128
|
+
"aria-label"?: string;
|
|
129
|
+
}
|
|
130
|
+
declare const SelectTrigger: React.ForwardRefExoticComponent<Omit<SelectTriggerProps, "ref"> & React.RefAttributes<HTMLButtonElement>>;
|
|
131
|
+
interface SelectValueProps extends Omit<React.ComponentProps<typeof Select$1.Value>, "className"> {
|
|
132
|
+
className?: string;
|
|
133
|
+
placeholder?: string;
|
|
134
|
+
}
|
|
135
|
+
declare const SelectValue: React.ForwardRefExoticComponent<Omit<SelectValueProps, "ref"> & React.RefAttributes<HTMLSpanElement>>;
|
|
136
|
+
interface SelectPopupProps extends Omit<React.ComponentProps<typeof Select$1.Popup>, "className"> {
|
|
137
|
+
className?: string;
|
|
138
|
+
/**
|
|
139
|
+
* Whether the selected item should align with the trigger.
|
|
140
|
+
* When true (default), the popup positions so the selected item appears over the trigger.
|
|
141
|
+
* When false, the popup aligns to the trigger edge.
|
|
142
|
+
*/
|
|
143
|
+
alignItemWithTrigger?: boolean;
|
|
144
|
+
}
|
|
145
|
+
declare const SelectPopup: React.ForwardRefExoticComponent<Omit<SelectPopupProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
146
|
+
declare const SelectContent: React.ForwardRefExoticComponent<Omit<SelectPopupProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
147
|
+
interface SelectOptionProps extends Omit<React.ComponentProps<typeof Select$1.Item>, "className"> {
|
|
148
|
+
className?: string;
|
|
149
|
+
}
|
|
150
|
+
declare const SelectOption: React.ForwardRefExoticComponent<Omit<SelectOptionProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
151
|
+
declare const SelectItem: React.ForwardRefExoticComponent<Omit<SelectOptionProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
152
|
+
interface SelectGroupProps extends Omit<React.ComponentProps<typeof Select$1.Group>, "className"> {
|
|
153
|
+
className?: string;
|
|
154
|
+
}
|
|
155
|
+
declare const SelectGroup: React.ForwardRefExoticComponent<Omit<SelectGroupProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
156
|
+
interface SelectGroupLabelProps extends Omit<React.ComponentProps<typeof Select$1.GroupLabel>, "className"> {
|
|
157
|
+
className?: string;
|
|
158
|
+
}
|
|
159
|
+
declare const SelectGroupLabel: React.ForwardRefExoticComponent<Omit<SelectGroupLabelProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
160
|
+
declare const SelectLabel: React.ForwardRefExoticComponent<Omit<SelectGroupLabelProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
161
|
+
interface SelectSeparatorProps extends Omit<React.ComponentProps<typeof Select$1.Separator>, "className"> {
|
|
162
|
+
className?: string;
|
|
163
|
+
}
|
|
164
|
+
declare const SelectSeparator: React.ForwardRefExoticComponent<Omit<SelectSeparatorProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
165
|
+
interface SelectScrollUpArrowProps extends Omit<React.ComponentProps<typeof Select$1.ScrollUpArrow>, "className"> {
|
|
166
|
+
className?: string;
|
|
167
|
+
}
|
|
168
|
+
declare const SelectScrollUpArrow: React.ForwardRefExoticComponent<Omit<SelectScrollUpArrowProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
169
|
+
interface SelectScrollDownArrowProps extends Omit<React.ComponentProps<typeof Select$1.ScrollDownArrow>, "className"> {
|
|
170
|
+
className?: string;
|
|
171
|
+
}
|
|
172
|
+
declare const SelectScrollDownArrow: React.ForwardRefExoticComponent<Omit<SelectScrollDownArrowProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
173
|
+
declare const Select: (<Value = string>({ children, ...props }: SelectProps<Value>) => react_jsx_runtime.JSX.Element) & {
|
|
174
|
+
Trigger: React.ForwardRefExoticComponent<Omit<SelectTriggerProps, "ref"> & React.RefAttributes<HTMLButtonElement>>;
|
|
175
|
+
Value: React.ForwardRefExoticComponent<Omit<SelectValueProps, "ref"> & React.RefAttributes<HTMLSpanElement>>;
|
|
176
|
+
Popup: React.ForwardRefExoticComponent<Omit<SelectPopupProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
177
|
+
Content: React.ForwardRefExoticComponent<Omit<SelectPopupProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
178
|
+
Option: React.ForwardRefExoticComponent<Omit<SelectOptionProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
179
|
+
Item: React.ForwardRefExoticComponent<Omit<SelectOptionProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
180
|
+
Group: React.ForwardRefExoticComponent<Omit<SelectGroupProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
181
|
+
GroupLabel: React.ForwardRefExoticComponent<Omit<SelectGroupLabelProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
182
|
+
Label: React.ForwardRefExoticComponent<Omit<SelectGroupLabelProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
183
|
+
Separator: React.ForwardRefExoticComponent<Omit<SelectSeparatorProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
184
|
+
ScrollUpArrow: React.ForwardRefExoticComponent<Omit<SelectScrollUpArrowProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
185
|
+
ScrollDownArrow: React.ForwardRefExoticComponent<Omit<SelectScrollDownArrowProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
export { Select, SelectContent, SelectGroup, SelectGroupLabel, type SelectGroupLabelProps, type SelectGroupProps, SelectItem, SelectLabel, SelectOption, type SelectOptionProps, SelectPopup, type SelectPopupProps, type SelectProps, SelectRoot, SelectScrollDownArrow, type SelectScrollDownArrowProps, SelectScrollUpArrow, type SelectScrollUpArrowProps, SelectSeparator, type SelectSeparatorProps, SelectTrigger, type SelectTriggerProps, SelectValue, type SelectValueProps, selectOptionVariants, selectPopupVariants, selectScrollArrowVariants, selectSeparatorVariants, selectTriggerVariants };
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Select as Select$1 } from '@base-ui-components/react/select';
|
|
3
|
+
import { ChevronDown, Check, ChevronUp } from 'lucide-react';
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
import { tv, cnBase } from 'tailwind-variants';
|
|
6
|
+
import { clsx } from 'clsx';
|
|
7
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
8
|
+
|
|
9
|
+
// src/components/atoms/select/select.tsx
|
|
10
|
+
var formControlBase = [
|
|
11
|
+
// Layout
|
|
12
|
+
"flex w-full items-center",
|
|
13
|
+
// Typography
|
|
14
|
+
"text-16 font-medium leading-14",
|
|
15
|
+
// Border and radius - uses surface ui radius for theming support
|
|
16
|
+
"border border-solid border-ui-color-border rounded-surface-ui-medium",
|
|
17
|
+
// Background
|
|
18
|
+
"bg-ui-control-background",
|
|
19
|
+
// Transitions
|
|
20
|
+
"transition-[background-color,border-color,box-shadow] duration-150",
|
|
21
|
+
// Focus state
|
|
22
|
+
"outline-none focus-visible:border-border-focus focus-visible:ring-4 focus-visible:ring-ui-color-focus",
|
|
23
|
+
// Hover state (when not focused or disabled)
|
|
24
|
+
"hover:bg-ui-control-background-hover hover:focus-visible:bg-ui-control-background",
|
|
25
|
+
// Disabled state
|
|
26
|
+
"disabled:bg-ui-control-background-disabled disabled:cursor-not-allowed disabled:opacity-50"
|
|
27
|
+
];
|
|
28
|
+
var formControlSizes = {
|
|
29
|
+
sm: "h-spatial-ui-control-height-small px-spatial-ui-control-padding-x-small py-spatial-ui-control-padding-y-small text-14",
|
|
30
|
+
default: "h-spatial-ui-control-height-medium px-spatial-ui-control-padding-x-medium py-spatial-ui-control-padding-y-medium",
|
|
31
|
+
lg: "h-spatial-ui-control-height-large px-spatial-ui-control-padding-x-large py-spatial-ui-control-padding-y-large text-18"
|
|
32
|
+
};
|
|
33
|
+
var formControlError = {
|
|
34
|
+
true: "border-ui-error-color focus-visible:border-ui-error-color focus-visible:ring-ui-error-color/20 text-ui-error-color",
|
|
35
|
+
false: ""
|
|
36
|
+
};
|
|
37
|
+
tv({
|
|
38
|
+
base: formControlBase,
|
|
39
|
+
variants: {
|
|
40
|
+
size: formControlSizes,
|
|
41
|
+
error: formControlError
|
|
42
|
+
},
|
|
43
|
+
defaultVariants: {
|
|
44
|
+
size: "default",
|
|
45
|
+
error: false
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
function cn(...inputs) {
|
|
49
|
+
return cnBase(clsx(inputs));
|
|
50
|
+
}
|
|
51
|
+
var selectTriggerVariants = tv({
|
|
52
|
+
base: [
|
|
53
|
+
...formControlBase,
|
|
54
|
+
// Select-specific styles
|
|
55
|
+
"justify-between cursor-pointer",
|
|
56
|
+
// Override disabled to use data attribute (Base UI pattern)
|
|
57
|
+
"data-[disabled]:bg-ui-control-background-disabled data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50",
|
|
58
|
+
// Open state styling
|
|
59
|
+
"data-[popup-open]:border-ui-accent-base data-[popup-open]:ring-4 data-[popup-open]:ring-ui-color-focus data-[popup-open]:bg-ui-control-background",
|
|
60
|
+
// Invalid state (aria-invalid)
|
|
61
|
+
"aria-[invalid=true]:border-ui-error-color aria-[invalid=true]:ring-ui-error-color/20"
|
|
62
|
+
],
|
|
63
|
+
variants: {
|
|
64
|
+
size: formControlSizes,
|
|
65
|
+
error: formControlError
|
|
66
|
+
},
|
|
67
|
+
defaultVariants: {
|
|
68
|
+
size: "default",
|
|
69
|
+
error: false
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
var selectPopupVariants = tv({
|
|
73
|
+
base: [
|
|
74
|
+
// Layout - match trigger width using CSS custom property from Base UI
|
|
75
|
+
"flex flex-col gap-2 p-8",
|
|
76
|
+
"w-[var(--anchor-width)]",
|
|
77
|
+
// Background - uses overlay token
|
|
78
|
+
"bg-overlay-background",
|
|
79
|
+
// Border - uses overlay token for subtle border
|
|
80
|
+
"border border-overlay-border",
|
|
81
|
+
// Border radius - uses overlay token for consistency with other overlays
|
|
82
|
+
"rounded-surface-overlay",
|
|
83
|
+
// Shadow for elevation
|
|
84
|
+
"shadow-lg",
|
|
85
|
+
// Animation
|
|
86
|
+
"origin-[var(--transform-origin)]",
|
|
87
|
+
"transition-[transform,scale,opacity] duration-150",
|
|
88
|
+
"data-[starting-style]:scale-95 data-[starting-style]:opacity-0",
|
|
89
|
+
"data-[ending-style]:scale-95 data-[ending-style]:opacity-0",
|
|
90
|
+
// Ensure it's above other content
|
|
91
|
+
"z-50",
|
|
92
|
+
// Scrollable support
|
|
93
|
+
"overflow-y-auto max-h-[var(--available-height,300px)]"
|
|
94
|
+
]
|
|
95
|
+
});
|
|
96
|
+
var selectOptionVariants = tv({
|
|
97
|
+
base: [
|
|
98
|
+
// Layout
|
|
99
|
+
"flex items-center justify-between px-12 py-8 h-36",
|
|
100
|
+
// Typography - use semantic tokens
|
|
101
|
+
"typography-body-md-md font-medium text-ui-menu-item-text",
|
|
102
|
+
// Background - default
|
|
103
|
+
"bg-ui-menu-item-bg",
|
|
104
|
+
// Border radius - uses surface ui radius for theming support
|
|
105
|
+
"rounded-surface-ui-medium",
|
|
106
|
+
// Cursor
|
|
107
|
+
"cursor-pointer outline-none",
|
|
108
|
+
// Transitions
|
|
109
|
+
"transition-colors duration-150",
|
|
110
|
+
// Hover/highlighted state - use semantic token
|
|
111
|
+
"data-[highlighted]:bg-ui-menu-item-bg-hover",
|
|
112
|
+
// Selected state - use semantic tokens
|
|
113
|
+
"data-[selected]:bg-ui-menu-item-bg-selected data-[selected]:text-ui-menu-item-text-selected",
|
|
114
|
+
// Disabled state
|
|
115
|
+
"data-[disabled]:opacity-50 data-[disabled]:cursor-not-allowed"
|
|
116
|
+
]
|
|
117
|
+
});
|
|
118
|
+
var selectSeparatorVariants = tv({
|
|
119
|
+
base: ["h-px my-6 -mx-8", "bg-overlay-border"]
|
|
120
|
+
});
|
|
121
|
+
var selectScrollArrowVariants = tv({
|
|
122
|
+
base: [
|
|
123
|
+
"flex items-center justify-center",
|
|
124
|
+
"py-4",
|
|
125
|
+
"text-text-muted",
|
|
126
|
+
"cursor-default",
|
|
127
|
+
// Sticky positioning for scroll indicators
|
|
128
|
+
"data-[direction=up]:sticky data-[direction=up]:top-0",
|
|
129
|
+
"data-[direction=down]:sticky data-[direction=down]:bottom-0",
|
|
130
|
+
"bg-overlay-background"
|
|
131
|
+
]
|
|
132
|
+
});
|
|
133
|
+
var SelectRoot = ({
|
|
134
|
+
children,
|
|
135
|
+
...props
|
|
136
|
+
}) => {
|
|
137
|
+
return /* @__PURE__ */ jsx(Select$1.Root, { ...props, children });
|
|
138
|
+
};
|
|
139
|
+
var SelectTrigger = React.forwardRef(
|
|
140
|
+
({
|
|
141
|
+
className,
|
|
142
|
+
size,
|
|
143
|
+
error,
|
|
144
|
+
placeholder = "Select option...",
|
|
145
|
+
"aria-label": ariaLabel,
|
|
146
|
+
...props
|
|
147
|
+
}, ref) => {
|
|
148
|
+
return /* @__PURE__ */ jsxs(
|
|
149
|
+
Select$1.Trigger,
|
|
150
|
+
{
|
|
151
|
+
ref,
|
|
152
|
+
"aria-label": ariaLabel ?? placeholder,
|
|
153
|
+
"aria-invalid": error || void 0,
|
|
154
|
+
className: cn(selectTriggerVariants({ size, error }), className),
|
|
155
|
+
"data-size": size ?? "default",
|
|
156
|
+
"data-error": error ?? false,
|
|
157
|
+
...props,
|
|
158
|
+
children: [
|
|
159
|
+
/* @__PURE__ */ jsx(Select$1.Value, { children: (value) => value ? value : /* @__PURE__ */ jsx("span", { className: "text-text-muted", children: placeholder }) }),
|
|
160
|
+
/* @__PURE__ */ jsx(Select$1.Icon, { "aria-hidden": "true", children: /* @__PURE__ */ jsx(ChevronDown, { className: "size-16 text-gray-500 shrink-0" }) })
|
|
161
|
+
]
|
|
162
|
+
}
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
);
|
|
166
|
+
SelectTrigger.displayName = "SelectTrigger";
|
|
167
|
+
var SelectValue = React.forwardRef(
|
|
168
|
+
({ className, placeholder = "Select option...", ...props }, ref) => {
|
|
169
|
+
return /* @__PURE__ */ jsx(Select$1.Value, { ref, className, ...props, children: (value) => value ? value : /* @__PURE__ */ jsx("span", { className: "text-text-muted", children: placeholder }) });
|
|
170
|
+
}
|
|
171
|
+
);
|
|
172
|
+
SelectValue.displayName = "SelectValue";
|
|
173
|
+
var SelectPopup = React.forwardRef(
|
|
174
|
+
({ className, children, alignItemWithTrigger = true, ...props }, ref) => {
|
|
175
|
+
return /* @__PURE__ */ jsx(Select$1.Portal, { children: /* @__PURE__ */ jsx(
|
|
176
|
+
Select$1.Positioner,
|
|
177
|
+
{
|
|
178
|
+
side: "bottom",
|
|
179
|
+
sideOffset: 4,
|
|
180
|
+
align: "start",
|
|
181
|
+
alignItemWithTrigger,
|
|
182
|
+
children: /* @__PURE__ */ jsx(
|
|
183
|
+
Select$1.Popup,
|
|
184
|
+
{
|
|
185
|
+
ref,
|
|
186
|
+
className: cn(selectPopupVariants(), className),
|
|
187
|
+
...props,
|
|
188
|
+
children
|
|
189
|
+
}
|
|
190
|
+
)
|
|
191
|
+
}
|
|
192
|
+
) });
|
|
193
|
+
}
|
|
194
|
+
);
|
|
195
|
+
SelectPopup.displayName = "SelectPopup";
|
|
196
|
+
var SelectContent = SelectPopup;
|
|
197
|
+
var SelectOption = React.forwardRef(
|
|
198
|
+
({ className, children, ...props }, ref) => {
|
|
199
|
+
return /* @__PURE__ */ jsxs(
|
|
200
|
+
Select$1.Item,
|
|
201
|
+
{
|
|
202
|
+
ref,
|
|
203
|
+
className: cn(selectOptionVariants(), className),
|
|
204
|
+
...props,
|
|
205
|
+
children: [
|
|
206
|
+
/* @__PURE__ */ jsx(Select$1.ItemText, { children }),
|
|
207
|
+
/* @__PURE__ */ jsx(Select$1.ItemIndicator, { "aria-hidden": "true", children: /* @__PURE__ */ jsx(Check, { className: "size-14 shrink-0" }) })
|
|
208
|
+
]
|
|
209
|
+
}
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
);
|
|
213
|
+
SelectOption.displayName = "SelectOption";
|
|
214
|
+
var SelectItem = SelectOption;
|
|
215
|
+
var SelectGroup = React.forwardRef(
|
|
216
|
+
({ className, children, ...props }, ref) => {
|
|
217
|
+
return /* @__PURE__ */ jsx(Select$1.Group, { ref, className, ...props, children });
|
|
218
|
+
}
|
|
219
|
+
);
|
|
220
|
+
SelectGroup.displayName = "SelectGroup";
|
|
221
|
+
var SelectGroupLabel = React.forwardRef(({ className, children, ...props }, ref) => {
|
|
222
|
+
return /* @__PURE__ */ jsx(
|
|
223
|
+
Select$1.GroupLabel,
|
|
224
|
+
{
|
|
225
|
+
ref,
|
|
226
|
+
className: cn(
|
|
227
|
+
"px-12 py-6 typography-body-sm-sm font-medium text-text-muted uppercase tracking-wide",
|
|
228
|
+
className
|
|
229
|
+
),
|
|
230
|
+
...props,
|
|
231
|
+
children
|
|
232
|
+
}
|
|
233
|
+
);
|
|
234
|
+
});
|
|
235
|
+
SelectGroupLabel.displayName = "SelectGroupLabel";
|
|
236
|
+
var SelectLabel = SelectGroupLabel;
|
|
237
|
+
var SelectSeparator = React.forwardRef(
|
|
238
|
+
({ className, ...props }, ref) => {
|
|
239
|
+
return /* @__PURE__ */ jsx(
|
|
240
|
+
Select$1.Separator,
|
|
241
|
+
{
|
|
242
|
+
ref,
|
|
243
|
+
className: cn(selectSeparatorVariants(), className),
|
|
244
|
+
...props
|
|
245
|
+
}
|
|
246
|
+
);
|
|
247
|
+
}
|
|
248
|
+
);
|
|
249
|
+
SelectSeparator.displayName = "SelectSeparator";
|
|
250
|
+
var SelectScrollUpArrow = React.forwardRef(({ className, ...props }, ref) => {
|
|
251
|
+
return /* @__PURE__ */ jsx(
|
|
252
|
+
Select$1.ScrollUpArrow,
|
|
253
|
+
{
|
|
254
|
+
ref,
|
|
255
|
+
"data-direction": "up",
|
|
256
|
+
"aria-label": "Scroll up",
|
|
257
|
+
className: cn(selectScrollArrowVariants(), className),
|
|
258
|
+
...props,
|
|
259
|
+
children: /* @__PURE__ */ jsx(ChevronUp, { className: "size-12", "aria-hidden": "true" })
|
|
260
|
+
}
|
|
261
|
+
);
|
|
262
|
+
});
|
|
263
|
+
SelectScrollUpArrow.displayName = "SelectScrollUpArrow";
|
|
264
|
+
var SelectScrollDownArrow = React.forwardRef(({ className, ...props }, ref) => {
|
|
265
|
+
return /* @__PURE__ */ jsx(
|
|
266
|
+
Select$1.ScrollDownArrow,
|
|
267
|
+
{
|
|
268
|
+
ref,
|
|
269
|
+
"data-direction": "down",
|
|
270
|
+
"aria-label": "Scroll down",
|
|
271
|
+
className: cn(selectScrollArrowVariants(), className),
|
|
272
|
+
...props,
|
|
273
|
+
children: /* @__PURE__ */ jsx(ChevronDown, { className: "size-12", "aria-hidden": "true" })
|
|
274
|
+
}
|
|
275
|
+
);
|
|
276
|
+
});
|
|
277
|
+
SelectScrollDownArrow.displayName = "SelectScrollDownArrow";
|
|
278
|
+
var Select = Object.assign(SelectRoot, {
|
|
279
|
+
Trigger: SelectTrigger,
|
|
280
|
+
Value: SelectValue,
|
|
281
|
+
Popup: SelectPopup,
|
|
282
|
+
Content: SelectContent,
|
|
283
|
+
Option: SelectOption,
|
|
284
|
+
Item: SelectItem,
|
|
285
|
+
Group: SelectGroup,
|
|
286
|
+
GroupLabel: SelectGroupLabel,
|
|
287
|
+
Label: SelectLabel,
|
|
288
|
+
Separator: SelectSeparator,
|
|
289
|
+
ScrollUpArrow: SelectScrollUpArrow,
|
|
290
|
+
ScrollDownArrow: SelectScrollDownArrow
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
export { Select, SelectContent, SelectGroup, SelectGroupLabel, SelectItem, SelectLabel, SelectOption, SelectPopup, SelectRoot, SelectScrollDownArrow, SelectScrollUpArrow, SelectSeparator, SelectTrigger, SelectValue, selectOptionVariants, selectPopupVariants, selectScrollArrowVariants, selectSeparatorVariants, selectTriggerVariants };
|
|
294
|
+
//# sourceMappingURL=index.js.map
|
|
295
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/form-control.ts","../../src/lib/utils.ts","../../src/components/atoms/select/select.tsx"],"names":["twMerge","tv","BaseSelect"],"mappings":"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","file":"index.js","sourcesContent":["import { tv } from \"tailwind-variants\";\n\n/**\n * Shared form control styles for Input, Select, and similar components.\n *\n * These base styles ensure consistent appearance across all form controls:\n * - Consistent height and padding\n * - Unified focus ring and border treatment\n * - Shared hover/disabled states\n *\n * Based on Figma BaseKit / Interface / Input & Dropdown designs.\n */\n\n/**\n * Base styles shared by all form controls (input, select, etc.)\n */\nexport const formControlBase = [\n\t// Layout\n\t\"flex w-full items-center\",\n\t// Typography\n\t\"text-16 font-medium leading-14\",\n\t// Border and radius - uses surface ui radius for theming support\n\t\"border border-solid border-ui-color-border rounded-surface-ui-medium\",\n\t// Background\n\t\"bg-ui-control-background\",\n\t// Transitions\n\t\"transition-[background-color,border-color,box-shadow] duration-150\",\n\t// Focus state\n\t\"outline-none focus-visible:border-border-focus focus-visible:ring-4 focus-visible:ring-ui-color-focus\",\n\t// Hover state (when not focused or disabled)\n\t\"hover:bg-ui-control-background-hover hover:focus-visible:bg-ui-control-background\",\n\t// Disabled state\n\t\"disabled:bg-ui-control-background-disabled disabled:cursor-not-allowed disabled:opacity-50\",\n];\n\n/**\n * Size variants shared by form controls\n * Uses spatial tokens for consistent sizing across form controls\n */\nexport const formControlSizes = {\n\tsm: \"h-spatial-ui-control-height-small px-spatial-ui-control-padding-x-small py-spatial-ui-control-padding-y-small text-14\",\n\tdefault:\n\t\t\"h-spatial-ui-control-height-medium px-spatial-ui-control-padding-x-medium py-spatial-ui-control-padding-y-medium\",\n\tlg: \"h-spatial-ui-control-height-large px-spatial-ui-control-padding-x-large py-spatial-ui-control-padding-y-large text-18\",\n} as const;\n\n/**\n * Error state styles shared by form controls\n */\nexport const formControlError = {\n\ttrue: \"border-ui-error-color focus-visible:border-ui-error-color focus-visible:ring-ui-error-color/20 text-ui-error-color\",\n\tfalse: \"\",\n} as const;\n\n/**\n * Form control variants using tailwind-variants\n * Can be composed with other variants for specific components\n */\nexport const formControlVariants = tv({\n\tbase: formControlBase,\n\tvariants: {\n\t\tsize: formControlSizes,\n\t\terror: formControlError,\n\t},\n\tdefaultVariants: {\n\t\tsize: \"default\",\n\t\terror: false,\n\t},\n});\n\nexport type FormControlSize = keyof typeof formControlSizes;\n","import { type ClassValue, clsx } from \"clsx\";\nimport { cnBase as twMerge } from \"tailwind-variants\";\n\nexport { twMerge };\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport { Select as BaseSelect } from \"@base-ui-components/react/select\";\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\";\nimport * as React from \"react\";\nimport { tv, type VariantProps } from \"tailwind-variants\";\nimport {\n\tformControlBase,\n\tformControlError,\n\tformControlSizes,\n} from \"@/lib/form-control\";\nimport { cn } from \"@/lib/utils\";\n\n/**\n * Select trigger variants based on Figma BaseKit / Interface / Dropdown\n *\n * States:\n * - Default: White background, subtle border\n * - Hover: Light gray background\n * - Focus/Open: Accent border with focus ring\n * - Selected: Has a value selected (darker text)\n * - Disabled: Reduced opacity, not interactive\n * - Invalid: Error border and styling\n */\nconst selectTriggerVariants = tv({\n\tbase: [\n\t\t...formControlBase,\n\t\t// Select-specific styles\n\t\t\"justify-between cursor-pointer\",\n\t\t// Override disabled to use data attribute (Base UI pattern)\n\t\t\"data-[disabled]:bg-ui-control-background-disabled data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50\",\n\t\t// Open state styling\n\t\t\"data-[popup-open]:border-ui-accent-base data-[popup-open]:ring-4 data-[popup-open]:ring-ui-color-focus data-[popup-open]:bg-ui-control-background\",\n\t\t// Invalid state (aria-invalid)\n\t\t\"aria-[invalid=true]:border-ui-error-color aria-[invalid=true]:ring-ui-error-color/20\",\n\t],\n\tvariants: {\n\t\tsize: formControlSizes,\n\t\terror: formControlError,\n\t},\n\tdefaultVariants: {\n\t\tsize: \"default\",\n\t\terror: false,\n\t},\n});\n\n/**\n * Select popup/menu variants\n *\n * Uses overlay tokens for consistent floating panel styling:\n * - color.overlay.background - Light background\n * - color.overlay.border - Subtle border\n * - surface.overlay.radius - Rounded corners\n */\nconst selectPopupVariants = tv({\n\tbase: [\n\t\t// Layout - match trigger width using CSS custom property from Base UI\n\t\t\"flex flex-col gap-2 p-8\",\n\t\t\"w-[var(--anchor-width)]\",\n\t\t// Background - uses overlay token\n\t\t\"bg-overlay-background\",\n\t\t// Border - uses overlay token for subtle border\n\t\t\"border border-overlay-border\",\n\t\t// Border radius - uses overlay token for consistency with other overlays\n\t\t\"rounded-surface-overlay\",\n\t\t// Shadow for elevation\n\t\t\"shadow-lg\",\n\t\t// Animation\n\t\t\"origin-[var(--transform-origin)]\",\n\t\t\"transition-[transform,scale,opacity] duration-150\",\n\t\t\"data-[starting-style]:scale-95 data-[starting-style]:opacity-0\",\n\t\t\"data-[ending-style]:scale-95 data-[ending-style]:opacity-0\",\n\t\t// Ensure it's above other content\n\t\t\"z-50\",\n\t\t// Scrollable support\n\t\t\"overflow-y-auto max-h-[var(--available-height,300px)]\",\n\t],\n});\n\n/**\n * Select option/item variants based on Figma Menu Items\n *\n * States:\n * - Default: White background\n * - Hover/Highlighted: Light indigo tint background\n * - Selected: Stronger indigo tint with blue text and checkmark\n * - Disabled: Reduced opacity\n */\nconst selectOptionVariants = tv({\n\tbase: [\n\t\t// Layout\n\t\t\"flex items-center justify-between px-12 py-8 h-36\",\n\t\t// Typography - use semantic tokens\n\t\t\"typography-body-md-md font-medium text-ui-menu-item-text\",\n\t\t// Background - default\n\t\t\"bg-ui-menu-item-bg\",\n\t\t// Border radius - uses surface ui radius for theming support\n\t\t\"rounded-surface-ui-medium\",\n\t\t// Cursor\n\t\t\"cursor-pointer outline-none\",\n\t\t// Transitions\n\t\t\"transition-colors duration-150\",\n\t\t// Hover/highlighted state - use semantic token\n\t\t\"data-[highlighted]:bg-ui-menu-item-bg-hover\",\n\t\t// Selected state - use semantic tokens\n\t\t\"data-[selected]:bg-ui-menu-item-bg-selected data-[selected]:text-ui-menu-item-text-selected\",\n\t\t// Disabled state\n\t\t\"data-[disabled]:opacity-50 data-[disabled]:cursor-not-allowed\",\n\t],\n});\n\n/**\n * Select separator variants\n */\nconst selectSeparatorVariants = tv({\n\tbase: [\"h-px my-6 -mx-8\", \"bg-overlay-border\"],\n});\n\n/**\n * Select scroll arrow variants (shared by up and down)\n */\nconst selectScrollArrowVariants = tv({\n\tbase: [\n\t\t\"flex items-center justify-center\",\n\t\t\"py-4\",\n\t\t\"text-text-muted\",\n\t\t\"cursor-default\",\n\t\t// Sticky positioning for scroll indicators\n\t\t\"data-[direction=up]:sticky data-[direction=up]:top-0\",\n\t\t\"data-[direction=down]:sticky data-[direction=down]:bottom-0\",\n\t\t\"bg-overlay-background\",\n\t],\n});\n\n// ============================================================================\n// Select Root\n// ============================================================================\n\nexport interface SelectProps<Value = string>\n\textends BaseSelect.Root.Props<Value> {\n\tchildren: React.ReactNode;\n}\n\nconst SelectRoot = <Value = string>({\n\tchildren,\n\t...props\n}: SelectProps<Value>) => {\n\treturn <BaseSelect.Root {...props}>{children}</BaseSelect.Root>;\n};\n\n// ============================================================================\n// Select Trigger\n// ============================================================================\n\nexport interface SelectTriggerProps\n\textends Omit<React.ComponentProps<typeof BaseSelect.Trigger>, \"className\">,\n\t\tVariantProps<typeof selectTriggerVariants> {\n\tclassName?: string;\n\tplaceholder?: string;\n\t/**\n\t * Accessible label for the select trigger.\n\t * Required for accessibility when no visible label is present.\n\t */\n\t\"aria-label\"?: string;\n}\n\nconst SelectTrigger = React.forwardRef<HTMLButtonElement, SelectTriggerProps>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tsize,\n\t\t\terror,\n\t\t\tplaceholder = \"Select option...\",\n\t\t\t\"aria-label\": ariaLabel,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\treturn (\n\t\t\t<BaseSelect.Trigger\n\t\t\t\tref={ref}\n\t\t\t\taria-label={ariaLabel ?? placeholder}\n\t\t\t\taria-invalid={error || undefined}\n\t\t\t\tclassName={cn(selectTriggerVariants({ size, error }), className)}\n\t\t\t\tdata-size={size ?? \"default\"}\n\t\t\t\tdata-error={error ?? false}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<BaseSelect.Value>\n\t\t\t\t\t{(value) =>\n\t\t\t\t\t\tvalue ? (\n\t\t\t\t\t\t\tvalue\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<span className=\"text-text-muted\">{placeholder}</span>\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t</BaseSelect.Value>\n\t\t\t\t<BaseSelect.Icon aria-hidden=\"true\">\n\t\t\t\t\t<ChevronDown className=\"size-16 text-gray-500 shrink-0\" />\n\t\t\t\t</BaseSelect.Icon>\n\t\t\t</BaseSelect.Trigger>\n\t\t);\n\t},\n);\nSelectTrigger.displayName = \"SelectTrigger\";\n\n// ============================================================================\n// Select Value (for custom trigger compositions)\n// ============================================================================\n\nexport interface SelectValueProps\n\textends Omit<React.ComponentProps<typeof BaseSelect.Value>, \"className\"> {\n\tclassName?: string;\n\tplaceholder?: string;\n}\n\nconst SelectValue = React.forwardRef<HTMLSpanElement, SelectValueProps>(\n\t({ className, placeholder = \"Select option...\", ...props }, ref) => {\n\t\treturn (\n\t\t\t<BaseSelect.Value ref={ref} className={className} {...props}>\n\t\t\t\t{(value) =>\n\t\t\t\t\tvalue ? value : <span className=\"text-text-muted\">{placeholder}</span>\n\t\t\t\t}\n\t\t\t</BaseSelect.Value>\n\t\t);\n\t},\n);\nSelectValue.displayName = \"SelectValue\";\n\n// ============================================================================\n// Select Portal & Popup (Content)\n// ============================================================================\n\nexport interface SelectPopupProps\n\textends Omit<React.ComponentProps<typeof BaseSelect.Popup>, \"className\"> {\n\tclassName?: string;\n\t/**\n\t * Whether the selected item should align with the trigger.\n\t * When true (default), the popup positions so the selected item appears over the trigger.\n\t * When false, the popup aligns to the trigger edge.\n\t */\n\talignItemWithTrigger?: boolean;\n}\n\nconst SelectPopup = React.forwardRef<HTMLDivElement, SelectPopupProps>(\n\t({ className, children, alignItemWithTrigger = true, ...props }, ref) => {\n\t\treturn (\n\t\t\t<BaseSelect.Portal>\n\t\t\t\t<BaseSelect.Positioner\n\t\t\t\t\tside=\"bottom\"\n\t\t\t\t\tsideOffset={4}\n\t\t\t\t\talign=\"start\"\n\t\t\t\t\talignItemWithTrigger={alignItemWithTrigger}\n\t\t\t\t>\n\t\t\t\t\t<BaseSelect.Popup\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\tclassName={cn(selectPopupVariants(), className)}\n\t\t\t\t\t\t{...props}\n\t\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</BaseSelect.Popup>\n\t\t\t\t</BaseSelect.Positioner>\n\t\t\t</BaseSelect.Portal>\n\t\t);\n\t},\n);\nSelectPopup.displayName = \"SelectPopup\";\n\n// Alias for shadcn compatibility\nconst SelectContent = SelectPopup;\n\n// ============================================================================\n// Select Option (wraps Base UI's Select.Item)\n// ============================================================================\n\nexport interface SelectOptionProps\n\textends Omit<React.ComponentProps<typeof BaseSelect.Item>, \"className\"> {\n\tclassName?: string;\n}\n\nconst SelectOption = React.forwardRef<HTMLDivElement, SelectOptionProps>(\n\t({ className, children, ...props }, ref) => {\n\t\treturn (\n\t\t\t<BaseSelect.Item\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(selectOptionVariants(), className)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<BaseSelect.ItemText>{children}</BaseSelect.ItemText>\n\t\t\t\t<BaseSelect.ItemIndicator aria-hidden=\"true\">\n\t\t\t\t\t<Check className=\"size-14 shrink-0\" />\n\t\t\t\t</BaseSelect.ItemIndicator>\n\t\t\t</BaseSelect.Item>\n\t\t);\n\t},\n);\nSelectOption.displayName = \"SelectOption\";\n\n// Alias for shadcn compatibility\nconst SelectItem = SelectOption;\n\n// ============================================================================\n// Select Group\n// ============================================================================\n\nexport interface SelectGroupProps\n\textends Omit<React.ComponentProps<typeof BaseSelect.Group>, \"className\"> {\n\tclassName?: string;\n}\n\nconst SelectGroup = React.forwardRef<HTMLDivElement, SelectGroupProps>(\n\t({ className, children, ...props }, ref) => {\n\t\treturn (\n\t\t\t<BaseSelect.Group ref={ref} className={className} {...props}>\n\t\t\t\t{children}\n\t\t\t</BaseSelect.Group>\n\t\t);\n\t},\n);\nSelectGroup.displayName = \"SelectGroup\";\n\n// ============================================================================\n// Select Group Label\n// ============================================================================\n\nexport interface SelectGroupLabelProps\n\textends Omit<\n\t\tReact.ComponentProps<typeof BaseSelect.GroupLabel>,\n\t\t\"className\"\n\t> {\n\tclassName?: string;\n}\n\nconst SelectGroupLabel = React.forwardRef<\n\tHTMLDivElement,\n\tSelectGroupLabelProps\n>(({ className, children, ...props }, ref) => {\n\treturn (\n\t\t<BaseSelect.GroupLabel\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"px-12 py-6 typography-body-sm-sm font-medium text-text-muted uppercase tracking-wide\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</BaseSelect.GroupLabel>\n\t);\n});\nSelectGroupLabel.displayName = \"SelectGroupLabel\";\n\n// Alias for shadcn compatibility\nconst SelectLabel = SelectGroupLabel;\n\n// ============================================================================\n// Select Separator\n// ============================================================================\n\nexport interface SelectSeparatorProps\n\textends Omit<React.ComponentProps<typeof BaseSelect.Separator>, \"className\"> {\n\tclassName?: string;\n}\n\nconst SelectSeparator = React.forwardRef<HTMLDivElement, SelectSeparatorProps>(\n\t({ className, ...props }, ref) => {\n\t\treturn (\n\t\t\t<BaseSelect.Separator\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(selectSeparatorVariants(), className)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t);\n\t},\n);\nSelectSeparator.displayName = \"SelectSeparator\";\n\n// ============================================================================\n// Select Scroll Up Arrow\n// ============================================================================\n\nexport interface SelectScrollUpArrowProps\n\textends Omit<\n\t\tReact.ComponentProps<typeof BaseSelect.ScrollUpArrow>,\n\t\t\"className\"\n\t> {\n\tclassName?: string;\n}\n\nconst SelectScrollUpArrow = React.forwardRef<\n\tHTMLDivElement,\n\tSelectScrollUpArrowProps\n>(({ className, ...props }, ref) => {\n\treturn (\n\t\t<BaseSelect.ScrollUpArrow\n\t\t\tref={ref}\n\t\t\tdata-direction=\"up\"\n\t\t\taria-label=\"Scroll up\"\n\t\t\tclassName={cn(selectScrollArrowVariants(), className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<ChevronUp className=\"size-12\" aria-hidden=\"true\" />\n\t\t</BaseSelect.ScrollUpArrow>\n\t);\n});\nSelectScrollUpArrow.displayName = \"SelectScrollUpArrow\";\n\n// ============================================================================\n// Select Scroll Down Arrow\n// ============================================================================\n\nexport interface SelectScrollDownArrowProps\n\textends Omit<\n\t\tReact.ComponentProps<typeof BaseSelect.ScrollDownArrow>,\n\t\t\"className\"\n\t> {\n\tclassName?: string;\n}\n\nconst SelectScrollDownArrow = React.forwardRef<\n\tHTMLDivElement,\n\tSelectScrollDownArrowProps\n>(({ className, ...props }, ref) => {\n\treturn (\n\t\t<BaseSelect.ScrollDownArrow\n\t\t\tref={ref}\n\t\t\tdata-direction=\"down\"\n\t\t\taria-label=\"Scroll down\"\n\t\t\tclassName={cn(selectScrollArrowVariants(), className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<ChevronDown className=\"size-12\" aria-hidden=\"true\" />\n\t\t</BaseSelect.ScrollDownArrow>\n\t);\n});\nSelectScrollDownArrow.displayName = \"SelectScrollDownArrow\";\n\n// ============================================================================\n// Compound Component Export\n// ============================================================================\n\nexport const Select = Object.assign(SelectRoot, {\n\tTrigger: SelectTrigger,\n\tValue: SelectValue,\n\tPopup: SelectPopup,\n\tContent: SelectContent,\n\tOption: SelectOption,\n\tItem: SelectItem,\n\tGroup: SelectGroup,\n\tGroupLabel: SelectGroupLabel,\n\tLabel: SelectLabel,\n\tSeparator: SelectSeparator,\n\tScrollUpArrow: SelectScrollUpArrow,\n\tScrollDownArrow: SelectScrollDownArrow,\n});\n\n// Also export individual components for flexibility\nexport {\n\tSelectRoot,\n\tSelectTrigger,\n\tSelectValue,\n\tSelectPopup,\n\tSelectContent,\n\tSelectOption,\n\tSelectItem,\n\tSelectGroup,\n\tSelectGroupLabel,\n\tSelectLabel,\n\tSelectSeparator,\n\tSelectScrollUpArrow,\n\tSelectScrollDownArrow,\n\tselectTriggerVariants,\n\tselectPopupVariants,\n\tselectOptionVariants,\n\tselectSeparatorVariants,\n\tselectScrollArrowVariants,\n};\n"]}
|