hyperframes 0.8.145 → 0.8.146

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 (186) hide show
  1. package/dist/{add-B6OUH46W.js → add-6J4TLUDW.js} +15 -15
  2. package/dist/{animatedGifPrep-MIWRDJIO.js → animatedGifPrep-TPYA45ZZ.js} +10 -10
  3. package/dist/{asset-XJ2B2PU3.js → asset-B4C6ZU4V.js} +2 -2
  4. package/dist/{assetCataloger-A5ZLSCMZ.js → assetCataloger-GX4B55VB.js} +4 -4
  5. package/dist/{auth-5HOVCZMV.js → auth-T2V3URGO.js} +2 -2
  6. package/dist/{autoUpdate-WVNL5K3D.js → autoUpdate-O4R7IOYP.js} +2 -2
  7. package/dist/{backgroundChecks-IGF54SFH.js → backgroundChecks-SQHGZCSH.js} +3 -3
  8. package/dist/backgroundChecksWorker.js +3 -3
  9. package/dist/{batchRender-T6JEGCQV.js → batchRender-T7S2CGJE.js} +5 -5
  10. package/dist/{beats-37T6Y6QP.js → beats-RNEXDM7U.js} +16 -16
  11. package/dist/{benchmark-ZVVLOWPP.js → benchmark-IVK6FCEU.js} +12 -12
  12. package/dist/{browser-4SSJOLH4.js → browser-WUE6VK2N.js} +5 -5
  13. package/dist/{bundleWithLocalizedFonts-XWK423QP.js → bundleWithLocalizedFonts-EEIRL7FT.js} +2 -2
  14. package/dist/{capture-2SF7YP57.js → capture-K3EONGGU.js} +2 -2
  15. package/dist/{capture-KZXOPBMO.js → capture-LEKIGJ4G.js} +13 -13
  16. package/dist/{catalog-NLD4A2C6.js → catalog-IXYQ2KXW.js} +15 -15
  17. package/dist/{catch-up-4BSRN6IR.js → catch-up-IIF7HKR6.js} +6 -6
  18. package/dist/{check-IA44QQWM.js → check-W7CDOXNP.js} +38 -38
  19. package/dist/{checkBrowser-VM35KZMW.js → checkBrowser-5VSXEHBZ.js} +118 -61
  20. package/dist/{chunk-ZF7SXQJ7.js → chunk-2NAUEDA6.js} +2 -2
  21. package/dist/{chunk-FXJJCPPB.js → chunk-3HSWLZ6S.js} +1 -1
  22. package/dist/{chunk-ZSVUAVMT.js → chunk-4RUILXS6.js} +5 -5
  23. package/dist/{chunk-FBCULCAL.js → chunk-54UXJKFF.js} +1 -1
  24. package/dist/{chunk-DIRJ322I.js → chunk-66SAATRI.js} +3 -3
  25. package/dist/{chunk-QLSM7K5S.js → chunk-6TTAXMDG.js} +2 -2
  26. package/dist/{chunk-5WVW7P23.js → chunk-A72OAGNB.js} +6 -6
  27. package/dist/{chunk-G75ENCEZ.js → chunk-AIJS74LG.js} +3 -3
  28. package/dist/{chunk-HB7FJOY4.js → chunk-AJ5R4GM6.js} +1 -1
  29. package/dist/{chunk-VRW6EBHV.js → chunk-BAKPN2D2.js} +101 -94
  30. package/dist/{chunk-OTHDVXOJ.js → chunk-CVPWZ5LY.js} +3 -3
  31. package/dist/{chunk-BIAC7IJT.js → chunk-DDNS2674.js} +1 -1
  32. package/dist/{chunk-QFSCCQIR.js → chunk-DMKI64EZ.js} +1 -1
  33. package/dist/{chunk-EPE2HRJK.js → chunk-DUU77E2S.js} +69 -64
  34. package/dist/{chunk-ZIYZ77MR.js → chunk-EGO6Z24R.js} +3 -3
  35. package/dist/{chunk-KC5XXX3X.js → chunk-EOOEC32M.js} +1 -1
  36. package/dist/{chunk-3IBMBNYY.js → chunk-ETNQF37F.js} +10 -10
  37. package/dist/{chunk-XIHCMVMG.js → chunk-FDL4HV44.js} +2 -2
  38. package/dist/{chunk-GBGJ7A3D.js → chunk-FJLHVAPO.js} +6 -6
  39. package/dist/{chunk-QZ3AZTXI.js → chunk-FJWEYVEM.js} +42 -16
  40. package/dist/{chunk-IHTRYDFN.js → chunk-FKLYMV3U.js} +1 -1
  41. package/dist/{chunk-PUGIRFPX.js → chunk-FMNVTKX2.js} +4 -4
  42. package/dist/{chunk-GEMJYBRU.js → chunk-HBGJYBGE.js} +2 -2
  43. package/dist/{chunk-U5QY7KTN.js → chunk-HTM4CIFS.js} +11 -8
  44. package/dist/{chunk-T42U2W2R.js → chunk-IXLUTE6N.js} +1 -1
  45. package/dist/{chunk-FDT6KQV4.js → chunk-JBQJKC23.js} +2 -2
  46. package/dist/{chunk-IEIJRMLZ.js → chunk-JDB65PPT.js} +62 -63
  47. package/dist/{chunk-USDEMXXL.js → chunk-JYVGYKXG.js} +1 -1
  48. package/dist/{chunk-PLR7Z6TC.js → chunk-K7ES5RSK.js} +1 -1
  49. package/dist/{chunk-VHFEMFYL.js → chunk-KFZUUXUN.js} +3 -3
  50. package/dist/{chunk-GRY3PN3K.js → chunk-KG265HQ7.js} +2 -2
  51. package/dist/{chunk-R42WWQVB.js → chunk-KPJMBC4K.js} +2 -2
  52. package/dist/{chunk-MAYCCGMQ.js → chunk-KVGDFUVO.js} +1 -1
  53. package/dist/{chunk-CFUXNBWH.js → chunk-LE7T4ML7.js} +1 -1
  54. package/dist/{chunk-MQZVBHEY.js → chunk-LFNQDTSH.js} +1 -1
  55. package/dist/{chunk-KIFHYXPB.js → chunk-MOL32UKR.js} +45 -11
  56. package/dist/{chunk-ICKDMTLA.js → chunk-QSSPIATO.js} +2 -2
  57. package/dist/{chunk-3KU3PFDW.js → chunk-R6R74HNZ.js} +74 -66
  58. package/dist/{chunk-ADF3X6GM.js → chunk-SYMSKGXI.js} +2 -2
  59. package/dist/{chunk-ZEUONDQG.js → chunk-SYUGVPYH.js} +1 -1
  60. package/dist/{chunk-BFACGEII.js → chunk-TBOMPYG6.js} +2 -2
  61. package/dist/{chunk-XBX4QJP7.js → chunk-TH4OXAWY.js} +1 -1
  62. package/dist/{chunk-GMAJB2P6.js → chunk-UOBYRLDD.js} +1 -1
  63. package/dist/{chunk-4QWD6JYN.js → chunk-UZUUVYAO.js} +3 -3
  64. package/dist/{chunk-PJ3HDUCY.js → chunk-VAS6HQX3.js} +39 -9
  65. package/dist/{chunk-6LGNTUZN.js → chunk-VT563F4O.js} +7 -7
  66. package/dist/{chunk-UXO2L7HJ.js → chunk-WU2B74TL.js} +267 -65
  67. package/dist/{chunk-OB5MJR4W.js → chunk-WUZ6TMAO.js} +1 -1
  68. package/dist/{chunk-GQJZORQP.js → chunk-XBSPQ52S.js} +1 -1
  69. package/dist/{chunk-4ORLNTET.js → chunk-XJUZEB44.js} +1 -1
  70. package/dist/{chunk-LAFJSYDL.js → chunk-XVIYZU3D.js} +1 -1
  71. package/dist/{chunk-GXJEGZL2.js → chunk-Z5C4LEAD.js} +17 -18
  72. package/dist/chunk-Z6FLHIDV.js +3795 -0
  73. package/dist/{chunk-DDIVWXN7.js → chunk-ZFN6GQU4.js} +4 -4
  74. package/dist/{chunk-DWUKJQTO.js → chunk-ZVZSFDW3.js} +2 -2
  75. package/dist/{chunk-5NRXZGKK.js → chunk-ZZ7H4IJ6.js} +9 -9
  76. package/dist/{clean-RDKJB5FK.js → clean-2GDD2B4F.js} +23 -23
  77. package/dist/cli.js +52 -52
  78. package/dist/{cloud-QVPVVNCW.js → cloud-LUKGDTTE.js} +4 -4
  79. package/dist/{cloudrun-3RE2UCQG.js → cloudrun-NQF5KFQI.js} +6 -6
  80. package/dist/{compare-LEDOY7MO.js → compare-4P6O4ONG.js} +32 -32
  81. package/dist/{compiler-F54OZZPM.js → compiler-ACCPOZMQ.js} +6 -6
  82. package/dist/{component-N42M67WY.js → component-SDDOLNJD.js} +3 -3
  83. package/dist/{compositions-VB2J2LZI.js → compositions-P2L6HUVQ.js} +15 -15
  84. package/dist/{delete-Q6RWMJ4Z.js → delete-Q6S4BJ3F.js} +2 -2
  85. package/dist/{deterministicFonts-U2BIMGPG.js → deterministicFonts-C5JQLCTS.js} +2 -2
  86. package/dist/{dist-Q4BI5A73.js → dist-GPDOV3IQ.js} +4 -4
  87. package/dist/{dist-KDJTFJHA.js → dist-HUMFCJ6T.js} +3 -3
  88. package/dist/{doctor-JMMUHDRV.js → doctor-NL73UKHV.js} +15 -15
  89. package/dist/{events-RGUAHIBW.js → events-AVOPOKO3.js} +5 -5
  90. package/dist/{events-6ZBSIBE5.js → events-X7KPU7LG.js} +4 -4
  91. package/dist/{feedback-FIID6MZW.js → feedback-GJZ5NXSH.js} +10 -10
  92. package/dist/{ffmpeg-T5SH2EFJ.js → ffmpeg-5V4FP3R6.js} +2 -2
  93. package/dist/{figma-BL3JJC36.js → figma-V7SVQQI5.js} +3 -3
  94. package/dist/fontLocalizeCli.js +14 -14
  95. package/dist/{get-P46GS7S6.js → get-FO3YZYEU.js} +2 -2
  96. package/dist/{gpuPolicy-AQ2BPLBK.js → gpuPolicy-QGS4TFWP.js} +10 -10
  97. package/dist/{grade-compare-GDCWU7ZZ.js → grade-compare-7ICSN7KE.js} +33 -33
  98. package/dist/{help-HJR3RWFG.js → help-Y5LYZG7K.js} +2 -2
  99. package/dist/{history-GGO5AWJB.js → history-RKGBRNLD.js} +49 -22
  100. package/dist/hyperframe-runtime.js +214 -68
  101. package/dist/hyperframe.manifest.json +1 -1
  102. package/dist/hyperframe.runtime.iife.js +214 -68
  103. package/dist/hyperframes-player.global.js +4 -5
  104. package/dist/hyperframes-slideshow.global.js +3 -4
  105. package/dist/{info-3GFWUBJC.js → info-GGUTL2NR.js} +11 -11
  106. package/dist/{init-36OPU2ZG.js → init-PG7NA5SQ.js} +31 -31
  107. package/dist/{inspect-F2HEL5ON.js → inspect-FCXUB6DE.js} +33 -33
  108. package/dist/{installer-NI6P6GC4.js → installer-LZ4X5TZZ.js} +6 -6
  109. package/dist/{keyframes-7OY3LMAZ.js → keyframes-R3K6WJ3N.js} +8 -8
  110. package/dist/{lambda-6GJIWNJ3.js → lambda-3GAKHMC3.js} +7 -7
  111. package/dist/{layout-FTMLNL5A.js → layout-XNIZIGA2.js} +33 -33
  112. package/dist/{lint-U6POHUON.js → lint-4KDS2F4O.js} +11 -11
  113. package/dist/{lintProject-UBZ3TDHU.js → lintProject-SSEXWCH6.js} +3 -3
  114. package/dist/{list-IP5KI5Q2.js → list-OVPURFPK.js} +2 -2
  115. package/dist/{login-4VWTVPHG.js → login-EE2AX2PE.js} +4 -4
  116. package/dist/{manager-YKMHR6LN.js → manager-5ORDVWJB.js} +3 -3
  117. package/dist/{media-treatment-XGV44AGV.js → media-treatment-UDUEOP67.js} +82 -54
  118. package/dist/{models-UCXB6UR5.js → models-LPK2O4B2.js} +14 -14
  119. package/dist/{motionShot-WPVNBXKA.js → motionShot-G76XBOYI.js} +35 -29
  120. package/dist/{normalize-audio-TYJ3UEHO.js → normalize-audio-TUKWZ3OR.js} +10 -10
  121. package/dist/{open-HENOLVB2.js → open-7XB2TGVB.js} +6 -6
  122. package/dist/{parakeetRunner-VFQ6WFTD.js → parakeetRunner-DL556HXL.js} +14 -14
  123. package/dist/{pipeline-6WPSC3H4.js → pipeline-34N5DLWU.js} +11 -11
  124. package/dist/{play-OI53WNUM.js → play-DDA2UUQF.js} +26 -26
  125. package/dist/{preflight-B4AFK3RG.js → preflight-ONF5AJNO.js} +5 -5
  126. package/dist/{present-NGMEQ4NO.js → present-LLNRKXF5.js} +23 -23
  127. package/dist/{preview-VT2HWRWZ.js → preview-H3ZZS46F.js} +57 -26
  128. package/dist/{producer-7TYEAUF7.js → producer-IFQOZK2G.js} +1 -1
  129. package/dist/{projectConfig-B2AF5DXY.js → projectConfig-SBRMQZGG.js} +8 -8
  130. package/dist/{publication-2PANQVC6.js → publication-5BQICRZO.js} +4 -4
  131. package/dist/{publish-O5OL42BG.js → publish-XDUZA3E3.js} +27 -26
  132. package/dist/{remove-background-T2JM6UVP.js → remove-background-GNKRMFQS.js} +12 -12
  133. package/dist/{render-Z253WHBK.js → render-JM6KNRIA.js} +27 -27
  134. package/dist/{render-OLPKOJRU.js → render-KTTC3EE5.js} +12 -12
  135. package/dist/{render-W7OFXDOJ.js → render-PCFO45RK.js} +5 -5
  136. package/dist/{render-batch-46IIBFKL.js → render-batch-7R2NRNVJ.js} +5 -5
  137. package/dist/{renderCancellation-QTZOCDJ2.js → renderCancellation-GP3XD2FS.js} +10 -10
  138. package/dist/renderSetupWorker.js +3 -3
  139. package/dist/{resolver-J2PL5FVJ.js → resolver-C4FPX72I.js} +6 -6
  140. package/dist/{sherpa-ZF42V3RN.js → sherpa-MZP3MV2X.js} +14 -14
  141. package/dist/skills/media-use/references/media-treatments.md +5 -1
  142. package/dist/{skills-ACDOO3PX.js → skills-OET4XSHR.js} +7 -7
  143. package/dist/{skillsUpdateCheck-L5OXVVPU.js → skillsUpdateCheck-IPFSKKJD.js} +3 -3
  144. package/dist/{slideshow-4OJEPWNZ.js → slideshow-YTWATJRT.js} +1 -1
  145. package/dist/{snapshot-UUVNZOW5.js → snapshot-EC4N75MS.js} +34 -34
  146. package/dist/{src-BSLKXEGX.js → src-LIERUCFW.js} +11 -9
  147. package/dist/{src-KS3AWFGT.js → src-ZZQJOKO6.js} +13 -13
  148. package/dist/{staticProjectServer-2TTVGPQH.js → staticProjectServer-YH2RHYKW.js} +20 -20
  149. package/dist/{status-LXPGSSKY.js → status-PTKNQD2E.js} +2 -2
  150. package/dist/studio/assets/{hyperframes-player-DZ5JrMDg.js → hyperframes-player-tkxyWf5H.js} +3 -3
  151. package/dist/studio/assets/{index-BqFRhNZa.js → index-BrdqOkqP.js} +1 -1
  152. package/dist/studio/assets/{index-D8W0a0Z9.js → index-Cg48BxAo.js} +135 -135
  153. package/dist/studio/assets/{index-BOs6C0aZ.js → index-Dllxg4aU.js} +1 -1
  154. package/dist/studio/index.html +1 -1
  155. package/dist/{studio-api-WYWF7XRC.js → studio-api-T2TS2CHL.js} +16 -14
  156. package/dist/{studioServer-3FG4YTP7.js → studioServer-GJVVJUEL.js} +50 -50
  157. package/dist/{system-OQLOGGPJ.js → system-OXRG57F2.js} +2 -2
  158. package/dist/{telemetry-PAOOB4T4.js → telemetry-ZQ5XVE6Z.js} +5 -5
  159. package/dist/{timeline-JIIJKKPC.js → timeline-I2T5WIPD.js} +34 -25
  160. package/dist/{tokens-3QRAM75Z.js → tokens-ONUWOXEX.js} +2 -2
  161. package/dist/{transcribe-QSBP5MUG.js → transcribe-BCQMA537.js} +12 -12
  162. package/dist/{transcribe-SZB6UMXE.js → transcribe-ZLJF7V5Y.js} +13 -13
  163. package/dist/{updateCheck-V3DSB26K.js → updateCheck-ZWHDXF73.js} +2 -2
  164. package/dist/{upgrade-L5GISOEV.js → upgrade-32JGFZWS.js} +2 -2
  165. package/dist/{urlDownloader-52FERT4X.js → urlDownloader-EVDP43GM.js} +9 -9
  166. package/dist/{validate-HVVLX7KO.js → validate-G4PUGQCI.js} +27 -27
  167. package/dist/{video-MEOWRMFG.js → video-TILEY3VJ.js} +10 -10
  168. package/package.json +3 -2
  169. package/dist/chunk-AUWHD7RA.js +0 -3753
  170. package/dist/studio/chunk-6JY3MTIX.js +0 -1204
  171. package/dist/studio/chunk-EEXSYY5F.js +0 -190
  172. package/dist/studio/chunk-NZPJUZKT.js +0 -1538
  173. package/dist/studio/chunk-PZ5AY32C.js +0 -10
  174. package/dist/studio/chunk-TP6D3U37.js +0 -845
  175. package/dist/studio/chunk-Y2OHHNM2.js +0 -970
  176. package/dist/studio/domEditingLayers-PTP2ICGM.js +0 -47
  177. package/dist/studio/index.css +0 -165
  178. package/dist/studio/index.d.ts +0 -4318
  179. package/dist/studio/index.js +0 -100952
  180. package/dist/studio/player.d.ts +0 -30
  181. package/dist/studio/player.js +0 -10
  182. package/dist/studio/styles/tailwind-preset.d.ts +0 -39
  183. package/dist/studio/styles/tailwind-preset.js +0 -50
  184. package/dist/studio/styles.css +0 -1
  185. package/dist/studio/ui.d.ts +0 -297
  186. package/dist/studio/ui.js +0 -66
@@ -1,970 +0,0 @@
1
- // src/components/ui/cn.ts
2
- import { createCn } from "cn/config";
3
- var isTypeStep = (value) => /^step-\d+$/.test(value);
4
- var isControlSize = (value) => /^ctl(-sm|-lg)?$/.test(value);
5
- var cn = createCn({
6
- extend: {
7
- classGroups: {
8
- "font-size": [{ text: [isTypeStep] }],
9
- h: [{ h: [isControlSize] }],
10
- w: [{ w: [isControlSize] }],
11
- size: [{ size: [isControlSize] }],
12
- "min-h": [{ "min-h": [isControlSize] }],
13
- "min-w": [{ "min-w": [isControlSize] }]
14
- }
15
- }
16
- });
17
-
18
- // src/components/ui/Button.tsx
19
- import { forwardRef } from "react";
20
- import { jsx, jsxs } from "react/jsx-runtime";
21
- var buttonBase = cn(
22
- "inline-flex items-center justify-center select-none cursor-pointer whitespace-nowrap",
23
- "transition-[background-color,border-color,color,filter,transform] ease-out-quint duration-press",
24
- "disabled:opacity-40 disabled:cursor-not-allowed",
25
- "outline-hidden",
26
- "focus-visible:outline-solid focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-accent",
27
- "data-[preview-state=focus]:outline-solid data-[preview-state=focus]:outline-2 data-[preview-state=focus]:outline-offset-1 data-[preview-state=focus]:outline-accent"
28
- );
29
- var buttonVariants = {
30
- primary: cn(
31
- "bg-accent text-on-accent font-semibold",
32
- "enabled:hover:bg-accent-hover data-[preview-state=hover]:bg-accent-hover",
33
- "enabled:active:scale-[0.98] data-[preview-state=active]:scale-[0.98]"
34
- ),
35
- secondary: cn(
36
- "bg-transparent text-text-1 font-medium border border-border-strong",
37
- "enabled:hover:bg-hover enabled:hover:text-text-0 data-[preview-state=hover]:bg-hover data-[preview-state=hover]:text-text-0",
38
- "enabled:active:scale-[0.98] data-[preview-state=active]:scale-[0.98]"
39
- ),
40
- danger: cn(
41
- "bg-danger text-on-danger font-medium",
42
- "enabled:hover:brightness-95 data-[preview-state=hover]:brightness-95",
43
- "enabled:active:scale-[0.98] data-[preview-state=active]:scale-[0.98]"
44
- ),
45
- ghost: cn(
46
- "bg-transparent text-text-2 font-medium",
47
- "enabled:hover:bg-hover enabled:hover:text-text-0 data-[preview-state=hover]:bg-hover data-[preview-state=hover]:text-text-0",
48
- "enabled:active:scale-[0.98] data-[preview-state=active]:scale-[0.98]"
49
- )
50
- };
51
- var buttonSizes = {
52
- sm: "h-ctl-sm px-2 gap-1 rounded-sm text-step-11",
53
- md: "h-ctl px-3 gap-1.5 rounded-md text-step-12",
54
- lg: "h-ctl-lg px-4 gap-2 rounded-md text-step-13"
55
- };
56
- function Spinner() {
57
- return /* @__PURE__ */ jsxs("svg", { className: "animate-spin size-3.5", viewBox: "0 0 24 24", fill: "none", "aria-hidden": "true", children: [
58
- /* @__PURE__ */ jsx("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }),
59
- /* @__PURE__ */ jsx(
60
- "path",
61
- {
62
- className: "opacity-75",
63
- fill: "currentColor",
64
- d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"
65
- }
66
- )
67
- ] });
68
- }
69
- var Button = forwardRef(
70
- ({ variant = "secondary", size = "md", loading, icon, children, className, disabled, ...props }, ref) => {
71
- const isDisabled = disabled || loading;
72
- let leading = null;
73
- if (loading) leading = /* @__PURE__ */ jsx(Spinner, {});
74
- else if (icon) leading = /* @__PURE__ */ jsx("span", { className: "shrink-0", children: icon });
75
- return /* @__PURE__ */ jsxs(
76
- "button",
77
- {
78
- ref,
79
- disabled: isDisabled,
80
- "aria-disabled": isDisabled || void 0,
81
- className: cn(buttonBase, buttonVariants[variant], buttonSizes[size], className),
82
- ...props,
83
- children: [
84
- leading,
85
- children
86
- ]
87
- }
88
- );
89
- }
90
- );
91
- Button.displayName = "Button";
92
-
93
- // src/components/ui/IconButton.tsx
94
- import { forwardRef as forwardRef2 } from "react";
95
- import { jsx as jsx2 } from "react/jsx-runtime";
96
- var iconSizeStyles = {
97
- sm: "size-ctl-sm rounded-sm",
98
- md: "size-ctl rounded-md",
99
- lg: "size-ctl-lg rounded-md"
100
- };
101
- var IconButton = forwardRef2(
102
- ({ icon, size = "md", variant = "ghost", className, disabled, ...props }, ref) => {
103
- return /* @__PURE__ */ jsx2(
104
- "button",
105
- {
106
- ref,
107
- disabled,
108
- "aria-disabled": disabled || void 0,
109
- className: cn(buttonBase, buttonVariants[variant], iconSizeStyles[size], className),
110
- ...props,
111
- children: icon
112
- }
113
- );
114
- }
115
- );
116
- IconButton.displayName = "IconButton";
117
-
118
- // src/components/ui/Tabs.tsx
119
- import { Tabs as BaseTabs } from "@base-ui/react/tabs";
120
- import { jsx as jsx3 } from "react/jsx-runtime";
121
- function Tabs(props) {
122
- return /* @__PURE__ */ jsx3(BaseTabs.Root, { ...props });
123
- }
124
- function TabsList({ className, ...props }) {
125
- return /* @__PURE__ */ jsx3(
126
- BaseTabs.List,
127
- {
128
- activateOnFocus: true,
129
- className: cn("inline-flex items-center gap-0.5 rounded-lg bg-surface-alt p-1", className),
130
- ...props
131
- }
132
- );
133
- }
134
- function Tab({ value, className, ...props }) {
135
- return /* @__PURE__ */ jsx3(
136
- BaseTabs.Tab,
137
- {
138
- value,
139
- "data-tab-id": value,
140
- className: cn(
141
- "inline-flex h-ctl-sm cursor-pointer select-none items-center justify-center rounded-sm px-2.5",
142
- "text-step-11 font-semibold whitespace-nowrap text-text-3",
143
- "transition-[background-color,color] ease-out-quint duration-hover",
144
- "hover:text-text-1 data-[preview-state=hover]:text-text-1",
145
- "aria-selected:bg-hover aria-selected:text-text-0",
146
- "outline-hidden focus-visible:outline-solid focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-accent",
147
- "data-[preview-state=focus]:outline-solid data-[preview-state=focus]:outline-2 data-[preview-state=focus]:outline-offset-1 data-[preview-state=focus]:outline-accent",
148
- className
149
- ),
150
- ...props
151
- }
152
- );
153
- }
154
- function TabPanel({ className, ...props }) {
155
- return /* @__PURE__ */ jsx3(BaseTabs.Panel, { className: cn("outline-hidden", className), ...props });
156
- }
157
-
158
- // src/components/ui/HyperframesMark.tsx
159
- import { useId } from "react";
160
- import { jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
161
- function HyperframesMark({ viewBox = "0 0 100 100", ...props }) {
162
- const gradientId = useId();
163
- const leftGradient = `${gradientId}-left`;
164
- const rightGradient = `${gradientId}-right`;
165
- return /* @__PURE__ */ jsxs2(
166
- "svg",
167
- {
168
- viewBox,
169
- fill: "none",
170
- xmlns: "http://www.w3.org/2000/svg",
171
- "aria-hidden": "true",
172
- ...props,
173
- children: [
174
- /* @__PURE__ */ jsx4("g", { transform: "translate(50 50)", opacity: ".92", children: /* @__PURE__ */ jsxs2("g", { transform: "translate(-50 -50)", children: [
175
- /* @__PURE__ */ jsx4(
176
- "path",
177
- {
178
- d: "M10.1851 57.8021L33.1145 73.8313C36.2202 75.9978 41.5173 73.5433 42.4816 69.4984L51.7611 30.4271C52.7253 26.3822 48.5802 23.9277 44.4602 26.0942L13.917 42.1235C6.96677 45.7676 4.97564 54.1579 10.1851 57.8021Z",
179
- fill: `url(#${leftGradient})`
180
- }
181
- ),
182
- /* @__PURE__ */ jsx4(
183
- "path",
184
- {
185
- d: "M87.5129 57.5141L56.9696 73.5433C52.8371 75.7098 48.7046 73.2553 49.6688 69.2104L58.9483 30.1391C59.9125 26.0942 65.2097 23.6397 68.3154 25.8062L91.2447 41.8354C96.4668 45.4796 94.4631 53.8699 87.5129 57.5141Z",
186
- fill: `url(#${rightGradient})`
187
- }
188
- )
189
- ] }) }),
190
- /* @__PURE__ */ jsxs2("defs", { children: [
191
- /* @__PURE__ */ jsxs2(
192
- "linearGradient",
193
- {
194
- id: leftGradient,
195
- x1: "48.5676",
196
- y1: "25",
197
- x2: "44.7804",
198
- y2: "71.9384",
199
- gradientUnits: "userSpaceOnUse",
200
- children: [
201
- /* @__PURE__ */ jsx4("stop", { stopColor: "#06E3FA" }),
202
- /* @__PURE__ */ jsx4("stop", { offset: "1", stopColor: "#4FDB5E" })
203
- ]
204
- }
205
- ),
206
- /* @__PURE__ */ jsxs2(
207
- "linearGradient",
208
- {
209
- id: rightGradient,
210
- x1: "54.8282",
211
- y1: "73.8392",
212
- x2: "72.0989",
213
- y2: "32.8932",
214
- gradientUnits: "userSpaceOnUse",
215
- children: [
216
- /* @__PURE__ */ jsx4("stop", { stopColor: "#06E3FA" }),
217
- /* @__PURE__ */ jsx4("stop", { offset: "1", stopColor: "#4FDB5E" })
218
- ]
219
- }
220
- )
221
- ] })
222
- ]
223
- }
224
- );
225
- }
226
-
227
- // src/components/ui/HyperframesLoader.tsx
228
- import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
229
- function HyperframesLoader({
230
- title,
231
- detail,
232
- mono,
233
- size = 64,
234
- progress
235
- }) {
236
- const boundedProgress = typeof progress === "number" && Number.isFinite(progress) ? Math.min(1, Math.max(0, progress)) : void 0;
237
- const markFrameSize = Math.round(size * 1.16);
238
- return /* @__PURE__ */ jsxs3("div", { className: "hf-loader", role: "status", draggable: false, children: [
239
- /* @__PURE__ */ jsx5(
240
- "div",
241
- {
242
- className: "hf-loader-mark-frame",
243
- style: { width: markFrameSize, height: markFrameSize },
244
- draggable: false,
245
- children: /* @__PURE__ */ jsx5(HyperframesMark, { className: "hf-loader-mark", width: size, height: size })
246
- }
247
- ),
248
- /* @__PURE__ */ jsx5("div", { className: "hf-loader-title", children: title }),
249
- detail && /* @__PURE__ */ jsx5("div", { className: "hf-loader-detail", children: detail }),
250
- boundedProgress !== void 0 && /* @__PURE__ */ jsx5(
251
- "div",
252
- {
253
- className: "hf-loader-progress",
254
- role: "progressbar",
255
- "aria-valuemin": 0,
256
- "aria-valuemax": 100,
257
- "aria-valuenow": Math.round(boundedProgress * 100),
258
- children: /* @__PURE__ */ jsx5(
259
- "div",
260
- {
261
- className: "hf-loader-progress__fill",
262
- style: { transform: `scaleX(${boundedProgress})` }
263
- }
264
- )
265
- }
266
- ),
267
- mono && /* @__PURE__ */ jsx5("div", { className: "hf-loader-mono", children: mono })
268
- ] });
269
- }
270
-
271
- // src/components/ui/Menu.tsx
272
- import { ContextMenu as BaseContextMenu } from "@base-ui/react/context-menu";
273
- import { Menu as BaseMenu } from "@base-ui/react/menu";
274
- import { useRef } from "react";
275
- import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
276
- var CONTENTS = { display: "contents" };
277
- function useInlinePortal(container) {
278
- const host = useRef(null);
279
- if (container !== null) return { host: null, portal: { container } };
280
- return {
281
- host: /* @__PURE__ */ jsx6("span", { ref: host, style: CONTENTS }),
282
- portal: { container: host, style: CONTENTS }
283
- };
284
- }
285
- var SIDE_OFFSET = 6;
286
- var VIEWPORT_MARGIN = 8;
287
- function floatingMotion(openDuration) {
288
- return cn(
289
- "origin-[var(--transform-origin)] outline-hidden",
290
- "transition-[opacity,transform] ease-out-quint",
291
- openDuration,
292
- "data-[ending-style]:duration-close data-[ending-style]:ease-in",
293
- "data-[starting-style]:[opacity:var(--popup-enter-opacity)]",
294
- "data-[starting-style]:[scale:var(--popup-enter-scale)]",
295
- "data-[ending-style]:opacity-0"
296
- );
297
- }
298
- var popupSurface = cn(
299
- "rounded-lg border border-border-input bg-surface",
300
- floatingMotion("duration-open"),
301
- "data-[preview-state=open]:opacity-100 data-[preview-state=open]:scale-100"
302
- );
303
- var POPUP_LAYER = "z-200";
304
- var menuPopup = cn(popupSurface, "min-w-36 p-1 shadow-menu");
305
- var itemBase = cn(
306
- "flex cursor-default select-none items-center justify-between gap-6 rounded-sm px-2 py-1.5",
307
- "text-step-11 whitespace-nowrap text-text-1",
308
- "outline-hidden transition-colors ease-out-quint duration-hover",
309
- "data-[highlighted]:bg-hover data-[highlighted]:text-text-0",
310
- "data-[preview-state=hover]:bg-hover data-[preview-state=hover]:text-text-0",
311
- "data-[disabled]:pointer-events-none data-[disabled]:opacity-40"
312
- );
313
- var itemDanger = cn(
314
- "text-danger-ink data-[highlighted]:bg-danger/15 data-[highlighted]:text-danger-ink"
315
- );
316
- function Menu({
317
- trigger,
318
- children,
319
- side = "bottom",
320
- align = "start",
321
- sideOffset = SIDE_OFFSET,
322
- container,
323
- className,
324
- "aria-label": ariaLabel,
325
- "data-preview-state": previewState,
326
- ...root
327
- }) {
328
- const inline = useInlinePortal(container);
329
- return /* @__PURE__ */ jsxs4(BaseMenu.Root, { ...root, children: [
330
- /* @__PURE__ */ jsx6(BaseMenu.Trigger, { render: trigger }),
331
- inline.host,
332
- /* @__PURE__ */ jsx6(BaseMenu.Portal, { ...inline.portal, children: /* @__PURE__ */ jsx6(
333
- BaseMenu.Positioner,
334
- {
335
- side,
336
- align,
337
- sideOffset,
338
- collisionPadding: VIEWPORT_MARGIN,
339
- className: POPUP_LAYER,
340
- children: /* @__PURE__ */ jsx6(
341
- BaseMenu.Popup,
342
- {
343
- "aria-label": ariaLabel,
344
- "data-preview-state": previewState,
345
- className: cn(menuPopup, className),
346
- children
347
- }
348
- )
349
- }
350
- ) })
351
- ] });
352
- }
353
- function ContextMenu({
354
- trigger,
355
- children,
356
- container,
357
- className,
358
- "aria-label": ariaLabel,
359
- "data-preview-state": previewState,
360
- ...root
361
- }) {
362
- const inline = useInlinePortal(container);
363
- return /* @__PURE__ */ jsxs4(BaseContextMenu.Root, { ...root, children: [
364
- /* @__PURE__ */ jsx6(BaseContextMenu.Trigger, { render: trigger }),
365
- inline.host,
366
- /* @__PURE__ */ jsx6(BaseContextMenu.Portal, { ...inline.portal, children: /* @__PURE__ */ jsx6(BaseContextMenu.Positioner, { collisionPadding: VIEWPORT_MARGIN, className: POPUP_LAYER, children: /* @__PURE__ */ jsx6(
367
- BaseContextMenu.Popup,
368
- {
369
- "aria-label": ariaLabel,
370
- "data-preview-state": previewState,
371
- className: cn(menuPopup, className),
372
- children
373
- }
374
- ) }) })
375
- ] });
376
- }
377
- function MenuShortcut({ className, ...props }) {
378
- return /* @__PURE__ */ jsx6(
379
- "span",
380
- {
381
- className: cn("shrink-0 font-mono text-step-10 tabular-nums text-text-4", className),
382
- "aria-hidden": "true",
383
- ...props
384
- }
385
- );
386
- }
387
- function MenuItem({ shortcut, tone, className, children, ...props }) {
388
- return /* @__PURE__ */ jsxs4(BaseMenu.Item, { className: cn(itemBase, tone === "danger" && itemDanger, className), ...props, children: [
389
- /* @__PURE__ */ jsx6("span", { className: "truncate", children }),
390
- shortcut ? /* @__PURE__ */ jsx6(MenuShortcut, { children: shortcut }) : null
391
- ] });
392
- }
393
- function MenuRadioGroup(props) {
394
- return /* @__PURE__ */ jsx6(BaseMenu.RadioGroup, { ...props });
395
- }
396
- function MenuRadioItem({ className, children, ...props }) {
397
- return /* @__PURE__ */ jsxs4(BaseMenu.RadioItem, { className: cn(itemBase, className), ...props, children: [
398
- /* @__PURE__ */ jsx6("span", { className: "truncate", children }),
399
- /* @__PURE__ */ jsx6("span", { className: "flex size-3 shrink-0 items-center justify-center", children: /* @__PURE__ */ jsx6(BaseMenu.RadioItemIndicator, { className: "size-1.5 rounded-full bg-accent" }) })
400
- ] });
401
- }
402
- function MenuCheckboxItem({
403
- className,
404
- children,
405
- ...props
406
- }) {
407
- return /* @__PURE__ */ jsxs4(BaseMenu.CheckboxItem, { className: cn(itemBase, className), ...props, children: [
408
- /* @__PURE__ */ jsx6("span", { className: "truncate", children }),
409
- /* @__PURE__ */ jsx6("span", { className: "flex size-3 shrink-0 items-center justify-center text-accent-ink", children: /* @__PURE__ */ jsx6(BaseMenu.CheckboxItemIndicator, { children: "\u2713" }) })
410
- ] });
411
- }
412
- function MenuSeparator({ className, ...props }) {
413
- return /* @__PURE__ */ jsx6(BaseMenu.Separator, { className: cn("my-1 h-px bg-hairline", className), ...props });
414
- }
415
-
416
- // src/components/ui/Tooltip.tsx
417
- import { Tooltip as BaseTooltip } from "@base-ui/react/tooltip";
418
- import { cloneElement, useId as useId2, useRef as useRef2, useState } from "react";
419
- import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
420
- var SIDE_OFFSET2 = 6;
421
- var VIEWPORT_MARGIN2 = 8;
422
- function Tooltip({
423
- label,
424
- children,
425
- delay = 400,
426
- side = "top",
427
- disabled = false
428
- }) {
429
- const [open, setOpen] = useState(false);
430
- const boxRef = useRef2(null);
431
- const tooltipId = useId2();
432
- return /* @__PURE__ */ jsxs5(BaseTooltip.Root, { open, onOpenChange: setOpen, disabled, children: [
433
- /* @__PURE__ */ jsx7(BaseTooltip.Trigger, { delay, render: /* @__PURE__ */ jsx7("span", { ref: boxRef, className: "contents" }), children: cloneElement(children, {
434
- "aria-describedby": open && !disabled ? tooltipId : children.props["aria-describedby"]
435
- }) }),
436
- /* @__PURE__ */ jsx7(BaseTooltip.Portal, { children: /* @__PURE__ */ jsx7(
437
- BaseTooltip.Positioner,
438
- {
439
- anchor: () => boxRef.current?.firstElementChild ?? null,
440
- side,
441
- sideOffset: SIDE_OFFSET2,
442
- collisionPadding: VIEWPORT_MARGIN2,
443
- className: POPUP_LAYER,
444
- children: /* @__PURE__ */ jsx7(
445
- BaseTooltip.Popup,
446
- {
447
- id: tooltipId,
448
- role: "tooltip",
449
- className: cn(
450
- "pointer-events-none rounded-md border border-border-input bg-surface px-2 py-1 text-step-10 font-medium text-text-1 whitespace-nowrap shadow-menu",
451
- floatingMotion("duration-tooltip")
452
- ),
453
- children: label
454
- }
455
- )
456
- }
457
- ) })
458
- ] });
459
- }
460
-
461
- // src/components/ui/Popover.tsx
462
- import { Popover as BasePopover } from "@base-ui/react/popover";
463
- import { jsx as jsx8, jsxs as jsxs6 } from "react/jsx-runtime";
464
- var SIDE_OFFSET3 = 6;
465
- var VIEWPORT_MARGIN3 = 8;
466
- var ARROW_PX = 7;
467
- var ARROW_CORNER_CLEARANCE = 10;
468
- var arrowPlace = cn(
469
- "data-[side=bottom]:-top-[7px] data-[side=top]:-bottom-[7px] data-[side=top]:rotate-180",
470
- "data-[side=left]:-right-[10px] data-[side=left]:rotate-90",
471
- "data-[side=right]:-left-[10px] data-[side=right]:-rotate-90"
472
- );
473
- function Popover({
474
- trigger,
475
- children,
476
- side = "bottom",
477
- align = "center",
478
- arrow = false,
479
- sideOffset = arrow ? SIDE_OFFSET3 + ARROW_PX : SIDE_OFFSET3,
480
- container,
481
- className,
482
- initialFocus,
483
- "aria-label": ariaLabel,
484
- "data-preview-state": previewState,
485
- ...root
486
- }) {
487
- const inline = useInlinePortal(container);
488
- return /* @__PURE__ */ jsxs6(BasePopover.Root, { ...root, children: [
489
- /* @__PURE__ */ jsx8(BasePopover.Trigger, { render: trigger }),
490
- inline.host,
491
- /* @__PURE__ */ jsx8(BasePopover.Portal, { ...inline.portal, children: /* @__PURE__ */ jsx8(
492
- BasePopover.Positioner,
493
- {
494
- side,
495
- align,
496
- sideOffset,
497
- collisionPadding: VIEWPORT_MARGIN3,
498
- arrowPadding: ARROW_CORNER_CLEARANCE,
499
- className: POPUP_LAYER,
500
- children: /* @__PURE__ */ jsxs6(
501
- BasePopover.Popup,
502
- {
503
- "aria-label": ariaLabel,
504
- initialFocus,
505
- "data-preview-state": previewState,
506
- className: cn(popupSurface, "p-3 text-step-11 text-text-1 shadow-popover", className),
507
- children: [
508
- arrow && /* @__PURE__ */ jsx8(BasePopover.Arrow, { className: arrowPlace, children: /* @__PURE__ */ jsx8("svg", { width: "14", height: "8", viewBox: "0 0 14 8", "aria-hidden": "true", className: "block", children: /* @__PURE__ */ jsx8("path", { d: "M0 8 L7 1 L14 8", className: "fill-surface stroke-border-input" }) }) }),
509
- children
510
- ]
511
- }
512
- )
513
- }
514
- ) })
515
- ] });
516
- }
517
-
518
- // src/components/ui/Input.tsx
519
- import { Input as BaseInput } from "@base-ui/react/input";
520
- import { useEffect, useRef as useRef3, useState as useState2 } from "react";
521
- import { jsx as jsx9 } from "react/jsx-runtime";
522
- var fieldBase = cn(
523
- "flex min-w-0 items-center gap-1.5 h-ctl px-2 rounded-md",
524
- "bg-input border border-border-input text-step-11 font-medium text-text-1",
525
- "transition-[border-color,background-color] ease-standard duration-focus",
526
- "hover:border-border-strong data-[preview-state=hover]:border-border-strong",
527
- "outline-hidden",
528
- "focus-within:outline-solid focus-within:outline-2 focus-within:outline-offset-1 focus-within:outline-accent",
529
- "data-[preview-state=focus]:outline-solid data-[preview-state=focus]:outline-2 data-[preview-state=focus]:outline-offset-1 data-[preview-state=focus]:outline-accent",
530
- // `aria-invalid` is not one of Tailwind's built-in aria variants, so the
531
- // arbitrary form is the one that compiles. The token gate would have caught
532
- // the bare `aria-invalid:` spelling as a class that resolves to nothing.
533
- "aria-[invalid]:border-danger-ink",
534
- "has-[:disabled]:opacity-40 has-[:disabled]:cursor-not-allowed"
535
- );
536
- var fieldText = cn(
537
- "min-w-0 w-full bg-transparent text-inherit outline-hidden",
538
- "placeholder:text-text-5 disabled:cursor-not-allowed"
539
- );
540
- function Input({
541
- value,
542
- onCommit,
543
- onTrack,
544
- invalid,
545
- disabled,
546
- className,
547
- "data-preview-state": previewState,
548
- ...props
549
- }) {
550
- const [draft, setDraft] = useState2(value);
551
- const valueRef = useRef3(value);
552
- valueRef.current = value;
553
- const dirtyRef = useRef3(false);
554
- useEffect(() => {
555
- if (!dirtyRef.current) setDraft(value);
556
- }, [value]);
557
- const commit = (next) => {
558
- dirtyRef.current = false;
559
- if (next === valueRef.current) return;
560
- onCommit(next);
561
- onTrack?.();
562
- };
563
- return /* @__PURE__ */ jsx9(
564
- "div",
565
- {
566
- className: cn(fieldBase, className),
567
- "aria-invalid": invalid || void 0,
568
- "data-preview-state": previewState,
569
- children: /* @__PURE__ */ jsx9(
570
- BaseInput,
571
- {
572
- value: draft,
573
- disabled,
574
- "aria-invalid": invalid || void 0,
575
- className: fieldText,
576
- onValueChange: (next) => {
577
- dirtyRef.current = true;
578
- setDraft(next);
579
- },
580
- onBlur: () => commit(draft),
581
- onKeyDown: (event) => {
582
- if (event.key === "Enter") {
583
- event.preventDefault();
584
- commit(draft);
585
- return;
586
- }
587
- if (event.key === "Escape") {
588
- event.preventDefault();
589
- event.stopPropagation();
590
- dirtyRef.current = false;
591
- setDraft(valueRef.current);
592
- event.currentTarget.blur();
593
- }
594
- },
595
- ...props
596
- }
597
- )
598
- }
599
- );
600
- }
601
-
602
- // src/components/ui/NumberField.tsx
603
- import { NumberField as BaseNumberField } from "@base-ui/react/number-field";
604
- import { useEffect as useEffect2, useRef as useRef4, useState as useState3 } from "react";
605
- import { jsx as jsx10, jsxs as jsxs7 } from "react/jsx-runtime";
606
- function NumberField({
607
- label,
608
- value,
609
- onCommit,
610
- onTrack,
611
- unit,
612
- min,
613
- max,
614
- step,
615
- disabled,
616
- className,
617
- "data-preview-state": previewState
618
- }) {
619
- const [draft, setDraft] = useState3(value);
620
- const [invalid, setInvalid] = useState3(false);
621
- const inputRef = useRef4(null);
622
- const committedRef = useRef4(value);
623
- const valueRef = useRef4(value);
624
- valueRef.current = value;
625
- useEffect2(() => {
626
- committedRef.current = value;
627
- setDraft(value);
628
- setInvalid(false);
629
- }, [value]);
630
- const commit = (next) => {
631
- if (next === null || !Number.isFinite(next)) {
632
- setInvalid(true);
633
- return;
634
- }
635
- setInvalid(false);
636
- if (next === committedRef.current) return;
637
- committedRef.current = next;
638
- onCommit(next);
639
- onTrack?.();
640
- };
641
- const commitFromText = () => {
642
- const text = inputRef.current?.value.trim() ?? "";
643
- commit(text === "" ? null : Number(text));
644
- };
645
- return /* @__PURE__ */ jsx10(
646
- BaseNumberField.Root,
647
- {
648
- value: draft,
649
- min,
650
- max,
651
- step,
652
- disabled,
653
- onValueChange: (next) => {
654
- setDraft(next);
655
- if (next !== null) setInvalid(false);
656
- },
657
- onValueCommitted: (next) => commit(next),
658
- children: /* @__PURE__ */ jsxs7(
659
- BaseNumberField.Group,
660
- {
661
- className: cn(fieldBase, className),
662
- "aria-invalid": invalid || void 0,
663
- "data-preview-state": previewState,
664
- children: [
665
- /* @__PURE__ */ jsx10(
666
- BaseNumberField.Input,
667
- {
668
- ref: inputRef,
669
- "aria-label": label,
670
- "aria-invalid": invalid || void 0,
671
- className: cn(fieldText, "tabular-nums"),
672
- onKeyDown: (event) => {
673
- if (event.key !== "Enter") return;
674
- event.preventDefault();
675
- commitFromText();
676
- },
677
- onBlur: () => {
678
- const text = inputRef.current?.value.trim() ?? "";
679
- if (text === "" || !Number.isFinite(Number(text))) setInvalid(true);
680
- }
681
- }
682
- ),
683
- unit && /* @__PURE__ */ jsx10("span", { className: "shrink-0 select-none text-step-10 text-text-4", "aria-hidden": "true", children: unit })
684
- ]
685
- }
686
- )
687
- }
688
- );
689
- }
690
-
691
- // src/components/ui/Select.tsx
692
- import { Select as BaseSelect } from "@base-ui/react/select";
693
- import { jsx as jsx11, jsxs as jsxs8 } from "react/jsx-runtime";
694
- function Select({
695
- label,
696
- value,
697
- options,
698
- onCommit,
699
- onTrack,
700
- disabled,
701
- className,
702
- "data-preview-state": previewState
703
- }) {
704
- return /* @__PURE__ */ jsxs8(
705
- BaseSelect.Root,
706
- {
707
- value,
708
- disabled,
709
- items: options,
710
- onValueChange: (next) => {
711
- const chosen = String(next);
712
- if (chosen === value) return;
713
- onCommit(chosen);
714
- onTrack?.();
715
- },
716
- children: [
717
- /* @__PURE__ */ jsxs8(
718
- BaseSelect.Trigger,
719
- {
720
- "aria-label": label,
721
- className: cn(
722
- fieldBase,
723
- "w-full cursor-pointer justify-between text-left",
724
- "data-[popup-open]:border-border-strong",
725
- className
726
- ),
727
- "data-preview-state": previewState,
728
- children: [
729
- /* @__PURE__ */ jsx11(BaseSelect.Value, { className: "truncate" }),
730
- /* @__PURE__ */ jsx11(BaseSelect.Icon, { className: "shrink-0 text-text-4", "aria-hidden": "true", children: /* @__PURE__ */ jsx11("svg", { width: "8", height: "5", viewBox: "0 0 8 5", fill: "none", children: /* @__PURE__ */ jsx11(
731
- "path",
732
- {
733
- d: "M1 1L4 4L7 1",
734
- stroke: "currentColor",
735
- strokeWidth: "1.5",
736
- strokeLinecap: "round",
737
- strokeLinejoin: "round"
738
- }
739
- ) }) })
740
- ]
741
- }
742
- ),
743
- /* @__PURE__ */ jsx11(BaseSelect.Portal, { children: /* @__PURE__ */ jsx11(BaseSelect.Positioner, { sideOffset: 4, alignItemWithTrigger: false, className: POPUP_LAYER, children: /* @__PURE__ */ jsx11(
744
- BaseSelect.Popup,
745
- {
746
- className: cn(
747
- "min-w-[var(--anchor-width)] rounded-md border border-border bg-surface py-1 shadow-menu",
748
- floatingMotion("duration-open")
749
- ),
750
- children: /* @__PURE__ */ jsx11(BaseSelect.List, { children: options.map((option) => /* @__PURE__ */ jsx11(
751
- BaseSelect.Item,
752
- {
753
- value: option.value,
754
- disabled: option.disabled,
755
- className: cn(
756
- "flex h-ctl-sm cursor-pointer select-none items-center gap-2 px-2.5",
757
- "text-step-11 text-text-2 outline-hidden",
758
- "data-[highlighted]:bg-hover data-[highlighted]:text-text-0",
759
- "data-[selected]:text-text-0",
760
- "data-[disabled]:cursor-not-allowed data-[disabled]:opacity-40"
761
- ),
762
- children: /* @__PURE__ */ jsx11(BaseSelect.ItemText, { className: "truncate", children: option.label })
763
- },
764
- option.value
765
- )) })
766
- }
767
- ) }) })
768
- ]
769
- }
770
- );
771
- }
772
-
773
- // src/components/ui/Slider.tsx
774
- import { Slider as BaseSlider } from "@base-ui/react/slider";
775
- import { useEffect as useEffect3, useRef as useRef5, useState as useState4 } from "react";
776
- import { jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
777
- var first = (next) => Array.isArray(next) ? next[0] : next;
778
- function Slider({
779
- label,
780
- value,
781
- min,
782
- max,
783
- step,
784
- onPreview,
785
- onCommit,
786
- onTrack,
787
- disabled,
788
- className,
789
- "data-preview-state": previewState
790
- }) {
791
- const [draft, setDraft] = useState4(value);
792
- const draggingRef = useRef5(false);
793
- const abortedRef = useRef5(false);
794
- const dragStartRef = useRef5(value);
795
- const committedRef = useRef5(value);
796
- const valueRef = useRef5(value);
797
- valueRef.current = value;
798
- useEffect3(() => {
799
- if (draggingRef.current) return;
800
- committedRef.current = value;
801
- setDraft(value);
802
- }, [value]);
803
- const commit = (next) => {
804
- if (next === committedRef.current) return;
805
- committedRef.current = next;
806
- onCommit(next);
807
- };
808
- const abort = () => {
809
- if (!draggingRef.current) return;
810
- abortedRef.current = true;
811
- const start = dragStartRef.current;
812
- setDraft(start);
813
- onPreview?.(start);
814
- commit(start);
815
- };
816
- return /* @__PURE__ */ jsx12(
817
- BaseSlider.Root,
818
- {
819
- value: draft,
820
- min,
821
- max,
822
- step,
823
- disabled,
824
- onValueChange: (next, details) => {
825
- if (abortedRef.current) {
826
- details.cancel();
827
- return;
828
- }
829
- const n = first(next);
830
- setDraft(n);
831
- onPreview?.(n);
832
- },
833
- onValueCommitted: (next) => {
834
- draggingRef.current = false;
835
- if (abortedRef.current) {
836
- abortedRef.current = false;
837
- return;
838
- }
839
- commit(first(next));
840
- onTrack?.();
841
- },
842
- className: cn("flex min-w-0 items-center", className),
843
- "data-preview-state": previewState,
844
- children: /* @__PURE__ */ jsx12(
845
- BaseSlider.Control,
846
- {
847
- "data-slider-control": "true",
848
- className: "flex h-6 w-full min-w-0 touch-none select-none items-center",
849
- onPointerDown: () => {
850
- draggingRef.current = true;
851
- abortedRef.current = false;
852
- dragStartRef.current = valueRef.current;
853
- },
854
- onContextMenu: (event) => {
855
- if (!draggingRef.current) return;
856
- event.preventDefault();
857
- abort();
858
- },
859
- onKeyDown: (event) => {
860
- if (event.key !== "Escape" || !draggingRef.current) return;
861
- event.preventDefault();
862
- abort();
863
- },
864
- children: /* @__PURE__ */ jsxs9(BaseSlider.Track, { className: "h-0.5 w-full rounded-full bg-hover", children: [
865
- /* @__PURE__ */ jsx12(BaseSlider.Indicator, { className: "rounded-full bg-text-5" }),
866
- /* @__PURE__ */ jsx12(
867
- BaseSlider.Thumb,
868
- {
869
- "aria-label": label,
870
- className: cn(
871
- // The ring separates the thumb from the track behind it. A drop
872
- // shadow would need a raw colour literal, which R5 does not allow
873
- // outside the token file, and no shadow token fits a 10px dot.
874
- "size-2.5 rounded-full bg-text-0 ring-2 ring-bg-1",
875
- "cursor-grab active:cursor-grabbing data-[preview-state=active]:cursor-grabbing",
876
- "hover:scale-110 data-[preview-state=hover]:scale-110",
877
- "transition-transform ease-standard duration-hover",
878
- "has-[:focus-visible]:outline-solid has-[:focus-visible]:outline-2 has-[:focus-visible]:outline-offset-2 has-[:focus-visible]:outline-accent",
879
- "data-[preview-state=focus]:outline-solid data-[preview-state=focus]:outline-2 data-[preview-state=focus]:outline-offset-2 data-[preview-state=focus]:outline-accent"
880
- )
881
- }
882
- )
883
- ] })
884
- }
885
- )
886
- }
887
- );
888
- }
889
-
890
- // src/components/ui/Toggle.tsx
891
- import { Switch } from "@base-ui/react/switch";
892
- import { jsx as jsx13 } from "react/jsx-runtime";
893
- function Toggle({
894
- label,
895
- checked,
896
- onCommit,
897
- onTrack,
898
- disabled,
899
- className,
900
- "data-preview-state": previewState
901
- }) {
902
- return /* @__PURE__ */ jsx13(
903
- Switch.Root,
904
- {
905
- "aria-label": label,
906
- checked,
907
- disabled,
908
- onCheckedChange: (next) => {
909
- onCommit(next);
910
- onTrack?.();
911
- },
912
- "data-preview-state": previewState,
913
- className: cn(
914
- "relative inline-flex h-4 w-7 shrink-0 cursor-pointer items-center rounded-full p-0.5",
915
- "border border-border-input bg-input",
916
- "transition-[background-color,border-color] ease-standard duration-press",
917
- "hover:border-border-strong data-[preview-state=hover]:border-border-strong",
918
- "data-[checked]:border-accent data-[checked]:bg-accent",
919
- "outline-hidden focus-visible:outline-solid focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-accent",
920
- "data-[preview-state=focus]:outline-solid data-[preview-state=focus]:outline-2 data-[preview-state=focus]:outline-offset-1 data-[preview-state=focus]:outline-accent",
921
- "disabled:cursor-not-allowed disabled:opacity-40",
922
- className
923
- ),
924
- children: /* @__PURE__ */ jsx13(
925
- Switch.Thumb,
926
- {
927
- className: cn(
928
- "size-3 rounded-full bg-text-3",
929
- "transition-[transform,background-color] ease-standard duration-press",
930
- "data-[checked]:translate-x-3 data-[checked]:bg-bg-0"
931
- )
932
- }
933
- )
934
- }
935
- );
936
- }
937
-
938
- export {
939
- cn,
940
- buttonBase,
941
- buttonVariants,
942
- buttonSizes,
943
- Button,
944
- IconButton,
945
- Tabs,
946
- TabsList,
947
- Tab,
948
- TabPanel,
949
- HyperframesMark,
950
- HyperframesLoader,
951
- popupSurface,
952
- Menu,
953
- ContextMenu,
954
- MenuShortcut,
955
- MenuItem,
956
- MenuRadioGroup,
957
- MenuRadioItem,
958
- MenuCheckboxItem,
959
- MenuSeparator,
960
- Tooltip,
961
- Popover,
962
- fieldBase,
963
- fieldText,
964
- Input,
965
- NumberField,
966
- Select,
967
- Slider,
968
- Toggle
969
- };
970
- //# sourceMappingURL=chunk-Y2OHHNM2.js.map