@rovula/ui 0.1.20 → 0.1.21

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 (42) hide show
  1. package/dist/cjs/bundle.css +141 -17
  2. package/dist/cjs/bundle.js +3 -3
  3. package/dist/cjs/bundle.js.map +1 -1
  4. package/dist/cjs/types/components/DropdownMenu/DropdownMenu.stories.d.ts +29 -30
  5. package/dist/cjs/types/components/Form/Form.d.ts +2 -1
  6. package/dist/cjs/types/components/Form/Form.stories.d.ts +4 -0
  7. package/dist/cjs/types/components/ScrollArea/ScrollArea.d.ts +38 -0
  8. package/dist/cjs/types/components/ScrollArea/ScrollArea.stories.d.ts +301 -0
  9. package/dist/cjs/types/index.d.ts +1 -0
  10. package/dist/components/DropdownMenu/DropdownMenu.js +7 -9
  11. package/dist/components/DropdownMenu/DropdownMenu.stories.js +79 -91
  12. package/dist/components/Form/Form.js +11 -4
  13. package/dist/components/Form/Form.stories.js +27 -0
  14. package/dist/components/ScrollArea/ScrollArea.js +50 -0
  15. package/dist/components/ScrollArea/ScrollArea.stories.js +56 -0
  16. package/dist/esm/bundle.css +141 -17
  17. package/dist/esm/bundle.js +3 -3
  18. package/dist/esm/bundle.js.map +1 -1
  19. package/dist/esm/types/components/DropdownMenu/DropdownMenu.stories.d.ts +29 -30
  20. package/dist/esm/types/components/Form/Form.d.ts +2 -1
  21. package/dist/esm/types/components/Form/Form.stories.d.ts +4 -0
  22. package/dist/esm/types/components/ScrollArea/ScrollArea.d.ts +38 -0
  23. package/dist/esm/types/components/ScrollArea/ScrollArea.stories.d.ts +301 -0
  24. package/dist/esm/types/index.d.ts +1 -0
  25. package/dist/index.d.ts +41 -2
  26. package/dist/index.js +1 -0
  27. package/dist/src/theme/global.css +196 -20
  28. package/package.json +1 -1
  29. package/src/components/DropdownMenu/DropdownMenu.stories.tsx +482 -297
  30. package/src/components/DropdownMenu/DropdownMenu.tsx +7 -8
  31. package/src/components/Form/Form.stories.tsx +70 -0
  32. package/src/components/Form/Form.tsx +23 -0
  33. package/src/components/ScrollArea/ScrollArea.stories.tsx +229 -0
  34. package/src/components/ScrollArea/ScrollArea.tsx +72 -0
  35. package/src/index.ts +1 -0
  36. package/src/theme/global.css +84 -11
  37. package/src/theme/themes/xspector/baseline.css +1 -0
  38. package/src/theme/themes/xspector/components/dropdown-menu.css +2 -2
  39. package/src/theme/themes/xspector/components/scrollbar.css +12 -0
  40. package/src/theme/tokens/baseline.css +2 -1
  41. package/src/theme/tokens/components/dropdown-menu.css +1 -1
  42. package/src/theme/tokens/components/scrollbar.css +18 -0
@@ -15,40 +15,39 @@ declare const meta: {
15
15
  }>) => import("react/jsx-runtime").JSX.Element)[];
16
16
  };
17
17
  export default meta;
18
- export declare const Default: {
19
- args: {};
20
- render: (args: {}) => import("react/jsx-runtime").JSX.Element;
18
+ export declare const AllStates: {
19
+ name: string;
20
+ render: () => import("react/jsx-runtime").JSX.Element;
21
21
  };
22
22
  export declare const WithIcon: {
23
- args: {};
24
- render: (args: {}) => import("react/jsx-runtime").JSX.Element;
23
+ name: string;
24
+ render: () => import("react/jsx-runtime").JSX.Element;
25
25
  };
26
- export declare const WithLabel: {
27
- args: {};
28
- render: (args: {}) => import("react/jsx-runtime").JSX.Element;
26
+ export declare const WithCheckbox: {
27
+ name: string;
28
+ render: () => import("react/jsx-runtime").JSX.Element;
29
29
  };
30
- export declare const Checkboxes: {
31
- args: {};
32
- render: (args: {}) => import("react/jsx-runtime").JSX.Element;
30
+ export declare const WithSection: {
31
+ name: string;
32
+ render: () => import("react/jsx-runtime").JSX.Element;
33
+ };
34
+ export declare const WithSearch: {
35
+ name: string;
36
+ render: () => import("react/jsx-runtime").JSX.Element;
37
+ };
38
+ export declare const CanScroll: {
39
+ name: string;
40
+ render: () => import("react/jsx-runtime").JSX.Element;
41
+ };
42
+ export declare const DoubleScroll: {
43
+ name: string;
44
+ render: () => import("react/jsx-runtime").JSX.Element;
33
45
  };
34
46
  export declare const SubMenu: {
35
- args: {};
36
- render: (args: {}) => import("react/jsx-runtime").JSX.Element;
37
- };
38
- export declare const OnIcon: {
39
- args: {};
40
- render: (args: {}) => import("react/jsx-runtime").JSX.Element;
41
- };
42
- export declare const AsChild: {
43
- args: {};
44
- render: (args: {}) => import("react/jsx-runtime").JSX.Element;
45
- };
46
- export declare const Position: {
47
- args: {
48
- side: string;
49
- align: string;
50
- sideOffset: number;
51
- alignOffset: number;
52
- };
53
- render: (args: {}) => import("react/jsx-runtime").JSX.Element;
47
+ name: string;
48
+ render: () => import("react/jsx-runtime").JSX.Element;
49
+ };
50
+ export declare const TriggerVariants: {
51
+ name: string;
52
+ render: () => import("react/jsx-runtime").JSX.Element;
54
53
  };
@@ -1,5 +1,5 @@
1
1
  import React, { FormHTMLAttributes, ReactNode } from "react";
2
- import { DefaultValues, FieldValues, Mode, Resolver, SubmitErrorHandler, SubmitHandler, UseFormReturn } from "react-hook-form";
2
+ import { DefaultValues, FieldValues, FormState, Mode, Resolver, SubmitErrorHandler, SubmitHandler, UseFormReturn } from "react-hook-form";
3
3
  import * as yup from "yup";
4
4
  type FormChildren<TFieldValues extends FieldValues> = ReactNode | ((methods: UseFormReturn<TFieldValues>) => ReactNode);
5
5
  export type FormController<TFieldValues extends FieldValues> = {
@@ -16,6 +16,7 @@ export type FormProps<TFieldValues extends FieldValues> = Omit<FormHTMLAttribute
16
16
  controllerRef?: React.MutableRefObject<FormController<TFieldValues> | null>;
17
17
  onSubmit: SubmitHandler<TFieldValues>;
18
18
  onInvalidSubmit?: SubmitErrorHandler<TFieldValues>;
19
+ onFormStateChange?: (formState: FormState<TFieldValues>) => void;
19
20
  resolver?: Resolver<TFieldValues>;
20
21
  validationSchema?: yup.ObjectSchema<any>;
21
22
  mode?: Mode;
@@ -17,6 +17,10 @@ export declare const RenderPropsCodeControl: {
17
17
  args: {};
18
18
  render: () => import("react/jsx-runtime").JSX.Element;
19
19
  };
20
+ export declare const FormStateChangeCallback: {
21
+ args: {};
22
+ render: () => import("react/jsx-runtime").JSX.Element;
23
+ };
20
24
  export declare const HigherLayerCodeControl: {
21
25
  args: {};
22
26
  render: () => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,38 @@
1
+ import * as React from "react";
2
+ export type ScrollbarSize = "m" | "s" | "xs";
3
+ export interface ScrollAreaProps extends React.HTMLAttributes<HTMLDivElement> {
4
+ /**
5
+ * Scrollbar thickness.
6
+ * - `m` — 12 px (shows track border)
7
+ * - `s` — 6 px (default, shows no track border)
8
+ * - `xs` — 2 px (shows no track border)
9
+ */
10
+ scrollbarSize?: ScrollbarSize;
11
+ /**
12
+ * Direction(s) the area can scroll.
13
+ * Defaults to `"vertical"`.
14
+ */
15
+ direction?: "vertical" | "horizontal" | "both";
16
+ }
17
+ /**
18
+ * ScrollArea
19
+ *
20
+ * A thin wrapper that applies the design-system scrollbar style to any
21
+ * scrollable container. Use `scrollbarSize` to pick the Figma size variant
22
+ * and `direction` to control which axis scrolls.
23
+ *
24
+ * **Client usage:**
25
+ * ```tsx
26
+ * <ScrollArea className="max-h-[270px]">
27
+ * {items.map(item => <div key={item.id}>{item.label}</div>)}
28
+ * </ScrollArea>
29
+ * ```
30
+ *
31
+ * For a double-scroll layout (two independent sections inside one dropdown),
32
+ * wrap each section individually:
33
+ * ```tsx
34
+ * <ScrollArea className="max-h-[160px]">...section A items...</ScrollArea>
35
+ * <ScrollArea className="max-h-[160px]">...section B items...</ScrollArea>
36
+ * ```
37
+ */
38
+ export declare const ScrollArea: React.ForwardRefExoticComponent<ScrollAreaProps & React.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,301 @@
1
+ import React from "react";
2
+ declare const meta: {
3
+ title: string;
4
+ component: React.ForwardRefExoticComponent<import("./ScrollArea").ScrollAreaProps & React.RefAttributes<HTMLDivElement>>;
5
+ parameters: {
6
+ layout: string;
7
+ };
8
+ decorators: ((Story: import("@storybook/csf").PartialStoryFn<import("@storybook/react").ReactRenderer, {
9
+ scrollbarSize?: import("./ScrollArea").ScrollbarSize | undefined;
10
+ direction?: "vertical" | "horizontal" | "both" | undefined;
11
+ defaultChecked?: boolean | undefined | undefined;
12
+ defaultValue?: string | number | readonly string[] | undefined;
13
+ suppressContentEditableWarning?: boolean | undefined | undefined;
14
+ suppressHydrationWarning?: boolean | undefined | undefined;
15
+ accessKey?: string | undefined | undefined;
16
+ autoCapitalize?: "off" | "none" | "on" | "sentences" | "words" | "characters" | undefined | (string & {}) | undefined;
17
+ autoFocus?: boolean | undefined | undefined;
18
+ className?: string | undefined | undefined;
19
+ contentEditable?: "inherit" | (boolean | "true" | "false") | "plaintext-only" | undefined;
20
+ contextMenu?: string | undefined | undefined;
21
+ dir?: string | undefined | undefined;
22
+ draggable?: (boolean | "true" | "false") | undefined;
23
+ enterKeyHint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
24
+ hidden?: boolean | undefined | undefined;
25
+ id?: string | undefined | undefined;
26
+ lang?: string | undefined | undefined;
27
+ nonce?: string | undefined | undefined;
28
+ slot?: string | undefined | undefined;
29
+ spellCheck?: (boolean | "true" | "false") | undefined;
30
+ style?: React.CSSProperties | undefined;
31
+ tabIndex?: number | undefined | undefined;
32
+ title?: string | undefined | undefined;
33
+ translate?: "yes" | "no" | undefined | undefined;
34
+ radioGroup?: string | undefined | undefined;
35
+ role?: React.AriaRole | undefined;
36
+ about?: string | undefined | undefined;
37
+ content?: string | undefined | undefined;
38
+ datatype?: string | undefined | undefined;
39
+ inlist?: any;
40
+ prefix?: string | undefined | undefined;
41
+ property?: string | undefined | undefined;
42
+ rel?: string | undefined | undefined;
43
+ resource?: string | undefined | undefined;
44
+ rev?: string | undefined | undefined;
45
+ typeof?: string | undefined | undefined;
46
+ vocab?: string | undefined | undefined;
47
+ autoCorrect?: string | undefined | undefined;
48
+ autoSave?: string | undefined | undefined;
49
+ color?: string | undefined | undefined;
50
+ itemProp?: string | undefined | undefined;
51
+ itemScope?: boolean | undefined | undefined;
52
+ itemType?: string | undefined | undefined;
53
+ itemID?: string | undefined | undefined;
54
+ itemRef?: string | undefined | undefined;
55
+ results?: number | undefined | undefined;
56
+ security?: string | undefined | undefined;
57
+ unselectable?: "on" | "off" | undefined | undefined;
58
+ inputMode?: "none" | "text" | "tel" | "url" | "email" | "numeric" | "decimal" | "search" | undefined | undefined;
59
+ is?: string | undefined | undefined;
60
+ "aria-activedescendant"?: string | undefined | undefined;
61
+ "aria-atomic"?: (boolean | "true" | "false") | undefined;
62
+ "aria-autocomplete"?: "none" | "inline" | "list" | "both" | undefined | undefined;
63
+ "aria-braillelabel"?: string | undefined | undefined;
64
+ "aria-brailleroledescription"?: string | undefined | undefined;
65
+ "aria-busy"?: (boolean | "true" | "false") | undefined;
66
+ "aria-checked"?: boolean | "false" | "mixed" | "true" | undefined | undefined;
67
+ "aria-colcount"?: number | undefined | undefined;
68
+ "aria-colindex"?: number | undefined | undefined;
69
+ "aria-colindextext"?: string | undefined | undefined;
70
+ "aria-colspan"?: number | undefined | undefined;
71
+ "aria-controls"?: string | undefined | undefined;
72
+ "aria-current"?: boolean | "false" | "true" | "page" | "step" | "location" | "date" | "time" | undefined | undefined;
73
+ "aria-describedby"?: string | undefined | undefined;
74
+ "aria-description"?: string | undefined | undefined;
75
+ "aria-details"?: string | undefined | undefined;
76
+ "aria-disabled"?: (boolean | "true" | "false") | undefined;
77
+ "aria-dropeffect"?: "none" | "copy" | "execute" | "link" | "move" | "popup" | undefined | undefined;
78
+ "aria-errormessage"?: string | undefined | undefined;
79
+ "aria-expanded"?: (boolean | "true" | "false") | undefined;
80
+ "aria-flowto"?: string | undefined | undefined;
81
+ "aria-grabbed"?: (boolean | "true" | "false") | undefined;
82
+ "aria-haspopup"?: boolean | "false" | "true" | "menu" | "listbox" | "tree" | "grid" | "dialog" | undefined | undefined;
83
+ "aria-hidden"?: (boolean | "true" | "false") | undefined;
84
+ "aria-invalid"?: boolean | "false" | "true" | "grammar" | "spelling" | undefined | undefined;
85
+ "aria-keyshortcuts"?: string | undefined | undefined;
86
+ "aria-label"?: string | undefined | undefined;
87
+ "aria-labelledby"?: string | undefined | undefined;
88
+ "aria-level"?: number | undefined | undefined;
89
+ "aria-live"?: "off" | "assertive" | "polite" | undefined | undefined;
90
+ "aria-modal"?: (boolean | "true" | "false") | undefined;
91
+ "aria-multiline"?: (boolean | "true" | "false") | undefined;
92
+ "aria-multiselectable"?: (boolean | "true" | "false") | undefined;
93
+ "aria-orientation"?: "horizontal" | "vertical" | undefined | undefined;
94
+ "aria-owns"?: string | undefined | undefined;
95
+ "aria-placeholder"?: string | undefined | undefined;
96
+ "aria-posinset"?: number | undefined | undefined;
97
+ "aria-pressed"?: boolean | "false" | "mixed" | "true" | undefined | undefined;
98
+ "aria-readonly"?: (boolean | "true" | "false") | undefined;
99
+ "aria-relevant"?: "additions" | "additions removals" | "additions text" | "all" | "removals" | "removals additions" | "removals text" | "text" | "text additions" | "text removals" | undefined | undefined;
100
+ "aria-required"?: (boolean | "true" | "false") | undefined;
101
+ "aria-roledescription"?: string | undefined | undefined;
102
+ "aria-rowcount"?: number | undefined | undefined;
103
+ "aria-rowindex"?: number | undefined | undefined;
104
+ "aria-rowindextext"?: string | undefined | undefined;
105
+ "aria-rowspan"?: number | undefined | undefined;
106
+ "aria-selected"?: (boolean | "true" | "false") | undefined;
107
+ "aria-setsize"?: number | undefined | undefined;
108
+ "aria-sort"?: "none" | "ascending" | "descending" | "other" | undefined | undefined;
109
+ "aria-valuemax"?: number | undefined | undefined;
110
+ "aria-valuemin"?: number | undefined | undefined;
111
+ "aria-valuenow"?: number | undefined | undefined;
112
+ "aria-valuetext"?: string | undefined | undefined;
113
+ children?: React.ReactNode;
114
+ dangerouslySetInnerHTML?: {
115
+ __html: string | TrustedHTML;
116
+ } | undefined | undefined;
117
+ onCopy?: React.ClipboardEventHandler<HTMLDivElement> | undefined;
118
+ onCopyCapture?: React.ClipboardEventHandler<HTMLDivElement> | undefined;
119
+ onCut?: React.ClipboardEventHandler<HTMLDivElement> | undefined;
120
+ onCutCapture?: React.ClipboardEventHandler<HTMLDivElement> | undefined;
121
+ onPaste?: React.ClipboardEventHandler<HTMLDivElement> | undefined;
122
+ onPasteCapture?: React.ClipboardEventHandler<HTMLDivElement> | undefined;
123
+ onCompositionEnd?: React.CompositionEventHandler<HTMLDivElement> | undefined;
124
+ onCompositionEndCapture?: React.CompositionEventHandler<HTMLDivElement> | undefined;
125
+ onCompositionStart?: React.CompositionEventHandler<HTMLDivElement> | undefined;
126
+ onCompositionStartCapture?: React.CompositionEventHandler<HTMLDivElement> | undefined;
127
+ onCompositionUpdate?: React.CompositionEventHandler<HTMLDivElement> | undefined;
128
+ onCompositionUpdateCapture?: React.CompositionEventHandler<HTMLDivElement> | undefined;
129
+ onFocus?: React.FocusEventHandler<HTMLDivElement> | undefined;
130
+ onFocusCapture?: React.FocusEventHandler<HTMLDivElement> | undefined;
131
+ onBlur?: React.FocusEventHandler<HTMLDivElement> | undefined;
132
+ onBlurCapture?: React.FocusEventHandler<HTMLDivElement> | undefined;
133
+ onChange?: React.FormEventHandler<HTMLDivElement> | undefined;
134
+ onChangeCapture?: React.FormEventHandler<HTMLDivElement> | undefined;
135
+ onBeforeInput?: React.FormEventHandler<HTMLDivElement> | undefined;
136
+ onBeforeInputCapture?: React.FormEventHandler<HTMLDivElement> | undefined;
137
+ onInput?: React.FormEventHandler<HTMLDivElement> | undefined;
138
+ onInputCapture?: React.FormEventHandler<HTMLDivElement> | undefined;
139
+ onReset?: React.FormEventHandler<HTMLDivElement> | undefined;
140
+ onResetCapture?: React.FormEventHandler<HTMLDivElement> | undefined;
141
+ onSubmit?: React.FormEventHandler<HTMLDivElement> | undefined;
142
+ onSubmitCapture?: React.FormEventHandler<HTMLDivElement> | undefined;
143
+ onInvalid?: React.FormEventHandler<HTMLDivElement> | undefined;
144
+ onInvalidCapture?: React.FormEventHandler<HTMLDivElement> | undefined;
145
+ onLoad?: React.ReactEventHandler<HTMLDivElement> | undefined;
146
+ onLoadCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
147
+ onError?: React.ReactEventHandler<HTMLDivElement> | undefined;
148
+ onErrorCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
149
+ onKeyDown?: React.KeyboardEventHandler<HTMLDivElement> | undefined;
150
+ onKeyDownCapture?: React.KeyboardEventHandler<HTMLDivElement> | undefined;
151
+ onKeyPress?: React.KeyboardEventHandler<HTMLDivElement> | undefined;
152
+ onKeyPressCapture?: React.KeyboardEventHandler<HTMLDivElement> | undefined;
153
+ onKeyUp?: React.KeyboardEventHandler<HTMLDivElement> | undefined;
154
+ onKeyUpCapture?: React.KeyboardEventHandler<HTMLDivElement> | undefined;
155
+ onAbort?: React.ReactEventHandler<HTMLDivElement> | undefined;
156
+ onAbortCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
157
+ onCanPlay?: React.ReactEventHandler<HTMLDivElement> | undefined;
158
+ onCanPlayCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
159
+ onCanPlayThrough?: React.ReactEventHandler<HTMLDivElement> | undefined;
160
+ onCanPlayThroughCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
161
+ onDurationChange?: React.ReactEventHandler<HTMLDivElement> | undefined;
162
+ onDurationChangeCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
163
+ onEmptied?: React.ReactEventHandler<HTMLDivElement> | undefined;
164
+ onEmptiedCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
165
+ onEncrypted?: React.ReactEventHandler<HTMLDivElement> | undefined;
166
+ onEncryptedCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
167
+ onEnded?: React.ReactEventHandler<HTMLDivElement> | undefined;
168
+ onEndedCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
169
+ onLoadedData?: React.ReactEventHandler<HTMLDivElement> | undefined;
170
+ onLoadedDataCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
171
+ onLoadedMetadata?: React.ReactEventHandler<HTMLDivElement> | undefined;
172
+ onLoadedMetadataCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
173
+ onLoadStart?: React.ReactEventHandler<HTMLDivElement> | undefined;
174
+ onLoadStartCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
175
+ onPause?: React.ReactEventHandler<HTMLDivElement> | undefined;
176
+ onPauseCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
177
+ onPlay?: React.ReactEventHandler<HTMLDivElement> | undefined;
178
+ onPlayCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
179
+ onPlaying?: React.ReactEventHandler<HTMLDivElement> | undefined;
180
+ onPlayingCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
181
+ onProgress?: React.ReactEventHandler<HTMLDivElement> | undefined;
182
+ onProgressCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
183
+ onRateChange?: React.ReactEventHandler<HTMLDivElement> | undefined;
184
+ onRateChangeCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
185
+ onResize?: React.ReactEventHandler<HTMLDivElement> | undefined;
186
+ onResizeCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
187
+ onSeeked?: React.ReactEventHandler<HTMLDivElement> | undefined;
188
+ onSeekedCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
189
+ onSeeking?: React.ReactEventHandler<HTMLDivElement> | undefined;
190
+ onSeekingCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
191
+ onStalled?: React.ReactEventHandler<HTMLDivElement> | undefined;
192
+ onStalledCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
193
+ onSuspend?: React.ReactEventHandler<HTMLDivElement> | undefined;
194
+ onSuspendCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
195
+ onTimeUpdate?: React.ReactEventHandler<HTMLDivElement> | undefined;
196
+ onTimeUpdateCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
197
+ onVolumeChange?: React.ReactEventHandler<HTMLDivElement> | undefined;
198
+ onVolumeChangeCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
199
+ onWaiting?: React.ReactEventHandler<HTMLDivElement> | undefined;
200
+ onWaitingCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
201
+ onAuxClick?: React.MouseEventHandler<HTMLDivElement> | undefined;
202
+ onAuxClickCapture?: React.MouseEventHandler<HTMLDivElement> | undefined;
203
+ onClick?: React.MouseEventHandler<HTMLDivElement> | undefined;
204
+ onClickCapture?: React.MouseEventHandler<HTMLDivElement> | undefined;
205
+ onContextMenu?: React.MouseEventHandler<HTMLDivElement> | undefined;
206
+ onContextMenuCapture?: React.MouseEventHandler<HTMLDivElement> | undefined;
207
+ onDoubleClick?: React.MouseEventHandler<HTMLDivElement> | undefined;
208
+ onDoubleClickCapture?: React.MouseEventHandler<HTMLDivElement> | undefined;
209
+ onDrag?: React.DragEventHandler<HTMLDivElement> | undefined;
210
+ onDragCapture?: React.DragEventHandler<HTMLDivElement> | undefined;
211
+ onDragEnd?: React.DragEventHandler<HTMLDivElement> | undefined;
212
+ onDragEndCapture?: React.DragEventHandler<HTMLDivElement> | undefined;
213
+ onDragEnter?: React.DragEventHandler<HTMLDivElement> | undefined;
214
+ onDragEnterCapture?: React.DragEventHandler<HTMLDivElement> | undefined;
215
+ onDragExit?: React.DragEventHandler<HTMLDivElement> | undefined;
216
+ onDragExitCapture?: React.DragEventHandler<HTMLDivElement> | undefined;
217
+ onDragLeave?: React.DragEventHandler<HTMLDivElement> | undefined;
218
+ onDragLeaveCapture?: React.DragEventHandler<HTMLDivElement> | undefined;
219
+ onDragOver?: React.DragEventHandler<HTMLDivElement> | undefined;
220
+ onDragOverCapture?: React.DragEventHandler<HTMLDivElement> | undefined;
221
+ onDragStart?: React.DragEventHandler<HTMLDivElement> | undefined;
222
+ onDragStartCapture?: React.DragEventHandler<HTMLDivElement> | undefined;
223
+ onDrop?: React.DragEventHandler<HTMLDivElement> | undefined;
224
+ onDropCapture?: React.DragEventHandler<HTMLDivElement> | undefined;
225
+ onMouseDown?: React.MouseEventHandler<HTMLDivElement> | undefined;
226
+ onMouseDownCapture?: React.MouseEventHandler<HTMLDivElement> | undefined;
227
+ onMouseEnter?: React.MouseEventHandler<HTMLDivElement> | undefined;
228
+ onMouseLeave?: React.MouseEventHandler<HTMLDivElement> | undefined;
229
+ onMouseMove?: React.MouseEventHandler<HTMLDivElement> | undefined;
230
+ onMouseMoveCapture?: React.MouseEventHandler<HTMLDivElement> | undefined;
231
+ onMouseOut?: React.MouseEventHandler<HTMLDivElement> | undefined;
232
+ onMouseOutCapture?: React.MouseEventHandler<HTMLDivElement> | undefined;
233
+ onMouseOver?: React.MouseEventHandler<HTMLDivElement> | undefined;
234
+ onMouseOverCapture?: React.MouseEventHandler<HTMLDivElement> | undefined;
235
+ onMouseUp?: React.MouseEventHandler<HTMLDivElement> | undefined;
236
+ onMouseUpCapture?: React.MouseEventHandler<HTMLDivElement> | undefined;
237
+ onSelect?: React.ReactEventHandler<HTMLDivElement> | undefined;
238
+ onSelectCapture?: React.ReactEventHandler<HTMLDivElement> | undefined;
239
+ onTouchCancel?: React.TouchEventHandler<HTMLDivElement> | undefined;
240
+ onTouchCancelCapture?: React.TouchEventHandler<HTMLDivElement> | undefined;
241
+ onTouchEnd?: React.TouchEventHandler<HTMLDivElement> | undefined;
242
+ onTouchEndCapture?: React.TouchEventHandler<HTMLDivElement> | undefined;
243
+ onTouchMove?: React.TouchEventHandler<HTMLDivElement> | undefined;
244
+ onTouchMoveCapture?: React.TouchEventHandler<HTMLDivElement> | undefined;
245
+ onTouchStart?: React.TouchEventHandler<HTMLDivElement> | undefined;
246
+ onTouchStartCapture?: React.TouchEventHandler<HTMLDivElement> | undefined;
247
+ onPointerDown?: React.PointerEventHandler<HTMLDivElement> | undefined;
248
+ onPointerDownCapture?: React.PointerEventHandler<HTMLDivElement> | undefined;
249
+ onPointerMove?: React.PointerEventHandler<HTMLDivElement> | undefined;
250
+ onPointerMoveCapture?: React.PointerEventHandler<HTMLDivElement> | undefined;
251
+ onPointerUp?: React.PointerEventHandler<HTMLDivElement> | undefined;
252
+ onPointerUpCapture?: React.PointerEventHandler<HTMLDivElement> | undefined;
253
+ onPointerCancel?: React.PointerEventHandler<HTMLDivElement> | undefined;
254
+ onPointerCancelCapture?: React.PointerEventHandler<HTMLDivElement> | undefined;
255
+ onPointerEnter?: React.PointerEventHandler<HTMLDivElement> | undefined;
256
+ onPointerLeave?: React.PointerEventHandler<HTMLDivElement> | undefined;
257
+ onPointerOver?: React.PointerEventHandler<HTMLDivElement> | undefined;
258
+ onPointerOverCapture?: React.PointerEventHandler<HTMLDivElement> | undefined;
259
+ onPointerOut?: React.PointerEventHandler<HTMLDivElement> | undefined;
260
+ onPointerOutCapture?: React.PointerEventHandler<HTMLDivElement> | undefined;
261
+ onGotPointerCapture?: React.PointerEventHandler<HTMLDivElement> | undefined;
262
+ onGotPointerCaptureCapture?: React.PointerEventHandler<HTMLDivElement> | undefined;
263
+ onLostPointerCapture?: React.PointerEventHandler<HTMLDivElement> | undefined;
264
+ onLostPointerCaptureCapture?: React.PointerEventHandler<HTMLDivElement> | undefined;
265
+ onScroll?: React.UIEventHandler<HTMLDivElement> | undefined;
266
+ onScrollCapture?: React.UIEventHandler<HTMLDivElement> | undefined;
267
+ onWheel?: React.WheelEventHandler<HTMLDivElement> | undefined;
268
+ onWheelCapture?: React.WheelEventHandler<HTMLDivElement> | undefined;
269
+ onAnimationStart?: React.AnimationEventHandler<HTMLDivElement> | undefined;
270
+ onAnimationStartCapture?: React.AnimationEventHandler<HTMLDivElement> | undefined;
271
+ onAnimationEnd?: React.AnimationEventHandler<HTMLDivElement> | undefined;
272
+ onAnimationEndCapture?: React.AnimationEventHandler<HTMLDivElement> | undefined;
273
+ onAnimationIteration?: React.AnimationEventHandler<HTMLDivElement> | undefined;
274
+ onAnimationIterationCapture?: React.AnimationEventHandler<HTMLDivElement> | undefined;
275
+ onTransitionEnd?: React.TransitionEventHandler<HTMLDivElement> | undefined;
276
+ onTransitionEndCapture?: React.TransitionEventHandler<HTMLDivElement> | undefined;
277
+ ref?: React.LegacyRef<HTMLDivElement> | undefined;
278
+ key?: React.Key | null | undefined;
279
+ }>) => import("react/jsx-runtime").JSX.Element)[];
280
+ };
281
+ export default meta;
282
+ export declare const Sizes: {
283
+ name: string;
284
+ render: () => import("react/jsx-runtime").JSX.Element;
285
+ };
286
+ export declare const VerticalScroll: {
287
+ name: string;
288
+ render: () => import("react/jsx-runtime").JSX.Element;
289
+ };
290
+ export declare const HorizontalScroll: {
291
+ name: string;
292
+ render: () => import("react/jsx-runtime").JSX.Element;
293
+ };
294
+ export declare const DoubleScroll: {
295
+ name: string;
296
+ render: () => import("react/jsx-runtime").JSX.Element;
297
+ };
298
+ export declare const WithDropdownMenu: {
299
+ name: string;
300
+ render: () => import("react/jsx-runtime").JSX.Element;
301
+ };
@@ -42,6 +42,7 @@ export * from "./components/Toast/Toaster";
42
42
  export * from "./components/Toast/useToast";
43
43
  export * from "./components/Tree";
44
44
  export * from "./components/FocusedScrollView/FocusedScrollView";
45
+ export * from "./components/ScrollArea/ScrollArea";
45
46
  export * from "./components/RadioGroup/RadioGroup";
46
47
  export * from "./components/Form";
47
48
  export * from "./patterns/confirm-dialog/ConfirmDialog";
package/dist/index.d.ts CHANGED
@@ -17,7 +17,7 @@ import * as TooltipPrimitive from '@radix-ui/react-tooltip';
17
17
  import * as ToastPrimitives from '@radix-ui/react-toast';
18
18
  import { ToastProviderProps } from '@radix-ui/react-toast';
19
19
  import * as RadioGroupPrimitive from '@radix-ui/react-radio-group';
20
- import { FieldValues, UseFormReturn, DefaultValues, SubmitHandler, SubmitErrorHandler, Resolver, Mode, FieldPath, RegisterOptions, FieldPathValue } from 'react-hook-form';
20
+ import { FieldValues, UseFormReturn, DefaultValues, SubmitHandler, SubmitErrorHandler, FormState, Resolver, Mode, FieldPath, RegisterOptions, FieldPathValue } from 'react-hook-form';
21
21
  import * as yup from 'yup';
22
22
  import Button$1 from '@/components/Button/Button';
23
23
  import { ClassValue } from 'clsx';
@@ -1166,6 +1166,44 @@ type FocusedScrollViewProps = {
1166
1166
  };
1167
1167
  declare const FocusedScrollView: React__default.FC<FocusedScrollViewProps>;
1168
1168
 
1169
+ type ScrollbarSize = "m" | "s" | "xs";
1170
+ interface ScrollAreaProps extends React.HTMLAttributes<HTMLDivElement> {
1171
+ /**
1172
+ * Scrollbar thickness.
1173
+ * - `m` — 12 px (shows track border)
1174
+ * - `s` — 6 px (default, shows no track border)
1175
+ * - `xs` — 2 px (shows no track border)
1176
+ */
1177
+ scrollbarSize?: ScrollbarSize;
1178
+ /**
1179
+ * Direction(s) the area can scroll.
1180
+ * Defaults to `"vertical"`.
1181
+ */
1182
+ direction?: "vertical" | "horizontal" | "both";
1183
+ }
1184
+ /**
1185
+ * ScrollArea
1186
+ *
1187
+ * A thin wrapper that applies the design-system scrollbar style to any
1188
+ * scrollable container. Use `scrollbarSize` to pick the Figma size variant
1189
+ * and `direction` to control which axis scrolls.
1190
+ *
1191
+ * **Client usage:**
1192
+ * ```tsx
1193
+ * <ScrollArea className="max-h-[270px]">
1194
+ * {items.map(item => <div key={item.id}>{item.label}</div>)}
1195
+ * </ScrollArea>
1196
+ * ```
1197
+ *
1198
+ * For a double-scroll layout (two independent sections inside one dropdown),
1199
+ * wrap each section individually:
1200
+ * ```tsx
1201
+ * <ScrollArea className="max-h-[160px]">...section A items...</ScrollArea>
1202
+ * <ScrollArea className="max-h-[160px]">...section B items...</ScrollArea>
1203
+ * ```
1204
+ */
1205
+ declare const ScrollArea: React.ForwardRefExoticComponent<ScrollAreaProps & React.RefAttributes<HTMLDivElement>>;
1206
+
1169
1207
  declare const RadioGroup: React.ForwardRefExoticComponent<Omit<RadioGroupPrimitive.RadioGroupProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
1170
1208
  declare const RadioGroupItem: React.ForwardRefExoticComponent<Omit<RadioGroupPrimitive.RadioGroupItemProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
1171
1209
 
@@ -1184,6 +1222,7 @@ type FormProps<TFieldValues extends FieldValues> = Omit<FormHTMLAttributes<HTMLF
1184
1222
  controllerRef?: React__default.MutableRefObject<FormController<TFieldValues> | null>;
1185
1223
  onSubmit: SubmitHandler<TFieldValues>;
1186
1224
  onInvalidSubmit?: SubmitErrorHandler<TFieldValues>;
1225
+ onFormStateChange?: (formState: FormState<TFieldValues>) => void;
1187
1226
  resolver?: Resolver<TFieldValues>;
1188
1227
  validationSchema?: yup.ObjectSchema<any>;
1189
1228
  mode?: Mode;
@@ -1789,4 +1828,4 @@ declare const srgbToHex: (color: string) => string;
1789
1828
  */
1790
1829
  declare function getLucideIconNames(): Promise<string[]>;
1791
1830
 
1792
- export { ActionButton, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, Avatar, AvatarGroup, type AvatarGroupProps, type AvatarProps, Button, type ButtonProps, Calendar, Checkbox, Collapsible, ConfirmDialog, type ConfirmDialogProps, type ControlledFormFactoryOptions, type CustomSliderProps, DataTable, type DataTableProps, DatePicker, Dialog, DialogBody, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Dropdown, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, type DropdownProps, Field, FieldMessage, type FieldMessageProps, type FieldProps, FocusedScrollView, Footer, type FooterProps, type FooterVariant, Form, type FormController, FormDialog, type FormDialogAction, type FormDialogProps, type FormProps, Icon, Input, InputFilter, type InputFilterProps, type InputProps, Label, Loading, type MaskRule, MaskedTextInput, type MaskedTextInputProps, Menu, MenuItem, type MenuItemType, MenuLabel, type MenuOption, type MenuProps, MenuSeparator, Navbar, type NavbarProps, type NavbarVariant, NumberInput, type NumberInputProps, type OptionLike, type Options$1 as Options, OtpInput, OtpInputGroup, type OtpInputGroupProps, type OtpInputProps, PasswordInput, type PasswordInputProps, Popover, PopoverContent, PopoverTrigger, ProgressBar, RadioGroup, RadioGroupItem, Search, type SearchProps, Slider, type SliderProps, Switch, THEME_COLOR_KEYS, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, Text, TextArea, type TextAreaProps, TextInput, type ThemeColorKey, Toast$1 as Toast, ToastAction, type ToastActionElement, ToastClose, ToastDescription, type ToastProps, ToastProvider, ToastTitle, ToastViewport, Toaster, Tooltip, TooltipArrow, TooltipContent, TooltipProvider, TooltipSimple, TooltipTrigger, Tree, type TreeData, TreeItem, type TreeItemProps, type TreeProps, type UseControlledFormOptions, type UseOptionBridgeOptions, ValidationHintList, type ValidationHintListProps, type ValidationHintMode, type ValidationHintRule, type ValidationHintState, cn, createControlledForm, createYupResolver, getEndDateOfDay, getLucideIconNames, getStartDateOfDay, getStartEndTimestampOfDay, getThemeColor, getThemeColors, getTimestampUTC, reducer, resloveTimestamp, srgbToHex, toast, useControlledForm, useOptionBridge, usePrevious, useToast };
1831
+ export { ActionButton, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, Avatar, AvatarGroup, type AvatarGroupProps, type AvatarProps, Button, type ButtonProps, Calendar, Checkbox, Collapsible, ConfirmDialog, type ConfirmDialogProps, type ControlledFormFactoryOptions, type CustomSliderProps, DataTable, type DataTableProps, DatePicker, Dialog, DialogBody, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Dropdown, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, type DropdownProps, Field, FieldMessage, type FieldMessageProps, type FieldProps, FocusedScrollView, Footer, type FooterProps, type FooterVariant, Form, type FormController, FormDialog, type FormDialogAction, type FormDialogProps, type FormProps, Icon, Input, InputFilter, type InputFilterProps, type InputProps, Label, Loading, type MaskRule, MaskedTextInput, type MaskedTextInputProps, Menu, MenuItem, type MenuItemType, MenuLabel, type MenuOption, type MenuProps, MenuSeparator, Navbar, type NavbarProps, type NavbarVariant, NumberInput, type NumberInputProps, type OptionLike, type Options$1 as Options, OtpInput, OtpInputGroup, type OtpInputGroupProps, type OtpInputProps, PasswordInput, type PasswordInputProps, Popover, PopoverContent, PopoverTrigger, ProgressBar, RadioGroup, RadioGroupItem, ScrollArea, type ScrollAreaProps, type ScrollbarSize, Search, type SearchProps, Slider, type SliderProps, Switch, THEME_COLOR_KEYS, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, Text, TextArea, type TextAreaProps, TextInput, type ThemeColorKey, Toast$1 as Toast, ToastAction, type ToastActionElement, ToastClose, ToastDescription, type ToastProps, ToastProvider, ToastTitle, ToastViewport, Toaster, Tooltip, TooltipArrow, TooltipContent, TooltipProvider, TooltipSimple, TooltipTrigger, Tree, type TreeData, TreeItem, type TreeItemProps, type TreeProps, type UseControlledFormOptions, type UseOptionBridgeOptions, ValidationHintList, type ValidationHintListProps, type ValidationHintMode, type ValidationHintRule, type ValidationHintState, cn, createControlledForm, createYupResolver, getEndDateOfDay, getLucideIconNames, getStartDateOfDay, getStartEndTimestampOfDay, getThemeColor, getThemeColors, getTimestampUTC, reducer, resloveTimestamp, srgbToHex, toast, useControlledForm, useOptionBridge, usePrevious, useToast };
package/dist/index.js CHANGED
@@ -44,6 +44,7 @@ export * from "./components/Toast/Toaster";
44
44
  export * from "./components/Toast/useToast";
45
45
  export * from "./components/Tree";
46
46
  export * from "./components/FocusedScrollView/FocusedScrollView";
47
+ export * from "./components/ScrollArea/ScrollArea";
47
48
  export * from "./components/RadioGroup/RadioGroup";
48
49
  export * from "./components/Form";
49
50
  // Patterns