@crewlethq/ui 0.48.2 → 0.49.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 (190) hide show
  1. package/README.md +60 -0
  2. package/dist/AgentHandoffPanel/index.js +4 -4
  3. package/dist/AppShell/index.js +4 -4
  4. package/dist/{AppShell-5P575KYA.css → AppShell-BIUFNT3J.css} +30 -11
  5. package/dist/ArrangeList/index.js +4 -4
  6. package/dist/ArtifactBar/index.js +9 -9
  7. package/dist/{ArtifactBar-6PGWGKN2.css → ArtifactBar-UMZCTARR.css} +9 -0
  8. package/dist/ArtifactCard/ArtifactCard.d.ts +30 -1
  9. package/dist/ArtifactCard/index.js +12 -5
  10. package/dist/{ArtifactCard-OGTMO2KI.css → ArtifactCard-SOB63NV5.css} +72 -1
  11. package/dist/ArtifactCover/index.js +2 -2
  12. package/dist/ArtifactIcon/index.js +2 -2
  13. package/dist/ArtifactKindGlyph/ArtifactKindGlyph.d.ts +7 -3
  14. package/dist/ArtifactKindGlyph/index.js +1 -1
  15. package/dist/ArtifactKindIllustration/ArtifactKindIllustration.d.ts +4 -3
  16. package/dist/ArtifactKindIllustration/index.js +1 -1
  17. package/dist/{ArtifactKinds-CVD3FCYO.css → ArtifactKinds-O3CALPVX.css} +1 -0
  18. package/dist/ArtifactMakeRow/index.js +2 -2
  19. package/dist/ArtifactNameCell/ArtifactNameCell.d.ts +14 -1
  20. package/dist/ArtifactNameCell/index.d.ts +1 -1
  21. package/dist/ArtifactNameCell/index.js +2 -2
  22. package/dist/{ArtifactNameCell-RTVP4LO4.css → ArtifactNameCell-3AHLUSE5.css} +12 -0
  23. package/dist/AvatarPicker/index.js +7 -7
  24. package/dist/BrandChip/BrandChip.d.ts +26 -0
  25. package/dist/BrandChip/index.d.ts +3 -0
  26. package/dist/BrandChip/index.js +2 -0
  27. package/dist/BrandChip-SQWBC2WU.css +81 -0
  28. package/dist/BrandSample/BrandSample.d.ts +75 -0
  29. package/dist/BrandSample/index.d.ts +3 -0
  30. package/dist/BrandSample/index.js +5 -0
  31. package/dist/BrandSample-G5V7GKR2.css +185 -0
  32. package/dist/BrandScope/BrandScope.d.ts +61 -0
  33. package/dist/BrandScope/index.d.ts +4 -0
  34. package/dist/BrandScope/index.js +4 -0
  35. package/dist/BrandScope-H2KZHGT7.css +29 -0
  36. package/dist/Canvas/index.js +2 -2
  37. package/dist/CanvasBoard/index.js +4 -4
  38. package/dist/CanvasToolbar/index.js +3 -3
  39. package/dist/Checkbox/Checkbox.d.ts +8 -0
  40. package/dist/Checkbox/index.js +3 -3
  41. package/dist/{Checkbox-ALWG3WV2.css → Checkbox-MB22OW6P.css} +18 -0
  42. package/dist/ColorField/ColorField.d.ts +63 -0
  43. package/dist/ColorField/index.d.ts +3 -0
  44. package/dist/ColorField/index.js +11 -0
  45. package/dist/ColorField-2OIOWT3Z.css +68 -0
  46. package/dist/ColorSwatch/ColorSwatch.d.ts +43 -0
  47. package/dist/ColorSwatch/index.d.ts +3 -0
  48. package/dist/ColorSwatch/index.js +9 -0
  49. package/dist/ColorSwatch-DNMUFHNS.css +83 -0
  50. package/dist/Combobox/Combobox.d.ts +45 -4
  51. package/dist/Combobox/index.d.ts +1 -1
  52. package/dist/Combobox/index.js +3 -3
  53. package/dist/Combobox-GBCWXWEB.css +163 -0
  54. package/dist/CommandPalette/index.js +5 -5
  55. package/dist/CommentThread/index.js +5 -5
  56. package/dist/Composer/index.js +3 -3
  57. package/dist/ConfirmField/index.js +3 -3
  58. package/dist/ContrastBadge/ContrastBadge.d.ts +63 -0
  59. package/dist/ContrastBadge/index.d.ts +3 -0
  60. package/dist/ContrastBadge/index.js +6 -0
  61. package/dist/ContrastBadge-CBZPGG3G.css +47 -0
  62. package/dist/DataGrid/DataGrid.d.ts +28 -1
  63. package/dist/DataGrid/index.js +8 -1
  64. package/dist/{DataGrid-AQKPJD7W.css → DataGrid-VNGQESJA.css} +15 -0
  65. package/dist/DataTable/index.js +6 -6
  66. package/dist/DataView/index.js +10 -10
  67. package/dist/DateTimePicker/index.js +3 -3
  68. package/dist/DocTabsEditor/index.js +4 -4
  69. package/dist/{Editor-6U4BJ25W.js → Editor-MLGK3KOG.js} +3 -3
  70. package/dist/FolderTile/FolderTile.d.ts +91 -0
  71. package/dist/FolderTile/index.d.ts +3 -0
  72. package/dist/FolderTile/index.js +7 -0
  73. package/dist/FolderTile-FDT5Y63Z.css +231 -0
  74. package/dist/HuePicker/index.js +6 -6
  75. package/dist/Input/index.js +2 -2
  76. package/dist/LinkInterstitial/index.js +3 -3
  77. package/dist/ListInput/index.js +3 -3
  78. package/dist/LogoSlot/LogoSlot.d.ts +84 -0
  79. package/dist/LogoSlot/index.d.ts +3 -0
  80. package/dist/LogoSlot/index.js +9 -0
  81. package/dist/LogoSlot-T2UFOJXU.css +159 -0
  82. package/dist/MarkdownEditor/index.js +6 -6
  83. package/dist/Menu/index.js +2 -2
  84. package/dist/MergeConflicts/index.js +6 -6
  85. package/dist/Modal/Modal.d.ts +13 -0
  86. package/dist/Modal/index.js +2 -2
  87. package/dist/{Modal-TOEWHDCQ.css → Modal-3HMP7WAZ.css} +30 -0
  88. package/dist/OrgTable/index.js +1 -1
  89. package/dist/PresenterView/index.js +3 -3
  90. package/dist/PrincipalPicker/index.js +4 -4
  91. package/dist/RichEditor/index.js +1 -1
  92. package/dist/SegmentedControl/index.js +5 -5
  93. package/dist/Select/index.js +2 -2
  94. package/dist/SelectionBar/SelectionBar.d.ts +50 -0
  95. package/dist/SelectionBar/index.d.ts +3 -0
  96. package/dist/SelectionBar/index.js +9 -0
  97. package/dist/SelectionBar-XPWKUOSC.css +61 -0
  98. package/dist/ShareDialog/index.js +6 -6
  99. package/dist/SheetColumnEditor/index.js +10 -10
  100. package/dist/SheetGrid/index.js +4 -4
  101. package/dist/SlideFilmstrip/index.js +3 -3
  102. package/dist/Switcher/index.js +4 -4
  103. package/dist/Tabs/index.js +4 -4
  104. package/dist/TagsInput/index.js +2 -2
  105. package/dist/ThemeGallery/ThemeGallery.d.ts +13 -2
  106. package/dist/ThemeGallery/index.js +3 -1
  107. package/dist/{ThemeGallery-X35Y25EX.css → ThemeGallery-UEFZRT6W.css} +21 -0
  108. package/dist/ThemeSwitcher/index.js +6 -6
  109. package/dist/TimeWindowPicker/index.js +6 -6
  110. package/dist/TreeCanvas/index.js +3 -3
  111. package/dist/TreeGrid/index.js +1 -1
  112. package/dist/TypeSpecimen/TypeSpecimen.d.ts +49 -0
  113. package/dist/TypeSpecimen/index.d.ts +3 -0
  114. package/dist/TypeSpecimen/index.js +3 -0
  115. package/dist/TypeSpecimen-WK6YNHL7.css +96 -0
  116. package/dist/VersionCompare/index.js +6 -6
  117. package/dist/{chunk-RBUA7ZNK.js → chunk-34RMTXDZ.js} +1 -1
  118. package/dist/{chunk-YFUG6ARA.js → chunk-3QSKDZR5.js} +1 -1
  119. package/dist/chunk-5SGHW42B.js +23 -0
  120. package/dist/{chunk-R2EOET5Q.js → chunk-627KFRON.js} +2 -2
  121. package/dist/{chunk-SMVWDO72.js → chunk-6FVGSWLS.js} +1 -1
  122. package/dist/{chunk-ILDNJHRU.js → chunk-AVL52EME.js} +1 -1
  123. package/dist/chunk-B235ANDO.js +66 -0
  124. package/dist/{chunk-MZ3QFQDL.js → chunk-CAVWDJF4.js} +1 -1
  125. package/dist/{chunk-BLQRC7QR.js → chunk-D6MTBXAJ.js} +2 -2
  126. package/dist/{chunk-2MYSESZF.js → chunk-FB5CFQTG.js} +82 -12
  127. package/dist/{chunk-KNMQS3JY.js → chunk-GHY63X4C.js} +1 -1
  128. package/dist/{chunk-DY4DQ7EB.js → chunk-GP4YWZFO.js} +1 -1
  129. package/dist/{chunk-NRWJUGNA.js → chunk-H55D66IK.js} +1 -1
  130. package/dist/{chunk-JNFTFAPN.js → chunk-H7NMJ5AI.js} +2 -2
  131. package/dist/{chunk-GKRPPSWY.js → chunk-ILFEWRLG.js} +1 -1
  132. package/dist/chunk-ITI2Z44C.js +139 -0
  133. package/dist/{chunk-P5VGSVWG.js → chunk-J24Q4HTD.js} +17 -8
  134. package/dist/{chunk-2FDTSARB.js → chunk-JFDIMO3A.js} +2 -2
  135. package/dist/chunk-JKAFEFFC.js +44 -0
  136. package/dist/{chunk-6HYPQ5PY.js → chunk-JWNYI7UD.js} +1 -1
  137. package/dist/{chunk-WT5UPL6P.js → chunk-KHZYAEGZ.js} +1 -1
  138. package/dist/chunk-M4QM477B.js +80 -0
  139. package/dist/{chunk-YUDUYMZB.js → chunk-MIEBOO7Y.js} +2 -2
  140. package/dist/{chunk-IVA7ZWDS.js → chunk-NAWUXCBC.js} +5 -5
  141. package/dist/{chunk-YUAQSWNW.js → chunk-NCHKKYPQ.js} +6 -3
  142. package/dist/chunk-OCRVY42T.js +50 -0
  143. package/dist/chunk-OEEYL2CM.js +73 -0
  144. package/dist/chunk-P3OIM6OC.js +38 -0
  145. package/dist/{chunk-FWBKMPNR.js → chunk-P3QWT5VR.js} +1 -1
  146. package/dist/chunk-P5JBDHWC.js +206 -0
  147. package/dist/{chunk-WQJSOTEO.js → chunk-PGR2PKH6.js} +1 -1
  148. package/dist/{chunk-U2XAJONO.js → chunk-Q44X36QC.js} +80 -36
  149. package/dist/{chunk-R2IBCEU6.js → chunk-R3BA3C4Y.js} +2 -2
  150. package/dist/{chunk-HDMLHJFI.js → chunk-R6R2UHVG.js} +4 -4
  151. package/dist/{chunk-VBEMIZIJ.js → chunk-RFPCHMSX.js} +1 -1
  152. package/dist/{chunk-CE2THTQR.js → chunk-RSKW25Y5.js} +4 -3
  153. package/dist/{chunk-UBZDYOCA.js → chunk-RV6XB5UV.js} +12 -1
  154. package/dist/{chunk-LXCRHVMZ.js → chunk-SEPSXOGJ.js} +1 -1
  155. package/dist/{chunk-K2FNW3MK.js → chunk-SQ4JFHO7.js} +1 -1
  156. package/dist/{chunk-F45VSK2M.js → chunk-SS4XCUUJ.js} +2 -2
  157. package/dist/{chunk-E4BOVKNJ.js → chunk-UTESMBPL.js} +5 -3
  158. package/dist/chunk-UZMNR366.js +9 -0
  159. package/dist/{chunk-GQXVLFQB.js → chunk-V7GOOXPK.js} +1 -1
  160. package/dist/{chunk-KMNY3KEB.js → chunk-VBIM6HFC.js} +2 -2
  161. package/dist/{chunk-Z5RZXVQ7.js → chunk-VN47PYUF.js} +7 -7
  162. package/dist/{chunk-CNTBUK24.js → chunk-VP2ODUCC.js} +2 -2
  163. package/dist/{chunk-VIAQW6RK.js → chunk-VTSJMDGP.js} +5 -5
  164. package/dist/chunk-W6FOEBIL.js +119 -0
  165. package/dist/chunk-WLSEAIVC.js +48 -0
  166. package/dist/{chunk-DETVVKAH.js → chunk-WQ7S7CKZ.js} +3 -3
  167. package/dist/{chunk-OKUULQ22.js → chunk-WXOYHVWG.js} +2 -2
  168. package/dist/{chunk-NILOJV62.js → chunk-X4NIE7CI.js} +1 -1
  169. package/dist/{chunk-PZZHO6OS.js → chunk-XS2FJVMT.js} +1 -1
  170. package/dist/{chunk-6AKG2VLR.js → chunk-YCC2S7DF.js} +4 -1
  171. package/dist/{chunk-5CLWBPB5.js → chunk-ZCIL5IHU.js} +1 -1
  172. package/dist/chunk-ZH77BXMA.js +14 -0
  173. package/dist/generated/index.d.ts +10 -0
  174. package/dist/generated/index.js +101 -89
  175. package/dist/index.js +101 -89
  176. package/dist/styles.css +1370 -22
  177. package/dist/utils/fontFamily.d.ts +29 -0
  178. package/dist/utils/hexColour.d.ts +12 -0
  179. package/package.json +3 -3
  180. package/scripts/check-css-variables.mjs +18 -2
  181. package/dist/Combobox-YDONYDTM.css +0 -81
  182. package/dist/chunk-LOBV4QON.js +0 -137
  183. package/dist/{chunk-245IXG5P.js → chunk-3WMOEGEL.js} +0 -0
  184. package/dist/{chunk-ICPQIAD6.js → chunk-D7Q5MQRF.js} +1 -1
  185. package/dist/{chunk-ISDEXIXH.js → chunk-E6HXFFWO.js} +1 -1
  186. package/dist/{chunk-D4EOPIFL.js → chunk-EXRRTKWT.js} +1 -1
  187. package/dist/{chunk-S6J3EWDP.js → chunk-SXBJMBSV.js} +1 -1
  188. package/dist/{chunk-3JIZ2A6K.js → chunk-TMM32U7D.js} +1 -1
  189. package/dist/{chunk-LD3GEVQU.js → chunk-XQZ6EWOE.js} +1 -1
  190. package/dist/{chunk-K77LKW3X.js → chunk-ZFM5L7M4.js} +2 -2
@@ -1,14 +1,14 @@
1
- export { ListInput, withDraft } from '../chunk-WQJSOTEO.js';
1
+ export { ListInput, withDraft } from '../chunk-PGR2PKH6.js';
2
2
  import '../chunk-XJ2QEBMM.js';
3
3
  import '../chunk-SMBKXWML.js';
4
- import '../chunk-D4EOPIFL.js';
4
+ import '../chunk-EXRRTKWT.js';
5
5
  import '../chunk-XCUUI7E7.js';
6
6
  import '../chunk-PQADV6P6.js';
7
7
  import '../chunk-RSAQOKH3.js';
8
8
  import '../chunk-OMV5W53A.js';
9
9
  import '../chunk-OG6CL3EB.js';
10
10
  import '../chunk-H5XTJ7GJ.js';
11
- import '../chunk-NUZHC6MM.js';
12
11
  import '../chunk-LACA4JGC.js';
12
+ import '../chunk-NUZHC6MM.js';
13
13
  import '../chunk-BZFWDIV6.js';
14
14
  import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,84 @@
1
+ import { type ReactNode } from 'react';
2
+ /** The ground a logo is drawn on: the light one it is usually made for, or a dark one. */
3
+ export type LogoSlotGround = 'light' | 'dark';
4
+ /** A wide logo (a wordmark, a lockup) or a square mark. */
5
+ export type LogoSlotShape = 'wide' | 'square';
6
+ export interface LogoSlotLabels {
7
+ /** The picker's label while the slot is empty. */
8
+ choose: string;
9
+ /** The picker's label once the slot holds a logo. */
10
+ replace: string;
11
+ remove: string;
12
+ /** What the overlay says while a file is held over the slot. */
13
+ drop: string;
14
+ /** Said and shown while a file is uploading. */
15
+ uploading: string;
16
+ /** Printed under an empty slot for a reader who cannot fill it. */
17
+ empty: string;
18
+ /** What may be brought, under the picker. */
19
+ hint: string;
20
+ }
21
+ export interface LogoSlotProps {
22
+ /** The slot's name: "Primary", "For dark grounds", "Mark". */
23
+ label: string;
24
+ /** One line under it: "On a light ground". */
25
+ description?: ReactNode;
26
+ /** The ground the logo is drawn on. */
27
+ ground: LogoSlotGround;
28
+ /**
29
+ * The brand's own colour for that ground, `#rrggbb`. Left out (or not a
30
+ * colour), the slot draws the product's own ground for that mode.
31
+ */
32
+ groundColor?: string | undefined;
33
+ shape?: LogoSlotShape | undefined;
34
+ /**
35
+ * The logo, as an address the host has already validated (the engine's file
36
+ * route, through the dashboard's checked blob path). Empty, the slot shows
37
+ * where a logo would go.
38
+ */
39
+ src?: string | null | undefined;
40
+ /** What the logo says, for a reader who cannot see it: "Acme logo". */
41
+ alt: string;
42
+ /** The clear-space guide: a dashed line round the logo at the space it keeps. On by default. */
43
+ guide?: boolean | undefined;
44
+ /** A file is uploading: the picker spins and the slot takes no new file until it lands. */
45
+ uploading?: boolean | undefined;
46
+ /** Why the last file was refused, with what to do about it. Drawn under the slot and announced. */
47
+ error?: ReactNode;
48
+ /** The reader may change the logo: a picker, Remove, and dropping a file on the slot. */
49
+ editable?: boolean | undefined;
50
+ /** A file was picked or dropped. One file: a slot holds one logo. */
51
+ onFile?: ((file: File) => void) | undefined;
52
+ /** Remove was pressed. Offered only while the slot holds a logo. */
53
+ onRemove?: (() => void) | undefined;
54
+ /** The types the picker offers, as the input's `accept` takes them. The engine still checks every file. */
55
+ accept?: string | undefined;
56
+ /** A reader's action beside the slot's name: a download of the logo. */
57
+ download?: ReactNode;
58
+ /**
59
+ * Said under an empty slot in place of `empty`: what an empty slot means
60
+ * here ("The primary logo is used on dark grounds until one is added").
61
+ */
62
+ emptyNote?: ReactNode;
63
+ className?: string | undefined;
64
+ labels?: Partial<LogoSlotLabels> | undefined;
65
+ }
66
+ /**
67
+ * One of a brand's logos, drawn on the ground it is made for, with the space
68
+ * it keeps round it.
69
+ *
70
+ * ON ITS OWN GROUND, NOT THE PAGE'S. A logo for a light ground is shown on a
71
+ * light ground in a dark theme too, and one for dark grounds on a dark one:
72
+ * the brand's own ground colour when it has one, the product's sheet for that
73
+ * mode when it has not. The guide and the placeholder are inked in whichever
74
+ * of the two palettes' text reads better on that ground.
75
+ *
76
+ * THE CLEAR-SPACE GUIDE is a dashed line round the logo at the space it keeps,
77
+ * so an administrator sees how it will sit in a header before it is in one.
78
+ *
79
+ * BRINGING A FILE IS NEVER ONLY A DROP. An editable slot carries a picker
80
+ * (`FilePickButton`), and the slot itself is a `FileDrop` region for a pointer.
81
+ * The engine checks every file; a refusal comes back as `error`, drawn under
82
+ * the slot and announced, saying what to change.
83
+ */
84
+ export declare function LogoSlot({ label, description, ground, groundColor, shape, src, alt, guide, uploading, error, editable, onFile, onRemove, accept, download, emptyNote, className, labels, }: LogoSlotProps): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import './LogoSlot.css';
2
+ export { LogoSlot } from './LogoSlot.js';
3
+ export type { LogoSlotGround, LogoSlotLabels, LogoSlotProps, LogoSlotShape } from './LogoSlot.js';
@@ -0,0 +1,9 @@
1
+ export { LogoSlot } from '../chunk-ITI2Z44C.js';
2
+ import '../chunk-THDGBD6Y.js';
3
+ import '../chunk-B235ANDO.js';
4
+ import '../chunk-KYIAFNU7.js';
5
+ import '../chunk-UZMNR366.js';
6
+ import '../chunk-WIATRXEJ.js';
7
+ import '../chunk-OG6CL3EB.js';
8
+ import '../chunk-BZFWDIV6.js';
9
+ import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,159 @@
1
+ /*
2
+ * One of a brand's logos on the ground it is made for. The ground and the ink
3
+ * of its guide are the only values here that are not tokens: they arrive
4
+ * through `--crewlet-logo-slot-ground` (the brand's own `#rrggbb`, or a
5
+ * palette's sheet read from the tokens package) and `--crewlet-logo-slot-ink`
6
+ * (whichever palette's text reads better on that ground).
7
+ */
8
+ .crewlet-logo-slot {
9
+ /* Every stage is one height, so three slots side by side line up whatever
10
+ their logos' shapes. */
11
+ --crewlet-logo-slot-height: calc(var(--size-row-lg) * 3);
12
+ --crewlet-logo-slot-padding: var(--spacing-5);
13
+ --crewlet-logo-slot-clear: var(--spacing-3);
14
+
15
+ display: flex;
16
+ flex-direction: column;
17
+ gap: var(--spacing-2);
18
+ min-width: 0;
19
+ }
20
+
21
+ .crewlet-logo-slot__head {
22
+ display: flex;
23
+ align-items: flex-start;
24
+ justify-content: space-between;
25
+ gap: var(--spacing-2);
26
+ min-width: 0;
27
+ }
28
+
29
+ .crewlet-logo-slot__words {
30
+ display: flex;
31
+ flex-direction: column;
32
+ gap: 2px;
33
+ min-width: 0;
34
+ }
35
+
36
+ .crewlet-logo-slot__label {
37
+ color: var(--color-text-primary);
38
+ font-size: var(--font-size-sm);
39
+ font-weight: var(--font-weight-medium);
40
+ }
41
+
42
+ .crewlet-logo-slot__description {
43
+ color: var(--color-text-tertiary);
44
+ font-size: var(--font-size-xs);
45
+ }
46
+
47
+ .crewlet-logo-slot__download {
48
+ display: inline-flex;
49
+ flex: none;
50
+ }
51
+
52
+ /*
53
+ * THE STAGE: the logo's own ground, at one height, inside the page's hairline
54
+ * so a ground that matches the page is still a stage. An empty one draws its
55
+ * edge dashed, a place waiting to be filled.
56
+ */
57
+ .crewlet-logo-slot__stage {
58
+ display: flex;
59
+ align-items: center;
60
+ justify-content: center;
61
+ height: var(--crewlet-logo-slot-height);
62
+ box-sizing: border-box;
63
+ padding: var(--crewlet-logo-slot-padding);
64
+ overflow: hidden;
65
+ border: 1px solid var(--color-border-hover);
66
+ border-radius: var(--radius-lg);
67
+ background: var(--crewlet-logo-slot-ground);
68
+ color: var(--crewlet-logo-slot-ink);
69
+ }
70
+
71
+ .crewlet-logo-slot__stage.is-empty {
72
+ border-style: dashed;
73
+ border-color: var(--color-border-strong);
74
+ }
75
+
76
+ /*
77
+ * THE SPACE THE LOGO KEEPS: padding round it at the clear space, and with the
78
+ * guide on, a dashed line at that edge in the ground's ink, half strength so
79
+ * it reads as a guide and never as part of the logo.
80
+ */
81
+ .crewlet-logo-slot__space {
82
+ position: relative;
83
+ display: inline-flex;
84
+ align-items: center;
85
+ justify-content: center;
86
+ max-width: 100%;
87
+ box-sizing: border-box;
88
+ padding: var(--crewlet-logo-slot-clear);
89
+ }
90
+
91
+ .crewlet-logo-slot__space.has-guide::after {
92
+ content: '';
93
+ position: absolute;
94
+ inset: 0;
95
+ border: 1px dashed var(--crewlet-logo-slot-ink);
96
+ border-radius: var(--radius-xs);
97
+ opacity: 0.5;
98
+ pointer-events: none;
99
+ }
100
+
101
+ .crewlet-logo-slot__image {
102
+ display: block;
103
+ max-width: 100%;
104
+ max-height: calc(var(--crewlet-logo-slot-height) - 2 * var(--crewlet-logo-slot-padding) - 2 * var(--crewlet-logo-slot-clear));
105
+ object-fit: contain;
106
+ }
107
+
108
+ /* WHERE A LOGO WOULD GO, at the shape it would take: a wordmark's band or a
109
+ mark's square, with the image glyph in the ground's ink. */
110
+ .crewlet-logo-slot__placeholder {
111
+ display: inline-flex;
112
+ align-items: center;
113
+ justify-content: center;
114
+ width: calc(var(--size-row-lg) * 3);
115
+ height: var(--size-row-lg);
116
+ opacity: 0.7;
117
+ }
118
+
119
+ .crewlet-logo-slot__stage--square .crewlet-logo-slot__placeholder {
120
+ width: var(--size-row-lg);
121
+ }
122
+
123
+ .crewlet-logo-slot__stage.is-uploading .crewlet-logo-slot__space {
124
+ opacity: 0.5;
125
+ }
126
+
127
+ .crewlet-logo-slot__empty {
128
+ margin: 0;
129
+ color: var(--color-text-tertiary);
130
+ font-size: var(--font-size-xs);
131
+ }
132
+
133
+ /* A REFUSAL, in the danger ink with its glyph, so it never rests on the hue. */
134
+ .crewlet-logo-slot__error {
135
+ display: flex;
136
+ align-items: flex-start;
137
+ gap: var(--spacing-1);
138
+ margin: 0;
139
+ color: var(--color-feedback-danger-ink);
140
+ font-size: var(--font-size-xs);
141
+ line-height: var(--font-line-height-normal);
142
+ }
143
+
144
+ .crewlet-logo-slot__error > svg {
145
+ flex: none;
146
+ margin-top: 1px;
147
+ }
148
+
149
+ .crewlet-logo-slot__foot {
150
+ display: flex;
151
+ flex-wrap: wrap;
152
+ align-items: center;
153
+ gap: var(--spacing-2);
154
+ }
155
+
156
+ .crewlet-logo-slot__hint {
157
+ color: var(--color-text-tertiary);
158
+ font-size: var(--font-size-xs);
159
+ }
@@ -1,17 +1,17 @@
1
- export { MARKDOWN_FORMATS, MarkdownEditor, formatMarkdown, insertMarkdown, markdownWords } from '../chunk-F45VSK2M.js';
1
+ export { MARKDOWN_FORMATS, MarkdownEditor, formatMarkdown, insertMarkdown, markdownWords } from '../chunk-SS4XCUUJ.js';
2
2
  import '../chunk-NR4CPM4T.js';
3
3
  import '../chunk-OOC7Q67K.js';
4
- import '../chunk-SMVWDO72.js';
5
- import '../chunk-GKRPPSWY.js';
4
+ import '../chunk-6FVGSWLS.js';
5
+ import '../chunk-ILFEWRLG.js';
6
6
  import '../chunk-WIATRXEJ.js';
7
7
  import '../chunk-EGMQURBR.js';
8
8
  import '../chunk-BHHIIK3M.js';
9
- import '../chunk-3JIZ2A6K.js';
10
- import '../chunk-2YTOOH3A.js';
9
+ import '../chunk-TMM32U7D.js';
11
10
  import '../chunk-OMV5W53A.js';
11
+ import '../chunk-2YTOOH3A.js';
12
12
  import '../chunk-OG6CL3EB.js';
13
13
  import '../chunk-H5XTJ7GJ.js';
14
- import '../chunk-NUZHC6MM.js';
15
14
  import '../chunk-LACA4JGC.js';
15
+ import '../chunk-NUZHC6MM.js';
16
16
  import '../chunk-BZFWDIV6.js';
17
17
  import '../chunk-ODEQTPFM.js';
@@ -1,8 +1,8 @@
1
- export { Menu } from '../chunk-3JIZ2A6K.js';
1
+ export { Menu } from '../chunk-TMM32U7D.js';
2
2
  import '../chunk-OMV5W53A.js';
3
3
  import '../chunk-OG6CL3EB.js';
4
4
  import '../chunk-H5XTJ7GJ.js';
5
- import '../chunk-NUZHC6MM.js';
6
5
  import '../chunk-LACA4JGC.js';
6
+ import '../chunk-NUZHC6MM.js';
7
7
  import '../chunk-BZFWDIV6.js';
8
8
  import '../chunk-ODEQTPFM.js';
@@ -1,16 +1,16 @@
1
- export { MERGE_CONFLICTS_LABELS, MergeConflicts } from '../chunk-PZZHO6OS.js';
1
+ export { MERGE_CONFLICTS_LABELS, MergeConflicts } from '../chunk-XS2FJVMT.js';
2
2
  import '../chunk-OOC7Q67K.js';
3
- import '../chunk-SMVWDO72.js';
4
- import '../chunk-GKRPPSWY.js';
3
+ import '../chunk-6FVGSWLS.js';
4
+ import '../chunk-ILFEWRLG.js';
5
5
  import '../chunk-WIATRXEJ.js';
6
6
  import '../chunk-EGMQURBR.js';
7
7
  import '../chunk-BHHIIK3M.js';
8
- import '../chunk-3JIZ2A6K.js';
9
- import '../chunk-2YTOOH3A.js';
8
+ import '../chunk-TMM32U7D.js';
10
9
  import '../chunk-OMV5W53A.js';
10
+ import '../chunk-2YTOOH3A.js';
11
11
  import '../chunk-OG6CL3EB.js';
12
12
  import '../chunk-H5XTJ7GJ.js';
13
- import '../chunk-NUZHC6MM.js';
14
13
  import '../chunk-LACA4JGC.js';
14
+ import '../chunk-NUZHC6MM.js';
15
15
  import '../chunk-BZFWDIV6.js';
16
16
  import '../chunk-ODEQTPFM.js';
@@ -102,6 +102,19 @@ export interface ModalProps extends FrameAttributes {
102
102
  variant?: ModalVariant | undefined;
103
103
  shape?: ModalShape | undefined;
104
104
  placement?: ModalPlacement | undefined;
105
+ /**
106
+ * On a phone (strictly under the phone breakpoint), the dialog takes the
107
+ * whole window as a full-height sheet: no inset and no corners, the head
108
+ * and the foot standing still while the body scrolls between them, and the
109
+ * foot clear of the home indicator. For a dialog whose body is a long list
110
+ * a thumb works through, such as a folder picker, where a dialog inset from
111
+ * every edge leaves a few rows of it on the screen at a time.
112
+ *
113
+ * OPT-IN, so every other dialog keeps its shape on a phone. It reshapes the
114
+ * framed dialog only: a prompt is one sentence and stays a prompt, and a
115
+ * side sheet is already the full width there.
116
+ */
117
+ phoneSheet?: boolean | undefined;
105
118
  role?: ModalRole | undefined;
106
119
  /**
107
120
  * False while a request is in flight: Escape, the veil and the close
@@ -1,9 +1,9 @@
1
- export { ConfirmModal, Modal } from '../chunk-6AKG2VLR.js';
1
+ export { ConfirmModal, Modal } from '../chunk-YCC2S7DF.js';
2
2
  import '../chunk-PQADV6P6.js';
3
3
  import '../chunk-OMV5W53A.js';
4
4
  import '../chunk-OG6CL3EB.js';
5
5
  import '../chunk-H5XTJ7GJ.js';
6
- import '../chunk-NUZHC6MM.js';
7
6
  import '../chunk-LACA4JGC.js';
7
+ import '../chunk-NUZHC6MM.js';
8
8
  import '../chunk-BZFWDIV6.js';
9
9
  import '../chunk-ODEQTPFM.js';
@@ -112,6 +112,32 @@
112
112
  animation: crewlet-modal-lift var(--motion-duration-moderate) var(--motion-easing-emphasized);
113
113
  }
114
114
 
115
+ /*
116
+ * THE PHONE SHEET (`phoneSheet`), strictly under the phone breakpoint as the
117
+ * package switches there everywhere else: the dialog takes the whole window,
118
+ * with no inset and no corners, so a long list in its body has the screen's
119
+ * height to scroll in between a head and a foot that stay put. It rises from
120
+ * the bottom edge as the bottom sheet does, and its foot stays clear of the
121
+ * home indicator. Above the breakpoint nothing here applies, and the dialog
122
+ * keeps its placement.
123
+ */
124
+ @media (width < 640px) {
125
+ .crewlet-modal-overlay--dialog.crewlet-modal-overlay--phone-sheet {
126
+ align-items: stretch;
127
+ padding: 0;
128
+ }
129
+
130
+ .crewlet-modal-overlay--phone-sheet > .crewlet-modal--dialog {
131
+ width: 100%;
132
+ height: 100%;
133
+ max-height: none;
134
+ border: none;
135
+ border-radius: 0;
136
+ padding-bottom: env(safe-area-inset-bottom, 0px);
137
+ animation: crewlet-modal-lift var(--motion-duration-moderate) var(--motion-easing-emphasized);
138
+ }
139
+ }
140
+
115
141
  /*
116
142
  * The sheet's veil fades over the same span the sheet itself travels, so the
117
143
  * two are one movement rather than a ground that lands and a panel that
@@ -584,4 +610,8 @@
584
610
  .crewlet-modal-overlay--bottom > .crewlet-modal--dialog {
585
611
  animation: none;
586
612
  }
613
+
614
+ .crewlet-modal-overlay--phone-sheet > .crewlet-modal--dialog {
615
+ animation: none;
616
+ }
587
617
  }
@@ -8,7 +8,7 @@ import '../chunk-PZKHBB7D.js';
8
8
  import '../chunk-TROLVEZY.js';
9
9
  import '../chunk-OMV5W53A.js';
10
10
  import '../chunk-H5XTJ7GJ.js';
11
- import '../chunk-NUZHC6MM.js';
12
11
  import '../chunk-LACA4JGC.js';
12
+ import '../chunk-NUZHC6MM.js';
13
13
  import '../chunk-BZFWDIV6.js';
14
14
  import '../chunk-ODEQTPFM.js';
@@ -1,11 +1,11 @@
1
- export { PresenterView, formatStopwatch } from '../chunk-ISDEXIXH.js';
2
- import '../chunk-RMEBFYL7.js';
1
+ export { PresenterView, formatStopwatch } from '../chunk-E6HXFFWO.js';
3
2
  import '../chunk-RRO7UEYU.js';
3
+ import '../chunk-RMEBFYL7.js';
4
4
  import '../chunk-RK4XPHVG.js';
5
5
  import '../chunk-OMV5W53A.js';
6
6
  import '../chunk-OG6CL3EB.js';
7
7
  import '../chunk-H5XTJ7GJ.js';
8
- import '../chunk-NUZHC6MM.js';
9
8
  import '../chunk-LACA4JGC.js';
9
+ import '../chunk-NUZHC6MM.js';
10
10
  import '../chunk-BZFWDIV6.js';
11
11
  import '../chunk-ODEQTPFM.js';
@@ -1,16 +1,16 @@
1
- export { PrincipalPicker } from '../chunk-WT5UPL6P.js';
2
- import '../chunk-LOBV4QON.js';
1
+ export { PrincipalPicker } from '../chunk-KHZYAEGZ.js';
2
+ import '../chunk-P5JBDHWC.js';
3
3
  import '../chunk-7KHM2FZH.js';
4
4
  import '../chunk-CI3VPIJN.js';
5
5
  import '../chunk-5AQBPHZD.js';
6
6
  import '../chunk-PZKHBB7D.js';
7
- import '../chunk-D4EOPIFL.js';
7
+ import '../chunk-EXRRTKWT.js';
8
8
  import '../chunk-XCUUI7E7.js';
9
9
  import '../chunk-PQADV6P6.js';
10
10
  import '../chunk-RSAQOKH3.js';
11
11
  import '../chunk-2YTOOH3A.js';
12
12
  import '../chunk-H5XTJ7GJ.js';
13
- import '../chunk-NUZHC6MM.js';
14
13
  import '../chunk-LACA4JGC.js';
14
+ import '../chunk-NUZHC6MM.js';
15
15
  import '../chunk-BZFWDIV6.js';
16
16
  import '../chunk-ODEQTPFM.js';
@@ -1,4 +1,4 @@
1
- export { RichEditor, preloadRichEditor } from '../chunk-6HYPQ5PY.js';
1
+ export { RichEditor, preloadRichEditor } from '../chunk-JWNYI7UD.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,15 +1,15 @@
1
1
  import '../chunk-OOC7Q67K.js';
2
- export { SegmentedControl } from '../chunk-SMVWDO72.js';
3
- import '../chunk-GKRPPSWY.js';
2
+ export { SegmentedControl } from '../chunk-6FVGSWLS.js';
3
+ import '../chunk-ILFEWRLG.js';
4
4
  import '../chunk-WIATRXEJ.js';
5
5
  import '../chunk-EGMQURBR.js';
6
6
  import '../chunk-BHHIIK3M.js';
7
- import '../chunk-3JIZ2A6K.js';
8
- import '../chunk-2YTOOH3A.js';
7
+ import '../chunk-TMM32U7D.js';
9
8
  import '../chunk-OMV5W53A.js';
9
+ import '../chunk-2YTOOH3A.js';
10
10
  import '../chunk-OG6CL3EB.js';
11
11
  import '../chunk-H5XTJ7GJ.js';
12
- import '../chunk-NUZHC6MM.js';
13
12
  import '../chunk-LACA4JGC.js';
13
+ import '../chunk-NUZHC6MM.js';
14
14
  import '../chunk-BZFWDIV6.js';
15
15
  import '../chunk-ODEQTPFM.js';
@@ -1,7 +1,7 @@
1
- export { Select } from '../chunk-LD3GEVQU.js';
1
+ export { Select } from '../chunk-XQZ6EWOE.js';
2
2
  import '../chunk-7KHM2FZH.js';
3
- import '../chunk-2YTOOH3A.js';
4
3
  import '../chunk-OMV5W53A.js';
4
+ import '../chunk-2YTOOH3A.js';
5
5
  import '../chunk-H5XTJ7GJ.js';
6
6
  import '../chunk-NUZHC6MM.js';
7
7
  import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,50 @@
1
+ import { type ReactNode, type RefObject } from 'react';
2
+ export interface SelectionBarLabels {
3
+ /** The count, printed and said: "3 selected". */
4
+ count: (count: number) => string;
5
+ /** Said once the last pick is cleared, since the bar it was printed in goes. */
6
+ cleared: string;
7
+ /** The control that clears every pick. */
8
+ clear: string;
9
+ /** Names the bar: a toolbar is announced by its name. */
10
+ label: string;
11
+ }
12
+ export interface SelectionBarProps {
13
+ /** How many items are picked. At zero the bar draws nothing. */
14
+ count: number;
15
+ /** Clears every pick. */
16
+ onClear: () => void;
17
+ /**
18
+ * The bulk actions, as `Button`s ("Move to…"). An action only some of the
19
+ * picks allow is drawn with `disabledReason` ("You own 2 of 3"), never
20
+ * applied to the part it can be applied to without saying so.
21
+ */
22
+ children?: ReactNode;
23
+ /**
24
+ * Where focus goes once Clear has emptied the selection and the bar has
25
+ * gone with it: the gallery's Select toggle, or the list. Without it focus
26
+ * would fall to the page body with the button that held it.
27
+ */
28
+ returnFocusRef?: RefObject<HTMLElement | null> | undefined;
29
+ className?: string | undefined;
30
+ labels?: Partial<SelectionBarLabels> | undefined;
31
+ }
32
+ /**
33
+ * What is picked, and what can be done to all of it: the count, the bulk
34
+ * actions, and Clear.
35
+ *
36
+ * STICKY OVER THE LIST, DOCKED TO THE FOOT ON A PHONE. Over a long gallery the
37
+ * bar stays under the top of the scroller (`--crewlet-selection-bar-top` for a
38
+ * scroller that carries a bar of its own); under the phone breakpoint it
39
+ * floats at the bottom edge, where a thumb reaches it and the list it acts on
40
+ * stays in view; the host keeps the list's last row clear of it.
41
+ *
42
+ * THE COUNT IS SAID, POLITELY, AS IT CHANGES, through the shell's one polite
43
+ * region (`Announcer`): ticking a box changes nothing a screen reader reads on
44
+ * its own, and the bar appearing is not news a reader hears unless something
45
+ * says it. Clearing the last pick says so, since the bar goes with it.
46
+ *
47
+ * ONE STOP IN THE TAB ORDER: the actions and Clear are a `Toolbar`, walked
48
+ * with the arrows.
49
+ */
50
+ export declare function SelectionBar({ count, onClear, children, returnFocusRef, className, labels }: SelectionBarProps): import("react").JSX.Element | null;
@@ -0,0 +1,3 @@
1
+ import './SelectionBar.css';
2
+ export { SelectionBar } from './SelectionBar.js';
3
+ export type { SelectionBarLabels, SelectionBarProps } from './SelectionBar.js';
@@ -0,0 +1,9 @@
1
+ export { SelectionBar } from '../chunk-OCRVY42T.js';
2
+ import '../chunk-NR4CPM4T.js';
3
+ import '../chunk-RSAQOKH3.js';
4
+ import '../chunk-OMV5W53A.js';
5
+ import '../chunk-OG6CL3EB.js';
6
+ import '../chunk-H5XTJ7GJ.js';
7
+ import '../chunk-NUZHC6MM.js';
8
+ import '../chunk-BZFWDIV6.js';
9
+ import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,61 @@
1
+ /*
2
+ * What is picked and what can be done to it: the count, the bulk actions and
3
+ * Clear, on the raised rung inside the strong hairline so it reads as a bar
4
+ * laid over the list rather than a row of it.
5
+ *
6
+ * ON TOP OF TOOLBAR, so the rules that change Toolbar's own layout carry
7
+ * Toolbar's class too: the bundle orders the two sheets by file name.
8
+ */
9
+ .crewlet-toolbar.crewlet-selection-bar {
10
+ position: sticky;
11
+ top: var(--crewlet-selection-bar-top, var(--spacing-0));
12
+ z-index: var(--z-index-sticky);
13
+ flex-wrap: nowrap;
14
+ gap: var(--spacing-3);
15
+ min-height: var(--size-row-lg);
16
+ padding: var(--spacing-1) var(--spacing-2) var(--spacing-1) var(--spacing-4);
17
+ border: 1px solid var(--color-border-strong);
18
+ border-radius: var(--radius-lg);
19
+ background: var(--color-surface-elevated);
20
+ box-shadow: var(--shadow-sm);
21
+ }
22
+
23
+ .crewlet-selection-bar__count {
24
+ flex: none;
25
+ color: var(--color-text-primary);
26
+ font-size: var(--font-size-sm);
27
+ font-weight: var(--font-weight-medium);
28
+ font-variant-numeric: tabular-nums;
29
+ white-space: nowrap;
30
+ }
31
+
32
+ .crewlet-selection-bar__actions {
33
+ display: flex;
34
+ align-items: center;
35
+ flex-wrap: wrap;
36
+ gap: var(--spacing-2);
37
+ min-width: 0;
38
+ }
39
+
40
+ .crewlet-selection-bar__spacer {
41
+ flex: 1 1 auto;
42
+ }
43
+
44
+ /*
45
+ * DOCKED TO THE FOOT ON A PHONE, strictly under the phone breakpoint: over the
46
+ * list at the bottom edge, inside the safe area, where a thumb reaches it and
47
+ * the picks it acts on stay in view above it.
48
+ */
49
+ @media (width < 640px) {
50
+ .crewlet-toolbar.crewlet-selection-bar {
51
+ position: fixed;
52
+ top: auto;
53
+ right: var(--spacing-3);
54
+ bottom: calc(var(--spacing-3) + env(safe-area-inset-bottom, var(--spacing-0)));
55
+ left: var(--spacing-3);
56
+ z-index: var(--z-index-overlay);
57
+ gap: var(--spacing-2);
58
+ padding-inline-start: var(--spacing-3);
59
+ box-shadow: var(--shadow-lg);
60
+ }
61
+ }
@@ -1,21 +1,21 @@
1
- export { ARTIFACT_ROLES, SHAREABLE_ROLES, ShareDialog, roleAtLeast } from '../chunk-2FDTSARB.js';
2
- import '../chunk-LD3GEVQU.js';
1
+ export { ARTIFACT_ROLES, SHAREABLE_ROLES, ShareDialog, roleAtLeast } from '../chunk-JFDIMO3A.js';
2
+ import '../chunk-XQZ6EWOE.js';
3
+ import '../chunk-YCC2S7DF.js';
4
+ import '../chunk-7KHM2FZH.js';
3
5
  import '../chunk-7SHAFLEX.js';
4
6
  import '../chunk-STJ7QBC3.js';
5
7
  import '../chunk-DTIW4CHZ.js';
6
- import '../chunk-6AKG2VLR.js';
7
- import '../chunk-7KHM2FZH.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
12
  import '../chunk-PQADV6P6.js';
13
13
  import '../chunk-RTPQDNW3.js';
14
- import '../chunk-2YTOOH3A.js';
15
14
  import '../chunk-OMV5W53A.js';
15
+ import '../chunk-2YTOOH3A.js';
16
16
  import '../chunk-OG6CL3EB.js';
17
17
  import '../chunk-H5XTJ7GJ.js';
18
- import '../chunk-NUZHC6MM.js';
19
18
  import '../chunk-LACA4JGC.js';
19
+ import '../chunk-NUZHC6MM.js';
20
20
  import '../chunk-BZFWDIV6.js';
21
21
  import '../chunk-ODEQTPFM.js';