@crewlethq/ui 0.35.1 → 0.37.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 (176) hide show
  1. package/README.md +90 -1
  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/ArtifactAccess/ArtifactAccess.d.ts +40 -0
  10. package/dist/ArtifactAccess/index.d.ts +3 -0
  11. package/dist/ArtifactAccess/index.js +2 -0
  12. package/dist/ArtifactAccess-Y53ZTRFS.css +31 -0
  13. package/dist/ArtifactBar/ArtifactBar.d.ts +2 -1
  14. package/dist/ArtifactBar/index.js +2 -2
  15. package/dist/{ArtifactBar-HV5AT4RG.css → ArtifactBar-FWPBBKQ5.css} +8 -0
  16. package/dist/ArtifactCard/ArtifactCard.d.ts +1 -6
  17. package/dist/ArtifactCard/index.d.ts +2 -1
  18. package/dist/ArtifactCard/index.js +4 -3
  19. package/dist/ArtifactCover/index.js +3 -2
  20. package/dist/ArtifactKindIllustration/ArtifactKindIllustration.d.ts +16 -7
  21. package/dist/ArtifactKindIllustration/index.js +1 -1
  22. package/dist/{ArtifactKindIllustration-5FPRJQ3P.css → ArtifactKindIllustration-KLFL7KBG.css} +37 -1
  23. package/dist/ArtifactMakeRow/ArtifactMakeRow.d.ts +39 -0
  24. package/dist/ArtifactMakeRow/index.d.ts +4 -0
  25. package/dist/ArtifactMakeRow/index.js +4 -0
  26. package/dist/ArtifactMakeRow-XBA2MPSY.css +167 -0
  27. package/dist/ArtifactNameCell/ArtifactNameCell.d.ts +37 -0
  28. package/dist/ArtifactNameCell/index.d.ts +4 -0
  29. package/dist/ArtifactNameCell/index.js +4 -0
  30. package/dist/ArtifactNameCell-RTVP4LO4.css +104 -0
  31. package/dist/ArtifactPanel/ArtifactPanel.d.ts +8 -1
  32. package/dist/ArtifactPanel/index.js +1 -1
  33. package/dist/{ArtifactPanel-HW3SU7CP.css → ArtifactPanel-KKUUIPEU.css} +9 -0
  34. package/dist/AuthLayout/index.js +2 -2
  35. package/dist/AvatarPicker/index.js +2 -2
  36. package/dist/Canvas/index.js +2 -2
  37. package/dist/CanvasBoard/CanvasBoard.d.ts +27 -13
  38. package/dist/CanvasBoard/index.d.ts +1 -1
  39. package/dist/CanvasBoard/index.js +4 -4
  40. package/dist/{CanvasBoard-5NNSKY6A.css → CanvasBoard-TS4P356F.css} +13 -6
  41. package/dist/CanvasToolbar/index.js +3 -3
  42. package/dist/Card/index.js +1 -1
  43. package/dist/{Card-KJOYHDTJ.css → Card-QOVASQNU.css} +17 -12
  44. package/dist/Checkbox/index.js +3 -2
  45. package/dist/ChoiceButtons/index.js +1 -1
  46. package/dist/{ChoiceButtons-DJ5EOGUA.css → ChoiceButtons-FLIFXFFS.css} +10 -0
  47. package/dist/ChoiceList/index.js +1 -1
  48. package/dist/{ChoiceList-RBL7FNQL.css → ChoiceList-EA2W6MOS.css} +36 -5
  49. package/dist/Combobox/index.js +3 -2
  50. package/dist/CommandPalette/index.js +3 -2
  51. package/dist/CommentThread/index.js +6 -5
  52. package/dist/Composer/Composer.d.ts +4 -0
  53. package/dist/Composer/index.js +3 -2
  54. package/dist/{Composer-ABGJIAIR.css → Composer-PXITWNEK.css} +26 -15
  55. package/dist/ConfirmField/index.js +3 -2
  56. package/dist/DataTable/index.js +4 -3
  57. package/dist/DataView/index.js +7 -6
  58. package/dist/DatasetSource/DatasetSource.d.ts +4 -0
  59. package/dist/DatasetSource/index.js +1 -1
  60. package/dist/{DatasetSource-XFPZBRXL.css → DatasetSource-SMGX4PS5.css} +38 -4
  61. package/dist/DateTimePicker/index.js +2 -1
  62. package/dist/{DateTimePicker-HG2KQXQ6.css → DateTimePicker-2IVTKFV2.css} +15 -2
  63. package/dist/DocTabsEditor/index.js +3 -2
  64. package/dist/Document/Document.d.ts +15 -3
  65. package/dist/Document/index.js +2 -1
  66. package/dist/{Document-JUGCSQ4L.css → Document-YFWTWXJP.css} +34 -2
  67. package/dist/{Editor-BVQHBF7L.js → Editor-HORWMUM3.js} +2 -1
  68. package/dist/FilterChip/index.js +1 -1
  69. package/dist/{FilterChip-EZ4QMW4E.css → FilterChip-VL33P3JL.css} +5 -1
  70. package/dist/Input/index.js +2 -1
  71. package/dist/{Input-GBZSFXLU.css → Input-ABGOFENS.css} +46 -10
  72. package/dist/LayersList/index.js +1 -1
  73. package/dist/{LayersList-NQZEIPZB.css → LayersList-TBNF4XGL.css} +16 -3
  74. package/dist/LinkInterstitial/index.js +2 -2
  75. package/dist/ListInput/index.js +3 -2
  76. package/dist/LivePreview/LivePreview.d.ts +120 -28
  77. package/dist/LivePreview/budget.d.ts +64 -20
  78. package/dist/LivePreview/index.d.ts +6 -4
  79. package/dist/LivePreview/index.js +1 -1
  80. package/dist/LivePreview/stills.d.ts +57 -0
  81. package/dist/LivePreview-BROGKR4N.css +113 -0
  82. package/dist/PresenterView/index.js +2 -2
  83. package/dist/PrincipalPicker/index.js +4 -3
  84. package/dist/RichEditor/index.js +1 -1
  85. package/dist/Select/index.js +2 -1
  86. package/dist/{Select-A54YS5EP.css → Select-W3CHTZXP.css} +18 -2
  87. package/dist/ShareDialog/index.js +3 -2
  88. package/dist/SheetColumnEditor/index.js +6 -5
  89. package/dist/SheetGrid/index.js +3 -3
  90. package/dist/SlideCompare/index.js +2 -2
  91. package/dist/SlideFilmstrip/index.js +2 -2
  92. package/dist/{SlideFilmstrip-4ITZLMO4.css → SlideFilmstrip-PAT7P4OG.css} +26 -7
  93. package/dist/SlideGrid/index.js +2 -2
  94. package/dist/{SlideGrid-S4LTJ4UU.css → SlideGrid-FJA33DV4.css} +11 -1
  95. package/dist/SlideStage/index.js +1 -1
  96. package/dist/{SlideStage-S2FISF4C.css → SlideStage-ZTTEQSS2.css} +4 -2
  97. package/dist/SourceEditor/index.js +2 -1
  98. package/dist/{SourceEditor-G2C3STPX.css → SourceEditor-QAYE2JS6.css} +19 -12
  99. package/dist/Switcher/index.js +4 -3
  100. package/dist/TagsInput/index.js +2 -1
  101. package/dist/{TagsInput-XMXTI5Q4.css → TagsInput-7EGBBXHS.css} +7 -1
  102. package/dist/ThemeGallery/index.js +1 -1
  103. package/dist/{ThemeGallery-HSUKBDWY.css → ThemeGallery-X35Y25EX.css} +26 -5
  104. package/dist/TimeWindowPicker/index.js +4 -3
  105. package/dist/{TimeWindowPicker-T763GLXH.css → TimeWindowPicker-DEFDV77Z.css} +15 -2
  106. package/dist/TreeCanvas/index.js +3 -3
  107. package/dist/VersionTimeline/index.js +2 -2
  108. package/dist/{chunk-V43UVX4H.js → chunk-27GD7LVR.js} +1 -1
  109. package/dist/{chunk-6JVRY5DQ.js → chunk-44WJLPQS.js} +2 -2
  110. package/dist/{chunk-ONL54WMH.js → chunk-46RL3E54.js} +1 -1
  111. package/dist/{chunk-UHJQDFKQ.js → chunk-4ZJLOKSS.js} +1 -1
  112. package/dist/{chunk-ACA27MZH.js → chunk-5QXRI35B.js} +1 -1
  113. package/dist/{chunk-LL5AFXU7.js → chunk-5RT5O4JR.js} +1 -1
  114. package/dist/{chunk-GMU6SQ6B.js → chunk-66NGUD5S.js} +2 -2
  115. package/dist/{chunk-3Y56GQPM.js → chunk-7VAUGG6B.js} +1 -1
  116. package/dist/{chunk-2CQLNML5.js → chunk-AOLCZDZ6.js} +3 -1
  117. package/dist/{chunk-NKZCJRKO.js → chunk-APDKUGSH.js} +2 -2
  118. package/dist/chunk-BGLKLXL3.js +29 -0
  119. package/dist/{chunk-Z6VW6CXX.js → chunk-BIQDJOJZ.js} +1 -1
  120. package/dist/{chunk-YSJC7AZC.js → chunk-BWOIUOO3.js} +1 -1
  121. package/dist/{chunk-PI7HKLIT.js → chunk-D7GNNID2.js} +3 -1
  122. package/dist/chunk-EAKC24BW.js +51 -0
  123. package/dist/{chunk-CCLNGVCM.js → chunk-EARDAJQY.js} +1 -1
  124. package/dist/chunk-EOQFPZEE.js +138 -0
  125. package/dist/{chunk-THROPJZC.js → chunk-F23N4MVU.js} +1 -1
  126. package/dist/{chunk-J6YZ4IYV.js → chunk-FG4O64DV.js} +3 -3
  127. package/dist/{chunk-E35CMI5D.js → chunk-FHHYXZSP.js} +31 -13
  128. package/dist/{chunk-AYB6AYNH.js → chunk-GMLAKNFY.js} +1 -1
  129. package/dist/{chunk-ZB5O3ELS.js → chunk-GRYZ5EP3.js} +4 -2
  130. package/dist/{chunk-QFNWMWWY.js → chunk-GS7ZTHPF.js} +4 -4
  131. package/dist/{chunk-ILAEBSLJ.js → chunk-H5NOLRGH.js} +2 -2
  132. package/dist/{chunk-W3UVOZKL.js → chunk-IPAU6FLH.js} +6 -2
  133. package/dist/{chunk-6QFAK2WV.js → chunk-IUYUS2SO.js} +4 -1
  134. package/dist/{chunk-22CQQDFW.js → chunk-JML75PGJ.js} +1 -1
  135. package/dist/{chunk-AXBRWRGV.js → chunk-JQLS3MZB.js} +1 -1
  136. package/dist/{chunk-FGYET26P.js → chunk-KJW2AS57.js} +1 -1
  137. package/dist/{chunk-QIXMNOBD.js → chunk-KYZMN6I6.js} +2 -2
  138. package/dist/{chunk-73A7D5CE.js → chunk-L4WZSVMT.js} +3 -1
  139. package/dist/{chunk-ULPL26BU.js → chunk-N5SKHIAP.js} +1 -1
  140. package/dist/{chunk-LV4APO72.js → chunk-NQGPD6NX.js} +1 -1
  141. package/dist/{chunk-7UYONN6K.js → chunk-OHA6WSAG.js} +6 -11
  142. package/dist/chunk-P5VGSVWG.js +39 -0
  143. package/dist/chunk-P6WFZDKS.js +111 -0
  144. package/dist/{chunk-CPEPST4S.js → chunk-PJIPUEJ3.js} +1 -1
  145. package/dist/{chunk-QS4ZGTEU.js → chunk-PPFX6GRK.js} +1 -1
  146. package/dist/{chunk-7DZDSSJS.js → chunk-RH2NCQBZ.js} +5 -4
  147. package/dist/{chunk-3VD3G3IL.js → chunk-T5RQGI6O.js} +1 -1
  148. package/dist/{chunk-F2KY4RLI.js → chunk-TVRBQMIX.js} +5 -3
  149. package/dist/{chunk-W7QBBKUE.js → chunk-UBZDYOCA.js} +7 -3
  150. package/dist/{chunk-QEFHYUCY.js → chunk-UWGUKMBK.js} +1 -1
  151. package/dist/{chunk-5YLON2PW.js → chunk-UYZZV4DZ.js} +1 -1
  152. package/dist/{chunk-BQ7AKL2N.js → chunk-VKKUGZ3G.js} +3 -1
  153. package/dist/{chunk-DEJHAOC5.js → chunk-WMXAX6VA.js} +1 -1
  154. package/dist/{chunk-VDPJGP4Q.js → chunk-WX2NIG4G.js} +1 -1
  155. package/dist/chunk-WYKWXRJ4.js +456 -0
  156. package/dist/{chunk-ZU3DUXD2.js → chunk-WZGYIVYH.js} +1 -1
  157. package/dist/{chunk-HUVG2FFT.js → chunk-Y5BD4MTE.js} +4 -2
  158. package/dist/chunk-YSGLEHND.js +56 -0
  159. package/dist/generated/index.d.ts +4 -0
  160. package/dist/generated/index.js +105 -100
  161. package/dist/index.js +105 -100
  162. package/dist/styles.css +1036 -163
  163. package/dist/utils/focusModality.d.ts +41 -0
  164. package/dist/utils/index.d.ts +2 -0
  165. package/dist/utils/index.js +2 -1
  166. package/package.json +3 -3
  167. package/dist/LivePreview-SRO7KHO4.css +0 -65
  168. package/dist/chunk-KF6YGL4B.js +0 -160
  169. package/dist/chunk-TYKQ33CL.js +0 -35
  170. package/dist/{chunk-3P4Y5RX6.js → chunk-4BYHAOHH.js} +1 -1
  171. package/dist/{chunk-KD2IRYCT.js → chunk-5WDXPHEW.js} +1 -1
  172. package/dist/{chunk-OSFA5ROT.js → chunk-FEJANUZK.js} +0 -0
  173. package/dist/{chunk-FJJHD73S.js → chunk-GYBDPCRC.js} +1 -1
  174. package/dist/{chunk-VHZ3AXJD.js → chunk-NQCY44B3.js} +1 -1
  175. package/dist/{chunk-3WCNHYXE.js → chunk-PNNYVN52.js} +0 -0
  176. package/dist/{chunk-FF5OZV77.js → chunk-W3HYWD63.js} +2 -2
@@ -1,4 +1,4 @@
1
- import type { HTMLAttributes, InputHTMLAttributes } from 'react';
1
+ import { type HTMLAttributes, type TextareaHTMLAttributes } from 'react';
2
2
  export type DocumentSize =
3
3
  /**
4
4
  * A page read on its own: the small step at the relaxed leading, sections at
@@ -61,7 +61,7 @@ export interface DocumentTitleProps extends HTMLAttributes<HTMLHeadingElement> {
61
61
  * a size of its own beside the body it heads.
62
62
  */
63
63
  export declare function DocumentTitle({ as: Tag, className, children, ...rest }: DocumentTitleProps): import("react").JSX.Element;
64
- export interface DocumentTitleFieldProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'size'> {
64
+ export interface DocumentTitleFieldProps extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'rows' | 'cols' | 'wrap'> {
65
65
  /** Marks the title as refused. Sets `aria-invalid`, which is what a screen reader reads. */
66
66
  error?: boolean | undefined;
67
67
  }
@@ -76,5 +76,17 @@ export interface DocumentTitleFieldProps extends Omit<InputHTMLAttributes<HTMLIn
76
76
  * danger ink when the title is refused. The name is the caller's
77
77
  * (`aria-label`, or a label it points at), because a title field's visible
78
78
  * cue is its placeholder, and a placeholder is not a name.
79
+ *
80
+ * IT WRAPS, AND IT IS STILL ONE LINE OF TEXT. A title is set in the page's
81
+ * largest type, and an `<input>` cuts what does not fit: on a phone a long
82
+ * title, or the example in its placeholder, was clipped mid-word ("Weekly
83
+ * planning, Octobe"). So it is a textarea of one row that grows with what it
84
+ * holds, as the title it becomes wraps, and every way it could take a second
85
+ * line is closed: Enter inserts nothing (its `keydown` reaches the caller and
86
+ * the page exactly as an input's does, and in a form with a submit button it
87
+ * submits, as an input's Enter does), and a pasted, dropped or autofilled line
88
+ * break becomes a space before the caller's `onChange` reads the value. It is
89
+ * named to assistive technology as a single-line text field
90
+ * (`aria-multiline="false"`).
79
91
  */
80
- export declare function DocumentTitleField({ error, className, ...rest }: DocumentTitleFieldProps): import("react").JSX.Element;
92
+ export declare const DocumentTitleField: import("react").ForwardRefExoticComponent<DocumentTitleFieldProps & import("react").RefAttributes<HTMLTextAreaElement>>;
@@ -1,2 +1,3 @@
1
- export { Document, DocumentTitle, DocumentTitleField } from '../chunk-TYKQ33CL.js';
1
+ export { Document, DocumentTitle, DocumentTitleField } from '../chunk-P6WFZDKS.js';
2
+ import '../chunk-YSGLEHND.js';
2
3
  import '../chunk-ODEQTPFM.js';
@@ -327,17 +327,34 @@
327
327
  * on no surface of its own, with a line along its foot that answers the
328
328
  * pointer, the focus and a refusal. The line is a border rather than a
329
329
  * shadow, because forced colours keep a border and drop a shadow.
330
+ *
331
+ * ONE PIXEL, AND A TINT, WHERE A POINTER PUT THE CARET. The line is the
332
+ * hairline under the pointer and the selected edge (the accent mixed toward
333
+ * the page) once a click has put the caret in it: the reader is already
334
+ * looking at the title, and a page that focuses its title on load drew a 2px
335
+ * accent bar under it before anybody had touched anything.
336
+ *
337
+ * TWO PIXELS IN THE FOCUS COLOUR FOR THE KEYBOARD, the area WCAG 2.2's focus
338
+ * appearance asks of an indicator: the border takes the focus colour and a
339
+ * shadow lays the second pixel under it, with a transparent outline that
340
+ * forced colours paints in its place. The padding takes the pixel the border
341
+ * no longer reserves, so the title sits where it always did.
330
342
  */
331
343
  .crewlet-document-title-field {
332
344
  display: block;
333
345
  width: 100%;
334
346
  min-width: 0;
335
- padding: 0 0 var(--spacing-1);
347
+ padding: 0 0 calc(var(--spacing-1) + 1px);
336
348
  border: 0;
337
- border-block-end: 2px solid transparent;
349
+ border-block-end: 1px solid transparent;
338
350
  border-radius: 0;
339
351
  background: none;
340
352
  outline: none;
353
+ /* A textarea of one row that grows with the title (DocumentTitleField sets
354
+ its height): no handle, no scrollbar, and the title's own wrapping. */
355
+ resize: none;
356
+ overflow: hidden;
357
+ white-space: pre-wrap;
341
358
  transition: border-color var(--motion-duration-fast) var(--motion-easing-default);
342
359
  }
343
360
 
@@ -352,12 +369,27 @@
352
369
 
353
370
  .crewlet-document-title-field:focus-visible {
354
371
  border-block-end-color: var(--color-focus);
372
+ box-shadow: 0 1px 0 var(--color-focus);
373
+ outline: 2px solid transparent;
374
+ }
375
+
376
+ :root[data-crewlet-focus='pointer'] .crewlet-document-title-field:focus-visible {
377
+ border-block-end-color: var(--color-border-selected);
378
+ box-shadow: none;
355
379
  }
356
380
 
357
381
  .crewlet-document-title-field[aria-invalid='true'] {
358
382
  border-block-end-color: var(--color-feedback-danger);
359
383
  }
360
384
 
385
+ .crewlet-document-title-field[aria-invalid='true']:focus-visible {
386
+ box-shadow: 0 1px 0 var(--color-feedback-danger);
387
+ }
388
+
389
+ :root[data-crewlet-focus='pointer'] .crewlet-document-title-field[aria-invalid='true']:focus-visible {
390
+ border-block-end-color: var(--color-feedback-danger);
391
+ }
392
+
361
393
  @media (prefers-reduced-motion: reduce) {
362
394
  .crewlet-document-title-field {
363
395
  transition: none;
@@ -2,7 +2,8 @@ import { richEditorLabels } from './chunk-CSQTDGTS.js';
2
2
  import { schema, readMarkdown, writeMarkdown } from './chunk-QH6VYJ3X.js';
3
3
  import { safeHref, MARKDOWN_CALLOUT_TONES } from './chunk-BAKPMH3S.js';
4
4
  import { Toolbar } from './chunk-PGRPNDWM.js';
5
- import { FormField, Input } from './chunk-6QFAK2WV.js';
5
+ import { FormField, Input } from './chunk-IUYUS2SO.js';
6
+ import './chunk-YSGLEHND.js';
6
7
  import './chunk-PQADV6P6.js';
7
8
  import { Menu } from './chunk-BUVCV3WI.js';
8
9
  import { placePopup, viewportBounds } from './chunk-OMV5W53A.js';
@@ -1,3 +1,3 @@
1
- export { FILTER_CHIP_ATTRIBUTE, FilterChip, FilterChipGroup } from '../chunk-5YLON2PW.js';
1
+ export { FILTER_CHIP_ATTRIBUTE, FilterChip, FilterChipGroup } from '../chunk-UYZZV4DZ.js';
2
2
  import '../chunk-BZFWDIV6.js';
3
3
  import '../chunk-ODEQTPFM.js';
@@ -81,9 +81,13 @@
81
81
  cursor: not-allowed;
82
82
  }
83
83
 
84
+ /* The selected fill, and the accent's lighter line rather than the selected
85
+ edge: on a pill this small the 0.6 edge, the fill and the accent ink were
86
+ three accent marks on one word. The ink is the mark that clears 4.5:1, and
87
+ the keyboard's 2px focus ring stays the only full-weight line. */
84
88
  .crewlet-filter-chip[aria-pressed='true'],
85
89
  .crewlet-filter-chip[aria-checked='true'] {
86
- background: var(--color-brand-accent-soft);
90
+ background: var(--color-surface-selected);
87
91
  border-color: var(--color-brand-accent-soft-strong);
88
92
  color: var(--color-brand-accent-ink);
89
93
  }
@@ -1,4 +1,5 @@
1
- export { FormField, FormRow, FormSection, Input, InputAffix, Label, ReadOnlyField, Textarea } from '../chunk-6QFAK2WV.js';
1
+ export { FormField, FormRow, FormSection, Input, InputAffix, Label, ReadOnlyField, Textarea } from '../chunk-IUYUS2SO.js';
2
+ import '../chunk-YSGLEHND.js';
2
3
  import '../chunk-PQADV6P6.js';
3
4
  import '../chunk-4FQT6ZAY.js';
4
5
  import '../chunk-BZFWDIV6.js';
@@ -81,14 +81,18 @@
81
81
  * forced-colors mode drops every box-shadow and keeps outlines: a ring drawn
82
82
  * as a shadow disappears for exactly the readers who most need one.
83
83
  *
84
- * It is ONE PIXEL, LAID EXACTLY ON THE BOUNDARY: the field's own hairline,
85
- * drawn in the focus colour, which is how the console's fields say focus. At
86
- * two pixels it was a heavy band round every box a caret landed in, and on a
87
- * form of them the field being typed in read as the loudest thing on the page.
88
- * Drawn on the boundary rather than outside it, a scroller cannot clip it and
89
- * the field does not grow a halo the moment a caret lands in it, which is what
90
- * a filter box in a toolbar of them did to the row it sits in. Every boxed
91
- * field in the package rings this way (`Input.test.tsx` holds them to it).
84
+ * It is TWO PIXELS FOR THE KEYBOARD AND ONE FOR A POINTER, laid over the
85
+ * boundary. Two pixels is the area WCAG 2.2's focus appearance asks of an
86
+ * indicator, and one pixel (the field's own hairline in the focus colour) was
87
+ * half of it for every reader tabbing through a form. But at two pixels round
88
+ * every box a caret landed in, a click into a title or a filter box drew a
89
+ * heavy band round the one thing the reader was already looking at, so the
90
+ * rule after this one narrows the ring where the document says the last move
91
+ * was a pointer. Drawn over the boundary rather than outside it, a scroller
92
+ * cannot clip it and the field does not grow a halo the moment a caret lands
93
+ * in it, which is what a filter box in a toolbar of them did to the row it
94
+ * sits in. Every boxed field in the package rings this way (`Input.test.tsx`
95
+ * holds them to it).
92
96
  *
93
97
  * THE BORDER IS LEFT ALONE. Recolouring it under the ring says nothing the
94
98
  * ring has not already said, and it is what cost the error state its own
@@ -104,10 +108,28 @@
104
108
  * on a pointer press as well as on a tab.
105
109
  */
106
110
  .crewlet-input:has(.crewlet-input__control:focus-visible) {
107
- outline: 1px solid var(--color-focus);
111
+ outline: 2px solid var(--color-focus);
108
112
  outline-offset: -1px;
109
113
  }
110
114
 
115
+ /*
116
+ * NARROWED FOR A POINTER. The ring above is the keyboard's: 2px, the area
117
+ * WCAG 2.2's focus appearance asks of an indicator, drawn over the boundary
118
+ * and one pixel into the box. A field matches :focus-visible on a click as
119
+ * well, and a reader who put the caret there with a pointer is already looking
120
+ * at it, so where the document says the last move was a pointer
121
+ * (`data-crewlet-focus`, kept by `trackFocusModality`, which every field
122
+ * starts) the ring is one pixel in the selected edge, the accent mixed toward
123
+ * the page: a page that focuses its first field on load drew the focus colour
124
+ * round it before anybody had touched a key. A refused field keeps its own
125
+ * colour under a pointer too (below). A document that tracks nothing keeps
126
+ * the keyboard's ring.
127
+ */
128
+ :root[data-crewlet-focus='pointer'] .crewlet-input:has(.crewlet-input__control:focus-visible) {
129
+ outline-width: 1px;
130
+ outline-color: var(--color-border-selected);
131
+ }
132
+
111
133
  .crewlet-input.is-error {
112
134
  border-color: var(--color-feedback-danger);
113
135
  }
@@ -128,6 +150,10 @@
128
150
  outline-color: var(--color-feedback-danger);
129
151
  }
130
152
 
153
+ :root[data-crewlet-focus='pointer'] .crewlet-input.is-error:has(.crewlet-input__control:focus-visible) {
154
+ outline-color: var(--color-feedback-danger);
155
+ }
156
+
131
157
  .crewlet-input.is-disabled {
132
158
  opacity: 0.6;
133
159
  cursor: not-allowed;
@@ -364,10 +390,16 @@
364
390
  on the control itself: a textarea is the field, with nothing wrapped round
365
391
  it and nothing focusable inside it. */
366
392
  .crewlet-textarea:focus-visible {
367
- outline: 1px solid var(--color-focus);
393
+ outline: 2px solid var(--color-focus);
368
394
  outline-offset: -1px;
369
395
  }
370
396
 
397
+ /* Narrowed and tinted for a pointer, as the text box's ring is. See Input.css. */
398
+ :root[data-crewlet-focus='pointer'] .crewlet-textarea:focus-visible {
399
+ outline-width: 1px;
400
+ outline-color: var(--color-border-selected);
401
+ }
402
+
371
403
  .crewlet-textarea.is-error {
372
404
  border-color: var(--color-feedback-danger);
373
405
  }
@@ -376,6 +408,10 @@
376
408
  outline-color: var(--color-feedback-danger);
377
409
  }
378
410
 
411
+ :root[data-crewlet-focus='pointer'] .crewlet-textarea.is-error:focus-visible {
412
+ outline-color: var(--color-feedback-danger);
413
+ }
414
+
379
415
  .crewlet-textarea.is-disabled {
380
416
  opacity: 0.6;
381
417
  cursor: not-allowed;
@@ -1,3 +1,3 @@
1
- export { LAYERS_LIST_LABELS, LayersList } from '../chunk-ONL54WMH.js';
1
+ export { LAYERS_LIST_LABELS, LayersList } from '../chunk-46RL3E54.js';
2
2
  import '../chunk-RKKO7QHH.js';
3
3
  import '../chunk-ODEQTPFM.js';
@@ -68,13 +68,26 @@
68
68
  color: var(--color-text-primary);
69
69
  }
70
70
 
71
- /* The accent edge every current row in the system takes, in the primary ink.
72
- A border, so forced colours keep it. */
71
+ /*
72
+ * THE PICKED ENTRY IS A SELECTION, drawn as the package draws a chosen
73
+ * option: the selected fill under the primary ink, as a canvas's layers panel
74
+ * marks the board picked on it. It used to take the accent rail a CURRENT row
75
+ * takes (the outline's heading, the page in the rail), which says "you are
76
+ * here" and beside a canvas read as a second selection ring. The rail's room
77
+ * is still held, so nothing moves, and forced colours draw it in the system's
78
+ * own selected colour, since they drop the fill.
79
+ */
73
80
  .crewlet-layers-list__item[aria-current='true'] {
74
- border-inline-start-color: var(--color-brand-accent);
81
+ background: var(--color-surface-selected);
75
82
  color: var(--color-text-primary);
76
83
  }
77
84
 
85
+ @media (forced-colors: active) {
86
+ .crewlet-layers-list__item[aria-current='true'] {
87
+ border-inline-start-color: Highlight;
88
+ }
89
+ }
90
+
78
91
  /* The ring lies inside the entry, where the scroller beside it cannot cut it. */
79
92
  .crewlet-layers-list__item:focus-visible {
80
93
  outline: 2px solid var(--color-focus);
@@ -1,6 +1,6 @@
1
- export { LinkInterstitial, openExternal } from '../chunk-KD2IRYCT.js';
2
- import '../chunk-5CLW2CXT.js';
1
+ export { LinkInterstitial, openExternal } from '../chunk-5WDXPHEW.js';
3
2
  import '../chunk-XEGZHHRH.js';
3
+ import '../chunk-5CLW2CXT.js';
4
4
  import '../chunk-SZZRIHGT.js';
5
5
  import '../chunk-PQADV6P6.js';
6
6
  import '../chunk-OMV5W53A.js';
@@ -1,5 +1,6 @@
1
- export { ListInput } from '../chunk-Z6VW6CXX.js';
2
- import '../chunk-6QFAK2WV.js';
1
+ export { ListInput } from '../chunk-BIQDJOJZ.js';
2
+ import '../chunk-IUYUS2SO.js';
3
+ import '../chunk-YSGLEHND.js';
3
4
  import '../chunk-SMBKXWML.js';
4
5
  import '../chunk-PQADV6P6.js';
5
6
  import '../chunk-OMV5W53A.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,101 @@ 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
+ /** How a layer laid out at a size of its own is fitted to its box (`PreviewScaleProps.fit`). */
141
+ export type PreviewFit = 'width' | 'contain' | 'fill';
142
+ /**
143
+ * The most of a filled layer's content that may fall outside its box, on
144
+ * either axis, before `fill` contains it instead: a fifth. A laptop's board
145
+ * (16:10) in a card's 16:9 loses a tenth of its foot; a phone's board would
146
+ * lose four fifths of itself, and is shown whole.
147
+ */
148
+ export declare const PREVIEW_FILL_MAX_CUT = 0.2;
149
+ /**
150
+ * A preview whose `snapshot` key changes is another preview: what it holds
151
+ * belongs to the content it drew, so it starts again under the new key.
152
+ */
153
+ export declare function LivePreview(props: LivePreviewProps): import("react").JSX.Element;
65
154
  export interface PreviewScaleProps {
66
155
  children: ReactNode;
67
156
  /** The width, in CSS pixels, the content is laid out at. */
@@ -70,10 +159,13 @@ export interface PreviewScaleProps {
70
159
  height?: number | undefined;
71
160
  /**
72
161
  * `width` scales the content to the box's width from its top (the top of a
73
- * page); `contain` scales it to fit inside the box whole, centred (a board
74
- * of its own size).
162
+ * page); `contain` scales it to fit inside the box whole, centred; `fill`
163
+ * covers the box edge to edge, centred across and held at the top, wherever
164
+ * that leaves at most [PREVIEW_FILL_MAX_CUT] of the content outside it, and
165
+ * contains it otherwise (a design's board, which may be a laptop's screen
166
+ * or a phone's). `contain` and `fill` need a `height`.
75
167
  */
76
- fit?: 'width' | 'contain' | undefined;
168
+ fit?: PreviewFit | undefined;
77
169
  }
78
170
  /**
79
171
  * Content laid out at a size of its own and scaled to the box it is drawn in,
@@ -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';
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';
2
+ export { LIVE_PREVIEW_DWELL_MS, LIVE_PREVIEW_MARGIN, LIVE_PREVIEW_RENDER_MS, LivePreview, LivePreviewBudgetProvider, PREVIEW_FILL_MAX_CUT, PreviewScale, useLivePreview } from './LivePreview.js';
3
+ export type { LivePreviewProps, LivePreviewSignals, LivePreviewState, PreviewFit, PreviewScaleProps } from './LivePreview.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, PREVIEW_FILL_MAX_CUT, PreviewScale, createLivePreviewBudget, createLivePreviewStills, immediately, perFrame, useLivePreview } from '../chunk-WYKWXRJ4.js';
2
2
  import '../chunk-ODEQTPFM.js';