@orz/ui 0.0.0-stage → 0.0.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 (270) hide show
  1. package/LICENSE +29 -0
  2. package/README.md +541 -2
  3. package/dist/components/avatar.d.ts +14 -0
  4. package/dist/components/avatar.d.ts.map +1 -0
  5. package/dist/components/avatar.js +23 -0
  6. package/dist/components/avatar.js.map +1 -0
  7. package/dist/components/badge.d.ts +10 -0
  8. package/dist/components/badge.d.ts.map +1 -0
  9. package/dist/components/badge.js +26 -0
  10. package/dist/components/badge.js.map +1 -0
  11. package/dist/components/button.d.ts +11 -0
  12. package/dist/components/button.d.ts.map +1 -0
  13. package/dist/components/button.js +40 -0
  14. package/dist/components/button.js.map +1 -0
  15. package/dist/components/card.d.ts +12 -0
  16. package/dist/components/card.d.ts.map +1 -0
  17. package/dist/components/card.js +25 -0
  18. package/dist/components/card.js.map +1 -0
  19. package/dist/components/color-picker.d.ts +58 -0
  20. package/dist/components/color-picker.d.ts.map +1 -0
  21. package/dist/components/color-picker.js +950 -0
  22. package/dist/components/color-picker.js.map +1 -0
  23. package/dist/components/confirm-dialog.d.ts +26 -0
  24. package/dist/components/confirm-dialog.d.ts.map +1 -0
  25. package/dist/components/confirm-dialog.js +18 -0
  26. package/dist/components/confirm-dialog.js.map +1 -0
  27. package/dist/components/dialog.d.ts +26 -0
  28. package/dist/components/dialog.d.ts.map +1 -0
  29. package/dist/components/dialog.js +149 -0
  30. package/dist/components/dialog.js.map +1 -0
  31. package/dist/components/dropdown-menu.d.ts +30 -0
  32. package/dist/components/dropdown-menu.d.ts.map +1 -0
  33. package/dist/components/dropdown-menu.js +100 -0
  34. package/dist/components/dropdown-menu.js.map +1 -0
  35. package/dist/components/filter-menu.d.ts +98 -0
  36. package/dist/components/filter-menu.d.ts.map +1 -0
  37. package/dist/components/filter-menu.js +745 -0
  38. package/dist/components/filter-menu.js.map +1 -0
  39. package/dist/components/highlighted-input.d.ts +40 -0
  40. package/dist/components/highlighted-input.d.ts.map +1 -0
  41. package/dist/components/highlighted-input.js +95 -0
  42. package/dist/components/highlighted-input.js.map +1 -0
  43. package/dist/components/hover-card.d.ts +7 -0
  44. package/dist/components/hover-card.d.ts.map +1 -0
  45. package/dist/components/hover-card.js +22 -0
  46. package/dist/components/hover-card.js.map +1 -0
  47. package/dist/components/input.d.ts +4 -0
  48. package/dist/components/input.d.ts.map +1 -0
  49. package/dist/components/input.js +7 -0
  50. package/dist/components/input.js.map +1 -0
  51. package/dist/components/label.d.ts +5 -0
  52. package/dist/components/label.d.ts.map +1 -0
  53. package/dist/components/label.js +8 -0
  54. package/dist/components/label.js.map +1 -0
  55. package/dist/components/link-chip.d.ts +67 -0
  56. package/dist/components/link-chip.d.ts.map +1 -0
  57. package/dist/components/link-chip.js +71 -0
  58. package/dist/components/link-chip.js.map +1 -0
  59. package/dist/components/load-failure.d.ts +24 -0
  60. package/dist/components/load-failure.d.ts.map +1 -0
  61. package/dist/components/load-failure.js +27 -0
  62. package/dist/components/load-failure.js.map +1 -0
  63. package/dist/components/load-more.d.ts +15 -0
  64. package/dist/components/load-more.d.ts.map +1 -0
  65. package/dist/components/load-more.js +25 -0
  66. package/dist/components/load-more.js.map +1 -0
  67. package/dist/components/media-controls.d.ts +50 -0
  68. package/dist/components/media-controls.d.ts.map +1 -0
  69. package/dist/components/media-controls.js +71 -0
  70. package/dist/components/media-controls.js.map +1 -0
  71. package/dist/components/popover.d.ts +9 -0
  72. package/dist/components/popover.d.ts.map +1 -0
  73. package/dist/components/popover.js +82 -0
  74. package/dist/components/popover.js.map +1 -0
  75. package/dist/components/query-box.d.ts +78 -0
  76. package/dist/components/query-box.d.ts.map +1 -0
  77. package/dist/components/query-box.js +332 -0
  78. package/dist/components/query-box.js.map +1 -0
  79. package/dist/components/query-highlight.d.ts +14 -0
  80. package/dist/components/query-highlight.d.ts.map +1 -0
  81. package/dist/components/query-highlight.js +132 -0
  82. package/dist/components/query-highlight.js.map +1 -0
  83. package/dist/components/select.d.ts +19 -0
  84. package/dist/components/select.d.ts.map +1 -0
  85. package/dist/components/select.js +38 -0
  86. package/dist/components/select.js.map +1 -0
  87. package/dist/components/separator.d.ts +5 -0
  88. package/dist/components/separator.d.ts.map +1 -0
  89. package/dist/components/separator.js +9 -0
  90. package/dist/components/separator.js.map +1 -0
  91. package/dist/components/sheet.d.ts +16 -0
  92. package/dist/components/sheet.d.ts.map +1 -0
  93. package/dist/components/sheet.js +41 -0
  94. package/dist/components/sheet.js.map +1 -0
  95. package/dist/components/skeleton.d.ts +3 -0
  96. package/dist/components/skeleton.d.ts.map +1 -0
  97. package/dist/components/skeleton.js +7 -0
  98. package/dist/components/skeleton.js.map +1 -0
  99. package/dist/components/slider.d.ts +8 -0
  100. package/dist/components/slider.d.ts.map +1 -0
  101. package/dist/components/slider.js +14 -0
  102. package/dist/components/slider.js.map +1 -0
  103. package/dist/components/sonner.d.ts +4 -0
  104. package/dist/components/sonner.d.ts.map +1 -0
  105. package/dist/components/sonner.js +26 -0
  106. package/dist/components/sonner.js.map +1 -0
  107. package/dist/components/switch.d.ts +5 -0
  108. package/dist/components/switch.d.ts.map +1 -0
  109. package/dist/components/switch.js +8 -0
  110. package/dist/components/switch.js.map +1 -0
  111. package/dist/components/table.d.ts +11 -0
  112. package/dist/components/table.d.ts.map +1 -0
  113. package/dist/components/table.js +28 -0
  114. package/dist/components/table.js.map +1 -0
  115. package/dist/components/tabs.d.ts +8 -0
  116. package/dist/components/tabs.d.ts.map +1 -0
  117. package/dist/components/tabs.js +18 -0
  118. package/dist/components/tabs.js.map +1 -0
  119. package/dist/components/textarea.d.ts +4 -0
  120. package/dist/components/textarea.d.ts.map +1 -0
  121. package/dist/components/textarea.js +7 -0
  122. package/dist/components/textarea.js.map +1 -0
  123. package/dist/components/theme-editor/draft.d.ts +235 -0
  124. package/dist/components/theme-editor/draft.d.ts.map +1 -0
  125. package/dist/components/theme-editor/draft.js +638 -0
  126. package/dist/components/theme-editor/draft.js.map +1 -0
  127. package/dist/components/theme-editor/export-panel.d.ts +14 -0
  128. package/dist/components/theme-editor/export-panel.d.ts.map +1 -0
  129. package/dist/components/theme-editor/export-panel.js +39 -0
  130. package/dist/components/theme-editor/export-panel.js.map +1 -0
  131. package/dist/components/theme-editor/form.d.ts +69 -0
  132. package/dist/components/theme-editor/form.d.ts.map +1 -0
  133. package/dist/components/theme-editor/form.js +350 -0
  134. package/dist/components/theme-editor/form.js.map +1 -0
  135. package/dist/components/theme-editor/import-panel.d.ts +21 -0
  136. package/dist/components/theme-editor/import-panel.d.ts.map +1 -0
  137. package/dist/components/theme-editor/import-panel.js +117 -0
  138. package/dist/components/theme-editor/import-panel.js.map +1 -0
  139. package/dist/components/theme-editor/theme-list.d.ts +23 -0
  140. package/dist/components/theme-editor/theme-list.d.ts.map +1 -0
  141. package/dist/components/theme-editor/theme-list.js +42 -0
  142. package/dist/components/theme-editor/theme-list.js.map +1 -0
  143. package/dist/components/theme-editor/token-list.d.ts +30 -0
  144. package/dist/components/theme-editor/token-list.d.ts.map +1 -0
  145. package/dist/components/theme-editor/token-list.js +124 -0
  146. package/dist/components/theme-editor/token-list.js.map +1 -0
  147. package/dist/components/theme-editor/tokens.d.ts +37 -0
  148. package/dist/components/theme-editor/tokens.d.ts.map +1 -0
  149. package/dist/components/theme-editor/tokens.js +155 -0
  150. package/dist/components/theme-editor/tokens.js.map +1 -0
  151. package/dist/components/theme-editor.d.ts +26 -0
  152. package/dist/components/theme-editor.d.ts.map +1 -0
  153. package/dist/components/theme-editor.js +467 -0
  154. package/dist/components/theme-editor.js.map +1 -0
  155. package/dist/components/theme-menu.d.ts +28 -0
  156. package/dist/components/theme-menu.d.ts.map +1 -0
  157. package/dist/components/theme-menu.js +308 -0
  158. package/dist/components/theme-menu.js.map +1 -0
  159. package/dist/components/tooltip.d.ts +11 -0
  160. package/dist/components/tooltip.d.ts.map +1 -0
  161. package/dist/components/tooltip.js +18 -0
  162. package/dist/components/tooltip.js.map +1 -0
  163. package/dist/components/unsaved-changes-dialog.d.ts +39 -0
  164. package/dist/components/unsaved-changes-dialog.d.ts.map +1 -0
  165. package/dist/components/unsaved-changes-dialog.js +46 -0
  166. package/dist/components/unsaved-changes-dialog.js.map +1 -0
  167. package/dist/hooks/scroll-insets.d.ts +89 -0
  168. package/dist/hooks/scroll-insets.d.ts.map +1 -0
  169. package/dist/hooks/scroll-insets.js +265 -0
  170. package/dist/hooks/scroll-insets.js.map +1 -0
  171. package/dist/hooks/use-element-height.d.ts +11 -0
  172. package/dist/hooks/use-element-height.d.ts.map +1 -0
  173. package/dist/hooks/use-element-height.js +33 -0
  174. package/dist/hooks/use-element-height.js.map +1 -0
  175. package/dist/hooks/use-media-query.d.ts +22 -0
  176. package/dist/hooks/use-media-query.d.ts.map +1 -0
  177. package/dist/hooks/use-media-query.js +38 -0
  178. package/dist/hooks/use-media-query.js.map +1 -0
  179. package/dist/hooks/use-overlay-scrollbars.d.ts +31 -0
  180. package/dist/hooks/use-overlay-scrollbars.d.ts.map +1 -0
  181. package/dist/hooks/use-overlay-scrollbars.js +80 -0
  182. package/dist/hooks/use-overlay-scrollbars.js.map +1 -0
  183. package/dist/hooks/use-paged-append.d.ts +7 -0
  184. package/dist/hooks/use-paged-append.d.ts.map +1 -0
  185. package/dist/hooks/use-paged-append.js +53 -0
  186. package/dist/hooks/use-paged-append.js.map +1 -0
  187. package/dist/hooks/use-query-completion.d.ts +27 -0
  188. package/dist/hooks/use-query-completion.d.ts.map +1 -0
  189. package/dist/hooks/use-query-completion.js +100 -0
  190. package/dist/hooks/use-query-completion.js.map +1 -0
  191. package/dist/hooks/use-slash-shortcut.d.ts +9 -0
  192. package/dist/hooks/use-slash-shortcut.d.ts.map +1 -0
  193. package/dist/hooks/use-slash-shortcut.js +38 -0
  194. package/dist/hooks/use-slash-shortcut.js.map +1 -0
  195. package/dist/hooks/viewport-chrome.d.ts +50 -0
  196. package/dist/hooks/viewport-chrome.d.ts.map +1 -0
  197. package/dist/hooks/viewport-chrome.js +170 -0
  198. package/dist/hooks/viewport-chrome.js.map +1 -0
  199. package/dist/index.d.ts +2 -0
  200. package/dist/index.d.ts.map +1 -0
  201. package/dist/index.js +2 -0
  202. package/dist/index.js.map +1 -0
  203. package/dist/lib/cell-width-table.d.ts +3 -0
  204. package/dist/lib/cell-width-table.d.ts.map +1 -0
  205. package/dist/lib/cell-width-table.js +6 -0
  206. package/dist/lib/cell-width-table.js.map +1 -0
  207. package/dist/lib/cell-width.d.ts +7 -0
  208. package/dist/lib/cell-width.d.ts.map +1 -0
  209. package/dist/lib/cell-width.js +50 -0
  210. package/dist/lib/cell-width.js.map +1 -0
  211. package/dist/lib/clipboard.d.ts +8 -0
  212. package/dist/lib/clipboard.d.ts.map +1 -0
  213. package/dist/lib/clipboard.js +19 -0
  214. package/dist/lib/clipboard.js.map +1 -0
  215. package/dist/lib/color.d.ts +40 -0
  216. package/dist/lib/color.d.ts.map +1 -0
  217. package/dist/lib/color.js +177 -0
  218. package/dist/lib/color.js.map +1 -0
  219. package/dist/lib/scroll-map.d.ts +20 -0
  220. package/dist/lib/scroll-map.d.ts.map +1 -0
  221. package/dist/lib/scroll-map.js +46 -0
  222. package/dist/lib/scroll-map.js.map +1 -0
  223. package/dist/lib/text-metrics.d.ts +33 -0
  224. package/dist/lib/text-metrics.d.ts.map +1 -0
  225. package/dist/lib/text-metrics.js +89 -0
  226. package/dist/lib/text-metrics.js.map +1 -0
  227. package/dist/lib/theme-file.d.ts +51 -0
  228. package/dist/lib/theme-file.d.ts.map +1 -0
  229. package/dist/lib/theme-file.js +511 -0
  230. package/dist/lib/theme-file.js.map +1 -0
  231. package/dist/lib/unsaved-guard.d.ts +33 -0
  232. package/dist/lib/unsaved-guard.d.ts.map +1 -0
  233. package/dist/lib/unsaved-guard.js +37 -0
  234. package/dist/lib/unsaved-guard.js.map +1 -0
  235. package/dist/lib/utils.d.ts +3 -0
  236. package/dist/lib/utils.d.ts.map +1 -0
  237. package/dist/lib/utils.js +6 -0
  238. package/dist/lib/utils.js.map +1 -0
  239. package/dist/theme/custom.d.ts +8 -0
  240. package/dist/theme/custom.d.ts.map +1 -0
  241. package/dist/theme/custom.js +56 -0
  242. package/dist/theme/custom.js.map +1 -0
  243. package/dist/theme/index.d.ts +6 -0
  244. package/dist/theme/index.d.ts.map +1 -0
  245. package/dist/theme/index.js +5 -0
  246. package/dist/theme/index.js.map +1 -0
  247. package/dist/theme/paint-guard.d.ts +20 -0
  248. package/dist/theme/paint-guard.d.ts.map +1 -0
  249. package/dist/theme/paint-guard.js +120 -0
  250. package/dist/theme/paint-guard.js.map +1 -0
  251. package/dist/theme/picks.d.ts +22 -0
  252. package/dist/theme/picks.d.ts.map +1 -0
  253. package/dist/theme/picks.js +43 -0
  254. package/dist/theme/picks.js.map +1 -0
  255. package/dist/theme/pref.d.ts +39 -0
  256. package/dist/theme/pref.d.ts.map +1 -0
  257. package/dist/theme/pref.js +129 -0
  258. package/dist/theme/pref.js.map +1 -0
  259. package/dist/theme/provider.d.ts +41 -0
  260. package/dist/theme/provider.d.ts.map +1 -0
  261. package/dist/theme/provider.js +103 -0
  262. package/dist/theme/provider.js.map +1 -0
  263. package/dist/theme/store.d.ts +104 -0
  264. package/dist/theme/store.d.ts.map +1 -0
  265. package/dist/theme/store.js +509 -0
  266. package/dist/theme/store.js.map +1 -0
  267. package/package.json +94 -3
  268. package/styles.css +79 -0
  269. package/theme.css +186 -0
  270. package/vendor/shadcn-tailwind.css +664 -0
@@ -0,0 +1,50 @@
1
+ export declare const MEDIA_SPEEDS: readonly [0.5, 1, 1.5, 2, 4];
2
+ /** `m:ss`, or `h:mm:ss` when `long` — the duration reaches an hour — so both sides line up. */
3
+ export declare function formatTime(seconds: number, long?: boolean): string;
4
+ export type MediaMarker = {
5
+ time: number;
6
+ label: string;
7
+ };
8
+ export type MediaControlsProps = {
9
+ playing: boolean;
10
+ time: number;
11
+ /** Seconds. Not finite while the media does not know it yet: the track is disabled, the time shows alone. */
12
+ duration: number;
13
+ speed: number;
14
+ onToggle: () => void;
15
+ onSeek: (time: number) => void;
16
+ onSpeed: (speed: number) => void;
17
+ disabled?: boolean;
18
+ /** Where the popovers, the speed list and the tooltips portal: the frame, while it is fullscreen. */
19
+ portal?: HTMLElement | null;
20
+ /** Ticks over the seek track; each seeks to its time. */
21
+ markers?: readonly MediaMarker[];
22
+ /** Loaded ranges in seconds, shaded behind the played range. */
23
+ buffered?: readonly (readonly [start: number, end: number])[];
24
+ /** Absent: no volume control. */
25
+ volume?: {
26
+ /** 0…1. */
27
+ level: number;
28
+ muted: boolean;
29
+ onLevel: (level: number) => void;
30
+ onMute: () => void;
31
+ };
32
+ /** Absent: no fullscreen button. */
33
+ fullscreen?: {
34
+ active: boolean;
35
+ onToggle: () => void;
36
+ };
37
+ /** Absent: no picture-in-picture button. */
38
+ pictureInPicture?: {
39
+ active: boolean;
40
+ onToggle: () => void;
41
+ };
42
+ className?: string;
43
+ };
44
+ /**
45
+ * The control bar under a media frame: play, time, seek, volume, speed, picture-in-picture and
46
+ * fullscreen. It holds no media of its own; the player passes the values in and acts on the
47
+ * callbacks.
48
+ */
49
+ export declare function MediaControls({ playing, time, duration, speed, onToggle, onSeek, onSpeed, disabled, portal, markers, buffered, volume, fullscreen, pictureInPicture, className, }: MediaControlsProps): import("react").JSX.Element;
50
+ //# sourceMappingURL=media-controls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-controls.d.ts","sourceRoot":"","sources":["../../src/components/media-controls.tsx"],"names":[],"mappings":"AA4BA,eAAO,MAAM,YAAY,YAAI,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAU,CAAC;AAOzD,+FAA+F;AAC/F,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,UAAkB,GAAG,MAAM,CAM1E;AAED,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,6GAA6G;IAC7G,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qGAAqG;IACrG,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,yDAAyD;IACzD,OAAO,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IACjC,gEAAgE;IAChE,QAAQ,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;IAC9D,iCAAiC;IACjC,MAAM,CAAC,EAAE;QACP,WAAW;QACX,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,OAAO,CAAC;QACf,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;QACjC,MAAM,EAAE,MAAM,IAAI,CAAC;KACpB,CAAC;IACF,oCAAoC;IACpC,UAAU,CAAC,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;IACvD,4CAA4C;IAC5C,gBAAgB,CAAC,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,MAAM,EACN,OAAO,EACP,QAAgB,EAChB,MAAM,EACN,OAAY,EACZ,QAAa,EACb,MAAM,EACN,UAAU,EACV,gBAAgB,EAChB,SAAS,GACV,EAAE,kBAAkB,+BAmJpB"}
@@ -0,0 +1,71 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Maximize, Minimize, Pause, PictureInPicture2, Play, Volume2, VolumeX, } from "lucide-react";
3
+ import { useState } from "react";
4
+ import { cn } from "../lib/utils.js";
5
+ import { Button } from "./button.js";
6
+ import { Popover, PopoverContent, PopoverTrigger } from "./popover.js";
7
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "./select.js";
8
+ import { Slider } from "./slider.js";
9
+ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "./tooltip.js";
10
+ export const MEDIA_SPEEDS = [0.5, 1, 1.5, 2, 4];
11
+ /** Seconds per step of the seek track, an arrow key's worth. */
12
+ const STEP = 0.1;
13
+ const pad = (n) => String(n).padStart(2, "0");
14
+ /** `m:ss`, or `h:mm:ss` when `long` — the duration reaches an hour — so both sides line up. */
15
+ export function formatTime(seconds, long = seconds >= 3600) {
16
+ const total = Math.max(0, Math.floor(seconds));
17
+ const h = Math.floor(total / 3600);
18
+ const m = Math.floor((total % 3600) / 60);
19
+ const s = total % 60;
20
+ return long ? `${h}:${pad(m)}:${pad(s)}` : `${h * 60 + m}:${pad(s)}`;
21
+ }
22
+ /**
23
+ * The control bar under a media frame: play, time, seek, volume, speed, picture-in-picture and
24
+ * fullscreen. It holds no media of its own; the player passes the values in and acts on the
25
+ * callbacks.
26
+ */
27
+ export function MediaControls({ playing, time, duration, speed, onToggle, onSeek, onSpeed, disabled = false, portal, markers = [], buffered = [], volume, fullscreen, pictureInPicture, className, }) {
28
+ // Dragging moves only the shown time; the player seeks once, on release.
29
+ const [dragged, setDragged] = useState(null);
30
+ const known = Number.isFinite(duration) && duration >= 0;
31
+ const shown = known ? Math.min(dragged ?? time, duration) : time;
32
+ const long = known && duration >= 3600;
33
+ const speeds = MEDIA_SPEEDS.includes(speed)
34
+ ? MEDIA_SPEEDS
35
+ : [...MEDIA_SPEEDS, speed].sort((a, b) => a - b);
36
+ return (_jsx(TooltipProvider, { children: _jsxs("div", { "data-slot": "media-controls", className: cn("@container/media-controls flex items-center gap-2 border-t bg-card px-2 py-1 text-card-foreground text-xs", className), children: [_jsx(Button, { type: "button", variant: "ghost", size: "icon-sm", disabled: disabled, "aria-label": playing ? "Pause" : "Play", onClick: onToggle, children: playing ? _jsx(Pause, {}) : _jsx(Play, {}) }), _jsx("span", { className: "shrink-0 tabular-nums", children: known
37
+ ? `${formatTime(shown, long)} / ${formatTime(duration, long)}`
38
+ : formatTime(shown) }), _jsxs("div", { className: "relative mx-1 flex min-w-16 flex-1 items-center", children: [_jsx(Slider, { "aria-label": "Seek", min: 0, max: known ? Math.max(duration, STEP) : STEP, step: STEP, value: [known ? shown : 0], disabled: disabled || !known, onValueChange: ([value]) => setDragged(value ?? null), onValueCommit: ([value]) => {
39
+ setDragged(null);
40
+ if (value === undefined)
41
+ return;
42
+ // The track rounds to its step, so the end itself is a step
43
+ // short of the last frame unless snapped to.
44
+ onSeek(value > duration - STEP ? duration : value);
45
+ }, trackChildren: known && duration > 0
46
+ ? buffered.map(([start, end]) => (_jsx("span", { "data-slot": "media-buffered", className: "absolute inset-y-0 bg-primary/25", style: {
47
+ left: `${(Math.min(start, duration) / duration) * 100}%`,
48
+ width: `${((Math.min(end, duration) - Math.min(start, duration)) / duration) * 100}%`,
49
+ } }, `${start}-${end}`)))
50
+ : undefined }), known &&
51
+ duration > 0 &&
52
+ markers.map((marker, index) => (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", "data-slot": "media-marker", disabled: disabled, "aria-label": `${marker.label || `Marker ${index + 1}`} at ${formatTime(marker.time, long)}`, className: "absolute top-1/2 h-3 w-1 -translate-x-1/2 -translate-y-1/2 rounded-full bg-foreground/50 outline-none after:absolute after:-inset-x-1.5 after:-inset-y-1 hover:bg-foreground focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none", style: {
53
+ left: `${(Math.min(marker.time, duration) / duration) * 100}%`,
54
+ }, onClick: () => onSeek(marker.time) }) }), _jsxs(TooltipContent, { container: portal, children: [marker.label || `Marker ${index + 1}`, " ", _jsx("span", { className: "tabular-nums opacity-70", children: formatTime(marker.time, long) })] })] }, index)))] }), volume !== undefined && (_jsx(VolumeControl, { volume: volume, disabled: disabled, portal: portal })), _jsxs(Select, { value: String(speed), disabled: disabled, onValueChange: (value) => onSpeed(Number(value)), children: [_jsx(SelectTrigger, { size: "sm", "aria-label": "Speed", className: "h-7 border-transparent px-2 text-xs tabular-nums", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { container: portal, children: speeds.map((s) => (_jsxs(SelectItem, { value: String(s), className: "text-xs", children: [s, "\u00D7"] }, s))) })] }), pictureInPicture !== undefined && (_jsx(Button, { type: "button", variant: "ghost", size: "icon-sm", disabled: disabled, "aria-label": pictureInPicture.active
55
+ ? "Exit picture-in-picture"
56
+ : "Picture-in-picture", "aria-pressed": pictureInPicture.active, onClick: pictureInPicture.onToggle, children: _jsx(PictureInPicture2, {}) })), fullscreen !== undefined && (_jsx(Button, { type: "button", variant: "ghost", size: "icon-sm", disabled: disabled, "aria-label": fullscreen.active ? "Exit fullscreen" : "Fullscreen", onClick: fullscreen.onToggle, children: fullscreen.active ? _jsx(Minimize, {}) : _jsx(Maximize, {}) }))] }) }));
57
+ }
58
+ function VolumeControl({ volume, disabled, portal, }) {
59
+ const silent = volume.muted || volume.level === 0;
60
+ const level = volume.muted ? 0 : volume.level;
61
+ const mute = (_jsx(Button, { type: "button", variant: "ghost", size: "icon-sm", disabled: disabled, "aria-label": volume.muted ? "Unmute" : "Mute", onClick: volume.onMute, children: silent ? _jsx(VolumeX, {}) : _jsx(Volume2, {}) }));
62
+ const onValueChange = ([value]) => {
63
+ if (value !== undefined)
64
+ volume.onLevel(value);
65
+ };
66
+ // Both groups render and a container query shows one, so the bar never
67
+ // measures itself and the first paint is already right; the hidden one is
68
+ // display: none, out of the tab order and the accessibility tree.
69
+ return (_jsxs(_Fragment, { children: [_jsxs("div", { "data-slot": "media-volume", className: "hidden shrink-0 items-center gap-1 @sm/media-controls:flex", children: [mute, _jsx(Slider, { "aria-label": "Volume", className: "w-16", min: 0, max: 1, step: 0.05, value: [level], disabled: disabled, onValueChange: onValueChange })] }), _jsxs(Popover, { children: [_jsx(PopoverTrigger, { asChild: true, children: _jsx(Button, { type: "button", variant: "ghost", size: "icon-sm", disabled: disabled, "aria-label": "Volume", "data-slot": "media-volume-trigger", className: "@sm/media-controls:hidden", children: silent ? _jsx(VolumeX, {}) : _jsx(Volume2, {}) }) }), _jsxs(PopoverContent, { container: portal, side: "top", align: "center", className: "flex w-auto flex-col items-center gap-2 p-2", children: [_jsx(Slider, { "aria-label": "Volume", orientation: "vertical", className: "data-vertical:h-24 data-vertical:min-h-0", min: 0, max: 1, step: 0.05, value: [level], disabled: disabled, onValueChange: onValueChange }), mute] })] })] }));
70
+ }
71
+ //# sourceMappingURL=media-controls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-controls.js","sourceRoot":"","sources":["../../src/components/media-controls.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Popover as PopoverPrimitive } from "radix-ui";
2
+ import type * as React from "react";
3
+ declare function Popover({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Root>): React.JSX.Element;
4
+ declare function PopoverTrigger({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Trigger>): React.JSX.Element;
5
+ declare function PopoverClose({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Close>): React.JSX.Element;
6
+ declare function PopoverAnchor({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Anchor>): React.JSX.Element;
7
+ declare function PopoverContent({ className, align, sideOffset, sticky, collisionPadding, onOpenAutoFocus, onCloseAutoFocus, onInteractOutside, container, ...props }: React.ComponentProps<typeof PopoverPrimitive.Content> & Pick<React.ComponentProps<typeof PopoverPrimitive.Portal>, "container">): React.JSX.Element;
8
+ export { Popover, PopoverAnchor, PopoverClose, PopoverContent, PopoverTrigger };
9
+ //# sourceMappingURL=popover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popover.d.ts","sourceRoot":"","sources":["../../src/components/popover.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAIpC,iBAAS,OAAO,CAAC,EACf,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,gBAAgB,CAAC,IAAI,CAAC,qBAEpD;AAED,iBAAS,cAAc,CAAC,EACtB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,gBAAgB,CAAC,OAAO,CAAC,qBAEvD;AAED,iBAAS,YAAY,CAAC,EACpB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,gBAAgB,CAAC,KAAK,CAAC,qBAErD;AAED,iBAAS,aAAa,CAAC,EACrB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,gBAAgB,CAAC,MAAM,CAAC,qBAEtD;AAED,iBAAS,cAAc,CAAC,EACtB,SAAS,EACT,KAAe,EACf,UAAc,EAId,MAAiB,EACjB,gBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,gBAAgB,CAAC,OAAO,CAAC,GACtD,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,gBAAgB,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,qBA2ExE;AAED,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,82 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Popover as PopoverPrimitive } from "radix-ui";
3
+ import { useRef } from "react";
4
+ import { cn } from "../lib/utils.js";
5
+ function Popover({ ...props }) {
6
+ return _jsx(PopoverPrimitive.Root, { "data-slot": "popover", ...props });
7
+ }
8
+ function PopoverTrigger({ ...props }) {
9
+ return _jsx(PopoverPrimitive.Trigger, { "data-slot": "popover-trigger", ...props });
10
+ }
11
+ function PopoverClose({ ...props }) {
12
+ return _jsx(PopoverPrimitive.Close, { "data-slot": "popover-close", ...props });
13
+ }
14
+ function PopoverAnchor({ ...props }) {
15
+ return _jsx(PopoverPrimitive.Anchor, { "data-slot": "popover-anchor", ...props });
16
+ }
17
+ function PopoverContent({ className, align = "start", sideOffset = 4,
18
+ // Radix's sticky="partial" default keeps the surface glued to an anchor that
19
+ // is leaving the viewport, and lets it follow the anchor out. See
20
+ // DropdownMenuContent, which makes the same trade for the same reason.
21
+ sticky = "always", collisionPadding = 8, onOpenAutoFocus, onCloseAutoFocus, onInteractOutside, container, ...props }) {
22
+ const trigger = useRef(null);
23
+ const interactedOutside = useRef(false);
24
+ return (_jsx(PopoverPrimitive.Portal, { container: container, children: _jsx(PopoverPrimitive.Content, { "data-slot": "popover-content", align: align, sideOffset: sideOffset, sticky: sticky, collisionPadding: collisionPadding, onOpenAutoFocus: (event) => {
25
+ onOpenAutoFocus?.(event);
26
+ // The trigger has to be found now, while the popover is open: unlike
27
+ // a menu, a popover's content carries no pointer back to it, and the
28
+ // trigger's aria-controls — the only link there is — is dropped the
29
+ // moment it closes, which is when the restore needs it.
30
+ const content = event.currentTarget;
31
+ trigger.current =
32
+ content instanceof HTMLElement && content.id !== ""
33
+ ? ([...document.querySelectorAll("[aria-controls]")].find((element) => element.getAttribute("aria-controls") === content.id) ?? null)
34
+ : null;
35
+ }, onInteractOutside: (event) => {
36
+ onInteractOutside?.(event);
37
+ // Mirrors the condition Radix's non-modal branch keeps for itself,
38
+ // `event.defaultPrevented` check included, so the restore below can
39
+ // stand aside in exactly the cases Radix would.
40
+ if (!event.defaultPrevented)
41
+ interactedOutside.current = true;
42
+ }, onCloseAutoFocus: (event) => {
43
+ onCloseAutoFocus?.(event);
44
+ // Cleared before anything can return early, which is where Radix
45
+ // clears its own: a close that bails out still ends this cycle, and
46
+ // a flag surviving into the next one would make a later close stand
47
+ // aside for an interaction that belonged to this one.
48
+ const outside = interactedOutside.current;
49
+ interactedOutside.current = false;
50
+ if (event.defaultPrevented)
51
+ return;
52
+ // Every popover here is non-modal, so a click outside reaches what
53
+ // is under it and focus is already wherever the user just put it —
54
+ // a text box, the next field. Radix deliberately skips its
55
+ // restore then, and taking it over anyway would drag focus back to
56
+ // the trigger and take a phone's keyboard down with it. Falling
57
+ // through rather than preventDefault()ing hands that decision back:
58
+ // Radix suppresses the restore, moving neither focus nor the page.
59
+ if (outside)
60
+ return;
61
+ const element = trigger.current;
62
+ // Without a trigger to hand the focus to, fall through to Radix's
63
+ // own restore rather than preventDefault() into a focusless document.
64
+ if (element === null)
65
+ return;
66
+ event.preventDefault();
67
+ // Radix restores focus with a bare focus(), which lets the browser
68
+ // scroll the trigger back into view — obeying the scroll-padding
69
+ // useScrollInsets writes on <html>. Measured as a 300px jump on
70
+ // Escape (T-388).
71
+ element.focus({ preventScroll: true });
72
+ }, className: cn(
73
+ // The viewport term alone let a surface taller than the room on its
74
+ // chosen side run off the screen past that side's edge. The Radix
75
+ // variable bounds it to that room; min() keeps both terms for the
76
+ // reason DropdownMenuContent gives. The width is capped the same way:
77
+ // shift pins a surface wider than the viewport to the left padding,
78
+ // and the rest ran off the right (ThemeMenu's w-80 at 320px, UI-54).
79
+ "z-50 max-h-[min(calc(100dvh-1rem),var(--radix-popover-content-available-height,100dvh))] max-w-[min(calc(100dvw-1rem),var(--radix-popover-content-available-width,100dvw))] w-72 origin-(--radix-popover-content-transform-origin) overflow-y-auto rounded-lg border bg-popover p-1 text-popover-foreground shadow-lg ring-1 ring-foreground/5 duration-100 outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", className), ...props }) }));
80
+ }
81
+ export { Popover, PopoverAnchor, PopoverClose, PopoverContent, PopoverTrigger };
82
+ //# sourceMappingURL=popover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popover.js","sourceRoot":"","sources":["../../src/components/popover.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import { type CompiledQuerySchema, type ValueProviders } from "@orz/query";
2
+ import type { ComponentProps, ReactNode } from "react";
3
+ /**
4
+ * What a row element wears, spread onto it whole. `onClick` takes the row the
5
+ * way Enter would; an app that handles the click itself (a link, say)
6
+ * replaces it.
7
+ */
8
+ export type OptionProps = {
9
+ id: string;
10
+ role: "option";
11
+ tabIndex: -1;
12
+ "aria-selected": boolean;
13
+ className: string;
14
+ onMouseMove: () => void;
15
+ onClick: () => void;
16
+ };
17
+ /** Rows the app adds to the panel: history, jumps, anything that is not syntax. */
18
+ export type RowSource<R> = {
19
+ id: string;
20
+ /** Whether the caret is on something this source recognises; see `orderRows`. */
21
+ matched: boolean;
22
+ /** Takes only what the other sources left. */
23
+ yields?: boolean;
24
+ rows: readonly R[];
25
+ key: (row: R) => string;
26
+ render: (row: R, option: OptionProps) => ReactNode;
27
+ /** Tab takes it and keeps editing. */
28
+ apply?: (row: R) => {
29
+ value: string;
30
+ caret: number;
31
+ } | null;
32
+ /** Shift+Delete on the highlighted row. */
33
+ remove?: (row: R) => void;
34
+ };
35
+ /**
36
+ * A query box: `HighlightedInput` with the schema's colours, its completions,
37
+ * and the app's own rows in one panel, behind todou's keyboard model.
38
+ *
39
+ * A form, not a button with a handler: Enter submits it the way every search
40
+ * box on the web does. Where the query goes is the app's: `onSubmit`.
41
+ *
42
+ * The listbox is hand-rolled rather than a radix popover because focus has to
43
+ * stay in the input and `Content` wants to take it. Nothing is ever
44
+ * preselected: the reader is typing a query, so Enter belongs to the query
45
+ * unless they arrowed onto something else. Tab is the key that takes an offer.
46
+ */
47
+ export declare function QueryBox<R>({ schema, providers, value, onValueChange, onSubmit, sources, renderSubmitRow, limit, onEscape, onOpenChange, listAlign, leading, inputProps, className, panelClassName, }: {
48
+ schema: CompiledQuerySchema;
49
+ providers: ValueProviders;
50
+ value: string;
51
+ onValueChange: (value: string) => void;
52
+ /** Enter with nothing highlighted, or on the submit row; `chosen` when an app row was highlighted. */
53
+ onSubmit: (query: string, chosen: R | undefined) => void;
54
+ sources?: readonly RowSource<R>[];
55
+ /** The row that submits the query as typed, always present. */
56
+ renderSubmitRow: (query: string, option: OptionProps) => ReactNode;
57
+ /** Rows offered at most, the submit row not counted. */
58
+ limit?: number;
59
+ /**
60
+ * Escape arriving with no panel left to close. The first press is the
61
+ * box's own; where the second one goes is the app's to decide.
62
+ */
63
+ onEscape?: () => void;
64
+ /** The panel opened or closed; how an app defers loading its value lists. */
65
+ onOpenChange?: (open: boolean) => void;
66
+ /**
67
+ * Where the panel grows from: `centered` about the box, for a box that
68
+ * sits in the middle of its row; `start` from the box's left edge, for one
69
+ * that starts at the edge of the screen.
70
+ */
71
+ listAlign?: "centered" | "start";
72
+ /** Drawn at the input's left edge, inside its border: a search icon. */
73
+ leading?: ReactNode;
74
+ inputProps?: Omit<ComponentProps<"input">, "value" | "onChange">;
75
+ className?: string;
76
+ panelClassName?: string;
77
+ }): import("react").JSX.Element;
78
+ //# sourceMappingURL=query-box.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-box.d.ts","sourceRoot":"","sources":["../../src/components/query-box.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,mBAAmB,EAKxB,KAAK,cAAc,EACpB,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EACV,cAAc,EAGd,SAAS,EACV,MAAM,OAAO,CAAC;AAcf;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,CAAC,CAAC,CAAC;IACb,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF,mFAAmF;AACnF,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,iFAAiF;IACjF,OAAO,EAAE,OAAO,CAAC;IACjB,8CAA8C;IAC9C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC;IACnB,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC;IACxB,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,KAAK,SAAS,CAAC;IACnD,sCAAsC;IACtC,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC5D,2CAA2C;IAC3C,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC;CAC3B,CAAC;AAkCF;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,EAC1B,MAAM,EACN,SAAS,EACT,KAAK,EACL,aAAa,EACb,QAAQ,EACR,OAAY,EACZ,eAAe,EACf,KAAU,EACV,QAAQ,EACR,YAAY,EACZ,SAAsB,EACtB,OAAO,EACP,UAAe,EACf,SAAS,EACT,cAAc,GACf,EAAE;IACD,MAAM,EAAE,mBAAmB,CAAC;IAC5B,SAAS,EAAE,cAAc,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,sGAAsG;IACtG,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC;IACzD,OAAO,CAAC,EAAE,SAAS,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAClC,+DAA+D;IAC/D,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,KAAK,SAAS,CAAC;IACnE,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC;;;;OAIG;IACH,SAAS,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC;IACjC,wEAAwE;IACxE,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,UAAU,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC,CAAC;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,+BA8WA"}