@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
@@ -0,0 +1,3 @@
1
+ import './BrandChip.css';
2
+ export { BrandChip } from './BrandChip.js';
3
+ export type { BrandChipProps } from './BrandChip.js';
@@ -0,0 +1,2 @@
1
+ export { BrandChip } from '../chunk-ZH77BXMA.js';
2
+ import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,81 @@
1
+ /*
2
+ * The company's brand as a small link: the mark, the name, a chevron. A quiet
3
+ * chip at a small control's height, inside the default hairline, that steps
4
+ * its hairline up under the pointer and moves nothing.
5
+ */
6
+ .crewlet-brand-chip {
7
+ display: inline-flex;
8
+ align-items: center;
9
+ gap: var(--spacing-2);
10
+ min-width: 0;
11
+ max-width: 100%;
12
+ min-height: var(--size-control-sm);
13
+ box-sizing: border-box;
14
+ padding: 2px var(--spacing-2) 2px 2px;
15
+ border: 1px solid var(--color-border-default);
16
+ border-radius: var(--radius-pill);
17
+ background: var(--color-surface-subtle);
18
+ color: var(--color-text-secondary);
19
+ font-size: var(--font-size-compact);
20
+ font-weight: var(--font-weight-medium);
21
+ text-decoration: none;
22
+ transition:
23
+ border-color var(--motion-duration-fast) var(--motion-easing-out),
24
+ color var(--motion-duration-fast) var(--motion-easing-out);
25
+ }
26
+
27
+ .crewlet-brand-chip:hover {
28
+ border-color: var(--color-border-hover);
29
+ color: var(--color-text-primary);
30
+ text-decoration: none;
31
+ }
32
+
33
+ .crewlet-brand-chip:focus-visible {
34
+ outline: 2px solid var(--color-focus);
35
+ outline-offset: var(--size-focus-ring-inset-offset);
36
+ }
37
+
38
+ /* THE MARK ON ITS OWN PLATE, so a mark drawn for a light ground still reads
39
+ on a dark theme: the brand's square logo at the chip's inner height. */
40
+ .crewlet-brand-chip__mark {
41
+ display: inline-flex;
42
+ flex: none;
43
+ align-items: center;
44
+ justify-content: center;
45
+ width: calc(var(--size-control-sm) - 6px);
46
+ height: calc(var(--size-control-sm) - 6px);
47
+ overflow: hidden;
48
+ border-radius: var(--radius-circle);
49
+ background: var(--color-surface-inset);
50
+ box-shadow: inset 0 0 0 1px var(--color-border-default);
51
+ }
52
+
53
+ .crewlet-brand-chip__mark--glyph {
54
+ color: var(--color-text-tertiary);
55
+ }
56
+
57
+ .crewlet-brand-chip__image {
58
+ display: block;
59
+ width: 100%;
60
+ height: 100%;
61
+ object-fit: contain;
62
+ }
63
+
64
+ .crewlet-brand-chip__label {
65
+ min-width: 0;
66
+ overflow: hidden;
67
+ text-overflow: ellipsis;
68
+ white-space: nowrap;
69
+ }
70
+
71
+ .crewlet-brand-chip__chevron {
72
+ display: inline-flex;
73
+ flex: none;
74
+ color: var(--color-text-tertiary);
75
+ }
76
+
77
+ @media (prefers-reduced-motion: reduce) {
78
+ .crewlet-brand-chip {
79
+ transition: none;
80
+ }
81
+ }
@@ -0,0 +1,75 @@
1
+ import { type BrandColors } from '../BrandScope/index.js';
2
+ /** What the sample draws: the opening of a doc, or a title slide. */
3
+ export type BrandSampleKind = 'doc' | 'slide';
4
+ /** The mode the sample is drawn in, whatever mode the page around it is in. */
5
+ export type BrandSampleMode = 'light' | 'dark';
6
+ /**
7
+ * A brand's colours by role, as the engine stores them: BrandScope's own. Each
8
+ * is `#rrggbb`; one that is absent, or is not one, takes the product's value
9
+ * for the sample's mode.
10
+ */
11
+ export type BrandSampleColors = BrandColors;
12
+ export interface BrandSampleLabels {
13
+ /** The doc's heading. */
14
+ heading: string;
15
+ /** The doc's sentence, which the link follows. */
16
+ body: string;
17
+ /** The link at the end of the doc's sentence, drawn in the accent. */
18
+ link: string;
19
+ /** The quiet line under the doc's sentence. */
20
+ byline: string;
21
+ /** The slide's heading. */
22
+ slideHeading: string;
23
+ /** The slide's footer, after the company's name. */
24
+ slideFooter: string;
25
+ /** What the drawing is, said as its name. */
26
+ label: (name: string, kind: BrandSampleKind, mode: BrandSampleMode) => string;
27
+ }
28
+ export interface BrandSampleProps {
29
+ kind: BrandSampleKind;
30
+ /** The mode it is drawn in. It follows this, not the page, so a preview can show both. */
31
+ mode: BrandSampleMode;
32
+ /** The company's name: the slide's footer, and the doc's wordmark where there is no logo. */
33
+ name: string;
34
+ colors: BrandSampleColors;
35
+ /**
36
+ * The logo for a light ground, as an address the host has already
37
+ * validated (the engine's file route, through the dashboard's checked blob
38
+ * path).
39
+ */
40
+ logo?: string | null | undefined;
41
+ /** The logo for a dark ground. In dark mode it stands in for `logo`, which it falls back to. */
42
+ logoOnDark?: string | null | undefined;
43
+ /** The square mark the slide carries. Without one, the mode's logo stands in. */
44
+ mark?: string | null | undefined;
45
+ /** The family list for headings. Not a list of family names, it is the package's display face. */
46
+ headingFamily?: string | undefined;
47
+ /** The family list for everything else. Not a list of family names, it is the package's sans. */
48
+ bodyFamily?: string | undefined;
49
+ className?: string | undefined;
50
+ labels?: Partial<BrandSampleLabels> | undefined;
51
+ }
52
+ /**
53
+ * A company's brand, drawn: the opening of a doc or a title slide in its
54
+ * colours, its type and its logo. The preview beside Company › Brand, a brand
55
+ * kit's own view and its gallery cover.
56
+ *
57
+ * A PICTURE, NAMED. It is an image to assistive technology, named by what it
58
+ * shows ("A doc in the Acme brand, light mode"); the words inside are sample
59
+ * copy, and its link is drawn, never followed.
60
+ *
61
+ * DRAWN THROUGH THE BRAND MAPPING ITSELF. The sample is a BrandScope pinned to
62
+ * its `mode`: its ground, text, accent and faces are the public tokens as the
63
+ * mapping the artifact kit draws every page with sets them, so the preview
64
+ * shows what an artifact will look like rather than a second reading of the
65
+ * rules. The sample is its mode whatever mode the page is in (a role the
66
+ * brand lacks, and every token that is not a brand role, takes the default
67
+ * theme's value for the mode), so two samples in two modes sit side by side.
68
+ * A colour reaches a style only once it has passed `#rrggbb`, and a family
69
+ * list only once it reads as family names; anything else is the product's.
70
+ *
71
+ * ONE SHAPE AT ANY SIZE. The sample keeps a 16:9 frame and sets every length
72
+ * against its own width (a container query unit), so the same drawing reads
73
+ * as a gallery cover and as a preview beside a form.
74
+ */
75
+ export declare function BrandSample({ kind, mode, name, colors, logo, logoOnDark, mark, headingFamily, bodyFamily, className, labels, }: BrandSampleProps): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import './BrandSample.css';
2
+ export { BrandSample } from './BrandSample.js';
3
+ export type { BrandSampleColors, BrandSampleKind, BrandSampleLabels, BrandSampleMode, BrandSampleProps } from './BrandSample.js';
@@ -0,0 +1,5 @@
1
+ export { BrandSample } from '../chunk-OEEYL2CM.js';
2
+ import '../chunk-P3OIM6OC.js';
3
+ import '../chunk-5SGHW42B.js';
4
+ import '../chunk-UZMNR366.js';
5
+ import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,185 @@
1
+ /*
2
+ * A company's brand, drawn: a doc's opening or a title slide, in a 16:9 frame
3
+ * that sets every length against its own width, so one drawing reads at a
4
+ * gallery cover's size and at a preview's.
5
+ *
6
+ * It paints with the public tokens, which the sample's BrandScope (pinned to
7
+ * the sample's mode) sets from the brand through the artifact kit's own
8
+ * mapping: the ground, the text, the accent, the highlight and the two faces,
9
+ * and the quiet line in the tertiary text of the sample's pinned mode.
10
+ */
11
+ .crewlet-brand-sample {
12
+ /* The frame's corner. A host drawing the sample edge to edge in a cover
13
+ that clips its own corners sets it to its own. */
14
+ --crewlet-brand-sample-radius: var(--radius-lg);
15
+
16
+ /* THE SAMPLE IS ITS OWN CONTAINER, so `cqi` inside it is its own width. */
17
+ container-type: inline-size;
18
+ position: relative;
19
+ display: block;
20
+ width: 100%;
21
+ aspect-ratio: 16 / 9;
22
+ overflow: hidden;
23
+ border-radius: var(--crewlet-brand-sample-radius);
24
+ background: var(--color-surface-background);
25
+ /* AN EDGE OF ITS OWN, inside the frame, so a ground that matches the page
26
+ is still a frame. */
27
+ box-shadow: inset 0 0 0 1px var(--color-border-hover);
28
+ color: var(--color-text-primary);
29
+ font-family: var(--font-family-sans);
30
+ line-height: var(--font-line-height-snug);
31
+ user-select: none;
32
+ }
33
+
34
+ .crewlet-brand-sample__page,
35
+ .crewlet-brand-sample__slide {
36
+ position: absolute;
37
+ inset: 0;
38
+ display: flex;
39
+ flex-direction: column;
40
+ box-sizing: border-box;
41
+ min-width: 0;
42
+ }
43
+
44
+ /* ---- the doc's opening ---- */
45
+
46
+ .crewlet-brand-sample__page {
47
+ align-items: flex-start;
48
+ gap: 2.4cqi;
49
+ padding: 6cqi 7cqi;
50
+ }
51
+
52
+ .crewlet-brand-sample__brand {
53
+ display: flex;
54
+ align-items: center;
55
+ height: 6cqi;
56
+ max-width: 40%;
57
+ margin-bottom: 1.6cqi;
58
+ }
59
+
60
+ .crewlet-brand-sample__logo {
61
+ display: block;
62
+ max-width: 100%;
63
+ max-height: 100%;
64
+ object-fit: contain;
65
+ }
66
+
67
+ /* WHERE THERE IS NO LOGO, the company's name in the heading face. */
68
+ .crewlet-brand-sample__wordmark {
69
+ overflow: hidden;
70
+ font-family: var(--font-family-display);
71
+ font-size: 3.4cqi;
72
+ font-weight: var(--font-weight-semibold);
73
+ text-overflow: ellipsis;
74
+ white-space: nowrap;
75
+ }
76
+
77
+ .crewlet-brand-sample__heading {
78
+ max-width: 100%;
79
+ overflow: hidden;
80
+ font-family: var(--font-family-display);
81
+ font-size: 6cqi;
82
+ font-weight: var(--font-weight-semibold);
83
+ letter-spacing: var(--font-letter-spacing-tight);
84
+ line-height: 1.1;
85
+ text-overflow: ellipsis;
86
+ white-space: nowrap;
87
+ }
88
+
89
+ /* THE ACCENT RULE under the heading, in the brand's main colour for the mode. */
90
+ .crewlet-brand-sample__rule {
91
+ display: block;
92
+ width: 12cqi;
93
+ height: 0.8cqi;
94
+ border-radius: var(--radius-pill);
95
+ background: var(--color-brand-accent);
96
+ }
97
+
98
+ .crewlet-brand-sample__body {
99
+ max-width: 82%;
100
+ font-size: 2.8cqi;
101
+ line-height: var(--font-line-height-normal);
102
+ }
103
+
104
+ /* A LINK, DRAWN: the accent ink and its underline, and nothing to follow. */
105
+ .crewlet-brand-sample__link {
106
+ color: var(--color-brand-accent);
107
+ text-decoration: underline;
108
+ text-decoration-thickness: 0.2cqi;
109
+ text-underline-offset: 0.5cqi;
110
+ }
111
+
112
+ .crewlet-brand-sample__byline {
113
+ margin-top: auto;
114
+ color: var(--color-text-tertiary);
115
+ font-size: 2.2cqi;
116
+ }
117
+
118
+ /* ---- the title slide ---- */
119
+
120
+ .crewlet-brand-sample__slide {
121
+ justify-content: flex-end;
122
+ gap: 2.4cqi;
123
+ padding: 6.5cqi 7cqi;
124
+ }
125
+
126
+ /* The mark in the slide's top corner, square, at the slide's own scale. */
127
+ .crewlet-brand-sample__slide .crewlet-brand-sample__brand {
128
+ position: absolute;
129
+ top: 6.5cqi;
130
+ left: 7cqi;
131
+ height: 7cqi;
132
+ max-width: 30%;
133
+ margin: 0;
134
+ }
135
+
136
+ .crewlet-brand-sample__logo--mark {
137
+ width: 7cqi;
138
+ height: 7cqi;
139
+ }
140
+
141
+ /* THE ACCENT BAR: the brand's main colour, then its second where it has one. */
142
+ .crewlet-brand-sample__bar {
143
+ display: flex;
144
+ gap: 0.8cqi;
145
+ height: 1cqi;
146
+ }
147
+
148
+ .crewlet-brand-sample__bar-primary,
149
+ .crewlet-brand-sample__bar-secondary {
150
+ display: block;
151
+ height: 100%;
152
+ border-radius: var(--radius-pill);
153
+ }
154
+
155
+ .crewlet-brand-sample__bar-primary {
156
+ width: 12cqi;
157
+ background: var(--color-brand-accent);
158
+ }
159
+
160
+ .crewlet-brand-sample__bar-secondary {
161
+ width: 4cqi;
162
+ background: var(--color-brand-highlight);
163
+ }
164
+
165
+ /* TWO LINES AT MOST, set large: a title slide's heading. */
166
+ .crewlet-brand-sample__heading--slide {
167
+ display: -webkit-box;
168
+ max-width: 48%;
169
+ font-size: 7.5cqi;
170
+ line-height: 1.05;
171
+ white-space: normal;
172
+ -webkit-box-orient: vertical;
173
+ -webkit-line-clamp: 2;
174
+ }
175
+
176
+ .crewlet-brand-sample__footer {
177
+ margin-top: 3cqi;
178
+ overflow: hidden;
179
+ color: var(--color-text-tertiary);
180
+ font-size: 2cqi;
181
+ letter-spacing: var(--font-letter-spacing-wide);
182
+ text-overflow: ellipsis;
183
+ text-transform: uppercase;
184
+ white-space: nowrap;
185
+ }
@@ -0,0 +1,61 @@
1
+ import type { HTMLAttributes, ReactNode } from 'react';
2
+ /**
3
+ * A brand's colours by role, as the engine stores them. Each is `#rrggbb`;
4
+ * one that is absent, or is not one, sets nothing, and the token it would
5
+ * have driven keeps the page's value.
6
+ */
7
+ export interface BrandColors {
8
+ primary?: string | undefined;
9
+ primary_on_dark?: string | undefined;
10
+ secondary?: string | undefined;
11
+ text?: string | undefined;
12
+ light_ground?: string | undefined;
13
+ dark_ground?: string | undefined;
14
+ }
15
+ /** A mode a scope can be pinned to, for a preview that shows a brand in one mode whatever the page is in. */
16
+ export type BrandScopeMode = 'light' | 'dark';
17
+ export interface BrandScopeProps extends HTMLAttributes<HTMLDivElement> {
18
+ colors: BrandColors;
19
+ /** The family list for headings. Set only when it reads as family names. */
20
+ headingFamily?: string | undefined;
21
+ /** The family list for everything else. Set only when it reads as family names. */
22
+ bodyFamily?: string | undefined;
23
+ /**
24
+ * Pins the mode. Left out, the scope follows the page's light or dark, as
25
+ * every surface in it does; pinned, it is that mode whatever the page is in:
26
+ * the default theme's palette for the mode, with the brand's steps for it.
27
+ */
28
+ mode?: BrandScopeMode | undefined;
29
+ /** The region the brand applies to. */
30
+ children?: ReactNode;
31
+ }
32
+ /**
33
+ * The inputs a brand sets, each only once it has passed its gate: a colour as
34
+ * `#rrggbb`, a family list as family names, which then ends in the page's own
35
+ * face, so a face still loading draws as the page's type.
36
+ */
37
+ export declare function brandScopeInputs(colors: BrandColors, headingFamily?: string, bodyFamily?: string): Record<string, string>;
38
+ /**
39
+ * A region of the page in a company's brand: a doc, a board, a preview. The
40
+ * public tokens inside it (the accent and its family, the grounds, the body
41
+ * text, the faces) take the brand's values, and the page's chrome around it
42
+ * keeps its own.
43
+ *
44
+ * THE MAPPING IS THE ARTIFACT KIT'S. The rules that derive the accent's hover,
45
+ * press, ink, soft fills and the label on it from one colour, per mode, are
46
+ * one stylesheet in @crewlethq/tokens (`css/brand`), and this component's
47
+ * stylesheet (`css/brand-scope`) is built from it with its selectors moved
48
+ * onto the scope. A page in the kit and a region of the dashboard in the same
49
+ * brand are drawn by the same rules. The focus ring stays the theme's.
50
+ *
51
+ * TWO ELEMENTS, ONE BOX. The outer element carries the inputs and captures
52
+ * the page's value of every token the brand drives, which an input left out
53
+ * falls back to; it draws no box (`display: contents`). The inner element is
54
+ * the box, with `className` and every other attribute on it, and sets the
55
+ * body text and face so plain text inside follows the brand. It paints no
56
+ * ground: a surface inside paints its own with the tokens.
57
+ *
58
+ * Nothing a person typed reaches a style unchecked: a colour only as
59
+ * `#rrggbb`, a family list only when it reads as family names.
60
+ */
61
+ export declare function BrandScope({ colors, headingFamily, bodyFamily, mode, className, children, ...rest }: BrandScopeProps): import("react").JSX.Element;
@@ -0,0 +1,4 @@
1
+ import '@crewlethq/tokens/css/brand-scope';
2
+ import './BrandScope.css';
3
+ export { BrandScope, brandScopeInputs } from './BrandScope.js';
4
+ export type { BrandColors, BrandScopeMode, BrandScopeProps } from './BrandScope.js';
@@ -0,0 +1,4 @@
1
+ export { BrandScope, brandScopeInputs } from '../chunk-P3OIM6OC.js';
2
+ import '../chunk-5SGHW42B.js';
3
+ import '../chunk-UZMNR366.js';
4
+ import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,29 @@
1
+ /*
2
+ * A region in a company's brand. The mapping itself (the captured page values
3
+ * on `.crewlet-brand-scope`, the brand's steps and public tokens on
4
+ * `.crewlet-brand-scope__layer`) is @crewlethq/tokens' css/brand-scope,
5
+ * imported beside this file and built from the one source the artifact kit's
6
+ * brand layer is built from. This file is only the two elements' own shape.
7
+ */
8
+
9
+ /* The outer element carries the inputs and the capture, and draws no box. */
10
+ .crewlet-brand-scope {
11
+ display: contents;
12
+ }
13
+
14
+ /* THE BOX, with the body text and face of the brand, so plain text inside it
15
+ follows the brand without a rule of its own. It paints no ground. */
16
+ .crewlet-brand-scope__layer {
17
+ color: var(--color-text-primary);
18
+ font-family: var(--font-family-sans);
19
+ }
20
+
21
+ /* A PINNED MODE is that mode for the platform's own drawing too: a native
22
+ control or a scrollbar inside a light preview on a dark page is light. */
23
+ .crewlet-brand-scope[data-mode='light'] > .crewlet-brand-scope__layer {
24
+ color-scheme: light;
25
+ }
26
+
27
+ .crewlet-brand-scope[data-mode='dark'] > .crewlet-brand-scope__layer {
28
+ color-scheme: dark;
29
+ }
@@ -1,11 +1,11 @@
1
- export { CANVAS_COMPOSE_CONTEXT, CANVAS_FIT_MAX_ZOOM, CANVAS_FIT_PADDING, CANVAS_FOCUS_CONTEXT, CANVAS_MAX_ZOOM, CANVAS_MIN_ZOOM, CANVAS_PAN_MARGIN, CANVAS_PAN_STEP, CANVAS_REVEAL_PADDING, CANVAS_TAP_SLOP, CANVAS_WHEEL_LINE_PX, CANVAS_WHEEL_ZOOM_PER_PIXEL, CANVAS_ZOOM_CEILING, CANVAS_ZOOM_LIMITS, CANVAS_ZOOM_STEP, Canvas, IDENTITY_VIEW, ShortcutTip, anchorView, beyondSlop, clampPan, clampZoom, fitView, gridOf, panBy, pinchView, regionView, revealView, screenRect, toScreen, toWorld, wheelPixels, wheelZoomFactor, zoomAt, zoomLimits } from '../chunk-ICPQIAD6.js';
1
+ export { CANVAS_COMPOSE_CONTEXT, CANVAS_FIT_MAX_ZOOM, CANVAS_FIT_PADDING, CANVAS_FOCUS_CONTEXT, CANVAS_MAX_ZOOM, CANVAS_MIN_ZOOM, CANVAS_PAN_MARGIN, CANVAS_PAN_STEP, CANVAS_REVEAL_PADDING, CANVAS_TAP_SLOP, CANVAS_WHEEL_LINE_PX, CANVAS_WHEEL_ZOOM_PER_PIXEL, CANVAS_ZOOM_CEILING, CANVAS_ZOOM_LIMITS, CANVAS_ZOOM_STEP, Canvas, IDENTITY_VIEW, ShortcutTip, anchorView, beyondSlop, clampPan, clampZoom, fitView, gridOf, panBy, pinchView, regionView, revealView, screenRect, toScreen, toWorld, wheelPixels, wheelZoomFactor, zoomAt, zoomLimits } from '../chunk-D7Q5MQRF.js';
2
2
  import '../chunk-LM3ISVJA.js';
3
3
  import '../chunk-I33UIUZD.js';
4
4
  import '../chunk-SMBKXWML.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,15 +1,15 @@
1
- export { BOARD_NAME_MIN_CHARS, CANVAS_BOARD_MAX_LIVE, CANVAS_BOARD_MIN_LIVE_WIDTH, CANVAS_BOARD_MIN_ZOOM, CANVAS_NOTE_COLORS, CanvasBoard, TITLE_GLYPH_EM, boardName, boardRoom, liveBoards, titleSize } from '../chunk-CNTBUK24.js';
1
+ export { BOARD_NAME_MIN_CHARS, CANVAS_BOARD_MAX_LIVE, CANVAS_BOARD_MIN_LIVE_WIDTH, CANVAS_BOARD_MIN_ZOOM, CANVAS_NOTE_COLORS, CanvasBoard, TITLE_GLYPH_EM, boardName, boardRoom, liveBoards, titleSize } from '../chunk-VP2ODUCC.js';
2
2
  import '../chunk-5SZGKSGL.js';
3
- import '../chunk-NILOJV62.js';
3
+ import '../chunk-X4NIE7CI.js';
4
4
  import '../chunk-NR4CPM4T.js';
5
- import '../chunk-ICPQIAD6.js';
5
+ import '../chunk-D7Q5MQRF.js';
6
6
  import '../chunk-LM3ISVJA.js';
7
7
  import '../chunk-I33UIUZD.js';
8
8
  import '../chunk-SMBKXWML.js';
9
9
  import '../chunk-OMV5W53A.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,13 +1,13 @@
1
- export { CanvasToolbar, toolForKey } from '../chunk-NILOJV62.js';
1
+ export { CanvasToolbar, toolForKey } from '../chunk-X4NIE7CI.js';
2
2
  import '../chunk-NR4CPM4T.js';
3
- import '../chunk-ICPQIAD6.js';
3
+ import '../chunk-D7Q5MQRF.js';
4
4
  import '../chunk-LM3ISVJA.js';
5
5
  import '../chunk-I33UIUZD.js';
6
6
  import '../chunk-SMBKXWML.js';
7
7
  import '../chunk-OMV5W53A.js';
8
8
  import '../chunk-OG6CL3EB.js';
9
9
  import '../chunk-H5XTJ7GJ.js';
10
- import '../chunk-NUZHC6MM.js';
11
10
  import '../chunk-LACA4JGC.js';
11
+ import '../chunk-NUZHC6MM.js';
12
12
  import '../chunk-BZFWDIV6.js';
13
13
  import '../chunk-ODEQTPFM.js';
@@ -24,6 +24,14 @@ export interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement
24
24
  * which is why it is a prop here rather than something a caller can spell.
25
25
  */
26
26
  indeterminate?: boolean;
27
+ /**
28
+ * The label is SAID AND NOT DRAWN: the box alone, on a target the pointer
29
+ * floor allows. For a box whose surroundings already show what it picks (a
30
+ * card's title, a row of a list), where printing "Select Q3 plan" beside it
31
+ * would only repeat the row. The label is still the box's name, so it still
32
+ * says what the box picks.
33
+ */
34
+ hideLabel?: boolean | undefined;
27
35
  /** The new state, for a caller that does not want to read it off an event. */
28
36
  onCheckedChange?: (checked: boolean) => void;
29
37
  }
@@ -1,10 +1,10 @@
1
- export { Checkbox, CheckboxGroup } from '../chunk-YUAQSWNW.js';
2
- import '../chunk-D4EOPIFL.js';
1
+ export { Checkbox, CheckboxGroup } from '../chunk-NCHKKYPQ.js';
2
+ import '../chunk-EXRRTKWT.js';
3
3
  import '../chunk-XCUUI7E7.js';
4
4
  import '../chunk-PQADV6P6.js';
5
5
  import '../chunk-RSAQOKH3.js';
6
6
  import '../chunk-H5XTJ7GJ.js';
7
- import '../chunk-NUZHC6MM.js';
8
7
  import '../chunk-LACA4JGC.js';
8
+ import '../chunk-NUZHC6MM.js';
9
9
  import '../chunk-BZFWDIV6.js';
10
10
  import '../chunk-ODEQTPFM.js';
@@ -126,6 +126,24 @@
126
126
  font-size: var(--font-size-compact);
127
127
  }
128
128
 
129
+ /*
130
+ * THE BARE BOX (`hideLabel`): no words beside it, so the row's floor and its
131
+ * gap go, and the box is centred on a square the pointer floor allows. The
132
+ * label is still its name, said rather than printed.
133
+ */
134
+ .crewlet-checkbox--bare {
135
+ display: inline-flex;
136
+ align-items: center;
137
+ justify-content: center;
138
+ gap: 0;
139
+ min-width: var(--size-target-min);
140
+ min-height: var(--size-target-min);
141
+ }
142
+
143
+ .crewlet-checkbox--bare .crewlet-checkbox__control {
144
+ margin: 0;
145
+ }
146
+
129
147
  .crewlet-checkbox.is-disabled,
130
148
  .crewlet-checkbox.is-disabled .crewlet-checkbox__control {
131
149
  cursor: not-allowed;
@@ -0,0 +1,63 @@
1
+ import { type ReactNode } from 'react';
2
+ export interface ColorFieldLabels {
3
+ /** Why a typed value was refused, with what right looks like. */
4
+ invalid: string;
5
+ /** Why an emptied required field was refused. */
6
+ missing: string;
7
+ /** Names the colour picker beside the field: "Pick the Primary colour". */
8
+ picker: (label: string) => string;
9
+ /**
10
+ * What the empty field shows: the shape a value takes, never a colour, which
11
+ * an empty field would seem to hold.
12
+ */
13
+ placeholder: string;
14
+ }
15
+ export interface ColorFieldProps {
16
+ /** The colour's role, which is the field's name: "Primary". */
17
+ label: string;
18
+ /**
19
+ * The colour as it stands, `#rrggbb`, or `''` for none. Controlled: the
20
+ * field reports a new value only once it is one.
21
+ */
22
+ value: string;
23
+ /**
24
+ * A new colour: lowercase `#rrggbb`, or `''` when an optional field is
25
+ * emptied. Never called with a value that is not one, so a host never
26
+ * stores half a hex code.
27
+ */
28
+ onChange: (value: string) => void;
29
+ /** An answer is required: emptying the field is refused rather than reported. */
30
+ required?: boolean | undefined;
31
+ /** Says "(optional)" beside the label. */
32
+ optional?: boolean | undefined;
33
+ /** Where the colour is used: "Links, buttons and accents". */
34
+ helper?: ReactNode;
35
+ /**
36
+ * A refusal from elsewhere (the engine's), drawn as the field's error. The
37
+ * field's own refusal of a value it cannot read is drawn without it.
38
+ */
39
+ error?: ReactNode;
40
+ disabled?: boolean | undefined;
41
+ /** The text field's name, for a form that posts. */
42
+ name?: string | undefined;
43
+ id?: string | undefined;
44
+ className?: string | undefined;
45
+ labels?: Partial<ColorFieldLabels> | undefined;
46
+ }
47
+ /**
48
+ * A colour a person chooses: a hex field, a swatch that opens the platform's
49
+ * colour picker, and the reason a value was refused.
50
+ *
51
+ * THE VALUE IS `#` AND SIX HEX DIGITS, and nothing else is ever reported: the
52
+ * field holds what is being typed, and a value reaches `onChange` only once it
53
+ * reads as a colour, lowercased, the one spelling the engine stores. A value
54
+ * that does not read is refused when the reader leaves the field (Enter or
55
+ * Tab), never while they are still typing it, with a sentence saying what
56
+ * right looks like.
57
+ *
58
+ * THE SWATCH IS THE PICKER. It is the platform's own colour input, drawn as
59
+ * the chip of the colour the field holds and named for it, so it is a real,
60
+ * labelled control a keyboard reaches; picking a colour there writes it into
61
+ * the field. With no colour yet, the swatch is the hatch of none.
62
+ */
63
+ export declare function ColorField({ label, value, onChange, required, optional, helper, error, disabled, name, id, className, labels, }: ColorFieldProps): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import './ColorField.css';
2
+ export { ColorField } from './ColorField.js';
3
+ export type { ColorFieldLabels, ColorFieldProps } from './ColorField.js';
@@ -0,0 +1,11 @@
1
+ export { ColorField } from '../chunk-W6FOEBIL.js';
2
+ import '../chunk-UZMNR366.js';
3
+ import '../chunk-EXRRTKWT.js';
4
+ import '../chunk-XCUUI7E7.js';
5
+ import '../chunk-PQADV6P6.js';
6
+ import '../chunk-RSAQOKH3.js';
7
+ import '../chunk-H5XTJ7GJ.js';
8
+ import '../chunk-LACA4JGC.js';
9
+ import '../chunk-NUZHC6MM.js';
10
+ import '../chunk-BZFWDIV6.js';
11
+ import '../chunk-ODEQTPFM.js';