@rovula/ui 0.1.20 → 0.1.22

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 (99) hide show
  1. package/dist/cjs/bundle.css +316 -43
  2. package/dist/cjs/bundle.js +675 -675
  3. package/dist/cjs/bundle.js.map +1 -1
  4. package/dist/cjs/types/components/Badge/Badge.d.ts +40 -0
  5. package/dist/cjs/types/components/Badge/Badge.stories.d.ts +295 -0
  6. package/dist/cjs/types/components/Badge/Badge.styles.d.ts +7 -0
  7. package/dist/cjs/types/components/Badge/index.d.ts +2 -0
  8. package/dist/cjs/types/components/Dropdown/Dropdown.d.ts +4 -8
  9. package/dist/cjs/types/components/Dropdown/Dropdown.stories.d.ts +1 -6
  10. package/dist/cjs/types/components/DropdownMenu/DropdownMenu.d.ts +5 -1
  11. package/dist/cjs/types/components/DropdownMenu/DropdownMenu.stories.d.ts +45 -30
  12. package/dist/cjs/types/components/Form/Form.d.ts +2 -1
  13. package/dist/cjs/types/components/Form/Form.stories.d.ts +4 -0
  14. package/dist/cjs/types/components/ScrollArea/ScrollArea.d.ts +38 -0
  15. package/dist/cjs/types/components/ScrollArea/ScrollArea.stories.d.ts +301 -0
  16. package/dist/cjs/types/index.d.ts +4 -1
  17. package/dist/cjs/types/patterns/menu/Menu.d.ts +70 -0
  18. package/dist/cjs/types/{components/Menu → patterns/menu}/Menu.stories.d.ts +17 -10
  19. package/dist/cjs/types/utils/mergeRefs.d.ts +20 -0
  20. package/dist/components/Avatar/Avatar.styles.js +2 -2
  21. package/dist/components/Badge/Badge.js +36 -0
  22. package/dist/components/Badge/Badge.stories.js +51 -0
  23. package/dist/components/Badge/Badge.styles.js +62 -0
  24. package/dist/components/Badge/index.js +2 -0
  25. package/dist/components/Dropdown/Dropdown.js +54 -163
  26. package/dist/components/Dropdown/Dropdown.stories.js +29 -0
  27. package/dist/components/DropdownMenu/DropdownMenu.js +24 -13
  28. package/dist/components/DropdownMenu/DropdownMenu.stories.js +120 -88
  29. package/dist/components/Form/Form.js +11 -4
  30. package/dist/components/Form/Form.stories.js +27 -0
  31. package/dist/components/ScrollArea/ScrollArea.js +50 -0
  32. package/dist/components/ScrollArea/ScrollArea.stories.js +56 -0
  33. package/dist/components/TextInput/TextInput.js +6 -3
  34. package/dist/esm/bundle.css +316 -43
  35. package/dist/esm/bundle.js +1545 -1545
  36. package/dist/esm/bundle.js.map +1 -1
  37. package/dist/esm/types/components/Badge/Badge.d.ts +40 -0
  38. package/dist/esm/types/components/Badge/Badge.stories.d.ts +295 -0
  39. package/dist/esm/types/components/Badge/Badge.styles.d.ts +7 -0
  40. package/dist/esm/types/components/Badge/index.d.ts +2 -0
  41. package/dist/esm/types/components/Dropdown/Dropdown.d.ts +4 -8
  42. package/dist/esm/types/components/Dropdown/Dropdown.stories.d.ts +1 -6
  43. package/dist/esm/types/components/DropdownMenu/DropdownMenu.d.ts +5 -1
  44. package/dist/esm/types/components/DropdownMenu/DropdownMenu.stories.d.ts +45 -30
  45. package/dist/esm/types/components/Form/Form.d.ts +2 -1
  46. package/dist/esm/types/components/Form/Form.stories.d.ts +4 -0
  47. package/dist/esm/types/components/ScrollArea/ScrollArea.d.ts +38 -0
  48. package/dist/esm/types/components/ScrollArea/ScrollArea.stories.d.ts +301 -0
  49. package/dist/esm/types/index.d.ts +4 -1
  50. package/dist/esm/types/patterns/menu/Menu.d.ts +70 -0
  51. package/dist/esm/types/{components/Menu → patterns/menu}/Menu.stories.d.ts +17 -10
  52. package/dist/esm/types/utils/mergeRefs.d.ts +20 -0
  53. package/dist/index.d.ts +156 -74
  54. package/dist/index.js +3 -1
  55. package/dist/patterns/menu/Menu.js +95 -0
  56. package/dist/patterns/menu/Menu.stories.js +611 -0
  57. package/dist/src/theme/global.css +485 -57
  58. package/dist/utils/mergeRefs.js +42 -0
  59. package/package.json +1 -1
  60. package/src/components/Avatar/Avatar.styles.ts +2 -2
  61. package/src/components/Badge/Badge.stories.tsx +128 -0
  62. package/src/components/Badge/Badge.styles.ts +70 -0
  63. package/src/components/Badge/Badge.tsx +103 -0
  64. package/src/components/Badge/index.ts +3 -0
  65. package/src/components/Dropdown/Dropdown.stories.tsx +170 -1
  66. package/src/components/Dropdown/Dropdown.tsx +186 -276
  67. package/src/components/DropdownMenu/DropdownMenu.stories.tsx +1375 -253
  68. package/src/components/DropdownMenu/DropdownMenu.tsx +118 -55
  69. package/src/components/Form/Form.stories.tsx +70 -0
  70. package/src/components/Form/Form.tsx +23 -0
  71. package/src/components/ScrollArea/ScrollArea.stories.tsx +229 -0
  72. package/src/components/ScrollArea/ScrollArea.tsx +72 -0
  73. package/src/components/TextInput/TextInput.tsx +6 -3
  74. package/src/index.ts +4 -1
  75. package/src/patterns/menu/Menu.stories.tsx +1100 -0
  76. package/src/patterns/menu/Menu.tsx +282 -0
  77. package/src/theme/global.css +84 -11
  78. package/src/theme/themes/xspector/baseline.css +1 -1
  79. package/src/theme/themes/xspector/components/scrollbar.css +12 -0
  80. package/src/theme/tokens/baseline.css +3 -1
  81. package/src/theme/tokens/components/badge.css +54 -0
  82. package/src/theme/tokens/components/dropdown-menu.css +16 -5
  83. package/src/theme/tokens/components/scrollbar.css +18 -0
  84. package/src/utils/mergeRefs.ts +46 -0
  85. package/dist/cjs/types/components/Menu/Menu.d.ts +0 -65
  86. package/dist/cjs/types/components/Menu/helpers.d.ts +0 -19
  87. package/dist/cjs/types/components/Menu/index.d.ts +0 -4
  88. package/dist/components/Menu/Menu.js +0 -64
  89. package/dist/components/Menu/Menu.stories.js +0 -406
  90. package/dist/components/Menu/helpers.js +0 -28
  91. package/dist/components/Menu/index.js +0 -3
  92. package/dist/esm/types/components/Menu/Menu.d.ts +0 -65
  93. package/dist/esm/types/components/Menu/helpers.d.ts +0 -19
  94. package/dist/esm/types/components/Menu/index.d.ts +0 -4
  95. package/src/components/Menu/Menu.stories.tsx +0 -586
  96. package/src/components/Menu/Menu.tsx +0 -235
  97. package/src/components/Menu/helpers.ts +0 -45
  98. package/src/components/Menu/index.ts +0 -7
  99. package/src/theme/themes/xspector/components/dropdown-menu.css +0 -28
@@ -0,0 +1,72 @@
1
+ import * as React from "react";
2
+ import { cn } from "@/utils/cn";
3
+
4
+ export type ScrollbarSize = "m" | "s" | "xs";
5
+
6
+ export interface ScrollAreaProps extends React.HTMLAttributes<HTMLDivElement> {
7
+ /**
8
+ * Scrollbar thickness.
9
+ * - `m` — 12 px (shows track border)
10
+ * - `s` — 6 px (default, shows no track border)
11
+ * - `xs` — 2 px (shows no track border)
12
+ */
13
+ scrollbarSize?: ScrollbarSize;
14
+ /**
15
+ * Direction(s) the area can scroll.
16
+ * Defaults to `"vertical"`.
17
+ */
18
+ direction?: "vertical" | "horizontal" | "both";
19
+ }
20
+
21
+ const sizeClass: Record<ScrollbarSize, string> = {
22
+ m: "ui-scrollbar ui-scrollbar-m",
23
+ s: "ui-scrollbar ui-scrollbar-s",
24
+ xs: "ui-scrollbar ui-scrollbar-xs",
25
+ };
26
+
27
+ const directionClass: Record<NonNullable<ScrollAreaProps["direction"]>, string> = {
28
+ vertical: "overflow-y-auto overflow-x-hidden",
29
+ horizontal: "overflow-x-auto overflow-y-hidden",
30
+ both: "overflow-auto",
31
+ };
32
+
33
+ /**
34
+ * ScrollArea
35
+ *
36
+ * A thin wrapper that applies the design-system scrollbar style to any
37
+ * scrollable container. Use `scrollbarSize` to pick the Figma size variant
38
+ * and `direction` to control which axis scrolls.
39
+ *
40
+ * **Client usage:**
41
+ * ```tsx
42
+ * <ScrollArea className="max-h-[270px]">
43
+ * {items.map(item => <div key={item.id}>{item.label}</div>)}
44
+ * </ScrollArea>
45
+ * ```
46
+ *
47
+ * For a double-scroll layout (two independent sections inside one dropdown),
48
+ * wrap each section individually:
49
+ * ```tsx
50
+ * <ScrollArea className="max-h-[160px]">...section A items...</ScrollArea>
51
+ * <ScrollArea className="max-h-[160px]">...section B items...</ScrollArea>
52
+ * ```
53
+ */
54
+ export const ScrollArea = React.forwardRef<HTMLDivElement, ScrollAreaProps>(
55
+ (
56
+ { className, scrollbarSize = "s", direction = "vertical", children, ...props },
57
+ ref
58
+ ) => (
59
+ <div
60
+ ref={ref}
61
+ className={cn(
62
+ directionClass[direction],
63
+ sizeClass[scrollbarSize],
64
+ className
65
+ )}
66
+ {...props}
67
+ >
68
+ {children}
69
+ </div>
70
+ )
71
+ );
72
+ ScrollArea.displayName = "ScrollArea";
@@ -2,13 +2,13 @@ import React, {
2
2
  ReactNode,
3
3
  forwardRef,
4
4
  useCallback,
5
- useImperativeHandle,
6
5
  useMemo,
7
6
  useRef,
8
7
  FocusEvent,
9
8
  KeyboardEvent,
10
9
  ChangeEvent,
11
10
  } from "react";
11
+ import { useStableMergedRef } from "@/utils/mergeRefs";
12
12
  import {
13
13
  helperTextVariant,
14
14
  iconActionVariant,
@@ -111,6 +111,10 @@ export const TextInput = forwardRef<HTMLInputElement, InputProps>(
111
111
  ) => {
112
112
  const inputRef = useRef<HTMLInputElement>(null);
113
113
  const _id = id || `${type}-${label}-input`;
114
+
115
+ // Stable merged ref — identity never changes so Headless UI (or any library
116
+ // that watches refs) won't trigger detach/re-attach loops.
117
+ const stableRef = useStableMergedRef(ref, inputRef);
114
118
  const hasLeftSectionIcon = !!startIcon || !!renderStartIcon;
115
119
  const hasRightSectionIcon = !!endIcon || !!renderEndIcon;
116
120
  const feedbackStatus =
@@ -183,7 +187,6 @@ export const TextInput = forwardRef<HTMLInputElement, InputProps>(
183
187
  position: "end",
184
188
  });
185
189
 
186
- useImperativeHandle(ref, () => inputRef?.current as HTMLInputElement);
187
190
 
188
191
  const handleChange = useCallback(
189
192
  (e: ChangeEvent<HTMLInputElement>) => {
@@ -382,7 +385,7 @@ export const TextInput = forwardRef<HTMLInputElement, InputProps>(
382
385
  <input
383
386
  {...props}
384
387
  placeholder=" "
385
- ref={inputRef}
388
+ ref={stableRef}
386
389
  type={type}
387
390
  id={_id}
388
391
  disabled={disabled}
package/src/index.ts CHANGED
@@ -19,6 +19,7 @@ export { Navbar } from "./components/Navbar";
19
19
  export { Footer } from "./components/Footer";
20
20
  export { default as ActionButton } from "./components/ActionButton/ActionButton";
21
21
  export { Avatar, AvatarGroup } from "./components/Avatar";
22
+ export { Badge, SeverityBadge } from "./components/Badge";
22
23
  export { Collapsible } from "./components/Collapsible";
23
24
  export { Calendar } from "./components/Calendar";
24
25
  export { default as DatePicker } from "./components/DatePicker/DatePicker";
@@ -41,7 +42,6 @@ export * from "./components/InputFilter/InputFilter";
41
42
  export * from "./components/Slider/Slider";
42
43
  export * from "./components/Switch/Switch";
43
44
  export * from "./components/DropdownMenu/DropdownMenu";
44
- export * from "./components/Menu/Menu";
45
45
  export * from "./components/Tooltip/Tooltip";
46
46
  export * from "./components/Tooltip/TooltipSimple";
47
47
  export * from "./components/Toast/Toast";
@@ -49,12 +49,14 @@ export * from "./components/Toast/Toaster";
49
49
  export * from "./components/Toast/useToast";
50
50
  export * from "./components/Tree";
51
51
  export * from "./components/FocusedScrollView/FocusedScrollView";
52
+ export * from "./components/ScrollArea/ScrollArea";
52
53
  export * from "./components/RadioGroup/RadioGroup";
53
54
  export * from "./components/Form";
54
55
 
55
56
  // Patterns
56
57
  export * from "./patterns/confirm-dialog/ConfirmDialog";
57
58
  export * from "./patterns/form-dialog/FormDialog";
59
+ export * from "./patterns/menu/Menu";
58
60
 
59
61
  // Export component types
60
62
  export type { ButtonProps } from "./components/Button/Button";
@@ -73,6 +75,7 @@ export type { NavbarProps, NavbarVariant } from "./components/Navbar/Navbar";
73
75
  export type { FooterProps, FooterVariant } from "./components/Footer/Footer";
74
76
  export type { AvatarProps } from "./components/Avatar/Avatar";
75
77
  export type { AvatarGroupProps } from "./components/Avatar/AvatarGroup";
78
+ export type { BadgeProps, BadgeColor, SeverityBadgeProps, SeverityLevel } from "./components/Badge/Badge";
76
79
 
77
80
  // UTILS
78
81
  export {