@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,22 +1,24 @@
1
1
  import { DateString } from '../utils/date';
2
2
  import { Month } from '../utils/month';
3
+ import { ComponentProps } from 'react';
3
4
  /**
4
5
  * A month as a grid of days, each shaded by its value (e.g. what was spent
5
6
  * that day): busy days stand out at a glance. Hover a day for its figure;
6
- * with `onSelect`, days are buttons.
7
+ * with `onSelectedChange`, days are buttons.
7
8
  */
8
- export default function CalendarHeatmap({ month, values, locale, format, weekStartsOn, onSelect, selected, label, className, }: CalendarHeatmapProps): import('react').JSX.Element;
9
- export interface CalendarHeatmapProps {
9
+ export default function CalendarHeatmap({ month, values, locale: localeProp, format, weekStartsOn: weekStartsOnProp, onSelectedChange, selected, label, className, ...rest }: CalendarHeatmapProps): import('react').JSX.Element;
10
+ /** Other props (data-*, an id) go on the table. */
11
+ export interface CalendarHeatmapProps extends Omit<ComponentProps<'table'>, 'children'> {
10
12
  month: Month;
11
13
  /** Each day's value, by date ("2026-09-03"); days missing have none. */
12
14
  values: Partial<Record<DateString, number>>;
13
- locale: string;
15
+ locale?: string;
14
16
  /** Turns a value into text for its label, e.g. as money. */
15
17
  format?: (value: number) => string;
16
18
  /** 0 for Sunday … 6 for Saturday (default: the locale's). */
17
19
  weekStartsOn?: number;
18
20
  /** Makes the days buttons. */
19
- onSelect?: (day: DateString) => void;
21
+ onSelectedChange?: (day: DateString) => void;
20
22
  selected?: DateString | null;
21
23
  /** Accessible name (default: the month, e.g. "September 2026"). */
22
24
  label?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/calendar-heatmap/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,UAAU,EAA+D,MAAM,iBAAiB,CAAC;AAC/G,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE3D;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EACpC,KAAK,EACL,MAAM,EACN,MAAM,EACN,MAAe,EACf,YAAgC,EAChC,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,SAAS,GACZ,EAAE,oBAAoB,+BAsFtB;AAED,MAAM,WAAW,oBAAoB;IACjC,KAAK,EAAE,KAAK,CAAC;IACb,wEAAwE;IACxE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACnC,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,IAAI,CAAC;IACrC,QAAQ,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC7B,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/calendar-heatmap/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,UAAU,EAA+D,MAAM,iBAAiB,CAAC;AAC/G,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAEvC;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EACpC,KAAK,EACL,MAAM,EACN,MAAM,EAAE,UAAU,EAClB,MAAe,EACf,YAAY,EAAE,gBAAgB,EAC9B,gBAAgB,EAChB,QAAQ,EACR,KAAK,EACL,SAAS,EACT,GAAG,IAAI,EACV,EAAE,oBAAoB,+BA0FtB;AAED,mDAAmD;AACnD,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC;IACnF,KAAK,EAAE,KAAK,CAAC;IACb,wEAAwE;IACxE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACnC,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8BAA8B;IAC9B,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,IAAI,CAAC;IAC7C,QAAQ,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC7B,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB"}
@@ -1,48 +1,50 @@
1
1
  "use client";
2
2
  import { cx as e } from "../utils/cx.js";
3
- import { formatMonth as t } from "../utils/month.js";
4
- import { dayOfWeek as n, daysInMonth as r, formatDate as i, weekStart as a, weekdayNames as o } from "../utils/date.js";
5
- import { Fragment as s, jsx as c, jsxs as l } from "react/jsx-runtime";
3
+ import { useLocale as t } from "../locale-provider/index.js";
4
+ import { formatMonth as n } from "../utils/month.js";
5
+ import { dayOfWeek as r, daysInMonth as i, formatDate as a, weekStart as o, weekdayNames as s } from "../utils/date.js";
6
+ import { Fragment as c, jsx as l, jsxs as u } from "react/jsx-runtime";
6
7
  //#region packages/calendar-heatmap/index.tsx
7
- function u({ month: u, values: d, locale: f, format: p = String, weekStartsOn: m = a(f), onSelect: h, selected: g, label: _, className: v }) {
8
- let y = r(u), b = Array.from({ length: y }, (e, t) => `${u}-${String(t + 1).padStart(2, "0")}`), x = (n(b[0]) - m + 7) % 7, S = [...Array(x).fill(null), ...b];
9
- for (; S.length % 7;) S.push(null);
10
- let C = Array.from({ length: S.length / 7 }, (e, t) => S.slice(t * 7, t * 7 + 7)), w = o(f, "narrow"), T = o(f, "long"), E = Array.from({ length: 7 }, (e, t) => (m + t) % 7), D = Math.max(0, ...b.map((e) => d[e] ?? 0));
11
- return /* @__PURE__ */ l("table", {
12
- "aria-label": _ ?? t(u, f, "long"),
13
- className: e("zen__calendar-heatmap w-full table-fixed border-separate border-spacing-1", v),
14
- children: [/* @__PURE__ */ c("thead", { children: /* @__PURE__ */ c("tr", { children: E.map((e) => /* @__PURE__ */ c("th", {
8
+ function d({ month: d, values: f, locale: p, format: m = String, weekStartsOn: h, onSelectedChange: g, selected: _, label: v, className: y, ...b }) {
9
+ let x = t(p), S = new Intl.NumberFormat(x), C = h ?? o(x), w = i(d), T = Array.from({ length: w }, (e, t) => `${d}-${String(t + 1).padStart(2, "0")}`), E = (r(T[0]) - C + 7) % 7, D = [...Array(E).fill(null), ...T];
10
+ for (; D.length % 7;) D.push(null);
11
+ let O = Array.from({ length: D.length / 7 }, (e, t) => D.slice(t * 7, t * 7 + 7)), k = s(x, "narrow"), A = s(x, "long"), j = Array.from({ length: 7 }, (e, t) => (C + t) % 7), M = Math.max(0, ...T.map((e) => f[e] ?? 0));
12
+ return /* @__PURE__ */ u("table", {
13
+ "aria-label": v ?? n(d, x, "long"),
14
+ ...b,
15
+ className: e("zen__calendar-heatmap w-full table-fixed border-separate border-spacing-1", y),
16
+ children: [/* @__PURE__ */ l("thead", { children: /* @__PURE__ */ l("tr", { children: j.map((e) => /* @__PURE__ */ l("th", {
15
17
  scope: "col",
16
- abbr: T[e],
18
+ abbr: A[e],
17
19
  className: "text-muted-foreground pb-1 text-xs font-normal",
18
- children: w[e]
19
- }, e)) }) }), /* @__PURE__ */ c("tbody", { children: C.map((t, n) => /* @__PURE__ */ c("tr", { children: t.map((t, n) => {
20
- if (!t) return /* @__PURE__ */ c("td", {}, n);
21
- let r = d[t], a = D > 0 && r ? Math.sqrt(r / D) : 0, o = `${i(t, f, "day")}: ${p(r || 0)}`, u = e("relative grid aspect-square w-full place-items-center rounded-md text-[0.65rem] tabular-nums transition-[box-shadow]", a ? a > .6 ? "text-primary-foreground" : "text-foreground/80" : "bg-tint/[0.04] text-muted-foreground", t === g && "ring-ring ring-2"), m = a ? { background: `oklch(var(--primary) / ${+(.14 + .81 * a).toFixed(2)})` } : void 0, _ = /* @__PURE__ */ l(s, { children: [/* @__PURE__ */ c("span", {
20
+ children: k[e]
21
+ }, e)) }) }), /* @__PURE__ */ l("tbody", { children: O.map((t, n) => /* @__PURE__ */ l("tr", { children: t.map((t, n) => {
22
+ if (!t) return /* @__PURE__ */ l("td", {}, n);
23
+ let r = f[t], i = M > 0 && r ? Math.sqrt(r / M) : 0, o = `${a(t, x, "day")}: ${m(r || 0)}`, s = e("relative grid aspect-square w-full place-items-center rounded-md text-[0.65rem] tabular-nums transition-[box-shadow]", i ? i > .6 ? "text-primary-foreground" : "text-foreground/80" : "bg-tint/[0.04] text-muted-foreground", t === _ && "ring-ring ring-2"), d = i ? { background: `oklch(var(--primary) / ${+(.14 + .81 * i).toFixed(2)})` } : void 0, p = /* @__PURE__ */ u(c, { children: [/* @__PURE__ */ l("span", {
22
24
  "aria-hidden": !0,
23
- children: Number(t.slice(8))
24
- }), /* @__PURE__ */ c("span", {
25
+ children: S.format(Number(t.slice(8)))
26
+ }), /* @__PURE__ */ l("span", {
25
27
  className: "sr-only",
26
28
  children: o
27
29
  })] });
28
- return /* @__PURE__ */ c("td", {
30
+ return /* @__PURE__ */ l("td", {
29
31
  title: o,
30
32
  className: "p-0",
31
- children: h ? /* @__PURE__ */ c("button", {
33
+ children: g ? /* @__PURE__ */ l("button", {
32
34
  type: "button",
33
- "aria-pressed": t === g,
34
- onClick: () => h(t),
35
- className: e(u, "focus-visible:ring-ring/60 cursor-pointer outline-hidden hover:shadow-[0_0_0_1px_oklch(var(--tint)/0.3)] focus-visible:ring-2"),
36
- style: m,
37
- children: _
38
- }) : /* @__PURE__ */ c("span", {
39
- className: u,
40
- style: m,
41
- children: _
35
+ "aria-pressed": t === _,
36
+ onClick: () => g(t),
37
+ className: e(s, " cursor-pointer outline-hidden hover:shadow-[0_0_0_1px_oklch(var(--tint)/0.3)] focus-ring"),
38
+ style: d,
39
+ children: p
40
+ }) : /* @__PURE__ */ l("span", {
41
+ className: s,
42
+ style: d,
43
+ children: p
42
44
  })
43
45
  }, t);
44
46
  }) }, n)) })]
45
47
  });
46
48
  }
47
49
  //#endregion
48
- export { u as default };
50
+ export { d as default };
@@ -1,4 +1,3 @@
1
- "use client";
2
1
  //#region packages/canvas/geometry.ts
3
2
  function e(e) {
4
3
  let t = Math.min(...e.map((e) => e.x)), n = Math.min(...e.map((e) => e.y));
@@ -13,10 +13,10 @@ export type { CanvasRect } from './geometry';
13
13
  * Items stay on the surface; with `snap` they line up with its edges and
14
14
  * centre and with each other, and with `grid` they keep to a grid. `scale`
15
15
  * shows the design larger or smaller, or `"fit"` fills the width it's given.
16
- * `onChange` gets the items with every step of a change; `onChangeEnd`, once
16
+ * `onItemsChange` gets the items with every step of a change; `onItemsChangeEnd`, once
17
17
  * it's made, with the items before it, for undo or saving.
18
18
  */
19
- export declare function Canvas<T extends CanvasItemRect>({ width, height, scale, items, onChange, onChangeEnd, selected, onSelect, minSize, snap, grid, className, style, children, onPointerDown, ...rest }: CanvasProps<T>): import('react').JSX.Element;
19
+ export declare function Canvas<T extends CanvasItemRect>({ width, height, scale, items, onItemsChange, onItemsChangeEnd, selected, onSelectedChange, minSize, snap, grid, className, style, children, onPointerDown, ref, ...rest }: CanvasProps<T>): import('react').JSX.Element;
20
20
  /**
21
21
  * One item on a Canvas, placed where the canvas's `items` say for its `id`;
22
22
  * later items sit on top of earlier ones. `label` names it ("Title") in what's
@@ -29,7 +29,7 @@ export interface CanvasItemRect extends CanvasRect {
29
29
  /** Not moved or resized, and presses go through it to the surface (Tab still reaches it): a background, say. */
30
30
  locked?: boolean;
31
31
  }
32
- export interface CanvasProps<T extends CanvasItemRect = CanvasItemRect> extends Omit<ComponentProps<'div'>, 'onChange' | 'onSelect'> {
32
+ export interface CanvasProps<T extends CanvasItemRect = CanvasItemRect> extends ComponentProps<'div'> {
33
33
  /** The surface's size, in your design's units (px at scale 1). */
34
34
  width: number;
35
35
  height: number;
@@ -38,12 +38,12 @@ export interface CanvasProps<T extends CanvasItemRect = CanvasItemRect> extends
38
38
  /** Where each item is (other fields are kept); render a CanvasItem for each. */
39
39
  items: readonly T[];
40
40
  /** The items, with every step of a move or resize. */
41
- onChange: (items: T[]) => void;
41
+ onItemsChange: (items: T[]) => void;
42
42
  /** The items once a change is made (a drag let go, a key pressed), and as they were before: for undo or saving. */
43
- onChangeEnd?: (items: T[], before: readonly T[]) => void;
43
+ onItemsChangeEnd?: (items: T[], before: readonly T[]) => void;
44
44
  /** The selected items' ids. */
45
45
  selected?: readonly string[];
46
- onSelect?: (ids: string[]) => void;
46
+ onSelectedChange?: (ids: string[]) => void;
47
47
  /** Smallest width and height an item can be resized to. */
48
48
  minSize?: number;
49
49
  /** Line items up with the surface and each other: true, or how close counts, in screen px (true is 6). */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/canvas/index.tsx"],"names":[],"mappings":"AACA,OAAO,EACH,cAAc,EAWjB,MAAM,OAAO,CAAC;AAEf,OAAO,EAIH,KAAK,UAAU,EAKlB,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAyC7C;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,cAAc,EAAE,EAC7C,KAAK,EACL,MAAM,EACN,KAAS,EACT,KAAK,EACL,QAAQ,EACR,WAAW,EACX,QAAa,EACb,QAAQ,EACR,OAAW,EACX,IAAY,EACZ,IAAI,EACJ,SAAS,EACT,KAAK,EACL,QAAQ,EACR,aAAa,EACb,GAAG,IAAI,EACV,EAAE,WAAW,CAAC,CAAC,CAAC,+BAsUhB;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,eAAe,sCA2D7F;AAED,MAAM,WAAW,cAAe,SAAQ,UAAU;IAC9C,EAAE,EAAE,MAAM,CAAC;IACX,gHAAgH;IAChH,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,CAAE,SAAQ,IAAI,CAChF,cAAc,CAAC,KAAK,CAAC,EACrB,UAAU,GAAG,UAAU,CAC1B;IACG,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,gIAAgI;IAChI,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACvB,gFAAgF;IAChF,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;IACpB,sDAAsD;IACtD,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;IAC/B,mHAAmH;IACnH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,KAAK,IAAI,CAAC;IACzD,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACnC,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0GAA0G;IAC1G,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACxB,6FAA6F;IAC7F,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAgB,SAAQ,cAAc,CAAC,KAAK,CAAC;IAC1D,EAAE,EAAE,MAAM,CAAC;IACX,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;CACjB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/canvas/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EACH,cAAc,EAWjB,MAAM,OAAO,CAAC;AAEf,OAAO,EAIH,KAAK,UAAU,EAKlB,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAyC7C;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,cAAc,EAAE,EAC7C,KAAK,EACL,MAAM,EACN,KAAS,EACT,KAAK,EACL,aAAa,EACb,gBAAgB,EAChB,QAAa,EACb,gBAAgB,EAChB,OAAW,EACX,IAAY,EACZ,IAAI,EACJ,SAAS,EACT,KAAK,EACL,QAAQ,EACR,aAAa,EACb,GAAG,EACH,GAAG,IAAI,EACV,EAAE,WAAW,CAAC,CAAC,CAAC,+BAwUhB;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,eAAe,sCA2D7F;AAED,MAAM,WAAW,cAAe,SAAQ,UAAU;IAC9C,EAAE,EAAE,MAAM,CAAC;IACX,gHAAgH;IAChH,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,CAAE,SAAQ,cAAc,CAAC,KAAK,CAAC;IACjG,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,gIAAgI;IAChI,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACvB,gFAAgF;IAChF,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;IACpB,sDAAsD;IACtD,aAAa,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;IACpC,mHAAmH;IACnH,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,KAAK,IAAI,CAAC;IAC9D,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC3C,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0GAA0G;IAC1G,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACxB,6FAA6F;IAC7F,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAgB,SAAQ,cAAc,CAAC,KAAK,CAAC;IAC1D,EAAE,EAAE,MAAM,CAAC;IACX,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;CACjB"}
@@ -1,10 +1,12 @@
1
1
  "use client";
2
2
  import { cx as e } from "../utils/cx.js";
3
- import { boundsOf as t, intersects as n, moveRect as r, resizeRect as i } from "./geometry.js";
4
- import { createContext as a, useContext as o, useEffect as s, useId as c, useLayoutEffect as l, useRef as u, useState as d } from "react";
5
- import { jsx as f, jsxs as p } from "react/jsx-runtime";
3
+ import { useMergedRefs as t } from "../utils/refs.js";
4
+ import { useMessages as n } from "../locale-provider/index.js";
5
+ import { boundsOf as r, intersects as i, moveRect as a, resizeRect as o } from "./geometry.js";
6
+ import { createContext as s, useContext as c, useEffect as l, useId as u, useLayoutEffect as d, useRef as f, useState as p } from "react";
7
+ import { jsx as m, jsxs as h } from "react/jsx-runtime";
6
8
  //#region packages/canvas/index.tsx
7
- var m = typeof window > "u" ? s : l, h = 3, ee = "input, textarea, select, button, a[href], [contenteditable=\"\"], [contenteditable=\"true\"], [data-canvas-no-drag]", g = [
9
+ var g = typeof window > "u" ? l : d, _ = 3, ee = "input, textarea, select, button, a[href], [contenteditable=\"\"], [contenteditable=\"true\"], [data-canvas-no-drag]", v = [
8
10
  "nw",
9
11
  "n",
10
12
  "ne",
@@ -13,7 +15,7 @@ var m = typeof window > "u" ? s : l, h = 3, ee = "input, textarea, select, butto
13
15
  "s",
14
16
  "sw",
15
17
  "w"
16
- ], _ = {
18
+ ], y = {
17
19
  nw: "left-0 top-0 cursor-nwse-resize",
18
20
  n: "left-1/2 top-0 cursor-ns-resize",
19
21
  ne: "left-full top-0 cursor-nesw-resize",
@@ -22,40 +24,40 @@ var m = typeof window > "u" ? s : l, h = 3, ee = "input, textarea, select, butto
22
24
  s: "left-1/2 top-full cursor-ns-resize",
23
25
  sw: "left-0 top-full cursor-nesw-resize",
24
26
  w: "left-0 top-1/2 cursor-ew-resize"
25
- }, v = {
27
+ }, b = {
26
28
  ArrowLeft: [-1, 0],
27
29
  ArrowRight: [1, 0],
28
30
  ArrowUp: [0, -1],
29
31
  ArrowDown: [0, 1]
30
- }, y = (e, t) => e.x === t.x && e.y === t.y && e.w === t.w && e.h === t.h, b = (e, t) => e.length === t.length && e.every((e, n) => e === t[n]), x = a(null);
31
- function S({ width: a, height: o, scale: s = 1, items: l, onChange: g, onChangeEnd: _, selected: S = [], onSelect: C, minSize: w = 8, snap: T = !1, grid: E, className: D, style: O, children: k, onPointerDown: te, ...ne }) {
32
- let A = u(null), j = u(!1), [M, re] = d(null), [ie, N] = d([]), [P, F] = d(null), [I, L] = d(null), [R, z] = d(!1), [B, V] = d(""), H = c();
33
- m(() => {
34
- let e = A.current;
35
- if (s !== "fit" || !e) return;
36
- let t = () => e.clientWidth && re(e.clientWidth / a);
32
+ }, x = (e, t) => e.x === t.x && e.y === t.y && e.w === t.w && e.h === t.h, S = (e, t) => e.length === t.length && e.every((e, n) => e === t[n]), C = s(null);
33
+ function w({ width: s, height: c, scale: l = 1, items: d, onItemsChange: v, onItemsChangeEnd: y, selected: w = [], onSelectedChange: T, minSize: E = 8, snap: D = !1, grid: O, className: te, style: ne, children: re, onPointerDown: ie, ref: ae, ...k }) {
34
+ let A = n(), j = f(null), oe = t(j, ae), M = f(!1), [N, se] = p(null), [ce, P] = p([]), [F, I] = p(null), [L, R] = p(null), [le, z] = p(!1), [B, V] = p(""), H = u();
35
+ g(() => {
36
+ let e = j.current;
37
+ if (l !== "fit" || !e) return;
38
+ let t = () => e.clientWidth && se(e.clientWidth / s);
37
39
  if (t(), typeof ResizeObserver > "u") return;
38
40
  let n = new ResizeObserver(t);
39
41
  return n.observe(e), () => n.disconnect();
40
- }, [s, a]);
41
- let U = s === "fit" ? M ?? 1 : s, W = new Map(l.map((e) => [e.id, e])), G = {
42
- width: a,
43
- height: o,
44
- min: w
45
- }, ae = T === !1 ? 0 : (T === !0 ? 6 : T) / U, K = (e) => ({
46
- others: l.filter((t) => !e.has(t.id)),
47
- threshold: ae,
48
- grid: E
42
+ }, [l, s]);
43
+ let U = l === "fit" ? N ?? 1 : l, W = new Map(d.map((e) => [e.id, e])), G = {
44
+ width: s,
45
+ height: c,
46
+ min: E
47
+ }, ue = D === !1 ? 0 : (D === !0 ? 6 : D) / U, K = (e) => ({
48
+ others: d.filter((t) => !e.has(t.id)),
49
+ threshold: ue,
50
+ grid: O
49
51
  }), q = (e) => {
50
- b(e, S) || C?.(e);
51
- }, J = (e) => l.map((t) => {
52
+ S(e, w) || T?.(e);
53
+ }, J = (e) => d.map((t) => {
52
54
  let n = e.get(t.id);
53
55
  return n ? {
54
56
  ...t,
55
57
  ...n
56
58
  } : t;
57
- }), Y = (e, n, i, a) => {
58
- let o = t(e), s = r(o, n, i, G, a), [c, l] = [s.rect.x - o.x, s.rect.y - o.y];
59
+ }), Y = (e, t, n, i) => {
60
+ let o = r(e), s = a(o, t, n, G, i), [c, l] = [s.rect.x - o.x, s.rect.y - o.y];
59
61
  return {
60
62
  rects: new Map(e.map((e) => [e.id, {
61
63
  x: e.x + c,
@@ -67,142 +69,142 @@ function S({ width: a, height: o, scale: s = 1, items: l, onChange: g, onChangeE
67
69
  guides: s.guides
68
70
  };
69
71
  }, X = (e, t, n) => {
70
- n.w !== t.w || n.h !== t.h ? V(`${e} resized to ${n.w} by ${n.h}.`) : (n.x !== t.x || n.y !== t.y) && V(`${e} moved to ${n.x}, ${n.y}.`);
71
- }, Z = (e, t, n) => e.length === 1 && e[0].id === t ? n : `${e.length} items`, oe = (e, n, r, a) => {
72
- let o = W.get(n);
73
- if (e.button !== 0 || !o || o.locked && !a) return;
72
+ n.w !== t.w || n.h !== t.h ? V(A.resized(e, n.w, n.h)) : (n.x !== t.x || n.y !== t.y) && V(A.moved(e, n.x, n.y));
73
+ }, Z = (e, t, n) => e.length === 1 && e[0].id === t ? n : `${e.length} items`, de = (e, t, n, i) => {
74
+ let a = W.get(t);
75
+ if (e.button !== 0 || !a || a.locked && !i) return;
74
76
  let s = e.target.closest(ee);
75
- if (!a && s && s !== e.currentTarget && e.currentTarget.contains(s)) return;
77
+ if (!i && s && s !== e.currentTarget && e.currentTarget.contains(s)) return;
76
78
  e.preventDefault(), e.stopPropagation();
77
- let c = e.shiftKey || e.metaKey || e.ctrlKey, u;
78
- if (u = a ? [n] : c ? S.includes(n) ? S.filter((e) => e !== n) : [...S, n] : S.includes(n) ? [...S] : [n], q(u), j.current = !0, e.currentTarget.closest("[data-canvas-id]")?.focus({ preventScroll: !0 }), j.current = !1, !u.includes(n)) return;
79
- let d = a ? [o] : u.flatMap((e) => W.get(e) ?? []).filter((e) => !e.locked);
80
- if (!d.length) return;
79
+ let c = e.shiftKey || e.metaKey || e.ctrlKey, l;
80
+ if (l = i ? [t] : c ? w.includes(t) ? w.filter((e) => e !== t) : [...w, t] : w.includes(t) ? [...w] : [t], q(l), M.current = !0, e.currentTarget.closest("[data-canvas-id]")?.focus({ preventScroll: !0 }), M.current = !1, !l.includes(t)) return;
81
+ let u = i ? [a] : l.flatMap((e) => W.get(e) ?? []).filter((e) => !e.locked);
82
+ if (!u.length) return;
81
83
  let f = e.currentTarget;
82
84
  f.setPointerCapture?.(e.pointerId);
83
- let p = new Set(d.map((e) => e.id)), m = l, v = t(d), y = Z(d, n, r), b = !1, x = [...l], C = v, w = (t) => {
84
- if (t.pointerId !== e.pointerId) return;
85
- let [r, s] = [t.clientX - e.clientX, t.clientY - e.clientY];
85
+ let p = new Set(u.map((e) => e.id)), m = d, h = r(u), g = Z(u, t, n), b = !1, x = [...d], S = h, C = (n) => {
86
+ if (n.pointerId !== e.pointerId) return;
87
+ let [r, s] = [n.clientX - e.clientX, n.clientY - e.clientY];
86
88
  if (!b) {
87
- if (Math.hypot(r, s) < h) return;
89
+ if (Math.hypot(r, s) < _) return;
88
90
  b = !0, z(!0);
89
91
  }
90
- let [c, l] = [r / U, s / U], u;
91
- if (a) {
92
- let e = i(o, a, c, l, G, {
93
- keepRatio: t.shiftKey,
92
+ let [c, l] = [r / U, s / U], d;
93
+ if (i) {
94
+ let e = o(a, i, c, l, G, {
95
+ keepRatio: n.shiftKey,
94
96
  ...K(p)
95
97
  });
96
- u = {
97
- rects: /* @__PURE__ */ new Map([[n, e.rect]]),
98
+ d = {
99
+ rects: /* @__PURE__ */ new Map([[t, e.rect]]),
98
100
  box: e.rect,
99
101
  guides: e.guides
100
102
  };
101
- } else u = Y(d, c, l, K(p));
102
- C = u.box, x = J(u.rects), g(x), N(u.guides), L({
103
- box: u.box,
104
- text: a ? `${u.box.w} × ${u.box.h}` : `${u.box.x}, ${u.box.y}`
103
+ } else d = Y(u, c, l, K(p));
104
+ S = d.box, x = J(d.rects), v(x), P(d.guides), R({
105
+ box: d.box,
106
+ text: i ? `${d.box.w} × ${d.box.h}` : `${d.box.x}, ${d.box.y}`
105
107
  });
106
108
  }, T = (t) => {
107
- f.removeEventListener("pointermove", w), f.removeEventListener("pointerup", E), f.removeEventListener("pointercancel", D), window.removeEventListener("keydown", O, !0), f.hasPointerCapture?.(e.pointerId) && f.releasePointerCapture(e.pointerId), N([]), L(null), z(!1), b && (t ? (_?.(x, m), X(y, v, C)) : (g([...m]), V(`${y} put back.`)));
109
+ f.removeEventListener("pointermove", C), f.removeEventListener("pointerup", E), f.removeEventListener("pointercancel", D), window.removeEventListener("keydown", O, !0), f.hasPointerCapture?.(e.pointerId) && f.releasePointerCapture(e.pointerId), P([]), R(null), z(!1), b && (t ? (y?.(x, m), X(g, h, S)) : (v([...m]), V(A.putBack(g))));
108
110
  }, E = (t) => t.pointerId === e.pointerId && T(!0), D = (t) => t.pointerId === e.pointerId && T(!1), O = (e) => {
109
111
  e.key === "Escape" && (e.preventDefault(), e.stopPropagation(), T(!1));
110
112
  };
111
- f.addEventListener("pointermove", w), f.addEventListener("pointerup", E), f.addEventListener("pointercancel", D), window.addEventListener("keydown", O, !0);
112
- }, se = (e) => {
113
+ f.addEventListener("pointermove", C), f.addEventListener("pointerup", E), f.addEventListener("pointercancel", D), window.addEventListener("keydown", O, !0);
114
+ }, fe = (e) => {
113
115
  if (e.button !== 0 || e.target.closest("[data-canvas-id]:not([data-locked])")) return;
114
- let t = e.currentTarget, r = t.getBoundingClientRect(), i = (e) => ({
115
- x: Math.min(a, Math.max(0, (e.clientX - r.left) / U)),
116
- y: Math.min(o, Math.max(0, (e.clientY - r.top) / U))
117
- }), s = e.shiftKey || e.metaKey || e.ctrlKey ? [...S] : [], c = i(e), u = !1, d = S;
116
+ let t = e.currentTarget, n = t.getBoundingClientRect(), r = (e) => ({
117
+ x: Math.min(s, Math.max(0, (e.clientX - n.left) / U)),
118
+ y: Math.min(c, Math.max(0, (e.clientY - n.top) / U))
119
+ }), a = e.shiftKey || e.metaKey || e.ctrlKey ? [...w] : [], o = r(e), l = !1, u = w;
118
120
  t.setPointerCapture?.(e.pointerId);
119
121
  let f = (t) => {
120
- if (t.pointerId !== e.pointerId || !u && Math.hypot(t.clientX - e.clientX, t.clientY - e.clientY) < h) return;
121
- u = !0;
122
- let r = i(t), a = {
123
- x: Math.min(c.x, r.x),
124
- y: Math.min(c.y, r.y),
125
- w: Math.abs(r.x - c.x),
126
- h: Math.abs(r.y - c.y)
122
+ if (t.pointerId !== e.pointerId || !l && Math.hypot(t.clientX - e.clientX, t.clientY - e.clientY) < _) return;
123
+ l = !0;
124
+ let n = r(t), s = {
125
+ x: Math.min(o.x, n.x),
126
+ y: Math.min(o.y, n.y),
127
+ w: Math.abs(n.x - o.x),
128
+ h: Math.abs(n.y - o.y)
127
129
  };
128
- F(a);
129
- let o = l.filter((e) => !e.locked && n(e, a)).map((e) => e.id), f = [...s, ...o.filter((e) => !s.includes(e))];
130
- b(f, d) || (d = f, C?.(f));
130
+ I(s);
131
+ let c = d.filter((e) => !e.locked && i(e, s)).map((e) => e.id), f = [...a, ...c.filter((e) => !a.includes(e))];
132
+ S(f, u) || (u = f, T?.(f));
131
133
  }, p = (n) => {
132
- n.pointerId === e.pointerId && (t.removeEventListener("pointermove", f), t.removeEventListener("pointerup", p), t.removeEventListener("pointercancel", p), F(null), n.type !== "pointercancel" && (u ? V(`${d.length} ${d.length === 1 ? "item" : "items"} selected.`) : s.length || q([])));
134
+ n.pointerId === e.pointerId && (t.removeEventListener("pointermove", f), t.removeEventListener("pointerup", p), t.removeEventListener("pointercancel", p), I(null), n.type !== "pointercancel" && (l ? V(A.selected(u.length)) : a.length || q([])));
133
135
  };
134
136
  t.addEventListener("pointermove", f), t.addEventListener("pointerup", p), t.addEventListener("pointercancel", p);
135
- }, ce = (e, n, r) => {
136
- let a = W.get(n);
137
- if (!a || e.target !== e.currentTarget) return;
137
+ }, pe = (e, t, n) => {
138
+ let i = W.get(t);
139
+ if (!i || e.target !== e.currentTarget) return;
138
140
  if (e.key === "Escape") {
139
- if (!S.length) return;
141
+ if (!w.length) return;
140
142
  e.preventDefault(), q([]);
141
143
  return;
142
144
  }
143
145
  if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === "a") {
144
146
  e.preventDefault();
145
- let t = l.filter((e) => !e.locked).map((e) => e.id);
146
- q(t), V(`${t.length} items selected.`);
147
+ let t = d.filter((e) => !e.locked).map((e) => e.id);
148
+ q(t), V(A.selected(t.length));
147
149
  return;
148
150
  }
149
- let o = v[e.key];
150
- if (!o) return;
151
+ let a = b[e.key];
152
+ if (!a) return;
151
153
  e.preventDefault();
152
- let s = e.shiftKey ? 10 : 1, [c, u] = [o[0] * s, o[1] * s], d = (S.includes(n) ? S : [n]).flatMap((e) => W.get(e) ?? []).filter((e) => !e.locked), f = e.altKey ? d.filter((e) => e.id === n) : d;
154
+ let s = e.shiftKey ? 10 : 1, [c, l] = [a[0] * s, a[1] * s], u = (w.includes(t) ? w : [t]).flatMap((e) => W.get(e) ?? []).filter((e) => !e.locked), f = e.altKey ? u.filter((e) => e.id === t) : u;
153
155
  if (!f.length) return;
154
- let p = e.altKey ? /* @__PURE__ */ new Map([[n, i(a, "se", c, u, G).rect]]) : Y(f, c, u).rects;
155
- if ([...p].every(([e, t]) => y(t, W.get(e)))) return;
156
+ let p = e.altKey ? /* @__PURE__ */ new Map([[t, o(i, "se", c, l, G).rect]]) : Y(f, c, l).rects;
157
+ if ([...p].every(([e, t]) => x(t, W.get(e)))) return;
156
158
  let m = J(p);
157
- g(m), _?.(m, l), X(Z(f, n, r), t(f), t([...p.values()]));
158
- }, le = (e) => {
159
- !j.current && !S.includes(e) && q([e]);
160
- }, Q = I && {
161
- left: Math.min(a * U - 28, Math.max(28, (I.box.x + I.box.w / 2) * U)),
162
- top: (I.box.y + I.box.h) * U + 26 > o * U ? Math.max(4, I.box.y * U - 26) : (I.box.y + I.box.h) * U + 6
163
- }, $ = R && E && E * U >= 6 ? E * U : 0;
164
- return /* @__PURE__ */ p(x.Provider, {
159
+ v(m), y?.(m, d), X(Z(f, t, n), r(f), r([...p.values()]));
160
+ }, me = (e) => {
161
+ !M.current && !w.includes(e) && q([e]);
162
+ }, Q = L && {
163
+ left: Math.min(s * U - 28, Math.max(28, (L.box.x + L.box.w / 2) * U)),
164
+ top: (L.box.y + L.box.h) * U + 26 > c * U ? Math.max(4, L.box.y * U - 26) : (L.box.y + L.box.h) * U + 6
165
+ }, $ = le && O && O * U >= 6 ? O * U : 0;
166
+ return /* @__PURE__ */ h(C.Provider, {
165
167
  value: {
166
168
  item: (e) => W.get(e),
167
- selected: S,
168
- grab: oe,
169
- key: ce,
170
- focus: le,
169
+ selected: w,
170
+ grab: de,
171
+ key: pe,
172
+ focus: me,
171
173
  hintId: H
172
174
  },
173
175
  children: [
174
- /* @__PURE__ */ p("div", {
175
- ref: A,
176
+ /* @__PURE__ */ h("div", {
176
177
  role: "group",
177
- ...ne,
178
+ ...k,
179
+ ref: oe,
178
180
  onPointerDown: (e) => {
179
- te?.(e), e.defaultPrevented || se(e);
181
+ ie?.(e), e.defaultPrevented || fe(e);
180
182
  },
181
183
  style: {
182
- ...O,
183
- ...s === "fit" ? {
184
+ ...ne,
185
+ ...l === "fit" ? {
184
186
  width: "100%",
185
- aspectRatio: `${a} / ${o}`
187
+ aspectRatio: `${s} / ${c}`
186
188
  } : {
187
- width: a * U,
188
- height: o * U
189
+ width: s * U,
190
+ height: c * U
189
191
  }
190
192
  },
191
- className: e("zen__canvas bg-tint/[0.03] relative shrink-0 overflow-hidden rounded-lg shadow-[inset_0_0_0_1px_oklch(var(--tint)/0.08)] select-none", D),
192
- children: [/* @__PURE__ */ f("div", {
193
+ className: e("zen__canvas bg-tint/[0.03] relative shrink-0 overflow-hidden rounded-lg shadow-[inset_0_0_0_1px_oklch(var(--tint)/0.08)] select-none", te),
194
+ children: [/* @__PURE__ */ m("div", {
193
195
  style: {
194
- width: a,
195
- height: o,
196
+ width: s,
197
+ height: c,
196
198
  scale: String(U),
197
199
  "--canvas-scale": U
198
200
  },
199
- className: e("absolute top-0 left-0 origin-top-left", s === "fit" && M === null && "invisible"),
200
- children: k
201
- }), /* @__PURE__ */ p("div", {
201
+ className: e("absolute top-0 left-0 origin-top-left", l === "fit" && N === null && "invisible"),
202
+ children: re
203
+ }), /* @__PURE__ */ h("div", {
202
204
  "aria-hidden": !0,
203
205
  className: "pointer-events-none absolute inset-0",
204
206
  children: [
205
- $ > 0 && /* @__PURE__ */ f("div", {
207
+ $ > 0 && /* @__PURE__ */ m("div", {
206
208
  "data-canvas-grid": "",
207
209
  className: "absolute inset-0",
208
210
  style: {
@@ -211,7 +213,7 @@ function S({ width: a, height: o, scale: s = 1, items: l, onChange: g, onChangeE
211
213
  backgroundPosition: `${-$ / 2}px ${-$ / 2}px`
212
214
  }
213
215
  }),
214
- ie.map((e) => /* @__PURE__ */ f("span", {
216
+ ce.map((e) => /* @__PURE__ */ m("span", {
215
217
  "data-canvas-guide": "",
216
218
  className: "bg-primary absolute shadow-[0_0_6px_oklch(var(--glow)/0.8)]",
217
219
  style: e.axis === "x" ? {
@@ -226,31 +228,31 @@ function S({ width: a, height: o, scale: s = 1, items: l, onChange: g, onChangeE
226
228
  height: 1
227
229
  }
228
230
  }, `${e.axis}${e.at}`)),
229
- P && /* @__PURE__ */ f("span", {
231
+ F && /* @__PURE__ */ m("span", {
230
232
  "data-canvas-marquee": "",
231
233
  className: "border-primary/60 bg-primary/10 absolute rounded-sm border",
232
234
  style: {
233
- left: P.x * U,
234
- top: P.y * U,
235
- width: P.w * U,
236
- height: P.h * U
235
+ left: F.x * U,
236
+ top: F.y * U,
237
+ width: F.w * U,
238
+ height: F.h * U
237
239
  }
238
240
  }),
239
- Q && /* @__PURE__ */ f("span", {
241
+ Q && /* @__PURE__ */ m("span", {
240
242
  "data-canvas-readout": "",
241
243
  className: "bg-primary text-primary-foreground absolute -translate-x-1/2 rounded-md px-1.5 py-0.5 text-[11px] leading-4 font-medium whitespace-nowrap tabular-nums shadow-[0_4px_14px_-4px_oklch(var(--glow)/0.7)]",
242
244
  style: Q,
243
- children: I.text
245
+ children: L.text
244
246
  })
245
247
  ]
246
248
  })]
247
249
  }),
248
- /* @__PURE__ */ f("span", {
250
+ /* @__PURE__ */ m("span", {
249
251
  id: H,
250
252
  hidden: !0,
251
- children: "Arrow keys move the selection, Shift with them by 10. Alt with the arrow keys resizes. Escape deselects."
253
+ children: A.canvasHelp
252
254
  }),
253
- /* @__PURE__ */ f("span", {
255
+ /* @__PURE__ */ m("span", {
254
256
  "aria-live": "assertive",
255
257
  className: "sr-only",
256
258
  children: B
@@ -258,30 +260,30 @@ function S({ width: a, height: o, scale: s = 1, items: l, onChange: g, onChangeE
258
260
  ]
259
261
  });
260
262
  }
261
- function C({ id: t, label: n, className: r, style: i, children: a, ...s }) {
262
- let c = o(x);
263
- if (!c) throw Error("<CanvasItem> must be inside <Canvas>");
264
- let l = c.item(t);
263
+ function T({ id: t, label: n, className: r, style: i, children: a, ...o }) {
264
+ let s = c(C);
265
+ if (!s) throw Error("<CanvasItem> must be inside <Canvas>");
266
+ let l = s.item(t);
265
267
  if (!l) return null;
266
- let u = c.selected.includes(t), d = u && c.selected.length === 1;
267
- return /* @__PURE__ */ p("div", {
268
+ let u = s.selected.includes(t), d = u && s.selected.length === 1;
269
+ return /* @__PURE__ */ h("div", {
268
270
  role: "group",
269
271
  "aria-roledescription": l.locked ? "locked item" : "movable item",
270
272
  "aria-label": n,
271
- "aria-describedby": l.locked ? void 0 : c.hintId,
273
+ "aria-describedby": l.locked ? void 0 : s.hintId,
272
274
  tabIndex: 0,
273
275
  "data-canvas-id": t,
274
276
  "data-selected": u || void 0,
275
277
  "data-locked": l.locked || void 0,
276
- ...s,
278
+ ...o,
277
279
  onFocus: (e) => {
278
- s.onFocus?.(e), e.target === e.currentTarget && c.focus(t);
280
+ o.onFocus?.(e), e.target === e.currentTarget && s.focus(t);
279
281
  },
280
282
  onPointerDown: (e) => {
281
- s.onPointerDown?.(e), c.grab(e, t, n);
283
+ o.onPointerDown?.(e), s.grab(e, t, n);
282
284
  },
283
285
  onKeyDown: (e) => {
284
- s.onKeyDown?.(e), c.key(e, t, n);
286
+ o.onKeyDown?.(e), s.key(e, t, n);
285
287
  },
286
288
  style: {
287
289
  ...i,
@@ -291,13 +293,13 @@ function C({ id: t, label: n, className: r, style: i, children: a, ...s }) {
291
293
  height: l.h
292
294
  },
293
295
  className: e("zen__canvas-item absolute cursor-move touch-none outline-hidden data-locked:cursor-default data-locked:touch-auto", "[outline-offset:calc(1px/var(--canvas-scale))]", "not-data-selected:hover:outline-solid not-data-selected:hover:outline-[length:calc(1px/var(--canvas-scale))] not-data-selected:hover:outline-[color:oklch(var(--tint)/0.35)]", "data-selected:outline-solid data-selected:outline-[length:calc(2px/var(--canvas-scale))] data-selected:outline-[color:oklch(var(--primary)/0.8)]", "focus-visible:outline-solid focus-visible:outline-[length:calc(2px/var(--canvas-scale))] focus-visible:outline-[color:oklch(var(--ring)/0.7)]", r),
294
- children: [a, d && !l.locked && g.map((r) => /* @__PURE__ */ f("span", {
296
+ children: [a, d && !l.locked && v.map((r) => /* @__PURE__ */ m("span", {
295
297
  "aria-hidden": !0,
296
298
  "data-handle": r,
297
- onPointerDown: (e) => c.grab(e, t, n, r),
298
- className: e("bg-foreground absolute z-10 size-[calc(10px/var(--canvas-scale))] -translate-1/2 rounded-full border-[length:calc(2px/var(--canvas-scale))] border-[color:oklch(var(--primary))] shadow-[0_0_8px_oklch(var(--glow)/0.6)]", "after:absolute after:-inset-[calc(6px/var(--canvas-scale))] pointer-coarse:after:-inset-[calc(14px/var(--canvas-scale))]", _[r])
299
+ onPointerDown: (e) => s.grab(e, t, n, r),
300
+ className: e("bg-foreground absolute z-10 size-[calc(10px/var(--canvas-scale))] -translate-1/2 rounded-full border-[length:calc(2px/var(--canvas-scale))] border-[color:oklch(var(--primary))] shadow-[0_0_8px_oklch(var(--glow)/0.6)]", "after:absolute after:-inset-[calc(6px/var(--canvas-scale))] pointer-coarse:after:-inset-[calc(14px/var(--canvas-scale))]", y[r])
299
301
  }, r))]
300
302
  });
301
303
  }
302
304
  //#endregion
303
- export { S as Canvas, C as CanvasItem };
305
+ export { w as Canvas, T as CanvasItem };