@rinzai/zen 0.9.0 → 0.10.1

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 (112) hide show
  1. package/dist/animated-number/index.d.ts +6 -2
  2. package/dist/animated-number/index.d.ts.map +1 -1
  3. package/dist/animated-number/index.js +68 -17
  4. package/dist/calendar-heatmap/index.d.ts +25 -0
  5. package/dist/calendar-heatmap/index.d.ts.map +1 -0
  6. package/dist/calendar-heatmap/index.js +48 -0
  7. package/dist/chart/allocation.d.ts +30 -0
  8. package/dist/chart/allocation.d.ts.map +1 -0
  9. package/dist/chart/allocation.js +69 -0
  10. package/dist/chart/index.d.ts +1 -0
  11. package/dist/chart/index.d.ts.map +1 -1
  12. package/dist/chart/index.js +85 -83
  13. package/dist/code-block/index.d.ts +1 -1
  14. package/dist/code-block/index.d.ts.map +1 -1
  15. package/dist/code-block/index.js +31 -22
  16. package/dist/collapse/index.d.ts +3 -2
  17. package/dist/collapse/index.d.ts.map +1 -1
  18. package/dist/collapse/index.js +1 -1
  19. package/dist/date-picker/index.d.ts +10 -2
  20. package/dist/date-picker/index.d.ts.map +1 -1
  21. package/dist/date-picker/index.js +43 -21
  22. package/dist/dialog/index.d.ts +4 -2
  23. package/dist/dialog/index.d.ts.map +1 -1
  24. package/dist/dialog/index.js +69 -113
  25. package/dist/editable-cell/index.d.ts +2 -1
  26. package/dist/editable-cell/index.d.ts.map +1 -1
  27. package/dist/editable-cell/index.js +24 -17
  28. package/dist/filter-bar/index.d.ts +21 -0
  29. package/dist/filter-bar/index.d.ts.map +1 -0
  30. package/dist/filter-bar/index.js +90 -0
  31. package/dist/icon-picker/index.d.ts +38 -0
  32. package/dist/icon-picker/index.d.ts.map +1 -0
  33. package/dist/icon-picker/index.js +112 -0
  34. package/dist/icons/arrow-left.js +23 -0
  35. package/dist/icons/micro/arrow-trending-down.d.ts +3 -0
  36. package/dist/icons/micro/arrow-trending-down.d.ts.map +1 -0
  37. package/dist/icons/micro/arrow-trending-down.js +21 -0
  38. package/dist/icons/micro/arrow-trending-up.d.ts +3 -0
  39. package/dist/icons/micro/arrow-trending-up.d.ts.map +1 -0
  40. package/dist/icons/micro/arrow-trending-up.js +21 -0
  41. package/dist/index.d.ts +17 -5
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/kbd/index.d.ts +4 -0
  44. package/dist/kbd/index.d.ts.map +1 -0
  45. package/dist/kbd/index.js +12 -0
  46. package/dist/keypad/index.d.ts +20 -0
  47. package/dist/keypad/index.d.ts.map +1 -0
  48. package/dist/keypad/index.js +42 -0
  49. package/dist/lib.js +92 -77
  50. package/dist/load-more/index.d.ts +19 -0
  51. package/dist/load-more/index.d.ts.map +1 -0
  52. package/dist/load-more/index.js +37 -0
  53. package/dist/menu/index.d.ts +22 -3
  54. package/dist/menu/index.d.ts.map +1 -1
  55. package/dist/menu/index.js +139 -48
  56. package/dist/meter/index.d.ts +3 -1
  57. package/dist/meter/index.d.ts.map +1 -1
  58. package/dist/meter/index.js +19 -14
  59. package/dist/money-input/index.d.ts +3 -3
  60. package/dist/page-transition/index.d.ts +10 -0
  61. package/dist/page-transition/index.d.ts.map +1 -0
  62. package/dist/page-transition/index.js +16 -0
  63. package/dist/progress-ring/index.d.ts +4 -1
  64. package/dist/progress-ring/index.d.ts.map +1 -1
  65. package/dist/progress-ring/index.js +47 -38
  66. package/dist/range-slider/index.d.ts +26 -0
  67. package/dist/range-slider/index.d.ts.map +1 -0
  68. package/dist/range-slider/index.js +44 -0
  69. package/dist/repeat-picker/index.d.ts +22 -0
  70. package/dist/repeat-picker/index.d.ts.map +1 -0
  71. package/dist/repeat-picker/index.js +115 -0
  72. package/dist/slider/index.d.ts +2 -0
  73. package/dist/slider/index.d.ts.map +1 -1
  74. package/dist/slider/index.js +19 -18
  75. package/dist/sortable/index.d.ts +33 -0
  76. package/dist/sortable/index.d.ts.map +1 -0
  77. package/dist/sortable/index.js +147 -0
  78. package/dist/table/index.d.ts +5 -1
  79. package/dist/table/index.d.ts.map +1 -1
  80. package/dist/table/index.js +90 -58
  81. package/dist/table/selection.d.ts +55 -0
  82. package/dist/table/selection.d.ts.map +1 -0
  83. package/dist/table/selection.js +83 -0
  84. package/dist/table/swipe.d.ts +18 -0
  85. package/dist/table/swipe.d.ts.map +1 -0
  86. package/dist/table/swipe.js +53 -0
  87. package/dist/tabs/index.d.ts.map +1 -1
  88. package/dist/tabs/index.js +101 -51
  89. package/dist/theme-toggle/index.js +6 -6
  90. package/dist/theme.css +184 -11
  91. package/dist/toast/index.js +25 -25
  92. package/dist/toggle/index.d.ts.map +1 -1
  93. package/dist/toggle/index.js +1 -1
  94. package/dist/trend/index.d.ts +19 -0
  95. package/dist/trend/index.d.ts.map +1 -0
  96. package/dist/trend/index.js +27 -0
  97. package/dist/utils/date.d.ts +34 -0
  98. package/dist/utils/date.d.ts.map +1 -1
  99. package/dist/utils/date.js +45 -12
  100. package/dist/utils/money.d.ts +3 -1
  101. package/dist/utils/money.d.ts.map +1 -1
  102. package/dist/utils/money.js +24 -1
  103. package/dist/utils/repeat.d.ts +17 -0
  104. package/dist/utils/repeat.d.ts.map +1 -0
  105. package/dist/utils/repeat.js +38 -0
  106. package/dist/utils/swipe.d.ts +29 -0
  107. package/dist/utils/swipe.d.ts.map +1 -0
  108. package/dist/utils/swipe.js +85 -0
  109. package/dist/utils/useAnchoredPopup.d.ts.map +1 -1
  110. package/dist/utils/useAnchoredPopup.js +3 -9
  111. package/dist/zen.css +1 -1
  112. package/package.json +3 -1
@@ -3,56 +3,80 @@ import { cx as e } from "../utils/cx.js";
3
3
  import { useTypeahead as t } from "../utils/typeahead.js";
4
4
  import { useGraphicsMode as n } from "../utils/graphics.js";
5
5
  import { Slot as r } from "../utils/slot.js";
6
- import { anchoredStyle as i, useAnchoredPopup as a } from "../utils/useAnchoredPopup.js";
7
- import { createContext as o, useContext as s, useId as c } from "react";
8
- import { jsx as l, jsxs as u } from "react/jsx-runtime";
6
+ import { anchorFor as i, anchoredStyle as a, useAnchoredPopup as o } from "../utils/useAnchoredPopup.js";
7
+ import { createContext as s, useContext as c, useEffect as l, useId as u, useLayoutEffect as d, useRef as f, useState as p } from "react";
8
+ import { createPortal as m } from "react-dom";
9
+ import { Fragment as h, jsx as g, jsxs as _ } from "react/jsx-runtime";
9
10
  //#region packages/menu/index.tsx
10
- var d = o(() => {}), f = o(null);
11
- function p(e) {
12
- let t = s(f);
11
+ var v = typeof window > "u" ? l : d, y = s(() => {}), b = s(null);
12
+ function x(e) {
13
+ let t = c(b);
13
14
  if (!t) throw Error(`<${e}> must be inside <Menu>`);
14
15
  return t;
15
16
  }
16
- function m({ onOpenChange: e, children: t }) {
17
+ function S({ onOpenChange: e, children: t }) {
17
18
  n();
18
- let r = c(), i = a({ onOpenChange: (t) => {
19
- t && i.popupRef.current?.focus(), e?.(t);
20
- } });
21
- return /* @__PURE__ */ l(f.Provider, {
19
+ let r = u(), [i, a] = p(null), s = f(null), c = f(!1), l = o({ onOpenChange: (t) => {
20
+ if (c.current = t, t ? l.popupRef.current?.focus() : d(), !t && s.current) {
21
+ let e = document.activeElement;
22
+ (!e || e === document.body || l.popupRef.current?.contains(e)) && s.current.focus(), s.current = null;
23
+ }
24
+ e?.(t);
25
+ } }), d = () => {
26
+ let e = l.popupRef.current?.getAnimations?.() ?? [];
27
+ Promise.allSettled(e.map((e) => e.finished)).then(() => {
28
+ c.current || a(null);
29
+ });
30
+ };
31
+ return v(() => {
32
+ if (i && (l.setOpen(!0), i.pointerId !== void 0)) try {
33
+ l.popupRef.current?.setPointerCapture(i.pointerId);
34
+ } catch {}
35
+ }, [i]), /* @__PURE__ */ g(b.Provider, {
22
36
  value: {
23
- popup: i,
24
- triggerId: r
37
+ popup: l,
38
+ triggerId: r,
39
+ point: i,
40
+ openAt: (e) => {
41
+ s.current = document.activeElement instanceof HTMLElement ? document.activeElement : null, a({ ...e });
42
+ }
25
43
  },
26
- children: /* @__PURE__ */ l(d.Provider, {
27
- value: () => i.setOpen(!1),
44
+ children: /* @__PURE__ */ g(y.Provider, {
45
+ value: () => l.setOpen(!1),
28
46
  children: t
29
47
  })
30
48
  });
31
49
  }
32
- function h({ asChild: t, style: n, children: i, ...a }) {
33
- let { popup: o, triggerId: s } = p("MenuTrigger"), c = {
50
+ function C({ asChild: t, style: n, children: i, ...a }) {
51
+ let { popup: o, triggerId: s, point: c } = x("MenuTrigger"), l = {
34
52
  id: s,
35
53
  "aria-haspopup": "menu",
36
54
  ...o.triggerProps,
55
+ ...c && {
56
+ "aria-expanded": !1,
57
+ "data-popup-open": void 0
58
+ },
37
59
  ...a,
38
60
  style: {
39
61
  ...o.triggerProps.style,
40
62
  ...n
41
63
  }
42
64
  };
43
- return t ? /* @__PURE__ */ l(r, {
44
- ...c,
65
+ return t ? /* @__PURE__ */ g(r, {
66
+ ...l,
45
67
  children: i
46
- }) : /* @__PURE__ */ l("button", {
68
+ }) : /* @__PURE__ */ g("button", {
47
69
  type: "button",
48
- ...c,
49
- className: e("cursor-pointer", c.className),
70
+ ...l,
71
+ className: e("cursor-pointer", l.className),
50
72
  children: i
51
73
  });
52
74
  }
53
- function g({ align: n = "end", offset: r = 6, className: a, style: o, children: s, ...c }) {
54
- let { popup: u, triggerId: d } = p("MenuContent"), f = t(), m = (e) => {
55
- let t = Array.from(u.popupRef.current?.querySelectorAll("[role=\"menuitem\"]:not(:disabled)") ?? []), n = t.indexOf(document.activeElement), r = t.length - 1, i = f(e);
75
+ function w({ align: n, offset: r, className: i, style: o, children: s, ...c }) {
76
+ let { popup: l, triggerId: u, point: d } = x("MenuContent");
77
+ n ??= d ? "start" : "end", r ??= d ? 2 : 6;
78
+ let f = t(), p = (e) => {
79
+ let t = Array.from(l.popupRef.current?.querySelectorAll("[role=\"menuitem\"]:not(:disabled)") ?? []), n = t.indexOf(document.activeElement), r = t.length - 1, i = f(e);
56
80
  if (i) {
57
81
  t.find((e) => e.textContent?.trim().toLowerCase().startsWith(i))?.focus();
58
82
  return;
@@ -65,61 +89,128 @@ function g({ align: n = "end", offset: r = 6, className: a, style: o, children:
65
89
  }[e.key];
66
90
  a !== void 0 && (e.preventDefault(), t[(a + t.length) % t.length]?.focus());
67
91
  };
68
- return /* @__PURE__ */ l("div", {
69
- "aria-labelledby": d,
92
+ return /* @__PURE__ */ g("div", {
93
+ "aria-labelledby": d ? void 0 : u,
70
94
  ...c,
71
- ...u.popupProps,
95
+ ...l.popupProps,
72
96
  role: "menu",
73
97
  tabIndex: -1,
74
98
  onKeyDown: (e) => {
75
- c.onKeyDown?.(e), m(e);
99
+ c.onKeyDown?.(e), p(e);
76
100
  },
77
101
  style: {
78
- ...i(u.id, {
102
+ ...a(l.id, {
79
103
  align: n,
80
104
  offset: r
81
105
  }),
82
106
  ...o
83
107
  },
84
- className: e("zen__popover glass glass-blur text-foreground min-w-44 rounded-xl p-1.5 outline-hidden", a),
108
+ className: e("zen__popover glass glass-blur text-foreground min-w-44 rounded-xl p-1.5 outline-hidden", i),
85
109
  children: s
86
110
  });
87
111
  }
88
- var _ = "flex w-full cursor-pointer items-center gap-3 rounded-lg px-3 py-2 text-left text-sm outline-hidden select-none hover:bg-tint/[0.07] focus:bg-tint/[0.07] disabled:cursor-not-allowed disabled:opacity-50";
89
- function v({ icon: t, destructive: n, onSelect: i, asChild: a, className: o, children: c, onClick: f, ...p }) {
90
- let m = s(d), h = {
112
+ var T = 500, E = 8;
113
+ function D({ asChild: t, disabled: n, className: a, onContextMenu: o, onPointerDown: s, onClickCapture: c, children: d, ...p }) {
114
+ let { popup: v, point: y, openAt: b } = x("MenuContextTrigger"), S = u(), C = y?.from === S, w = f(null), D = f(!1), O = () => {
115
+ w.current && clearTimeout(w.current.timer), w.current = null;
116
+ };
117
+ l(() => O, []);
118
+ let k = {
91
119
  ...p,
120
+ className: e("[-webkit-touch-callout:none]", a),
121
+ "data-popup-open": C && v.open || void 0,
122
+ onContextMenu: (e) => {
123
+ if (o?.(e), !(n || e.defaultPrevented) && (e.preventDefault(), O(), !v.open)) {
124
+ if (e.clientX === 0 && e.clientY === 0) {
125
+ let t = e.target.getBoundingClientRect();
126
+ b({
127
+ x: t.left,
128
+ y: t.bottom,
129
+ from: S
130
+ });
131
+ } else {
132
+ let t = e.nativeEvent, n = "pointerId" in t && e.buttons ? t.pointerId : void 0;
133
+ b({
134
+ x: e.clientX,
135
+ y: e.clientY,
136
+ from: S,
137
+ pointerId: n
138
+ });
139
+ }
140
+ }
141
+ },
142
+ onPointerDown: (e) => {
143
+ if (s?.(e), D.current = !1, n || e.pointerType !== "touch" || !e.isPrimary) return;
144
+ let t = {
145
+ x: e.clientX,
146
+ y: e.clientY,
147
+ from: S,
148
+ pointerId: e.pointerId
149
+ }, r = e.currentTarget, i = (e) => {
150
+ Math.hypot(e.clientX - t.x, e.clientY - t.y) > E && a();
151
+ }, a = () => {
152
+ O(), r.removeEventListener("pointermove", i), r.removeEventListener("pointerup", a), r.removeEventListener("pointercancel", a);
153
+ };
154
+ r.addEventListener("pointermove", i), r.addEventListener("pointerup", a), r.addEventListener("pointercancel", a), w.current = {
155
+ ...t,
156
+ timer: window.setTimeout(() => {
157
+ a(), D.current = !0, v.open || b(t);
158
+ }, T)
159
+ };
160
+ },
161
+ onClickCapture: (e) => {
162
+ c?.(e), D.current && (D.current = !1, e.preventDefault(), e.stopPropagation());
163
+ }
164
+ }, A = y && C && m(/* @__PURE__ */ g("span", {
165
+ "aria-hidden": !0,
166
+ ...i(v.id),
167
+ style: {
168
+ ...i(v.id).style,
169
+ position: "fixed",
170
+ left: y.x,
171
+ top: y.y
172
+ }
173
+ }), document.body);
174
+ return /* @__PURE__ */ _(h, { children: [g(t ? r : "div", {
175
+ ...k,
176
+ children: d
177
+ }), A] });
178
+ }
179
+ var O = "flex w-full cursor-pointer items-center gap-3 rounded-lg px-3 py-2 text-left text-sm outline-hidden select-none hover:bg-tint/[0.07] focus:bg-tint/[0.07] disabled:cursor-not-allowed disabled:opacity-50";
180
+ function k({ icon: t, destructive: n, onSelect: i, asChild: a, className: o, children: s, onClick: l, ...u }) {
181
+ let d = c(y), f = {
182
+ ...u,
92
183
  role: "menuitem",
93
184
  tabIndex: -1,
94
- className: e(_, n && "text-destructive", o),
185
+ className: e(O, n && "text-destructive", o),
95
186
  onClick: (e) => {
96
- f?.(e), m(), i?.();
187
+ l?.(e), d(), i?.();
97
188
  }
98
189
  };
99
- return a ? /* @__PURE__ */ l(r, {
100
- ...h,
101
- children: c
102
- }) : /* @__PURE__ */ u("button", {
190
+ return a ? /* @__PURE__ */ g(r, {
191
+ ...f,
192
+ children: s
193
+ }) : /* @__PURE__ */ _("button", {
103
194
  type: "button",
104
- ...h,
105
- children: [t && /* @__PURE__ */ l("span", {
195
+ ...f,
196
+ children: [t && /* @__PURE__ */ g("span", {
106
197
  "aria-hidden": !0,
107
198
  className: e("flex shrink-0", !n && "text-muted-foreground"),
108
199
  children: t
109
- }), c]
200
+ }), s]
110
201
  });
111
202
  }
112
- function y({ className: t }) {
113
- return /* @__PURE__ */ l("div", {
203
+ function A({ className: t }) {
204
+ return /* @__PURE__ */ g("div", {
114
205
  role: "separator",
115
206
  className: e("bg-tint/[0.07] mx-2 my-1 h-px", t)
116
207
  });
117
208
  }
118
- function b({ className: t, ...n }) {
119
- return /* @__PURE__ */ l("div", {
209
+ function j({ className: t, ...n }) {
210
+ return /* @__PURE__ */ g("div", {
120
211
  className: e("flex items-center gap-3 px-3 py-2.5", t),
121
212
  ...n
122
213
  });
123
214
  }
124
215
  //#endregion
125
- export { g as MenuContent, b as MenuHeader, v as MenuItem, y as MenuSeparator, h as MenuTrigger, m as default };
216
+ export { w as MenuContent, D as MenuContextTrigger, j as MenuHeader, k as MenuItem, A as MenuSeparator, C as MenuTrigger, S as default };
@@ -4,7 +4,7 @@ import { ComponentProps, ReactNode } from 'react';
4
4
  * a figure and a note. Over the limit it turns red; near it, warm. Announced
5
5
  * as a meter, with `valueText` read out instead of the bare number.
6
6
  */
7
- export default function Meter({ value, max, label, detail, hint, valueText, tone, warnAt, className, ...rest }: MeterProps): import('react').JSX.Element;
7
+ export default function Meter({ value, max, label, detail, hint, valueText, tone, warnAt, marks, className, ...rest }: MeterProps): import('react').JSX.Element;
8
8
  /** Also takes the element's own props, e.g. `aria-label` when there's no visible label. */
9
9
  export interface MeterProps extends Omit<ComponentProps<'div'>, 'children'> {
10
10
  value: number;
@@ -21,6 +21,8 @@ export interface MeterProps extends Omit<ComponentProps<'div'>, 'children'> {
21
21
  tone?: 'auto' | 'default' | 'warning' | 'danger';
22
22
  /** Fraction of max where `auto` turns to warning (default 0.85). */
23
23
  warnAt?: number;
24
+ /** Milestones along the bar, in the same units as value: e.g. [2500, 5000, 7500] of 10000. */
25
+ marks?: number[];
24
26
  className?: string;
25
27
  }
26
28
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/meter/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAS,MAAM,OAAO,CAAC;AAEzD;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,EAC1B,KAAK,EACL,GAAS,EACT,KAAK,EACL,MAAM,EACN,IAAI,EACJ,SAAS,EACT,IAAa,EACb,MAAa,EACb,SAAS,EACT,GAAG,IAAI,EACV,EAAE,UAAU,+BAyDZ;AAED,2FAA2F;AAC3F,MAAM,WAAW,UAAW,SAAQ,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,yCAAyC;IACzC,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,oFAAoF;IACpF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACjD,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/meter/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAS,MAAM,OAAO,CAAC;AAEzD;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,EAC1B,KAAK,EACL,GAAS,EACT,KAAK,EACL,MAAM,EACN,IAAI,EACJ,SAAS,EACT,IAAa,EACb,MAAa,EACb,KAAK,EACL,SAAS,EACT,GAAG,IAAI,EACV,EAAE,UAAU,+BAkEZ;AAED,2FAA2F;AAC3F,MAAM,WAAW,UAAW,SAAQ,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,yCAAyC;IACzC,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,oFAAoF;IACpF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACjD,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8FAA8F;IAC9F,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB"}
@@ -3,36 +3,41 @@ import { cx as e } from "../utils/cx.js";
3
3
  import { useId as t } from "react";
4
4
  import { jsx as n, jsxs as r } from "react/jsx-runtime";
5
5
  //#region packages/meter/index.tsx
6
- function i({ value: i, max: a = 100, label: o, detail: s, hint: c, valueText: l, tone: u = "auto", warnAt: d = .85, className: f, ...p }) {
7
- let m = t(), h = i > a, g = a > 0 ? i / a : +(i > 0), _ = Math.min(100, Math.max(0, Math.round(g * 100))), v = u === "auto" ? h ? "danger" : g >= d ? "warning" : "default" : u;
6
+ function i({ value: i, max: a = 100, label: o, detail: s, hint: c, valueText: l, tone: u = "auto", warnAt: d = .85, marks: f, className: p, ...m }) {
7
+ let h = t(), g = i > a, _ = a > 0 ? i / a : +(i > 0), v = Math.min(100, Math.max(0, Math.round(_ * 100))), y = u === "auto" ? g ? "danger" : _ >= d ? "warning" : "default" : u;
8
8
  return /* @__PURE__ */ r("div", {
9
- ...p,
9
+ ...m,
10
10
  role: "meter",
11
- "aria-labelledby": o ? m : p["aria-labelledby"],
11
+ "aria-labelledby": o ? h : m["aria-labelledby"],
12
12
  "aria-valuemin": 0,
13
13
  "aria-valuemax": a,
14
14
  "aria-valuenow": Math.min(i, a),
15
15
  "aria-valuetext": l,
16
- className: e("zen__meter grid grid-cols-2 gap-y-1.5", f),
16
+ className: e("zen__meter grid grid-cols-2 gap-y-1.5", p),
17
17
  children: [
18
18
  o && /* @__PURE__ */ n("span", {
19
- id: m,
19
+ id: h,
20
20
  className: "text-sm font-medium",
21
21
  children: o
22
22
  }),
23
23
  s && /* @__PURE__ */ n("span", {
24
- className: e("col-start-2 text-right text-sm tabular-nums", v === "danger" ? "text-destructive" : "text-muted-foreground"),
24
+ className: e("col-start-2 text-right text-sm tabular-nums", y === "danger" ? "text-destructive" : "text-muted-foreground"),
25
25
  children: s
26
26
  }),
27
- /* @__PURE__ */ n("div", {
28
- className: "bg-muted col-span-2 h-2 overflow-hidden rounded-full",
29
- children: /* @__PURE__ */ n("div", {
30
- className: e("zen__meter-fill ease-out-soft h-full rounded-full transition-[width] duration-700", v === "danger" ? "bg-destructive shadow-[0_0_12px_oklch(var(--destructive)/calc(0.7*var(--glow-k)))]" : v === "warning" ? "bg-accent-foreground shadow-[0_0_12px_oklch(var(--accent-foreground)/calc(0.6*var(--glow-k)))]" : "from-primary to-glow-2 bg-gradient-to-r shadow-[0_0_12px_oklch(var(--glow)/calc(0.6*var(--glow-k)))]"),
31
- style: { width: `${_}%` }
32
- })
27
+ /* @__PURE__ */ r("div", {
28
+ className: "bg-muted relative col-span-2 h-2 overflow-hidden rounded-full",
29
+ children: [/* @__PURE__ */ n("div", {
30
+ className: e("zen__meter-fill ease-out-soft h-full rounded-full transition-[width] duration-700", y === "danger" ? "bg-destructive shadow-[0_0_12px_oklch(var(--destructive)/calc(0.7*var(--glow-k)))]" : y === "warning" ? "bg-accent-foreground shadow-[0_0_12px_oklch(var(--accent-foreground)/calc(0.6*var(--glow-k)))]" : "from-primary to-glow-2 bg-gradient-to-r shadow-[0_0_12px_oklch(var(--glow)/calc(0.6*var(--glow-k)))]"),
31
+ style: { width: `${v}%` }
32
+ }), f?.map((e) => /* @__PURE__ */ n("span", {
33
+ "aria-hidden": !0,
34
+ "data-reached": i >= e || void 0,
35
+ className: "zen__meter-mark bg-tint/25 data-reached:bg-background/70 absolute inset-y-0 w-0.5 -translate-x-1/2 transition-colors duration-700",
36
+ style: { left: `${a > 0 ? Math.min(100, e / a * 100) : 0}%` }
37
+ }, e))]
33
38
  }),
34
39
  c && /* @__PURE__ */ n("span", {
35
- className: e("col-span-2 text-xs", v === "danger" ? "text-destructive" : "text-muted-foreground"),
40
+ className: e("col-span-2 text-xs", y === "danger" ? "text-destructive" : "text-muted-foreground"),
36
41
  children: c
37
42
  })
38
43
  ]
@@ -3,9 +3,9 @@ import { Money } from '../utils/money';
3
3
  import { ChangeEvent, ComponentProps, KeyboardEvent, ReactNode } from 'react';
4
4
  /**
5
5
  * Amount input in one currency. Shows grouped digits for the locale (1,52,000
6
- * for en-IN) and accepts shorthand: 1.5L, 2cr, 10k, 1.2m. Commits on blur or
7
- * Enter; Escape reverts. Values are integer minor units (paise, cents), or null
8
- * when empty.
6
+ * for en-IN) and accepts shorthand: 1.5L, 2cr, 10k, 1.2m, and sums: 120+45.50,
7
+ * 3*12.99. Commits on blur or Enter; Escape reverts. Values are integer minor
8
+ * units (paise, cents), or null when empty.
9
9
  *
10
10
  * With `convert`, the symbol becomes a currency switch: type an amount in e.g.
11
11
  * USD and it's converted at the rates you load (in the browser; the amount is
@@ -0,0 +1,10 @@
1
+ import { ComponentProps } from 'react';
2
+ /**
3
+ * The page's content, which changes between pages: wrap your route's outlet in
4
+ * it, and when the router changes page in a view transition (React Router's
5
+ * `viewTransition`, or document.startViewTransition yourself) the old page
6
+ * fades out as the new one rises in, while everything outside (header, nav)
7
+ * stays still. One per page.
8
+ */
9
+ export default function PageTransition({ className, style, ...rest }: ComponentProps<'div'>): import('react').JSX.Element;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/page-transition/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAEvC;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE,cAAc,CAAC,KAAK,CAAC,+BAQ1F"}
@@ -0,0 +1,16 @@
1
+ "use client";
2
+ import { cx as e } from "../utils/cx.js";
3
+ import { jsx as t } from "react/jsx-runtime";
4
+ //#region packages/page-transition/index.tsx
5
+ function n({ className: n, style: r, ...i }) {
6
+ return /* @__PURE__ */ t("div", {
7
+ className: e("zen__page-transition", n),
8
+ style: {
9
+ viewTransitionName: "zen-page",
10
+ ...r
11
+ },
12
+ ...i
13
+ });
14
+ }
15
+ //#endregion
16
+ export { n as default };
@@ -1,5 +1,8 @@
1
1
  import { ReactNode } from 'react';
2
- /** Circular progress, 0–1, with optional content in the middle. */
2
+ /**
3
+ * Circular progress, 0–1, with optional content in the middle. Reaching 1
4
+ * while shown sends out a ring of glow, once.
5
+ */
3
6
  export default function ProgressRing({ value, size, stroke, label, children, className }: ProgressRingProps): import('react').JSX.Element;
4
7
  export interface ProgressRingProps {
5
8
  /** Progress from 0 to 1; values outside are clamped. */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/progress-ring/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,mEAAmE;AACnE,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,KAAK,EAAE,IAAS,EAAE,MAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,iBAAiB,+BAsCnH;AAED,MAAM,WAAW,iBAAiB;IAC9B,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/progress-ring/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAY,MAAM,OAAO,CAAC;AAE5C;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,KAAK,EAAE,IAAS,EAAE,MAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,iBAAiB,+BAqDnH;AAED,MAAM,WAAW,iBAAiB;IAC9B,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB"}
@@ -1,49 +1,58 @@
1
1
  "use client";
2
2
  import { cx as e } from "../utils/cx.js";
3
- import { jsx as t, jsxs as n } from "react/jsx-runtime";
3
+ import { useState as t } from "react";
4
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
4
5
  //#region packages/progress-ring/index.tsx
5
- function r({ value: r, size: i = 84, stroke: a = 7, label: o, children: s, className: c }) {
6
- let l = (i - a) / 2, u = 2 * Math.PI * l, d = Math.min(Math.max(r, 0), 1);
7
- return /* @__PURE__ */ n("div", {
6
+ function i({ value: i, size: a = 84, stroke: o = 7, label: s, children: c, className: l }) {
7
+ let u = (a - o) / 2, d = 2 * Math.PI * u, f = Math.min(Math.max(i, 0), 1), [p, m] = t(f), [h, g] = t(0);
8
+ return f !== p && (m(f), p < 1 && f === 1 && g(h + 1)), /* @__PURE__ */ r("div", {
8
9
  role: "progressbar",
9
- "aria-label": o,
10
+ "aria-label": s,
10
11
  "aria-valuemin": 0,
11
12
  "aria-valuemax": 100,
12
- "aria-valuenow": Math.round(d * 100),
13
- className: e("zen__progress-ring relative grid shrink-0 place-items-center", c),
13
+ "aria-valuenow": Math.round(f * 100),
14
+ className: e("zen__progress-ring relative grid shrink-0 place-items-center", l),
14
15
  style: {
15
- width: i,
16
- height: i
16
+ width: a,
17
+ height: a
17
18
  },
18
- children: [/* @__PURE__ */ n("svg", {
19
- width: i,
20
- height: i,
21
- viewBox: `0 0 ${i} ${i}`,
22
- className: "-rotate-90",
23
- "aria-hidden": !0,
24
- children: [/* @__PURE__ */ t("circle", {
25
- cx: i / 2,
26
- cy: i / 2,
27
- r: l,
28
- fill: "none",
29
- strokeWidth: a,
30
- className: "stroke-tint/[0.07]"
31
- }), /* @__PURE__ */ t("circle", {
32
- cx: i / 2,
33
- cy: i / 2,
34
- r: l,
35
- fill: "none",
36
- strokeWidth: a,
37
- strokeLinecap: "round",
38
- strokeDasharray: u,
39
- strokeDashoffset: u * (1 - d),
40
- className: "zen__progress-ring-arc stroke-primary [filter:drop-shadow(0_0_6px_oklch(var(--glow)/calc(0.45*var(--glow-k))))] transition-[stroke-dashoffset] duration-700 ease-out"
41
- })]
42
- }), /* @__PURE__ */ t("div", {
43
- className: "absolute inset-0 grid place-items-center text-center",
44
- children: s
45
- })]
19
+ children: [
20
+ /* @__PURE__ */ r("svg", {
21
+ width: a,
22
+ height: a,
23
+ viewBox: `0 0 ${a} ${a}`,
24
+ className: "-rotate-90",
25
+ "aria-hidden": !0,
26
+ children: [/* @__PURE__ */ n("circle", {
27
+ cx: a / 2,
28
+ cy: a / 2,
29
+ r: u,
30
+ fill: "none",
31
+ strokeWidth: o,
32
+ className: "stroke-tint/[0.07]"
33
+ }), /* @__PURE__ */ n("circle", {
34
+ cx: a / 2,
35
+ cy: a / 2,
36
+ r: u,
37
+ fill: "none",
38
+ strokeWidth: o,
39
+ strokeLinecap: "round",
40
+ strokeDasharray: d,
41
+ strokeDashoffset: d * (1 - f),
42
+ className: "zen__progress-ring-arc stroke-primary [filter:drop-shadow(0_0_6px_oklch(var(--glow)/calc(0.45*var(--glow-k))))] transition-[stroke-dashoffset] duration-700 ease-out"
43
+ })]
44
+ }),
45
+ h > 0 && /* @__PURE__ */ n("span", {
46
+ "aria-hidden": !0,
47
+ className: "zen__ring-burst border-primary pointer-events-none absolute inset-0 rounded-full",
48
+ style: { borderWidth: o }
49
+ }, h),
50
+ /* @__PURE__ */ n("div", {
51
+ className: "absolute inset-0 grid place-items-center text-center",
52
+ children: c
53
+ })
54
+ ]
46
55
  });
47
56
  }
48
57
  //#endregion
49
- export { r as default };
58
+ export { i as default };
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Two thumbs on one track, for a span such as an amount from $50 to $500:
3
+ * two native range inputs (keyboard, forms and screen readers work as on
4
+ * Slider), the span between them filled. The thumbs can meet but not cross.
5
+ */
6
+ export default function RangeSlider({ value: [low, high], min, max, step, onValueChange, onValueCommit, label, thumbLabels, valueText, disabled, className, }: RangeSliderProps): import('react').JSX.Element;
7
+ export interface RangeSliderProps {
8
+ /** The span, low then high. */
9
+ value: readonly [number, number];
10
+ min?: number;
11
+ max?: number;
12
+ step?: number;
13
+ /** While dragging (every step). */
14
+ onValueChange?: (value: [number, number]) => void;
15
+ /** Once the user lets go: the moment to save or filter. */
16
+ onValueCommit?: (value: [number, number]) => void;
17
+ /** Accessible name of the pair, e.g. "Amount". */
18
+ label: string;
19
+ /** Each thumb's name (default "Minimum", "Maximum"). */
20
+ thumbLabels?: readonly [string, string];
21
+ /** Spoken value of a thumb, e.g. (v) => `$${v}`. */
22
+ valueText?: (value: number) => string;
23
+ disabled?: boolean;
24
+ className?: string;
25
+ }
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/range-slider/index.tsx"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAChC,KAAK,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAClB,GAAO,EACP,GAAS,EACT,IAAQ,EACR,aAAa,EACb,aAAa,EACb,KAAK,EACL,WAAoC,EACpC,SAAS,EACT,QAAQ,EACR,SAAS,GACZ,EAAE,gBAAgB,+BAiDlB;AAED,MAAM,WAAW,gBAAgB;IAC7B,+BAA+B;IAC/B,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;IAClD,2DAA2D;IAC3D,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;IAClD,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,WAAW,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,oDAAoD;IACpD,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB"}
@@ -0,0 +1,44 @@
1
+ "use client";
2
+ import { cx as e } from "../utils/cx.js";
3
+ import { THUMB as t } from "../slider/index.js";
4
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
5
+ //#region packages/range-slider/index.tsx
6
+ function i({ value: [i, a], min: o = 0, max: s = 100, step: c = 1, onValueChange: l, onValueCommit: u, label: d, thumbLabels: f = ["Minimum", "Maximum"], valueText: p, disabled: m, className: h }) {
7
+ let g = (e) => s > o ? (e - o) / (s - o) * 100 : 0, _ = [{
8
+ value: i,
9
+ set: (e) => [Math.min(e, a), a]
10
+ }, {
11
+ value: a,
12
+ set: (e) => [i, Math.max(e, i)]
13
+ }];
14
+ return /* @__PURE__ */ r("div", {
15
+ role: "group",
16
+ "aria-label": d,
17
+ className: e("zen__range-slider relative h-5 w-full", m && "opacity-50", h),
18
+ style: { "--zen-thumb": "oklch(var(--primary))" },
19
+ children: [/* @__PURE__ */ n("div", {
20
+ "aria-hidden": !0,
21
+ className: "absolute inset-x-0 top-1/2 h-2.5 -translate-y-1/2 rounded-full",
22
+ style: { background: `linear-gradient(to right, oklch(var(--muted)) ${g(i)}%, oklch(var(--primary)) ${g(i)}% ${g(a)}%, oklch(var(--muted)) ${g(a)}%)` }
23
+ }), _.map((r, d) => /* @__PURE__ */ n("input", {
24
+ type: "range",
25
+ min: o,
26
+ max: s,
27
+ step: c,
28
+ value: r.value,
29
+ disabled: m,
30
+ "aria-label": f[d],
31
+ "aria-valuetext": p?.(r.value),
32
+ onChange: (e) => {
33
+ let [t, n] = r.set(Number(e.target.value));
34
+ l?.([t, n]);
35
+ },
36
+ onPointerUp: () => u?.([i, a]),
37
+ onKeyUp: () => u?.([i, a]),
38
+ style: { zIndex: d === 0 && i > (o + s) / 2 ? 2 : 1 },
39
+ className: e("pointer-events-none absolute inset-0 h-5 w-full cursor-pointer appearance-none bg-transparent outline-hidden disabled:cursor-not-allowed", "[&::-webkit-slider-runnable-track]:h-2.5 [&::-moz-range-track]:h-2.5 [&::-moz-range-track]:bg-transparent", "[&::-webkit-slider-thumb]:pointer-events-auto [&::-moz-range-thumb]:pointer-events-auto", t)
40
+ }, d))]
41
+ });
42
+ }
43
+ //#endregion
44
+ export { i as default };
@@ -0,0 +1,22 @@
1
+ import { DateString } from '../utils/date';
2
+ import { Repeat } from '../utils/repeat';
3
+ /**
4
+ * How often something recurs, e.g. a bill: every n days, weeks, months or
5
+ * years, on chosen weekdays or a day of the month. Says what it means in
6
+ * words, and with a `start` date, the next few dates it falls on.
7
+ */
8
+ export default function RepeatPicker({ value, onChange, locale, start, weekStartsOn, label, className, }: RepeatPickerProps): import('react').JSX.Element;
9
+ export interface RepeatPickerProps {
10
+ value: Repeat;
11
+ onChange: (value: Repeat) => void;
12
+ /** For weekday and date names, and the week's first day. */
13
+ locale: string;
14
+ /** When it starts: its weekday and day of the month are the defaults, and the next dates are shown. */
15
+ start?: DateString;
16
+ /** 0 for Sunday … 6. Defaults to the locale's. */
17
+ weekStartsOn?: number;
18
+ /** The group's name for screen readers (default "Repeats"). */
19
+ label?: string;
20
+ className?: string;
21
+ }
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/repeat-picker/index.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,UAAU,EAAkD,MAAM,iBAAiB,CAAC;AAClG,OAAO,EAAmC,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAKjF;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EACjC,KAAK,EACL,QAAQ,EACR,MAAM,EACN,KAAK,EACL,YAAgC,EAChC,KAAiB,EACjB,SAAS,GACZ,EAAE,iBAAiB,+BA4FnB;AAED,MAAM,WAAW,iBAAiB;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,4DAA4D;IAC5D,MAAM,EAAE,MAAM,CAAC;IACf,uGAAuG;IACvG,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB"}