@rinzai/zen 0.11.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (289) hide show
  1. package/README.md +37 -7
  2. package/dist/accordion/index.d.ts +41 -0
  3. package/dist/accordion/index.d.ts.map +1 -0
  4. package/dist/accordion/index.js +81 -0
  5. package/dist/animated-number/index.d.ts +3 -2
  6. package/dist/animated-number/index.d.ts.map +1 -1
  7. package/dist/animated-number/index.js +40 -38
  8. package/dist/avatar/index.d.ts +7 -2
  9. package/dist/avatar/index.d.ts.map +1 -1
  10. package/dist/avatar/index.js +17 -11
  11. package/dist/backdrop/index.d.ts +4 -4
  12. package/dist/backdrop/index.d.ts.map +1 -1
  13. package/dist/backdrop/index.js +41 -39
  14. package/dist/badge/index.d.ts +4 -2
  15. package/dist/badge/index.d.ts.map +1 -1
  16. package/dist/badge/index.js +20 -11
  17. package/dist/base.css +4 -0
  18. package/dist/breadcrumbs/index.d.ts +1 -1
  19. package/dist/breadcrumbs/index.d.ts.map +1 -1
  20. package/dist/breadcrumbs/index.js +25 -24
  21. package/dist/button/index.d.ts +3 -3
  22. package/dist/button/index.d.ts.map +1 -1
  23. package/dist/button/index.js +16 -11
  24. package/dist/button-group/index.d.ts +13 -0
  25. package/dist/button-group/index.d.ts.map +1 -0
  26. package/dist/button-group/index.js +14 -0
  27. package/dist/calendar/index.d.ts +15 -8
  28. package/dist/calendar/index.d.ts.map +1 -1
  29. package/dist/calendar/index.js +97 -91
  30. package/dist/calendar-heatmap/index.d.ts +7 -5
  31. package/dist/calendar-heatmap/index.d.ts.map +1 -1
  32. package/dist/calendar-heatmap/index.js +32 -30
  33. package/dist/canvas/geometry.js +0 -1
  34. package/dist/canvas/index.d.ts +6 -6
  35. package/dist/canvas/index.d.ts.map +1 -1
  36. package/dist/canvas/index.js +135 -133
  37. package/dist/carousel/index.d.ts +27 -0
  38. package/dist/carousel/index.d.ts.map +1 -0
  39. package/dist/carousel/index.js +162 -0
  40. package/dist/chart/index.d.ts +5 -4
  41. package/dist/chart/index.d.ts.map +1 -1
  42. package/dist/chart/index.js +137 -135
  43. package/dist/chart/palette.js +0 -1
  44. package/dist/checkbox/index.d.ts +3 -3
  45. package/dist/checkbox/index.d.ts.map +1 -1
  46. package/dist/checkbox/index.js +33 -30
  47. package/dist/chip/index.js +1 -1
  48. package/dist/code-block/index.d.ts.map +1 -1
  49. package/dist/code-block/index.js +27 -25
  50. package/dist/code-input/index.d.ts.map +1 -1
  51. package/dist/code-input/index.js +30 -24
  52. package/dist/collapse/index.d.ts +4 -3
  53. package/dist/collapse/index.d.ts.map +1 -1
  54. package/dist/collapse/index.js +42 -39
  55. package/dist/color-picker/index.d.ts +14 -7
  56. package/dist/color-picker/index.d.ts.map +1 -1
  57. package/dist/color-picker/index.js +139 -128
  58. package/dist/combobox/index.d.ts +14 -6
  59. package/dist/combobox/index.d.ts.map +1 -1
  60. package/dist/combobox/index.js +158 -146
  61. package/dist/command-palette/index.d.ts +4 -3
  62. package/dist/command-palette/index.d.ts.map +1 -1
  63. package/dist/command-palette/index.js +60 -57
  64. package/dist/confirm-dialog/index.d.ts +6 -7
  65. package/dist/confirm-dialog/index.d.ts.map +1 -1
  66. package/dist/confirm-dialog/index.js +20 -16
  67. package/dist/date-picker/index.d.ts +23 -14
  68. package/dist/date-picker/index.d.ts.map +1 -1
  69. package/dist/date-picker/index.js +109 -93
  70. package/dist/dialog/index.d.ts +3 -4
  71. package/dist/dialog/index.d.ts.map +1 -1
  72. package/dist/dialog/index.js +58 -55
  73. package/dist/disclosure/index.d.ts +8 -0
  74. package/dist/disclosure/index.d.ts.map +1 -1
  75. package/dist/disclosure/index.js +31 -32
  76. package/dist/editable-cell/index.d.ts +4 -5
  77. package/dist/editable-cell/index.d.ts.map +1 -1
  78. package/dist/editable-cell/index.js +23 -22
  79. package/dist/field/index.d.ts +8 -8
  80. package/dist/field/index.d.ts.map +1 -1
  81. package/dist/field/index.js +20 -18
  82. package/dist/filter-bar/index.d.ts +2 -2
  83. package/dist/filter-bar/index.d.ts.map +1 -1
  84. package/dist/filter-bar/index.js +38 -36
  85. package/dist/header/index.d.ts +1 -1
  86. package/dist/header/index.d.ts.map +1 -1
  87. package/dist/header/index.js +13 -11
  88. package/dist/hover-card/index.d.ts +32 -0
  89. package/dist/hover-card/index.d.ts.map +1 -0
  90. package/dist/hover-card/index.js +84 -0
  91. package/dist/icon-picker/index.d.ts +16 -5
  92. package/dist/icon-picker/index.d.ts.map +1 -1
  93. package/dist/icon-picker/index.js +42 -47
  94. package/dist/icons/micro/plus.d.ts +3 -0
  95. package/dist/icons/micro/plus.d.ts.map +1 -0
  96. package/dist/icons/micro/plus.js +17 -0
  97. package/dist/index.d.ts +37 -24
  98. package/dist/index.d.ts.map +1 -1
  99. package/dist/input/index.d.ts +5 -1
  100. package/dist/input/index.d.ts.map +1 -1
  101. package/dist/input/index.js +9 -9
  102. package/dist/input-group/index.d.ts +4 -1
  103. package/dist/input-group/index.d.ts.map +1 -1
  104. package/dist/input-group/index.js +14 -14
  105. package/dist/keypad/index.d.ts +9 -7
  106. package/dist/keypad/index.d.ts.map +1 -1
  107. package/dist/keypad/index.js +22 -19
  108. package/dist/lib.js +112 -97
  109. package/dist/load-more/index.d.ts +4 -2
  110. package/dist/load-more/index.d.ts.map +1 -1
  111. package/dist/load-more/index.js +26 -23
  112. package/dist/locale-provider/index.d.ts +23 -0
  113. package/dist/locale-provider/index.d.ts.map +1 -0
  114. package/dist/locale-provider/index.js +35 -0
  115. package/dist/menu/index.d.ts +62 -9
  116. package/dist/menu/index.d.ts.map +1 -1
  117. package/dist/menu/index.js +371 -128
  118. package/dist/meter/index.d.ts +2 -2
  119. package/dist/meter/index.d.ts.map +1 -1
  120. package/dist/meter/index.js +4 -4
  121. package/dist/money-input/index.d.ts +20 -10
  122. package/dist/money-input/index.d.ts.map +1 -1
  123. package/dist/money-input/index.js +199 -190
  124. package/dist/month-picker/index.d.ts +17 -10
  125. package/dist/month-picker/index.d.ts.map +1 -1
  126. package/dist/month-picker/index.js +97 -86
  127. package/dist/navigation-menu/index.d.ts +42 -0
  128. package/dist/navigation-menu/index.d.ts.map +1 -0
  129. package/dist/navigation-menu/index.js +144 -0
  130. package/dist/number-field/index.d.ts +50 -0
  131. package/dist/number-field/index.d.ts.map +1 -0
  132. package/dist/number-field/index.js +133 -0
  133. package/dist/page-header/index.d.ts +4 -3
  134. package/dist/page-header/index.d.ts.map +1 -1
  135. package/dist/page-header/index.js +2 -1
  136. package/dist/pagination/index.d.ts +1 -1
  137. package/dist/pagination/index.d.ts.map +1 -1
  138. package/dist/pagination/index.js +35 -33
  139. package/dist/progress-ring/index.d.ts +4 -3
  140. package/dist/progress-ring/index.d.ts.map +1 -1
  141. package/dist/progress-ring/index.js +11 -10
  142. package/dist/radio-cards/index.d.ts +9 -5
  143. package/dist/radio-cards/index.d.ts.map +1 -1
  144. package/dist/radio-cards/index.js +26 -24
  145. package/dist/radio-group/index.d.ts +9 -8
  146. package/dist/radio-group/index.d.ts.map +1 -1
  147. package/dist/radio-group/index.js +35 -34
  148. package/dist/range-slider/index.d.ts +10 -4
  149. package/dist/range-slider/index.d.ts.map +1 -1
  150. package/dist/range-slider/index.js +43 -31
  151. package/dist/repeat-picker/index.d.ts +13 -6
  152. package/dist/repeat-picker/index.d.ts.map +1 -1
  153. package/dist/repeat-picker/index.js +73 -61
  154. package/dist/resizable/index.d.ts +29 -0
  155. package/dist/resizable/index.d.ts.map +1 -0
  156. package/dist/resizable/index.js +135 -0
  157. package/dist/segmented/index.d.ts +8 -5
  158. package/dist/segmented/index.d.ts.map +1 -1
  159. package/dist/segmented/index.js +36 -34
  160. package/dist/select/index.d.ts +9 -3
  161. package/dist/select/index.d.ts.map +1 -1
  162. package/dist/select/index.js +99 -96
  163. package/dist/separator/index.d.ts +14 -0
  164. package/dist/separator/index.d.ts.map +1 -0
  165. package/dist/separator/index.js +15 -0
  166. package/dist/side-nav/index.js +1 -1
  167. package/dist/skeleton/index.d.ts +4 -4
  168. package/dist/skeleton/index.d.ts.map +1 -1
  169. package/dist/skeleton/index.js +4 -3
  170. package/dist/slider/index.d.ts +6 -3
  171. package/dist/slider/index.d.ts.map +1 -1
  172. package/dist/slider/index.js +29 -23
  173. package/dist/sortable/index.d.ts +10 -20
  174. package/dist/sortable/index.d.ts.map +1 -1
  175. package/dist/sortable/index.js +72 -134
  176. package/dist/sortable/shared.d.ts +56 -0
  177. package/dist/sortable/shared.d.ts.map +1 -0
  178. package/dist/sortable/shared.js +104 -0
  179. package/dist/sortable/tree-model.d.ts +46 -0
  180. package/dist/sortable/tree-model.d.ts.map +1 -0
  181. package/dist/sortable/tree-model.js +87 -0
  182. package/dist/sortable/tree.d.ts +31 -0
  183. package/dist/sortable/tree.d.ts.map +1 -0
  184. package/dist/sortable/tree.js +150 -0
  185. package/dist/sparkline/index.d.ts +1 -1
  186. package/dist/sparkline/index.d.ts.map +1 -1
  187. package/dist/sparkline/index.js +26 -25
  188. package/dist/spinner/index.d.ts +4 -3
  189. package/dist/spinner/index.d.ts.map +1 -1
  190. package/dist/spinner/index.js +2 -1
  191. package/dist/status-pill/index.d.ts.map +1 -1
  192. package/dist/status-pill/index.js +1 -1
  193. package/dist/stepper/index.d.ts +1 -1
  194. package/dist/stepper/index.d.ts.map +1 -1
  195. package/dist/stepper/index.js +31 -30
  196. package/dist/tab-bar/index.js +1 -1
  197. package/dist/table/index.d.ts +5 -5
  198. package/dist/table/index.d.ts.map +1 -1
  199. package/dist/table/index.js +66 -64
  200. package/dist/table/selection.d.ts +2 -2
  201. package/dist/table/selection.d.ts.map +1 -1
  202. package/dist/table/selection.js +41 -38
  203. package/dist/table/swipe.d.ts +1 -1
  204. package/dist/table/swipe.d.ts.map +1 -1
  205. package/dist/table/swipe.js +1 -1
  206. package/dist/table-of-contents/index.d.ts +4 -2
  207. package/dist/table-of-contents/index.d.ts.map +1 -1
  208. package/dist/table-of-contents/index.js +27 -25
  209. package/dist/tabs/index.d.ts.map +1 -1
  210. package/dist/tabs/index.js +90 -88
  211. package/dist/tag-input/index.d.ts +3 -1
  212. package/dist/tag-input/index.d.ts.map +1 -1
  213. package/dist/tag-input/index.js +61 -52
  214. package/dist/theme-toggle/index.d.ts +9 -8
  215. package/dist/theme-toggle/index.d.ts.map +1 -1
  216. package/dist/theme-toggle/index.js +30 -28
  217. package/dist/theme.css +90 -12
  218. package/dist/time-field/index.d.ts +31 -0
  219. package/dist/time-field/index.d.ts.map +1 -0
  220. package/dist/time-field/index.js +175 -0
  221. package/dist/timeline/index.js +1 -1
  222. package/dist/toast/index.d.ts +1 -1
  223. package/dist/toast/index.d.ts.map +1 -1
  224. package/dist/toast/index.js +127 -125
  225. package/dist/toggle/index.d.ts +2 -2
  226. package/dist/toggle/index.d.ts.map +1 -1
  227. package/dist/toggle/index.js +8 -6
  228. package/dist/toggle-group/index.d.ts +35 -0
  229. package/dist/toggle-group/index.d.ts.map +1 -0
  230. package/dist/toggle-group/index.js +53 -0
  231. package/dist/toolbar/index.d.ts +19 -0
  232. package/dist/toolbar/index.d.ts.map +1 -0
  233. package/dist/toolbar/index.js +36 -0
  234. package/dist/tooltip/index.d.ts.map +1 -1
  235. package/dist/tooltip/index.js +40 -74
  236. package/dist/tree/index.d.ts.map +1 -1
  237. package/dist/tree/index.js +105 -102
  238. package/dist/trend/index.d.ts +2 -2
  239. package/dist/trend/index.d.ts.map +1 -1
  240. package/dist/trend/index.js +20 -19
  241. package/dist/utils/color.js +0 -1
  242. package/dist/utils/cva.js +0 -1
  243. package/dist/utils/cx.js +0 -1
  244. package/dist/utils/date.d.ts +6 -0
  245. package/dist/utils/date.d.ts.map +1 -1
  246. package/dist/utils/date.js +1 -2
  247. package/dist/utils/direction.d.ts +7 -0
  248. package/dist/utils/direction.d.ts.map +1 -0
  249. package/dist/utils/direction.js +6 -0
  250. package/dist/utils/form-value.d.ts +15 -0
  251. package/dist/utils/form-value.d.ts.map +1 -0
  252. package/dist/utils/form-value.js +29 -0
  253. package/dist/utils/fx.js +0 -1
  254. package/dist/utils/merge.js +0 -1
  255. package/dist/utils/messages.d.ts +137 -0
  256. package/dist/utils/messages.d.ts.map +1 -0
  257. package/dist/utils/messages.js +133 -0
  258. package/dist/utils/money.js +0 -1
  259. package/dist/utils/month.js +0 -1
  260. package/dist/utils/motion.js +0 -1
  261. package/dist/utils/refs.d.ts +6 -0
  262. package/dist/utils/refs.d.ts.map +1 -0
  263. package/dist/utils/refs.js +13 -0
  264. package/dist/utils/repeat.d.ts +3 -1
  265. package/dist/utils/repeat.d.ts.map +1 -1
  266. package/dist/utils/repeat.js +28 -25
  267. package/dist/utils/roving.d.ts +17 -0
  268. package/dist/utils/roving.d.ts.map +1 -0
  269. package/dist/utils/roving.js +35 -0
  270. package/dist/utils/section-link.js +0 -1
  271. package/dist/utils/slot.d.ts.map +1 -1
  272. package/dist/utils/slot.js +7 -11
  273. package/dist/utils/status-icons.js +7 -7
  274. package/dist/utils/styles.d.ts +9 -2
  275. package/dist/utils/styles.d.ts.map +1 -1
  276. package/dist/utils/styles.js +6 -3
  277. package/dist/utils/theme-wave.js +0 -1
  278. package/dist/utils/theme.js +0 -1
  279. package/dist/utils/useAnchoredPopup.d.ts +7 -4
  280. package/dist/utils/useAnchoredPopup.d.ts.map +1 -1
  281. package/dist/utils/useAnchoredPopup.js +18 -11
  282. package/dist/utils/useControllable.d.ts +9 -0
  283. package/dist/utils/useControllable.d.ts.map +1 -0
  284. package/dist/utils/useControllable.js +15 -0
  285. package/dist/utils/useHoverPopup.d.ts +39 -0
  286. package/dist/utils/useHoverPopup.d.ts.map +1 -0
  287. package/dist/utils/useHoverPopup.js +64 -0
  288. package/dist/zen.css +1 -1
  289. package/package.json +1 -1
@@ -1,18 +1,21 @@
1
1
  import { Month } from '../utils/month';
2
+ import { FieldSize } from '../utils/styles';
2
3
  import { ComponentProps } from 'react';
3
4
  /**
4
5
  * Month selector: a field showing "Sep 2026" that opens a year and a 12-month
5
- * grid. Months are "YYYY-MM" strings. With `onClear`, the popup also offers
6
- * `clearLabel` (e.g. "No end") to empty it.
6
+ * grid. Months are "YYYY-MM" strings. When `clearable`, the popup also offers
7
+ * `clearLabel` (e.g. "No end") to empty it. With `name`, it's submitted with a form.
7
8
  */
8
- export default function MonthPicker({ value, onChange, locale, min, max, id, className, disabled, placeholder, onClear, clearLabel, style, ...rest }: MonthPickerProps): import('react').JSX.Element;
9
+ export default function MonthPicker({ value: valueProp, defaultValue, onValueChange, locale: localeProp, min, max, id, className, disabled, size, placeholder: placeholderProp, clearable, clearLabel: clearLabelProp, name, style, ...rest }: MonthPickerProps): import('react').JSX.Element;
9
10
  /** Also takes the trigger button's props (aria-*, data-*, onBlur…), so Field can wire it up. */
10
11
  export interface MonthPickerProps extends Omit<ComponentProps<'button'>, 'value' | 'onChange' | 'defaultValue'> {
11
- /** "YYYY-MM", or null for none. */
12
- value: Month | null;
13
- onChange: (month: Month) => void;
14
- /** Decides month names and format, e.g. "en-IN". */
15
- locale: string;
12
+ /** "YYYY-MM", or null for none, when you keep it. */
13
+ value?: Month | null;
14
+ /** The first month, when the picker keeps its own. */
15
+ defaultValue?: Month | null;
16
+ onValueChange?: (month: Month | null) => void;
17
+ /** Decides month names and format, e.g. "en-IN". Defaults to the LocaleProvider's. */
18
+ locale?: string;
16
19
  /** Earliest month that can be picked ("YYYY-MM"). */
17
20
  min?: Month;
18
21
  /** Latest month that can be picked. */
@@ -21,9 +24,13 @@ export interface MonthPickerProps extends Omit<ComponentProps<'button'>, 'value'
21
24
  /** Classes for the trigger (e.g. a width, instead of the default full width). */
22
25
  className?: string;
23
26
  disabled?: boolean;
27
+ /** Height, matching Button's: sm (32px), default (40px) or lg (44px). */
28
+ size?: FieldSize;
24
29
  placeholder?: string;
25
- /** Offers a clear option in the popup (shown when a month is set). */
26
- onClear?: () => void;
30
+ /** Offers a clear option in the popup (shown when a month is set); clearing reports null. */
31
+ clearable?: boolean;
27
32
  clearLabel?: string;
33
+ /** Form field name: the month ("YYYY-MM") is submitted with the form. */
34
+ name?: string;
28
35
  }
29
36
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/month-picker/index.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAe,KAAK,KAAK,EAAc,MAAM,kBAAkB,CAAC;AAWvE,OAAO,EAAE,cAAc,EAAY,MAAM,OAAO,CAAC;AAEjD;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAChC,KAAK,EACL,QAAQ,EACR,MAAM,EACN,GAAG,EACH,GAAG,EACH,EAAE,EACF,SAAS,EACT,QAAgB,EAChB,WAA4B,EAC5B,OAAO,EACP,UAAoB,EACpB,KAAK,EACL,GAAG,IAAI,EACV,EAAE,gBAAgB,+BA2FlB;AAED,gGAAgG;AAChG,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,cAAc,CAAC;IAC3G,mCAAmC;IACnC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,oDAAoD;IACpD,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,GAAG,CAAC,EAAE,KAAK,CAAC;IACZ,uCAAuC;IACvC,GAAG,CAAC,EAAE,KAAK,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/month-picker/index.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAe,KAAK,KAAK,EAAc,MAAM,kBAAkB,CAAC;AACvE,OAAO,EASH,KAAK,SAAS,EACjB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,cAAc,EAAY,MAAM,OAAO,CAAC;AAEjD;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAChC,KAAK,EAAE,SAAS,EAChB,YAAmB,EACnB,aAAa,EACb,MAAM,EAAE,UAAU,EAClB,GAAG,EACH,GAAG,EACH,EAAE,EACF,SAAS,EACT,QAAgB,EAChB,IAAgB,EAChB,WAAW,EAAE,eAAe,EAC5B,SAAiB,EACjB,UAAU,EAAE,cAAc,EAC1B,IAAI,EACJ,KAAK,EACL,GAAG,IAAI,EACV,EAAE,gBAAgB,+BAwGlB;AAED,gGAAgG;AAChG,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,cAAc,CAAC;IAC3G,qDAAqD;IACrD,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACrB,sDAAsD;IACtD,YAAY,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IAC5B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC;IAC9C,sFAAsF;IACtF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,GAAG,CAAC,EAAE,KAAK,CAAC;IACZ,uCAAuC;IACvC,GAAG,CAAC,EAAE,KAAK,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yEAAyE;IACzE,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6FAA6F;IAC7F,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB"}
@@ -1,93 +1,104 @@
1
1
  "use client";
2
2
  import { cx as e } from "../utils/cx.js";
3
- import { useAnchoredPopup as t } from "../utils/useAnchoredPopup.js";
4
- import { useFieldProps as n } from "../field/index.js";
5
- import { PICKER_MONTH as r, PICKER_NAV as i, PLACEHOLDER as a, POPUP as o, TRIGGER as s } from "../utils/styles.js";
6
- import { FieldChevron as c } from "../utils/field-chevron.js";
7
- import l from "../icons/chevron-left.js";
8
- import u from "../icons/chevron-right.js";
9
- import { formatMonth as d, monthNames as f } from "../utils/month.js";
10
- import { useState as p } from "react";
11
- import { Fragment as m, jsx as h, jsxs as g } from "react/jsx-runtime";
3
+ import { useControllable as t } from "../utils/useControllable.js";
4
+ import { useAnchoredPopup as n } from "../utils/useAnchoredPopup.js";
5
+ import { useLocale as r, useMessages as i } from "../locale-provider/index.js";
6
+ import { useFieldProps as a } from "../field/index.js";
7
+ import { FIELD_SIZE as o, PICKER_MONTH as s, PICKER_NAV as c, PLACEHOLDER as l, POPUP as u, TRIGGER as d } from "../utils/styles.js";
8
+ import { FormValue as f } from "../utils/form-value.js";
9
+ import { FieldChevron as p } from "../utils/field-chevron.js";
10
+ import m from "../icons/chevron-left.js";
11
+ import h from "../icons/chevron-right.js";
12
+ import { formatMonth as g, monthNames as _ } from "../utils/month.js";
13
+ import { useState as v } from "react";
14
+ import { Fragment as y, jsx as b, jsxs as x } from "react/jsx-runtime";
12
15
  //#region packages/month-picker/index.tsx
13
- function _({ value: _, onChange: v, locale: y, min: b, max: x, id: S, className: C, disabled: w = !1, placeholder: T = "Pick a month", onClear: E, clearLabel: D = "Clear", style: O, ...k }) {
14
- let [A, j] = p(() => Number((_ ?? (/* @__PURE__ */ new Date()).toISOString()).slice(0, 4))), M = t({ onOpenChange: (e) => e && _ && j(Number(_.slice(0, 4))) }), N = n({
15
- ...k,
16
- id: S
17
- }), P = f(y), F = (e) => (!b || e >= b) && (!x || e <= x);
18
- return /* @__PURE__ */ g(m, { children: [/* @__PURE__ */ g("button", {
19
- type: "button",
20
- ...k,
21
- ...N,
22
- id: S,
23
- disabled: w,
24
- ...M.triggerProps,
25
- style: {
26
- ...M.triggerProps.style,
27
- ...O
28
- },
29
- className: e("zen__month-picker group", s, "w-full", M.open && "border-glow/60 [--glow-border-color:transparent] shadow-glow-focus", C),
30
- children: [/* @__PURE__ */ h("span", {
31
- className: _ ? void 0 : a,
32
- children: _ ? d(_, y) : T
33
- }), /* @__PURE__ */ h(c, { open: M.open })]
34
- }), /* @__PURE__ */ g("div", {
35
- ...M.popupProps,
36
- role: "dialog",
37
- "aria-label": "Choose month",
38
- className: e("zen__popover", o, "w-64 p-3"),
39
- children: [
40
- /* @__PURE__ */ g("div", {
41
- className: "mb-2 flex items-center justify-between",
42
- children: [
43
- /* @__PURE__ */ h("button", {
44
- type: "button",
45
- "aria-label": "Previous year",
46
- onClick: () => j((e) => e - 1),
47
- className: i,
48
- children: /* @__PURE__ */ h(l, { className: "size-4" })
49
- }),
50
- /* @__PURE__ */ h("span", {
51
- className: "text-sm font-semibold tabular-nums",
52
- "aria-live": "polite",
53
- children: A
54
- }),
55
- /* @__PURE__ */ h("button", {
56
- type: "button",
57
- "aria-label": "Next year",
58
- onClick: () => j((e) => e + 1),
59
- className: i,
60
- children: /* @__PURE__ */ h(u, { className: "size-4" })
16
+ function S({ value: S, defaultValue: C = null, onValueChange: w, locale: T, min: E, max: D, id: O, className: k, disabled: A = !1, size: j = "default", placeholder: M, clearable: N = !1, clearLabel: P, name: F, style: I, ...L }) {
17
+ let R = i(), z = M ?? R.pickMonth, B = P ?? R.clear, V = r(T), [H, U, W] = t(S, C, w), [G, K] = v(() => Number((H ?? (/* @__PURE__ */ new Date()).toISOString()).slice(0, 4))), q = n({ onOpenChange: (e) => e && H && K(Number(H.slice(0, 4))) }), J = a({
18
+ ...L,
19
+ id: O
20
+ }), Y = _(V), X = (e) => (!E || e >= E) && (!D || e <= D);
21
+ return /* @__PURE__ */ x(y, { children: [
22
+ /* @__PURE__ */ x("button", {
23
+ type: "button",
24
+ ...L,
25
+ ...J,
26
+ id: O,
27
+ disabled: A,
28
+ ...q.triggerProps,
29
+ style: {
30
+ ...q.triggerProps.style,
31
+ ...I
32
+ },
33
+ className: e("zen__month-picker group", d, o[j], "w-full", q.open && "border-glow/60 [--glow-border-color:transparent] shadow-glow-focus", k),
34
+ children: [/* @__PURE__ */ b("span", {
35
+ className: H ? void 0 : l,
36
+ children: H ? g(H, V) : z
37
+ }), /* @__PURE__ */ b(p, { open: q.open })]
38
+ }),
39
+ /* @__PURE__ */ b(f, {
40
+ name: F,
41
+ value: H ?? "",
42
+ onReset: W
43
+ }),
44
+ /* @__PURE__ */ x("div", {
45
+ ...q.popupProps,
46
+ role: "dialog",
47
+ "aria-label": R.chooseMonth,
48
+ className: e("zen__popover", u, "w-64 p-3"),
49
+ children: [
50
+ /* @__PURE__ */ x("div", {
51
+ className: "mb-2 flex items-center justify-between",
52
+ children: [
53
+ /* @__PURE__ */ b("button", {
54
+ type: "button",
55
+ "aria-label": R.previousYear,
56
+ onClick: () => K((e) => e - 1),
57
+ className: c,
58
+ children: /* @__PURE__ */ b(m, { className: "size-4 rtl:-scale-x-100" })
59
+ }),
60
+ /* @__PURE__ */ b("span", {
61
+ className: "text-sm font-semibold tabular-nums",
62
+ "aria-live": "polite",
63
+ children: G
64
+ }),
65
+ /* @__PURE__ */ b("button", {
66
+ type: "button",
67
+ "aria-label": R.nextYear,
68
+ onClick: () => K((e) => e + 1),
69
+ className: c,
70
+ children: /* @__PURE__ */ b(h, { className: "size-4 rtl:-scale-x-100" })
71
+ })
72
+ ]
73
+ }),
74
+ /* @__PURE__ */ b("div", {
75
+ className: "grid grid-cols-3 gap-1",
76
+ children: Y.map((t, n) => {
77
+ let r = `${G}-${String(n + 1).padStart(2, "0")}`, i = r === H;
78
+ return /* @__PURE__ */ b("button", {
79
+ type: "button",
80
+ disabled: !X(r),
81
+ "aria-pressed": i,
82
+ "aria-label": g(r, V, "long"),
83
+ onClick: () => {
84
+ U(r), q.setOpen(!1);
85
+ },
86
+ className: e(s, i && "bg-primary text-primary-foreground hover:bg-primary"),
87
+ children: t
88
+ }, r);
61
89
  })
62
- ]
63
- }),
64
- /* @__PURE__ */ h("div", {
65
- className: "grid grid-cols-3 gap-1",
66
- children: P.map((t, n) => {
67
- let i = `${A}-${String(n + 1).padStart(2, "0")}`, a = i === _;
68
- return /* @__PURE__ */ h("button", {
69
- type: "button",
70
- disabled: !F(i),
71
- "aria-pressed": a,
72
- "aria-label": d(i, y, "long"),
73
- onClick: () => {
74
- v(i), M.setOpen(!1);
75
- },
76
- className: e(r, a && "bg-primary text-primary-foreground hover:bg-primary"),
77
- children: t
78
- }, i);
90
+ }),
91
+ N && H && /* @__PURE__ */ b("button", {
92
+ type: "button",
93
+ onClick: () => {
94
+ U(null), q.setOpen(!1);
95
+ },
96
+ className: "border-tint/[0.06] text-muted-foreground hover:text-foreground focus-ring mt-2 w-full cursor-pointer rounded-lg border-t px-2 pt-2.5 pb-1.5 text-sm outline-hidden",
97
+ children: B
79
98
  })
80
- }),
81
- E && _ && /* @__PURE__ */ h("button", {
82
- type: "button",
83
- onClick: () => {
84
- E(), M.setOpen(!1);
85
- },
86
- className: "border-tint/[0.06] text-muted-foreground hover:text-foreground focus-visible:ring-ring/40 mt-2 w-full cursor-pointer rounded-lg border-t px-2 pt-2.5 pb-1.5 text-sm outline-hidden focus-visible:ring-2",
87
- children: D
88
- })
89
- ]
90
- })] });
99
+ ]
100
+ })
101
+ ] });
91
102
  }
92
103
  //#endregion
93
- export { _ as default };
104
+ export { S as default };
@@ -0,0 +1,42 @@
1
+ import { ComponentProps } from 'react';
2
+ /**
3
+ * A site's navigation: links, and labels that open panels of links below
4
+ * them, on hover (after `openDelay`; at once while another is open) or with a
5
+ * click or Enter. Escape, a click outside or Tab moving on closes it. Fill it
6
+ * with NavigationMenuItems, each a NavigationMenuLink, or a
7
+ * NavigationMenuTrigger and a NavigationMenuContent. Name it with
8
+ * `aria-label` when there's more than one nav on the page.
9
+ */
10
+ export default function NavigationMenu({ openDelay, closeDelay, className, children, ...rest }: NavigationMenuProps): import('react').JSX.Element;
11
+ /** One place in the menu: a link, or a label with its panel. */
12
+ export declare function NavigationMenuItem({ className, onBlur, children, ...rest }: ComponentProps<'li'>): import('react').JSX.Element;
13
+ /** The label that opens its item's panel; a chevron after it turns over while it's open. */
14
+ export declare function NavigationMenuTrigger({ className, style, onClick, onPointerEnter, onPointerLeave, children, ref, ...rest }: ComponentProps<'button'>): import('react').JSX.Element;
15
+ /** The panel: glass, below its label (above it if there's no room), lined up with its start. Lay out its links as you like. */
16
+ export declare function NavigationMenuContent({ align, offset, className, style, onPointerEnter, onPointerLeave, ref, ...rest }: NavigationMenuContentProps): import('react').JSX.Element;
17
+ /**
18
+ * A link: one of the bar's labels at the top, or a row in a panel (with an
19
+ * optional `description` under its text). `active` marks the page you're on.
20
+ * With `asChild`, your router's link instead of an `<a>`.
21
+ */
22
+ export declare function NavigationMenuLink({ active, description, asChild, className, children, ...rest }: NavigationMenuLinkProps): import('react').JSX.Element;
23
+ export interface NavigationMenuProps extends ComponentProps<'nav'> {
24
+ /** How long the pointer rests on a label before its panel opens, in ms. */
25
+ openDelay?: number;
26
+ /** How long a panel opened by the pointer stays after it leaves, in ms (time to reach the panel). */
27
+ closeDelay?: number;
28
+ }
29
+ export interface NavigationMenuContentProps extends ComponentProps<'div'> {
30
+ align?: 'start' | 'end' | 'center';
31
+ /** Gap below the label, in px. */
32
+ offset?: number;
33
+ }
34
+ export interface NavigationMenuLinkProps extends ComponentProps<'a'> {
35
+ /** The page it leads to is the one you're on. */
36
+ active?: boolean;
37
+ /** In a panel, a line under the link's text. */
38
+ description?: string;
39
+ /** Put its props on your own link (the single child), e.g. a router's Link. */
40
+ asChild?: boolean;
41
+ }
42
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/navigation-menu/index.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAyE,MAAM,OAAO,CAAC;AA0B9G;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EACnC,SAAe,EACf,UAAgB,EAChB,SAAS,EACT,QAAQ,EACR,GAAG,IAAI,EACV,EAAE,mBAAmB,+BASrB;AAED,gEAAgE;AAChE,wBAAgB,kBAAkB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,cAAc,CAAC,IAAI,CAAC,+BAmDhG;AAED,4FAA4F;AAC5F,wBAAgB,qBAAqB,CAAC,EAClC,SAAS,EACT,KAAK,EACL,OAAO,EACP,cAAc,EACd,cAAc,EACd,QAAQ,EACR,GAAG,EACH,GAAG,IAAI,EACV,EAAE,cAAc,CAAC,QAAQ,CAAC,+BA8B1B;AAED,+HAA+H;AAC/H,wBAAgB,qBAAqB,CAAC,EAClC,KAAe,EACf,MAAU,EACV,SAAS,EACT,KAAK,EACL,cAAc,EACd,cAAc,EACd,GAAG,EACH,GAAG,IAAI,EACV,EAAE,0BAA0B,+BAsB5B;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,EAC/B,MAAM,EACN,WAAW,EACX,OAAO,EACP,SAAS,EACT,QAAQ,EACR,GAAG,IAAI,EACV,EAAE,uBAAuB,+BAyBzB;AAED,MAAM,WAAW,mBAAoB,SAAQ,cAAc,CAAC,KAAK,CAAC;IAC9D,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qGAAqG;IACrG,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,0BAA2B,SAAQ,cAAc,CAAC,KAAK,CAAC;IACrE,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;IACnC,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,uBAAwB,SAAQ,cAAc,CAAC,GAAG,CAAC;IAChE,iDAAiD;IACjD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gDAAgD;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB"}
@@ -0,0 +1,144 @@
1
+ "use client";
2
+ import { cx as e } from "../utils/cx.js";
3
+ import { useGraphicsMode as t } from "../utils/graphics.js";
4
+ import { useMergedRefs as n } from "../utils/refs.js";
5
+ import { Slot as r } from "../utils/slot.js";
6
+ import { anchoredStyle as i, useAnchoredPopup as a } from "../utils/useAnchoredPopup.js";
7
+ import { POPUP as o } from "../utils/styles.js";
8
+ import { FieldChevron as s } from "../utils/field-chevron.js";
9
+ import { createContext as c, useContext as l, useEffect as u, useRef as d } from "react";
10
+ import { Fragment as f, jsx as p, jsxs as m } from "react/jsx-runtime";
11
+ //#region packages/navigation-menu/index.tsx
12
+ var h = c(null), g = c({
13
+ openDelay: 150,
14
+ closeDelay: 200
15
+ }), _ = c(!1);
16
+ function v(e) {
17
+ let t = l(h);
18
+ if (!t) throw Error(`<${e}> must be inside <NavigationMenuItem>`);
19
+ return t;
20
+ }
21
+ var y = "text-muted-foreground hover:text-foreground focus-ring inline-flex h-9 cursor-pointer items-center gap-1 rounded-lg px-3 text-sm transition-colors outline-hidden select-none data-popup-open:bg-tint/[0.07] data-popup-open:text-foreground aria-[current=page]:text-foreground";
22
+ function b({ openDelay: n = 150, closeDelay: r = 200, className: i, children: a, ...o }) {
23
+ return t(), /* @__PURE__ */ p(g.Provider, {
24
+ value: {
25
+ openDelay: n,
26
+ closeDelay: r
27
+ },
28
+ children: /* @__PURE__ */ p("nav", {
29
+ ...o,
30
+ className: e("zen__navigation-menu relative", i),
31
+ children: /* @__PURE__ */ p("ul", {
32
+ className: "flex items-center gap-0.5",
33
+ children: a
34
+ })
35
+ })
36
+ });
37
+ }
38
+ function x({ className: t, onBlur: n, children: r, ...i }) {
39
+ let { openDelay: o, closeDelay: s } = l(g), c = d(null), f = d(!1), m = d(0), _ = a({ onOpenChange: (e) => {
40
+ if (e) return;
41
+ f.current = !1;
42
+ let t = document.activeElement;
43
+ (!t || t === document.body || _.popupRef.current?.contains(t)) && c.current?.focus();
44
+ } });
45
+ return u(() => () => clearTimeout(m.current), []), /* @__PURE__ */ p(h.Provider, {
46
+ value: {
47
+ popup: _,
48
+ triggerRef: c,
49
+ pointIn: (e) => {
50
+ if (clearTimeout(m.current), e.pointerType === "touch" || _.open || !c.current) return;
51
+ let t = c.current.closest("nav")?.querySelector("[data-popup-open]"), n = () => {
52
+ f.current = !0, _.setOpen(!0);
53
+ };
54
+ t ? n() : m.current = window.setTimeout(n, o);
55
+ },
56
+ pointOut: () => {
57
+ clearTimeout(m.current), _.open && f.current && (m.current = window.setTimeout(() => _.setOpen(!1), s));
58
+ },
59
+ toggle: () => {
60
+ let e = _.open && f.current;
61
+ f.current = !1, e || _.setOpen(!_.open);
62
+ }
63
+ },
64
+ children: /* @__PURE__ */ p("li", {
65
+ ...i,
66
+ className: e("relative", t),
67
+ onBlur: (e) => {
68
+ n?.(e), _.open && !e.currentTarget.contains(e.relatedTarget) && _.setOpen(!1);
69
+ },
70
+ children: r
71
+ })
72
+ });
73
+ }
74
+ function S({ className: t, style: r, onClick: i, onPointerEnter: a, onPointerLeave: o, children: c, ref: l, ...u }) {
75
+ let d = v("NavigationMenuTrigger"), f = n(d.triggerRef, l), { popoverTarget: h, ...g } = d.popup.triggerProps;
76
+ return /* @__PURE__ */ m("button", {
77
+ type: "button",
78
+ ...u,
79
+ ref: f,
80
+ ...g,
81
+ style: {
82
+ ...g.style,
83
+ ...r
84
+ },
85
+ className: e(y, t),
86
+ onClick: (e) => {
87
+ i?.(e), e.defaultPrevented || d.toggle();
88
+ },
89
+ onPointerEnter: (e) => {
90
+ a?.(e), d.pointIn(e);
91
+ },
92
+ onPointerLeave: (e) => {
93
+ o?.(e), d.pointOut();
94
+ },
95
+ children: [c, /* @__PURE__ */ p(s, { open: d.popup.open })]
96
+ });
97
+ }
98
+ function C({ align: t = "start", offset: r = 8, className: a, style: s, onPointerEnter: c, onPointerLeave: l, ref: u, ...d }) {
99
+ let f = v("NavigationMenuContent"), m = n(f.popup.popupRef, u);
100
+ return /* @__PURE__ */ p(_.Provider, {
101
+ value: !0,
102
+ children: /* @__PURE__ */ p("div", {
103
+ ...d,
104
+ ...f.popup.popupProps,
105
+ ref: m,
106
+ style: {
107
+ ...i(f.popup.id, {
108
+ align: t,
109
+ offset: r
110
+ }),
111
+ ...s
112
+ },
113
+ className: e("zen__popover fixed z-50 p-2", o, a),
114
+ onPointerEnter: (e) => {
115
+ c?.(e), f.pointIn(e);
116
+ },
117
+ onPointerLeave: (e) => {
118
+ l?.(e), f.pointOut();
119
+ }
120
+ })
121
+ });
122
+ }
123
+ function w({ active: t, description: n, asChild: i, className: a, children: o, ...s }) {
124
+ let c = l(_), u = {
125
+ "aria-current": t ? "page" : void 0,
126
+ ...s,
127
+ className: e(c ? "focus-ring hover:bg-tint/[0.06] aria-[current=page]:bg-primary/10 flex flex-col gap-0.5 rounded-lg px-3 py-2 text-sm outline-hidden transition-colors" : y, a)
128
+ };
129
+ return i ? /* @__PURE__ */ p(r, {
130
+ ...u,
131
+ children: o
132
+ }) : /* @__PURE__ */ p("a", {
133
+ ...u,
134
+ children: c && n ? /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ p("span", {
135
+ className: "font-medium",
136
+ children: o
137
+ }), /* @__PURE__ */ p("span", {
138
+ className: "text-muted-foreground text-xs leading-snug",
139
+ children: n
140
+ })] }) : o
141
+ });
142
+ }
143
+ //#endregion
144
+ export { C as NavigationMenuContent, x as NavigationMenuItem, w as NavigationMenuLink, S as NavigationMenuTrigger, b as default };
@@ -0,0 +1,50 @@
1
+ import { FieldSize } from '../utils/styles';
2
+ import { ComponentProps } from 'react';
3
+ /**
4
+ * A number to type or step: − and + on either side, ↑↓ by `step`, Page Up and
5
+ * Page Down by `largeStep`, Home and End to `min` and `max`. Shown in the
6
+ * locale's way (`formatOptions`: a percentage, a unit, decimals) and read back
7
+ * from what's typed in it, digits, separators and all. Kept within `min` and
8
+ * `max` once you leave the field; empty is null.
9
+ *
10
+ * Each change says how it came about: `{ reason: 'step', delta }` for − +,
11
+ * ↑↓ and Page Up/Down, `'input'` for typing, `'limit'` for Home and End. So a
12
+ * step can be sent on as a step, and the number kept by whoever owns it.
13
+ * `onValueCommit` fires once per finished change: each step, and what's typed
14
+ * on Enter or on leaving the field.
15
+ */
16
+ export default function NumberField({ value: valueProp, defaultValue, onValueChange, onValueCommit, min, max, step, largeStep, formatOptions, locale: localeProp, name, size, invalid, disabled, className, onFocus, onBlur, onKeyDown, ...rest }: NumberFieldProps): import('react').JSX.Element;
17
+ /** How a NumberField's number changed: a step (with what it adds), typing, or Home/End. */
18
+ export type NumberFieldChange = {
19
+ reason: 'step';
20
+ delta: number;
21
+ } | {
22
+ reason: 'input' | 'limit';
23
+ };
24
+ export interface NumberFieldProps extends Omit<ComponentProps<'input'>, 'value' | 'defaultValue' | 'size' | 'min' | 'max' | 'step' | 'onChange'> {
25
+ /** The number, or null for empty, when you keep it. */
26
+ value?: number | null;
27
+ /** The first number, when the field keeps its own. */
28
+ defaultValue?: number | null;
29
+ /** Every change, typing included; `details` says how it came about. */
30
+ onValueChange?: (value: number | null, details: NumberFieldChange) => void;
31
+ /** Each finished change: a step, Home or End, or what's typed, on Enter or on leaving the field. */
32
+ onValueCommit?: (value: number | null, details: NumberFieldChange) => void;
33
+ min?: number;
34
+ max?: number;
35
+ /** What ↑↓ and − + add or take away. Default 1. */
36
+ step?: number;
37
+ /** What Page Up and Page Down do. Default ten steps. */
38
+ largeStep?: number;
39
+ /** How it's shown, as for Intl.NumberFormat: { style: 'percent' }, { maximumFractionDigits: 2 }, a unit. */
40
+ formatOptions?: Intl.NumberFormatOptions;
41
+ /** Defaults to the LocaleProvider's. */
42
+ locale?: string;
43
+ /** Form field name: the number is submitted under it. */
44
+ name?: string;
45
+ /** Height, matching Button's. */
46
+ size?: FieldSize;
47
+ /** Show the field in its error state. */
48
+ invalid?: boolean;
49
+ }
50
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/number-field/index.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,cAAc,EAAwC,MAAM,OAAO,CAAC;AAE7E;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAChC,KAAK,EAAE,SAAS,EAChB,YAAmB,EACnB,aAAa,EACb,aAAa,EACb,GAAG,EACH,GAAG,EACH,IAAQ,EACR,SAAqB,EACrB,aAAa,EACb,MAAM,EAAE,UAAU,EAClB,IAAI,EACJ,IAAgB,EAChB,OAAO,EACP,QAAQ,EACR,SAAS,EACT,OAAO,EACP,MAAM,EACN,SAAS,EACT,GAAG,IAAI,EACV,EAAE,gBAAgB,+BA+GlB;AAoED,2FAA2F;AAC3F,MAAM,MAAM,iBAAiB,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAA;CAAE,CAAC;AAElG,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAC1C,cAAc,CAAC,OAAO,CAAC,EACvB,OAAO,GAAG,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,UAAU,CAC1E;IACG,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,uEAAuE;IACvE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC3E,oGAAoG;IACpG,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC3E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4GAA4G;IAC5G,aAAa,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC;IACzC,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,yCAAyC;IACzC,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB"}
@@ -0,0 +1,133 @@
1
+ "use client";
2
+ import { cx as e } from "../utils/cx.js";
3
+ import { useControllable as t } from "../utils/useControllable.js";
4
+ import { useLocale as n, useMessages as r } from "../locale-provider/index.js";
5
+ import { FormValue as i } from "../utils/form-value.js";
6
+ import a, { InputGroupAddon as o, InputGroupInput as s } from "../input-group/index.js";
7
+ import c from "../icons/micro/minus.js";
8
+ import { plainSpaces as l } from "../utils/date.js";
9
+ import u from "../icons/micro/plus.js";
10
+ import { useMemo as d, useRef as f, useState as p } from "react";
11
+ import { jsx as m, jsxs as h } from "react/jsx-runtime";
12
+ //#region packages/number-field/index.tsx
13
+ function g({ value: l, defaultValue: g = null, onValueChange: b, onValueCommit: x, min: S, max: C, step: w = 1, largeStep: T = w * 10, formatOptions: E, locale: D, name: O, size: k = "default", invalid: A, disabled: j, className: M, onFocus: N, onBlur: P, onKeyDown: F, ...I }) {
14
+ let L = r(), R = n(D), [z, B, V] = t(l, g, void 0), H = d(() => new y(R, E), [R, E]), [U, W] = p(null), G = f(!1), K = (e) => Math.min(C ?? Infinity, Math.max(S ?? -Infinity, e)), q = (e, t) => {
15
+ B(e), b?.(e, t);
16
+ }, J = (e, t) => {
17
+ q(e, t), x?.(e, t), G.current = !1, W(null);
18
+ }, Y = () => {
19
+ if (!G.current) return;
20
+ let e = U === null ? void 0 : H.parse(U), t = e === void 0 ? z : e, n = t === null ? null : K(t);
21
+ n !== z && q(n, { reason: "input" }), x?.(n, { reason: "input" }), G.current = !1;
22
+ }, X = (e) => {
23
+ let t = z ?? (e > 0 ? (S ?? 0) - e : (C ?? 0) - e), n = S ?? 0, r = K(n + Math.round((t + e - n) / w) * w), i = Math.max(v(w), v(n));
24
+ J(Number(r.toFixed(i)), {
25
+ reason: "step",
26
+ delta: e
27
+ });
28
+ }, Z = U ?? (z === null ? "" : H.format(z));
29
+ return /* @__PURE__ */ h(a, {
30
+ size: k,
31
+ invalid: A,
32
+ className: e("zen__number-field px-1", M),
33
+ children: [
34
+ /* @__PURE__ */ m(o, { children: /* @__PURE__ */ m(_, {
35
+ label: L.decrease,
36
+ disabled: j || z !== null && S !== void 0 && z <= S,
37
+ onStep: () => X(-w),
38
+ children: /* @__PURE__ */ m(c, {})
39
+ }) }),
40
+ /* @__PURE__ */ m(s, {
41
+ role: "spinbutton",
42
+ inputMode: (E?.maximumFractionDigits ?? 1) > 0 || (S ?? -1) < 0 ? "decimal" : "numeric",
43
+ autoComplete: "off",
44
+ "aria-valuenow": z ?? void 0,
45
+ "aria-valuemin": S,
46
+ "aria-valuemax": C,
47
+ "aria-valuetext": z === null ? void 0 : H.format(z),
48
+ disabled: j,
49
+ ...I,
50
+ value: Z,
51
+ onFocus: (e) => {
52
+ N?.(e), W(Z);
53
+ },
54
+ onChange: (e) => {
55
+ W(e.target.value), G.current = !0;
56
+ let t = H.parse(e.target.value);
57
+ t !== void 0 && q(t, { reason: "input" });
58
+ },
59
+ onBlur: (e) => {
60
+ P?.(e), W(null), Y();
61
+ },
62
+ onKeyDown: (e) => {
63
+ if (F?.(e), e.key === "Enter" && !e.defaultPrevented) {
64
+ Y(), W(null);
65
+ return;
66
+ }
67
+ let t = {
68
+ ArrowUp: () => X(w),
69
+ ArrowDown: () => X(-w),
70
+ PageUp: () => X(T),
71
+ PageDown: () => X(-T),
72
+ Home: S === void 0 ? void 0 : () => J(S, { reason: "limit" }),
73
+ End: C === void 0 ? void 0 : () => J(C, { reason: "limit" })
74
+ }[e.key];
75
+ t && !e.defaultPrevented && (e.preventDefault(), t());
76
+ },
77
+ className: "text-center tabular-nums"
78
+ }),
79
+ /* @__PURE__ */ m(o, { children: /* @__PURE__ */ m(_, {
80
+ label: L.increase,
81
+ disabled: j || z !== null && C !== void 0 && z >= C,
82
+ onStep: () => X(w),
83
+ children: /* @__PURE__ */ m(u, {})
84
+ }) }),
85
+ /* @__PURE__ */ m(i, {
86
+ name: O,
87
+ value: z === null ? "" : String(z),
88
+ onReset: V
89
+ })
90
+ ]
91
+ });
92
+ }
93
+ function _({ label: e, disabled: t, onStep: n, children: r }) {
94
+ return /* @__PURE__ */ m("button", {
95
+ type: "button",
96
+ tabIndex: -1,
97
+ "aria-label": e,
98
+ disabled: t,
99
+ onMouseDown: (e) => e.preventDefault(),
100
+ onClick: n,
101
+ className: "text-muted-foreground hover:bg-tint/[0.08] hover:text-foreground grid size-7 cursor-pointer place-items-center rounded-md transition-colors disabled:cursor-not-allowed disabled:opacity-40",
102
+ children: r
103
+ });
104
+ }
105
+ var v = (e) => (String(e).split(".")[1] ?? "").length, y = class {
106
+ formatter;
107
+ decimal;
108
+ digits;
109
+ percent;
110
+ constructor(e, t) {
111
+ this.formatter = new Intl.NumberFormat(e, t);
112
+ let n = new Intl.NumberFormat(e).formatToParts(1.5);
113
+ this.decimal = n.find((e) => e.type === "decimal")?.value ?? ".";
114
+ let r = new Intl.NumberFormat(e, { useGrouping: !1 }).format(9876543210);
115
+ this.digits = new Map([...r].map((e, t) => [e, String(9 - t)])), this.percent = t?.style === "percent";
116
+ }
117
+ format(e) {
118
+ return l(this.formatter.format(e));
119
+ }
120
+ parse(e) {
121
+ let t = "";
122
+ for (let n of e) {
123
+ let e = this.digits.get(n) ?? (/\d/.test(n) ? n : void 0);
124
+ e ? t += e : n === this.decimal ? t += "." : (n === "-" || n === "−") && t === "" && (t = "-");
125
+ }
126
+ if (t === "" && e.trim() === "") return null;
127
+ if (!/^-?\d+(\.\d+)?$/.test(t)) return;
128
+ let n = Number(t);
129
+ return this.percent ? n / 100 : n;
130
+ }
131
+ };
132
+ //#endregion
133
+ export { g as default };
@@ -1,7 +1,8 @@
1
- import { ReactNode } from 'react';
1
+ import { ComponentProps, ReactNode } from 'react';
2
2
  /** Top of a page: a small eyebrow label, the title in the aurora gradient, and a lead paragraph. */
3
- export default function PageHeader({ eyebrow, title, lead, children, className }: PageHeaderProps): import('react').JSX.Element;
4
- export interface PageHeaderProps {
3
+ export default function PageHeader({ eyebrow, title, lead, children, className, ...rest }: PageHeaderProps): import('react').JSX.Element;
4
+ /** Other props (data-*, an id) go on the <header>. */
5
+ export interface PageHeaderProps extends Omit<ComponentProps<'header'>, 'title'> {
5
6
  eyebrow?: ReactNode;
6
7
  title: ReactNode;
7
8
  lead?: ReactNode;