@rinzai/zen 0.14.0 → 0.16.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 (225) hide show
  1. package/CHANGELOG.md +153 -0
  2. package/README.md +16 -1
  3. package/dist/animated-number/index.js +14 -14
  4. package/dist/breadcrumbs/index.js +14 -14
  5. package/dist/calendar/index.js +29 -29
  6. package/dist/calendar-heatmap/index.js +12 -12
  7. package/dist/canvas/index.js +19 -19
  8. package/dist/carousel/index.d.ts.map +1 -1
  9. package/dist/carousel/index.js +29 -29
  10. package/dist/chart/index.js +7 -7
  11. package/dist/code-block/index.js +5 -5
  12. package/dist/collapse/index.js +6 -6
  13. package/dist/color-picker/index.js +10 -10
  14. package/dist/combobox/index.js +61 -61
  15. package/dist/command-palette/index.js +5 -5
  16. package/dist/confirm-dialog/index.js +4 -4
  17. package/dist/date-picker/index.js +15 -15
  18. package/dist/dialog/index.d.ts.map +1 -1
  19. package/dist/dialog/index.js +45 -65
  20. package/dist/docs/README.md +205 -0
  21. package/dist/docs/accordion.md +122 -0
  22. package/dist/docs/alert.md +69 -0
  23. package/dist/docs/animated-number.md +105 -0
  24. package/dist/docs/avatar.md +91 -0
  25. package/dist/docs/backdrop.md +94 -0
  26. package/dist/docs/badge.md +37 -0
  27. package/dist/docs/breadcrumbs.md +44 -0
  28. package/dist/docs/button-group.md +76 -0
  29. package/dist/docs/button.md +131 -0
  30. package/dist/docs/calendar-heatmap.md +73 -0
  31. package/dist/docs/calendar.md +101 -0
  32. package/dist/docs/canvas.md +584 -0
  33. package/dist/docs/card.md +180 -0
  34. package/dist/docs/carousel.md +162 -0
  35. package/dist/docs/chart.md +325 -0
  36. package/dist/docs/checkbox.md +88 -0
  37. package/dist/docs/chip.md +52 -0
  38. package/dist/docs/code-block.md +116 -0
  39. package/dist/docs/code-input.md +52 -0
  40. package/dist/docs/collapse.md +46 -0
  41. package/dist/docs/color-picker.md +145 -0
  42. package/dist/docs/combobox.md +208 -0
  43. package/dist/docs/command-palette.md +65 -0
  44. package/dist/docs/date-picker.md +167 -0
  45. package/dist/docs/dialog.md +271 -0
  46. package/dist/docs/disclosure.md +88 -0
  47. package/dist/docs/editable-cell.md +90 -0
  48. package/dist/docs/empty-state.md +46 -0
  49. package/dist/docs/field.md +82 -0
  50. package/dist/docs/file-drop.md +44 -0
  51. package/dist/docs/filter-bar.md +66 -0
  52. package/dist/docs/header.md +51 -0
  53. package/dist/docs/hover-card.md +110 -0
  54. package/dist/docs/icon-picker.md +65 -0
  55. package/dist/docs/input-group.md +89 -0
  56. package/dist/docs/input.md +33 -0
  57. package/dist/docs/inset.md +57 -0
  58. package/dist/docs/kbd.md +34 -0
  59. package/dist/docs/keypad.md +51 -0
  60. package/dist/docs/load-more.md +66 -0
  61. package/dist/docs/locale-provider.md +99 -0
  62. package/dist/docs/marquee.md +86 -0
  63. package/dist/docs/menu.md +456 -0
  64. package/dist/docs/meter.md +102 -0
  65. package/dist/docs/money-input.md +169 -0
  66. package/dist/docs/month-picker.md +80 -0
  67. package/dist/docs/navigation-menu.md +157 -0
  68. package/dist/docs/number-field.md +129 -0
  69. package/dist/docs/page-header.md +44 -0
  70. package/dist/docs/page-transition.md +93 -0
  71. package/dist/docs/pagination.md +42 -0
  72. package/dist/docs/pills.md +85 -0
  73. package/dist/docs/player-bar.md +158 -0
  74. package/dist/docs/popover.md +200 -0
  75. package/dist/docs/progress-ring.md +70 -0
  76. package/dist/docs/radio-cards.md +82 -0
  77. package/dist/docs/radio-group.md +86 -0
  78. package/dist/docs/range-slider.md +64 -0
  79. package/dist/docs/repeat-picker.md +44 -0
  80. package/dist/docs/resizable.md +107 -0
  81. package/dist/docs/seek-bar.md +97 -0
  82. package/dist/docs/segmented.md +89 -0
  83. package/dist/docs/select.md +148 -0
  84. package/dist/docs/separator.md +76 -0
  85. package/dist/docs/side-nav.md +75 -0
  86. package/dist/docs/skeleton.md +89 -0
  87. package/dist/docs/slider.md +87 -0
  88. package/dist/docs/sortable.md +244 -0
  89. package/dist/docs/sparkline.md +56 -0
  90. package/dist/docs/spinner.md +69 -0
  91. package/dist/docs/status-pill.md +81 -0
  92. package/dist/docs/stepper.md +59 -0
  93. package/dist/docs/tab-bar.md +78 -0
  94. package/dist/docs/table-of-contents.md +43 -0
  95. package/dist/docs/table.md +714 -0
  96. package/dist/docs/tabs.md +140 -0
  97. package/dist/docs/tag-input.md +45 -0
  98. package/dist/docs/textarea.md +25 -0
  99. package/dist/docs/theme-toggle.md +85 -0
  100. package/dist/docs/theming.md +193 -0
  101. package/dist/docs/time-field.md +71 -0
  102. package/dist/docs/timeline.md +50 -0
  103. package/dist/docs/toast.md +53 -0
  104. package/dist/docs/toggle-group.md +83 -0
  105. package/dist/docs/toggle.md +38 -0
  106. package/dist/docs/toolbar.md +97 -0
  107. package/dist/docs/tooltip.md +102 -0
  108. package/dist/docs/tree.md +295 -0
  109. package/dist/docs/trend.md +50 -0
  110. package/dist/filter-bar/index.js +6 -6
  111. package/dist/header/index.js +6 -6
  112. package/dist/icon-picker/index.js +5 -5
  113. package/dist/icons/arrow-path.d.ts +3 -0
  114. package/dist/icons/arrow-path.d.ts.map +1 -0
  115. package/dist/icons/arrows-right-left.d.ts +3 -0
  116. package/dist/icons/arrows-right-left.d.ts.map +1 -0
  117. package/dist/icons/backward.d.ts +3 -0
  118. package/dist/icons/backward.d.ts.map +1 -0
  119. package/dist/icons/forward.d.ts +3 -0
  120. package/dist/icons/forward.d.ts.map +1 -0
  121. package/dist/icons/heart-solid.d.ts +3 -0
  122. package/dist/icons/heart-solid.d.ts.map +1 -0
  123. package/dist/icons/heart.d.ts +3 -0
  124. package/dist/icons/heart.d.ts.map +1 -0
  125. package/dist/icons/musical-note.d.ts +3 -0
  126. package/dist/icons/musical-note.d.ts.map +1 -0
  127. package/dist/icons/pause.d.ts +3 -0
  128. package/dist/icons/pause.d.ts.map +1 -0
  129. package/dist/icons/play.d.ts +3 -0
  130. package/dist/icons/play.d.ts.map +1 -0
  131. package/dist/icons/queue-list.d.ts +3 -0
  132. package/dist/icons/queue-list.d.ts.map +1 -0
  133. package/dist/icons/speaker-wave.d.ts +3 -0
  134. package/dist/icons/speaker-wave.d.ts.map +1 -0
  135. package/dist/icons/speaker-x-mark.d.ts +3 -0
  136. package/dist/icons/speaker-x-mark.d.ts.map +1 -0
  137. package/dist/index.d.ts +7 -1
  138. package/dist/index.d.ts.map +1 -1
  139. package/dist/keypad/index.js +5 -5
  140. package/dist/lib.js +86 -80
  141. package/dist/load-more/index.js +5 -5
  142. package/dist/marquee/index.d.ts +15 -0
  143. package/dist/marquee/index.d.ts.map +1 -0
  144. package/dist/marquee/index.js +90 -0
  145. package/dist/menu/index.d.ts +7 -1
  146. package/dist/menu/index.d.ts.map +1 -1
  147. package/dist/menu/index.js +222 -178
  148. package/dist/money-input/index.js +54 -54
  149. package/dist/month-picker/index.js +11 -11
  150. package/dist/number-field/index.js +5 -5
  151. package/dist/pagination/index.js +12 -12
  152. package/dist/player-bar/index.d.ts +11 -0
  153. package/dist/player-bar/index.d.ts.map +1 -0
  154. package/dist/player-bar/index.js +17 -0
  155. package/dist/radio-cards/index.d.ts +2 -1
  156. package/dist/radio-cards/index.d.ts.map +1 -1
  157. package/dist/radio-cards/index.js +3 -3
  158. package/dist/range-slider/index.js +11 -11
  159. package/dist/repeat-picker/index.js +5 -5
  160. package/dist/resizable/index.js +22 -22
  161. package/dist/seek-bar/index.d.ts +26 -0
  162. package/dist/seek-bar/index.d.ts.map +1 -0
  163. package/dist/seek-bar/index.js +121 -0
  164. package/dist/segmented/index.d.ts +3 -2
  165. package/dist/segmented/index.d.ts.map +1 -1
  166. package/dist/segmented/index.js +19 -18
  167. package/dist/select/index.js +21 -21
  168. package/dist/slider/index.d.ts +2 -1
  169. package/dist/slider/index.d.ts.map +1 -1
  170. package/dist/sortable/index.d.ts +13 -1
  171. package/dist/sortable/index.d.ts.map +1 -1
  172. package/dist/sortable/index.js +74 -55
  173. package/dist/sortable/shared.js +14 -14
  174. package/dist/sortable/tree.js +17 -17
  175. package/dist/sparkline/index.js +4 -4
  176. package/dist/stepper/index.js +13 -13
  177. package/dist/tab-bar/index.d.ts +4 -2
  178. package/dist/tab-bar/index.d.ts.map +1 -1
  179. package/dist/tab-bar/index.js +24 -19
  180. package/dist/table/index.js +26 -26
  181. package/dist/table/selection.js +9 -9
  182. package/dist/table-of-contents/index.js +11 -11
  183. package/dist/tag-input/index.js +5 -5
  184. package/dist/textarea/index.d.ts +6 -2
  185. package/dist/textarea/index.d.ts.map +1 -1
  186. package/dist/textarea/index.js +2 -1
  187. package/dist/theme-toggle/index.js +4 -4
  188. package/dist/theme.css +143 -0
  189. package/dist/time-field/index.js +21 -21
  190. package/dist/toast/index.d.ts.map +1 -1
  191. package/dist/toast/index.js +41 -41
  192. package/dist/tooltip/index.d.ts +9 -3
  193. package/dist/tooltip/index.d.ts.map +1 -1
  194. package/dist/tooltip/index.js +19 -16
  195. package/dist/tree/index.js +34 -34
  196. package/dist/trend/index.js +5 -5
  197. package/dist/utils/duration.d.ts +3 -0
  198. package/dist/utils/duration.d.ts.map +1 -0
  199. package/dist/utils/duration.js +7 -0
  200. package/dist/utils/messages.d.ts +3 -0
  201. package/dist/utils/messages.d.ts.map +1 -1
  202. package/dist/utils/messages.js +4 -1
  203. package/dist/utils/slot.d.ts +5 -2
  204. package/dist/utils/slot.d.ts.map +1 -1
  205. package/dist/utils/slot.js +16 -11
  206. package/dist/utils/swipe.d.ts +7 -0
  207. package/dist/utils/swipe.d.ts.map +1 -1
  208. package/dist/utils/swipe.js +45 -25
  209. package/dist/utils/useAnchoredPopup.d.ts +2 -1
  210. package/dist/utils/useAnchoredPopup.d.ts.map +1 -1
  211. package/dist/utils/useAnchoredPopup.js +10 -5
  212. package/dist/utils/useHeightVar.d.ts +7 -0
  213. package/dist/utils/useHeightVar.d.ts.map +1 -0
  214. package/dist/utils/useHeightVar.js +17 -0
  215. package/dist/utils/useMediaPlayer.d.ts +38 -0
  216. package/dist/utils/useMediaPlayer.d.ts.map +1 -0
  217. package/dist/utils/useMediaPlayer.js +91 -0
  218. package/dist/utils/useMediaSession.d.ts +24 -0
  219. package/dist/utils/useMediaSession.d.ts.map +1 -0
  220. package/dist/utils/useMediaSession.js +76 -0
  221. package/dist/utils/useVirtualList.d.ts +6 -1
  222. package/dist/utils/useVirtualList.d.ts.map +1 -1
  223. package/dist/utils/useVirtualList.js +12 -12
  224. package/dist/zen.css +1 -1
  225. package/package.json +4 -2
@@ -0,0 +1,73 @@
1
+ # Calendar Heatmap
2
+
3
+ A month of days shaded by their value, like spending per day.
4
+
5
+ ```tsx
6
+ import { CalendarHeatmap } from '@rinzai/zen';
7
+ ```
8
+
9
+ ## Examples
10
+
11
+ ### Default
12
+
13
+ ```tsx
14
+ import { CalendarHeatmap, type DateString, formatDate, formatMoney } from '@rinzai/zen';
15
+ import { useState } from 'react';
16
+
17
+ const SPENT: Partial<Record<DateString, number>> = {
18
+ '2026-09-01': 185000,
19
+ '2026-09-03': 3840,
20
+ '2026-09-05': 2500,
21
+ '2026-09-06': 7800,
22
+ '2026-09-08': 1460,
23
+ '2026-09-12': 16450,
24
+ '2026-09-13': 9150,
25
+ '2026-09-15': 4200,
26
+ '2026-09-19': 3180,
27
+ '2026-09-20': 41200,
28
+ '2026-09-22': 1199,
29
+ '2026-09-26': 6420,
30
+ '2026-09-27': 2210,
31
+ };
32
+ const money = (cents: number) => formatMoney(cents, 'USD', 'en-US', { showDecimals: false });
33
+
34
+ /** What was spent each day of a month: pick a day to see it. */
35
+ export default function Default() {
36
+ const [day, setDay] = useState<DateString | null>('2026-09-12');
37
+ return (
38
+ <div className="flex w-full max-w-xs flex-col gap-3">
39
+ <CalendarHeatmap
40
+ month="2026-09"
41
+ values={SPENT}
42
+ locale="en-US"
43
+ format={money}
44
+ onSelectedChange={setDay}
45
+ selected={day}
46
+ />
47
+ <p className="text-muted-foreground mt-0! text-sm">
48
+ {day ? `${formatDate(day, 'en-US', 'long')}: ${money(SPENT[day] ?? 0)} spent` : 'Pick a day'}
49
+ </p>
50
+ </div>
51
+ );
52
+ }
53
+ ```
54
+
55
+ ## API reference
56
+
57
+ ### CalendarHeatmap
58
+
59
+ A month as a grid of days, each shaded by its value (e.g. what was spent
60
+ that day): busy days stand out at a glance. Hover a day for its figure;
61
+ with `onSelectedChange`, days are buttons.
62
+
63
+ | Prop | Type | Default | Description |
64
+ | --- | --- | --- | --- |
65
+ | `month` (required) | `string` | | |
66
+ | `values` (required) | `Partial<Record<string, number>>` | | Each day's value, by date ("2026-09-03"); days missing have none. |
67
+ | `className` | `string` | | |
68
+ | `format` | `((value: number) => string)` | | Turns a value into text for its label, e.g. as money. |
69
+ | `label` | `string` | | Accessible name (default: the month, e.g. "September 2026"). |
70
+ | `locale` | `string` | | |
71
+ | `onSelectedChange` | `((day: string) => void)` | | Makes the days buttons. |
72
+ | `selected` | `string \| null` | | |
73
+ | `weekStartsOn` | `number` | | 0 for Sunday … 6 for Saturday (default: the locale's). |
@@ -0,0 +1,101 @@
1
+ # Calendar
2
+
3
+ A month grid to pick a date or a range, fully keyboard-driven, with limits, blocked days and a year view to jump far.
4
+
5
+ ```tsx
6
+ import { Calendar } from '@rinzai/zen';
7
+ ```
8
+
9
+ ## Examples
10
+
11
+ ### Default
12
+
13
+ ```tsx
14
+ import { Calendar, formatDate } from '@rinzai/zen';
15
+ import { useState } from 'react';
16
+
17
+ /** Click a day, or use the keyboard: arrows, Home/End, Page Up/Down (Shift for years). The title jumps to any month and year. */
18
+ export default function Default() {
19
+ const [date, setDate] = useState<string | null>('2026-09-30');
20
+ return (
21
+ <div className="flex flex-col items-center gap-3">
22
+ <Calendar value={date} onValueChange={setDate} locale="en-US" />
23
+ <p className="text-muted-foreground mt-0! text-xs">
24
+ {date ? formatDate(date, 'en-US', 'full') : 'No date'}
25
+ </p>
26
+ </div>
27
+ );
28
+ }
29
+ ```
30
+
31
+ ### Range
32
+
33
+ ```tsx
34
+ import { Calendar, type DateRange, daysBetween, formatDateRange } from '@rinzai/zen';
35
+ import { useState } from 'react';
36
+
37
+ /** Two months side by side: pick a start, then an end. The days between are previewed as you point. */
38
+ export default function Range() {
39
+ const [range, setRange] = useState<DateRange | null>({ start: '2026-10-05', end: '2026-10-12' });
40
+ return (
41
+ <div className="flex flex-col items-center gap-3">
42
+ <Calendar mode="range" months={2} value={range} onValueChange={setRange} locale="en-GB" />
43
+ <p className="text-muted-foreground mt-0! text-xs">
44
+ {range?.end
45
+ ? `${formatDateRange(range.start, range.end, 'en-GB')} · ${daysBetween(range.start, range.end) + 1} days`
46
+ : 'Pick the last day'}
47
+ </p>
48
+ </div>
49
+ );
50
+ }
51
+ ```
52
+
53
+ ### Limits
54
+
55
+ ```tsx
56
+ import { addDays, Calendar, dayOfWeek, today } from '@rinzai/zen';
57
+ import { useState } from 'react';
58
+
59
+ /** Only the next 60 days, and no weekends: min, max and isDisabled. Weeks start on Monday here, whatever the locale. */
60
+ export default function Limits() {
61
+ const start = today();
62
+ const [date, setDate] = useState<string | null>(null);
63
+ return (
64
+ <Calendar
65
+ value={date}
66
+ onValueChange={setDate}
67
+ locale="en-US"
68
+ weekStartsOn={1}
69
+ min={start}
70
+ max={addDays(start, 60)}
71
+ isDisabled={(d) => dayOfWeek(d) === 0 || dayOfWeek(d) === 6}
72
+ />
73
+ );
74
+ }
75
+ ```
76
+
77
+ ## API reference
78
+
79
+ ### Calendar
80
+
81
+ A month grid to pick a date, or a range of dates, fully keyboard-driven:
82
+ arrows move by day and week, Home and End to the week's ends, Page Up and
83
+ Down by month (with Shift, by year). The title opens a year and month grid
84
+ to jump far. Dates are "YYYY-MM-DD" strings, so they never shift a day with
85
+ time zones. Inline on a page, or in a popup with DatePicker.
86
+
87
+ | Prop | Type | Default | Description |
88
+ | --- | --- | --- | --- |
89
+ | `autoFocus` | `boolean` | | Focus the chosen date (or today) when shown, e.g. in a popup. |
90
+ | `className` | `string` | | |
91
+ | `defaultMonth` | `string` | | Month shown first ("YYYY-MM"). Defaults to the chosen date's, or this month. |
92
+ | `defaultValue` | `DateRange \| string \| null` | | The first date, when the calendar keeps its own. The first range, when the calendar keeps its own. |
93
+ | `isDisabled` | `((date: string) => boolean)` | | Dates that can't be picked, e.g. weekends or booked days. |
94
+ | `locale` | `string` | | Decides month and weekday names, and the first day of the week, e.g. "en-IN". Defaults to the LocaleProvider's. |
95
+ | `max` | `string` | | Latest date that can be picked. |
96
+ | `min` | `string` | | Earliest date that can be picked ("YYYY-MM-DD"). |
97
+ | `mode` | `"range" \| "single"` | | Pick a start and then an end; the days between are highlighted, previewed while pointing. |
98
+ | `months` | `number` | | Months shown side by side (e.g. 2 for ranges). |
99
+ | `onValueChange` | `((date: string) => void) \| ((range: DateRange) => void)` | | |
100
+ | `value` | `DateRange \| string \| null` | | "YYYY-MM-DD", or null for none, when you keep it. The range when you keep it; `end` is null while only the start is picked. |
101
+ | `weekStartsOn` | `number` | | 0 for Sunday … 6 for Saturday. Defaults to the locale's. |