@brijbyte/agentic-ui 0.0.3 → 0.0.5

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 (289) hide show
  1. package/README.md +280 -53
  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/accordion/index.d.ts +2 -2
  7. package/dist/accordion/index.js +2 -2
  8. package/dist/accordion/parts.d.ts +6 -14
  9. package/dist/accordion/parts.d.ts.map +1 -1
  10. package/dist/accordion/parts.js +7 -6
  11. package/dist/accordion/parts.js.map +1 -1
  12. package/dist/alert-dialog/alert-dialog.d.ts +11 -0
  13. package/dist/alert-dialog/alert-dialog.d.ts.map +1 -1
  14. package/dist/alert-dialog/alert-dialog.js +5 -0
  15. package/dist/alert-dialog/alert-dialog.js.map +1 -1
  16. package/dist/alert-dialog/parts.d.ts +4 -12
  17. package/dist/alert-dialog/parts.d.ts.map +1 -1
  18. package/dist/alert-dialog/parts.js +17 -19
  19. package/dist/alert-dialog/parts.js.map +1 -1
  20. package/dist/badge/badge.d.ts +6 -0
  21. package/dist/badge/badge.d.ts.map +1 -1
  22. package/dist/badge/badge.js +4 -0
  23. package/dist/badge/badge.js.map +1 -1
  24. package/dist/button/button.d.ts +12 -1
  25. package/dist/button/button.d.ts.map +1 -1
  26. package/dist/button/button.js +5 -0
  27. package/dist/button/button.js.map +1 -1
  28. package/dist/card/card.d.ts +10 -0
  29. package/dist/card/card.d.ts.map +1 -1
  30. package/dist/card/card.js +7 -0
  31. package/dist/card/card.js.map +1 -1
  32. package/dist/checkbox/checkbox.d.ts +13 -0
  33. package/dist/checkbox/checkbox.d.ts.map +1 -1
  34. package/dist/checkbox/checkbox.js +4 -0
  35. package/dist/checkbox/checkbox.js.map +1 -1
  36. package/dist/checkbox/parts.d.ts +2 -5
  37. package/dist/checkbox/parts.d.ts.map +1 -1
  38. package/dist/checkbox/parts.js +3 -2
  39. package/dist/checkbox/parts.js.map +1 -1
  40. package/dist/collapsible/collapsible.d.ts +11 -0
  41. package/dist/collapsible/collapsible.d.ts.map +1 -1
  42. package/dist/collapsible/collapsible.js +5 -0
  43. package/dist/collapsible/collapsible.js.map +1 -1
  44. package/dist/collapsible/parts.d.ts +3 -9
  45. package/dist/collapsible/parts.d.ts.map +1 -1
  46. package/dist/collapsible/parts.js +7 -6
  47. package/dist/collapsible/parts.js.map +1 -1
  48. package/dist/context-menu/context-menu.d.ts +5 -0
  49. package/dist/context-menu/context-menu.d.ts.map +1 -1
  50. package/dist/context-menu/context-menu.js +4 -0
  51. package/dist/context-menu/context-menu.js.map +1 -1
  52. package/dist/context-menu/parts.d.ts +6 -18
  53. package/dist/context-menu/parts.d.ts.map +1 -1
  54. package/dist/context-menu/parts.js +16 -16
  55. package/dist/context-menu/parts.js.map +1 -1
  56. package/dist/dialog/dialog.d.ts +13 -1
  57. package/dist/dialog/dialog.d.ts.map +1 -1
  58. package/dist/dialog/dialog.js +6 -0
  59. package/dist/dialog/dialog.js.map +1 -1
  60. package/dist/dialog/parts.d.ts +6 -18
  61. package/dist/dialog/parts.d.ts.map +1 -1
  62. package/dist/dialog/parts.js +8 -9
  63. package/dist/dialog/parts.js.map +1 -1
  64. package/dist/drawer/drawer.d.ts +11 -0
  65. package/dist/drawer/drawer.d.ts.map +1 -1
  66. package/dist/drawer/drawer.js +5 -0
  67. package/dist/drawer/drawer.js.map +1 -1
  68. package/dist/drawer/parts.d.ts +7 -19
  69. package/dist/drawer/parts.d.ts.map +1 -1
  70. package/dist/drawer/parts.js +14 -13
  71. package/dist/drawer/parts.js.map +1 -1
  72. package/dist/index.css +1580 -1150
  73. package/dist/index.d.ts +20 -11
  74. package/dist/index.js +15 -2
  75. package/dist/input/input.d.ts +8 -0
  76. package/dist/input/input.d.ts.map +1 -1
  77. package/dist/input/input.js +5 -0
  78. package/dist/input/input.js.map +1 -1
  79. package/dist/menu/menu.css +3 -8
  80. package/dist/menu/menu.d.ts +11 -4
  81. package/dist/menu/menu.d.ts.map +1 -1
  82. package/dist/menu/menu.js +10 -24
  83. package/dist/menu/menu.js.map +1 -1
  84. package/dist/menu/menu.module.js +1 -1
  85. package/dist/menu/menu.module.js.map +1 -1
  86. package/dist/menu/parts.d.ts +6 -18
  87. package/dist/menu/parts.d.ts.map +1 -1
  88. package/dist/menu/parts.js +7 -6
  89. package/dist/menu/parts.js.map +1 -1
  90. package/dist/meter/circular-meter.d.ts +48 -0
  91. package/dist/meter/circular-meter.d.ts.map +1 -0
  92. package/dist/meter/circular-meter.js +86 -0
  93. package/dist/meter/circular-meter.js.map +1 -0
  94. package/dist/meter/index.d.ts +4 -0
  95. package/dist/meter/index.js +5 -0
  96. package/dist/meter/meter.css +152 -0
  97. package/dist/meter/meter.d.ts +58 -0
  98. package/dist/meter/meter.d.ts.map +1 -0
  99. package/dist/meter/meter.js +50 -0
  100. package/dist/meter/meter.js.map +1 -0
  101. package/dist/meter/meter.module.css.d.ts +2 -0
  102. package/dist/meter/meter.module.js +27 -0
  103. package/dist/meter/meter.module.js.map +1 -0
  104. package/dist/meter/meterState.js +18 -0
  105. package/dist/meter/meterState.js.map +1 -0
  106. package/dist/meter/parts.d.ts +25 -0
  107. package/dist/meter/parts.d.ts.map +1 -0
  108. package/dist/meter/parts.js +57 -0
  109. package/dist/meter/parts.js.map +1 -0
  110. package/dist/number-field/number-field.d.ts +16 -0
  111. package/dist/number-field/number-field.d.ts.map +1 -1
  112. package/dist/number-field/number-field.js +4 -0
  113. package/dist/number-field/number-field.js.map +1 -1
  114. package/dist/number-field/parts.d.ts +6 -18
  115. package/dist/number-field/parts.d.ts.map +1 -1
  116. package/dist/number-field/parts.js +7 -6
  117. package/dist/number-field/parts.js.map +1 -1
  118. package/dist/popover/index.d.ts +3 -0
  119. package/dist/popover/index.js +4 -0
  120. package/dist/popover/parts.d.ts +29 -0
  121. package/dist/popover/parts.d.ts.map +1 -0
  122. package/dist/popover/parts.js +93 -0
  123. package/dist/popover/parts.js.map +1 -0
  124. package/dist/popover/popover.css +173 -0
  125. package/dist/popover/popover.d.ts +49 -0
  126. package/dist/popover/popover.d.ts.map +1 -0
  127. package/dist/popover/popover.js +68 -0
  128. package/dist/popover/popover.js.map +1 -0
  129. package/dist/popover/popover.module.css.d.ts +2 -0
  130. package/dist/popover/popover.module.js +16 -0
  131. package/dist/popover/popover.module.js.map +1 -0
  132. package/dist/progress/parts.d.ts +2 -4
  133. package/dist/progress/parts.d.ts.map +1 -1
  134. package/dist/progress/parts.js +3 -6
  135. package/dist/progress/parts.js.map +1 -1
  136. package/dist/progress/progress.d.ts +11 -0
  137. package/dist/progress/progress.d.ts.map +1 -1
  138. package/dist/progress/progress.js +5 -0
  139. package/dist/progress/progress.js.map +1 -1
  140. package/dist/radio/index.d.ts +3 -0
  141. package/dist/radio/index.js +4 -0
  142. package/dist/radio/parts.d.ts +14 -0
  143. package/dist/radio/parts.d.ts.map +1 -0
  144. package/dist/radio/parts.js +43 -0
  145. package/dist/radio/parts.js.map +1 -0
  146. package/dist/radio/radio.css +84 -0
  147. package/dist/radio/radio.d.ts +31 -0
  148. package/dist/radio/radio.d.ts.map +1 -0
  149. package/dist/radio/radio.js +33 -0
  150. package/dist/radio/radio.js.map +1 -0
  151. package/dist/radio/radio.module.css.d.ts +2 -0
  152. package/dist/radio/radio.module.js +11 -0
  153. package/dist/radio/radio.module.js.map +1 -0
  154. package/dist/radio-group/index.d.ts +3 -0
  155. package/dist/radio-group/index.js +4 -0
  156. package/dist/radio-group/parts.d.ts +11 -0
  157. package/dist/radio-group/parts.d.ts.map +1 -0
  158. package/dist/radio-group/parts.js +32 -0
  159. package/dist/radio-group/parts.js.map +1 -0
  160. package/dist/radio-group/radio-group.css +17 -0
  161. package/dist/radio-group/radio-group.d.ts +37 -0
  162. package/dist/radio-group/radio-group.d.ts.map +1 -0
  163. package/dist/radio-group/radio-group.js +28 -0
  164. package/dist/radio-group/radio-group.js.map +1 -0
  165. package/dist/radio-group/radio-group.module.css.d.ts +2 -0
  166. package/dist/radio-group/radio-group.module.js +9 -0
  167. package/dist/radio-group/radio-group.module.js.map +1 -0
  168. package/dist/reset-scoped.css +112 -0
  169. package/dist/select/parts.d.ts +11 -32
  170. package/dist/select/parts.d.ts.map +1 -1
  171. package/dist/select/parts.js +10 -9
  172. package/dist/select/parts.js.map +1 -1
  173. package/dist/select/select.d.ts +14 -1
  174. package/dist/select/select.d.ts.map +1 -1
  175. package/dist/select/select.js +4 -0
  176. package/dist/select/select.js.map +1 -1
  177. package/dist/separator/separator.d.ts +4 -0
  178. package/dist/separator/separator.d.ts.map +1 -1
  179. package/dist/separator/separator.js +4 -0
  180. package/dist/separator/separator.js.map +1 -1
  181. package/dist/shared/PopupArrow.js +22 -0
  182. package/dist/shared/PopupArrow.js.map +1 -0
  183. package/dist/slider/parts.d.ts +6 -18
  184. package/dist/slider/parts.d.ts.map +1 -1
  185. package/dist/slider/parts.js +7 -6
  186. package/dist/slider/parts.js.map +1 -1
  187. package/dist/slider/slider.d.ts +18 -0
  188. package/dist/slider/slider.d.ts.map +1 -1
  189. package/dist/slider/slider.js +6 -0
  190. package/dist/slider/slider.js.map +1 -1
  191. package/dist/switch/parts.d.ts +2 -6
  192. package/dist/switch/parts.d.ts.map +1 -1
  193. package/dist/switch/parts.js +3 -2
  194. package/dist/switch/parts.js.map +1 -1
  195. package/dist/switch/switch.css +11 -2
  196. package/dist/switch/switch.d.ts +12 -0
  197. package/dist/switch/switch.d.ts.map +1 -1
  198. package/dist/switch/switch.js +4 -0
  199. package/dist/switch/switch.js.map +1 -1
  200. package/dist/switch/switch.module.js.map +1 -1
  201. package/dist/tabs/parts.d.ts +3 -9
  202. package/dist/tabs/parts.d.ts.map +1 -1
  203. package/dist/tabs/parts.js +4 -3
  204. package/dist/tabs/parts.js.map +1 -1
  205. package/dist/tabs/tabs.d.ts +8 -1
  206. package/dist/tabs/tabs.d.ts.map +1 -1
  207. package/dist/tabs/tabs.js +4 -0
  208. package/dist/tabs/tabs.js.map +1 -1
  209. package/dist/toast/parts.d.ts +5 -15
  210. package/dist/toast/parts.d.ts.map +1 -1
  211. package/dist/toast/parts.js +6 -5
  212. package/dist/toast/parts.js.map +1 -1
  213. package/dist/toast/toast.d.ts +11 -0
  214. package/dist/toast/toast.d.ts.map +1 -1
  215. package/dist/toast/toast.js +8 -0
  216. package/dist/toast/toast.js.map +1 -1
  217. package/dist/tooltip/parts.d.ts +3 -9
  218. package/dist/tooltip/parts.d.ts.map +1 -1
  219. package/dist/tooltip/parts.js +4 -3
  220. package/dist/tooltip/parts.js.map +1 -1
  221. package/dist/tooltip/tooltip.d.ts +9 -0
  222. package/dist/tooltip/tooltip.d.ts.map +1 -1
  223. package/dist/tooltip/tooltip.js +4 -0
  224. package/dist/tooltip/tooltip.js.map +1 -1
  225. package/dist/utils/resolveClassName.js +25 -0
  226. package/dist/utils/resolveClassName.js.map +1 -0
  227. package/package.json +25 -4
  228. package/src/accordion/accordion.tsx +14 -0
  229. package/src/accordion/index.ts +1 -1
  230. package/src/accordion/parts.tsx +10 -17
  231. package/src/alert-dialog/alert-dialog.tsx +11 -0
  232. package/src/alert-dialog/parts.tsx +23 -31
  233. package/src/badge/badge.tsx +6 -0
  234. package/src/button/button.tsx +12 -1
  235. package/src/card/card.tsx +10 -0
  236. package/src/checkbox/checkbox.tsx +13 -0
  237. package/src/checkbox/parts.tsx +5 -7
  238. package/src/collapsible/collapsible.tsx +11 -0
  239. package/src/collapsible/parts.tsx +10 -15
  240. package/src/context-menu/context-menu.tsx +5 -0
  241. package/src/context-menu/parts.tsx +34 -34
  242. package/src/dialog/dialog.tsx +13 -1
  243. package/src/dialog/parts.tsx +14 -27
  244. package/src/drawer/drawer.tsx +11 -0
  245. package/src/drawer/parts.tsx +30 -38
  246. package/src/index.ts +4 -0
  247. package/src/input/input.tsx +8 -0
  248. package/src/menu/menu.module.css +3 -10
  249. package/src/menu/menu.tsx +13 -26
  250. package/src/menu/parts.tsx +13 -24
  251. package/src/meter/circular-meter.tsx +114 -0
  252. package/src/meter/index.ts +9 -0
  253. package/src/meter/meter.module.css +162 -0
  254. package/src/meter/meter.tsx +86 -0
  255. package/src/meter/meterState.ts +29 -0
  256. package/src/meter/parts.tsx +73 -0
  257. package/src/number-field/number-field.tsx +16 -0
  258. package/src/number-field/parts.tsx +33 -24
  259. package/src/popover/index.ts +14 -0
  260. package/src/popover/parts.tsx +105 -0
  261. package/src/popover/popover.module.css +189 -0
  262. package/src/popover/popover.tsx +80 -0
  263. package/src/progress/parts.tsx +13 -6
  264. package/src/progress/progress.tsx +11 -0
  265. package/src/radio/index.ts +6 -0
  266. package/src/radio/parts.tsx +42 -0
  267. package/src/radio/radio.module.css +96 -0
  268. package/src/radio/radio.tsx +37 -0
  269. package/src/radio-group/index.ts +5 -0
  270. package/src/radio-group/parts.tsx +31 -0
  271. package/src/radio-group/radio-group.module.css +17 -0
  272. package/src/radio-group/radio-group.tsx +63 -0
  273. package/src/select/parts.tsx +34 -41
  274. package/src/select/select.tsx +14 -1
  275. package/src/separator/separator.tsx +4 -0
  276. package/src/shared/PopupArrow.tsx +41 -0
  277. package/src/slider/parts.tsx +13 -24
  278. package/src/slider/slider.tsx +18 -0
  279. package/src/styles/reset-scoped.css +112 -0
  280. package/src/switch/parts.tsx +5 -8
  281. package/src/switch/switch.module.css +11 -2
  282. package/src/switch/switch.tsx +12 -0
  283. package/src/tabs/parts.tsx +7 -12
  284. package/src/tabs/tabs.tsx +8 -1
  285. package/src/toast/parts.tsx +11 -20
  286. package/src/toast/toast.tsx +11 -0
  287. package/src/tooltip/parts.tsx +7 -12
  288. package/src/tooltip/tooltip.tsx +9 -0
  289. package/src/utils/resolveClassName.ts +24 -0
@@ -0,0 +1,86 @@
1
+ import meter_module_default from "./meter.module.js";
2
+ import { getMeterState } from "./meterState.js";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ import { Meter } from "@base-ui/react/meter";
5
+ //#region src/meter/circular-meter.tsx
6
+ const SIZES = {
7
+ sm: {
8
+ diameter: 56,
9
+ strokeWidth: 5
10
+ },
11
+ md: {
12
+ diameter: 80,
13
+ strokeWidth: 7
14
+ },
15
+ lg: {
16
+ diameter: 112,
17
+ strokeWidth: 9
18
+ }
19
+ };
20
+ function CircularMeter({ value, min = 0, max = 100, low, high, optimum = "high", label, showValue = false, format, size = "md", className = "" }) {
21
+ const clampedValue = Math.min(Math.max(value, min), max);
22
+ const state = getMeterState(clampedValue, min, max, low, high, optimum);
23
+ const { diameter, strokeWidth } = SIZES[size];
24
+ const radius = (diameter - strokeWidth) / 2;
25
+ const circumference = 2 * Math.PI * radius;
26
+ const dashOffset = circumference * (1 - (clampedValue - min) / (max - min));
27
+ const center = diameter / 2;
28
+ return /* @__PURE__ */ jsx(Meter.Root, {
29
+ value: clampedValue,
30
+ min,
31
+ max,
32
+ ...format !== void 0 && { format },
33
+ className: `${meter_module_default["circular-root"]} ${meter_module_default[`circular-${size}`]} ${className}`,
34
+ children: /* @__PURE__ */ jsxs("div", {
35
+ style: {
36
+ position: "relative",
37
+ width: diameter,
38
+ height: diameter
39
+ },
40
+ children: [/* @__PURE__ */ jsxs("svg", {
41
+ width: diameter,
42
+ height: diameter,
43
+ viewBox: `0 0 ${diameter} ${diameter}`,
44
+ className: meter_module_default["circular-svg"],
45
+ "aria-hidden": "true",
46
+ children: [/* @__PURE__ */ jsx("circle", {
47
+ cx: center,
48
+ cy: center,
49
+ r: radius,
50
+ strokeWidth,
51
+ className: meter_module_default["circular-track"]
52
+ }), /* @__PURE__ */ jsx("circle", {
53
+ cx: center,
54
+ cy: center,
55
+ r: radius,
56
+ strokeWidth,
57
+ strokeDasharray: circumference,
58
+ strokeDashoffset: dashOffset,
59
+ className: meter_module_default["circular-indicator"],
60
+ "data-meter-state": state,
61
+ style: {
62
+ transform: "rotate(-90deg)",
63
+ transformOrigin: "center"
64
+ }
65
+ })]
66
+ }), (showValue || label != null) && /* @__PURE__ */ jsxs("div", {
67
+ style: {
68
+ position: "absolute",
69
+ inset: 0,
70
+ display: "flex",
71
+ flexDirection: "column",
72
+ alignItems: "center",
73
+ justifyContent: "center"
74
+ },
75
+ children: [showValue && /* @__PURE__ */ jsx(Meter.Value, { className: meter_module_default["circular-value"] }), label != null && /* @__PURE__ */ jsx(Meter.Label, {
76
+ className: meter_module_default["circular-label"],
77
+ children: label
78
+ })]
79
+ })]
80
+ })
81
+ });
82
+ }
83
+ //#endregion
84
+ export { CircularMeter };
85
+
86
+ //# sourceMappingURL=circular-meter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circular-meter.js","names":["BaseMeter","styles"],"sources":["../../src/meter/circular-meter.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Meter as BaseMeter } from \"@base-ui/react/meter\";\nimport styles from \"./meter.module.css\";\nimport { getMeterState } from \"./meterState\";\n\nexport type CircularMeterSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface CircularMeterProps {\n /** Current value. Must be between `min` and `max`. */\n value: number;\n /** @default 0 */\n min?: number;\n /** @default 100 */\n max?: number;\n /** Upper boundary of the low zone. Values ≤ this are \"low\". */\n low?: number;\n /** Lower boundary of the high zone. Values ≥ this are \"high\". */\n high?: number;\n /**\n * Which zone is optimal — determines stroke colour:\n * - `\"high\"` (default) → high=green, mid=amber, low=red (battery, signal)\n * - `\"low\"` → low=green, mid=amber, high=red (CPU load, disk)\n * - `\"mid\"` → mid=green, low/high=amber (temperature)\n */\n optimum?: \"low\" | \"mid\" | \"high\";\n /** Accessible + visible label shown below the value inside the circle. */\n label?: ReactNode;\n /** Show the formatted value inside the circle. @default false */\n showValue?: boolean;\n /** `Intl.NumberFormatOptions` for value formatting. */\n format?: Intl.NumberFormatOptions;\n size?: CircularMeterSize;\n className?: string;\n}\n\nconst SIZES: Record<CircularMeterSize, { diameter: number; strokeWidth: number }> = {\n sm: { diameter: 56, strokeWidth: 5 },\n md: { diameter: 80, strokeWidth: 7 },\n lg: { diameter: 112, strokeWidth: 9 },\n};\n\nexport function CircularMeter({\n value,\n min = 0,\n max = 100,\n low,\n high,\n optimum = \"high\",\n label,\n showValue = false,\n format,\n size = \"md\",\n className = \"\",\n}: CircularMeterProps) {\n const clampedValue = Math.min(Math.max(value, min), max);\n const state = getMeterState(clampedValue, min, max, low, high, optimum);\n\n const { diameter, strokeWidth } = SIZES[size];\n const radius = (diameter - strokeWidth) / 2;\n const circumference = 2 * Math.PI * radius;\n const dashOffset = circumference * (1 - (clampedValue - min) / (max - min));\n const center = diameter / 2;\n\n return (\n <BaseMeter.Root\n value={clampedValue}\n min={min}\n max={max}\n {...(format !== undefined && { format })}\n className={`${styles[\"circular-root\"]} ${styles[`circular-${size}`]} ${className}`}\n >\n <div style={{ position: \"relative\", width: diameter, height: diameter }}>\n <svg\n width={diameter}\n height={diameter}\n viewBox={`0 0 ${diameter} ${diameter}`}\n className={styles[\"circular-svg\"]}\n aria-hidden=\"true\"\n >\n {/* Background track ring */}\n <circle cx={center} cy={center} r={radius} strokeWidth={strokeWidth} className={styles[\"circular-track\"]} />\n {/* Value arc — origin at 12 o'clock */}\n <circle\n cx={center}\n cy={center}\n r={radius}\n strokeWidth={strokeWidth}\n strokeDasharray={circumference}\n strokeDashoffset={dashOffset}\n className={styles[\"circular-indicator\"]}\n data-meter-state={state}\n style={{ transform: \"rotate(-90deg)\", transformOrigin: \"center\" }}\n />\n </svg>\n\n {(showValue || label != null) && (\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {showValue && <BaseMeter.Value className={styles[\"circular-value\"]} />}\n {label != null && <BaseMeter.Label className={styles[\"circular-label\"]}>{label}</BaseMeter.Label>}\n </div>\n )}\n </div>\n </BaseMeter.Root>\n );\n}\n"],"mappings":";;;;;AAmCA,MAAM,QAA8E;CAClF,IAAI;EAAE,UAAU;EAAI,aAAa;EAAG;CACpC,IAAI;EAAE,UAAU;EAAI,aAAa;EAAG;CACpC,IAAI;EAAE,UAAU;EAAK,aAAa;EAAG;CACtC;AAED,SAAgB,cAAc,EAC5B,OACA,MAAM,GACN,MAAM,KACN,KACA,MACA,UAAU,QACV,OACA,YAAY,OACZ,QACA,OAAO,MACP,YAAY,MACS;CACrB,MAAM,eAAe,KAAK,IAAI,KAAK,IAAI,OAAO,IAAI,EAAE,IAAI;CACxD,MAAM,QAAQ,cAAc,cAAc,KAAK,KAAK,KAAK,MAAM,QAAQ;CAEvE,MAAM,EAAE,UAAU,gBAAgB,MAAM;CACxC,MAAM,UAAU,WAAW,eAAe;CAC1C,MAAM,gBAAgB,IAAI,KAAK,KAAK;CACpC,MAAM,aAAa,iBAAiB,KAAK,eAAe,QAAQ,MAAM;CACtE,MAAM,SAAS,WAAW;AAE1B,QACE,oBAACA,MAAU,MAAX;EACE,OAAO;EACF;EACA;EACL,GAAK,WAAW,KAAA,KAAa,EAAE,QAAQ;EACvC,WAAW,GAAGC,qBAAO,iBAAiB,GAAGA,qBAAO,YAAY,QAAQ,GAAG;YAEvE,qBAAC,OAAD;GAAK,OAAO;IAAE,UAAU;IAAY,OAAO;IAAU,QAAQ;IAAU;aAAvE,CACE,qBAAC,OAAD;IACE,OAAO;IACP,QAAQ;IACR,SAAS,OAAO,SAAS,GAAG;IAC5B,WAAWA,qBAAO;IAClB,eAAY;cALd,CAQE,oBAAC,UAAD;KAAQ,IAAI;KAAQ,IAAI;KAAQ,GAAG;KAAqB;KAAa,WAAWA,qBAAO;KAAqB,CAAA,EAE5G,oBAAC,UAAD;KACE,IAAI;KACJ,IAAI;KACJ,GAAG;KACU;KACb,iBAAiB;KACjB,kBAAkB;KAClB,WAAWA,qBAAO;KAClB,oBAAkB;KAClB,OAAO;MAAE,WAAW;MAAkB,iBAAiB;MAAU;KACjE,CAAA,CACE;QAEJ,aAAa,SAAS,SACtB,qBAAC,OAAD;IACE,OAAO;KACL,UAAU;KACV,OAAO;KACP,SAAS;KACT,eAAe;KACf,YAAY;KACZ,gBAAgB;KACjB;cARH,CAUG,aAAa,oBAACD,MAAU,OAAX,EAAiB,WAAWC,qBAAO,mBAAqB,CAAA,EACrE,SAAS,QAAQ,oBAACD,MAAU,OAAX;KAAiB,WAAWC,qBAAO;eAAoB;KAAwB,CAAA,CAC7F;MAEJ;;EACS,CAAA"}
@@ -0,0 +1,4 @@
1
+ import { Meter, MeterProps, MeterSize, styles } from "./meter.js";
2
+ import { CircularMeter, CircularMeterProps, CircularMeterSize } from "./circular-meter.js";
3
+ import { MeterIndicator, MeterIndicatorProps, MeterLabel, MeterLabelProps, MeterTrack, MeterTrackProps, MeterValue, MeterValueProps } from "./parts.js";
4
+ export { CircularMeter, type CircularMeterProps, type CircularMeterSize, Meter, MeterIndicator, type MeterIndicatorProps, MeterLabel, type MeterLabelProps, type MeterProps, type MeterSize, styles as MeterStyles, MeterTrack, type MeterTrackProps, MeterValue, type MeterValueProps };
@@ -0,0 +1,5 @@
1
+ import meter_module_default from "./meter.module.js";
2
+ import { Meter } from "./meter.js";
3
+ import { CircularMeter } from "./circular-meter.js";
4
+ import { MeterIndicator, MeterLabel, MeterTrack, MeterValue } from "./parts.js";
5
+ export { CircularMeter, Meter, MeterIndicator, MeterLabel, meter_module_default as MeterStyles, MeterTrack, MeterValue };
@@ -0,0 +1,152 @@
1
+ @layer components {
2
+ .root_vOHIVq {
3
+ gap: var(--space-1-5);
4
+ flex-direction: column;
5
+ width: 100%;
6
+ display: flex;
7
+ }
8
+
9
+ .label-row_vOHIVq {
10
+ font-family: var(--font-mono);
11
+ font-size: var(--font-size-xs);
12
+ color: var(--color-secondary);
13
+ justify-content: space-between;
14
+ align-items: center;
15
+ display: flex;
16
+ }
17
+
18
+ .label_vOHIVq, .value_vOHIVq {
19
+ font-family: var(--font-mono);
20
+ font-size: var(--font-size-xs);
21
+ color: var(--color-secondary);
22
+ }
23
+
24
+ .track_vOHIVq {
25
+ background-color: var(--color-surface-3);
26
+ border-radius: var(--radius-full);
27
+ width: 100%;
28
+ position: relative;
29
+ overflow: hidden;
30
+ }
31
+
32
+ .track-sm_vOHIVq {
33
+ height: 4px;
34
+ }
35
+
36
+ .track-md_vOHIVq {
37
+ height: 6px;
38
+ }
39
+
40
+ .track-lg_vOHIVq {
41
+ height: 8px;
42
+ }
43
+
44
+ .indicator_vOHIVq {
45
+ border-radius: var(--radius-full);
46
+ background-color: var(--color-accent);
47
+ height: 100%;
48
+ transition: width var(--duration-slower) var(--easing-standard);
49
+ }
50
+
51
+ .indicator_vOHIVq[data-meter-state="optimum"] {
52
+ background-color: var(--color-success-solid);
53
+ }
54
+
55
+ .indicator_vOHIVq[data-meter-state="suboptimal"] {
56
+ background-color: var(--color-warning-solid);
57
+ }
58
+
59
+ .indicator_vOHIVq[data-meter-state="critical"] {
60
+ background-color: var(--color-error-solid);
61
+ }
62
+
63
+ .tick_vOHIVq {
64
+ background-color: var(--color-canvas);
65
+ opacity: .6;
66
+ pointer-events: none;
67
+ width: 1px;
68
+ position: absolute;
69
+ top: 0;
70
+ bottom: 0;
71
+ }
72
+
73
+ .circular-root_vOHIVq {
74
+ align-items: center;
75
+ gap: var(--space-1-5);
76
+ flex-direction: column;
77
+ display: inline-flex;
78
+ }
79
+
80
+ .circular-svg_vOHIVq {
81
+ overflow: visible;
82
+ }
83
+
84
+ .circular-track_vOHIVq {
85
+ fill: none;
86
+ stroke: var(--color-surface-3);
87
+ }
88
+
89
+ .circular-indicator_vOHIVq {
90
+ fill: none;
91
+ stroke: var(--color-accent);
92
+ stroke-linecap: round;
93
+ transition: stroke-dashoffset var(--duration-slower) var(--easing-standard);
94
+ }
95
+
96
+ .circular-indicator_vOHIVq[data-meter-state="optimum"] {
97
+ stroke: var(--color-success-solid);
98
+ }
99
+
100
+ .circular-indicator_vOHIVq[data-meter-state="suboptimal"] {
101
+ stroke: var(--color-warning-solid);
102
+ }
103
+
104
+ .circular-indicator_vOHIVq[data-meter-state="critical"] {
105
+ stroke: var(--color-error-solid);
106
+ }
107
+
108
+ .circular-center_vOHIVq {
109
+ justify-content: center;
110
+ align-items: center;
111
+ gap: var(--space-0-5);
112
+ flex-direction: column;
113
+ display: flex;
114
+ }
115
+
116
+ .circular-value_vOHIVq {
117
+ font-family: var(--font-mono);
118
+ font-weight: var(--font-weight-semibold);
119
+ color: var(--color-primary);
120
+ line-height: 1;
121
+ }
122
+
123
+ .circular-label_vOHIVq {
124
+ font-family: var(--font-mono);
125
+ color: var(--color-secondary);
126
+ line-height: 1;
127
+ }
128
+
129
+ .circular-sm_vOHIVq .circular-value_vOHIVq {
130
+ font-size: var(--font-size-sm);
131
+ }
132
+
133
+ .circular-sm_vOHIVq .circular-label_vOHIVq {
134
+ font-size: var(--font-size-xs);
135
+ }
136
+
137
+ .circular-md_vOHIVq .circular-value_vOHIVq {
138
+ font-size: var(--font-size-xl);
139
+ }
140
+
141
+ .circular-md_vOHIVq .circular-label_vOHIVq {
142
+ font-size: var(--font-size-xs);
143
+ }
144
+
145
+ .circular-lg_vOHIVq .circular-value_vOHIVq {
146
+ font-size: var(--font-size-2xl);
147
+ }
148
+
149
+ .circular-lg_vOHIVq .circular-label_vOHIVq {
150
+ font-size: var(--font-size-sm);
151
+ }
152
+ }
@@ -0,0 +1,58 @@
1
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
2
+ import { ReactNode } from "react";
3
+ import styles from "./meter.module.css";
4
+
5
+ //#region src/meter/meter.d.ts
6
+ type MeterSize = "sm" | "md" | "lg";
7
+ interface MeterProps {
8
+ /** Current value. Must be between `min` and `max`. */
9
+ value: number;
10
+ /** Minimum value of the range. @default 0 */
11
+ min?: number;
12
+ /** Maximum value of the range. @default 100 */
13
+ max?: number;
14
+ /** Upper boundary of the low zone. Values ≤ this are "low". */
15
+ low?: number;
16
+ /** Lower boundary of the high zone. Values ≥ this are "high". */
17
+ high?: number;
18
+ /**
19
+ * Which zone is optimal — determines fill colour:
20
+ * - `"high"` (default) → high=green, mid=amber, low=red (battery, signal)
21
+ * - `"low"` → low=green, mid=amber, high=red (CPU load, disk)
22
+ * - `"mid"` → mid=green, low/high=amber (temperature)
23
+ */
24
+ optimum?: "low" | "mid" | "high";
25
+ /** Accessible + visible label. */
26
+ label?: ReactNode;
27
+ /** Show the formatted value next to the label. @default false */
28
+ showValue?: boolean;
29
+ /** `Intl.NumberFormatOptions` for value formatting. */
30
+ format?: Intl.NumberFormatOptions;
31
+ /** Show tick marks at low/high threshold positions. @default false */
32
+ showTicks?: boolean;
33
+ /** Bar thickness. @default "md" */
34
+ size?: MeterSize;
35
+ className?: string;
36
+ }
37
+ /**
38
+ * Displays a scalar measurement within a known range. Use `low` / `high` /
39
+ * `optimum` thresholds to colour the fill based on whether the value is in
40
+ * an optimal, suboptimal, or critical zone.
41
+ */
42
+ declare function Meter({
43
+ value,
44
+ min,
45
+ max,
46
+ low,
47
+ high,
48
+ optimum,
49
+ label,
50
+ showValue,
51
+ format,
52
+ showTicks,
53
+ size,
54
+ className
55
+ }: MeterProps): react_jsx_runtime0.JSX.Element;
56
+ //#endregion
57
+ export { Meter, MeterProps, MeterSize, styles };
58
+ //# sourceMappingURL=meter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meter.d.ts","names":[],"sources":["../../src/meter/meter.tsx"],"mappings":";;;;;KAKY,SAAA;AAAA,UAEK,UAAA;;EAEf,KAAA;EAJmB;EAMnB,GAAA;EANmB;EAQnB,GAAA;EANe;EAQf,GAAA;;EAEA,IAAA;EAaS;;;;;;EANT,OAAA;EATA;EAWA,KAAA,GAAQ,SAAA;EAFR;EAIA,SAAA;EAFQ;EAIR,MAAA,GAAS,IAAA,CAAK,mBAAA;EAAd;EAEA,SAAA;EAFc;EAId,IAAA,GAAO,SAAA;EACP,SAAA;AAAA;;;;AAQF;;iBAAgB,KAAA,CAAA;EACd,KAAA;EACA,GAAA;EACA,GAAA;EACA,GAAA;EACA,IAAA;EACA,OAAA;EACA,KAAA;EACA,SAAA;EACA,MAAA;EACA,SAAA;EACA,IAAA;EACA;AAAA,GACC,UAAA,GAAU,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -0,0 +1,50 @@
1
+ import meter_module_default from "./meter.module.js";
2
+ import { getMeterState } from "./meterState.js";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ import { Meter } from "@base-ui/react/meter";
5
+ //#region src/meter/meter.tsx
6
+ /**
7
+ * Displays a scalar measurement within a known range. Use `low` / `high` /
8
+ * `optimum` thresholds to colour the fill based on whether the value is in
9
+ * an optimal, suboptimal, or critical zone.
10
+ */
11
+ function Meter$1({ value, min = 0, max = 100, low, high, optimum = "high", label, showValue = false, format, showTicks = false, size = "md", className = "" }) {
12
+ const clampedValue = Math.min(Math.max(value, min), max);
13
+ const state = getMeterState(clampedValue, min, max, low, high, optimum);
14
+ const lowPct = low != null ? (low - min) / (max - min) * 100 : null;
15
+ const highPct = high != null ? (high - min) / (max - min) * 100 : null;
16
+ return /* @__PURE__ */ jsxs(Meter.Root, {
17
+ value: clampedValue,
18
+ min,
19
+ max,
20
+ ...format !== void 0 && { format },
21
+ className: `${meter_module_default.root} ${className}`,
22
+ children: [(label != null || showValue) && /* @__PURE__ */ jsxs("div", {
23
+ className: meter_module_default["label-row"],
24
+ children: [label != null && /* @__PURE__ */ jsx(Meter.Label, {
25
+ className: meter_module_default.label,
26
+ children: label
27
+ }), showValue && /* @__PURE__ */ jsx(Meter.Value, { className: meter_module_default.value })]
28
+ }), /* @__PURE__ */ jsxs(Meter.Track, {
29
+ className: `${meter_module_default.track} ${meter_module_default[`track-${size}`]}`,
30
+ children: [
31
+ /* @__PURE__ */ jsx(Meter.Indicator, {
32
+ className: meter_module_default.indicator,
33
+ "data-meter-state": state
34
+ }),
35
+ showTicks && lowPct != null && /* @__PURE__ */ jsx("div", {
36
+ className: meter_module_default.tick,
37
+ style: { left: `${lowPct}%` }
38
+ }),
39
+ showTicks && highPct != null && /* @__PURE__ */ jsx("div", {
40
+ className: meter_module_default.tick,
41
+ style: { left: `${highPct}%` }
42
+ })
43
+ ]
44
+ })]
45
+ });
46
+ }
47
+ //#endregion
48
+ export { Meter$1 as Meter };
49
+
50
+ //# sourceMappingURL=meter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meter.js","names":["Meter","BaseMeter","styles"],"sources":["../../src/meter/meter.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Meter as BaseMeter } from \"@base-ui/react/meter\";\nimport styles from \"./meter.module.css\";\nimport { getMeterState } from \"./meterState\";\n\nexport type MeterSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface MeterProps {\n /** Current value. Must be between `min` and `max`. */\n value: number;\n /** Minimum value of the range. @default 0 */\n min?: number;\n /** Maximum value of the range. @default 100 */\n max?: number;\n /** Upper boundary of the low zone. Values ≤ this are \"low\". */\n low?: number;\n /** Lower boundary of the high zone. Values ≥ this are \"high\". */\n high?: number;\n /**\n * Which zone is optimal — determines fill colour:\n * - `\"high\"` (default) → high=green, mid=amber, low=red (battery, signal)\n * - `\"low\"` → low=green, mid=amber, high=red (CPU load, disk)\n * - `\"mid\"` → mid=green, low/high=amber (temperature)\n */\n optimum?: \"low\" | \"mid\" | \"high\";\n /** Accessible + visible label. */\n label?: ReactNode;\n /** Show the formatted value next to the label. @default false */\n showValue?: boolean;\n /** `Intl.NumberFormatOptions` for value formatting. */\n format?: Intl.NumberFormatOptions;\n /** Show tick marks at low/high threshold positions. @default false */\n showTicks?: boolean;\n /** Bar thickness. @default \"md\" */\n size?: MeterSize;\n className?: string;\n}\n\n/**\n * Displays a scalar measurement within a known range. Use `low` / `high` /\n * `optimum` thresholds to colour the fill based on whether the value is in\n * an optimal, suboptimal, or critical zone.\n */\nexport function Meter({\n value,\n min = 0,\n max = 100,\n low,\n high,\n optimum = \"high\",\n label,\n showValue = false,\n format,\n showTicks = false,\n size = \"md\",\n className = \"\",\n}: MeterProps) {\n const clampedValue = Math.min(Math.max(value, min), max);\n const state = getMeterState(clampedValue, min, max, low, high, optimum);\n const lowPct = low != null ? ((low - min) / (max - min)) * 100 : null;\n const highPct = high != null ? ((high - min) / (max - min)) * 100 : null;\n\n return (\n <BaseMeter.Root\n value={clampedValue}\n min={min}\n max={max}\n {...(format !== undefined && { format })}\n className={`${styles.root} ${className}`}\n >\n {(label != null || showValue) && (\n <div className={styles[\"label-row\"]}>\n {label != null && <BaseMeter.Label className={styles.label}>{label}</BaseMeter.Label>}\n {showValue && <BaseMeter.Value className={styles.value} />}\n </div>\n )}\n <BaseMeter.Track className={`${styles.track} ${styles[`track-${size}`]}`}>\n <BaseMeter.Indicator className={styles.indicator} data-meter-state={state} />\n {showTicks && lowPct != null && <div className={styles.tick} style={{ left: `${lowPct}%` }} />}\n {showTicks && highPct != null && <div className={styles.tick} style={{ left: `${highPct}%` }} />}\n </BaseMeter.Track>\n </BaseMeter.Root>\n );\n}\n\nexport { styles as MeterStyles };\n"],"mappings":";;;;;;;;;;AA2CA,SAAgBA,QAAM,EACpB,OACA,MAAM,GACN,MAAM,KACN,KACA,MACA,UAAU,QACV,OACA,YAAY,OACZ,QACA,YAAY,OACZ,OAAO,MACP,YAAY,MACC;CACb,MAAM,eAAe,KAAK,IAAI,KAAK,IAAI,OAAO,IAAI,EAAE,IAAI;CACxD,MAAM,QAAQ,cAAc,cAAc,KAAK,KAAK,KAAK,MAAM,QAAQ;CACvE,MAAM,SAAS,OAAO,QAAS,MAAM,QAAQ,MAAM,OAAQ,MAAM;CACjE,MAAM,UAAU,QAAQ,QAAS,OAAO,QAAQ,MAAM,OAAQ,MAAM;AAEpE,QACE,qBAACC,MAAU,MAAX;EACE,OAAO;EACF;EACA;EACL,GAAK,WAAW,KAAA,KAAa,EAAE,QAAQ;EACvC,WAAW,GAAGC,qBAAO,KAAK,GAAG;YAL/B,EAOI,SAAS,QAAQ,cACjB,qBAAC,OAAD;GAAK,WAAWA,qBAAO;aAAvB,CACG,SAAS,QAAQ,oBAACD,MAAU,OAAX;IAAiB,WAAWC,qBAAO;cAAQ;IAAwB,CAAA,EACpF,aAAa,oBAACD,MAAU,OAAX,EAAiB,WAAWC,qBAAO,OAAS,CAAA,CACtD;MAER,qBAACD,MAAU,OAAX;GAAiB,WAAW,GAAGC,qBAAO,MAAM,GAAGA,qBAAO,SAAS;aAA/D;IACE,oBAACD,MAAU,WAAX;KAAqB,WAAWC,qBAAO;KAAW,oBAAkB;KAAS,CAAA;IAC5E,aAAa,UAAU,QAAQ,oBAAC,OAAD;KAAK,WAAWA,qBAAO;KAAM,OAAO,EAAE,MAAM,GAAG,OAAO,IAAI;KAAI,CAAA;IAC7F,aAAa,WAAW,QAAQ,oBAAC,OAAD;KAAK,WAAWA,qBAAO;KAAM,OAAO,EAAE,MAAM,GAAG,QAAQ,IAAI;KAAI,CAAA;IAChF;KACH"}
@@ -0,0 +1,2 @@
1
+ declare const styles: Record<string, string | undefined>;
2
+ export default styles;
@@ -0,0 +1,27 @@
1
+ //#region src/meter/meter.module.css
2
+ var meter_module_default = {
3
+ "circular-center": "circular-center_vOHIVq",
4
+ "circular-indicator": "circular-indicator_vOHIVq",
5
+ "circular-label": "circular-label_vOHIVq",
6
+ "circular-lg": "circular-lg_vOHIVq",
7
+ "circular-md": "circular-md_vOHIVq",
8
+ "circular-root": "circular-root_vOHIVq",
9
+ "circular-sm": "circular-sm_vOHIVq",
10
+ "circular-svg": "circular-svg_vOHIVq",
11
+ "circular-track": "circular-track_vOHIVq",
12
+ "circular-value": "circular-value_vOHIVq",
13
+ "indicator": "indicator_vOHIVq",
14
+ "label": "label_vOHIVq",
15
+ "label-row": "label-row_vOHIVq",
16
+ "root": "root_vOHIVq",
17
+ "tick": "tick_vOHIVq",
18
+ "track": "track_vOHIVq",
19
+ "track-lg": "track-lg_vOHIVq",
20
+ "track-md": "track-md_vOHIVq",
21
+ "track-sm": "track-sm_vOHIVq",
22
+ "value": "value_vOHIVq"
23
+ };
24
+ //#endregion
25
+ export { meter_module_default as default };
26
+
27
+ //# sourceMappingURL=meter.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meter.module.js","names":[],"sources":["../../src/meter/meter.module.css"],"sourcesContent":["@layer components {\n .root {\n display: flex;\n flex-direction: column;\n gap: var(--space-1-5);\n width: 100%;\n }\n\n /* ── Label row ──────────────────────────────────────────────────── */\n\n .label-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-family: var(--font-mono);\n font-size: var(--font-size-xs);\n color: var(--color-secondary);\n }\n\n .label {\n font-family: var(--font-mono);\n font-size: var(--font-size-xs);\n color: var(--color-secondary);\n }\n\n .value {\n font-family: var(--font-mono);\n font-size: var(--font-size-xs);\n color: var(--color-secondary);\n }\n\n /* ── Track (the outer bar) ──────────────────────────────────────── */\n\n .track {\n position: relative;\n width: 100%;\n background-color: var(--color-surface-3);\n border-radius: var(--radius-full);\n overflow: hidden;\n }\n\n .track-sm {\n height: 4px;\n }\n .track-md {\n height: 6px;\n }\n .track-lg {\n height: 8px;\n }\n\n /* ── Indicator (the fill) ───────────────────────────────────────── */\n\n .indicator {\n height: 100%;\n border-radius: var(--radius-full);\n background-color: var(--color-accent);\n transition: width var(--duration-slower) var(--easing-standard);\n }\n\n /* Threshold-based colours — driven by data attributes set in JS */\n .indicator[data-meter-state=\"optimum\"] {\n background-color: var(--color-success-solid);\n }\n .indicator[data-meter-state=\"suboptimal\"] {\n background-color: var(--color-warning-solid);\n }\n .indicator[data-meter-state=\"critical\"] {\n background-color: var(--color-error-solid);\n }\n\n /* ── Tick marks for low / high thresholds ───────────────────────── */\n\n .tick {\n position: absolute;\n top: 0;\n bottom: 0;\n width: 1px;\n background-color: var(--color-canvas);\n opacity: 0.6;\n pointer-events: none;\n }\n\n /* ── Circular gauge ─────────────────────────────────────────────── */\n\n .circular-root {\n display: inline-flex;\n flex-direction: column;\n align-items: center;\n gap: var(--space-1-5);\n }\n\n .circular-svg {\n overflow: visible;\n }\n\n /* Track ring */\n .circular-track {\n fill: none;\n stroke: var(--color-surface-3);\n }\n\n /* Value arc */\n .circular-indicator {\n fill: none;\n stroke: var(--color-accent);\n stroke-linecap: round;\n transition: stroke-dashoffset var(--duration-slower) var(--easing-standard);\n }\n\n .circular-indicator[data-meter-state=\"optimum\"] {\n stroke: var(--color-success-solid);\n }\n .circular-indicator[data-meter-state=\"suboptimal\"] {\n stroke: var(--color-warning-solid);\n }\n .circular-indicator[data-meter-state=\"critical\"] {\n stroke: var(--color-error-solid);\n }\n\n /* Centre text stack */\n .circular-center {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--space-0-5);\n }\n\n .circular-value {\n font-family: var(--font-mono);\n font-weight: var(--font-weight-semibold);\n color: var(--color-primary);\n line-height: 1;\n }\n\n .circular-label {\n font-family: var(--font-mono);\n color: var(--color-secondary);\n line-height: 1;\n }\n\n /* Size variants */\n .circular-sm .circular-value {\n font-size: var(--font-size-sm);\n }\n .circular-sm .circular-label {\n font-size: var(--font-size-xs);\n }\n .circular-md .circular-value {\n font-size: var(--font-size-xl);\n }\n .circular-md .circular-label {\n font-size: var(--font-size-xs);\n }\n .circular-lg .circular-value {\n font-size: var(--font-size-2xl);\n }\n .circular-lg .circular-label {\n font-size: var(--font-size-sm);\n }\n}\n"],"mappings":""}
@@ -0,0 +1,18 @@
1
+ //#region src/meter/meterState.ts
2
+ /**
3
+ * Derives the semantic zone from value + thresholds,
4
+ * following the HTML <meter> spec colouring algorithm.
5
+ *
6
+ * Returns undefined when no thresholds are defined (plain accent colour).
7
+ */
8
+ function getMeterState(value, min, max, low, high, optimum) {
9
+ if (low === void 0 && high === void 0) return void 0;
10
+ const zone = value <= (low ?? min) ? "low" : value >= (high ?? max) ? "high" : "mid";
11
+ if (zone === optimum) return "optimum";
12
+ if (optimum === "mid") return "suboptimal";
13
+ return zone === "mid" ? "suboptimal" : "critical";
14
+ }
15
+ //#endregion
16
+ export { getMeterState };
17
+
18
+ //# sourceMappingURL=meterState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meterState.js","names":[],"sources":["../../src/meter/meterState.ts"],"sourcesContent":["/**\n * Derives the semantic zone from value + thresholds,\n * following the HTML <meter> spec colouring algorithm.\n *\n * Returns undefined when no thresholds are defined (plain accent colour).\n */\nexport function getMeterState(\n value: number,\n min: number,\n max: number,\n low: number | undefined,\n high: number | undefined,\n optimum: \"low\" | \"mid\" | \"high\",\n): \"optimum\" | \"suboptimal\" | \"critical\" | undefined {\n if (low === undefined && high === undefined) return undefined;\n\n const effectiveLow = low ?? min;\n const effectiveHigh = high ?? max;\n\n const zone: \"low\" | \"mid\" | \"high\" = value <= effectiveLow ? \"low\" : value >= effectiveHigh ? \"high\" : \"mid\";\n\n if (zone === optimum) return \"optimum\";\n\n // \"mid\" optimum → no critical zone, extremes are equally suboptimal\n if (optimum === \"mid\") return \"suboptimal\";\n\n // \"low\" or \"high\" optimum → adjacent zone = suboptimal, far end = critical\n return zone === \"mid\" ? \"suboptimal\" : \"critical\";\n}\n"],"mappings":";;;;;;;AAMA,SAAgB,cACd,OACA,KACA,KACA,KACA,MACA,SACmD;AACnD,KAAI,QAAQ,KAAA,KAAa,SAAS,KAAA,EAAW,QAAO,KAAA;CAKpD,MAAM,OAA+B,UAHhB,OAAO,OAGiC,QAAQ,UAF/C,QAAQ,OAEgE,SAAS;AAEvG,KAAI,SAAS,QAAS,QAAO;AAG7B,KAAI,YAAY,MAAO,QAAO;AAG9B,QAAO,SAAS,QAAQ,eAAe"}
@@ -0,0 +1,25 @@
1
+ import * as react from "react";
2
+ import { ComponentPropsWithoutRef } from "react";
3
+ import { Meter } from "@base-ui/react/meter";
4
+
5
+ //#region src/meter/parts.d.ts
6
+ type BaseTrackProps = ComponentPropsWithoutRef<typeof Meter.Track>;
7
+ type BaseIndicatorProps = ComponentPropsWithoutRef<typeof Meter.Indicator>;
8
+ type BaseLabelProps = ComponentPropsWithoutRef<typeof Meter.Label>;
9
+ type BaseValueProps = ComponentPropsWithoutRef<typeof Meter.Value>;
10
+ interface MeterTrackProps extends BaseTrackProps {
11
+ size?: "sm" | "md" | "lg";
12
+ }
13
+ interface MeterIndicatorProps extends BaseIndicatorProps {
14
+ /** Threshold state — controls fill colour. Set automatically by the high-level Meter wrapper. */
15
+ "data-meter-state"?: "optimum" | "suboptimal" | "critical";
16
+ }
17
+ interface MeterLabelProps extends BaseLabelProps {}
18
+ interface MeterValueProps extends BaseValueProps {}
19
+ declare const MeterTrack: react.ForwardRefExoticComponent<MeterTrackProps & react.RefAttributes<HTMLDivElement>>;
20
+ declare const MeterIndicator: react.ForwardRefExoticComponent<MeterIndicatorProps & react.RefAttributes<HTMLDivElement>>;
21
+ declare const MeterLabel: react.ForwardRefExoticComponent<MeterLabelProps & react.RefAttributes<HTMLSpanElement>>;
22
+ declare const MeterValue: react.ForwardRefExoticComponent<MeterValueProps & react.RefAttributes<HTMLSpanElement>>;
23
+ //#endregion
24
+ export { MeterIndicator, MeterIndicatorProps, MeterLabel, MeterLabelProps, MeterTrack, MeterTrackProps, MeterValue, MeterValueProps };
25
+ //# sourceMappingURL=parts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parts.d.ts","names":[],"sources":["../../src/meter/parts.tsx"],"mappings":";;;;;KAyBK,cAAA,GAAiB,wBAAA,QAAgC,KAAA,CAAU,KAAA;AAAA,KAC3D,kBAAA,GAAqB,wBAAA,QAAgC,KAAA,CAAU,SAAA;AAAA,KAC/D,cAAA,GAAiB,wBAAA,QAAgC,KAAA,CAAU,KAAA;AAAA,KAC3D,cAAA,GAAiB,wBAAA,QAAgC,KAAA,CAAU,KAAA;AAAA,UAE/C,eAAA,SAAwB,cAAA;EACvC,IAAA;AAAA;AAAA,UAEe,mBAAA,SAA4B,kBAAA;EARS;EAUpD,kBAAA;AAAA;AAAA,UAEe,eAAA,SAAwB,cAAA;AAAA,UACxB,eAAA,SAAwB,cAAA;AAAA,cAE5B,UAAA,EAAU,KAAA,CAAA,yBAAA,CAAA,eAAA,GAAA,KAAA,CAAA,aAAA,CAAA,cAAA;AAAA,cAaV,cAAA,EAAc,KAAA,CAAA,yBAAA,CAAA,mBAAA,GAAA,KAAA,CAAA,aAAA,CAAA,cAAA;AAAA,cAOd,UAAA,EAAU,KAAA,CAAA,yBAAA,CAAA,eAAA,GAAA,KAAA,CAAA,aAAA,CAAA,eAAA;AAAA,cAOV,UAAA,EAAU,KAAA,CAAA,yBAAA,CAAA,eAAA,GAAA,KAAA,CAAA,aAAA,CAAA,eAAA"}
@@ -0,0 +1,57 @@
1
+ import { cx, resolveClassName } from "../utils/resolveClassName.js";
2
+ import meter_module_default from "./meter.module.js";
3
+ import { jsx } from "react/jsx-runtime";
4
+ import { forwardRef } from "react";
5
+ import { Meter } from "@base-ui/react/meter";
6
+ //#region src/meter/parts.tsx
7
+ /**
8
+ * Styled primitives for Meter.
9
+ *
10
+ * @example
11
+ * ```tsx
12
+ * import { Meter } from '@base-ui/react/meter';
13
+ * import { MeterTrack, MeterIndicator, MeterLabel, MeterValue } from '@brijbyte/agentic-ui/meter';
14
+ *
15
+ * <Meter.Root value={68} min={0} max={100}>
16
+ * <div style={{ display: 'flex', justifyContent: 'space-between' }}>
17
+ * <MeterLabel>Storage</MeterLabel>
18
+ * <MeterValue />
19
+ * </div>
20
+ * <MeterTrack>
21
+ * <MeterIndicator />
22
+ * </MeterTrack>
23
+ * </Meter.Root>
24
+ * ```
25
+ */
26
+ const MeterTrack = forwardRef(function MeterTrack({ className, size = "md", ...props }, ref) {
27
+ return /* @__PURE__ */ jsx(Meter.Track, {
28
+ ref,
29
+ className: (state) => cx(meter_module_default.track, meter_module_default[`track-${size}`], resolveClassName(className, state)),
30
+ ...props
31
+ });
32
+ });
33
+ const MeterIndicator = forwardRef(function MeterIndicator({ className, ...props }, ref) {
34
+ return /* @__PURE__ */ jsx(Meter.Indicator, {
35
+ ref,
36
+ className: (state) => cx(meter_module_default.indicator, resolveClassName(className, state)),
37
+ ...props
38
+ });
39
+ });
40
+ const MeterLabel = forwardRef(function MeterLabel({ className, ...props }, ref) {
41
+ return /* @__PURE__ */ jsx(Meter.Label, {
42
+ ref,
43
+ className: (state) => cx(meter_module_default.label, resolveClassName(className, state)),
44
+ ...props
45
+ });
46
+ });
47
+ const MeterValue = forwardRef(function MeterValue({ className, ...props }, ref) {
48
+ return /* @__PURE__ */ jsx(Meter.Value, {
49
+ ref,
50
+ className: (state) => cx(meter_module_default.value, resolveClassName(className, state)),
51
+ ...props
52
+ });
53
+ });
54
+ //#endregion
55
+ export { MeterIndicator, MeterLabel, MeterTrack, MeterValue };
56
+
57
+ //# sourceMappingURL=parts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parts.js","names":["BaseMeter","styles"],"sources":["../../src/meter/parts.tsx"],"sourcesContent":["/**\n * Styled primitives for Meter.\n *\n * @example\n * ```tsx\n * import { Meter } from '@base-ui/react/meter';\n * import { MeterTrack, MeterIndicator, MeterLabel, MeterValue } from '@brijbyte/agentic-ui/meter';\n *\n * <Meter.Root value={68} min={0} max={100}>\n * <div style={{ display: 'flex', justifyContent: 'space-between' }}>\n * <MeterLabel>Storage</MeterLabel>\n * <MeterValue />\n * </div>\n * <MeterTrack>\n * <MeterIndicator />\n * </MeterTrack>\n * </Meter.Root>\n * ```\n */\nimport { forwardRef } from \"react\";\nimport type { ComponentRef, ComponentPropsWithoutRef } from \"react\";\nimport { Meter as BaseMeter } from \"@base-ui/react/meter\";\nimport styles from \"./meter.module.css\";\nimport { resolveClassName, cx } from \"../utils/resolveClassName\";\n\ntype BaseTrackProps = ComponentPropsWithoutRef<typeof BaseMeter.Track>;\ntype BaseIndicatorProps = ComponentPropsWithoutRef<typeof BaseMeter.Indicator>;\ntype BaseLabelProps = ComponentPropsWithoutRef<typeof BaseMeter.Label>;\ntype BaseValueProps = ComponentPropsWithoutRef<typeof BaseMeter.Value>;\n\nexport interface MeterTrackProps extends BaseTrackProps {\n size?: \"sm\" | \"md\" | \"lg\";\n}\nexport interface MeterIndicatorProps extends BaseIndicatorProps {\n /** Threshold state — controls fill colour. Set automatically by the high-level Meter wrapper. */\n \"data-meter-state\"?: \"optimum\" | \"suboptimal\" | \"critical\";\n}\nexport interface MeterLabelProps extends BaseLabelProps {}\nexport interface MeterValueProps extends BaseValueProps {}\n\nexport const MeterTrack = forwardRef<ComponentRef<typeof BaseMeter.Track>, MeterTrackProps>(function MeterTrack(\n { className, size = \"md\", ...props },\n ref,\n) {\n return (\n <BaseMeter.Track\n ref={ref}\n className={(state) => cx(styles.track, styles[`track-${size}`], resolveClassName(className, state))}\n {...props}\n />\n );\n});\n\nexport const MeterIndicator = forwardRef<ComponentRef<typeof BaseMeter.Indicator>, MeterIndicatorProps>(function MeterIndicator(\n { className, ...props },\n ref,\n) {\n return <BaseMeter.Indicator ref={ref} className={(state) => cx(styles.indicator, resolveClassName(className, state))} {...props} />;\n});\n\nexport const MeterLabel = forwardRef<ComponentRef<typeof BaseMeter.Label>, MeterLabelProps>(function MeterLabel(\n { className, ...props },\n ref,\n) {\n return <BaseMeter.Label ref={ref} className={(state) => cx(styles.label, resolveClassName(className, state))} {...props} />;\n});\n\nexport const MeterValue = forwardRef<ComponentRef<typeof BaseMeter.Value>, MeterValueProps>(function MeterValue(\n { className, ...props },\n ref,\n) {\n return <BaseMeter.Value ref={ref} className={(state) => cx(styles.value, resolveClassName(className, state))} {...props} />;\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAwCA,MAAa,aAAa,WAAkE,SAAS,WACnG,EAAE,WAAW,OAAO,MAAM,GAAG,SAC7B,KACA;AACA,QACE,oBAACA,MAAU,OAAX;EACO;EACL,YAAY,UAAU,GAAGC,qBAAO,OAAOA,qBAAO,SAAS,SAAS,iBAAiB,WAAW,MAAM,CAAC;EACnG,GAAI;EACJ,CAAA;EAEJ;AAEF,MAAa,iBAAiB,WAA0E,SAAS,eAC/G,EAAE,WAAW,GAAG,SAChB,KACA;AACA,QAAO,oBAACD,MAAU,WAAX;EAA0B;EAAK,YAAY,UAAU,GAAGC,qBAAO,WAAW,iBAAiB,WAAW,MAAM,CAAC;EAAE,GAAI;EAAS,CAAA;EACnI;AAEF,MAAa,aAAa,WAAkE,SAAS,WACnG,EAAE,WAAW,GAAG,SAChB,KACA;AACA,QAAO,oBAACD,MAAU,OAAX;EAAsB;EAAK,YAAY,UAAU,GAAGC,qBAAO,OAAO,iBAAiB,WAAW,MAAM,CAAC;EAAE,GAAI;EAAS,CAAA;EAC3H;AAEF,MAAa,aAAa,WAAkE,SAAS,WACnG,EAAE,WAAW,GAAG,SAChB,KACA;AACA,QAAO,oBAACD,MAAU,OAAX;EAAsB;EAAK,YAAY,UAAU,GAAGC,qBAAO,OAAO,iBAAiB,WAAW,MAAM,CAAC;EAAE,GAAI;EAAS,CAAA;EAC3H"}
@@ -6,20 +6,36 @@ import styles from "./number-field.module.css";
6
6
  interface NumberFieldProps {
7
7
  /** Visible label text. When present a scrub-area is also rendered. */
8
8
  label?: ReactNode;
9
+ /** Initial value (uncontrolled). */
9
10
  defaultValue?: number;
11
+ /** Current value (controlled). `null` when the field is empty. */
10
12
  value?: number | null;
13
+ /** Called when the value changes. */
11
14
  onValueChange?: (value: number | null) => void;
15
+ /** Minimum allowed value. */
12
16
  min?: number;
17
+ /** Maximum allowed value. */
13
18
  max?: number;
19
+ /** Increment/decrement step size. @default 1 */
14
20
  step?: number;
21
+ /** Prevent interaction. */
15
22
  disabled?: boolean;
23
+ /** Allow reading but not editing. */
16
24
  readOnly?: boolean;
25
+ /** Mark the field as required for form validation. */
17
26
  required?: boolean;
27
+ /** HTML name attribute for form submission. */
18
28
  name?: string;
29
+ /** `Intl.NumberFormatOptions` for display formatting. */
19
30
  format?: Intl.NumberFormatOptions;
31
+ /** Allow changing the value by scrolling the mouse wheel. */
20
32
  allowWheelScrub?: boolean;
21
33
  className?: string;
22
34
  }
35
+ /**
36
+ * A numeric input with stepper buttons and a scrub area. Supports min/max
37
+ * clamping, step size, locale-aware formatting, and keyboard/scroll input.
38
+ */
23
39
  declare function NumberField({
24
40
  label,
25
41
  className,
@@ -1 +1 @@
1
- {"version":3,"file":"number-field.d.ts","names":[],"sources":["../../src/number-field/number-field.tsx"],"mappings":";;;;;UAKiB,gBAAA;;EAEf,KAAA,GAAQ,SAAA;EACR,YAAA;EACA,KAAA;EACA,aAAA,IAAiB,KAAA;EACjB,GAAA;EACA,GAAA;EACA,IAAA;EACA,QAAA;EACA,QAAA;EACA,QAAA;EACA,IAAA;EACA,MAAA,GAAS,IAAA,CAAK,mBAAA;EACd,eAAA;EACA,SAAA;AAAA;AAAA,iBA2Bc,WAAA,CAAA;EAAc,KAAA;EAAO,SAAA;EAAW,aAAA;EAAA,GAAkB;AAAA,GAAS,gBAAA,GAAgB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
1
+ {"version":3,"file":"number-field.d.ts","names":[],"sources":["../../src/number-field/number-field.tsx"],"mappings":";;;;;UAKiB,gBAAA;;EAEf,KAAA,GAAQ,SAAA;EAFO;EAIf,YAAA;;EAEA,KAAA;EAJA;EAMA,aAAA,IAAiB,KAAA;EAJjB;EAMA,GAAA;EAFA;EAIA,GAAA;EAFA;EAIA,IAAA;EAAA;EAEA,QAAA;EAEA;EAAA,QAAA;EAIA;EAFA,QAAA;EAIS;EAFT,IAAA;EAIA;EAFA,MAAA,GAAS,IAAA,CAAK,mBAAA;EAGL;EADT,eAAA;EACA,SAAA;AAAA;;;;;iBA+Bc,WAAA,CAAA;EAAc,KAAA;EAAO,SAAA;EAAW,aAAA;EAAA,GAAkB;AAAA,GAAS,gBAAA,GAAgB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -39,6 +39,10 @@ function ScrubCursorIcon() {
39
39
  children: /* @__PURE__ */ jsx("path", { d: "M19.5 5.5L6.49737 5.51844V2L1 6.9999L6.5 12L6.49737 8.5L19.5 8.5V12L25 6.9999L19.5 2V5.5Z" })
40
40
  });
41
41
  }
42
+ /**
43
+ * A numeric input with stepper buttons and a scrub area. Supports min/max
44
+ * clamping, step size, locale-aware formatting, and keyboard/scroll input.
45
+ */
42
46
  function NumberField$1({ label, className, onValueChange, ...props }) {
43
47
  const id = useId();
44
48
  return /* @__PURE__ */ jsxs(NumberField.Root, {
@@ -1 +1 @@
1
- {"version":3,"file":"number-field.js","names":["NumberField","BaseNumberField","styles"],"sources":["../../src/number-field/number-field.tsx"],"sourcesContent":["import { useId } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { NumberField as BaseNumberField } from \"@base-ui/react/number-field\";\nimport styles from \"./number-field.module.css\";\n\nexport interface NumberFieldProps {\n /** Visible label text. When present a scrub-area is also rendered. */\n label?: ReactNode;\n defaultValue?: number;\n value?: number | null;\n onValueChange?: (value: number | null) => void;\n min?: number;\n max?: number;\n step?: number;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n name?: string;\n format?: Intl.NumberFormatOptions;\n allowWheelScrub?: boolean;\n className?: string;\n}\n\nfunction MinusIcon() {\n return (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" aria-hidden>\n <path d=\"M0 5H10\" />\n </svg>\n );\n}\n\nfunction PlusIcon() {\n return (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" aria-hidden>\n <path d=\"M0 5H5M10 5H5M5 5V0M5 5V10\" />\n </svg>\n );\n}\n\nfunction ScrubCursorIcon() {\n return (\n <svg width=\"24\" height=\"12\" viewBox=\"0 0 24 14\" fill=\"currentColor\" stroke=\"white\" strokeWidth=\"0.5\" aria-hidden>\n <path d=\"M19.5 5.5L6.49737 5.51844V2L1 6.9999L6.5 12L6.49737 8.5L19.5 8.5V12L25 6.9999L19.5 2V5.5Z\" />\n </svg>\n );\n}\n\nexport function NumberField({ label, className, onValueChange, ...props }: NumberFieldProps) {\n const id = useId();\n\n return (\n <BaseNumberField.Root id={id} className={`${styles.root} ${className ?? \"\"}`} onValueChange={onValueChange as never} {...props}>\n {label && (\n <BaseNumberField.ScrubArea className={styles[\"scrub-area\"]}>\n <label htmlFor={id} className={styles.label}>\n {label}\n </label>\n <BaseNumberField.ScrubAreaCursor className={styles[\"scrub-area-cursor\"]}>\n <ScrubCursorIcon />\n </BaseNumberField.ScrubAreaCursor>\n </BaseNumberField.ScrubArea>\n )}\n <BaseNumberField.Group className={styles.group}>\n <BaseNumberField.Decrement className={`${styles[\"step-button\"]} ${styles.decrement}`}>\n <MinusIcon />\n </BaseNumberField.Decrement>\n <BaseNumberField.Input className={styles.input} />\n <BaseNumberField.Increment className={`${styles[\"step-button\"]} ${styles.increment}`}>\n <PlusIcon />\n </BaseNumberField.Increment>\n </BaseNumberField.Group>\n </BaseNumberField.Root>\n );\n}\nexport { styles as NumberFieldStyles };\n"],"mappings":";;;;;AAuBA,SAAS,YAAY;AACnB,QACE,oBAAC,OAAD;EAAK,OAAM;EAAK,QAAO;EAAK,SAAQ;EAAY,MAAK;EAAO,QAAO;EAAe,aAAY;EAAM,eAAA;YAClG,oBAAC,QAAD,EAAM,GAAE,WAAY,CAAA;EAChB,CAAA;;AAIV,SAAS,WAAW;AAClB,QACE,oBAAC,OAAD;EAAK,OAAM;EAAK,QAAO;EAAK,SAAQ;EAAY,MAAK;EAAO,QAAO;EAAe,aAAY;EAAM,eAAA;YAClG,oBAAC,QAAD,EAAM,GAAE,8BAA+B,CAAA;EACnC,CAAA;;AAIV,SAAS,kBAAkB;AACzB,QACE,oBAAC,OAAD;EAAK,OAAM;EAAK,QAAO;EAAK,SAAQ;EAAY,MAAK;EAAe,QAAO;EAAQ,aAAY;EAAM,eAAA;YACnG,oBAAC,QAAD,EAAM,GAAE,6FAA8F,CAAA;EAClG,CAAA;;AAIV,SAAgBA,cAAY,EAAE,OAAO,WAAW,eAAe,GAAG,SAA2B;CAC3F,MAAM,KAAK,OAAO;AAElB,QACE,qBAACC,YAAgB,MAAjB;EAA0B;EAAI,WAAW,GAAGC,4BAAO,KAAK,GAAG,aAAa;EAAqB;EAAwB,GAAI;YAAzH,CACG,SACC,qBAACD,YAAgB,WAAjB;GAA2B,WAAWC,4BAAO;aAA7C,CACE,oBAAC,SAAD;IAAO,SAAS;IAAI,WAAWA,4BAAO;cACnC;IACK,CAAA,EACR,oBAACD,YAAgB,iBAAjB;IAAiC,WAAWC,4BAAO;cACjD,oBAAC,iBAAD,EAAmB,CAAA;IACa,CAAA,CACR;MAE9B,qBAACD,YAAgB,OAAjB;GAAuB,WAAWC,4BAAO;aAAzC;IACE,oBAACD,YAAgB,WAAjB;KAA2B,WAAW,GAAGC,4BAAO,eAAe,GAAGA,4BAAO;eACvE,oBAAC,WAAD,EAAa,CAAA;KACa,CAAA;IAC5B,oBAACD,YAAgB,OAAjB,EAAuB,WAAWC,4BAAO,OAAS,CAAA;IAClD,oBAACD,YAAgB,WAAjB;KAA2B,WAAW,GAAGC,4BAAO,eAAe,GAAGA,4BAAO;eACvE,oBAAC,UAAD,EAAY,CAAA;KACc,CAAA;IACN;KACH"}
1
+ {"version":3,"file":"number-field.js","names":["NumberField","BaseNumberField","styles"],"sources":["../../src/number-field/number-field.tsx"],"sourcesContent":["import { useId } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { NumberField as BaseNumberField } from \"@base-ui/react/number-field\";\nimport styles from \"./number-field.module.css\";\n\nexport interface NumberFieldProps {\n /** Visible label text. When present a scrub-area is also rendered. */\n label?: ReactNode;\n /** Initial value (uncontrolled). */\n defaultValue?: number;\n /** Current value (controlled). `null` when the field is empty. */\n value?: number | null;\n /** Called when the value changes. */\n onValueChange?: (value: number | null) => void;\n /** Minimum allowed value. */\n min?: number;\n /** Maximum allowed value. */\n max?: number;\n /** Increment/decrement step size. @default 1 */\n step?: number;\n /** Prevent interaction. */\n disabled?: boolean;\n /** Allow reading but not editing. */\n readOnly?: boolean;\n /** Mark the field as required for form validation. */\n required?: boolean;\n /** HTML name attribute for form submission. */\n name?: string;\n /** `Intl.NumberFormatOptions` for display formatting. */\n format?: Intl.NumberFormatOptions;\n /** Allow changing the value by scrolling the mouse wheel. */\n allowWheelScrub?: boolean;\n className?: string;\n}\n\nfunction MinusIcon() {\n return (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" aria-hidden>\n <path d=\"M0 5H10\" />\n </svg>\n );\n}\n\nfunction PlusIcon() {\n return (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" aria-hidden>\n <path d=\"M0 5H5M10 5H5M5 5V0M5 5V10\" />\n </svg>\n );\n}\n\nfunction ScrubCursorIcon() {\n return (\n <svg width=\"24\" height=\"12\" viewBox=\"0 0 24 14\" fill=\"currentColor\" stroke=\"white\" strokeWidth=\"0.5\" aria-hidden>\n <path d=\"M19.5 5.5L6.49737 5.51844V2L1 6.9999L6.5 12L6.49737 8.5L19.5 8.5V12L25 6.9999L19.5 2V5.5Z\" />\n </svg>\n );\n}\n\n/**\n * A numeric input with stepper buttons and a scrub area. Supports min/max\n * clamping, step size, locale-aware formatting, and keyboard/scroll input.\n */\nexport function NumberField({ label, className, onValueChange, ...props }: NumberFieldProps) {\n const id = useId();\n\n return (\n <BaseNumberField.Root id={id} className={`${styles.root} ${className ?? \"\"}`} onValueChange={onValueChange as never} {...props}>\n {label && (\n <BaseNumberField.ScrubArea className={styles[\"scrub-area\"]}>\n <label htmlFor={id} className={styles.label}>\n {label}\n </label>\n <BaseNumberField.ScrubAreaCursor className={styles[\"scrub-area-cursor\"]}>\n <ScrubCursorIcon />\n </BaseNumberField.ScrubAreaCursor>\n </BaseNumberField.ScrubArea>\n )}\n <BaseNumberField.Group className={styles.group}>\n <BaseNumberField.Decrement className={`${styles[\"step-button\"]} ${styles.decrement}`}>\n <MinusIcon />\n </BaseNumberField.Decrement>\n <BaseNumberField.Input className={styles.input} />\n <BaseNumberField.Increment className={`${styles[\"step-button\"]} ${styles.increment}`}>\n <PlusIcon />\n </BaseNumberField.Increment>\n </BaseNumberField.Group>\n </BaseNumberField.Root>\n );\n}\nexport { styles as NumberFieldStyles };\n"],"mappings":";;;;;AAmCA,SAAS,YAAY;AACnB,QACE,oBAAC,OAAD;EAAK,OAAM;EAAK,QAAO;EAAK,SAAQ;EAAY,MAAK;EAAO,QAAO;EAAe,aAAY;EAAM,eAAA;YAClG,oBAAC,QAAD,EAAM,GAAE,WAAY,CAAA;EAChB,CAAA;;AAIV,SAAS,WAAW;AAClB,QACE,oBAAC,OAAD;EAAK,OAAM;EAAK,QAAO;EAAK,SAAQ;EAAY,MAAK;EAAO,QAAO;EAAe,aAAY;EAAM,eAAA;YAClG,oBAAC,QAAD,EAAM,GAAE,8BAA+B,CAAA;EACnC,CAAA;;AAIV,SAAS,kBAAkB;AACzB,QACE,oBAAC,OAAD;EAAK,OAAM;EAAK,QAAO;EAAK,SAAQ;EAAY,MAAK;EAAe,QAAO;EAAQ,aAAY;EAAM,eAAA;YACnG,oBAAC,QAAD,EAAM,GAAE,6FAA8F,CAAA;EAClG,CAAA;;;;;;AAQV,SAAgBA,cAAY,EAAE,OAAO,WAAW,eAAe,GAAG,SAA2B;CAC3F,MAAM,KAAK,OAAO;AAElB,QACE,qBAACC,YAAgB,MAAjB;EAA0B;EAAI,WAAW,GAAGC,4BAAO,KAAK,GAAG,aAAa;EAAqB;EAAwB,GAAI;YAAzH,CACG,SACC,qBAACD,YAAgB,WAAjB;GAA2B,WAAWC,4BAAO;aAA7C,CACE,oBAAC,SAAD;IAAO,SAAS;IAAI,WAAWA,4BAAO;cACnC;IACK,CAAA,EACR,oBAACD,YAAgB,iBAAjB;IAAiC,WAAWC,4BAAO;cACjD,oBAAC,iBAAD,EAAmB,CAAA;IACa,CAAA,CACR;MAE9B,qBAACD,YAAgB,OAAjB;GAAuB,WAAWC,4BAAO;aAAzC;IACE,oBAACD,YAAgB,WAAjB;KAA2B,WAAW,GAAGC,4BAAO,eAAe,GAAGA,4BAAO;eACvE,oBAAC,WAAD,EAAa,CAAA;KACa,CAAA;IAC5B,oBAACD,YAAgB,OAAjB,EAAuB,WAAWC,4BAAO,OAAS,CAAA;IAClD,oBAACD,YAAgB,WAAjB;KAA2B,WAAW,GAAGC,4BAAO,eAAe,GAAGA,4BAAO;eACvE,oBAAC,UAAD,EAAY,CAAA;KACc,CAAA;IACN;KACH"}