@crewlethq/ui 0.35.1 → 0.36.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 (164) hide show
  1. package/README.md +73 -0
  2. package/dist/AgentHandoffPanel/AgentHandoffPanel.d.ts +99 -0
  3. package/dist/AgentHandoffPanel/index.d.ts +3 -0
  4. package/dist/AgentHandoffPanel/index.js +16 -0
  5. package/dist/AgentHandoffPanel-JWSW62GU.css +151 -0
  6. package/dist/ArrangeFrame/index.js +1 -1
  7. package/dist/{ArrangeFrame-3PLZAG22.css → ArrangeFrame-QXOQTFAH.css} +22 -5
  8. package/dist/ArrangeList/index.js +4 -3
  9. package/dist/ArtifactBar/ArtifactBar.d.ts +2 -1
  10. package/dist/ArtifactBar/index.js +2 -2
  11. package/dist/{ArtifactBar-HV5AT4RG.css → ArtifactBar-FWPBBKQ5.css} +8 -0
  12. package/dist/ArtifactCard/index.js +3 -3
  13. package/dist/ArtifactCover/index.js +3 -2
  14. package/dist/ArtifactKindIllustration/ArtifactKindIllustration.d.ts +16 -7
  15. package/dist/ArtifactKindIllustration/index.js +1 -1
  16. package/dist/{ArtifactKindIllustration-5FPRJQ3P.css → ArtifactKindIllustration-5KTP43QS.css} +36 -0
  17. package/dist/ArtifactMakeRow/ArtifactMakeRow.d.ts +39 -0
  18. package/dist/ArtifactMakeRow/index.d.ts +4 -0
  19. package/dist/ArtifactMakeRow/index.js +4 -0
  20. package/dist/ArtifactMakeRow-RWUTS5MC.css +167 -0
  21. package/dist/ArtifactPanel/ArtifactPanel.d.ts +8 -1
  22. package/dist/ArtifactPanel/index.js +1 -1
  23. package/dist/{ArtifactPanel-HW3SU7CP.css → ArtifactPanel-KKUUIPEU.css} +9 -0
  24. package/dist/AuthLayout/index.js +2 -2
  25. package/dist/AvatarPicker/index.js +2 -2
  26. package/dist/Canvas/index.js +2 -2
  27. package/dist/CanvasBoard/CanvasBoard.d.ts +27 -13
  28. package/dist/CanvasBoard/index.d.ts +1 -1
  29. package/dist/CanvasBoard/index.js +4 -4
  30. package/dist/{CanvasBoard-5NNSKY6A.css → CanvasBoard-TS4P356F.css} +13 -6
  31. package/dist/CanvasToolbar/index.js +3 -3
  32. package/dist/Card/index.js +1 -1
  33. package/dist/{Card-KJOYHDTJ.css → Card-QOVASQNU.css} +17 -12
  34. package/dist/Checkbox/index.js +3 -2
  35. package/dist/ChoiceButtons/index.js +1 -1
  36. package/dist/{ChoiceButtons-DJ5EOGUA.css → ChoiceButtons-FLIFXFFS.css} +10 -0
  37. package/dist/ChoiceList/index.js +1 -1
  38. package/dist/{ChoiceList-RBL7FNQL.css → ChoiceList-EA2W6MOS.css} +36 -5
  39. package/dist/Combobox/index.js +3 -2
  40. package/dist/CommandPalette/index.js +3 -2
  41. package/dist/CommentThread/index.js +6 -5
  42. package/dist/Composer/Composer.d.ts +4 -0
  43. package/dist/Composer/index.js +3 -2
  44. package/dist/{Composer-ABGJIAIR.css → Composer-PXITWNEK.css} +26 -15
  45. package/dist/ConfirmField/index.js +3 -2
  46. package/dist/DataTable/index.js +5 -4
  47. package/dist/DataView/index.js +9 -8
  48. package/dist/DatasetSource/DatasetSource.d.ts +4 -0
  49. package/dist/DatasetSource/index.js +1 -1
  50. package/dist/{DatasetSource-XFPZBRXL.css → DatasetSource-SMGX4PS5.css} +38 -4
  51. package/dist/DateTimePicker/index.js +2 -1
  52. package/dist/{DateTimePicker-HG2KQXQ6.css → DateTimePicker-2IVTKFV2.css} +15 -2
  53. package/dist/DocTabsEditor/index.js +4 -3
  54. package/dist/Document/Document.d.ts +15 -3
  55. package/dist/Document/index.js +2 -1
  56. package/dist/{Document-JUGCSQ4L.css → Document-YFWTWXJP.css} +34 -2
  57. package/dist/{Editor-BVQHBF7L.js → Editor-HORWMUM3.js} +2 -1
  58. package/dist/FilterChip/index.js +1 -1
  59. package/dist/{FilterChip-EZ4QMW4E.css → FilterChip-VL33P3JL.css} +5 -1
  60. package/dist/Input/index.js +2 -1
  61. package/dist/{Input-GBZSFXLU.css → Input-ABGOFENS.css} +46 -10
  62. package/dist/LayersList/index.js +1 -1
  63. package/dist/{LayersList-NQZEIPZB.css → LayersList-TBNF4XGL.css} +16 -3
  64. package/dist/LinkInterstitial/index.js +2 -2
  65. package/dist/ListInput/index.js +4 -3
  66. package/dist/LivePreview/LivePreview.d.ts +105 -25
  67. package/dist/LivePreview/budget.d.ts +64 -20
  68. package/dist/LivePreview/index.d.ts +5 -3
  69. package/dist/LivePreview/index.js +1 -1
  70. package/dist/LivePreview/stills.d.ts +57 -0
  71. package/dist/LivePreview-BROGKR4N.css +113 -0
  72. package/dist/PresenterView/index.js +2 -2
  73. package/dist/PrincipalPicker/index.js +4 -3
  74. package/dist/RichEditor/index.js +1 -1
  75. package/dist/Select/index.js +2 -1
  76. package/dist/{Select-A54YS5EP.css → Select-W3CHTZXP.css} +18 -2
  77. package/dist/ShareDialog/index.js +5 -4
  78. package/dist/SheetColumnEditor/index.js +6 -5
  79. package/dist/SheetGrid/index.js +4 -4
  80. package/dist/SlideCompare/index.js +2 -2
  81. package/dist/SlideFilmstrip/index.js +3 -3
  82. package/dist/{SlideFilmstrip-4ITZLMO4.css → SlideFilmstrip-PAT7P4OG.css} +26 -7
  83. package/dist/SlideGrid/index.js +2 -2
  84. package/dist/{SlideGrid-S4LTJ4UU.css → SlideGrid-FJA33DV4.css} +11 -1
  85. package/dist/SlideStage/index.js +1 -1
  86. package/dist/{SlideStage-S2FISF4C.css → SlideStage-ZTTEQSS2.css} +4 -2
  87. package/dist/SourceEditor/index.js +2 -1
  88. package/dist/{SourceEditor-G2C3STPX.css → SourceEditor-QAYE2JS6.css} +19 -12
  89. package/dist/Switcher/index.js +5 -4
  90. package/dist/TagsInput/index.js +3 -2
  91. package/dist/{TagsInput-XMXTI5Q4.css → TagsInput-7EGBBXHS.css} +7 -1
  92. package/dist/ThemeGallery/index.js +1 -1
  93. package/dist/{ThemeGallery-HSUKBDWY.css → ThemeGallery-X35Y25EX.css} +26 -5
  94. package/dist/TimeWindowPicker/index.js +4 -3
  95. package/dist/{TimeWindowPicker-T763GLXH.css → TimeWindowPicker-DEFDV77Z.css} +15 -2
  96. package/dist/TreeCanvas/index.js +3 -3
  97. package/dist/VersionTimeline/index.js +2 -2
  98. package/dist/{chunk-V43UVX4H.js → chunk-27GD7LVR.js} +1 -1
  99. package/dist/{chunk-CCLNGVCM.js → chunk-2DV4THNQ.js} +2 -2
  100. package/dist/{chunk-2CQLNML5.js → chunk-3PTUDKSR.js} +4 -2
  101. package/dist/{chunk-ONL54WMH.js → chunk-46RL3E54.js} +1 -1
  102. package/dist/{chunk-UHJQDFKQ.js → chunk-4ZJLOKSS.js} +1 -1
  103. package/dist/{chunk-ACA27MZH.js → chunk-5QXRI35B.js} +1 -1
  104. package/dist/{chunk-LL5AFXU7.js → chunk-5RT5O4JR.js} +1 -1
  105. package/dist/chunk-66ADEPFB.js +51 -0
  106. package/dist/{chunk-3Y56GQPM.js → chunk-7VAUGG6B.js} +1 -1
  107. package/dist/{chunk-NKZCJRKO.js → chunk-APDKUGSH.js} +2 -2
  108. package/dist/{chunk-YSJC7AZC.js → chunk-BWOIUOO3.js} +1 -1
  109. package/dist/{chunk-PI7HKLIT.js → chunk-D7GNNID2.js} +3 -1
  110. package/dist/{chunk-THROPJZC.js → chunk-DEMALFHY.js} +1 -1
  111. package/dist/chunk-EOQFPZEE.js +138 -0
  112. package/dist/{chunk-QFNWMWWY.js → chunk-ES4RKQ7B.js} +4 -4
  113. package/dist/{chunk-J6YZ4IYV.js → chunk-FG4O64DV.js} +3 -3
  114. package/dist/{chunk-E35CMI5D.js → chunk-FHHYXZSP.js} +31 -13
  115. package/dist/{chunk-AYB6AYNH.js → chunk-GMLAKNFY.js} +1 -1
  116. package/dist/{chunk-ZB5O3ELS.js → chunk-GRYZ5EP3.js} +4 -2
  117. package/dist/{chunk-ILAEBSLJ.js → chunk-H5NOLRGH.js} +2 -2
  118. package/dist/{chunk-W3UVOZKL.js → chunk-IPAU6FLH.js} +6 -2
  119. package/dist/{chunk-Z6VW6CXX.js → chunk-IQH3DDZ2.js} +2 -2
  120. package/dist/{chunk-6QFAK2WV.js → chunk-IUYUS2SO.js} +4 -1
  121. package/dist/{chunk-AXBRWRGV.js → chunk-JQLS3MZB.js} +1 -1
  122. package/dist/{chunk-FGYET26P.js → chunk-KJW2AS57.js} +1 -1
  123. package/dist/{chunk-QIXMNOBD.js → chunk-KYZMN6I6.js} +2 -2
  124. package/dist/{chunk-73A7D5CE.js → chunk-L4WZSVMT.js} +3 -1
  125. package/dist/{chunk-W7QBBKUE.js → chunk-MJW6SQYB.js} +7 -3
  126. package/dist/{chunk-GMU6SQ6B.js → chunk-MRMHZ437.js} +3 -3
  127. package/dist/{chunk-ULPL26BU.js → chunk-N5SKHIAP.js} +1 -1
  128. package/dist/{chunk-LV4APO72.js → chunk-NQGPD6NX.js} +1 -1
  129. package/dist/{chunk-7UYONN6K.js → chunk-OSZDHN5Z.js} +2 -2
  130. package/dist/chunk-P6WFZDKS.js +111 -0
  131. package/dist/{chunk-CPEPST4S.js → chunk-PJIPUEJ3.js} +1 -1
  132. package/dist/{chunk-QS4ZGTEU.js → chunk-PPFX6GRK.js} +1 -1
  133. package/dist/{chunk-7DZDSSJS.js → chunk-RH2NCQBZ.js} +5 -4
  134. package/dist/{chunk-3VD3G3IL.js → chunk-T5RQGI6O.js} +1 -1
  135. package/dist/{chunk-F2KY4RLI.js → chunk-TVRBQMIX.js} +5 -3
  136. package/dist/{chunk-QEFHYUCY.js → chunk-UWGUKMBK.js} +1 -1
  137. package/dist/{chunk-5YLON2PW.js → chunk-UYZZV4DZ.js} +1 -1
  138. package/dist/{chunk-BQ7AKL2N.js → chunk-VKKUGZ3G.js} +3 -1
  139. package/dist/{chunk-DEJHAOC5.js → chunk-WMXAX6VA.js} +1 -1
  140. package/dist/{chunk-6JVRY5DQ.js → chunk-WNAYQQ6Y.js} +2 -2
  141. package/dist/{chunk-VDPJGP4Q.js → chunk-WX2NIG4G.js} +1 -1
  142. package/dist/{chunk-ZU3DUXD2.js → chunk-WZGYIVYH.js} +1 -1
  143. package/dist/chunk-XGBLRDSU.js +446 -0
  144. package/dist/{chunk-22CQQDFW.js → chunk-XMRTFPWX.js} +2 -2
  145. package/dist/{chunk-HUVG2FFT.js → chunk-Y5BD4MTE.js} +4 -2
  146. package/dist/chunk-YSGLEHND.js +56 -0
  147. package/dist/generated/index.d.ts +2 -0
  148. package/dist/generated/index.js +95 -92
  149. package/dist/index.js +95 -92
  150. package/dist/styles.css +862 -130
  151. package/dist/utils/focusModality.d.ts +41 -0
  152. package/dist/utils/index.d.ts +2 -0
  153. package/dist/utils/index.js +2 -1
  154. package/package.json +3 -3
  155. package/dist/LivePreview-SRO7KHO4.css +0 -65
  156. package/dist/chunk-KF6YGL4B.js +0 -160
  157. package/dist/chunk-TYKQ33CL.js +0 -35
  158. package/dist/{chunk-3P4Y5RX6.js → chunk-4BYHAOHH.js} +1 -1
  159. package/dist/{chunk-3WCNHYXE.js → chunk-5BP6IS3N.js} +0 -0
  160. package/dist/{chunk-KD2IRYCT.js → chunk-5WDXPHEW.js} +1 -1
  161. package/dist/{chunk-OSFA5ROT.js → chunk-FEJANUZK.js} +0 -0
  162. package/dist/{chunk-FJJHD73S.js → chunk-GYBDPCRC.js} +1 -1
  163. package/dist/{chunk-VHZ3AXJD.js → chunk-NQCY44B3.js} +1 -1
  164. package/dist/{chunk-FF5OZV77.js → chunk-W3HYWD63.js} +2 -2
@@ -1,10 +1,11 @@
1
- export { ListInput } from '../chunk-Z6VW6CXX.js';
2
- import '../chunk-6QFAK2WV.js';
1
+ export { ListInput } from '../chunk-IQH3DDZ2.js';
2
+ import '../chunk-IUYUS2SO.js';
3
3
  import '../chunk-SMBKXWML.js';
4
+ import '../chunk-YSGLEHND.js';
4
5
  import '../chunk-PQADV6P6.js';
6
+ import '../chunk-RSAQOKH3.js';
5
7
  import '../chunk-OMV5W53A.js';
6
8
  import '../chunk-R25RGPUB.js';
7
- import '../chunk-RSAQOKH3.js';
8
9
  import '../chunk-4FQT6ZAY.js';
9
10
  import '../chunk-BZFWDIV6.js';
10
11
  import '../chunk-ODEQTPFM.js';
@@ -1,27 +1,54 @@
1
1
  import { type ReactNode } from 'react';
2
2
  /**
3
- * Real content drawn small: a live, scaled-down snapshot of a page, a grid or
4
- * a frame inside a fixed box, the way a gallery card previews what it opens.
3
+ * Real content drawn small, once: a scaled-down snapshot of a page, a grid or
4
+ * a slide, rendered by the content's own renderer from its real data and
5
+ * then frozen, the way a gallery card previews what it opens.
5
6
  *
6
7
  * LAID OUT AT FULL SIZE, THEN SCALED. The content is given `width` CSS pixels
7
8
  * to lay itself out in, exactly as it would on its own page, and the whole is
8
9
  * scaled down to the box with a CSS transform, so the preview is the page
9
10
  * itself at a smaller size and never a second layout of it. Left out, the
10
- * content fills the box unscaled (a slide stage that scales itself).
11
+ * content fills the box unscaled.
11
12
  *
12
- * DRAWN ONLY WHEN IT CAN BE SEEN, AND ONLY SO MANY AT ONCE. The content is
13
- * mounted while the box is within `rootMargin` of the viewport and the
14
- * shared budget (`LivePreviewBudgetProvider`, twelve by default) grants it a
15
- * slot, and unmounted when it scrolls away, giving the slot back. Until the
16
- * content says it has drawn (`useLivePreview().ready()`), while it waits for a
17
- * slot, when it failed (`fail()`) and in a browser with no
18
- * IntersectionObserver, the box shows `fallback`.
13
+ * RENDERED ONCE, THEN A STILL COPY. The content is mounted once the box has
14
+ * stayed within `rootMargin` (a screen, by default) of what its scroll
15
+ * container shows for `dwellMs` and the shared budget
16
+ * (`LivePreviewBudgetProvider`) grants it one of the renders it allows at
17
+ * once. It reads what it needs and draws, out of sight behind the stand-in.
18
+ * When it says it has drawn (`useLivePreview().ready()`) its render is given
19
+ * to the next box, and once the page's fonts have loaded and the layout has
20
+ * settled, what it drew is copied (its DOM, cloned: `stills.ts`), the copy
21
+ * fades in over the stand-in, and the content is unmounted in the same
22
+ * commit. From then on the preview holds nothing live: no React tree under
23
+ * it, no subscription, no observer of its own and no timer, and it never
24
+ * reads, polls or redraws again. A copy laid out at `width` is scaled to its
25
+ * box by one observer the provider's copies share, so a resized window
26
+ * rescales it rather than drawing it again; one with no `width` is drawn
27
+ * again only if its box changes size.
19
28
  *
20
- * NEVER INTERACTIVE, NEVER ANNOUNCED. The live layer is `inert`, takes no
21
- * pointer and is hidden from assistive technology: nothing in it can be
22
- * focused or clicked, and whatever surrounds the preview (a card's link)
23
- * names what it shows. The swap from the stand-in to the content is a short
24
- * fade, and none under `prefers-reduced-motion`.
29
+ * KEPT FOR THE PAGE. With a `snapshot` key, the copy is kept by the provider
30
+ * under that key, and a preview mounted again under it (a card back after a
31
+ * filter, a change of shape or a page of results) shows the same copy at
32
+ * once, with nothing read. A page loaded afresh draws afresh.
33
+ *
34
+ * A FRAME CANNOT BE COPIED. Content that runs a page in a frame (`frame`)
35
+ * lives in another document: there is nothing in this one to clone, and a
36
+ * clone of the frame would load the page again. So a framed preview keeps its
37
+ * frame once drawn, fading it in over the stand-in. Kept frames are capped
38
+ * apart; one the reader has left is taken back only when a frame coming near
39
+ * needs its place, and shows its stand-in until it is drawn again.
40
+ *
41
+ * Until it has drawn, while it waits for a render, when it failed (`fail()`,
42
+ * or no drawing within `LIVE_PREVIEW_RENDER_MS`), and in a browser with no
43
+ * IntersectionObserver, the box shows `fallback`. What has drawn is shown
44
+ * over it, and the stand-in is hidden once the fade is done: fading the
45
+ * stand-in out at the same time showed both at half strength halfway through.
46
+ *
47
+ * NEVER INTERACTIVE, NEVER ANNOUNCED. The live layer and the copy are
48
+ * `inert`, take no pointer and are hidden from assistive technology: nothing
49
+ * in them can be focused or clicked, and whatever surrounds the preview (a
50
+ * card's link) names what it shows. Under `prefers-reduced-motion` nothing
51
+ * fades.
25
52
  */
26
53
  /**
27
54
  * How long a box stays near the viewport before its content is asked for: a
@@ -29,39 +56,92 @@ import { type ReactNode } from 'react';
29
56
  * past does not.
30
57
  */
31
58
  export declare const LIVE_PREVIEW_DWELL_MS = 120;
32
- /** Gives the previews under it a budget of their own, `max` live at once. */
33
- export declare function LivePreviewBudgetProvider({ max, children }: {
59
+ /**
60
+ * How far ahead of what its scroll container shows a box starts rendering: a
61
+ * whole screen in each direction. A snapshot costs nothing once it is taken,
62
+ * so drawing a screen ahead is paid once, and it is what lets a reader
63
+ * scrolling at any pace meet every card already drawn. Measured on a gallery
64
+ * of 44 cards at 1440 by 900 with the CPU slowed fourfold, 200 pixels ahead
65
+ * left cards on screen before their first draw in about sixty samples of a
66
+ * scroll down and back; a screen ahead left none, and the first screen was
67
+ * drawn within a frame or two of the time it took before.
68
+ */
69
+ export declare const LIVE_PREVIEW_MARGIN = "100% 0px";
70
+ /**
71
+ * The longest a render may take before it gives up and keeps its stand-in.
72
+ * A preview is a glimpse: content that has not drawn in fifteen seconds is
73
+ * waiting on a read that is failing slowly, and holding one of the budget's
74
+ * few renders for it would hold the rest of a gallery up behind it. Fifteen
75
+ * is past the ten seconds a page in a frame is given to answer at all
76
+ * (`FRAME_HELLO_TIMEOUT_MS`) and its grace after, so a frame settles itself
77
+ * first.
78
+ */
79
+ export declare const LIVE_PREVIEW_RENDER_MS = 15000;
80
+ /**
81
+ * Gives the previews under it a budget and a store of their own: `max`
82
+ * rendering at once, `maxFrames` frames kept, and up to `kept` still copies
83
+ * kept by key for as long as the provider is mounted.
84
+ */
85
+ export declare function LivePreviewBudgetProvider({ max, maxFrames, kept, children, }: {
34
86
  max?: number | undefined;
87
+ maxFrames?: number | undefined;
88
+ kept?: number | undefined;
35
89
  children: ReactNode;
36
90
  }): import("react").JSX.Element;
37
91
  export interface LivePreviewSignals {
38
- /** The content has drawn: the stand-in gives way to it. */
92
+ /** The content has drawn: it is copied and the copy shown, or for a frame, the frame is shown. */
39
93
  ready: () => void;
40
- /** The content has nothing to draw or could not draw: the stand-in stays, and the slot is given back. */
94
+ /** The content has nothing to draw or could not draw: the stand-in stays, and the render is given back. */
41
95
  fail: () => void;
42
96
  }
43
97
  /** What live content tells the preview around it. Outside one, both do nothing. */
44
98
  export declare function useLivePreview(): LivePreviewSignals;
45
- /** Where a preview is in its life. */
99
+ /**
100
+ * Where a preview is in its life: `idle` (not asked for), `waiting` (asked,
101
+ * no render yet), `live` (rendering), `ready` (drawn: a still copy, or a kept
102
+ * frame) and `failed` (the stand-in for good).
103
+ */
46
104
  export type LivePreviewState = 'idle' | 'waiting' | 'live' | 'ready' | 'failed';
47
105
  export interface LivePreviewProps {
48
- /** What is drawn small. Mounted only while the preview is live. */
106
+ /** What is drawn small. Mounted only while it renders, or for a frame while it is kept. */
49
107
  children: ReactNode;
50
- /** The stand-in, drawn whenever the content is not. */
108
+ /** The stand-in, drawn whenever nothing else is. */
51
109
  fallback: ReactNode;
52
110
  /** The width, in CSS pixels, the content lays itself out at before it is scaled to the box. */
53
111
  width?: number | undefined;
54
- /** How near the viewport the box comes before its content is mounted. */
112
+ /** How near what its scroll container shows the box comes before its content is rendered (`LIVE_PREVIEW_MARGIN`). */
55
113
  rootMargin?: string | undefined;
56
- /** Nothing live is drawn: the stand-in only (no content to show, or a host that has turned previews off). */
114
+ /** Nothing is drawn: the stand-in only (no content to show, or a host that has turned previews off). */
57
115
  disabled?: boolean | undefined;
116
+ /**
117
+ * The content runs a page in a frame: it is kept rather than copied, and
118
+ * counts against the budget's frames for as long as it is.
119
+ */
120
+ frame?: boolean | undefined;
121
+ /**
122
+ * What is drawn, as a key: previews under one provider with the same key
123
+ * share one still copy, so a preview mounted again shows it at once and
124
+ * renders nothing. A key names a version of the content; content that has
125
+ * changed takes a new key and is drawn afresh.
126
+ */
127
+ snapshot?: string | undefined;
58
128
  /** How long the box stays near the viewport before its content is asked for, in ms. */
59
129
  dwellMs?: number | undefined;
60
130
  /** Told each time the state moves, for a host that measures. */
61
131
  onStateChange?: ((state: LivePreviewState) => void) | undefined;
62
132
  className?: string | undefined;
63
133
  }
64
- export declare function LivePreview({ children, fallback, width, rootMargin, disabled, dwellMs, onStateChange, className }: LivePreviewProps): import("react").JSX.Element;
134
+ /**
135
+ * The element a box is scrolled by: the nearest ancestor that scrolls, or
136
+ * null for the window. An observer's margin grows its root and nothing else,
137
+ * and every scroller between the box and the root clips it at its own edge.
138
+ */
139
+ export declare function scrollRoot(el: Element): Element | null;
140
+ /**
141
+ * A preview whose `snapshot` key changes is another preview: what it holds
142
+ * belongs to the content it drew, so it starts again under the new key.
143
+ */
144
+ export declare function LivePreview(props: LivePreviewProps): import("react").JSX.Element;
65
145
  export interface PreviewScaleProps {
66
146
  children: ReactNode;
67
147
  /** The width, in CSS pixels, the content is laid out at. */
@@ -1,34 +1,78 @@
1
1
  /**
2
- * How many live previews draw at once: the budget a gallery's cards share.
2
+ * How many live previews render at once: the budget a gallery's cards share.
3
3
  *
4
- * WHY A BUDGET. A live preview is real content drawn small: a page of prose,
5
- * a grid of cells, a slide, or a sandboxed frame running a page of its own. A
6
- * gallery of two hundred artifacts that drew every one would run two hundred
7
- * of them, most never seen. A preview asks for a slot when it comes near the
8
- * viewport and gives it back when it leaves; past the cap it waits, drawing
9
- * its stand-in, and is granted a slot the moment one is free, the oldest ask
10
- * first.
4
+ * A PREVIEW RENDERS ONCE. Real content (a page of prose, a grid of cells, a
5
+ * slide, a board of figures) is mounted near the viewport, reads what it
6
+ * needs, draws, and is then kept as a still copy with nothing live behind it.
7
+ * What costs is the RENDER: the reads, the mount and the layout, all at once
8
+ * as a row of cards scrolls near. So the budget bounds how many render at the
9
+ * same moment (`max`), and a slot is given back the moment its content has
10
+ * drawn; past the cap an ask waits, drawing its stand-in, and is granted the
11
+ * moment a render finishes, the oldest ask first.
12
+ *
13
+ * A FRAME IS THE EXCEPTION. A page in a frame lives in another document and
14
+ * cannot be copied, so a framed preview that has drawn keeps its page, and a
15
+ * page running in a frame is by far the dearest thing a preview holds. Frames
16
+ * kept are capped apart (`maxFrames`): a kept frame that leaves the viewport
17
+ * is parked, and taken back (`reclaim`) only when a frame coming near needs
18
+ * its place, the one the reader left longest ago first. One on screen is
19
+ * never taken back for another.
11
20
  *
12
21
  * Plain bookkeeping with no layout, so it is tested without a browser.
13
22
  */
14
23
  /**
15
- * The most previews live at once by default. A gallery at 1440 shows two or
16
- * three rows of three cards with a row of margin either side, so twelve keeps
17
- * everything a reader can scroll to in a moment live, and is the number of
18
- * pages a design's canvas already runs at once (`CANVAS_BOARD_MAX_LIVE`).
24
+ * The most previews rendering at once. Six is the number of connections a
25
+ * browser opens to one host over HTTP/1.1, which is how a preview's reads
26
+ * (an outline, a board and its datasets, a frame's ticket) reach their
27
+ * server: a seventh render would only queue its reads behind the first six,
28
+ * while holding its mount and layout open beside them.
29
+ */
30
+ export declare const LIVE_PREVIEW_MAX = 6;
31
+ /**
32
+ * The most frames kept at once. A frame is a page in another document, often
33
+ * in a process of its own; twelve is the number of pages a design's canvas
34
+ * runs at once (`CANVAS_BOARD_MAX_LIVE`).
19
35
  */
20
- export declare const LIVE_PREVIEW_MAX = 12;
36
+ export declare const LIVE_PREVIEW_MAX_FRAMES = 12;
37
+ /** One preview's hold on the budget, from its ask to its release. */
38
+ export interface LivePreviewSlot {
39
+ /** Gives back everything it holds, or withdraws the ask if it was never granted. Calling it again does nothing. */
40
+ release(): void;
41
+ /**
42
+ * The content has drawn: its render slot is given back. A frame keeps its
43
+ * place among the frames until it is released or reclaimed; anything else
44
+ * holds nothing more, as if released.
45
+ */
46
+ drawn(): void;
47
+ /**
48
+ * A kept frame left the viewport: it stays, and may be reclaimed when a
49
+ * frame coming near needs its place. Before the grant the ask is
50
+ * withdrawn, since nothing was drawn. A render that is not a frame runs on
51
+ * to its end wherever it is, so for one this does nothing.
52
+ */
53
+ park(): void;
54
+ /** Back near the viewport: answers whether the slot is still held, and if so it is no longer reclaimable. */
55
+ resume(): boolean;
56
+ }
21
57
  export interface LivePreviewBudget {
22
- /** The most slots granted at once. */
58
+ /** The most renders at once. */
23
59
  readonly max: number;
60
+ /** The most frames kept at once. */
61
+ readonly maxFrames: number;
24
62
  /**
25
- * Asks for a slot. `grant` is called once, now or when a slot frees. The
26
- * answer gives the slot back, or withdraws the ask if it was never granted;
27
- * calling it again does nothing.
63
+ * Asks for a slot. `grant` is called once, now or when a slot frees.
64
+ * `reclaim` is called if a parked frame is taken back, so the holder tears
65
+ * its page down; nothing else is ever reclaimed. `frame` says the content
66
+ * runs a page in a frame, which counts against `maxFrames` for as long as
67
+ * it is kept.
28
68
  */
29
- request(grant: () => void): () => void;
30
- /** Slots held now, for a test or a measurement. */
69
+ request(grant: () => void, reclaim?: () => void, frame?: boolean): LivePreviewSlot;
70
+ /** Renders in progress, for a test or a measurement. */
31
71
  live(): number;
72
+ /** Frames kept, rendering or drawn. */
73
+ frames(): number;
74
+ /** Kept frames that left the viewport. */
75
+ parked(): number;
32
76
  /** Asks waiting now. */
33
77
  waiting(): number;
34
78
  }
@@ -47,4 +91,4 @@ export declare const immediately: LivePreviewSchedule;
47
91
  * preview does.
48
92
  */
49
93
  export declare const perFrame: LivePreviewSchedule;
50
- export declare function createLivePreviewBudget(max?: number, schedule?: LivePreviewSchedule): LivePreviewBudget;
94
+ export declare function createLivePreviewBudget(max?: number, schedule?: LivePreviewSchedule, maxFrames?: number): LivePreviewBudget;
@@ -1,5 +1,7 @@
1
1
  import './LivePreview.css';
2
- export { LIVE_PREVIEW_DWELL_MS, LivePreview, LivePreviewBudgetProvider, PreviewScale, useLivePreview } from './LivePreview.js';
2
+ export { LIVE_PREVIEW_DWELL_MS, LIVE_PREVIEW_MARGIN, LIVE_PREVIEW_RENDER_MS, LivePreview, LivePreviewBudgetProvider, PreviewScale, useLivePreview } from './LivePreview.js';
3
3
  export type { LivePreviewProps, LivePreviewSignals, LivePreviewState, PreviewScaleProps } from './LivePreview.js';
4
- export { createLivePreviewBudget, immediately, LIVE_PREVIEW_MAX, perFrame } from './budget.js';
5
- export type { LivePreviewBudget, LivePreviewSchedule } from './budget.js';
4
+ export { createLivePreviewBudget, immediately, LIVE_PREVIEW_MAX, LIVE_PREVIEW_MAX_FRAMES, perFrame } from './budget.js';
5
+ export type { LivePreviewBudget, LivePreviewSchedule, LivePreviewSlot } from './budget.js';
6
+ export { createLivePreviewStills, LIVE_PREVIEW_STILLS_KEPT } from './stills.js';
7
+ export type { LivePreviewKept, LivePreviewStill, LivePreviewStills } from './stills.js';
@@ -1,2 +1,2 @@
1
- export { LIVE_PREVIEW_DWELL_MS, LIVE_PREVIEW_MAX, LivePreview, LivePreviewBudgetProvider, PreviewScale, createLivePreviewBudget, immediately, perFrame, useLivePreview } from '../chunk-KF6YGL4B.js';
1
+ export { LIVE_PREVIEW_DWELL_MS, LIVE_PREVIEW_MARGIN, LIVE_PREVIEW_MAX, LIVE_PREVIEW_MAX_FRAMES, LIVE_PREVIEW_RENDER_MS, LIVE_PREVIEW_STILLS_KEPT, LivePreview, LivePreviewBudgetProvider, PreviewScale, createLivePreviewBudget, createLivePreviewStills, immediately, perFrame, useLivePreview } from '../chunk-XGBLRDSU.js';
2
2
  import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Still copies: what a live preview drew, kept as plain DOM with nothing live
3
+ * behind it, and where they are kept between one mount and the next.
4
+ *
5
+ * A COPY IS THE DRAWN DOM, CLONED. It holds no React tree, no subscription,
6
+ * no observer and no timer: it is what the content looked like the moment it
7
+ * said it had drawn, and it never changes after. Nothing in it loads or runs:
8
+ * a canvas is copied as an image of what it drew, and anything that would
9
+ * load again (a frame, a video, audio, an embedded object) is left out of
10
+ * the copy, since a clone of one starts again from nothing.
11
+ *
12
+ * KEPT BY KEY for as long as the store lives. A gallery's cards mount and
13
+ * unmount as its filters, shape and pages change; a card that comes back
14
+ * under the same key is given the copy it already drew, so it reads nothing
15
+ * and draws nothing again until the page is loaded afresh.
16
+ */
17
+ /** A still copy: the nodes, and the width they were laid out at before they were scaled. */
18
+ export interface LivePreviewStill {
19
+ nodes: Node[];
20
+ /** The layout width the content was given, or undefined where it filled the box at its own size. */
21
+ width: number | undefined;
22
+ /** The box's size when it was drawn: a copy with no layout width is good at this size only. */
23
+ size: {
24
+ w: number;
25
+ h: number;
26
+ };
27
+ }
28
+ /** What a key holds: a still copy, or a preview that had nothing to draw. */
29
+ export type LivePreviewKept = LivePreviewStill | 'failed';
30
+ export interface LivePreviewStills {
31
+ get(key: string): LivePreviewKept | undefined;
32
+ put(key: string, kept: LivePreviewKept): void;
33
+ forget(key: string): void;
34
+ /**
35
+ * Tells `told` the box's size whenever it changes, and answers how to stop.
36
+ * ONE ResizeObserver for every copy the store's previews show: a copy is
37
+ * scaled to its box when the box changes size (a window resized, a panel
38
+ * opened), and a gallery holds one observer rather than one per card.
39
+ */
40
+ watch(el: Element, told: (size: {
41
+ w: number;
42
+ h: number;
43
+ }) => void): () => void;
44
+ }
45
+ /**
46
+ * The most still copies a store keeps, the oldest dropped first. Two hundred
47
+ * is four pages of a listing at fifty, the size a gallery asks the engine
48
+ * for; a preview whose copy was dropped draws again when it comes back.
49
+ */
50
+ export declare const LIVE_PREVIEW_STILLS_KEPT = 200;
51
+ export declare function createLivePreviewStills(kept?: number): LivePreviewStills;
52
+ /**
53
+ * A still copy of `nodes`: cloned, each canvas replaced by an image of what
54
+ * it drew (or left blank where its pixels cannot be read), and every element
55
+ * that would load again left out.
56
+ */
57
+ export declare function copyOf(nodes: readonly Node[]): Node[];
@@ -0,0 +1,113 @@
1
+ /*
2
+ * A live preview: the stand-in, the still copy of what the content drew and
3
+ * the live layer it is drawn in, stacked in that order in one box. The box
4
+ * takes its size from its parent (a card's preview area), so it fills it and
5
+ * clips whatever the content lays out past its edge.
6
+ */
7
+
8
+ .crewlet-live-preview {
9
+ position: relative;
10
+ display: block;
11
+ width: 100%;
12
+ height: 100%;
13
+ overflow: hidden;
14
+ contain: layout paint;
15
+ }
16
+
17
+ .crewlet-live-preview__fallback {
18
+ position: absolute;
19
+ inset: 0;
20
+ display: flex;
21
+ }
22
+
23
+ /* THE STILL COPY: static DOM over the stand-in, which it hides. A copy just
24
+ taken fades in; one the preview was given back from its store is simply
25
+ there, so a card scrolled or filtered back to is as it was. */
26
+ .crewlet-live-preview__still {
27
+ position: absolute;
28
+ inset: 0;
29
+ display: block;
30
+ overflow: hidden;
31
+ pointer-events: none;
32
+ user-select: none;
33
+ }
34
+
35
+ .crewlet-live-preview[data-fresh] > .crewlet-live-preview__still {
36
+ animation: crewlet-live-preview-arrive var(--motion-duration-base) var(--motion-easing-out);
37
+ }
38
+
39
+ @keyframes crewlet-live-preview-arrive {
40
+ from {
41
+ opacity: 0;
42
+ }
43
+ }
44
+
45
+ /* A COPY IS FROZEN: what it drew never moves, so nothing in it animates or
46
+ transitions, whatever the content's own styles ask of the elements it
47
+ copied (a skeleton's shimmer, a chart's entrance). */
48
+ .crewlet-live-preview__still *,
49
+ .crewlet-live-preview__still *::before,
50
+ .crewlet-live-preview__still *::after {
51
+ animation: none !important;
52
+ transition: none !important;
53
+ }
54
+
55
+ /* THE LIVE LAYER renders out of sight: content that is copied is never seen
56
+ live, only its copy is. A frame's page is kept rather than copied, so a
57
+ framed preview's live layer is what fades in once it has drawn. */
58
+ .crewlet-live-preview__live {
59
+ position: absolute;
60
+ inset: 0;
61
+ display: block;
62
+ overflow: hidden;
63
+ opacity: 0;
64
+ pointer-events: none;
65
+ user-select: none;
66
+ }
67
+
68
+ .crewlet-live-preview[data-frame] > .crewlet-live-preview__live {
69
+ transition: opacity var(--motion-duration-base) var(--motion-easing-out);
70
+ }
71
+
72
+ .crewlet-live-preview[data-frame][data-state='ready'] > .crewlet-live-preview__live {
73
+ opacity: 1;
74
+ }
75
+
76
+ /* LAID OUT AT ITS OWN SIZE from the top left corner, and scaled from there:
77
+ to the box's width, its top left the box's, or whole and centred. */
78
+ .crewlet-preview-scale {
79
+ position: absolute;
80
+ inset: 0;
81
+ display: block;
82
+ overflow: hidden;
83
+ }
84
+
85
+ .crewlet-preview-scale__layer {
86
+ position: absolute;
87
+ top: 0;
88
+ left: 0;
89
+ display: block;
90
+ overflow: hidden;
91
+ transform-origin: 0 0;
92
+ }
93
+
94
+ /* WHAT IS UNDER A DRAWING is hidden only once it has faded in. Fading the
95
+ stand-in out at the same time showed both at half strength halfway
96
+ through: a double exposure. */
97
+ .crewlet-live-preview[data-state='ready'] > .crewlet-live-preview__fallback {
98
+ visibility: hidden;
99
+ /* Visibility is discrete and stays visible for the whole of a transition
100
+ to hidden, so this holds it exactly as long as the fade above. A copy
101
+ given back from the store is ready from its first style, which runs no
102
+ transition, so its stand-in is never shown at all. */
103
+ transition: visibility var(--motion-duration-base) linear;
104
+ }
105
+
106
+ @media (prefers-reduced-motion: reduce) {
107
+ .crewlet-live-preview[data-fresh] > .crewlet-live-preview__still,
108
+ .crewlet-live-preview[data-frame] > .crewlet-live-preview__live,
109
+ .crewlet-live-preview[data-state='ready'] > .crewlet-live-preview__fallback {
110
+ animation: none;
111
+ transition: none;
112
+ }
113
+ }
@@ -1,6 +1,6 @@
1
- export { PresenterView, formatStopwatch } from '../chunk-THROPJZC.js';
1
+ export { PresenterView, formatStopwatch } from '../chunk-DEMALFHY.js';
2
+ import '../chunk-NQGPD6NX.js';
2
3
  import '../chunk-6VOS2GMB.js';
3
- import '../chunk-LV4APO72.js';
4
4
  import '../chunk-RK4XPHVG.js';
5
5
  import '../chunk-OMV5W53A.js';
6
6
  import '../chunk-R25RGPUB.js';
@@ -1,10 +1,11 @@
1
- export { PrincipalPicker } from '../chunk-AYB6AYNH.js';
2
- import '../chunk-QS4ZGTEU.js';
1
+ export { PrincipalPicker } from '../chunk-GMLAKNFY.js';
2
+ import '../chunk-PPFX6GRK.js';
3
3
  import '../chunk-F73MC7EZ.js';
4
- import '../chunk-6QFAK2WV.js';
5
4
  import '../chunk-CI3VPIJN.js';
6
5
  import '../chunk-5AQBPHZD.js';
7
6
  import '../chunk-PZKHBB7D.js';
7
+ import '../chunk-IUYUS2SO.js';
8
+ import '../chunk-YSGLEHND.js';
8
9
  import '../chunk-PQADV6P6.js';
9
10
  import '../chunk-R25RGPUB.js';
10
11
  import '../chunk-4FQT6ZAY.js';
@@ -1,4 +1,4 @@
1
- export { RichEditor, preloadRichEditor } from '../chunk-3VD3G3IL.js';
1
+ export { RichEditor, preloadRichEditor } from '../chunk-T5RQGI6O.js';
2
2
  export { RICH_EDITOR_LABELS, richEditorLabels } from '../chunk-CSQTDGTS.js';
3
3
  import '../chunk-BAKPMH3S.js';
4
4
  import '../chunk-SZZRIHGT.js';
@@ -1,5 +1,6 @@
1
- export { Select } from '../chunk-BQ7AKL2N.js';
1
+ export { Select } from '../chunk-VKKUGZ3G.js';
2
2
  import '../chunk-F73MC7EZ.js';
3
+ import '../chunk-YSGLEHND.js';
3
4
  import '../chunk-OMV5W53A.js';
4
5
  import '../chunk-R25RGPUB.js';
5
6
  import '../chunk-ODEQTPFM.js';
@@ -71,10 +71,16 @@
71
71
  * leave the other bare.
72
72
  */
73
73
  .crewlet-select:focus-within {
74
- outline: 1px solid var(--color-focus);
74
+ outline: 2px solid var(--color-focus);
75
75
  outline-offset: -1px;
76
76
  }
77
77
 
78
+ /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
79
+ :root[data-crewlet-focus='pointer'] .crewlet-select:focus-within {
80
+ outline-width: 1px;
81
+ outline-color: var(--color-border-selected);
82
+ }
83
+
78
84
  /*
79
85
  * A FILTER THAT IS ON. The accent border says where the reader is and the
80
86
  * accent INK says what it is set to. It used to be the accent FILL with the
@@ -133,6 +139,10 @@
133
139
  outline-color: var(--color-feedback-danger);
134
140
  }
135
141
 
142
+ :root[data-crewlet-focus='pointer'] .crewlet-select.is-error:focus-within {
143
+ outline-color: var(--color-feedback-danger);
144
+ }
145
+
136
146
  .crewlet-select.is-disabled {
137
147
  opacity: 0.6;
138
148
  cursor: not-allowed;
@@ -426,10 +436,16 @@ svg.crewlet-select__chevron {
426
436
  * outset ring on the input would be cut by the menu's own `overflow: hidden`.
427
437
  */
428
438
  .crewlet-select__search:focus-within {
429
- outline: 1px solid var(--color-focus);
439
+ outline: 2px solid var(--color-focus);
430
440
  outline-offset: -1px;
431
441
  }
432
442
 
443
+ /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
444
+ :root[data-crewlet-focus='pointer'] .crewlet-select__search:focus-within {
445
+ outline-width: 1px;
446
+ outline-color: var(--color-border-selected);
447
+ }
448
+
433
449
  .crewlet-select__search {
434
450
  display: flex;
435
451
  align-items: center;
@@ -1,14 +1,15 @@
1
- export { ARTIFACT_ROLES, SHAREABLE_ROLES, ShareDialog, roleAtLeast } from '../chunk-CCLNGVCM.js';
2
- import '../chunk-BQ7AKL2N.js';
1
+ export { ARTIFACT_ROLES, SHAREABLE_ROLES, ShareDialog, roleAtLeast } from '../chunk-2DV4THNQ.js';
2
+ import '../chunk-VKKUGZ3G.js';
3
+ import '../chunk-XEGZHHRH.js';
4
+ import '../chunk-F73MC7EZ.js';
3
5
  import '../chunk-W46LPU4R.js';
4
6
  import '../chunk-STJ7QBC3.js';
5
7
  import '../chunk-DTIW4CHZ.js';
6
- import '../chunk-XEGZHHRH.js';
7
- import '../chunk-F73MC7EZ.js';
8
8
  import '../chunk-SZZRIHGT.js';
9
9
  import '../chunk-CI3VPIJN.js';
10
10
  import '../chunk-5AQBPHZD.js';
11
11
  import '../chunk-PZKHBB7D.js';
12
+ import '../chunk-YSGLEHND.js';
12
13
  import '../chunk-PQADV6P6.js';
13
14
  import '../chunk-RTPQDNW3.js';
14
15
  import '../chunk-OMV5W53A.js';
@@ -1,17 +1,18 @@
1
- export { SHEET_COLUMN_EDITOR_LABELS, SheetColumnEditor, SheetColumnTypeGlyph } from '../chunk-J6YZ4IYV.js';
2
- import '../chunk-BQ7AKL2N.js';
1
+ export { SHEET_COLUMN_EDITOR_LABELS, SheetColumnEditor, SheetColumnTypeGlyph } from '../chunk-FG4O64DV.js';
2
+ import '../chunk-VKKUGZ3G.js';
3
3
  import '../chunk-FFMCMSJB.js';
4
4
  import '../chunk-F73MC7EZ.js';
5
5
  import '../chunk-LFSIKGRQ.js';
6
6
  import '../chunk-Z7JYG5TF.js';
7
7
  import '../chunk-SUXP4OBT.js';
8
8
  import '../chunk-AYKXMIOR.js';
9
- import '../chunk-CPEPST4S.js';
10
- import '../chunk-6QFAK2WV.js';
11
- import '../chunk-SMBKXWML.js';
9
+ import '../chunk-PJIPUEJ3.js';
12
10
  import '../chunk-CCAXYHQS.js';
13
11
  import '../chunk-VL6CUNSX.js';
14
12
  import '../chunk-RKKO7QHH.js';
13
+ import '../chunk-IUYUS2SO.js';
14
+ import '../chunk-SMBKXWML.js';
15
+ import '../chunk-YSGLEHND.js';
15
16
  import '../chunk-BHHIIK3M.js';
16
17
  import '../chunk-PQADV6P6.js';
17
18
  import '../chunk-BUVCV3WI.js';
@@ -1,10 +1,10 @@
1
- export { CellDisplay, CellEditor, CheckboxCell, DateCell, LongTextCell, MultiSelectCell, NumberCell, PersonCell, RatingCell, SelectCell, SheetCell, SheetGrid, StatusCell, TextCell, UrlCell } from '../chunk-FF5OZV77.js';
1
+ export { CellDisplay, CellEditor, CheckboxCell, DateCell, LongTextCell, MultiSelectCell, NumberCell, PersonCell, RatingCell, SelectCell, SheetCell, SheetGrid, StatusCell, TextCell, UrlCell } from '../chunk-W3HYWD63.js';
2
2
  import '../chunk-O2EGEONV.js';
3
3
  import '../chunk-CENOOTAV.js';
4
- import '../chunk-GFV4LJHH.js';
5
- import '../chunk-WIATRXEJ.js';
6
4
  import '../chunk-3BYIWOTV.js';
7
5
  import '../chunk-I6POAB4V.js';
6
+ import '../chunk-GFV4LJHH.js';
7
+ import '../chunk-WIATRXEJ.js';
8
8
  import '../chunk-47JQAGRV.js';
9
9
  import '../chunk-LFSIKGRQ.js';
10
10
  import '../chunk-Z7JYG5TF.js';
@@ -13,11 +13,11 @@ import '../chunk-AYKXMIOR.js';
13
13
  import '../chunk-6ZJ3N7QI.js';
14
14
  import '../chunk-5AQBPHZD.js';
15
15
  import '../chunk-PZKHBB7D.js';
16
+ import '../chunk-RSAQOKH3.js';
16
17
  import '../chunk-BUVCV3WI.js';
17
18
  import '../chunk-OMV5W53A.js';
18
19
  import '../chunk-R25RGPUB.js';
19
20
  import '../chunk-OG6CL3EB.js';
20
- import '../chunk-RSAQOKH3.js';
21
21
  import '../chunk-4FQT6ZAY.js';
22
22
  import '../chunk-BZFWDIV6.js';
23
23
  import '../chunk-ODEQTPFM.js';