@music-vine/cadence 2.6.2 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (213) hide show
  1. package/README.md +5 -44
  2. package/dist/components/accordion.d.ts +71 -0
  3. package/dist/components/accordion.d.ts.map +1 -0
  4. package/dist/components/accordion.js +2 -2
  5. package/dist/components/accordion.js.map +1 -1
  6. package/dist/components/badge.d.ts +62 -0
  7. package/dist/components/badge.d.ts.map +1 -0
  8. package/dist/components/badge.js +1 -1
  9. package/dist/components/badge.js.map +1 -1
  10. package/dist/components/breadcrumb.d.ts +42 -0
  11. package/dist/components/breadcrumb.d.ts.map +1 -0
  12. package/dist/components/button.d.ts +117 -0
  13. package/dist/components/button.d.ts.map +1 -0
  14. package/dist/components/button.js +3 -3
  15. package/dist/components/button.js.map +1 -1
  16. package/dist/components/card.d.ts +56 -0
  17. package/dist/components/card.d.ts.map +1 -0
  18. package/dist/components/card.js.map +1 -1
  19. package/dist/components/carousel-dots.d.ts +17 -0
  20. package/dist/components/carousel-dots.d.ts.map +1 -0
  21. package/dist/components/carousel-dots.js +1 -1
  22. package/dist/components/carousel-dots.js.map +1 -1
  23. package/dist/components/carousel.d.ts +99 -0
  24. package/dist/components/carousel.d.ts.map +1 -0
  25. package/dist/components/carousel.js +2 -2
  26. package/dist/components/carousel.js.map +1 -1
  27. package/dist/components/checkbox.d.ts +34 -0
  28. package/dist/components/checkbox.d.ts.map +1 -0
  29. package/dist/components/checkbox.js +1 -1
  30. package/dist/components/checkbox.js.map +1 -1
  31. package/dist/components/context-menu.d.ts +126 -0
  32. package/dist/components/context-menu.d.ts.map +1 -0
  33. package/dist/components/context-menu.js +6 -6
  34. package/dist/components/context-menu.js.map +1 -1
  35. package/dist/components/dialog.d.ts +85 -0
  36. package/dist/components/dialog.d.ts.map +1 -0
  37. package/dist/components/dialog.js +1 -1
  38. package/dist/components/dialog.js.map +1 -1
  39. package/dist/components/drawer.d.ts +90 -0
  40. package/dist/components/drawer.d.ts.map +1 -0
  41. package/dist/components/drawer.js.map +1 -1
  42. package/dist/components/index.d.ts +36 -0
  43. package/dist/components/index.d.ts.map +1 -0
  44. package/dist/components/input.d.ts +69 -0
  45. package/dist/components/input.d.ts.map +1 -0
  46. package/dist/components/input.js +61 -57
  47. package/dist/components/input.js.map +2 -2
  48. package/dist/components/label.d.ts +36 -0
  49. package/dist/components/label.d.ts.map +1 -0
  50. package/dist/components/popover.d.ts +61 -0
  51. package/dist/components/popover.d.ts.map +1 -0
  52. package/dist/components/popover.js +1 -1
  53. package/dist/components/popover.js.map +1 -1
  54. package/dist/components/price-tag.d.ts +31 -0
  55. package/dist/components/price-tag.d.ts.map +1 -0
  56. package/dist/components/price-tag.js.map +1 -1
  57. package/dist/components/radio-group.d.ts +15 -0
  58. package/dist/components/radio-group.d.ts.map +1 -0
  59. package/dist/components/radio-group.js +1 -1
  60. package/dist/components/radio-group.js.map +1 -1
  61. package/dist/components/scroll-area.d.ts +33 -0
  62. package/dist/components/scroll-area.d.ts.map +1 -0
  63. package/dist/components/scroll-area.js.map +1 -1
  64. package/dist/components/scroll-drum.d.ts +96 -0
  65. package/dist/components/scroll-drum.d.ts.map +1 -0
  66. package/dist/components/scroll-drum.js +63 -34
  67. package/dist/components/scroll-drum.js.map +2 -2
  68. package/dist/components/select.d.ts +49 -0
  69. package/dist/components/select.d.ts.map +1 -0
  70. package/dist/components/select.js +1 -1
  71. package/dist/components/select.js.map +1 -1
  72. package/dist/components/separator.d.ts +35 -0
  73. package/dist/components/separator.d.ts.map +1 -0
  74. package/dist/components/skeleton.d.ts +44 -0
  75. package/dist/components/skeleton.d.ts.map +1 -0
  76. package/dist/components/slider.d.ts +21 -0
  77. package/dist/components/slider.d.ts.map +1 -0
  78. package/dist/components/slider.js +1 -1
  79. package/dist/components/slider.js.map +1 -1
  80. package/dist/components/stacking-card.d.ts +89 -0
  81. package/dist/components/stacking-card.d.ts.map +1 -0
  82. package/dist/components/stacking-card.js +3 -3
  83. package/dist/components/stacking-card.js.map +2 -2
  84. package/dist/components/tabs.d.ts +46 -0
  85. package/dist/components/tabs.d.ts.map +1 -0
  86. package/dist/components/tabs.js +2 -2
  87. package/dist/components/tabs.js.map +1 -1
  88. package/dist/components/textarea.d.ts +34 -0
  89. package/dist/components/textarea.d.ts.map +1 -0
  90. package/dist/components/toast.d.ts +67 -0
  91. package/dist/components/toast.d.ts.map +1 -0
  92. package/dist/components/toast.js +2 -2
  93. package/dist/components/toast.js.map +2 -2
  94. package/dist/components/toggle-button.d.ts +54 -0
  95. package/dist/components/toggle-button.d.ts.map +1 -0
  96. package/dist/components/toggle-button.js.map +1 -1
  97. package/dist/components/typography/heading.d.ts +20 -0
  98. package/dist/components/typography/heading.d.ts.map +1 -0
  99. package/dist/components/typography/heading.js.map +1 -1
  100. package/dist/components/typography/index.d.ts +5 -0
  101. package/dist/components/typography/index.d.ts.map +1 -0
  102. package/dist/components/typography/list.d.ts +23 -0
  103. package/dist/components/typography/list.d.ts.map +1 -0
  104. package/dist/components/typography/list.js +1 -1
  105. package/dist/components/typography/list.js.map +2 -2
  106. package/dist/components/typography/prose.d.ts +8 -0
  107. package/dist/components/typography/prose.d.ts.map +1 -0
  108. package/dist/components/typography/text.d.ts +13 -0
  109. package/dist/components/typography/text.d.ts.map +1 -0
  110. package/dist/icons/custom/boards-indicator.d.ts +6 -0
  111. package/dist/icons/custom/boards-indicator.d.ts.map +1 -0
  112. package/dist/icons/custom/boards-indicator.js +7 -2
  113. package/dist/icons/custom/boards-indicator.js.map +2 -2
  114. package/dist/icons/custom/download-history.d.ts +5 -0
  115. package/dist/icons/custom/download-history.d.ts.map +1 -0
  116. package/dist/icons/custom/download-history.js +3 -4
  117. package/dist/icons/custom/download-history.js.map +2 -2
  118. package/dist/icons/custom/exclamation-mark-in-octagon.d.ts +5 -0
  119. package/dist/icons/custom/exclamation-mark-in-octagon.d.ts.map +1 -0
  120. package/dist/icons/custom/exclamation-mark-in-octagon.js +6 -3
  121. package/dist/icons/custom/exclamation-mark-in-octagon.js.map +2 -2
  122. package/dist/icons/custom/horizontal-orientation.d.ts +5 -0
  123. package/dist/icons/custom/horizontal-orientation.d.ts.map +1 -0
  124. package/dist/icons/custom/horizontal-orientation.js +4 -3
  125. package/dist/icons/custom/horizontal-orientation.js.map +2 -2
  126. package/dist/icons/custom/lightning-bolt.d.ts +5 -0
  127. package/dist/icons/custom/lightning-bolt.d.ts.map +1 -0
  128. package/dist/icons/custom/lightning-bolt.js +24 -27
  129. package/dist/icons/custom/lightning-bolt.js.map +2 -2
  130. package/dist/icons/custom/music-file.d.ts +5 -0
  131. package/dist/icons/custom/music-file.d.ts.map +1 -0
  132. package/dist/icons/custom/music-file.js +17 -0
  133. package/dist/icons/custom/music-file.js.map +7 -0
  134. package/dist/icons/custom/pin.d.ts +5 -0
  135. package/dist/icons/custom/pin.d.ts.map +1 -0
  136. package/dist/icons/custom/pin.js +4 -1
  137. package/dist/icons/custom/pin.js.map +2 -2
  138. package/dist/icons/custom/premium-star.d.ts +11 -0
  139. package/dist/icons/custom/premium-star.d.ts.map +1 -0
  140. package/dist/icons/custom/premium-star.js +3 -1
  141. package/dist/icons/custom/premium-star.js.map +2 -2
  142. package/dist/icons/custom/social/discord.d.ts +5 -0
  143. package/dist/icons/custom/social/discord.d.ts.map +1 -0
  144. package/dist/icons/custom/social/discord.js +3 -4
  145. package/dist/icons/custom/social/discord.js.map +2 -2
  146. package/dist/icons/custom/social/index.d.ts +4 -0
  147. package/dist/icons/custom/social/index.d.ts.map +1 -0
  148. package/dist/icons/custom/social/tiktok.d.ts +5 -0
  149. package/dist/icons/custom/social/tiktok.d.ts.map +1 -0
  150. package/dist/icons/custom/social/tiktok.js +3 -4
  151. package/dist/icons/custom/social/tiktok.js.map +2 -2
  152. package/dist/icons/custom/social/twitter-x.d.ts +5 -0
  153. package/dist/icons/custom/social/twitter-x.d.ts.map +1 -0
  154. package/dist/icons/custom/social/twitter-x.js +19 -22
  155. package/dist/icons/custom/social/twitter-x.js.map +2 -2
  156. package/dist/icons/custom/square-aspect-ratio.d.ts +5 -0
  157. package/dist/icons/custom/square-aspect-ratio.d.ts.map +1 -0
  158. package/dist/icons/custom/square-aspect-ratio.js +4 -1
  159. package/dist/icons/custom/square-aspect-ratio.js.map +2 -2
  160. package/dist/icons/custom/tick-in-circle.d.ts +8 -0
  161. package/dist/icons/custom/tick-in-circle.d.ts.map +1 -0
  162. package/dist/icons/custom/tick-in-circle.js +25 -25
  163. package/dist/icons/custom/tick-in-circle.js.map +2 -2
  164. package/dist/icons/custom/tick-small.d.ts +5 -0
  165. package/dist/icons/custom/tick-small.d.ts.map +1 -0
  166. package/dist/icons/custom/tick-small.js +8 -10
  167. package/dist/icons/custom/tick-small.js.map +2 -2
  168. package/dist/icons/custom/tick.d.ts +5 -0
  169. package/dist/icons/custom/tick.d.ts.map +1 -0
  170. package/dist/icons/custom/tick.js +2 -2
  171. package/dist/icons/custom/tick.js.map +2 -2
  172. package/dist/icons/custom/types.d.ts +3 -0
  173. package/dist/icons/custom/types.d.ts.map +1 -0
  174. package/dist/icons/custom/types.js +1 -0
  175. package/dist/icons/custom/types.js.map +7 -0
  176. package/dist/icons/custom/ultra-wide-aspect-ratio.d.ts +5 -0
  177. package/dist/icons/custom/ultra-wide-aspect-ratio.d.ts.map +1 -0
  178. package/dist/icons/custom/ultra-wide-aspect-ratio.js +4 -1
  179. package/dist/icons/custom/ultra-wide-aspect-ratio.js.map +2 -2
  180. package/dist/icons/custom/uppbeat-credit.d.ts +5 -0
  181. package/dist/icons/custom/uppbeat-credit.d.ts.map +1 -0
  182. package/dist/icons/custom/uppbeat-credit.js +2 -4
  183. package/dist/icons/custom/uppbeat-credit.js.map +2 -2
  184. package/dist/icons/custom/vertical-orientation.d.ts +5 -0
  185. package/dist/icons/custom/vertical-orientation.d.ts.map +1 -0
  186. package/dist/icons/custom/vertical-orientation.js +4 -1
  187. package/dist/icons/custom/vertical-orientation.js.map +2 -2
  188. package/dist/icons/custom/view-credit-note.d.ts +5 -0
  189. package/dist/icons/custom/view-credit-note.d.ts.map +1 -0
  190. package/dist/icons/custom/view-credit-note.js +4 -1
  191. package/dist/icons/custom/view-credit-note.js.map +2 -2
  192. package/dist/icons/index.d.ts +28 -0
  193. package/dist/icons/index.d.ts.map +1 -0
  194. package/dist/icons/index.js +4 -5
  195. package/dist/icons/index.js.map +2 -2
  196. package/dist/index.d.ts +19 -0
  197. package/dist/index.d.ts.map +1 -0
  198. package/dist/lib/utils.d.ts +12 -0
  199. package/dist/lib/utils.d.ts.map +1 -0
  200. package/dist/lib/utils.js +7 -17
  201. package/dist/lib/utils.js.map +2 -2
  202. package/dist/styles/index.css +16 -3
  203. package/dist/styles/storybook.css +2 -2
  204. package/dist/test/setup.d.ts +2 -0
  205. package/dist/test/setup.d.ts.map +1 -0
  206. package/dist/theme/index.d.ts +142 -0
  207. package/dist/theme/index.d.ts.map +1 -0
  208. package/dist/theme/index.js +1 -1
  209. package/dist/theme/index.js.map +2 -2
  210. package/package.json +4 -9
  211. package/{tailwind.config.v4.css → tailwind.config.css} +35 -14
  212. package/dist/styles/index.v4.css +0 -49
  213. package/tailwind.config.ts +0 -313
@@ -0,0 +1,69 @@
1
+ /**
2
+ * @module Input
3
+ *
4
+ * Styled text input with support for icons, sizes, and clear button.
5
+ * Includes focus state management and dark mode support.
6
+ *
7
+ * @example
8
+ * // Basic input
9
+ * <Input placeholder="Enter your email" type="email" />
10
+ *
11
+ * @example
12
+ * // With icons
13
+ * <Input
14
+ * leftIcon={<Search />}
15
+ * rightIcon={<ClearInputButton onClick={clearValue} />}
16
+ * placeholder="Search..."
17
+ * />
18
+ *
19
+ * @example
20
+ * // Small size
21
+ * <Input size="sm" placeholder="Compact input" />
22
+ *
23
+ * @example
24
+ * // With clear button
25
+ * const [value, setValue] = useState('');
26
+ *
27
+ * <Input
28
+ * value={value}
29
+ * onChange={(e) => setValue(e.target.value)}
30
+ * rightIcon={
31
+ * value && <ClearInputButton onClick={() => setValue('')} />
32
+ * }
33
+ * />
34
+ */
35
+ import { type VariantProps } from "class-variance-authority";
36
+ import type { Ref } from "react";
37
+ declare const inputVariants: (props?: ({
38
+ size?: "sm" | "default" | "auto" | null | undefined;
39
+ hasLeftIcon?: boolean | null | undefined;
40
+ hasRightIcon?: boolean | null | undefined;
41
+ type?: "search" | null | undefined;
42
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
43
+ type InputPropsWithoutSize = Omit<React.InputHTMLAttributes<HTMLInputElement>, "size">;
44
+ type InputVariantsProps = VariantProps<typeof inputVariants>;
45
+ type PublicInputVariantsProps = Omit<InputVariantsProps, "hasLeftIcon" | "hasRightIcon" | "type">;
46
+ /**
47
+ * Props for the Input component.
48
+ * @property size - Input size: `"default"`, `"sm"`, or `"auto"`
49
+ * @property htmlSize - Native HTML size attribute for input width
50
+ * @property leftIcon - Icon element displayed on the left side
51
+ * @property rightIcon - Icon element displayed on the right side
52
+ */
53
+ export interface InputProps extends InputPropsWithoutSize, PublicInputVariantsProps {
54
+ htmlSize?: number;
55
+ leftIcon?: React.ReactNode;
56
+ ref?: Ref<HTMLInputElement>;
57
+ rightIcon?: React.ReactNode;
58
+ }
59
+ declare const Input: ({ className, size, type, htmlSize, leftIcon, rightIcon, placeholder, ref, ...props }: InputProps) => import("react/jsx-runtime").JSX.Element;
60
+ interface ClearInputButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
61
+ ref?: Ref<HTMLButtonElement>;
62
+ }
63
+ /**
64
+ * Clear/reset button designed for use as Input's rightIcon.
65
+ * Displays an X icon and handles focus states.
66
+ */
67
+ declare const ClearInputButton: ({ className, ref, ...props }: ClearInputButtonProps) => import("react/jsx-runtime").JSX.Element;
68
+ export { ClearInputButton, Input, inputVariants };
69
+ //# sourceMappingURL=input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/components/input.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGlE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAkBjC,QAAA,MAAM,aAAa;;;;;8EAgElB,CAAC;AAEF,KAAK,qBAAqB,GAAG,IAAI,CAC/B,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAC3C,MAAM,CACP,CAAC;AAEF,KAAK,kBAAkB,GAAG,YAAY,CAAC,OAAO,aAAa,CAAC,CAAC;AAK7D,KAAK,wBAAwB,GAAG,IAAI,CAClC,kBAAkB,EAClB,aAAa,GAAG,cAAc,GAAG,MAAM,CACxC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,WAAW,UACf,SAAQ,qBAAqB,EAC3B,wBAAwB;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,GAAG,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC5B,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC7B;AAED,QAAA,MAAM,KAAK,GAAI,sFAUZ,UAAU,4CAwDZ,CAAC;AAEF,UAAU,qBACR,SAAQ,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC;IACrD,GAAG,CAAC,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAC;CAC9B;AAED;;;GAGG;AACH,QAAA,MAAM,gBAAgB,GAAI,8BAIvB,qBAAqB,4CAcvB,CAAC;AAEF,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC"}
@@ -18,7 +18,7 @@ const inputWrapperVariants = cva("relative flex w-full items-center", {
18
18
  });
19
19
  const inputVariants = cva(
20
20
  [
21
- "w-full touch-manipulation self-stretch shadow-none outline-none outline-0 transition duration-200 ease-out disabled:cursor-not-allowed dark:disabled:cursor-not-allowed",
21
+ "w-full touch-manipulation self-stretch shadow-none outline-hidden outline-0 transition duration-200 ease-out disabled:cursor-not-allowed dark:disabled:cursor-not-allowed",
22
22
  // text
23
23
  "font-sans text-base text-black antialiased disabled:text-black/60 dark:text-white dark:disabled:text-white/60",
24
24
  // placeholder
@@ -95,61 +95,65 @@ const Input = ({
95
95
  ...props
96
96
  }) => {
97
97
  const [isFocused, setIsFocused] = useState(false);
98
- return /* @__PURE__ */ jsxs(
99
- "div",
100
- {
101
- className: cn(inputWrapperVariants({ size })),
102
- onBlur: () => {
103
- setTimeout(() => {
104
- setIsFocused(false);
105
- }, 50);
106
- },
107
- children: [
108
- !!leftIcon && /* @__PURE__ */ jsx(
109
- SlotPrimitive.Slot,
110
- {
111
- className: cn(
112
- "absolute top-1/2 -translate-y-1/2 text-gray-950 dark:text-gray-300 [&:is(svg)]:pointer-events-none",
113
- size === "sm" ? "left-3 size-3" : "left-4 size-4"
114
- ),
115
- children: leftIcon
116
- }
117
- ),
118
- /* @__PURE__ */ jsx(
119
- "input",
120
- {
121
- className: cn(
122
- inputVariants({
123
- size,
124
- hasLeftIcon: !!leftIcon,
125
- hasRightIcon: !!rightIcon,
126
- type: type === "search" ? "search" : void 0,
127
- className
128
- })
129
- ),
130
- onFocus: (e) => {
131
- setIsFocused(true);
132
- props.onFocus?.(e);
133
- },
134
- placeholder: isFocused ? " " : placeholder,
135
- ref,
136
- size: htmlSize,
137
- type,
138
- ...props
139
- }
140
- ),
141
- !!rightIcon && /* @__PURE__ */ jsx(
142
- SlotPrimitive.Slot,
143
- {
144
- className: cn(
145
- "absolute top-1/2 -translate-y-1/2 text-gray-950 dark:text-gray-300 [&:is(svg)]:pointer-events-none",
146
- size === "sm" ? "right-3 size-3" : "right-4 size-4"
147
- ),
148
- children: rightIcon
149
- }
150
- )
151
- ]
152
- }
98
+ return (
99
+ // biome-ignore lint/a11y/noNoninteractiveElementInteractions: container needs onBlur to coordinate focus state across child input and icon slots
100
+ // biome-ignore lint/a11y/noStaticElementInteractions: container needs onBlur to coordinate focus state across child input and icon slots
101
+ /* @__PURE__ */ jsxs(
102
+ "div",
103
+ {
104
+ className: cn(inputWrapperVariants({ size })),
105
+ onBlur: () => {
106
+ setTimeout(() => {
107
+ setIsFocused(false);
108
+ }, 50);
109
+ },
110
+ children: [
111
+ !!leftIcon && /* @__PURE__ */ jsx(
112
+ SlotPrimitive.Slot,
113
+ {
114
+ className: cn(
115
+ "absolute top-1/2 -translate-y-1/2 text-gray-950 dark:text-gray-300 [&:is(svg)]:pointer-events-none",
116
+ size === "sm" ? "left-3 size-3" : "left-4 size-4"
117
+ ),
118
+ children: leftIcon
119
+ }
120
+ ),
121
+ /* @__PURE__ */ jsx(
122
+ "input",
123
+ {
124
+ className: cn(
125
+ inputVariants({
126
+ size,
127
+ hasLeftIcon: !!leftIcon,
128
+ hasRightIcon: !!rightIcon,
129
+ type: type === "search" ? "search" : void 0,
130
+ className
131
+ })
132
+ ),
133
+ onFocus: (e) => {
134
+ setIsFocused(true);
135
+ props.onFocus?.(e);
136
+ },
137
+ placeholder: isFocused ? " " : placeholder,
138
+ ref,
139
+ size: htmlSize,
140
+ type,
141
+ ...props
142
+ }
143
+ ),
144
+ !!rightIcon && /* @__PURE__ */ jsx(
145
+ SlotPrimitive.Slot,
146
+ {
147
+ className: cn(
148
+ "absolute top-1/2 -translate-y-1/2 text-gray-950 dark:text-gray-300 [&:is(svg)]:pointer-events-none",
149
+ size === "sm" ? "right-3 size-3" : "right-4 size-4"
150
+ ),
151
+ children: rightIcon
152
+ }
153
+ )
154
+ ]
155
+ }
156
+ )
153
157
  );
154
158
  };
155
159
  const ClearInputButton = ({
@@ -162,7 +166,7 @@ const ClearInputButton = ({
162
166
  className: cn(
163
167
  "absolute top-1/2 -translate-y-1/2 text-gray-950 dark:text-gray-300",
164
168
  "focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-gray-100",
165
- "rounded-full focus-visible:outline-none dark:focus-visible:ring-[var(--focus-ring)] dark:focus-visible:ring-offset-gray-800",
169
+ "rounded-full focus-visible:outline-hidden dark:focus-visible:ring-[var(--focus-ring)] dark:focus-visible:ring-offset-gray-800",
166
170
  className
167
171
  ),
168
172
  ref,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/input.tsx"],
4
- "sourcesContent": ["/**\n * @module Input\n *\n * Styled text input with support for icons, sizes, and clear button.\n * Includes focus state management and dark mode support.\n *\n * @example\n * // Basic input\n * <Input placeholder=\"Enter your email\" type=\"email\" />\n *\n * @example\n * // With icons\n * <Input\n * leftIcon={<Search />}\n * rightIcon={<ClearInputButton onClick={clearValue} />}\n * placeholder=\"Search...\"\n * />\n *\n * @example\n * // Small size\n * <Input size=\"sm\" placeholder=\"Compact input\" />\n *\n * @example\n * // With clear button\n * const [value, setValue] = useState('');\n *\n * <Input\n * value={value}\n * onChange={(e) => setValue(e.target.value)}\n * rightIcon={\n * value && <ClearInputButton onClick={() => setValue('')} />\n * }\n * />\n */\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { X } from \"lucide-react\";\nimport { Slot as SlotPrimitive } from \"radix-ui\";\nimport type { Ref } from \"react\";\nimport { useState } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\nconst inputWrapperVariants = cva(\"relative flex w-full items-center\", {\n variants: {\n size: {\n auto: \"h-auto w-auto\",\n default: \"h-10\",\n sm: \"h-7\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n});\n\nconst inputVariants = cva(\n [\n \"w-full touch-manipulation self-stretch shadow-none outline-none outline-0 transition duration-200 ease-out disabled:cursor-not-allowed dark:disabled:cursor-not-allowed\",\n // text\n \"font-sans text-base text-black antialiased disabled:text-black/60 dark:text-white dark:disabled:text-white/60\",\n // placeholder\n \"placeholder-gray-700 placeholder:font-sans dark:placeholder-gray-200\",\n // background\n \"bg-white focus:bg-white enabled:hover:bg-white disabled:bg-white/60 dark:bg-black dark:disabled:bg-black/60 dark:focus:bg-black dark:enabled:hover:bg-black\",\n // borders (light)\n \"rounded-lg border border-gray-150 border-solid invalid:border-red invalid:hover:border-red focus:border-brand-primary enabled:hover:border-gray-200 enabled:focus:hover:border-brand-primary disabled:border-gray-150/60\", // borders light\n // borders (dark)\n \"dark:border-gray-800 dark:disabled:border-gray-900 dark:focus:border-white dark:enabled:hover:border-gray-700 dark:enabled:focus:hover:border-white dark:invalid:border-red dark:invalid:hover:border-red\", // borders dark\n ],\n {\n variants: {\n size: {\n default: \"px-4\",\n sm: \"px-3\",\n auto: \"px-4\",\n },\n hasLeftIcon: {\n true: \"\",\n false: \"\",\n },\n hasRightIcon: {\n true: \"\",\n false: \"\",\n },\n // Scoped to type=\"search\" only: the Keeper password manager extension\n // misidentifies inputs that style ::-webkit-search-cancel-button as\n // search fields and blocks paste, so non-search inputs must not match.\n type: {\n search: \"dark:[&::-webkit-search-cancel-button]:hidden\",\n },\n },\n compoundVariants: [\n {\n hasLeftIcon: true,\n size: \"default\",\n class: \"pl-10\",\n },\n {\n hasLeftIcon: true,\n size: \"sm\",\n class: \"pl-8\",\n },\n {\n hasRightIcon: true,\n size: \"default\",\n class: \"pr-10\",\n },\n {\n hasRightIcon: true,\n size: \"sm\",\n class: \"pr-8\",\n },\n ],\n defaultVariants: {\n size: \"default\",\n hasLeftIcon: false,\n hasRightIcon: false,\n },\n }\n);\n\ntype InputPropsWithoutSize = Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"size\"\n>;\n\ntype InputVariantsProps = VariantProps<typeof inputVariants>;\n\n// Omit internal-only variants from the public API. `type` is excluded so\n// consumers keep the full HTMLInputTypeAttribute union; CVA still picks up\n// the runtime value via the `type` argument passed in inputVariants().\ntype PublicInputVariantsProps = Omit<\n InputVariantsProps,\n \"hasLeftIcon\" | \"hasRightIcon\" | \"type\"\n>;\n\n/**\n * Props for the Input component.\n * @property size - Input size: `\"default\"`, `\"sm\"`, or `\"auto\"`\n * @property htmlSize - Native HTML size attribute for input width\n * @property leftIcon - Icon element displayed on the left side\n * @property rightIcon - Icon element displayed on the right side\n */\nexport interface InputProps\n extends InputPropsWithoutSize,\n PublicInputVariantsProps {\n htmlSize?: number;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n ref?: Ref<HTMLInputElement>;\n}\n\nconst Input = ({\n className,\n size,\n type = \"text\",\n htmlSize,\n leftIcon,\n rightIcon,\n placeholder,\n ref,\n ...props\n}: InputProps) => {\n const [isFocused, setIsFocused] = useState(false);\n\n return (\n <div\n className={cn(inputWrapperVariants({ size }))}\n onBlur={() => {\n setTimeout(() => {\n setIsFocused(false);\n }, 50);\n }}\n >\n {!!leftIcon && (\n <SlotPrimitive.Slot\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 text-gray-950 dark:text-gray-300 [&:is(svg)]:pointer-events-none\",\n size === \"sm\" ? \"left-3 size-3\" : \"left-4 size-4\"\n )}\n >\n {leftIcon}\n </SlotPrimitive.Slot>\n )}\n <input\n className={cn(\n inputVariants({\n size,\n hasLeftIcon: !!leftIcon,\n hasRightIcon: !!rightIcon,\n type: type === \"search\" ? \"search\" : undefined,\n className,\n })\n )}\n onFocus={(e) => {\n setIsFocused(true);\n props.onFocus?.(e);\n }}\n placeholder={isFocused ? \" \" : placeholder}\n ref={ref}\n size={htmlSize}\n type={type}\n {...props}\n />\n {!!rightIcon && (\n <SlotPrimitive.Slot\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 text-gray-950 dark:text-gray-300 [&:is(svg)]:pointer-events-none\",\n size === \"sm\" ? \"right-3 size-3\" : \"right-4 size-4\"\n )}\n >\n {rightIcon}\n </SlotPrimitive.Slot>\n )}\n </div>\n );\n};\n\ninterface ClearInputButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n ref?: Ref<HTMLButtonElement>;\n}\n\n/**\n * Clear/reset button designed for use as Input's rightIcon.\n * Displays an X icon and handles focus states.\n */\nconst ClearInputButton = ({\n className,\n ref,\n ...props\n}: ClearInputButtonProps) => (\n <button\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 text-gray-950 dark:text-gray-300\",\n \"focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-gray-100\",\n \"rounded-full focus-visible:outline-none dark:focus-visible:ring-[var(--focus-ring)] dark:focus-visible:ring-offset-gray-800\",\n className\n )}\n ref={ref}\n type=\"button\"\n {...props}\n >\n <X className=\"absolute inset-0 size-full\" strokeWidth={3} />\n </button>\n);\n\nexport { ClearInputButton, Input, inputVariants };\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * @module Input\n *\n * Styled text input with support for icons, sizes, and clear button.\n * Includes focus state management and dark mode support.\n *\n * @example\n * // Basic input\n * <Input placeholder=\"Enter your email\" type=\"email\" />\n *\n * @example\n * // With icons\n * <Input\n * leftIcon={<Search />}\n * rightIcon={<ClearInputButton onClick={clearValue} />}\n * placeholder=\"Search...\"\n * />\n *\n * @example\n * // Small size\n * <Input size=\"sm\" placeholder=\"Compact input\" />\n *\n * @example\n * // With clear button\n * const [value, setValue] = useState('');\n *\n * <Input\n * value={value}\n * onChange={(e) => setValue(e.target.value)}\n * rightIcon={\n * value && <ClearInputButton onClick={() => setValue('')} />\n * }\n * />\n */\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { X } from \"lucide-react\";\nimport { Slot as SlotPrimitive } from \"radix-ui\";\nimport type { Ref } from \"react\";\nimport { useState } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\nconst inputWrapperVariants = cva(\"relative flex w-full items-center\", {\n variants: {\n size: {\n auto: \"h-auto w-auto\",\n default: \"h-10\",\n sm: \"h-7\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n});\n\nconst inputVariants = cva(\n [\n \"w-full touch-manipulation self-stretch shadow-none outline-hidden outline-0 transition duration-200 ease-out disabled:cursor-not-allowed dark:disabled:cursor-not-allowed\",\n // text\n \"font-sans text-base text-black antialiased disabled:text-black/60 dark:text-white dark:disabled:text-white/60\",\n // placeholder\n \"placeholder-gray-700 placeholder:font-sans dark:placeholder-gray-200\",\n // background\n \"bg-white focus:bg-white enabled:hover:bg-white disabled:bg-white/60 dark:bg-black dark:disabled:bg-black/60 dark:focus:bg-black dark:enabled:hover:bg-black\",\n // borders (light)\n \"rounded-lg border border-gray-150 border-solid invalid:border-red invalid:hover:border-red focus:border-brand-primary enabled:hover:border-gray-200 enabled:focus:hover:border-brand-primary disabled:border-gray-150/60\", // borders light\n // borders (dark)\n \"dark:border-gray-800 dark:disabled:border-gray-900 dark:focus:border-white dark:enabled:hover:border-gray-700 dark:enabled:focus:hover:border-white dark:invalid:border-red dark:invalid:hover:border-red\", // borders dark\n ],\n {\n variants: {\n size: {\n default: \"px-4\",\n sm: \"px-3\",\n auto: \"px-4\",\n },\n hasLeftIcon: {\n true: \"\",\n false: \"\",\n },\n hasRightIcon: {\n true: \"\",\n false: \"\",\n },\n // Scoped to type=\"search\" only: the Keeper password manager extension\n // misidentifies inputs that style ::-webkit-search-cancel-button as\n // search fields and blocks paste, so non-search inputs must not match.\n type: {\n search: \"dark:[&::-webkit-search-cancel-button]:hidden\",\n },\n },\n compoundVariants: [\n {\n hasLeftIcon: true,\n size: \"default\",\n class: \"pl-10\",\n },\n {\n hasLeftIcon: true,\n size: \"sm\",\n class: \"pl-8\",\n },\n {\n hasRightIcon: true,\n size: \"default\",\n class: \"pr-10\",\n },\n {\n hasRightIcon: true,\n size: \"sm\",\n class: \"pr-8\",\n },\n ],\n defaultVariants: {\n size: \"default\",\n hasLeftIcon: false,\n hasRightIcon: false,\n },\n }\n);\n\ntype InputPropsWithoutSize = Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"size\"\n>;\n\ntype InputVariantsProps = VariantProps<typeof inputVariants>;\n\n// Omit internal-only variants from the public API. `type` is excluded so\n// consumers keep the full HTMLInputTypeAttribute union; CVA still picks up\n// the runtime value via the `type` argument passed in inputVariants().\ntype PublicInputVariantsProps = Omit<\n InputVariantsProps,\n \"hasLeftIcon\" | \"hasRightIcon\" | \"type\"\n>;\n\n/**\n * Props for the Input component.\n * @property size - Input size: `\"default\"`, `\"sm\"`, or `\"auto\"`\n * @property htmlSize - Native HTML size attribute for input width\n * @property leftIcon - Icon element displayed on the left side\n * @property rightIcon - Icon element displayed on the right side\n */\nexport interface InputProps\n extends InputPropsWithoutSize,\n PublicInputVariantsProps {\n htmlSize?: number;\n leftIcon?: React.ReactNode;\n ref?: Ref<HTMLInputElement>;\n rightIcon?: React.ReactNode;\n}\n\nconst Input = ({\n className,\n size,\n type = \"text\",\n htmlSize,\n leftIcon,\n rightIcon,\n placeholder,\n ref,\n ...props\n}: InputProps) => {\n const [isFocused, setIsFocused] = useState(false);\n\n return (\n // biome-ignore lint/a11y/noNoninteractiveElementInteractions: container needs onBlur to coordinate focus state across child input and icon slots\n // biome-ignore lint/a11y/noStaticElementInteractions: container needs onBlur to coordinate focus state across child input and icon slots\n <div\n className={cn(inputWrapperVariants({ size }))}\n onBlur={() => {\n setTimeout(() => {\n setIsFocused(false);\n }, 50);\n }}\n >\n {!!leftIcon && (\n <SlotPrimitive.Slot\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 text-gray-950 dark:text-gray-300 [&:is(svg)]:pointer-events-none\",\n size === \"sm\" ? \"left-3 size-3\" : \"left-4 size-4\"\n )}\n >\n {leftIcon}\n </SlotPrimitive.Slot>\n )}\n <input\n className={cn(\n inputVariants({\n size,\n hasLeftIcon: !!leftIcon,\n hasRightIcon: !!rightIcon,\n type: type === \"search\" ? \"search\" : undefined,\n className,\n })\n )}\n onFocus={(e) => {\n setIsFocused(true);\n props.onFocus?.(e);\n }}\n placeholder={isFocused ? \" \" : placeholder}\n ref={ref}\n size={htmlSize}\n type={type}\n {...props}\n />\n {!!rightIcon && (\n <SlotPrimitive.Slot\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 text-gray-950 dark:text-gray-300 [&:is(svg)]:pointer-events-none\",\n size === \"sm\" ? \"right-3 size-3\" : \"right-4 size-4\"\n )}\n >\n {rightIcon}\n </SlotPrimitive.Slot>\n )}\n </div>\n );\n};\n\ninterface ClearInputButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n ref?: Ref<HTMLButtonElement>;\n}\n\n/**\n * Clear/reset button designed for use as Input's rightIcon.\n * Displays an X icon and handles focus states.\n */\nconst ClearInputButton = ({\n className,\n ref,\n ...props\n}: ClearInputButtonProps) => (\n <button\n className={cn(\n \"absolute top-1/2 -translate-y-1/2 text-gray-950 dark:text-gray-300\",\n \"focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-gray-100\",\n \"rounded-full focus-visible:outline-hidden dark:focus-visible:ring-[var(--focus-ring)] dark:focus-visible:ring-offset-gray-800\",\n className\n )}\n ref={ref}\n type=\"button\"\n {...props}\n >\n <X className=\"absolute inset-0 size-full\" strokeWidth={3} />\n </button>\n);\n\nexport { ClearInputButton, Input, inputVariants };\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @module Label
3
+ *
4
+ * Accessible label for form controls. Built on Radix UI Label primitive.
5
+ * Automatically associates with form elements via `htmlFor` prop.
6
+ *
7
+ * @see {@link https://ui.shadcn.com/docs/components/label Shadcn Label}
8
+ * @see {@link https://www.radix-ui.com/primitives/docs/components/label Radix Label}
9
+ *
10
+ * @example
11
+ * // Basic label with input
12
+ * <Label htmlFor="email">Email</Label>
13
+ * <Input id="email" type="email" />
14
+ *
15
+ * @example
16
+ * // With checkbox
17
+ * <div className="flex items-center gap-2">
18
+ * <Checkbox id="terms" />
19
+ * <Label htmlFor="terms">Accept terms and conditions</Label>
20
+ * </div>
21
+ */
22
+ import { type VariantProps } from "class-variance-authority";
23
+ import { Label as LabelPrimitive } from "radix-ui";
24
+ import type { ComponentPropsWithoutRef, ElementRef, Ref } from "react";
25
+ /** CVA variants for label styling */
26
+ declare const labelVariants: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
27
+ interface LabelProps extends ComponentPropsWithoutRef<typeof LabelPrimitive.Root>, VariantProps<typeof labelVariants> {
28
+ ref?: Ref<ElementRef<typeof LabelPrimitive.Root>>;
29
+ }
30
+ /**
31
+ * Form label with accessible peer state handling.
32
+ * Dims when associated form control is disabled.
33
+ */
34
+ declare const Label: ({ className, ref, ...props }: LabelProps) => import("react/jsx-runtime").JSX.Element;
35
+ export { Label };
36
+ //# sourceMappingURL=label.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"label.d.ts","sourceRoot":"","sources":["../../src/components/label.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,KAAK,IAAI,cAAc,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,KAAK,EAAE,wBAAwB,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAIvE,qCAAqC;AACrC,QAAA,MAAM,aAAa,oFAElB,CAAC;AAEF,UAAU,UACR,SAAQ,wBAAwB,CAAC,OAAO,cAAc,CAAC,IAAI,CAAC,EAC1D,YAAY,CAAC,OAAO,aAAa,CAAC;IACpC,GAAG,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;CACnD;AAED;;;GAGG;AACH,QAAA,MAAM,KAAK,GAAI,8BAA8B,UAAU,4CAMtD,CAAC;AAEF,OAAO,EAAE,KAAK,EAAE,CAAC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * @module Popover
3
+ *
4
+ * Floating content panel anchored to a trigger element. Built on Radix UI Popover primitive.
5
+ * Supports controlled/uncontrolled modes, custom positioning, and focus management.
6
+ *
7
+ * @see {@link https://ui.shadcn.com/docs/components/popover Shadcn Popover}
8
+ * @see {@link https://www.radix-ui.com/primitives/docs/components/popover Radix Popover}
9
+ *
10
+ * @example
11
+ * // Basic popover
12
+ * <Popover>
13
+ * <PopoverTrigger asChild>
14
+ * <Button>Open Popover</Button>
15
+ * </PopoverTrigger>
16
+ * <PopoverContent>
17
+ * <p>Popover content here</p>
18
+ * </PopoverContent>
19
+ * </Popover>
20
+ *
21
+ * @example
22
+ * // Controlled popover with custom positioning
23
+ * const [open, setOpen] = useState(false);
24
+ *
25
+ * <Popover open={open} onOpenChange={setOpen}>
26
+ * <PopoverTrigger>Settings</PopoverTrigger>
27
+ * <PopoverContent align="start" sideOffset={8}>
28
+ * <SettingsForm onSave={() => setOpen(false)} />
29
+ * </PopoverContent>
30
+ * </Popover>
31
+ *
32
+ * @example
33
+ * // With custom anchor point
34
+ * <Popover>
35
+ * <PopoverAnchor asChild>
36
+ * <div>Anchor element (popover positions relative to this)</div>
37
+ * </PopoverAnchor>
38
+ * <PopoverTrigger>Open</PopoverTrigger>
39
+ * <PopoverContent>Content</PopoverContent>
40
+ * </Popover>
41
+ */
42
+ import { Popover as PopoverPrimitive } from "radix-ui";
43
+ import type * as React from "react";
44
+ import type { Ref } from "react";
45
+ /** Root component that manages popover open/closed state. */
46
+ declare const Popover: React.FC<PopoverPrimitive.PopoverProps>;
47
+ /** Element that toggles the popover when clicked. Use `asChild` to wrap custom elements. */
48
+ declare const PopoverTrigger: React.ForwardRefExoticComponent<PopoverPrimitive.PopoverTriggerProps & React.RefAttributes<HTMLButtonElement>>;
49
+ /** Alternative anchor point for popover positioning (separate from trigger). */
50
+ declare const PopoverAnchor: React.ForwardRefExoticComponent<PopoverPrimitive.PopoverAnchorProps & React.RefAttributes<HTMLDivElement>>;
51
+ /**
52
+ * Popover content container. Animated on open/close.
53
+ * @param align - Horizontal alignment: `"start"`, `"center"` (default), or `"end"`
54
+ * @param sideOffset - Distance from anchor in pixels (default: 4)
55
+ * @param forceMount - Keep mounted in DOM even when closed
56
+ */
57
+ declare const PopoverContent: ({ className, forceMount, align, sideOffset, ref, ...props }: React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content> & {
58
+ ref?: Ref<React.ElementRef<typeof PopoverPrimitive.Content>>;
59
+ }) => import("react/jsx-runtime").JSX.Element;
60
+ export { Popover, PopoverAnchor, PopoverContent, PopoverTrigger };
61
+ //# sourceMappingURL=popover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popover.d.ts","sourceRoot":"","sources":["../../src/components/popover.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AACpC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAIjC,6DAA6D;AAC7D,QAAA,MAAM,OAAO,yCAAwB,CAAC;AAEtC,4FAA4F;AAC5F,QAAA,MAAM,cAAc,gHAA2B,CAAC;AAEhD,gFAAgF;AAChF,QAAA,MAAM,aAAa,4GAA0B,CAAC;AAE9C;;;;;GAKG;AACH,QAAA,MAAM,cAAc,GAAI,6DAOrB,KAAK,CAAC,wBAAwB,CAAC,OAAO,gBAAgB,CAAC,OAAO,CAAC,GAAG;IACnE,GAAG,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;CAC9D,4CAaA,CAAC;AAEF,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC"}
@@ -16,7 +16,7 @@ const PopoverContent = ({
16
16
  {
17
17
  align,
18
18
  className: cn(
19
- "data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-1 data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1 data-[side=top]:slide-in-from-bottom-1 z-50 origin-[var(--radix-popover-content-transform-origin)] rounded-md border border-gray-150 border-solid bg-white fill-mode-forwards p-4 text-gray-950 shadow-md outline-none data-[state=closed]:animate-out data-[state=open]:animate-in data-[state=closed]:opacity-0 data-[state=open]:opacity-100 dark:border-gray-800 dark:bg-gray-950 dark:text-gray-50",
19
+ "data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-1 data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1 data-[side=top]:slide-in-from-bottom-1 z-50 origin-[var(--radix-popover-content-transform-origin)] rounded-md border border-gray-150 border-solid bg-white fill-mode-forwards p-4 text-gray-950 shadow-md outline-hidden data-[state=closed]:animate-out data-[state=open]:animate-in data-[state=closed]:opacity-0 data-[state=open]:opacity-100 dark:border-gray-800 dark:bg-gray-950 dark:text-gray-50",
20
20
  className
21
21
  ),
22
22
  ref,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/popover.tsx"],
4
- "sourcesContent": ["/**\n * @module Popover\n *\n * Floating content panel anchored to a trigger element. Built on Radix UI Popover primitive.\n * Supports controlled/uncontrolled modes, custom positioning, and focus management.\n *\n * @see {@link https://ui.shadcn.com/docs/components/popover Shadcn Popover}\n * @see {@link https://www.radix-ui.com/primitives/docs/components/popover Radix Popover}\n *\n * @example\n * // Basic popover\n * <Popover>\n * <PopoverTrigger asChild>\n * <Button>Open Popover</Button>\n * </PopoverTrigger>\n * <PopoverContent>\n * <p>Popover content here</p>\n * </PopoverContent>\n * </Popover>\n *\n * @example\n * // Controlled popover with custom positioning\n * const [open, setOpen] = useState(false);\n *\n * <Popover open={open} onOpenChange={setOpen}>\n * <PopoverTrigger>Settings</PopoverTrigger>\n * <PopoverContent align=\"start\" sideOffset={8}>\n * <SettingsForm onSave={() => setOpen(false)} />\n * </PopoverContent>\n * </Popover>\n *\n * @example\n * // With custom anchor point\n * <Popover>\n * <PopoverAnchor asChild>\n * <div>Anchor element (popover positions relative to this)</div>\n * </PopoverAnchor>\n * <PopoverTrigger>Open</PopoverTrigger>\n * <PopoverContent>Content</PopoverContent>\n * </Popover>\n */\nimport { Popover as PopoverPrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\nimport type { Ref } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\n/** Root component that manages popover open/closed state. */\nconst Popover = PopoverPrimitive.Root;\n\n/** Element that toggles the popover when clicked. Use `asChild` to wrap custom elements. */\nconst PopoverTrigger = PopoverPrimitive.Trigger;\n\n/** Alternative anchor point for popover positioning (separate from trigger). */\nconst PopoverAnchor = PopoverPrimitive.Anchor;\n\n/**\n * Popover content container. Animated on open/close.\n * @param align - Horizontal alignment: `\"start\"`, `\"center\"` (default), or `\"end\"`\n * @param sideOffset - Distance from anchor in pixels (default: 4)\n * @param forceMount - Keep mounted in DOM even when closed\n */\nconst PopoverContent = ({\n className,\n forceMount,\n align = \"center\",\n sideOffset = 4,\n ref,\n ...props\n}: React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content> & {\n ref?: Ref<React.ElementRef<typeof PopoverPrimitive.Content>>;\n}) => (\n <PopoverPrimitive.Portal forceMount={forceMount}>\n <PopoverPrimitive.Content\n align={align}\n className={cn(\n \"data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-1 data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1 data-[side=top]:slide-in-from-bottom-1 z-50 origin-[var(--radix-popover-content-transform-origin)] rounded-md border border-gray-150 border-solid bg-white fill-mode-forwards p-4 text-gray-950 shadow-md outline-none data-[state=closed]:animate-out data-[state=open]:animate-in data-[state=closed]:opacity-0 data-[state=open]:opacity-100 dark:border-gray-800 dark:bg-gray-950 dark:text-gray-50\",\n className\n )}\n ref={ref}\n sideOffset={sideOffset}\n {...props}\n />\n </PopoverPrimitive.Portal>\n);\n\nexport { Popover, PopoverAnchor, PopoverContent, PopoverTrigger };\n"],
4
+ "sourcesContent": ["/**\n * @module Popover\n *\n * Floating content panel anchored to a trigger element. Built on Radix UI Popover primitive.\n * Supports controlled/uncontrolled modes, custom positioning, and focus management.\n *\n * @see {@link https://ui.shadcn.com/docs/components/popover Shadcn Popover}\n * @see {@link https://www.radix-ui.com/primitives/docs/components/popover Radix Popover}\n *\n * @example\n * // Basic popover\n * <Popover>\n * <PopoverTrigger asChild>\n * <Button>Open Popover</Button>\n * </PopoverTrigger>\n * <PopoverContent>\n * <p>Popover content here</p>\n * </PopoverContent>\n * </Popover>\n *\n * @example\n * // Controlled popover with custom positioning\n * const [open, setOpen] = useState(false);\n *\n * <Popover open={open} onOpenChange={setOpen}>\n * <PopoverTrigger>Settings</PopoverTrigger>\n * <PopoverContent align=\"start\" sideOffset={8}>\n * <SettingsForm onSave={() => setOpen(false)} />\n * </PopoverContent>\n * </Popover>\n *\n * @example\n * // With custom anchor point\n * <Popover>\n * <PopoverAnchor asChild>\n * <div>Anchor element (popover positions relative to this)</div>\n * </PopoverAnchor>\n * <PopoverTrigger>Open</PopoverTrigger>\n * <PopoverContent>Content</PopoverContent>\n * </Popover>\n */\nimport { Popover as PopoverPrimitive } from \"radix-ui\";\nimport type * as React from \"react\";\nimport type { Ref } from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\n/** Root component that manages popover open/closed state. */\nconst Popover = PopoverPrimitive.Root;\n\n/** Element that toggles the popover when clicked. Use `asChild` to wrap custom elements. */\nconst PopoverTrigger = PopoverPrimitive.Trigger;\n\n/** Alternative anchor point for popover positioning (separate from trigger). */\nconst PopoverAnchor = PopoverPrimitive.Anchor;\n\n/**\n * Popover content container. Animated on open/close.\n * @param align - Horizontal alignment: `\"start\"`, `\"center\"` (default), or `\"end\"`\n * @param sideOffset - Distance from anchor in pixels (default: 4)\n * @param forceMount - Keep mounted in DOM even when closed\n */\nconst PopoverContent = ({\n className,\n forceMount,\n align = \"center\",\n sideOffset = 4,\n ref,\n ...props\n}: React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content> & {\n ref?: Ref<React.ElementRef<typeof PopoverPrimitive.Content>>;\n}) => (\n <PopoverPrimitive.Portal forceMount={forceMount}>\n <PopoverPrimitive.Content\n align={align}\n className={cn(\n \"data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-1 data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1 data-[side=top]:slide-in-from-bottom-1 z-50 origin-[var(--radix-popover-content-transform-origin)] rounded-md border border-gray-150 border-solid bg-white fill-mode-forwards p-4 text-gray-950 shadow-md outline-hidden data-[state=closed]:animate-out data-[state=open]:animate-in data-[state=closed]:opacity-0 data-[state=open]:opacity-100 dark:border-gray-800 dark:bg-gray-950 dark:text-gray-50\",\n className\n )}\n ref={ref}\n sideOffset={sideOffset}\n {...props}\n />\n </PopoverPrimitive.Portal>\n);\n\nexport { Popover, PopoverAnchor, PopoverContent, PopoverTrigger };\n"],
5
5
  "mappings": "AAyEI;AAhCJ,SAAS,WAAW,wBAAwB;AAI5C,SAAS,UAAU;AAGnB,MAAM,UAAU,iBAAiB;AAGjC,MAAM,iBAAiB,iBAAiB;AAGxC,MAAM,gBAAgB,iBAAiB;AAQvC,MAAM,iBAAiB,CAAC;AAAA,EACtB;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,aAAa;AAAA,EACb;AAAA,EACA,GAAG;AACL,MAGE,oBAAC,iBAAiB,QAAjB,EAAwB,YACvB;AAAA,EAAC,iBAAiB;AAAA,EAAjB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACC,GAAG;AAAA;AACN,GACF;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @module PriceTag
3
+ *
4
+ * Displays pricing information with currency symbol and frequency.
5
+ * Automatically formats decimal values and includes accessible labeling.
6
+ *
7
+ * @example
8
+ * // Basic price display
9
+ * <PriceTag currencySymbol="$" price="9.99" frequency="month" />
10
+ *
11
+ * @example
12
+ * // Annual pricing
13
+ * <PriceTag currencySymbol="£" price="99.00" frequency="year" />
14
+ */
15
+ import type * as React from "react";
16
+ import type { TextProps } from "./typography/text";
17
+ /**
18
+ * Props for PriceTag component.
19
+ * @property currencySymbol - Currency symbol (e.g., "$", "£", "€")
20
+ * @property price - Price value as string (e.g., "9.99")
21
+ * @property frequency - Billing frequency (e.g., "month", "year")
22
+ */
23
+ export interface PriceTagProps extends TextProps {
24
+ currencySymbol: string;
25
+ frequency: string;
26
+ price: string;
27
+ ref?: React.Ref<HTMLParagraphElement>;
28
+ }
29
+ declare function PriceTag({ currencySymbol, price, frequency, ref, ...props }: PriceTagProps): import("react/jsx-runtime").JSX.Element;
30
+ export { PriceTag };
31
+ //# sourceMappingURL=price-tag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"price-tag.d.ts","sourceRoot":"","sources":["../../src/components/price-tag.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGnD;;;;;GAKG;AACH,MAAM,WAAW,aAAc,SAAQ,SAAS;IAC9C,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;CACvC;AAED,iBAAS,QAAQ,CAAC,EAChB,cAAc,EACd,KAAK,EACL,SAAS,EACT,GAAG,EACH,GAAG,KAAK,EACT,EAAE,aAAa,2CA0Bf;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/price-tag.tsx"],
4
- "sourcesContent": ["/**\n * @module PriceTag\n *\n * Displays pricing information with currency symbol and frequency.\n * Automatically formats decimal values and includes accessible labeling.\n *\n * @example\n * // Basic price display\n * <PriceTag currencySymbol=\"$\" price=\"9.99\" frequency=\"month\" />\n *\n * @example\n * // Annual pricing\n * <PriceTag currencySymbol=\"\u00A3\" price=\"99.00\" frequency=\"year\" />\n */\nimport type * as React from \"react\";\nimport type { TextProps } from \"./typography/text\";\nimport { Text } from \"./typography/text\";\n\n/**\n * Props for PriceTag component.\n * @property currencySymbol - Currency symbol (e.g., \"$\", \"\u00A3\", \"\u20AC\")\n * @property price - Price value as string (e.g., \"9.99\")\n * @property frequency - Billing frequency (e.g., \"month\", \"year\")\n */\nexport interface PriceTagProps extends TextProps {\n currencySymbol: string;\n price: string;\n frequency: string;\n ref?: React.Ref<HTMLParagraphElement>;\n}\n\nfunction PriceTag({\n currencySymbol,\n price,\n frequency,\n ref,\n ...props\n}: PriceTagProps) {\n // Split price into main unit and cents/pence\n const [mainUnit, cents = \"00\"] = price.split(\".\", 2);\n\n // Create accessible label for screen readers\n const accessiblePrice = `${currencySymbol}${price} per ${frequency}`;\n\n return (\n <Text className=\"font-sans font-normal leading-5\" ref={ref} {...props}>\n {/* Screen reader only text */}\n <span className=\"sr-only\">{accessiblePrice}</span>\n\n {/* Visual presentation hidden from screen readers */}\n <span aria-hidden=\"true\">\n <span className=\"text-gray-700 text-xs dark:text-gray-200\">\n {currencySymbol}\n </span>\n <span className=\"font-heading font-semibold text-base text-gray-950 dark:text-white\">\n {mainUnit}.{cents}\n </span>\n <span className=\"text-gray-700 text-xs dark:text-gray-200\">\n /{frequency}\n </span>\n </span>\n </Text>\n );\n}\n\nexport { PriceTag };\n"],
4
+ "sourcesContent": ["/**\n * @module PriceTag\n *\n * Displays pricing information with currency symbol and frequency.\n * Automatically formats decimal values and includes accessible labeling.\n *\n * @example\n * // Basic price display\n * <PriceTag currencySymbol=\"$\" price=\"9.99\" frequency=\"month\" />\n *\n * @example\n * // Annual pricing\n * <PriceTag currencySymbol=\"\u00A3\" price=\"99.00\" frequency=\"year\" />\n */\nimport type * as React from \"react\";\nimport type { TextProps } from \"./typography/text\";\nimport { Text } from \"./typography/text\";\n\n/**\n * Props for PriceTag component.\n * @property currencySymbol - Currency symbol (e.g., \"$\", \"\u00A3\", \"\u20AC\")\n * @property price - Price value as string (e.g., \"9.99\")\n * @property frequency - Billing frequency (e.g., \"month\", \"year\")\n */\nexport interface PriceTagProps extends TextProps {\n currencySymbol: string;\n frequency: string;\n price: string;\n ref?: React.Ref<HTMLParagraphElement>;\n}\n\nfunction PriceTag({\n currencySymbol,\n price,\n frequency,\n ref,\n ...props\n}: PriceTagProps) {\n // Split price into main unit and cents/pence\n const [mainUnit, cents = \"00\"] = price.split(\".\", 2);\n\n // Create accessible label for screen readers\n const accessiblePrice = `${currencySymbol}${price} per ${frequency}`;\n\n return (\n <Text className=\"font-sans font-normal leading-5\" ref={ref} {...props}>\n {/* Screen reader only text */}\n <span className=\"sr-only\">{accessiblePrice}</span>\n\n {/* Visual presentation hidden from screen readers */}\n <span aria-hidden=\"true\">\n <span className=\"text-gray-700 text-xs dark:text-gray-200\">\n {currencySymbol}\n </span>\n <span className=\"font-heading font-semibold text-base text-gray-950 dark:text-white\">\n {mainUnit}.{cents}\n </span>\n <span className=\"text-gray-700 text-xs dark:text-gray-200\">\n /{frequency}\n </span>\n </span>\n </Text>\n );\n}\n\nexport { PriceTag };\n"],
5
5
  "mappings": "AA+CM,cAOE,YAPF;AA/BN,SAAS,YAAY;AAerB,SAAS,SAAS;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAkB;AAEhB,QAAM,CAAC,UAAU,QAAQ,IAAI,IAAI,MAAM,MAAM,KAAK,CAAC;AAGnD,QAAM,kBAAkB,GAAG,cAAc,GAAG,KAAK,QAAQ,SAAS;AAElE,SACE,qBAAC,QAAK,WAAU,mCAAkC,KAAW,GAAG,OAE9D;AAAA,wBAAC,UAAK,WAAU,WAAW,2BAAgB;AAAA,IAG3C,qBAAC,UAAK,eAAY,QAChB;AAAA,0BAAC,UAAK,WAAU,4CACb,0BACH;AAAA,MACA,qBAAC,UAAK,WAAU,sEACb;AAAA;AAAA,QAAS;AAAA,QAAE;AAAA,SACd;AAAA,MACA,qBAAC,UAAK,WAAU,4CAA2C;AAAA;AAAA,QACvD;AAAA,SACJ;AAAA,OACF;AAAA,KACF;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,15 @@
1
+ import { RadioGroup as RadioGroupPrimitive } from "radix-ui";
2
+ import type { Ref } from "react";
3
+ import * as React from "react";
4
+ interface RadioGroupProps extends React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root> {
5
+ ref?: Ref<React.ElementRef<typeof RadioGroupPrimitive.Root>>;
6
+ }
7
+ /** Container for radio items. Manages selection state. */
8
+ declare const RadioGroup: ({ className, ref, ...props }: RadioGroupProps) => import("react/jsx-runtime").JSX.Element;
9
+ interface RadioGroupItemProps extends React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item> {
10
+ ref?: Ref<React.ElementRef<typeof RadioGroupPrimitive.Item>>;
11
+ }
12
+ /** Individual radio button with animated selection indicator. */
13
+ declare const RadioGroupItem: ({ className, ref, ...props }: RadioGroupItemProps) => import("react/jsx-runtime").JSX.Element;
14
+ export { RadioGroup, RadioGroupItem };
15
+ //# sourceMappingURL=radio-group.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radio-group.d.ts","sourceRoot":"","sources":["../../src/components/radio-group.tsx"],"names":[],"mappings":"AAgCA,OAAO,EAAE,UAAU,IAAI,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,UAAU,eACR,SAAQ,KAAK,CAAC,wBAAwB,CAAC,OAAO,mBAAmB,CAAC,IAAI,CAAC;IACvE,GAAG,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;CAC9D;AAED,0DAA0D;AAC1D,QAAA,MAAM,UAAU,GAAI,8BAA8B,eAAe,4CAMhE,CAAC;AAEF,UAAU,mBACR,SAAQ,KAAK,CAAC,wBAAwB,CAAC,OAAO,mBAAmB,CAAC,IAAI,CAAC;IACvE,GAAG,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;CAC9D;AAED,iEAAiE;AACjE,QAAA,MAAM,cAAc,GAAI,8BAA8B,mBAAmB,4CAyExE,CAAC;AAEF,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC"}
@@ -46,7 +46,7 @@ const RadioGroupItem = ({ className, ref, ...props }) => {
46
46
  RadioGroupPrimitive.Item,
47
47
  {
48
48
  className: cn(
49
- "relative aspect-square size-4 h-4 w-4 rounded-full border border-gray-500 border-solid p-0.5 text-brand-primary ring-offset-brand-primary focus:outline-none focus-visible:ring-2 focus-visible:ring-offset focus-visible:ring-[var(--focus-ring)] disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:border-brand-primary",
49
+ "relative aspect-square size-4 h-4 w-4 rounded-full border border-gray-500 border-solid p-0.5 text-brand-primary ring-offset-brand-primary focus:outline-hidden focus-visible:ring-2 focus-visible:ring-offset focus-visible:ring-[var(--focus-ring)] disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:border-brand-primary",
50
50
  className
51
51
  ),
52
52
  ref: setRefs,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/components/radio-group.tsx"],
4
- "sourcesContent": ["/**\n * @module RadioGroup\n *\n * Single-selection radio button group with animated indicators. Built on Radix UI Radio Group primitive.\n *\n * @see {@link https://ui.shadcn.com/docs/components/radio-group Shadcn Radio Group}\n * @see {@link https://www.radix-ui.com/primitives/docs/components/radio-group Radix Radio Group}\n *\n * @example\n * // Basic radio group\n * <RadioGroup defaultValue=\"option1\">\n * <div className=\"flex items-center gap-2\">\n * <RadioGroupItem value=\"option1\" id=\"option1\" />\n * <Label htmlFor=\"option1\">Option 1</Label>\n * </div>\n * <div className=\"flex items-center gap-2\">\n * <RadioGroupItem value=\"option2\" id=\"option2\" />\n * <Label htmlFor=\"option2\">Option 2</Label>\n * </div>\n * </RadioGroup>\n *\n * @example\n * // Controlled radio group\n * const [value, setValue] = useState(\"default\");\n *\n * <RadioGroup value={value} onValueChange={setValue}>\n * <RadioGroupItem value=\"a\" id=\"a\" />\n * <RadioGroupItem value=\"b\" id=\"b\" />\n * </RadioGroup>\n */\nimport { Circle } from \"lucide-react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { RadioGroup as RadioGroupPrimitive } from \"radix-ui\";\nimport type { Ref } from \"react\";\nimport * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\ninterface RadioGroupProps\n extends React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root> {\n ref?: Ref<React.ElementRef<typeof RadioGroupPrimitive.Root>>;\n}\n\n/** Container for radio items. Manages selection state. */\nconst RadioGroup = ({ className, ref, ...props }: RadioGroupProps) => (\n <RadioGroupPrimitive.Root\n className={cn(\"grid gap-2\", className)}\n {...props}\n ref={ref}\n />\n);\n\ninterface RadioGroupItemProps\n extends React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item> {\n ref?: Ref<React.ElementRef<typeof RadioGroupPrimitive.Item>>;\n}\n\n/** Individual radio button with animated selection indicator. */\nconst RadioGroupItem = ({ className, ref, ...props }: RadioGroupItemProps) => {\n const [isChecked, setIsChecked] = React.useState(false);\n const itemRef = React.useRef<HTMLButtonElement | null>(null);\n\n React.useEffect(() => {\n const observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n if (\n mutation.type === \"attributes\" &&\n mutation.attributeName === \"data-state\"\n ) {\n const newState = itemRef.current?.getAttribute(\"data-state\");\n\n setIsChecked(newState === \"checked\");\n }\n });\n });\n\n if (itemRef.current) {\n observer.observe(itemRef.current, { attributes: true });\n }\n\n return () => {\n observer.disconnect();\n };\n }, []);\n\n // Forward the ref to both our local ref and the passed ref\n const setRefs = React.useCallback(\n (element: HTMLButtonElement | null) => {\n itemRef.current = element;\n\n // Handle function refs\n if (typeof ref === \"function\") {\n ref(element);\n } else if (ref && \"current\" in ref) {\n ref.current = element;\n }\n },\n [ref]\n );\n\n return (\n <RadioGroupPrimitive.Item\n className={cn(\n \"relative aspect-square size-4 h-4 w-4 rounded-full border border-gray-500 border-solid p-0.5 text-brand-primary ring-offset-brand-primary focus:outline-none focus-visible:ring-2 focus-visible:ring-offset focus-visible:ring-[var(--focus-ring)] disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:border-brand-primary\",\n className\n )}\n ref={setRefs}\n {...props}\n >\n <AnimatePresence>\n {isChecked && (\n <motion.div\n animate={{ scale: 2, opacity: 0 }}\n className=\"absolute inset-0 z-0 rounded-full bg-brand-primary\"\n exit={{ scale: 0, opacity: 0 }}\n initial={{ scale: 0, opacity: 0.5 }}\n transition={{ duration: 0.4 }}\n />\n )}\n </AnimatePresence>\n <motion.div\n animate={isChecked ? { scale: 1.1 } : { scale: 1 }}\n className=\"relative\"\n transition={{ type: \"spring\", stiffness: 300, damping: 20 }}\n >\n <RadioGroupPrimitive.Indicator className=\"flex items-center justify-center\">\n <Circle className=\"size-2.5 fill-current text-current\" />\n </RadioGroupPrimitive.Indicator>\n </motion.div>\n </RadioGroupPrimitive.Item>\n );\n};\n\nexport { RadioGroup, RadioGroupItem };\n"],
4
+ "sourcesContent": ["/**\n * @module RadioGroup\n *\n * Single-selection radio button group with animated indicators. Built on Radix UI Radio Group primitive.\n *\n * @see {@link https://ui.shadcn.com/docs/components/radio-group Shadcn Radio Group}\n * @see {@link https://www.radix-ui.com/primitives/docs/components/radio-group Radix Radio Group}\n *\n * @example\n * // Basic radio group\n * <RadioGroup defaultValue=\"option1\">\n * <div className=\"flex items-center gap-2\">\n * <RadioGroupItem value=\"option1\" id=\"option1\" />\n * <Label htmlFor=\"option1\">Option 1</Label>\n * </div>\n * <div className=\"flex items-center gap-2\">\n * <RadioGroupItem value=\"option2\" id=\"option2\" />\n * <Label htmlFor=\"option2\">Option 2</Label>\n * </div>\n * </RadioGroup>\n *\n * @example\n * // Controlled radio group\n * const [value, setValue] = useState(\"default\");\n *\n * <RadioGroup value={value} onValueChange={setValue}>\n * <RadioGroupItem value=\"a\" id=\"a\" />\n * <RadioGroupItem value=\"b\" id=\"b\" />\n * </RadioGroup>\n */\nimport { Circle } from \"lucide-react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { RadioGroup as RadioGroupPrimitive } from \"radix-ui\";\nimport type { Ref } from \"react\";\nimport * as React from \"react\";\n\nimport { cn } from \"../lib/utils\";\n\ninterface RadioGroupProps\n extends React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root> {\n ref?: Ref<React.ElementRef<typeof RadioGroupPrimitive.Root>>;\n}\n\n/** Container for radio items. Manages selection state. */\nconst RadioGroup = ({ className, ref, ...props }: RadioGroupProps) => (\n <RadioGroupPrimitive.Root\n className={cn(\"grid gap-2\", className)}\n {...props}\n ref={ref}\n />\n);\n\ninterface RadioGroupItemProps\n extends React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item> {\n ref?: Ref<React.ElementRef<typeof RadioGroupPrimitive.Item>>;\n}\n\n/** Individual radio button with animated selection indicator. */\nconst RadioGroupItem = ({ className, ref, ...props }: RadioGroupItemProps) => {\n const [isChecked, setIsChecked] = React.useState(false);\n const itemRef = React.useRef<HTMLButtonElement | null>(null);\n\n React.useEffect(() => {\n const observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n if (\n mutation.type === \"attributes\" &&\n mutation.attributeName === \"data-state\"\n ) {\n const newState = itemRef.current?.getAttribute(\"data-state\");\n\n setIsChecked(newState === \"checked\");\n }\n });\n });\n\n if (itemRef.current) {\n observer.observe(itemRef.current, { attributes: true });\n }\n\n return () => {\n observer.disconnect();\n };\n }, []);\n\n // Forward the ref to both our local ref and the passed ref\n const setRefs = React.useCallback(\n (element: HTMLButtonElement | null) => {\n itemRef.current = element;\n\n // Handle function refs\n if (typeof ref === \"function\") {\n ref(element);\n } else if (ref && \"current\" in ref) {\n ref.current = element;\n }\n },\n [ref]\n );\n\n return (\n <RadioGroupPrimitive.Item\n className={cn(\n \"relative aspect-square size-4 h-4 w-4 rounded-full border border-gray-500 border-solid p-0.5 text-brand-primary ring-offset-brand-primary focus:outline-hidden focus-visible:ring-2 focus-visible:ring-offset focus-visible:ring-[var(--focus-ring)] disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:border-brand-primary\",\n className\n )}\n ref={setRefs}\n {...props}\n >\n <AnimatePresence>\n {isChecked && (\n <motion.div\n animate={{ scale: 2, opacity: 0 }}\n className=\"absolute inset-0 z-0 rounded-full bg-brand-primary\"\n exit={{ scale: 0, opacity: 0 }}\n initial={{ scale: 0, opacity: 0.5 }}\n transition={{ duration: 0.4 }}\n />\n )}\n </AnimatePresence>\n <motion.div\n animate={isChecked ? { scale: 1.1 } : { scale: 1 }}\n className=\"relative\"\n transition={{ type: \"spring\", stiffness: 300, damping: 20 }}\n >\n <RadioGroupPrimitive.Indicator className=\"flex items-center justify-center\">\n <Circle className=\"size-2.5 fill-current text-current\" />\n </RadioGroupPrimitive.Indicator>\n </motion.div>\n </RadioGroupPrimitive.Item>\n );\n};\n\nexport { RadioGroup, RadioGroupItem };\n"],
5
5
  "mappings": "AA6CE,cAwDE,YAxDF;AAfF,SAAS,cAAc;AACvB,SAAS,iBAAiB,cAAc;AACxC,SAAS,cAAc,2BAA2B;AAElD,YAAY,WAAW;AAEvB,SAAS,UAAU;AAQnB,MAAM,aAAa,CAAC,EAAE,WAAW,KAAK,GAAG,MAAM,MAC7C;AAAA,EAAC,oBAAoB;AAAA,EAApB;AAAA,IACC,WAAW,GAAG,cAAc,SAAS;AAAA,IACpC,GAAG;AAAA,IACJ;AAAA;AACF;AASF,MAAM,iBAAiB,CAAC,EAAE,WAAW,KAAK,GAAG,MAAM,MAA2B;AAC5E,QAAM,CAAC,WAAW,YAAY,IAAI,MAAM,SAAS,KAAK;AACtD,QAAM,UAAU,MAAM,OAAiC,IAAI;AAE3D,QAAM,UAAU,MAAM;AACpB,UAAM,WAAW,IAAI,iBAAiB,CAAC,cAAc;AACnD,gBAAU,QAAQ,CAAC,aAAa;AAC9B,YACE,SAAS,SAAS,gBAClB,SAAS,kBAAkB,cAC3B;AACA,gBAAM,WAAW,QAAQ,SAAS,aAAa,YAAY;AAE3D,uBAAa,aAAa,SAAS;AAAA,QACrC;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,QAAI,QAAQ,SAAS;AACnB,eAAS,QAAQ,QAAQ,SAAS,EAAE,YAAY,KAAK,CAAC;AAAA,IACxD;AAEA,WAAO,MAAM;AACX,eAAS,WAAW;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,CAAC;AAGL,QAAM,UAAU,MAAM;AAAA,IACpB,CAAC,YAAsC;AACrC,cAAQ,UAAU;AAGlB,UAAI,OAAO,QAAQ,YAAY;AAC7B,YAAI,OAAO;AAAA,MACb,WAAW,OAAO,aAAa,KAAK;AAClC,YAAI,UAAU;AAAA,MAChB;AAAA,IACF;AAAA,IACA,CAAC,GAAG;AAAA,EACN;AAEA,SACE;AAAA,IAAC,oBAAoB;AAAA,IAApB;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACJ,GAAG;AAAA,MAEJ;AAAA,4BAAC,mBACE,uBACC;AAAA,UAAC,OAAO;AAAA,UAAP;AAAA,YACC,SAAS,EAAE,OAAO,GAAG,SAAS,EAAE;AAAA,YAChC,WAAU;AAAA,YACV,MAAM,EAAE,OAAO,GAAG,SAAS,EAAE;AAAA,YAC7B,SAAS,EAAE,OAAO,GAAG,SAAS,IAAI;AAAA,YAClC,YAAY,EAAE,UAAU,IAAI;AAAA;AAAA,QAC9B,GAEJ;AAAA,QACA;AAAA,UAAC,OAAO;AAAA,UAAP;AAAA,YACC,SAAS,YAAY,EAAE,OAAO,IAAI,IAAI,EAAE,OAAO,EAAE;AAAA,YACjD,WAAU;AAAA,YACV,YAAY,EAAE,MAAM,UAAU,WAAW,KAAK,SAAS,GAAG;AAAA,YAE1D,8BAAC,oBAAoB,WAApB,EAA8B,WAAU,oCACvC,8BAAC,UAAO,WAAU,sCAAqC,GACzD;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,33 @@
1
+ import { ScrollArea as ScrollAreaPrimitive } from "radix-ui";
2
+ import type { Ref } from "react";
3
+ import * as React from "react";
4
+ /** Styled scrollbar component for vertical or horizontal scrolling. */
5
+ declare const ScrollBar: ({ className, orientation, ref, ...props }: React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar> & {
6
+ ref?: Ref<React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>>;
7
+ }) => import("react/jsx-runtime").JSX.Element;
8
+ /**
9
+ * Props for FadeAway gradient overlay.
10
+ * @property direction - Edge to show fade: `"top"`, `"bottom"`, `"right"`, or `"left"`
11
+ * @property show - Whether the fade is visible
12
+ */
13
+ interface FadeAwayProps extends React.HTMLAttributes<HTMLDivElement> {
14
+ direction: "top" | "bottom" | "right" | "left";
15
+ show: boolean;
16
+ }
17
+ declare const FadeAway: ({ className, direction, show, ref, ...props }: FadeAwayProps & {
18
+ ref?: Ref<HTMLDivElement>;
19
+ }) => import("react/jsx-runtime").JSX.Element;
20
+ /**
21
+ * Props for ScrollArea component.
22
+ * @property fadeAway - Show fade gradients: `true` (all edges), `"top"`, `"bottom"`, `"y"`, `"left"`, `"right"`, `"x"`
23
+ * @property hideScrollBar - Hide the scrollbar while keeping functionality
24
+ */
25
+ interface ScrollAreaProps extends React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root> {
26
+ fadeAway?: boolean | "top" | "bottom" | "y" | "left" | "right" | "x";
27
+ hideScrollBar?: boolean;
28
+ }
29
+ declare const ScrollArea: ({ className, children, fadeAway, hideScrollBar, ref, ...props }: ScrollAreaProps & {
30
+ ref?: Ref<React.ElementRef<typeof ScrollAreaPrimitive.Root>>;
31
+ }) => import("react/jsx-runtime").JSX.Element;
32
+ export { FadeAway, ScrollArea, type ScrollAreaProps, ScrollBar };
33
+ //# sourceMappingURL=scroll-area.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scroll-area.d.ts","sourceRoot":"","sources":["../../src/components/scroll-area.tsx"],"names":[],"mappings":"AA8BA,OAAO,EAAE,UAAU,IAAI,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,uEAAuE;AACvE,QAAA,MAAM,SAAS,GAAI,2CAKhB,KAAK,CAAC,wBAAwB,CAC/B,OAAO,mBAAmB,CAAC,mBAAmB,CAC/C,GAAG;IACF,GAAG,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,mBAAmB,CAAC,mBAAmB,CAAC,CAAC,CAAC;CAC7E,4CAgBA,CAAC;AAEF;;;;GAIG;AACH,UAAU,aAAc,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IAClE,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;IAC/C,IAAI,EAAE,OAAO,CAAC;CACf;AAED,QAAA,MAAM,QAAQ,GAAI,+CAMf,aAAa,GAAG;IAAE,GAAG,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAA;CAAE,4CAmB/C,CAAC;AAEF;;;;GAIG;AACH,UAAU,eACR,SAAQ,KAAK,CAAC,wBAAwB,CAAC,OAAO,mBAAmB,CAAC,IAAI,CAAC;IACvE,QAAQ,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,QAAQ,GAAG,GAAG,GAAG,MAAM,GAAG,OAAO,GAAG,GAAG,CAAC;IACrE,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AA0ED,QAAA,MAAM,UAAU,GAAI,iEAOjB,eAAe,GAAG;IACnB,GAAG,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;CAC9D,4CA2CA,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,SAAS,EAAE,CAAC"}