@rinzai/zen 0.14.0 → 0.15.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 (169) hide show
  1. package/CHANGELOG.md +138 -0
  2. package/README.md +16 -1
  3. package/dist/carousel/index.d.ts.map +1 -1
  4. package/dist/carousel/index.js +5 -5
  5. package/dist/docs/README.md +205 -0
  6. package/dist/docs/accordion.md +122 -0
  7. package/dist/docs/alert.md +69 -0
  8. package/dist/docs/animated-number.md +105 -0
  9. package/dist/docs/avatar.md +91 -0
  10. package/dist/docs/backdrop.md +94 -0
  11. package/dist/docs/badge.md +37 -0
  12. package/dist/docs/breadcrumbs.md +44 -0
  13. package/dist/docs/button-group.md +76 -0
  14. package/dist/docs/button.md +131 -0
  15. package/dist/docs/calendar-heatmap.md +73 -0
  16. package/dist/docs/calendar.md +101 -0
  17. package/dist/docs/canvas.md +584 -0
  18. package/dist/docs/card.md +180 -0
  19. package/dist/docs/carousel.md +162 -0
  20. package/dist/docs/chart.md +325 -0
  21. package/dist/docs/checkbox.md +88 -0
  22. package/dist/docs/chip.md +52 -0
  23. package/dist/docs/code-block.md +116 -0
  24. package/dist/docs/code-input.md +52 -0
  25. package/dist/docs/collapse.md +46 -0
  26. package/dist/docs/color-picker.md +145 -0
  27. package/dist/docs/combobox.md +208 -0
  28. package/dist/docs/command-palette.md +65 -0
  29. package/dist/docs/date-picker.md +167 -0
  30. package/dist/docs/dialog.md +271 -0
  31. package/dist/docs/disclosure.md +88 -0
  32. package/dist/docs/editable-cell.md +90 -0
  33. package/dist/docs/empty-state.md +46 -0
  34. package/dist/docs/field.md +82 -0
  35. package/dist/docs/file-drop.md +44 -0
  36. package/dist/docs/filter-bar.md +66 -0
  37. package/dist/docs/header.md +51 -0
  38. package/dist/docs/hover-card.md +110 -0
  39. package/dist/docs/icon-picker.md +65 -0
  40. package/dist/docs/input-group.md +89 -0
  41. package/dist/docs/input.md +33 -0
  42. package/dist/docs/inset.md +57 -0
  43. package/dist/docs/kbd.md +34 -0
  44. package/dist/docs/keypad.md +51 -0
  45. package/dist/docs/load-more.md +66 -0
  46. package/dist/docs/locale-provider.md +99 -0
  47. package/dist/docs/marquee.md +86 -0
  48. package/dist/docs/menu.md +403 -0
  49. package/dist/docs/meter.md +102 -0
  50. package/dist/docs/money-input.md +169 -0
  51. package/dist/docs/month-picker.md +80 -0
  52. package/dist/docs/navigation-menu.md +157 -0
  53. package/dist/docs/number-field.md +129 -0
  54. package/dist/docs/page-header.md +44 -0
  55. package/dist/docs/page-transition.md +93 -0
  56. package/dist/docs/pagination.md +42 -0
  57. package/dist/docs/pills.md +85 -0
  58. package/dist/docs/player-bar.md +158 -0
  59. package/dist/docs/popover.md +200 -0
  60. package/dist/docs/progress-ring.md +70 -0
  61. package/dist/docs/radio-cards.md +82 -0
  62. package/dist/docs/radio-group.md +86 -0
  63. package/dist/docs/range-slider.md +64 -0
  64. package/dist/docs/repeat-picker.md +44 -0
  65. package/dist/docs/resizable.md +107 -0
  66. package/dist/docs/seek-bar.md +68 -0
  67. package/dist/docs/segmented.md +89 -0
  68. package/dist/docs/select.md +148 -0
  69. package/dist/docs/separator.md +76 -0
  70. package/dist/docs/side-nav.md +75 -0
  71. package/dist/docs/skeleton.md +89 -0
  72. package/dist/docs/slider.md +87 -0
  73. package/dist/docs/sortable.md +182 -0
  74. package/dist/docs/sparkline.md +56 -0
  75. package/dist/docs/spinner.md +69 -0
  76. package/dist/docs/status-pill.md +81 -0
  77. package/dist/docs/stepper.md +59 -0
  78. package/dist/docs/tab-bar.md +78 -0
  79. package/dist/docs/table-of-contents.md +43 -0
  80. package/dist/docs/table.md +714 -0
  81. package/dist/docs/tabs.md +140 -0
  82. package/dist/docs/tag-input.md +45 -0
  83. package/dist/docs/textarea.md +25 -0
  84. package/dist/docs/theme-toggle.md +85 -0
  85. package/dist/docs/theming.md +193 -0
  86. package/dist/docs/time-field.md +71 -0
  87. package/dist/docs/timeline.md +50 -0
  88. package/dist/docs/toast.md +53 -0
  89. package/dist/docs/toggle-group.md +83 -0
  90. package/dist/docs/toggle.md +38 -0
  91. package/dist/docs/toolbar.md +97 -0
  92. package/dist/docs/tooltip.md +60 -0
  93. package/dist/docs/tree.md +295 -0
  94. package/dist/docs/trend.md +50 -0
  95. package/dist/icons/arrow-path.d.ts +3 -0
  96. package/dist/icons/arrow-path.d.ts.map +1 -0
  97. package/dist/icons/arrows-right-left.d.ts +3 -0
  98. package/dist/icons/arrows-right-left.d.ts.map +1 -0
  99. package/dist/icons/backward.d.ts +3 -0
  100. package/dist/icons/backward.d.ts.map +1 -0
  101. package/dist/icons/forward.d.ts +3 -0
  102. package/dist/icons/forward.d.ts.map +1 -0
  103. package/dist/icons/heart-solid.d.ts +3 -0
  104. package/dist/icons/heart-solid.d.ts.map +1 -0
  105. package/dist/icons/heart.d.ts +3 -0
  106. package/dist/icons/heart.d.ts.map +1 -0
  107. package/dist/icons/musical-note.d.ts +3 -0
  108. package/dist/icons/musical-note.d.ts.map +1 -0
  109. package/dist/icons/pause.d.ts +3 -0
  110. package/dist/icons/pause.d.ts.map +1 -0
  111. package/dist/icons/play.d.ts +3 -0
  112. package/dist/icons/play.d.ts.map +1 -0
  113. package/dist/icons/queue-list.d.ts +3 -0
  114. package/dist/icons/queue-list.d.ts.map +1 -0
  115. package/dist/icons/speaker-wave.d.ts +3 -0
  116. package/dist/icons/speaker-wave.d.ts.map +1 -0
  117. package/dist/icons/speaker-x-mark.d.ts +3 -0
  118. package/dist/icons/speaker-x-mark.d.ts.map +1 -0
  119. package/dist/index.d.ts +7 -1
  120. package/dist/index.d.ts.map +1 -1
  121. package/dist/lib.js +80 -74
  122. package/dist/marquee/index.d.ts +15 -0
  123. package/dist/marquee/index.d.ts.map +1 -0
  124. package/dist/marquee/index.js +90 -0
  125. package/dist/menu/index.d.ts.map +1 -1
  126. package/dist/menu/index.js +7 -6
  127. package/dist/player-bar/index.d.ts +11 -0
  128. package/dist/player-bar/index.d.ts.map +1 -0
  129. package/dist/player-bar/index.js +17 -0
  130. package/dist/radio-cards/index.d.ts +2 -1
  131. package/dist/radio-cards/index.d.ts.map +1 -1
  132. package/dist/radio-cards/index.js +3 -3
  133. package/dist/seek-bar/index.d.ts +24 -0
  134. package/dist/seek-bar/index.d.ts.map +1 -0
  135. package/dist/seek-bar/index.js +120 -0
  136. package/dist/segmented/index.d.ts +3 -2
  137. package/dist/segmented/index.d.ts.map +1 -1
  138. package/dist/segmented/index.js +19 -18
  139. package/dist/slider/index.d.ts +2 -1
  140. package/dist/slider/index.d.ts.map +1 -1
  141. package/dist/tab-bar/index.d.ts +4 -2
  142. package/dist/tab-bar/index.d.ts.map +1 -1
  143. package/dist/tab-bar/index.js +24 -19
  144. package/dist/textarea/index.d.ts +6 -2
  145. package/dist/textarea/index.d.ts.map +1 -1
  146. package/dist/textarea/index.js +2 -1
  147. package/dist/theme.css +40 -0
  148. package/dist/utils/duration.d.ts +3 -0
  149. package/dist/utils/duration.d.ts.map +1 -0
  150. package/dist/utils/duration.js +7 -0
  151. package/dist/utils/messages.d.ts +2 -0
  152. package/dist/utils/messages.d.ts.map +1 -1
  153. package/dist/utils/messages.js +3 -1
  154. package/dist/utils/slot.d.ts +5 -2
  155. package/dist/utils/slot.d.ts.map +1 -1
  156. package/dist/utils/slot.js +16 -11
  157. package/dist/utils/useAnchoredPopup.d.ts.map +1 -1
  158. package/dist/utils/useAnchoredPopup.js +3 -2
  159. package/dist/utils/useHeightVar.d.ts +7 -0
  160. package/dist/utils/useHeightVar.d.ts.map +1 -0
  161. package/dist/utils/useHeightVar.js +17 -0
  162. package/dist/utils/useMediaPlayer.d.ts +38 -0
  163. package/dist/utils/useMediaPlayer.d.ts.map +1 -0
  164. package/dist/utils/useMediaPlayer.js +91 -0
  165. package/dist/utils/useMediaSession.d.ts +24 -0
  166. package/dist/utils/useMediaSession.d.ts.map +1 -0
  167. package/dist/utils/useMediaSession.js +76 -0
  168. package/dist/zen.css +1 -1
  169. package/package.json +4 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/seek-bar/index.tsx"],"names":[],"mappings":"AACA,OAAe,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAQlD;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,EAC5B,WAAW,EACX,QAAQ,EACR,QAAY,EACZ,OAAe,EACf,YAAgB,EAChB,MAAM,EACN,SAAS,EACT,QAAQ,EACR,SAAS,EACT,GAAG,IAAI,EACV,EAAE,YAAY,+BA6Gd;AAED,MAAM,WAAW,YAAa,SAAQ,IAAI,CACtC,WAAW,EACX,OAAO,GAAG,cAAc,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,eAAe,GAAG,eAAe,GAAG,iBAAiB,CAC5G;IACG,sBAAsB;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yGAAyG;IACzG,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4EAA4E;IAC5E,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC"}
@@ -0,0 +1,120 @@
1
+ "use client";
2
+ import { cx as e } from "../utils/cx.js";
3
+ import { useMessages as t } from "../locale-provider/index.js";
4
+ import n from "../slider/index.js";
5
+ import { formatDuration as r } from "../utils/duration.js";
6
+ import { useLayoutEffect as i, useRef as a, useState as o } from "react";
7
+ import { jsx as s, jsxs as c } from "react/jsx-runtime";
8
+ //#region packages/seek-bar/index.tsx
9
+ var l = 5;
10
+ function u({ currentTime: u, duration: d, buffered: f = 0, playing: p = !1, playbackRate: m = 1, onSeek: h, onKeyDown: g, disabled: _, className: v, ...y }) {
11
+ let b = t(), [x, S] = o(null), [C, w] = o(null), T = C && C.from === u ? C.at : null, E = Math.max(0, Math.min(x ?? T ?? u, d)), D = a(null), O = a(null), k = p && x === null && T === null && d > 0 && E < d, A = a(null);
12
+ i(() => {
13
+ let e = [D.current, O.current].filter((e) => e !== null);
14
+ if (!e.length) return;
15
+ let t = A.current;
16
+ if (k && t && t.rate === m && t.duration === d) {
17
+ let e = Number(t.animations[0].currentTime ?? 0) / 1e3;
18
+ if (Math.abs(t.from + e * m - E) < .15) return;
19
+ }
20
+ t?.animations.forEach((e) => e.cancel()), A.current = null;
21
+ let n = getComputedStyle(e[0]).direction === "rtl" ? -1 : 1, r = (e) => `${d > 0 ? n * e * 100 / d : 0}cqw`;
22
+ for (let t of e) t.style.translate = r(E);
23
+ if (!k) return;
24
+ let i = e.map((e) => e.animate([{ translate: r(E) }, { translate: r(d) }], {
25
+ duration: (d - E) / m * 1e3,
26
+ easing: "linear",
27
+ fill: "forwards"
28
+ }));
29
+ A.current = {
30
+ animations: i,
31
+ from: E,
32
+ rate: m,
33
+ duration: d
34
+ };
35
+ }, [
36
+ E,
37
+ d,
38
+ k,
39
+ m
40
+ ]), i(() => () => A.current?.animations.forEach((e) => e.cancel()), []);
41
+ let j = (e) => {
42
+ if (g?.(e), e.defaultPrevented) return;
43
+ let t = getComputedStyle(e.currentTarget).direction === "rtl", n = {
44
+ ArrowUp: 1,
45
+ ArrowDown: -1,
46
+ ArrowRight: t ? -1 : 1,
47
+ ArrowLeft: t ? 1 : -1
48
+ }[e.key];
49
+ if (!n) return;
50
+ e.preventDefault();
51
+ let r = Math.max(0, Math.min(E + n * l, d));
52
+ w({
53
+ at: r,
54
+ from: u
55
+ }), h(r);
56
+ }, M = _ || d <= 0, N = d > 0 ? Math.min(f, d) / d * 100 : 0, P = { width: `${r(d).length}ch` };
57
+ return /* @__PURE__ */ c("div", {
58
+ className: e("zen__seek-bar flex items-center gap-3", v),
59
+ children: [
60
+ /* @__PURE__ */ s("span", {
61
+ className: "text-muted-foreground shrink-0 text-end text-xs tabular-nums",
62
+ style: P,
63
+ children: r(E)
64
+ }),
65
+ /* @__PURE__ */ c("div", {
66
+ className: e("group relative h-5 min-w-0 flex-1", M && "opacity-50"),
67
+ children: [
68
+ /* @__PURE__ */ s(n, {
69
+ "aria-label": b.seek,
70
+ min: 0,
71
+ max: d || 1,
72
+ step: "any",
73
+ value: E,
74
+ disabled: M,
75
+ valueText: () => b.timeOf(r(E), r(d)),
76
+ className: "absolute inset-0 z-10 h-full opacity-0",
77
+ onKeyDown: j,
78
+ onValueChange: S,
79
+ onValueCommit: (e) => {
80
+ S(null), w({
81
+ at: e,
82
+ from: u
83
+ }), h(e);
84
+ },
85
+ ...y
86
+ }),
87
+ /* @__PURE__ */ c("div", {
88
+ "aria-hidden": !0,
89
+ className: "absolute inset-x-0 top-1/2 h-2.5 -translate-y-1/2 overflow-hidden rounded-full bg-[oklch(var(--muted))]",
90
+ children: [/* @__PURE__ */ s("div", {
91
+ className: "absolute inset-y-0 start-0 bg-[oklch(var(--tint)/0.22)] transition-[width] duration-300",
92
+ style: { width: `${N}%` }
93
+ }), /* @__PURE__ */ s("div", {
94
+ className: "[container-type:inline-size] absolute inset-x-2.5 inset-y-0",
95
+ children: /* @__PURE__ */ s("div", {
96
+ ref: D,
97
+ className: "bg-primary absolute inset-y-0 end-full w-[calc(100%+0.625rem)]"
98
+ })
99
+ })]
100
+ }),
101
+ /* @__PURE__ */ s("div", {
102
+ "aria-hidden": !0,
103
+ className: "[container-type:inline-size] pointer-events-none absolute inset-x-2.5 inset-y-0",
104
+ children: /* @__PURE__ */ s("div", {
105
+ ref: O,
106
+ className: "bg-primary group-has-[input:focus-visible]:ring-ring/40 absolute start-0 top-1/2 -ms-2.5 -mt-2.5 size-5 rounded-full border-2 border-white shadow-[0_0_0_1px_oklch(0_0_0/0.3),0_0_16px_oklch(var(--glow)/calc(0.8*var(--glow-k)))] group-has-[input:focus-visible]:ring-4"
107
+ })
108
+ })
109
+ ]
110
+ }),
111
+ /* @__PURE__ */ s("span", {
112
+ className: "text-muted-foreground shrink-0 text-xs tabular-nums",
113
+ style: P,
114
+ children: r(d)
115
+ })
116
+ ]
117
+ });
118
+ }
119
+ //#endregion
120
+ export { u as default };
@@ -5,11 +5,12 @@ import { ComponentProps, ReactNode } from 'react';
5
5
  * selection slides between options, like Pills. Fill it with
6
6
  * SegmentedItem (any content: text, icons, a disabled option).
7
7
  */
8
- export default function Segmented<V extends string>({ label, value: valueProp, defaultValue, onValueChange, name, className, children, ...rest }: SegmentedProps<V>): import('react').JSX.Element;
8
+ export default function Segmented<V extends string>({ label, value: valueProp, defaultValue, onValueChange, name, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, className, children, ...rest }: SegmentedProps<V>): import('react').JSX.Element;
9
9
  /** One option of a Segmented: a native radio covering whatever you put inside. */
10
10
  export declare function SegmentedItem({ value, disabled, className, children }: SegmentedItemProps): import('react').JSX.Element;
11
11
  export interface SegmentedProps<V extends string> extends Omit<ComponentProps<'div'>, 'defaultValue' | 'children'> {
12
- label: string;
12
+ /** Shown above the options, naming the group. Without it, give the group an aria-label or aria-labelledby. */
13
+ label?: ReactNode;
13
14
  /** The chosen option, when you keep it. */
14
15
  value?: V;
15
16
  /** The first chosen option, when the control keeps its own. */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/segmented/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAiB,SAAS,EAA6B,MAAM,OAAO,CAAC;AAY5F;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,EAChD,KAAK,EACL,KAAK,EAAE,SAAS,EAChB,YAAY,EACZ,aAAa,EACb,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,GAAG,IAAI,EACV,EAAE,cAAc,CAAC,CAAC,CAAC,+BAwCnB;AAED,kFAAkF;AAClF,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,kBAAkB,+BA4BzF;AAED,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,MAAM,CAAE,SAAQ,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,cAAc,GAAG,UAAU,CAAC;IAC9G,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,KAAK,CAAC,EAAE,CAAC,CAAC;IACV,+DAA+D;IAC/D,YAAY,CAAC,EAAE,CAAC,CAAC;IACjB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IACnC,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,QAAQ,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,QAAQ,EAAE,SAAS,CAAC;CACvB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/segmented/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAiB,SAAS,EAA6B,MAAM,OAAO,CAAC;AAY5F;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,EAChD,KAAK,EACL,KAAK,EAAE,SAAS,EAChB,YAAY,EACZ,aAAa,EACb,IAAI,EACJ,YAAY,EAAE,SAAS,EACvB,iBAAiB,EAAE,cAAc,EACjC,SAAS,EACT,QAAQ,EACR,GAAG,IAAI,EACV,EAAE,cAAc,CAAC,CAAC,CAAC,+BA2CnB;AAED,kFAAkF;AAClF,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,kBAAkB,+BA4BzF;AAED,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,MAAM,CAAE,SAAQ,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,cAAc,GAAG,UAAU,CAAC;IAC9G,8GAA8G;IAC9G,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,2CAA2C;IAC3C,KAAK,CAAC,EAAE,CAAC,CAAC;IACV,+DAA+D;IAC/D,YAAY,CAAC,EAAE,CAAC,CAAC;IACjB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IACnC,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,QAAQ,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,QAAQ,EAAE,SAAS,CAAC;CACvB"}
@@ -6,36 +6,37 @@ import { createContext as r, useContext as i, useId as a, useRef as o } from "re
6
6
  import { jsx as s, jsxs as c } from "react/jsx-runtime";
7
7
  //#region packages/segmented/index.tsx
8
8
  var l = r(null);
9
- function u({ label: r, value: i, defaultValue: u, onValueChange: d, name: f, className: p, children: m, ...h }) {
10
- let [g, _] = t(i, u, d), v = a(), y = o(null), b = n(y, "label:has(input:checked)", [g, m]);
9
+ function u({ label: r, value: i, defaultValue: u, onValueChange: d, name: f, "aria-label": p, "aria-labelledby": m, className: h, children: g, ..._ }) {
10
+ let [v, y] = t(i, u, d), b = a(), x = o(null), S = n(x, "label:has(input:checked)", [v, g]);
11
11
  return /* @__PURE__ */ c("div", {
12
- className: e("zen__segmented flex flex-col gap-2", p),
13
- ...h,
14
- children: [/* @__PURE__ */ s("span", {
15
- id: v,
12
+ className: e("zen__segmented flex flex-col gap-2", h),
13
+ ..._,
14
+ children: [r && /* @__PURE__ */ s("span", {
15
+ id: b,
16
16
  className: "text-sm font-medium",
17
17
  children: r
18
18
  }), /* @__PURE__ */ c("div", {
19
- ref: y,
19
+ ref: x,
20
20
  role: "radiogroup",
21
- "aria-labelledby": v,
21
+ "aria-label": p,
22
+ "aria-labelledby": r ? b : m,
22
23
  className: "glow-edge border-tint/10 bg-tint/[0.03] relative inline-flex w-fit flex-wrap gap-1 rounded-xl border p-1",
23
- children: [b && /* @__PURE__ */ s("span", {
24
+ children: [S && /* @__PURE__ */ s("span", {
24
25
  "aria-hidden": !0,
25
26
  className: "zen__segmented-indicator bg-primary/15 ease-out-soft absolute top-0 left-0 rounded-lg shadow-[inset_0_0_0_1px_oklch(var(--primary)/0.4)] transition-[translate,width,height] duration-500",
26
27
  style: {
27
- translate: `${b.x}px ${b.y}px`,
28
- width: b.w,
29
- height: b.h
28
+ translate: `${S.x}px ${S.y}px`,
29
+ width: S.w,
30
+ height: S.h
30
31
  }
31
32
  }), /* @__PURE__ */ s(l.Provider, {
32
33
  value: {
33
- name: f ?? v,
34
- value: g,
35
- select: _,
36
- measured: b !== null
34
+ name: f ?? b,
35
+ value: v,
36
+ select: y,
37
+ measured: S !== null
37
38
  },
38
- children: m
39
+ children: g
39
40
  })]
40
41
  })]
41
42
  });
@@ -44,7 +45,7 @@ function d({ value: t, disabled: n, className: r, children: a }) {
44
45
  let o = i(l);
45
46
  if (!o) throw Error("SegmentedItem must be inside a Segmented");
46
47
  return /* @__PURE__ */ c("label", {
47
- className: e("text-muted-foreground relative cursor-pointer rounded-lg px-3 py-1.5 text-sm transition-colors duration-300", "hover:text-foreground has-checked:text-foreground has- has-focus-ring", "has-disabled:hover:text-muted-foreground has-disabled:cursor-not-allowed has-disabled:opacity-50", !o.measured && "has-checked:bg-primary/15 has-checked:shadow-[inset_0_0_0_1px_oklch(var(--primary)/0.4)]", r),
48
+ className: e("text-muted-foreground relative inline-flex cursor-pointer items-center gap-1.5 rounded-lg px-3 py-1.5 text-sm transition-colors duration-300", "hover:text-foreground has-checked:text-foreground has-focus-ring", "has-disabled:hover:text-muted-foreground has-disabled:cursor-not-allowed has-disabled:opacity-50", !o.measured && "has-checked:bg-primary/15 has-checked:shadow-[inset_0_0_0_1px_oklch(var(--primary)/0.4)]", r),
48
49
  children: [/* @__PURE__ */ s("input", {
49
50
  type: "radio",
50
51
  className: "absolute inset-0 z-10 m-0 size-full cursor-pointer appearance-none rounded-[inherit] opacity-0 disabled:cursor-not-allowed",
@@ -15,7 +15,8 @@ export interface SliderProps extends Omit<ComponentProps<'input'>, 'type' | 'val
15
15
  defaultValue?: number;
16
16
  min?: number;
17
17
  max?: number;
18
- step?: number;
18
+ /** `'any'` for no snapping; the arrow keys then move by the browser's own amount. */
19
+ step?: number | 'any';
19
20
  /** While dragging (every step). */
20
21
  onValueChange?: (value: number) => void;
21
22
  /** Once the user lets go: the moment to save. */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/slider/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAoC,MAAM,OAAO,CAAC;AAEzE;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAC3B,KAAK,EAAE,SAAS,EAChB,YAAY,EACZ,GAAO,EACP,GAAS,EACT,IAAQ,EACR,aAAa,EACb,aAAa,EACb,eAAe,EACf,UAAU,EACV,SAAS,EACT,SAAS,EACT,KAAK,EACL,QAAQ,EACR,GAAG,IAAI,EACV,EAAE,WAAW,+BAmDb;AAED,0EAA0E;AAC1E,eAAO,MAAM,KAAK,QAI+E,CAAC;AAElG,MAAM,WAAW,WAAY,SAAQ,IAAI,CACrC,cAAc,CAAC,OAAO,CAAC,EACvB,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,cAAc,CAC7D;IACG,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,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,MAAM,KAAK,IAAI,CAAC;IACxC,iDAAiD;IACjD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,6DAA6D;IAC7D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACzC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/slider/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAoC,MAAM,OAAO,CAAC;AAEzE;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAC3B,KAAK,EAAE,SAAS,EAChB,YAAY,EACZ,GAAO,EACP,GAAS,EACT,IAAQ,EACR,aAAa,EACb,aAAa,EACb,eAAe,EACf,UAAU,EACV,SAAS,EACT,SAAS,EACT,KAAK,EACL,QAAQ,EACR,GAAG,IAAI,EACV,EAAE,WAAW,+BAmDb;AAED,0EAA0E;AAC1E,eAAO,MAAM,KAAK,QAI+E,CAAC;AAElG,MAAM,WAAW,WAAY,SAAQ,IAAI,CACrC,cAAc,CAAC,OAAO,CAAC,EACvB,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,cAAc,CAC7D;IACG,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qFAAqF;IACrF,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACtB,mCAAmC;IACnC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,iDAAiD;IACjD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,6DAA6D;IAC7D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACzC"}
@@ -2,11 +2,13 @@ import { ComponentProps, ReactNode } from 'react';
2
2
  /**
3
3
  * Phone navigation: a glass bar fixed to the bottom, clear of the home
4
4
  * indicator, hidden from `hideFrom` up (default md). Fill it with TabBarItems.
5
+ * Its height is kept in `--zen-tab-bar-height` on its parent (0px while
6
+ * hidden): a PlayerBar beside it sits on it, and the page can pad its end by it.
5
7
  * Inside a rounded frame, round the bar to match (className, e.g.
6
8
  * rounded-b-[15px]): with GPU compositing, Chrome doesn't clip a blurred
7
9
  * backdrop to an ancestor's rounded corners, only to the element's own.
8
10
  */
9
- export default function TabBar({ hideFrom, className, children, ...rest }: TabBarProps): import('react').JSX.Element;
11
+ export default function TabBar({ hideFrom, className, children, ref, ...rest }: TabBarProps): import('react').JSX.Element;
10
12
  /**
11
13
  * One destination: an icon over a label. `active` marks the current page; with
12
14
  * `asChild`, the styles go onto your own link (e.g. a router's NavLink, which
@@ -20,7 +22,7 @@ export interface TabBarProps extends ComponentProps<'nav'> {
20
22
  export interface TabBarItemProps extends ComponentProps<'a'> {
21
23
  icon?: ReactNode;
22
24
  active?: boolean;
23
- /** Style the single child element (a router link holding the icon and label) instead of rendering an <a>. */
25
+ /** Style the single child element (a router link holding the label) instead of rendering an <a>; `icon` goes inside it. */
24
26
  asChild?: boolean;
25
27
  }
26
28
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/tab-bar/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAY,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE5D;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,QAAe,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,WAAW,+BAiB5F;AAOD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,eAAe,+BAYlG;AAED,MAAM,WAAW,WAAY,SAAQ,cAAc,CAAC,KAAK,CAAC;IACtD,iEAAiE;IACjE,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;CACzC;AAED,MAAM,WAAW,eAAgB,SAAQ,cAAc,CAAC,GAAG,CAAC;IACxD,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,6GAA6G;IAC7G,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/tab-bar/index.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAY,cAAc,EAAE,SAAS,EAAU,MAAM,OAAO,CAAC;AAEpE;;;;;;;;GAQG;AACH,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,QAAe,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,EAAE,WAAW,+BAoBjG;AAOD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,eAAe,+BAgBlG;AAED,MAAM,WAAW,WAAY,SAAQ,cAAc,CAAC,KAAK,CAAC;IACtD,iEAAiE;IACjE,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;CACzC;AAED,MAAM,WAAW,eAAgB,SAAQ,cAAc,CAAC,GAAG,CAAC;IACxD,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,2HAA2H;IAC3H,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB"}
@@ -1,34 +1,39 @@
1
1
  "use client";
2
2
  import { cx as e } from "../utils/cx.js";
3
- import { Slot as t } from "../utils/slot.js";
4
- import { Children as n } from "react";
5
- import { jsx as r, jsxs as i } from "react/jsx-runtime";
3
+ import { useMergedRefs as t } from "../utils/refs.js";
4
+ import { Slot as n } from "../utils/slot.js";
5
+ import { useHeightVar as r } from "../utils/useHeightVar.js";
6
+ import { Children as i, useRef as a } from "react";
7
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
6
8
  //#region packages/tab-bar/index.tsx
7
- function a({ hideFrom: t = "md", className: i, children: a, ...o }) {
8
- return /* @__PURE__ */ r("nav", {
9
- className: e("zen__tab-bar glass glass-blur glow-edge fixed inset-x-0 bottom-0 z-40 rounded-none border-x-0! border-b-0! pb-[env(safe-area-inset-bottom)]", t === "sm" && "sm:hidden", t === "md" && "md:hidden", t === "lg" && "lg:hidden", i),
10
- ...o,
11
- children: /* @__PURE__ */ r("div", {
9
+ function c({ hideFrom: n = "md", className: s, children: c, ref: l, ...u }) {
10
+ let d = a(null);
11
+ return r(d, "--zen-tab-bar-height"), /* @__PURE__ */ o("nav", {
12
+ ref: t(d, l),
13
+ className: e("zen__tab-bar glass glass-blur glow-edge fixed inset-x-0 bottom-0 z-40 rounded-none border-x-0! border-b-0! pb-[env(safe-area-inset-bottom)]", n === "sm" && "sm:hidden", n === "md" && "md:hidden", n === "lg" && "lg:hidden", s),
14
+ ...u,
15
+ children: /* @__PURE__ */ o("div", {
12
16
  className: "grid",
13
- style: { gridTemplateColumns: `repeat(${n.count(a)}, 1fr)` },
14
- children: a
17
+ style: { gridTemplateColumns: `repeat(${i.count(c)}, 1fr)` },
18
+ children: c
15
19
  })
16
20
  });
17
21
  }
18
- var o = e("flex flex-col items-center gap-1 py-2.5 text-2xs outline-hidden transition-colors duration-200 focus-ring focus-visible:ring-inset", "text-muted-foreground aria-[current=page]:text-primary [&_svg]:size-5 aria-[current=page]:[&_svg]:drop-shadow-[0_0_8px_oklch(var(--glow)/calc(0.8*var(--glow-k)))]");
19
- function s({ icon: n, active: a, asChild: s, className: c, children: l, ...u }) {
22
+ var l = e("flex flex-col items-center gap-1 py-2.5 text-2xs outline-hidden transition-colors duration-200 focus-ring focus-visible:ring-inset", "text-muted-foreground aria-[current=page]:text-primary [&_svg]:size-5 aria-[current=page]:[&_svg]:drop-shadow-[0_0_8px_oklch(var(--glow)/calc(0.8*var(--glow-k)))]");
23
+ function u({ icon: t, active: r, asChild: i, className: a, children: c, ...u }) {
20
24
  let d = {
21
25
  ...u,
22
- "aria-current": a ? "page" : void 0,
23
- className: e(o, c)
26
+ "aria-current": r ? "page" : void 0,
27
+ className: e(l, a)
24
28
  };
25
- return s ? (a || delete d["aria-current"], /* @__PURE__ */ r(t, {
29
+ return i ? (r || delete d["aria-current"], /* @__PURE__ */ o(n, {
26
30
  ...d,
27
- children: l
28
- })) : /* @__PURE__ */ i("a", {
31
+ before: t,
32
+ children: c
33
+ })) : /* @__PURE__ */ s("a", {
29
34
  ...d,
30
- children: [n, l]
35
+ children: [t, c]
31
36
  });
32
37
  }
33
38
  //#endregion
34
- export { s as TabBarItem, a as default };
39
+ export { u as TabBarItem, c as default };
@@ -1,4 +1,8 @@
1
1
  import { ComponentProps } from 'react';
2
- export default function Textarea(props: TextAreaProps): import('react').JSX.Element;
3
- export type TextAreaProps = ComponentProps<'textarea'>;
2
+ export default function Textarea(props: TextareaProps): import('react').JSX.Element;
3
+ export type TextareaProps = ComponentProps<'textarea'>;
4
+ /** @deprecated Renamed Textarea, like the element. */
5
+ export declare const TextArea: typeof Textarea;
6
+ /** @deprecated Renamed TextareaProps. */
7
+ export type TextAreaProps = TextareaProps;
4
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/textarea/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,KAAK,EAAE,aAAa,+BAiBpD;AAED,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../packages/textarea/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,KAAK,EAAE,aAAa,+BAiBpD;AAED,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;AAEvD,sDAAsD;AACtD,eAAO,MAAM,QAAQ,iBAAW,CAAC;AACjC,yCAAyC;AACzC,MAAM,MAAM,aAAa,GAAG,aAAa,CAAC"}
@@ -12,5 +12,6 @@ function i(i) {
12
12
  ...s
13
13
  });
14
14
  }
15
+ var a = i;
15
16
  //#endregion
16
- export { i as default };
17
+ export { a as TextArea, i as default };
package/dist/theme.css CHANGED
@@ -1592,3 +1592,43 @@ html.reduce-motion .rise-list > * {
1592
1592
  animation-iteration-count: 1 !important;
1593
1593
  transition-duration: 0.01ms !important;
1594
1594
  }
1595
+
1596
+ /*
1597
+ * Marquee: an ellipsis at rest. While it scrolls (data-moving, set with its
1598
+ * animation) the text is one box to slide, cut off by fades at both edges; the
1599
+ * start's fade grows in as the text leaves it.
1600
+ */
1601
+ @property --zen-marquee-fade-start {
1602
+ syntax: '<length>';
1603
+ inherits: false;
1604
+ initial-value: 0px;
1605
+ }
1606
+ .zen__marquee {
1607
+ display: block;
1608
+ min-width: 0;
1609
+ overflow: hidden;
1610
+ white-space: nowrap;
1611
+ text-overflow: ellipsis;
1612
+ }
1613
+ .zen__marquee[data-moving] {
1614
+ text-overflow: clip;
1615
+ mask-image: linear-gradient(
1616
+ to right,
1617
+ transparent,
1618
+ #000 var(--zen-marquee-fade-start),
1619
+ #000 calc(100% - 1rem),
1620
+ transparent
1621
+ );
1622
+ }
1623
+ .zen__marquee[data-moving]:dir(rtl) {
1624
+ mask-image: linear-gradient(
1625
+ to left,
1626
+ transparent,
1627
+ #000 var(--zen-marquee-fade-start),
1628
+ #000 calc(100% - 1rem),
1629
+ transparent
1630
+ );
1631
+ }
1632
+ .zen__marquee[data-moving] > .zen__marquee-content {
1633
+ display: inline-block;
1634
+ }
@@ -0,0 +1,3 @@
1
+ /** Seconds as a clock reads them: 3:07, or 1:02:07 from an hour up. */
2
+ export declare function formatDuration(seconds: number): string;
3
+ //# sourceMappingURL=duration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duration.d.ts","sourceRoot":"","sources":["../../packages/utils/duration.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,UAM7C"}
@@ -0,0 +1,7 @@
1
+ //#region packages/utils/duration.ts
2
+ function e(e) {
3
+ let t = Math.floor(Math.max(e, 0)), n = Math.floor(t / 3600), r = Math.floor(t % 3600 / 60), i = String(t % 60).padStart(2, "0");
4
+ return n ? `${n}:${String(r).padStart(2, "0")}:${i}` : `${r}:${i}`;
5
+ }
6
+ //#endregion
7
+ export { e as formatDuration };
@@ -132,6 +132,8 @@ export declare const ENGLISH: {
132
132
  nextSlide: string;
133
133
  resize: string;
134
134
  notifications: string;
135
+ seek: string;
136
+ timeOf: (time: string, total: string) => string;
135
137
  };
136
138
  export type Messages = typeof ENGLISH;
137
139
  //# sourceMappingURL=messages.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../packages/utils/messages.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,OAAO;;;;;;mBAOD,MAAM;;;;;;;;;;;;;;gBAgBT,MAAM;;;;;;;;;;;;;gCAeU,MAAM;uBACf,MAAM;;;4CAKe,MAAM,cAAc,MAAM;;wBAG9C,MAAM;;4BAEF,MAAM;;;;;;;;;;;;;;;;;;+BAsBH,MAAM;;2BAEV,MAAM,SAAS,MAAM;;;;;;6BAMnB,MAAM;4BACP,MAAM,QAAQ,MAAM;uBACzB,MAAM,UAAU,MAAM;;;;;;aAQhC,MAAM;;;uBAGI,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,SAAS,MAAM;yBAC9C,MAAM,QAAQ,MAAM;qBACxB,MAAM,QAAQ,MAAM;mBACtB,MAAM;;oBAIL,MAAM;qBACL,MAAM,SAAS,MAAM;oBAEtB,MAAM,SAAS,MAAM;oBACrB,MAAM,SAAS,MAAM;oBACrB,MAAM,UAAU,MAAM;sBACpB,MAAM,SAAS,MAAM;wBACnB,MAAM,SAAS,MAAM,SAAS,MAAM;oBAGxC,MAAM,SAAS,MAAM,UAAU,MAAM;kBACvC,MAAM,KAAK,MAAM,KAAK,MAAM;sBACxB,MAAM;;;;2BAOD,MAAM;;;;uBAMV,MAAM;oBACT,MAAM,QAAQ,MAAM;;;;;;;;;;;;;;qBAgBnB,MAAM;;cAEb,MAAM;;;;;;iBAMH,MAAM,SAAS,MAAM;mBACnB,MAAM;;;;;CAKxB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,OAAO,OAAO,CAAC"}
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../packages/utils/messages.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,OAAO;;;;;;mBAOD,MAAM;;;;;;;;;;;;;;gBAgBT,MAAM;;;;;;;;;;;;;gCAeU,MAAM;uBACf,MAAM;;;4CAKe,MAAM,cAAc,MAAM;;wBAG9C,MAAM;;4BAEF,MAAM;;;;;;;;;;;;;;;;;;+BAsBH,MAAM;;2BAEV,MAAM,SAAS,MAAM;;;;;;6BAMnB,MAAM;4BACP,MAAM,QAAQ,MAAM;uBACzB,MAAM,UAAU,MAAM;;;;;;aAQhC,MAAM;;;uBAGI,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,SAAS,MAAM;yBAC9C,MAAM,QAAQ,MAAM;qBACxB,MAAM,QAAQ,MAAM;mBACtB,MAAM;;oBAIL,MAAM;qBACL,MAAM,SAAS,MAAM;oBAEtB,MAAM,SAAS,MAAM;oBACrB,MAAM,SAAS,MAAM;oBACrB,MAAM,UAAU,MAAM;sBACpB,MAAM,SAAS,MAAM;wBACnB,MAAM,SAAS,MAAM,SAAS,MAAM;oBAGxC,MAAM,SAAS,MAAM,UAAU,MAAM;kBACvC,MAAM,KAAK,MAAM,KAAK,MAAM;sBACxB,MAAM;;;;2BAOD,MAAM;;;;uBAMV,MAAM;oBACT,MAAM,QAAQ,MAAM;;;;;;;;;;;;;;qBAgBnB,MAAM;;cAEb,MAAM;;;;;;iBAMH,MAAM,SAAS,MAAM;mBACnB,MAAM;;;;;;mBAQN,MAAM,SAAS,MAAM;CACvC,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,OAAO,OAAO,CAAC"}
@@ -127,7 +127,9 @@ var e = {
127
127
  previousSlide: "Previous slide",
128
128
  nextSlide: "Next slide",
129
129
  resize: "Resize",
130
- notifications: "Notifications (F8)"
130
+ notifications: "Notifications (F8)",
131
+ seek: "Seek",
132
+ timeOf: (e, t) => `${e} of ${t}`
131
133
  };
132
134
  //#endregion
133
135
  export { e as ENGLISH };
@@ -5,9 +5,12 @@ type Props = Record<string, unknown>;
5
5
  * props: a component's styles and attributes go onto the caller's own element,
6
6
  * such as a router's Link. Classes are combined, styles merged (the child's
7
7
  * win), event handlers both run (the child's first), and refs both receive the
8
- * element; other props from the component win.
8
+ * element; other props from the component win. `before` goes ahead of the
9
+ * child's own content (e.g. a component's icon), also when that content is a
10
+ * render function such as a router NavLink's.
9
11
  */
10
- export declare function Slot({ children, ...props }: ComponentProps<'a'> & {
12
+ export declare function Slot({ before, children, ...props }: ComponentProps<'a'> & {
13
+ before?: ReactNode;
11
14
  children?: ReactNode;
12
15
  }): ReactElement<Props, string | import('react').JSXElementConstructor<any>> | null;
13
16
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"slot.d.ts","sourceRoot":"","sources":["../../packages/utils/slot.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgB,cAAc,EAAkB,YAAY,EAAE,SAAS,EAAO,MAAM,OAAO,CAAC;AAKnG,KAAK,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAErC;;;;;;GAMG;AACH,wBAAgB,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,GAAG,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,mFAoB1F"}
1
+ {"version":3,"file":"slot.d.ts","sourceRoot":"","sources":["../../packages/utils/slot.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgB,cAAc,EAAkB,YAAY,EAAE,SAAS,EAAO,MAAM,OAAO,CAAC;AAKnG,KAAK,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAErC;;;;;;;;GAQG;AACH,wBAAgB,IAAI,CAAC,EACjB,MAAM,EACN,QAAQ,EACR,GAAG,KAAK,EACX,EAAE,cAAc,CAAC,GAAG,CAAC,GAAG;IAAE,MAAM,CAAC,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,mFAqCpE"}
@@ -2,20 +2,25 @@
2
2
  import { cx as e } from "./cx.js";
3
3
  import { mergeRefs as t } from "./refs.js";
4
4
  import { cloneElement as n, isValidElement as r } from "react";
5
+ import { Fragment as i, jsxs as a } from "react/jsx-runtime";
5
6
  //#region packages/utils/slot.tsx
6
- function i({ children: i, ...a }) {
7
- if (!r(i)) return null;
8
- let o = i, s = a, c = o.props, l = { ...s };
9
- for (let e of Object.keys(s)) {
10
- let t = s[e], n = c[e];
11
- /^on[A-Z]/.test(e) && typeof t == "function" && typeof n == "function" && (l[e] = (...e) => {
7
+ function o({ before: o, children: s, ...c }) {
8
+ if (!r(s)) return null;
9
+ let l = s, u = c, d = l.props, f = { ...u };
10
+ for (let e of Object.keys(u)) {
11
+ let t = u[e], n = d[e];
12
+ /^on[A-Z]/.test(e) && typeof t == "function" && typeof n == "function" && (f[e] = (...e) => {
12
13
  n(...e), t(...e);
13
14
  });
14
15
  }
15
- return l.className = e(s.className, c.className), (s.style || c.style) && (l.style = {
16
- ...s.style,
17
- ...c.style
18
- }), s.ref && c.ref && (l.ref = t(s.ref, c.ref)), n(o, l);
16
+ if (f.className = e(u.className, d.className), (u.style || d.style) && (f.style = {
17
+ ...u.style,
18
+ ...d.style
19
+ }), u.ref && d.ref && (f.ref = t(u.ref, d.ref)), o != null) {
20
+ let e = d.children;
21
+ f.children = typeof e == "function" ? ((...t) => /* @__PURE__ */ a(i, { children: [o, e(...t)] })) : /* @__PURE__ */ a(i, { children: [o, e] });
22
+ }
23
+ return n(l, f);
19
24
  }
20
25
  //#endregion
21
- export { i as Slot };
26
+ export { o as Slot };
@@ -1 +1 @@
1
- {"version":3,"file":"useAnchoredPopup.d.ts","sourceRoot":"","sources":["../../packages/utils/useAnchoredPopup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAmD,MAAM,OAAO,CAAC;AAElG;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,EAAE,EACrE,KAAe,EACf,MAAU,EACV,UAAkB,EAClB,YAAY,GACf,GAAE,oBAAyB;;;oBAgBb,OAAO;;;eA6CkD,aAAa;;;;;;;;;;;;;EAJpF;AAED,gGAAgG;AAChG,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM;;WACoC,aAAa;EACpF;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CACzB,EAAE,EAAE,MAAM,EACV,EAAE,KAAe,EAAE,MAAU,EAAE,KAAK,EAAE,IAAc,EAAE,GAAE,aAAkB,GAC3E,aAAa,CAuBf;AAED,UAAU,aAAa;IACnB,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IAC7B,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC7B;AAYD,8FAA8F;AAC9F,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,QAiCnE;AA6CD,MAAM,WAAW,oBAAoB;IACjC,sFAAsF;IACtF,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;IACnC,oCAAoC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CAC1C"}
1
+ {"version":3,"file":"useAnchoredPopup.d.ts","sourceRoot":"","sources":["../../packages/utils/useAnchoredPopup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAmD,MAAM,OAAO,CAAC;AAElG;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,EAAE,EACrE,KAAe,EACf,MAAU,EACV,UAAkB,EAClB,YAAY,GACf,GAAE,oBAAyB;;;oBAgBb,OAAO;;;eA6CkD,aAAa;;;;;;;;;;;;;EAJpF;AAED,gGAAgG;AAChG,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM;;WACoC,aAAa;EACpF;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CACzB,EAAE,EAAE,MAAM,EACV,EAAE,KAAe,EAAE,MAAU,EAAE,KAAK,EAAE,IAAc,EAAE,GAAE,aAAkB,GAC3E,aAAa,CA4Bf;AAED,UAAU,aAAa;IACnB,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IAC7B,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC7B;AAYD,8FAA8F;AAC9F,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,QAiCnE;AA6CD,MAAM,WAAW,oBAAoB;IACjC,sFAAsF;IACtF,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;IACnC,oCAAoC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CAC1C"}
@@ -54,12 +54,13 @@ function s(e, { align: t = "start", offset: n = 4, width: r, side: i = "below" }
54
54
  let a = i === "beside" ? "inline-end span-block-end" : {
55
55
  start: "block-end span-inline-end",
56
56
  end: "block-end span-inline-start",
57
- center: "block-end center"
57
+ center: "block-end span-all"
58
58
  }[t];
59
59
  return {
60
60
  positionAnchor: `--${e}`,
61
61
  positionArea: a,
62
- positionTryFallbacks: i === "beside" ? "flip-inline, flip-block, flip-block flip-inline" : "flip-block",
62
+ ...i !== "beside" && t === "center" && { justifySelf: "anchor-center" },
63
+ positionTryFallbacks: i === "beside" || t !== "center" ? "flip-inline, flip-block, flip-block flip-inline" : "flip-block",
63
64
  inset: "auto",
64
65
  ...r === "at-least" && {
65
66
  width: "max-content",
@@ -0,0 +1,7 @@
1
+ import { RefObject } from 'react';
2
+ /**
3
+ * Keeps a fixed bar's height in a CSS variable on its parent (0px while the bar
4
+ * is hidden), so the bars and the page beside it can stack on it and pad for it.
5
+ */
6
+ export declare function useHeightVar(ref: RefObject<HTMLElement | null>, name: `--${string}`): void;
7
+ //# sourceMappingURL=useHeightVar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useHeightVar.d.ts","sourceRoot":"","sources":["../../packages/utils/useHeightVar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAmB,MAAM,OAAO,CAAC;AAEnD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,MAAM,EAAE,QAcnF"}
@@ -0,0 +1,17 @@
1
+ "use client";
2
+ import { useLayoutEffect as e } from "react";
3
+ //#region packages/utils/useHeightVar.ts
4
+ function t(t, n) {
5
+ e(() => {
6
+ let e = t.current, r = e?.parentElement;
7
+ if (!e || !r) return;
8
+ let i = () => r.style.setProperty(n, `${e.offsetHeight}px`);
9
+ i();
10
+ let a = new ResizeObserver(i);
11
+ return a.observe(e), () => {
12
+ a.disconnect(), r.style.removeProperty(n);
13
+ };
14
+ }, [t, n]);
15
+ }
16
+ //#endregion
17
+ export { t as useHeightVar };
@@ -0,0 +1,38 @@
1
+ import { RefCallback } from 'react';
2
+ export interface MediaState {
3
+ /** Playing, or about to (not paused). */
4
+ playing: boolean;
5
+ /** Playing but stalled, waiting for data. */
6
+ waiting: boolean;
7
+ ended: boolean;
8
+ /** Seconds in. */
9
+ currentTime: number;
10
+ /** Seconds long; 0 until known, and for a live stream. */
11
+ duration: number;
12
+ /** Seconds loaded from the start of the stretch being played: how far it can play without waiting. */
13
+ buffered: number;
14
+ /** 0 to 1. */
15
+ volume: number;
16
+ muted: boolean;
17
+ playbackRate: number;
18
+ error: MediaError | null;
19
+ }
20
+ export interface MediaPlayer extends MediaState {
21
+ /** Rejects when the browser won't play yet (autoplay before any tap) or can't play the source. */
22
+ play: () => Promise<void>;
23
+ pause: () => void;
24
+ toggle: () => Promise<void>;
25
+ /** Jump to a time, in seconds. */
26
+ seek: (time: number) => void;
27
+ setVolume: (volume: number) => void;
28
+ setMuted: (muted: boolean) => void;
29
+ }
30
+ /**
31
+ * Plays audio or video through your own <audio> or <video> element, and keeps
32
+ * its state for the UI: playing, time, duration, buffered, volume. Returns the
33
+ * ref for the element, kept apart from the player so reading the player isn't
34
+ * reading a ref: `const [ref, player] = useMediaPlayer(); <audio ref={ref} />`.
35
+ * Pair it with SeekBar, and with useMediaSession for the lock screen and media keys.
36
+ */
37
+ export declare function useMediaPlayer(): [ref: RefCallback<HTMLMediaElement>, player: MediaPlayer];
38
+ //# sourceMappingURL=useMediaPlayer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMediaPlayer.d.ts","sourceRoot":"","sources":["../../packages/utils/useMediaPlayer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA0C,MAAM,OAAO,CAAC;AAE5E,MAAM,WAAW,UAAU;IACvB,yCAAyC;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,6CAA6C;IAC7C,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,kBAAkB;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,sGAAsG;IACtG,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,WAAY,SAAQ,UAAU;IAC3C,kGAAkG;IAClG,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,kCAAkC;IAClC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACtC;AAuDD;;;;;;GAMG;AACH,wBAAgB,cAAc,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CA8C1F"}