@brijbyte/agentic-ui 0.0.3 → 0.0.4

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 (201) hide show
  1. package/README.md +132 -35
  2. package/dist/accordion/accordion.d.ts +14 -0
  3. package/dist/accordion/accordion.d.ts.map +1 -1
  4. package/dist/accordion/accordion.js +5 -0
  5. package/dist/accordion/accordion.js.map +1 -1
  6. package/dist/alert-dialog/alert-dialog.d.ts +11 -0
  7. package/dist/alert-dialog/alert-dialog.d.ts.map +1 -1
  8. package/dist/alert-dialog/alert-dialog.js +5 -0
  9. package/dist/alert-dialog/alert-dialog.js.map +1 -1
  10. package/dist/badge/badge.d.ts +6 -0
  11. package/dist/badge/badge.d.ts.map +1 -1
  12. package/dist/badge/badge.js +4 -0
  13. package/dist/badge/badge.js.map +1 -1
  14. package/dist/button/button.d.ts +12 -1
  15. package/dist/button/button.d.ts.map +1 -1
  16. package/dist/button/button.js +5 -0
  17. package/dist/button/button.js.map +1 -1
  18. package/dist/card/card.d.ts +10 -0
  19. package/dist/card/card.d.ts.map +1 -1
  20. package/dist/card/card.js +7 -0
  21. package/dist/card/card.js.map +1 -1
  22. package/dist/checkbox/checkbox.d.ts +13 -0
  23. package/dist/checkbox/checkbox.d.ts.map +1 -1
  24. package/dist/checkbox/checkbox.js +4 -0
  25. package/dist/checkbox/checkbox.js.map +1 -1
  26. package/dist/collapsible/collapsible.d.ts +11 -0
  27. package/dist/collapsible/collapsible.d.ts.map +1 -1
  28. package/dist/collapsible/collapsible.js +5 -0
  29. package/dist/collapsible/collapsible.js.map +1 -1
  30. package/dist/context-menu/context-menu.d.ts +5 -0
  31. package/dist/context-menu/context-menu.d.ts.map +1 -1
  32. package/dist/context-menu/context-menu.js +4 -0
  33. package/dist/context-menu/context-menu.js.map +1 -1
  34. package/dist/dialog/dialog.d.ts +13 -1
  35. package/dist/dialog/dialog.d.ts.map +1 -1
  36. package/dist/dialog/dialog.js +6 -0
  37. package/dist/dialog/dialog.js.map +1 -1
  38. package/dist/drawer/drawer.d.ts +11 -0
  39. package/dist/drawer/drawer.d.ts.map +1 -1
  40. package/dist/drawer/drawer.js +5 -0
  41. package/dist/drawer/drawer.js.map +1 -1
  42. package/dist/index.css +1681 -1251
  43. package/dist/index.d.ts +19 -10
  44. package/dist/index.js +14 -1
  45. package/dist/input/input.d.ts +8 -0
  46. package/dist/input/input.d.ts.map +1 -1
  47. package/dist/input/input.js +5 -0
  48. package/dist/input/input.js.map +1 -1
  49. package/dist/menu/menu.css +3 -8
  50. package/dist/menu/menu.d.ts +11 -4
  51. package/dist/menu/menu.d.ts.map +1 -1
  52. package/dist/menu/menu.js +10 -24
  53. package/dist/menu/menu.js.map +1 -1
  54. package/dist/menu/menu.module.js +1 -1
  55. package/dist/menu/menu.module.js.map +1 -1
  56. package/dist/meter/circular-meter.d.ts +48 -0
  57. package/dist/meter/circular-meter.d.ts.map +1 -0
  58. package/dist/meter/circular-meter.js +86 -0
  59. package/dist/meter/circular-meter.js.map +1 -0
  60. package/dist/meter/index.d.ts +4 -0
  61. package/dist/meter/index.js +5 -0
  62. package/dist/meter/meter.css +152 -0
  63. package/dist/meter/meter.d.ts +58 -0
  64. package/dist/meter/meter.d.ts.map +1 -0
  65. package/dist/meter/meter.js +50 -0
  66. package/dist/meter/meter.js.map +1 -0
  67. package/dist/meter/meter.module.css.d.ts +2 -0
  68. package/dist/meter/meter.module.js +27 -0
  69. package/dist/meter/meter.module.js.map +1 -0
  70. package/dist/meter/meterState.js +18 -0
  71. package/dist/meter/meterState.js.map +1 -0
  72. package/dist/meter/parts.d.ts +31 -0
  73. package/dist/meter/parts.d.ts.map +1 -0
  74. package/dist/meter/parts.js +56 -0
  75. package/dist/meter/parts.js.map +1 -0
  76. package/dist/number-field/number-field.d.ts +16 -0
  77. package/dist/number-field/number-field.d.ts.map +1 -1
  78. package/dist/number-field/number-field.js +4 -0
  79. package/dist/number-field/number-field.js.map +1 -1
  80. package/dist/popover/index.d.ts +3 -0
  81. package/dist/popover/index.js +4 -0
  82. package/dist/popover/parts.d.ts +43 -0
  83. package/dist/popover/parts.d.ts.map +1 -0
  84. package/dist/popover/parts.js +96 -0
  85. package/dist/popover/parts.js.map +1 -0
  86. package/dist/popover/popover.css +173 -0
  87. package/dist/popover/popover.d.ts +49 -0
  88. package/dist/popover/popover.d.ts.map +1 -0
  89. package/dist/popover/popover.js +68 -0
  90. package/dist/popover/popover.js.map +1 -0
  91. package/dist/popover/popover.module.css.d.ts +2 -0
  92. package/dist/popover/popover.module.js +16 -0
  93. package/dist/popover/popover.module.js.map +1 -0
  94. package/dist/progress/progress.d.ts +11 -0
  95. package/dist/progress/progress.d.ts.map +1 -1
  96. package/dist/progress/progress.js +5 -0
  97. package/dist/progress/progress.js.map +1 -1
  98. package/dist/radio/index.d.ts +3 -0
  99. package/dist/radio/index.js +4 -0
  100. package/dist/radio/parts.d.ts +18 -0
  101. package/dist/radio/parts.d.ts.map +1 -0
  102. package/dist/radio/parts.js +42 -0
  103. package/dist/radio/parts.js.map +1 -0
  104. package/dist/radio/radio.css +84 -0
  105. package/dist/radio/radio.d.ts +31 -0
  106. package/dist/radio/radio.d.ts.map +1 -0
  107. package/dist/radio/radio.js +33 -0
  108. package/dist/radio/radio.js.map +1 -0
  109. package/dist/radio/radio.module.css.d.ts +2 -0
  110. package/dist/radio/radio.module.js +11 -0
  111. package/dist/radio/radio.module.js.map +1 -0
  112. package/dist/radio-group/index.d.ts +3 -0
  113. package/dist/radio-group/index.js +4 -0
  114. package/dist/radio-group/parts.d.ts +13 -0
  115. package/dist/radio-group/parts.d.ts.map +1 -0
  116. package/dist/radio-group/parts.js +31 -0
  117. package/dist/radio-group/parts.js.map +1 -0
  118. package/dist/radio-group/radio-group.css +17 -0
  119. package/dist/radio-group/radio-group.d.ts +37 -0
  120. package/dist/radio-group/radio-group.d.ts.map +1 -0
  121. package/dist/radio-group/radio-group.js +28 -0
  122. package/dist/radio-group/radio-group.js.map +1 -0
  123. package/dist/radio-group/radio-group.module.css.d.ts +2 -0
  124. package/dist/radio-group/radio-group.module.js +9 -0
  125. package/dist/radio-group/radio-group.module.js.map +1 -0
  126. package/dist/select/select.d.ts +14 -1
  127. package/dist/select/select.d.ts.map +1 -1
  128. package/dist/select/select.js +4 -0
  129. package/dist/select/select.js.map +1 -1
  130. package/dist/separator/separator.d.ts +4 -0
  131. package/dist/separator/separator.d.ts.map +1 -1
  132. package/dist/separator/separator.js +4 -0
  133. package/dist/separator/separator.js.map +1 -1
  134. package/dist/shared/PopupArrow.js +22 -0
  135. package/dist/shared/PopupArrow.js.map +1 -0
  136. package/dist/slider/slider.d.ts +18 -0
  137. package/dist/slider/slider.d.ts.map +1 -1
  138. package/dist/slider/slider.js +6 -0
  139. package/dist/slider/slider.js.map +1 -1
  140. package/dist/switch/switch.css +11 -2
  141. package/dist/switch/switch.d.ts +12 -0
  142. package/dist/switch/switch.d.ts.map +1 -1
  143. package/dist/switch/switch.js +4 -0
  144. package/dist/switch/switch.js.map +1 -1
  145. package/dist/switch/switch.module.js.map +1 -1
  146. package/dist/tabs/tabs.d.ts +8 -1
  147. package/dist/tabs/tabs.d.ts.map +1 -1
  148. package/dist/tabs/tabs.js +4 -0
  149. package/dist/tabs/tabs.js.map +1 -1
  150. package/dist/toast/toast.d.ts +11 -0
  151. package/dist/toast/toast.d.ts.map +1 -1
  152. package/dist/toast/toast.js +8 -0
  153. package/dist/toast/toast.js.map +1 -1
  154. package/dist/tooltip/tooltip.d.ts +9 -0
  155. package/dist/tooltip/tooltip.d.ts.map +1 -1
  156. package/dist/tooltip/tooltip.js +4 -0
  157. package/dist/tooltip/tooltip.js.map +1 -1
  158. package/package.json +22 -2
  159. package/src/accordion/accordion.tsx +14 -0
  160. package/src/alert-dialog/alert-dialog.tsx +11 -0
  161. package/src/badge/badge.tsx +6 -0
  162. package/src/button/button.tsx +12 -1
  163. package/src/card/card.tsx +10 -0
  164. package/src/checkbox/checkbox.tsx +13 -0
  165. package/src/collapsible/collapsible.tsx +11 -0
  166. package/src/context-menu/context-menu.tsx +5 -0
  167. package/src/dialog/dialog.tsx +13 -1
  168. package/src/drawer/drawer.tsx +11 -0
  169. package/src/index.ts +4 -0
  170. package/src/input/input.tsx +8 -0
  171. package/src/menu/menu.module.css +3 -10
  172. package/src/menu/menu.tsx +13 -26
  173. package/src/meter/circular-meter.tsx +114 -0
  174. package/src/meter/index.ts +9 -0
  175. package/src/meter/meter.module.css +162 -0
  176. package/src/meter/meter.tsx +86 -0
  177. package/src/meter/meterState.ts +29 -0
  178. package/src/meter/parts.tsx +72 -0
  179. package/src/number-field/number-field.tsx +16 -0
  180. package/src/popover/index.ts +14 -0
  181. package/src/popover/parts.tsx +120 -0
  182. package/src/popover/popover.module.css +189 -0
  183. package/src/popover/popover.tsx +80 -0
  184. package/src/progress/progress.tsx +11 -0
  185. package/src/radio/index.ts +6 -0
  186. package/src/radio/parts.tsx +43 -0
  187. package/src/radio/radio.module.css +96 -0
  188. package/src/radio/radio.tsx +37 -0
  189. package/src/radio-group/index.ts +5 -0
  190. package/src/radio-group/parts.tsx +32 -0
  191. package/src/radio-group/radio-group.module.css +17 -0
  192. package/src/radio-group/radio-group.tsx +63 -0
  193. package/src/select/select.tsx +14 -1
  194. package/src/separator/separator.tsx +4 -0
  195. package/src/shared/PopupArrow.tsx +41 -0
  196. package/src/slider/slider.tsx +18 -0
  197. package/src/switch/switch.module.css +11 -2
  198. package/src/switch/switch.tsx +12 -0
  199. package/src/tabs/tabs.tsx +8 -1
  200. package/src/toast/toast.tsx +11 -0
  201. package/src/tooltip/tooltip.tsx +9 -0
@@ -7,11 +7,14 @@
7
7
  display: flex;
8
8
  }
9
9
 
10
- .root_3hDtBa[data-disabled] {
11
- opacity: .44;
10
+ .root_3hDtBa:has([data-disabled]) {
12
11
  cursor: not-allowed;
13
12
  }
14
13
 
14
+ .root_3hDtBa:has([data-disabled]) .label_3hDtBa {
15
+ opacity: .44;
16
+ }
17
+
15
18
  .thumb-track_3hDtBa {
16
19
  border-radius: var(--radius-full);
17
20
  background-color: var(--color-surface-3);
@@ -26,6 +29,12 @@
26
29
  position: relative;
27
30
  }
28
31
 
32
+ .thumb-track_3hDtBa[data-disabled] {
33
+ opacity: .44;
34
+ cursor: not-allowed;
35
+ pointer-events: none;
36
+ }
37
+
29
38
  .thumb-track_3hDtBa:focus-visible {
30
39
  box-shadow: var(--shadow-focus);
31
40
  }
@@ -4,18 +4,30 @@ import styles from "./switch.module.css";
4
4
 
5
5
  //#region src/switch/switch.d.ts
6
6
  interface SwitchProps {
7
+ /** Controlled checked state. */
7
8
  checked?: boolean;
9
+ /** Initial checked state (uncontrolled). */
8
10
  defaultChecked?: boolean;
11
+ /** Prevent interaction. */
9
12
  disabled?: boolean;
13
+ /** Mark the field as required for form validation. */
10
14
  required?: boolean;
15
+ /** HTML name attribute for form submission. */
11
16
  name?: string;
17
+ /** HTML value attribute for form submission. */
12
18
  value?: string;
13
19
  /** Called when checked state changes. `eventDetails` is the base-ui event details object. */
14
20
  onCheckedChange?: (checked: boolean, eventDetails: unknown) => void;
21
+ /** Label content rendered next to the switch. */
15
22
  children?: ReactNode;
23
+ /** Override the auto-generated element id. */
16
24
  id?: string;
17
25
  className?: string;
18
26
  }
27
+ /**
28
+ * Toggle for boolean settings. Renders a track with a sliding thumb and
29
+ * an optional label. Wraps `@base-ui/react` Switch.
30
+ */
19
31
  declare function Switch({
20
32
  children,
21
33
  id,
@@ -1 +1 @@
1
- {"version":3,"file":"switch.d.ts","names":[],"sources":["../../src/switch/switch.tsx"],"mappings":";;;;;UAKiB,WAAA;EACf,OAAA;EACA,cAAA;EACA,QAAA;EACA,QAAA;EACA,IAAA;EACA,KAAA;EALA;EAOA,eAAA,IAAmB,OAAA,WAAkB,YAAA;EACrC,QAAA,GAAW,SAAA;EACX,EAAA;EACA,SAAA;AAAA;AAAA,iBAGc,MAAA,CAAA;EAAS,QAAA;EAAU,EAAA;EAAI,SAAA;EAAW,eAAA;EAAA,GAAoB;AAAA,GAAS,WAAA,GAAW,kBAAA,CAAA,GAAA,CAAA,OAAA"}
1
+ {"version":3,"file":"switch.d.ts","names":[],"sources":["../../src/switch/switch.tsx"],"mappings":";;;;;UAKiB,WAAA;;EAEf,OAAA;EAFe;EAIf,cAAA;;EAEA,QAAA;EAJA;EAMA,QAAA;EAFA;EAIA,IAAA;EAAA;EAEA,KAAA;EAEA;EAAA,eAAA,IAAmB,OAAA,WAAkB,YAAA;EAAA;EAErC,QAAA,GAAW,SAAA;EAAA;EAEX,EAAA;EACA,SAAA;AAAA;;AAOF;;;iBAAgB,MAAA,CAAA;EAAS,QAAA;EAAU,EAAA;EAAI,SAAA;EAAW,eAAA;EAAA,GAAoB;AAAA,GAAS,WAAA,GAAW,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -3,6 +3,10 @@ import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useId } from "react";
4
4
  import { Switch } from "@base-ui/react/switch";
5
5
  //#region src/switch/switch.tsx
6
+ /**
7
+ * Toggle for boolean settings. Renders a track with a sliding thumb and
8
+ * an optional label. Wraps `@base-ui/react` Switch.
9
+ */
6
10
  function Switch$1({ children, id, className, onCheckedChange, ...props }) {
7
11
  const switchId = id ?? useId();
8
12
  return /* @__PURE__ */ jsxs("label", {
@@ -1 +1 @@
1
- {"version":3,"file":"switch.js","names":["Switch","styles","BaseSwitch"],"sources":["../../src/switch/switch.tsx"],"sourcesContent":["import { useId } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { Switch as BaseSwitch } from \"@base-ui/react/switch\";\nimport styles from \"./switch.module.css\";\n\nexport interface SwitchProps {\n checked?: boolean;\n defaultChecked?: boolean;\n disabled?: boolean;\n required?: boolean;\n name?: string;\n value?: string;\n /** Called when checked state changes. `eventDetails` is the base-ui event details object. */\n onCheckedChange?: (checked: boolean, eventDetails: unknown) => void;\n children?: ReactNode;\n id?: string;\n className?: string;\n}\n\nexport function Switch({ children, id, className, onCheckedChange, ...props }: SwitchProps) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const switchId = id ?? useId();\n\n return (\n <label className={`${styles.root} ${className ?? \"\"}`} htmlFor={switchId}>\n <BaseSwitch.Root id={switchId} className={styles[\"thumb-track\"]} onCheckedChange={onCheckedChange as never} {...props}>\n <BaseSwitch.Thumb className={styles.thumb} />\n </BaseSwitch.Root>\n {children && <span className={styles.label}>{children}</span>}\n </label>\n );\n}\nexport { styles as SwitchStyles };\n"],"mappings":";;;;;AAmBA,SAAgBA,SAAO,EAAE,UAAU,IAAI,WAAW,iBAAiB,GAAG,SAAsB;CAE1F,MAAM,WAAW,MAAM,OAAO;AAE9B,QACE,qBAAC,SAAD;EAAO,WAAW,GAAGC,sBAAO,KAAK,GAAG,aAAa;EAAM,SAAS;YAAhE,CACE,oBAACC,OAAW,MAAZ;GAAiB,IAAI;GAAU,WAAWD,sBAAO;GAAiC;GAA0B,GAAI;aAC9G,oBAACC,OAAW,OAAZ,EAAkB,WAAWD,sBAAO,OAAS,CAAA;GAC7B,CAAA,EACjB,YAAY,oBAAC,QAAD;GAAM,WAAWA,sBAAO;GAAQ;GAAgB,CAAA,CACvD"}
1
+ {"version":3,"file":"switch.js","names":["Switch","styles","BaseSwitch"],"sources":["../../src/switch/switch.tsx"],"sourcesContent":["import { useId } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { Switch as BaseSwitch } from \"@base-ui/react/switch\";\nimport styles from \"./switch.module.css\";\n\nexport interface SwitchProps {\n /** Controlled checked state. */\n checked?: boolean;\n /** Initial checked state (uncontrolled). */\n defaultChecked?: boolean;\n /** Prevent interaction. */\n disabled?: boolean;\n /** Mark the field as required for form validation. */\n required?: boolean;\n /** HTML name attribute for form submission. */\n name?: string;\n /** HTML value attribute for form submission. */\n value?: string;\n /** Called when checked state changes. `eventDetails` is the base-ui event details object. */\n onCheckedChange?: (checked: boolean, eventDetails: unknown) => void;\n /** Label content rendered next to the switch. */\n children?: ReactNode;\n /** Override the auto-generated element id. */\n id?: string;\n className?: string;\n}\n\n/**\n * Toggle for boolean settings. Renders a track with a sliding thumb and\n * an optional label. Wraps `@base-ui/react` Switch.\n */\nexport function Switch({ children, id, className, onCheckedChange, ...props }: SwitchProps) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const switchId = id ?? useId();\n\n return (\n <label className={`${styles.root} ${className ?? \"\"}`} htmlFor={switchId}>\n <BaseSwitch.Root id={switchId} className={styles[\"thumb-track\"]} onCheckedChange={onCheckedChange as never} {...props}>\n <BaseSwitch.Thumb className={styles.thumb} />\n </BaseSwitch.Root>\n {children && <span className={styles.label}>{children}</span>}\n </label>\n );\n}\nexport { styles as SwitchStyles };\n"],"mappings":";;;;;;;;;AA+BA,SAAgBA,SAAO,EAAE,UAAU,IAAI,WAAW,iBAAiB,GAAG,SAAsB;CAE1F,MAAM,WAAW,MAAM,OAAO;AAE9B,QACE,qBAAC,SAAD;EAAO,WAAW,GAAGC,sBAAO,KAAK,GAAG,aAAa;EAAM,SAAS;YAAhE,CACE,oBAACC,OAAW,MAAZ;GAAiB,IAAI;GAAU,WAAWD,sBAAO;GAAiC;GAA0B,GAAI;aAC9G,oBAACC,OAAW,OAAZ,EAAkB,WAAWD,sBAAO,OAAS,CAAA;GAC7B,CAAA,EACjB,YAAY,oBAAC,QAAD;GAAM,WAAWA,sBAAO;GAAQ;GAAgB,CAAA,CACvD"}
@@ -1 +1 @@
1
- {"version":3,"file":"switch.module.js","names":[],"sources":["../../src/switch/switch.module.css"],"sourcesContent":["@layer components {\n .root {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n cursor: pointer;\n user-select: none;\n }\n .root[data-disabled] {\n opacity: 0.44;\n cursor: not-allowed;\n }\n .thumb-track {\n position: relative;\n width: 36px;\n height: 20px;\n border-radius: var(--radius-full);\n background-color: var(--color-surface-3);\n border: var(--border-width-base) solid var(--color-line);\n transition:\n background-color var(--duration-normal) var(--easing-standard),\n border-color var(--duration-normal) var(--easing-standard),\n box-shadow var(--duration-fast) var(--easing-standard);\n outline: none;\n flex-shrink: 0;\n }\n .thumb-track:focus-visible {\n box-shadow: var(--shadow-focus);\n }\n .thumb-track[data-checked] {\n background-color: var(--color-accent);\n border-color: var(--color-accent);\n }\n .thumb-track[data-checked]:hover {\n background-color: var(--color-accent-hover);\n border-color: var(--color-accent-hover);\n }\n .thumb {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 14px;\n height: 14px;\n border-radius: var(--radius-full);\n background-color: #ffffff;\n box-shadow: var(--shadow-xs);\n transition: transform var(--duration-normal) var(--easing-spring);\n }\n .thumb-track[data-checked] .thumb {\n transform: translateX(16px);\n }\n .label {\n font-family: var(--font-mono);\n font-size: var(--font-size-sm);\n color: var(--color-primary);\n }\n}\n"],"mappings":";AAQA,IAAA,wBAAa;CAAA,SAAU;CAAA,QAAA;CAAA,SAAA;CAAA,eAAA;CAAA"}
1
+ {"version":3,"file":"switch.module.js","names":[],"sources":["../../src/switch/switch.module.css"],"sourcesContent":["@layer components {\n .root {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n cursor: pointer;\n user-select: none;\n }\n /* data-disabled lives on the inner button, not the label wrapper.\n Use :has() to dim the label text, and target the track directly. */\n .root:has([data-disabled]) {\n cursor: not-allowed;\n }\n .root:has([data-disabled]) .label {\n opacity: 0.44;\n }\n .thumb-track {\n position: relative;\n width: 36px;\n height: 20px;\n border-radius: var(--radius-full);\n background-color: var(--color-surface-3);\n border: var(--border-width-base) solid var(--color-line);\n transition:\n background-color var(--duration-normal) var(--easing-standard),\n border-color var(--duration-normal) var(--easing-standard),\n box-shadow var(--duration-fast) var(--easing-standard);\n outline: none;\n flex-shrink: 0;\n }\n .thumb-track[data-disabled] {\n opacity: 0.44;\n cursor: not-allowed;\n pointer-events: none;\n }\n .thumb-track:focus-visible {\n box-shadow: var(--shadow-focus);\n }\n .thumb-track[data-checked] {\n background-color: var(--color-accent);\n border-color: var(--color-accent);\n }\n .thumb-track[data-checked]:hover {\n background-color: var(--color-accent-hover);\n border-color: var(--color-accent-hover);\n }\n .thumb {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 14px;\n height: 14px;\n border-radius: var(--radius-full);\n background-color: #ffffff;\n box-shadow: var(--shadow-xs);\n transition: transform var(--duration-normal) var(--easing-spring);\n }\n .thumb-track[data-checked] .thumb {\n transform: translateX(16px);\n }\n .label {\n font-family: var(--font-mono);\n font-size: var(--font-size-sm);\n color: var(--color-primary);\n }\n}\n"],"mappings":";AAQA,IAAA,wBAAU;CAAA,SAAc;CAAc,QAAQ;CAAc,SAAO;CAAA,eAAA;CAAA"}
@@ -11,13 +11,20 @@ interface TabItem {
11
11
  icon?: ReactNode;
12
12
  }
13
13
  interface TabsProps {
14
+ /** Array of tab definitions to render. */
14
15
  items: TabItem[];
16
+ /** Currently active tab value (controlled). */
15
17
  value?: string;
18
+ /** Initially active tab value (uncontrolled). Defaults to the first item. */
16
19
  defaultValue?: string;
17
- /** `eventDetails` is the base-ui event details object. */
20
+ /** Called when the active tab changes. `eventDetails` is the base-ui event details object. */
18
21
  onValueChange?: (value: unknown, eventDetails: unknown) => void;
19
22
  className?: string;
20
23
  }
24
+ /**
25
+ * Tab navigation for switching between content panels. Each tab can have
26
+ * an optional icon and can be individually disabled.
27
+ */
21
28
  declare function Tabs({
22
29
  items,
23
30
  className,
@@ -1 +1 @@
1
- {"version":3,"file":"tabs.d.ts","names":[],"sources":["../../src/tabs/tabs.tsx"],"mappings":";;;;;UAIiB,OAAA;EACf,KAAA;EACA,KAAA,EAAO,SAAA;EACP,OAAA,EAAS,SAAA;EACT,QAAA;EACA,IAAA,GAAO,SAAA;AAAA;AAAA,UAGQ,SAAA;EACf,KAAA,EAAO,OAAA;EACP,KAAA;EACA,YAAA;EAVA;EAYA,aAAA,IAAiB,KAAA,WAAgB,YAAA;EACjC,SAAA;AAAA;AAAA,iBAGc,IAAA,CAAA;EAAO,KAAA;EAAO,SAAA;EAAA,GAAc;AAAA,GAAS,SAAA,GAAS,kBAAA,CAAA,GAAA,CAAA,OAAA"}
1
+ {"version":3,"file":"tabs.d.ts","names":[],"sources":["../../src/tabs/tabs.tsx"],"mappings":";;;;;UAIiB,OAAA;EACf,KAAA;EACA,KAAA,EAAO,SAAA;EACP,OAAA,EAAS,SAAA;EACT,QAAA;EACA,IAAA,GAAO,SAAA;AAAA;AAAA,UAGQ,SAAA;EAHR;EAKP,KAAA,EAAO,OAAA;EALS;EAOhB,KAAA;EAVA;EAYA,YAAA;EAXA;EAaA,aAAA,IAAiB,KAAA,WAAgB,YAAA;EACjC,SAAA;AAAA;;;;AATF;iBAgBgB,IAAA,CAAA;EAAO,KAAA;EAAO,SAAA;EAAA,GAAc;AAAA,GAAS,SAAA,GAAS,kBAAA,CAAA,GAAA,CAAA,OAAA"}
package/dist/tabs/tabs.js CHANGED
@@ -2,6 +2,10 @@ import tabs_module_default from "./tabs.module.js";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { Tabs } from "@base-ui/react/tabs";
4
4
  //#region src/tabs/tabs.tsx
5
+ /**
6
+ * Tab navigation for switching between content panels. Each tab can have
7
+ * an optional icon and can be individually disabled.
8
+ */
5
9
  function Tabs$1({ items, className, ...props }) {
6
10
  const defaultVal = props.defaultValue ?? items[0]?.value;
7
11
  return /* @__PURE__ */ jsxs(Tabs.Root, {
@@ -1 +1 @@
1
- {"version":3,"file":"tabs.js","names":["Tabs","BaseTabs","styles"],"sources":["../../src/tabs/tabs.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Tabs as BaseTabs } from \"@base-ui/react/tabs\";\nimport styles from \"./tabs.module.css\";\n\nexport interface TabItem {\n value: string;\n label: ReactNode;\n content: ReactNode;\n disabled?: boolean;\n icon?: ReactNode;\n}\n\nexport interface TabsProps {\n items: TabItem[];\n value?: string;\n defaultValue?: string;\n /** `eventDetails` is the base-ui event details object. */\n onValueChange?: (value: unknown, eventDetails: unknown) => void;\n className?: string;\n}\n\nexport function Tabs({ items, className, ...props }: TabsProps) {\n const defaultVal = props.defaultValue ?? items[0]?.value;\n\n return (\n <BaseTabs.Root\n className={`${styles.root} ${className ?? \"\"}`}\n defaultValue={defaultVal}\n onValueChange={props.onValueChange as never}\n value={props.value}\n >\n <BaseTabs.List className={styles.list}>\n {items.map((item) => (\n <BaseTabs.Tab key={item.value} value={item.value} disabled={item.disabled} className={styles.tab}>\n {item.icon}\n {item.label}\n </BaseTabs.Tab>\n ))}\n </BaseTabs.List>\n {items.map((item) => (\n <BaseTabs.Panel key={item.value} value={item.value} className={styles.panel}>\n {item.content}\n </BaseTabs.Panel>\n ))}\n </BaseTabs.Root>\n );\n}\nexport { styles as TabsStyles };\n"],"mappings":";;;;AAqBA,SAAgBA,OAAK,EAAE,OAAO,WAAW,GAAG,SAAoB;CAC9D,MAAM,aAAa,MAAM,gBAAgB,MAAM,IAAI;AAEnD,QACE,qBAACC,KAAS,MAAV;EACE,WAAW,GAAGC,oBAAO,KAAK,GAAG,aAAa;EAC1C,cAAc;EACd,eAAe,MAAM;EACrB,OAAO,MAAM;YAJf,CAME,oBAACD,KAAS,MAAV;GAAe,WAAWC,oBAAO;aAC9B,MAAM,KAAK,SACV,qBAACD,KAAS,KAAV;IAA+B,OAAO,KAAK;IAAO,UAAU,KAAK;IAAU,WAAWC,oBAAO;cAA7F,CACG,KAAK,MACL,KAAK,MACO;MAHI,KAAK,MAGT,CACf;GACY,CAAA,EACf,MAAM,KAAK,SACV,oBAACD,KAAS,OAAV;GAAiC,OAAO,KAAK;GAAO,WAAWC,oBAAO;aACnE,KAAK;GACS,EAFI,KAAK,MAET,CACjB,CACY"}
1
+ {"version":3,"file":"tabs.js","names":["Tabs","BaseTabs","styles"],"sources":["../../src/tabs/tabs.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Tabs as BaseTabs } from \"@base-ui/react/tabs\";\nimport styles from \"./tabs.module.css\";\n\nexport interface TabItem {\n value: string;\n label: ReactNode;\n content: ReactNode;\n disabled?: boolean;\n icon?: ReactNode;\n}\n\nexport interface TabsProps {\n /** Array of tab definitions to render. */\n items: TabItem[];\n /** Currently active tab value (controlled). */\n value?: string;\n /** Initially active tab value (uncontrolled). Defaults to the first item. */\n defaultValue?: string;\n /** Called when the active tab changes. `eventDetails` is the base-ui event details object. */\n onValueChange?: (value: unknown, eventDetails: unknown) => void;\n className?: string;\n}\n\n/**\n * Tab navigation for switching between content panels. Each tab can have\n * an optional icon and can be individually disabled.\n */\nexport function Tabs({ items, className, ...props }: TabsProps) {\n const defaultVal = props.defaultValue ?? items[0]?.value;\n\n return (\n <BaseTabs.Root\n className={`${styles.root} ${className ?? \"\"}`}\n defaultValue={defaultVal}\n onValueChange={props.onValueChange as never}\n value={props.value}\n >\n <BaseTabs.List className={styles.list}>\n {items.map((item) => (\n <BaseTabs.Tab key={item.value} value={item.value} disabled={item.disabled} className={styles.tab}>\n {item.icon}\n {item.label}\n </BaseTabs.Tab>\n ))}\n </BaseTabs.List>\n {items.map((item) => (\n <BaseTabs.Panel key={item.value} value={item.value} className={styles.panel}>\n {item.content}\n </BaseTabs.Panel>\n ))}\n </BaseTabs.Root>\n );\n}\nexport { styles as TabsStyles };\n"],"mappings":";;;;;;;;AA4BA,SAAgBA,OAAK,EAAE,OAAO,WAAW,GAAG,SAAoB;CAC9D,MAAM,aAAa,MAAM,gBAAgB,MAAM,IAAI;AAEnD,QACE,qBAACC,KAAS,MAAV;EACE,WAAW,GAAGC,oBAAO,KAAK,GAAG,aAAa;EAC1C,cAAc;EACd,eAAe,MAAM;EACrB,OAAO,MAAM;YAJf,CAME,oBAACD,KAAS,MAAV;GAAe,WAAWC,oBAAO;aAC9B,MAAM,KAAK,SACV,qBAACD,KAAS,KAAV;IAA+B,OAAO,KAAK;IAAO,UAAU,KAAK;IAAU,WAAWC,oBAAO;cAA7F,CACG,KAAK,MACL,KAAK,MACO;MAHI,KAAK,MAGT,CACf;GACY,CAAA,EACf,MAAM,KAAK,SACV,oBAACD,KAAS,OAAV;GAAiC,OAAO,KAAK;GAAO,WAAWC,oBAAO;aACnE,KAAK;GACS,EAFI,KAAK,MAET,CACjB,CACY"}
@@ -24,16 +24,27 @@ interface ToastViewportProps {
24
24
  }
25
25
  interface ToastProviderProps {
26
26
  children: ReactNode;
27
+ /** Layout style for the viewport. @default "list" */
27
28
  variant?: ToastViewportProps["variant"];
29
+ /** Maximum number of toasts shown at once. */
28
30
  limit?: number;
31
+ /** Auto-dismiss delay in milliseconds. */
29
32
  timeout?: number;
30
33
  }
34
+ /**
35
+ * Drop-in provider that wires limit defaults to the chosen viewport variant.
36
+ * Use this instead of base-ui's `Toast.Provider` when using `ToastViewport`.
37
+ */
31
38
  declare function ToastProvider({
32
39
  children,
33
40
  variant,
34
41
  limit,
35
42
  timeout
36
43
  }: ToastProviderProps): react_jsx_runtime0.JSX.Element;
44
+ /**
45
+ * Renders and manages toast notifications. Supports `"stacked"` (Sonner-style
46
+ * fanned cards) and `"list"` (vertically stacked, each fully visible) layouts.
47
+ */
37
48
  declare function ToastViewport({
38
49
  variant,
39
50
  limit: _limit
@@ -1 +1 @@
1
- {"version":3,"file":"toast.d.ts","names":[],"sources":["../../src/toast/toast.tsx"],"mappings":";;;;;;KAIY,SAAA;AAAA,cAGC,eAAA,SAAe,KAAA,CAAA,eAAA;AAAA,UAgDX,kBAAA;EAnDL;;;;;AAGZ;;EAwDE,OAAA;EAxD0B;;AAgD5B;;;EAcE,KAAA;AAAA;AAAA,UAQe,kBAAA;EACf,QAAA,EAAU,SAAA;EACV,OAAA,GAAU,kBAAA;EACV,KAAA;EACA,OAAA;AAAA;AAAA,iBAYc,aAAA,CAAA;EAAgB,QAAA;EAAU,OAAA;EAAkB,KAAA;EAAO;AAAA,GAAW,kBAAA,GAAkB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAShF,aAAA,CAAA;EAAgB,OAAA;EAAkB,KAAA,EAAO;AAAA,GAAU,kBAAA,GAAkB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
1
+ {"version":3,"file":"toast.d.ts","names":[],"sources":["../../src/toast/toast.tsx"],"mappings":";;;;;;KAIY,SAAA;AAAA,cAGC,eAAA,SAAe,KAAA,CAAA,eAAA;AAAA,UAgDX,kBAAA;EAnDL;;;;;AAGZ;;EAwDE,OAAA;EAxD0B;;AAgD5B;;;EAcE,KAAA;AAAA;AAAA,UAQe,kBAAA;EACf,QAAA,EAAU,SAAA;;EAEV,OAAA,GAAU,kBAAA;EAFV;EAIA,KAAA;EAFA;EAIA,OAAA;AAAA;;;;AAgBF;iBAAgB,aAAA,CAAA;EAAgB,QAAA;EAAU,OAAA;EAAkB,KAAA;EAAO;AAAA,GAAW,kBAAA,GAAkB,kBAAA,CAAA,GAAA,CAAA,OAAA;;;;;iBAahF,aAAA,CAAA;EAAgB,OAAA;EAAkB,KAAA,EAAO;AAAA,GAAU,kBAAA,GAAkB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -118,6 +118,10 @@ const MAX_LIMIT = {
118
118
  stacked: 10,
119
119
  list: 5
120
120
  };
121
+ /**
122
+ * Drop-in provider that wires limit defaults to the chosen viewport variant.
123
+ * Use this instead of base-ui's `Toast.Provider` when using `ToastViewport`.
124
+ */
121
125
  function ToastProvider({ children, variant = "list", limit, timeout }) {
122
126
  const resolvedLimit = Math.min(limit ?? DEFAULT_LIMIT[variant], MAX_LIMIT[variant]);
123
127
  return /* @__PURE__ */ jsx(Toast.Provider, {
@@ -126,6 +130,10 @@ function ToastProvider({ children, variant = "list", limit, timeout }) {
126
130
  children
127
131
  });
128
132
  }
133
+ /**
134
+ * Renders and manages toast notifications. Supports `"stacked"` (Sonner-style
135
+ * fanned cards) and `"list"` (vertically stacked, each fully visible) layouts.
136
+ */
129
137
  function ToastViewport({ variant = "list", limit: _limit }) {
130
138
  const manager = useToastManager();
131
139
  const isStacked = variant === "stacked";
@@ -1 +1 @@
1
- {"version":3,"file":"toast.js","names":["BaseToast","styles"],"sources":["../../src/toast/toast.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Toast as BaseToast } from \"@base-ui/react/toast\";\nimport styles from \"./toast.module.css\";\n\nexport type ToastType = \"default\" | \"success\" | \"warning\" | \"error\" | \"info\";\n\n// Re-export for consumer convenience\nexport const useToastManager = BaseToast.useToastManager;\n\nfunction XIcon() {\n return (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M1 1L9 9M9 1L1 9\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nfunction StatusIcon({ type }: { type: string }) {\n if (type === \"success\") {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" className={`${styles.icon} ${styles[\"icon-success\"]}`}>\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M4.5 8L6.5 10.5L11 5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n }\n if (type === \"error\") {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" className={`${styles.icon} ${styles[\"icon-error\"]}`}>\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M5.5 5.5L10.5 10.5M10.5 5.5L5.5 10.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n );\n }\n if (type === \"warning\") {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" className={`${styles.icon} ${styles[\"icon-warning\"]}`}>\n <path d=\"M8 2L14.5 13H1.5L8 2Z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinejoin=\"round\" />\n <path d=\"M8 6.5V9\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <circle cx=\"8\" cy=\"11\" r=\"0.75\" fill=\"currentColor\" />\n </svg>\n );\n }\n if (type === \"info\") {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" className={`${styles.icon} ${styles[\"icon-info\"]}`}>\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M8 7V11\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <circle cx=\"8\" cy=\"5\" r=\"0.75\" fill=\"currentColor\" />\n </svg>\n );\n }\n return null;\n}\n\nexport interface ToastViewportProps {\n /**\n * \"stacked\" — toasts fan out behind each other like Sonner.\n * Collapsed: only the front toast is fully visible; others peek as\n * scaled-down cards behind it. Hover/focus expands the full stack.\n *\n * \"list\" — toasts stack vertically, each fully visible (default behaviour).\n */\n variant?: \"stacked\" | \"list\";\n /**\n * Maximum number of toasts shown at once.\n * Defaults to 5 for \"stacked\", 3 for \"list\".\n * Oldest toasts are removed when the limit is exceeded.\n */\n limit?: number;\n}\n\nconst DEFAULT_LIMIT: Record<NonNullable<ToastViewportProps[\"variant\"]>, number> = {\n stacked: 5,\n list: 3,\n};\n\nexport interface ToastProviderProps {\n children: ReactNode;\n variant?: ToastViewportProps[\"variant\"];\n limit?: number;\n timeout?: number;\n}\n\n/**\n * Drop-in provider that wires limit defaults to the chosen variant.\n * Use this instead of base-ui's Toast.Provider when using ToastViewport.\n */\nconst MAX_LIMIT: Record<NonNullable<ToastViewportProps[\"variant\"]>, number> = {\n stacked: 10,\n list: 5,\n};\n\nexport function ToastProvider({ children, variant = \"list\", limit, timeout }: ToastProviderProps) {\n const resolvedLimit = Math.min(limit ?? DEFAULT_LIMIT[variant], MAX_LIMIT[variant]);\n return (\n <BaseToast.Provider limit={resolvedLimit} timeout={timeout}>\n {children}\n </BaseToast.Provider>\n );\n}\n\nexport function ToastViewport({ variant = \"list\", limit: _limit }: ToastViewportProps) {\n const manager = useToastManager();\n const isStacked = variant === \"stacked\";\n\n return (\n <BaseToast.Viewport className={`${styles.viewport} ${isStacked ? styles[\"viewport-stacked\"] : styles[\"viewport-list\"]}`}>\n {manager.toasts.map((toast) => (\n <BaseToast.Root\n key={toast.id}\n toast={toast}\n className={`${styles.toast} ${isStacked ? styles[\"toast-stacked\"] : \"\"} ${styles[`toast-${toast.type ?? \"default\"}`]}`}\n swipeDirection={isStacked ? [\"right\", \"down\"] : [\"right\", \"down\"]}\n >\n {toast.type && toast.type !== \"default\" && <StatusIcon type={toast.type} />}\n <div className={styles.content}>\n {toast.title && <BaseToast.Title className={styles.title} />}\n {toast.description && <BaseToast.Description className={styles.description} />}\n </div>\n <BaseToast.Close className={styles.close} aria-label=\"Dismiss\">\n <XIcon />\n </BaseToast.Close>\n </BaseToast.Root>\n ))}\n </BaseToast.Viewport>\n );\n}\nexport { styles as ToastStyles };\n"],"mappings":"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"}
1
+ {"version":3,"file":"toast.js","names":["BaseToast","styles"],"sources":["../../src/toast/toast.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Toast as BaseToast } from \"@base-ui/react/toast\";\nimport styles from \"./toast.module.css\";\n\nexport type ToastType = \"default\" | \"success\" | \"warning\" | \"error\" | \"info\";\n\n// Re-export for consumer convenience\nexport const useToastManager = BaseToast.useToastManager;\n\nfunction XIcon() {\n return (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M1 1L9 9M9 1L1 9\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nfunction StatusIcon({ type }: { type: string }) {\n if (type === \"success\") {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" className={`${styles.icon} ${styles[\"icon-success\"]}`}>\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M4.5 8L6.5 10.5L11 5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n }\n if (type === \"error\") {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" className={`${styles.icon} ${styles[\"icon-error\"]}`}>\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M5.5 5.5L10.5 10.5M10.5 5.5L5.5 10.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n );\n }\n if (type === \"warning\") {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" className={`${styles.icon} ${styles[\"icon-warning\"]}`}>\n <path d=\"M8 2L14.5 13H1.5L8 2Z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinejoin=\"round\" />\n <path d=\"M8 6.5V9\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <circle cx=\"8\" cy=\"11\" r=\"0.75\" fill=\"currentColor\" />\n </svg>\n );\n }\n if (type === \"info\") {\n return (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" className={`${styles.icon} ${styles[\"icon-info\"]}`}>\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M8 7V11\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <circle cx=\"8\" cy=\"5\" r=\"0.75\" fill=\"currentColor\" />\n </svg>\n );\n }\n return null;\n}\n\nexport interface ToastViewportProps {\n /**\n * \"stacked\" — toasts fan out behind each other like Sonner.\n * Collapsed: only the front toast is fully visible; others peek as\n * scaled-down cards behind it. Hover/focus expands the full stack.\n *\n * \"list\" — toasts stack vertically, each fully visible (default behaviour).\n */\n variant?: \"stacked\" | \"list\";\n /**\n * Maximum number of toasts shown at once.\n * Defaults to 5 for \"stacked\", 3 for \"list\".\n * Oldest toasts are removed when the limit is exceeded.\n */\n limit?: number;\n}\n\nconst DEFAULT_LIMIT: Record<NonNullable<ToastViewportProps[\"variant\"]>, number> = {\n stacked: 5,\n list: 3,\n};\n\nexport interface ToastProviderProps {\n children: ReactNode;\n /** Layout style for the viewport. @default \"list\" */\n variant?: ToastViewportProps[\"variant\"];\n /** Maximum number of toasts shown at once. */\n limit?: number;\n /** Auto-dismiss delay in milliseconds. */\n timeout?: number;\n}\n\n/**\n * Drop-in provider that wires limit defaults to the chosen variant.\n * Use this instead of base-ui's Toast.Provider when using ToastViewport.\n */\nconst MAX_LIMIT: Record<NonNullable<ToastViewportProps[\"variant\"]>, number> = {\n stacked: 10,\n list: 5,\n};\n\n/**\n * Drop-in provider that wires limit defaults to the chosen viewport variant.\n * Use this instead of base-ui's `Toast.Provider` when using `ToastViewport`.\n */\nexport function ToastProvider({ children, variant = \"list\", limit, timeout }: ToastProviderProps) {\n const resolvedLimit = Math.min(limit ?? DEFAULT_LIMIT[variant], MAX_LIMIT[variant]);\n return (\n <BaseToast.Provider limit={resolvedLimit} timeout={timeout}>\n {children}\n </BaseToast.Provider>\n );\n}\n\n/**\n * Renders and manages toast notifications. Supports `\"stacked\"` (Sonner-style\n * fanned cards) and `\"list\"` (vertically stacked, each fully visible) layouts.\n */\nexport function ToastViewport({ variant = \"list\", limit: _limit }: ToastViewportProps) {\n const manager = useToastManager();\n const isStacked = variant === \"stacked\";\n\n return (\n <BaseToast.Viewport className={`${styles.viewport} ${isStacked ? styles[\"viewport-stacked\"] : styles[\"viewport-list\"]}`}>\n {manager.toasts.map((toast) => (\n <BaseToast.Root\n key={toast.id}\n toast={toast}\n className={`${styles.toast} ${isStacked ? styles[\"toast-stacked\"] : \"\"} ${styles[`toast-${toast.type ?? \"default\"}`]}`}\n swipeDirection={isStacked ? [\"right\", \"down\"] : [\"right\", \"down\"]}\n >\n {toast.type && toast.type !== \"default\" && <StatusIcon type={toast.type} />}\n <div className={styles.content}>\n {toast.title && <BaseToast.Title className={styles.title} />}\n {toast.description && <BaseToast.Description className={styles.description} />}\n </div>\n <BaseToast.Close className={styles.close} aria-label=\"Dismiss\">\n <XIcon />\n </BaseToast.Close>\n </BaseToast.Root>\n ))}\n </BaseToast.Viewport>\n );\n}\nexport { styles as ToastStyles };\n"],"mappings":";;;;AAOA,MAAa,kBAAkBA,MAAU;AAEzC,SAAS,QAAQ;AACf,QACE,oBAAC,OAAD;EAAK,OAAM;EAAK,QAAO;EAAK,SAAQ;EAAY,MAAK;YACnD,oBAAC,QAAD;GAAM,GAAE;GAAmB,QAAO;GAAe,aAAY;GAAM,eAAc;GAAU,CAAA;EACvF,CAAA;;AAIV,SAAS,WAAW,EAAE,QAA0B;AAC9C,KAAI,SAAS,UACX,QACE,qBAAC,OAAD;EAAK,SAAQ;EAAY,MAAK;EAAO,WAAW,GAAGC,qBAAO,KAAK,GAAGA,qBAAO;YAAzE,CACE,oBAAC,UAAD;GAAQ,IAAG;GAAI,IAAG;GAAI,GAAE;GAAI,QAAO;GAAe,aAAY;GAAQ,CAAA,EACtE,oBAAC,QAAD;GAAM,GAAE;GAAuB,QAAO;GAAe,aAAY;GAAM,eAAc;GAAQ,gBAAe;GAAU,CAAA,CAClH;;AAGV,KAAI,SAAS,QACX,QACE,qBAAC,OAAD;EAAK,SAAQ;EAAY,MAAK;EAAO,WAAW,GAAGA,qBAAO,KAAK,GAAGA,qBAAO;YAAzE,CACE,oBAAC,UAAD;GAAQ,IAAG;GAAI,IAAG;GAAI,GAAE;GAAI,QAAO;GAAe,aAAY;GAAQ,CAAA,EACtE,oBAAC,QAAD;GAAM,GAAE;GAAuC,QAAO;GAAe,aAAY;GAAM,eAAc;GAAU,CAAA,CAC3G;;AAGV,KAAI,SAAS,UACX,QACE,qBAAC,OAAD;EAAK,SAAQ;EAAY,MAAK;EAAO,WAAW,GAAGA,qBAAO,KAAK,GAAGA,qBAAO;YAAzE;GACE,oBAAC,QAAD;IAAM,GAAE;IAAwB,QAAO;IAAe,aAAY;IAAM,gBAAe;IAAU,CAAA;GACjG,oBAAC,QAAD;IAAM,GAAE;IAAW,QAAO;IAAe,aAAY;IAAM,eAAc;IAAU,CAAA;GACnF,oBAAC,UAAD;IAAQ,IAAG;IAAI,IAAG;IAAK,GAAE;IAAO,MAAK;IAAiB,CAAA;GAClD;;AAGV,KAAI,SAAS,OACX,QACE,qBAAC,OAAD;EAAK,SAAQ;EAAY,MAAK;EAAO,WAAW,GAAGA,qBAAO,KAAK,GAAGA,qBAAO;YAAzE;GACE,oBAAC,UAAD;IAAQ,IAAG;IAAI,IAAG;IAAI,GAAE;IAAI,QAAO;IAAe,aAAY;IAAQ,CAAA;GACtE,oBAAC,QAAD;IAAM,GAAE;IAAU,QAAO;IAAe,aAAY;IAAM,eAAc;IAAU,CAAA;GAClF,oBAAC,UAAD;IAAQ,IAAG;IAAI,IAAG;IAAI,GAAE;IAAO,MAAK;IAAiB,CAAA;GACjD;;AAGV,QAAO;;AAoBT,MAAM,gBAA4E;CAChF,SAAS;CACT,MAAM;CACP;;;;;AAgBD,MAAM,YAAwE;CAC5E,SAAS;CACT,MAAM;CACP;;;;;AAMD,SAAgB,cAAc,EAAE,UAAU,UAAU,QAAQ,OAAO,WAA+B;CAChG,MAAM,gBAAgB,KAAK,IAAI,SAAS,cAAc,UAAU,UAAU,SAAS;AACnF,QACE,oBAACD,MAAU,UAAX;EAAoB,OAAO;EAAwB;EAChD;EACkB,CAAA;;;;;;AAQzB,SAAgB,cAAc,EAAE,UAAU,QAAQ,OAAO,UAA8B;CACrF,MAAM,UAAU,iBAAiB;CACjC,MAAM,YAAY,YAAY;AAE9B,QACE,oBAACA,MAAU,UAAX;EAAoB,WAAW,GAAGC,qBAAO,SAAS,GAAG,YAAYA,qBAAO,sBAAsBA,qBAAO;YAClG,QAAQ,OAAO,KAAK,UACnB,qBAACD,MAAU,MAAX;GAES;GACP,WAAW,GAAGC,qBAAO,MAAM,GAAG,YAAYA,qBAAO,mBAAmB,GAAG,GAAGA,qBAAO,SAAS,MAAM,QAAQ;GACxG,gBAAgB,YAAY,CAAC,SAAS,OAAO,GAAG,CAAC,SAAS,OAAO;aAJnE;IAMG,MAAM,QAAQ,MAAM,SAAS,aAAa,oBAAC,YAAD,EAAY,MAAM,MAAM,MAAQ,CAAA;IAC3E,qBAAC,OAAD;KAAK,WAAWA,qBAAO;eAAvB,CACG,MAAM,SAAS,oBAACD,MAAU,OAAX,EAAiB,WAAWC,qBAAO,OAAS,CAAA,EAC3D,MAAM,eAAe,oBAACD,MAAU,aAAX,EAAuB,WAAWC,qBAAO,aAAe,CAAA,CAC1E;;IACN,oBAACD,MAAU,OAAX;KAAiB,WAAWC,qBAAO;KAAO,cAAW;eACnD,oBAAC,OAAD,EAAS,CAAA;KACO,CAAA;IACH;KAbV,MAAM,GAaI,CACjB;EACiB,CAAA"}
@@ -4,12 +4,21 @@ import styles from "./tooltip.module.css";
4
4
 
5
5
  //#region src/tooltip/tooltip.d.ts
6
6
  interface TooltipProps {
7
+ /** Text or rich content shown inside the tooltip popup. */
7
8
  content: ReactNode;
9
+ /** The element that triggers the tooltip on hover/focus. */
8
10
  children: ReactElement;
11
+ /** Hover delay in milliseconds before the tooltip appears. @default 400 */
9
12
  delay?: number;
13
+ /** Which side of the trigger the tooltip appears on. @default "top" */
10
14
  side?: "top" | "bottom" | "left" | "right";
15
+ /** Alignment along the side axis. @default "center" */
11
16
  align?: "start" | "center" | "end";
12
17
  }
18
+ /**
19
+ * Accessible popup shown on hover or focus. Automatically positions itself
20
+ * with an arrow and supports configurable delay, side, and alignment.
21
+ */
13
22
  declare function Tooltip({
14
23
  content,
15
24
  children,
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip.d.ts","names":[],"sources":["../../src/tooltip/tooltip.tsx"],"mappings":";;;;;UAIiB,YAAA;EACf,OAAA,EAAS,SAAA;EACT,QAAA,EAAU,YAAA;EACV,KAAA;EACA,IAAA;EACA,KAAA;AAAA;AAAA,iBAGc,OAAA,CAAA;EAAU,OAAA;EAAS,QAAA;EAAU,KAAA;EAAa,IAAA;EAAc;AAAA,GAAoB,YAAA,GAAY,kBAAA,CAAA,GAAA,CAAA,OAAA"}
1
+ {"version":3,"file":"tooltip.d.ts","names":[],"sources":["../../src/tooltip/tooltip.tsx"],"mappings":";;;;;UAIiB,YAAA;;EAEf,OAAA,EAAS,SAAA;EAFM;EAIf,QAAA,EAAU,YAAA;;EAEV,KAAA;EAJA;EAMA,IAAA;EAJA;EAMA,KAAA;AAAA;;;;;iBAOc,OAAA,CAAA;EAAU,OAAA;EAAS,QAAA;EAAU,KAAA;EAAa,IAAA;EAAc;AAAA,GAAoB,YAAA,GAAY,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -2,6 +2,10 @@ import tooltip_module_default from "./tooltip.module.js";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { Tooltip } from "@base-ui/react/tooltip";
4
4
  //#region src/tooltip/tooltip.tsx
5
+ /**
6
+ * Accessible popup shown on hover or focus. Automatically positions itself
7
+ * with an arrow and supports configurable delay, side, and alignment.
8
+ */
5
9
  function Tooltip$1({ content, children, delay = 400, side = "top", align = "center" }) {
6
10
  return /* @__PURE__ */ jsx(Tooltip.Provider, {
7
11
  delay,
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip.js","names":["Tooltip","BaseTooltip","styles"],"sources":["../../src/tooltip/tooltip.tsx"],"sourcesContent":["import type { ReactNode, ReactElement } from \"react\";\nimport { Tooltip as BaseTooltip } from \"@base-ui/react/tooltip\";\nimport styles from \"./tooltip.module.css\";\n\nexport interface TooltipProps {\n content: ReactNode;\n children: ReactElement;\n delay?: number;\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n align?: \"start\" | \"center\" | \"end\";\n}\n\nexport function Tooltip({ content, children, delay = 400, side = \"top\", align = \"center\" }: TooltipProps) {\n return (\n <BaseTooltip.Provider delay={delay}>\n <BaseTooltip.Root>\n <BaseTooltip.Trigger render={children} />\n <BaseTooltip.Portal>\n <BaseTooltip.Positioner className={styles.positioner} side={side} align={align} sideOffset={6}>\n <BaseTooltip.Popup className={styles.popup}>\n <BaseTooltip.Arrow className={styles.arrow} />\n {content}\n </BaseTooltip.Popup>\n </BaseTooltip.Positioner>\n </BaseTooltip.Portal>\n </BaseTooltip.Root>\n </BaseTooltip.Provider>\n );\n}\nexport { styles as TooltipStyles };\n"],"mappings":";;;;AAYA,SAAgBA,UAAQ,EAAE,SAAS,UAAU,QAAQ,KAAK,OAAO,OAAO,QAAQ,YAA0B;AACxG,QACE,oBAACC,QAAY,UAAb;EAA6B;YAC3B,qBAACA,QAAY,MAAb,EAAA,UAAA,CACE,oBAACA,QAAY,SAAb,EAAqB,QAAQ,UAAY,CAAA,EACzC,oBAACA,QAAY,QAAb,EAAA,UACE,oBAACA,QAAY,YAAb;GAAwB,WAAWC,uBAAO;GAAkB;GAAa;GAAO,YAAY;aAC1F,qBAACD,QAAY,OAAb;IAAmB,WAAWC,uBAAO;cAArC,CACE,oBAACD,QAAY,OAAb,EAAmB,WAAWC,uBAAO,OAAS,CAAA,EAC7C,QACiB;;GACG,CAAA,EACN,CAAA,CACJ,EAAA,CAAA;EACE,CAAA"}
1
+ {"version":3,"file":"tooltip.js","names":["Tooltip","BaseTooltip","styles"],"sources":["../../src/tooltip/tooltip.tsx"],"sourcesContent":["import type { ReactNode, ReactElement } from \"react\";\nimport { Tooltip as BaseTooltip } from \"@base-ui/react/tooltip\";\nimport styles from \"./tooltip.module.css\";\n\nexport interface TooltipProps {\n /** Text or rich content shown inside the tooltip popup. */\n content: ReactNode;\n /** The element that triggers the tooltip on hover/focus. */\n children: ReactElement;\n /** Hover delay in milliseconds before the tooltip appears. @default 400 */\n delay?: number;\n /** Which side of the trigger the tooltip appears on. @default \"top\" */\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n /** Alignment along the side axis. @default \"center\" */\n align?: \"start\" | \"center\" | \"end\";\n}\n\n/**\n * Accessible popup shown on hover or focus. Automatically positions itself\n * with an arrow and supports configurable delay, side, and alignment.\n */\nexport function Tooltip({ content, children, delay = 400, side = \"top\", align = \"center\" }: TooltipProps) {\n return (\n <BaseTooltip.Provider delay={delay}>\n <BaseTooltip.Root>\n <BaseTooltip.Trigger render={children} />\n <BaseTooltip.Portal>\n <BaseTooltip.Positioner className={styles.positioner} side={side} align={align} sideOffset={6}>\n <BaseTooltip.Popup className={styles.popup}>\n <BaseTooltip.Arrow className={styles.arrow} />\n {content}\n </BaseTooltip.Popup>\n </BaseTooltip.Positioner>\n </BaseTooltip.Portal>\n </BaseTooltip.Root>\n </BaseTooltip.Provider>\n );\n}\nexport { styles as TooltipStyles };\n"],"mappings":";;;;;;;;AAqBA,SAAgBA,UAAQ,EAAE,SAAS,UAAU,QAAQ,KAAK,OAAO,OAAO,QAAQ,YAA0B;AACxG,QACE,oBAACC,QAAY,UAAb;EAA6B;YAC3B,qBAACA,QAAY,MAAb,EAAA,UAAA,CACE,oBAACA,QAAY,SAAb,EAAqB,QAAQ,UAAY,CAAA,EACzC,oBAACA,QAAY,QAAb,EAAA,UACE,oBAACA,QAAY,YAAb;GAAwB,WAAWC,uBAAO;GAAkB;GAAa;GAAO,YAAY;aAC1F,qBAACD,QAAY,OAAb;IAAmB,WAAWC,uBAAO;cAArC,CACE,oBAACD,QAAY,OAAb,EAAmB,WAAWC,uBAAO,OAAS,CAAA,EAC7C,QACiB;;GACG,CAAA,EACN,CAAA,CACJ,EAAA,CAAA;EACE,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brijbyte/agentic-ui",
3
- "version": "0.0.3",
3
+ "version": "0.0.4",
4
4
  "private": false,
5
5
  "repository": {
6
6
  "type": "git",
@@ -89,6 +89,11 @@
89
89
  "types": "./dist/menu/index.d.ts"
90
90
  },
91
91
  "./menu.css": "./dist/menu/menu.css",
92
+ "./meter": {
93
+ "import": "./dist/meter/index.js",
94
+ "types": "./dist/meter/index.d.ts"
95
+ },
96
+ "./meter.css": "./dist/meter/meter.css",
92
97
  "./number-field": {
93
98
  "import": "./dist/number-field/index.js",
94
99
  "types": "./dist/number-field/index.d.ts"
@@ -99,6 +104,16 @@
99
104
  "types": "./dist/progress/index.d.ts"
100
105
  },
101
106
  "./progress.css": "./dist/progress/progress.css",
107
+ "./radio": {
108
+ "import": "./dist/radio/index.js",
109
+ "types": "./dist/radio/index.d.ts"
110
+ },
111
+ "./radio.css": "./dist/radio/radio.css",
112
+ "./radio-group": {
113
+ "import": "./dist/radio-group/index.js",
114
+ "types": "./dist/radio-group/index.d.ts"
115
+ },
116
+ "./radio-group.css": "./dist/radio-group/radio-group.css",
102
117
  "./select": {
103
118
  "import": "./dist/select/index.js",
104
119
  "types": "./dist/select/index.d.ts"
@@ -133,7 +148,12 @@
133
148
  "import": "./dist/tooltip/index.js",
134
149
  "types": "./dist/tooltip/index.d.ts"
135
150
  },
136
- "./tooltip.css": "./dist/tooltip/tooltip.css"
151
+ "./tooltip.css": "./dist/tooltip/tooltip.css",
152
+ "./popover": {
153
+ "import": "./dist/popover/index.js",
154
+ "types": "./dist/popover/index.d.ts"
155
+ },
156
+ "./popover.css": "./dist/popover/popover.css"
137
157
  },
138
158
  "publishConfig": {
139
159
  "access": "public",
@@ -3,17 +3,26 @@ import { Accordion as BaseAccordion } from "@base-ui/react/accordion";
3
3
  import styles from "./accordion.module.css";
4
4
 
5
5
  export interface AccordionItem {
6
+ /** Unique identifier for this panel. */
6
7
  value: string;
8
+ /** Content rendered inside the trigger button. */
7
9
  header: ReactNode;
10
+ /** Content revealed when the panel is expanded. */
8
11
  content: ReactNode;
12
+ /** When `true`, the item cannot be toggled. */
9
13
  disabled?: boolean;
10
14
  }
11
15
 
12
16
  export interface AccordionProps {
17
+ /** Array of items to render as collapsible panels. */
13
18
  items: AccordionItem[];
19
+ /** Allow multiple panels open at once. @default true */
14
20
  multiple?: boolean;
21
+ /** Initially expanded panel values (uncontrolled). */
15
22
  defaultValue?: string[];
23
+ /** Currently expanded panel values (controlled). */
16
24
  value?: string[];
25
+ /** Called when the set of open panels changes. */
17
26
  onValueChange?: (value: string[]) => void;
18
27
  className?: string;
19
28
  }
@@ -26,6 +35,11 @@ function ChevronIcon() {
26
35
  );
27
36
  }
28
37
 
38
+ /**
39
+ * Collapsible content panels. Wraps `@base-ui/react` Accordion with pre-styled
40
+ * headers, triggers, and animated panels. Pass `multiple` to allow more than one
41
+ * panel open at a time.
42
+ */
29
43
  export function Accordion({ items, className, multiple = true, ...props }: AccordionProps) {
30
44
  return (
31
45
  <BaseAccordion.Root className={`${styles.root} ${className ?? ""}`} multiple={multiple} {...props}>
@@ -14,13 +14,19 @@ export interface AlertAction {
14
14
  }
15
15
 
16
16
  export interface AlertDialogProps {
17
+ /** Controlled open state. */
17
18
  open?: boolean;
19
+ /** Whether the dialog is initially open (uncontrolled). */
18
20
  defaultOpen?: boolean;
21
+ /** Called when the dialog opens or closes. */
19
22
  onOpenChange?: (open: boolean, eventDetails: unknown) => void;
23
+ /** Element that opens the dialog when clicked. */
20
24
  trigger?: ReactElement;
21
25
  /** Optional icon shown above the title. */
22
26
  icon?: ReactNode;
27
+ /** Dialog heading text. */
23
28
  title: ReactNode;
29
+ /** Supplementary text below the title. */
24
30
  description?: ReactNode;
25
31
  /**
26
32
  * Action buttons rendered right-aligned.
@@ -31,6 +37,11 @@ export interface AlertDialogProps {
31
37
  className?: string;
32
38
  }
33
39
 
40
+ /**
41
+ * A modal that requires a user response before continuing. Blocks interaction
42
+ * with the rest of the page until dismissed. Two actions render side-by-side;
43
+ * three or more stack vertically.
44
+ */
34
45
  export function AlertDialog({ trigger, icon, title, description, actions, className, onOpenChange, ...props }: AlertDialogProps) {
35
46
  return (
36
47
  <BaseAlertDialog.Root onOpenChange={onOpenChange as never} {...props}>
@@ -4,10 +4,16 @@ import styles from "./badge.module.css";
4
4
  export type BadgeVariant = "default" | "solid" | "soft" | "success" | "warning" | "error" | "info";
5
5
 
6
6
  export interface BadgeProps extends ComponentPropsWithoutRef<"span"> {
7
+ /** Visual style and semantic colour. @default "default" */
7
8
  variant?: BadgeVariant;
9
+ /** Show a small coloured dot indicator before the label. */
8
10
  dot?: boolean;
9
11
  }
10
12
 
13
+ /**
14
+ * Compact label for status, counts, and categories. A plain styled `<span>` —
15
+ * no base-ui dependency.
16
+ */
11
17
  export function Badge({ variant = "default", dot = false, className, children, ...props }: BadgeProps) {
12
18
  return (
13
19
  <span className={[styles.root, styles[`variant-${variant}`], className ?? ""].filter(Boolean).join(" ")} {...props}>
@@ -8,10 +8,13 @@ export type ButtonTone = "primary" | "secondary" | "destructive" | "success" | "
8
8
  export type ButtonSize = "xs" | "sm" | "md" | "lg";
9
9
 
10
10
  export interface ButtonProps extends ComponentPropsWithoutRef<"button"> {
11
+ /** Visual shape — filled, tinted, outlined, or borderless. @default "solid" */
11
12
  variant?: ButtonVariant;
12
- /** Semantic color. Defaults to "primary". */
13
+ /** Semantic colour. @default "primary" */
13
14
  tone?: ButtonTone | undefined;
15
+ /** Controls padding and font size. @default "md" */
14
16
  size?: ButtonSize | undefined;
17
+ /** Shows a spinner overlay and disables interaction. */
15
18
  loading?: boolean | undefined;
16
19
  /**
17
20
  * Text shown in place of children while loading.
@@ -19,11 +22,19 @@ export interface ButtonProps extends ComponentPropsWithoutRef<"button"> {
19
22
  * When omitted, children stay rendered invisibly — width stays stable.
20
23
  */
21
24
  loadingText?: string | undefined;
25
+ /** Renders as a square button with equal padding on all sides. */
22
26
  iconOnly?: boolean | undefined;
27
+ /** Custom render element forwarded to base-ui Button. */
23
28
  render?: ReactElement | undefined;
29
+ /** Use a native `<button>` element. @default true */
24
30
  nativeButton?: boolean | undefined;
25
31
  }
26
32
 
33
+ /**
34
+ * Pressable button with multiple variants, tones, and sizes. Composes
35
+ * `@base-ui/react` Button with focus management and disabled-while-loading.
36
+ * Supports a spinner overlay that preserves button width.
37
+ */
27
38
  export const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(
28
39
  {
29
40
  variant = "solid",
package/src/card/card.tsx CHANGED
@@ -2,7 +2,9 @@ import type { ComponentPropsWithoutRef, ReactNode } from "react";
2
2
  import styles from "./card.module.css";
3
3
 
4
4
  export interface CardProps extends ComponentPropsWithoutRef<"div"> {
5
+ /** Apply a raised shadow for layered surfaces. */
5
6
  elevated?: boolean;
7
+ /** Add hover/active states for clickable cards. */
6
8
  interactive?: boolean;
7
9
  }
8
10
 
@@ -10,9 +12,14 @@ export interface CardProps extends ComponentPropsWithoutRef<"div"> {
10
12
  export interface CardHeaderProps extends Omit<ComponentPropsWithoutRef<"div">, "title"> {
11
13
  /** Card heading rendered in the header area. */
12
14
  heading?: ReactNode;
15
+ /** Secondary text below the heading. */
13
16
  description?: ReactNode;
14
17
  }
15
18
 
19
+ /**
20
+ * Surface container with optional header, body, and footer slots.
21
+ * Pure HTML — no base-ui dependency.
22
+ */
16
23
  export function Card({ elevated, interactive, className, children, ...props }: CardProps) {
17
24
  return (
18
25
  <div
@@ -26,6 +33,7 @@ export function Card({ elevated, interactive, className, children, ...props }: C
26
33
  );
27
34
  }
28
35
 
36
+ /** Header area with optional heading and description. */
29
37
  export function CardHeader({ heading, description, className, children, ...props }: CardHeaderProps) {
30
38
  return (
31
39
  <div className={`${styles.header} ${className ?? ""}`} {...props}>
@@ -36,6 +44,7 @@ export function CardHeader({ heading, description, className, children, ...props
36
44
  );
37
45
  }
38
46
 
47
+ /** Padded body content area. */
39
48
  export function CardBody({ className, children, ...props }: ComponentPropsWithoutRef<"div">) {
40
49
  return (
41
50
  <div className={`${styles.body} ${className ?? ""}`} {...props}>
@@ -44,6 +53,7 @@ export function CardBody({ className, children, ...props }: ComponentPropsWithou
44
53
  );
45
54
  }
46
55
 
56
+ /** Footer area, typically used for actions. */
47
57
  export function CardFooter({ className, children, ...props }: ComponentPropsWithoutRef<"div">) {
48
58
  return (
49
59
  <div className={`${styles.footer} ${className ?? ""}`} {...props}>
@@ -4,20 +4,33 @@ import { Checkbox as BaseCheckbox } from "@base-ui/react/checkbox";
4
4
  import styles from "./checkbox.module.css";
5
5
 
6
6
  export interface CheckboxProps {
7
+ /** Controlled checked state. */
7
8
  checked?: boolean;
9
+ /** Initial checked state (uncontrolled). */
8
10
  defaultChecked?: boolean;
11
+ /** Display a horizontal dash instead of a checkmark. */
9
12
  indeterminate?: boolean;
13
+ /** Prevent interaction and dim the checkbox. */
10
14
  disabled?: boolean;
15
+ /** Mark the field as required for form validation. */
11
16
  required?: boolean;
17
+ /** HTML name attribute for form submission. */
12
18
  name?: string;
19
+ /** HTML value attribute for form submission. */
13
20
  value?: string;
14
21
  /** Called when checked state changes. `eventDetails` is the base-ui event details object. */
15
22
  onCheckedChange?: (checked: boolean, eventDetails: unknown) => void;
23
+ /** Label content rendered next to the checkbox. */
16
24
  children?: ReactNode;
25
+ /** Override the auto-generated element id. */
17
26
  id?: string;
18
27
  className?: string;
19
28
  }
20
29
 
30
+ /**
31
+ * Boolean selection with an accessible label. Wraps `@base-ui/react` Checkbox
32
+ * with a styled indicator, check icon, and label layout.
33
+ */
21
34
  export function Checkbox({ children, id, className, onCheckedChange, ...props }: CheckboxProps) {
22
35
  // eslint-disable-next-line react-hooks/rules-of-hooks
23
36
  const checkboxId = id ?? useId();
@@ -3,11 +3,17 @@ import { Collapsible as BaseCollapsible } from "@base-ui/react/collapsible";
3
3
  import styles from "./collapsible.module.css";
4
4
 
5
5
  export interface CollapsibleProps {
6
+ /** Content rendered inside the toggle button. */
6
7
  trigger: ReactNode;
8
+ /** Content revealed when expanded. */
7
9
  children: ReactNode;
10
+ /** Whether the panel is initially open (uncontrolled). */
8
11
  defaultOpen?: boolean;
12
+ /** Controlled open state. */
9
13
  open?: boolean;
14
+ /** Called when the panel opens or closes. */
10
15
  onOpenChange?: (open: boolean) => void;
16
+ /** Prevent the panel from being toggled. */
11
17
  disabled?: boolean;
12
18
  className?: string;
13
19
  }
@@ -20,6 +26,11 @@ function ChevronIcon() {
20
26
  );
21
27
  }
22
28
 
29
+ /**
30
+ * A single panel toggled by a button. Unlike Accordion it stands alone —
31
+ * ideal for inline FAQ entries, code blocks, or side panels.
32
+ * Animates via `--collapsible-panel-height`.
33
+ */
23
34
  export function Collapsible({ trigger, children, className, onOpenChange, ...props }: CollapsibleProps) {
24
35
  return (
25
36
  <BaseCollapsible.Root className={`${styles.root} ${className ?? ""}`} onOpenChange={onOpenChange as never} {...props}>
@@ -26,6 +26,7 @@ export type ContextMenuEntry = ContextMenuItemDef | ContextMenuSeparatorDef | Co
26
26
  export interface ContextMenuProps {
27
27
  /** The element that can be right-clicked / long-pressed to open the menu. */
28
28
  children: ReactElement;
29
+ /** Array of menu entries: items, separators, and groups. */
29
30
  items: ContextMenuEntry[];
30
31
  className?: string;
31
32
  }
@@ -40,6 +41,10 @@ function RenderItem({ item, i }: { item: ContextMenuItemDef; i: number }) {
40
41
  );
41
42
  }
42
43
 
44
+ /**
45
+ * A menu that appears at the pointer on right-click or long press. Supports
46
+ * items, separators, groups, keyboard shortcuts, and disabled states.
47
+ */
43
48
  export function ContextMenu({ children, items, className }: ContextMenuProps) {
44
49
  return (
45
50
  <BaseContextMenu.Root>