@crewlethq/ui 0.35.1 → 0.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/README.md +73 -0
  2. package/dist/AgentHandoffPanel/AgentHandoffPanel.d.ts +99 -0
  3. package/dist/AgentHandoffPanel/index.d.ts +3 -0
  4. package/dist/AgentHandoffPanel/index.js +16 -0
  5. package/dist/AgentHandoffPanel-JWSW62GU.css +151 -0
  6. package/dist/ArrangeFrame/index.js +1 -1
  7. package/dist/{ArrangeFrame-3PLZAG22.css → ArrangeFrame-QXOQTFAH.css} +22 -5
  8. package/dist/ArrangeList/index.js +4 -3
  9. package/dist/ArtifactBar/ArtifactBar.d.ts +2 -1
  10. package/dist/ArtifactBar/index.js +2 -2
  11. package/dist/{ArtifactBar-HV5AT4RG.css → ArtifactBar-FWPBBKQ5.css} +8 -0
  12. package/dist/ArtifactCard/index.js +3 -3
  13. package/dist/ArtifactCover/index.js +3 -2
  14. package/dist/ArtifactKindIllustration/ArtifactKindIllustration.d.ts +16 -7
  15. package/dist/ArtifactKindIllustration/index.js +1 -1
  16. package/dist/{ArtifactKindIllustration-5FPRJQ3P.css → ArtifactKindIllustration-5KTP43QS.css} +36 -0
  17. package/dist/ArtifactMakeRow/ArtifactMakeRow.d.ts +39 -0
  18. package/dist/ArtifactMakeRow/index.d.ts +4 -0
  19. package/dist/ArtifactMakeRow/index.js +4 -0
  20. package/dist/ArtifactMakeRow-RWUTS5MC.css +167 -0
  21. package/dist/ArtifactPanel/ArtifactPanel.d.ts +8 -1
  22. package/dist/ArtifactPanel/index.js +1 -1
  23. package/dist/{ArtifactPanel-HW3SU7CP.css → ArtifactPanel-KKUUIPEU.css} +9 -0
  24. package/dist/AuthLayout/index.js +2 -2
  25. package/dist/AvatarPicker/index.js +2 -2
  26. package/dist/Canvas/index.js +2 -2
  27. package/dist/CanvasBoard/CanvasBoard.d.ts +27 -13
  28. package/dist/CanvasBoard/index.d.ts +1 -1
  29. package/dist/CanvasBoard/index.js +4 -4
  30. package/dist/{CanvasBoard-5NNSKY6A.css → CanvasBoard-TS4P356F.css} +13 -6
  31. package/dist/CanvasToolbar/index.js +3 -3
  32. package/dist/Card/index.js +1 -1
  33. package/dist/{Card-KJOYHDTJ.css → Card-QOVASQNU.css} +17 -12
  34. package/dist/Checkbox/index.js +3 -2
  35. package/dist/ChoiceButtons/index.js +1 -1
  36. package/dist/{ChoiceButtons-DJ5EOGUA.css → ChoiceButtons-FLIFXFFS.css} +10 -0
  37. package/dist/ChoiceList/index.js +1 -1
  38. package/dist/{ChoiceList-RBL7FNQL.css → ChoiceList-EA2W6MOS.css} +36 -5
  39. package/dist/Combobox/index.js +3 -2
  40. package/dist/CommandPalette/index.js +3 -2
  41. package/dist/CommentThread/index.js +6 -5
  42. package/dist/Composer/Composer.d.ts +4 -0
  43. package/dist/Composer/index.js +3 -2
  44. package/dist/{Composer-ABGJIAIR.css → Composer-PXITWNEK.css} +26 -15
  45. package/dist/ConfirmField/index.js +3 -2
  46. package/dist/DataTable/index.js +5 -4
  47. package/dist/DataView/index.js +9 -8
  48. package/dist/DatasetSource/DatasetSource.d.ts +4 -0
  49. package/dist/DatasetSource/index.js +1 -1
  50. package/dist/{DatasetSource-XFPZBRXL.css → DatasetSource-SMGX4PS5.css} +38 -4
  51. package/dist/DateTimePicker/index.js +2 -1
  52. package/dist/{DateTimePicker-HG2KQXQ6.css → DateTimePicker-2IVTKFV2.css} +15 -2
  53. package/dist/DocTabsEditor/index.js +4 -3
  54. package/dist/Document/Document.d.ts +15 -3
  55. package/dist/Document/index.js +2 -1
  56. package/dist/{Document-JUGCSQ4L.css → Document-YFWTWXJP.css} +34 -2
  57. package/dist/{Editor-BVQHBF7L.js → Editor-HORWMUM3.js} +2 -1
  58. package/dist/FilterChip/index.js +1 -1
  59. package/dist/{FilterChip-EZ4QMW4E.css → FilterChip-VL33P3JL.css} +5 -1
  60. package/dist/Input/index.js +2 -1
  61. package/dist/{Input-GBZSFXLU.css → Input-ABGOFENS.css} +46 -10
  62. package/dist/LayersList/index.js +1 -1
  63. package/dist/{LayersList-NQZEIPZB.css → LayersList-TBNF4XGL.css} +16 -3
  64. package/dist/LinkInterstitial/index.js +2 -2
  65. package/dist/ListInput/index.js +4 -3
  66. package/dist/LivePreview/LivePreview.d.ts +105 -25
  67. package/dist/LivePreview/budget.d.ts +64 -20
  68. package/dist/LivePreview/index.d.ts +5 -3
  69. package/dist/LivePreview/index.js +1 -1
  70. package/dist/LivePreview/stills.d.ts +57 -0
  71. package/dist/LivePreview-BROGKR4N.css +113 -0
  72. package/dist/PresenterView/index.js +2 -2
  73. package/dist/PrincipalPicker/index.js +4 -3
  74. package/dist/RichEditor/index.js +1 -1
  75. package/dist/Select/index.js +2 -1
  76. package/dist/{Select-A54YS5EP.css → Select-W3CHTZXP.css} +18 -2
  77. package/dist/ShareDialog/index.js +5 -4
  78. package/dist/SheetColumnEditor/index.js +6 -5
  79. package/dist/SheetGrid/index.js +4 -4
  80. package/dist/SlideCompare/index.js +2 -2
  81. package/dist/SlideFilmstrip/index.js +3 -3
  82. package/dist/{SlideFilmstrip-4ITZLMO4.css → SlideFilmstrip-PAT7P4OG.css} +26 -7
  83. package/dist/SlideGrid/index.js +2 -2
  84. package/dist/{SlideGrid-S4LTJ4UU.css → SlideGrid-FJA33DV4.css} +11 -1
  85. package/dist/SlideStage/index.js +1 -1
  86. package/dist/{SlideStage-S2FISF4C.css → SlideStage-ZTTEQSS2.css} +4 -2
  87. package/dist/SourceEditor/index.js +2 -1
  88. package/dist/{SourceEditor-G2C3STPX.css → SourceEditor-QAYE2JS6.css} +19 -12
  89. package/dist/Switcher/index.js +5 -4
  90. package/dist/TagsInput/index.js +3 -2
  91. package/dist/{TagsInput-XMXTI5Q4.css → TagsInput-7EGBBXHS.css} +7 -1
  92. package/dist/ThemeGallery/index.js +1 -1
  93. package/dist/{ThemeGallery-HSUKBDWY.css → ThemeGallery-X35Y25EX.css} +26 -5
  94. package/dist/TimeWindowPicker/index.js +4 -3
  95. package/dist/{TimeWindowPicker-T763GLXH.css → TimeWindowPicker-DEFDV77Z.css} +15 -2
  96. package/dist/TreeCanvas/index.js +3 -3
  97. package/dist/VersionTimeline/index.js +2 -2
  98. package/dist/{chunk-V43UVX4H.js → chunk-27GD7LVR.js} +1 -1
  99. package/dist/{chunk-CCLNGVCM.js → chunk-2DV4THNQ.js} +2 -2
  100. package/dist/{chunk-2CQLNML5.js → chunk-3PTUDKSR.js} +4 -2
  101. package/dist/{chunk-ONL54WMH.js → chunk-46RL3E54.js} +1 -1
  102. package/dist/{chunk-UHJQDFKQ.js → chunk-4ZJLOKSS.js} +1 -1
  103. package/dist/{chunk-ACA27MZH.js → chunk-5QXRI35B.js} +1 -1
  104. package/dist/{chunk-LL5AFXU7.js → chunk-5RT5O4JR.js} +1 -1
  105. package/dist/chunk-66ADEPFB.js +51 -0
  106. package/dist/{chunk-3Y56GQPM.js → chunk-7VAUGG6B.js} +1 -1
  107. package/dist/{chunk-NKZCJRKO.js → chunk-APDKUGSH.js} +2 -2
  108. package/dist/{chunk-YSJC7AZC.js → chunk-BWOIUOO3.js} +1 -1
  109. package/dist/{chunk-PI7HKLIT.js → chunk-D7GNNID2.js} +3 -1
  110. package/dist/{chunk-THROPJZC.js → chunk-DEMALFHY.js} +1 -1
  111. package/dist/chunk-EOQFPZEE.js +138 -0
  112. package/dist/{chunk-QFNWMWWY.js → chunk-ES4RKQ7B.js} +4 -4
  113. package/dist/{chunk-J6YZ4IYV.js → chunk-FG4O64DV.js} +3 -3
  114. package/dist/{chunk-E35CMI5D.js → chunk-FHHYXZSP.js} +31 -13
  115. package/dist/{chunk-AYB6AYNH.js → chunk-GMLAKNFY.js} +1 -1
  116. package/dist/{chunk-ZB5O3ELS.js → chunk-GRYZ5EP3.js} +4 -2
  117. package/dist/{chunk-ILAEBSLJ.js → chunk-H5NOLRGH.js} +2 -2
  118. package/dist/{chunk-W3UVOZKL.js → chunk-IPAU6FLH.js} +6 -2
  119. package/dist/{chunk-Z6VW6CXX.js → chunk-IQH3DDZ2.js} +2 -2
  120. package/dist/{chunk-6QFAK2WV.js → chunk-IUYUS2SO.js} +4 -1
  121. package/dist/{chunk-AXBRWRGV.js → chunk-JQLS3MZB.js} +1 -1
  122. package/dist/{chunk-FGYET26P.js → chunk-KJW2AS57.js} +1 -1
  123. package/dist/{chunk-QIXMNOBD.js → chunk-KYZMN6I6.js} +2 -2
  124. package/dist/{chunk-73A7D5CE.js → chunk-L4WZSVMT.js} +3 -1
  125. package/dist/{chunk-W7QBBKUE.js → chunk-MJW6SQYB.js} +7 -3
  126. package/dist/{chunk-GMU6SQ6B.js → chunk-MRMHZ437.js} +3 -3
  127. package/dist/{chunk-ULPL26BU.js → chunk-N5SKHIAP.js} +1 -1
  128. package/dist/{chunk-LV4APO72.js → chunk-NQGPD6NX.js} +1 -1
  129. package/dist/{chunk-7UYONN6K.js → chunk-OSZDHN5Z.js} +2 -2
  130. package/dist/chunk-P6WFZDKS.js +111 -0
  131. package/dist/{chunk-CPEPST4S.js → chunk-PJIPUEJ3.js} +1 -1
  132. package/dist/{chunk-QS4ZGTEU.js → chunk-PPFX6GRK.js} +1 -1
  133. package/dist/{chunk-7DZDSSJS.js → chunk-RH2NCQBZ.js} +5 -4
  134. package/dist/{chunk-3VD3G3IL.js → chunk-T5RQGI6O.js} +1 -1
  135. package/dist/{chunk-F2KY4RLI.js → chunk-TVRBQMIX.js} +5 -3
  136. package/dist/{chunk-QEFHYUCY.js → chunk-UWGUKMBK.js} +1 -1
  137. package/dist/{chunk-5YLON2PW.js → chunk-UYZZV4DZ.js} +1 -1
  138. package/dist/{chunk-BQ7AKL2N.js → chunk-VKKUGZ3G.js} +3 -1
  139. package/dist/{chunk-DEJHAOC5.js → chunk-WMXAX6VA.js} +1 -1
  140. package/dist/{chunk-6JVRY5DQ.js → chunk-WNAYQQ6Y.js} +2 -2
  141. package/dist/{chunk-VDPJGP4Q.js → chunk-WX2NIG4G.js} +1 -1
  142. package/dist/{chunk-ZU3DUXD2.js → chunk-WZGYIVYH.js} +1 -1
  143. package/dist/chunk-XGBLRDSU.js +446 -0
  144. package/dist/{chunk-22CQQDFW.js → chunk-XMRTFPWX.js} +2 -2
  145. package/dist/{chunk-HUVG2FFT.js → chunk-Y5BD4MTE.js} +4 -2
  146. package/dist/chunk-YSGLEHND.js +56 -0
  147. package/dist/generated/index.d.ts +2 -0
  148. package/dist/generated/index.js +95 -92
  149. package/dist/index.js +95 -92
  150. package/dist/styles.css +862 -130
  151. package/dist/utils/focusModality.d.ts +41 -0
  152. package/dist/utils/index.d.ts +2 -0
  153. package/dist/utils/index.js +2 -1
  154. package/package.json +3 -3
  155. package/dist/LivePreview-SRO7KHO4.css +0 -65
  156. package/dist/chunk-KF6YGL4B.js +0 -160
  157. package/dist/chunk-TYKQ33CL.js +0 -35
  158. package/dist/{chunk-3P4Y5RX6.js → chunk-4BYHAOHH.js} +1 -1
  159. package/dist/{chunk-3WCNHYXE.js → chunk-5BP6IS3N.js} +0 -0
  160. package/dist/{chunk-KD2IRYCT.js → chunk-5WDXPHEW.js} +1 -1
  161. package/dist/{chunk-OSFA5ROT.js → chunk-FEJANUZK.js} +0 -0
  162. package/dist/{chunk-FJJHD73S.js → chunk-GYBDPCRC.js} +1 -1
  163. package/dist/{chunk-VHZ3AXJD.js → chunk-NQCY44B3.js} +1 -1
  164. package/dist/{chunk-FF5OZV77.js → chunk-W3HYWD63.js} +2 -2
@@ -0,0 +1,39 @@
1
+ import { type ArtifactKind } from '../ArtifactKindGlyph/index.js';
2
+ /** One kind a reader can start from the row. */
3
+ export interface ArtifactMakeRowItem {
4
+ kind: ArtifactKind;
5
+ /** The kind's name, as what one makes: "Docs". */
6
+ label: string;
7
+ /** What the kind is for, in a few words under its name: "Live company figures". */
8
+ detail?: string | undefined;
9
+ /** Where starting one goes. Left out with `disabledReason`, the item starts nothing. */
10
+ href?: string | undefined;
11
+ /** Why this reader cannot start one. The item stays focusable and says so. */
12
+ disabledReason?: string | undefined;
13
+ }
14
+ export interface ArtifactMakeRowProps {
15
+ /** The kinds, in the order they are offered. */
16
+ items: readonly ArtifactMakeRowItem[];
17
+ /** What the row is called for assistive technology, when no heading names it. */
18
+ 'aria-label'?: string | undefined;
19
+ /** The id of the heading that names the row. */
20
+ 'aria-labelledby'?: string | undefined;
21
+ className?: string | undefined;
22
+ }
23
+ /**
24
+ * The kinds a reader can start, as one quiet tray above their work: each
25
+ * kind's glyph on its own tint, its name and what it is for, the whole item
26
+ * one link. A toolbar for making things rather than a hero: one line high on
27
+ * a wide page, the details dropped before a name is cut, and three across on
28
+ * a phone.
29
+ *
30
+ * THE TRAY IS A WORKBENCH, Crewlet's dotted field under the kinds the way the
31
+ * org chart's canvas sits under its seats, and an item lifts off it as a card
32
+ * under the pointer. The glyph is the one coloured thing in each item, so six
33
+ * hues read as six kinds and never as six coloured boxes.
34
+ *
35
+ * AN ITEM THAT CANNOT START is still a stop, so a reader moving through the
36
+ * row by keyboard hears why (`disabledReason`) rather than finding a kind
37
+ * missing.
38
+ */
39
+ export declare function ArtifactMakeRow({ items, 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, className, }: ArtifactMakeRowProps): import("react").JSX.Element;
@@ -0,0 +1,4 @@
1
+ import '../ArtifactKindIllustration/ArtifactKinds.css';
2
+ import './ArtifactMakeRow.css';
3
+ export { ArtifactMakeRow } from './ArtifactMakeRow.js';
4
+ export type { ArtifactMakeRowItem, ArtifactMakeRowProps } from './ArtifactMakeRow.js';
@@ -0,0 +1,4 @@
1
+ export { ArtifactMakeRow } from '../chunk-66ADEPFB.js';
2
+ import '../chunk-CE2THTQR.js';
3
+ import '../chunk-BZFWDIV6.js';
4
+ import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,167 @@
1
+ /*
2
+ * The Make something new tray.
3
+ *
4
+ * Every colour is a token: the tray's ground, its dots and its hairlines are
5
+ * the surface and border steps, and each kind's mark reads the kind's own
6
+ * Fill, Line and Ink (`ArtifactKinds.css`), so the tray repaints with the
7
+ * theme and holds no colour of its own.
8
+ *
9
+ * THE TRAY SIZES ITSELF BY ITS OWN WIDTH, never the window's: it sits in a
10
+ * page column a sidebar narrows, so three steps are container queries on the
11
+ * tray. Under 560px three across in two lines; from 560px the six in one
12
+ * line, each its mark over its name, so a long name is never cut; from 920px
13
+ * the mark beside the name and what the kind is for under it.
14
+ */
15
+
16
+ .crewlet-make-row {
17
+ container-type: inline-size;
18
+ /* A WORKBENCH: the canvas's dotted field on the sheet itself, one step
19
+ quieter than a canvas that pans, inside a hairline ring. */
20
+ border: 1px solid var(--color-border-default);
21
+ border-radius: var(--radius-lg);
22
+ background-color: var(--color-surface-background);
23
+ background-image: radial-gradient(var(--color-border-default) 1px, transparent 1.2px);
24
+ background-size: var(--spacing-4) var(--spacing-4);
25
+ background-position: calc(var(--spacing-4) / 2) calc(var(--spacing-4) / 2);
26
+ }
27
+
28
+ .crewlet-make-row__list {
29
+ display: grid;
30
+ grid-template-columns: repeat(3, minmax(0, 1fr));
31
+ gap: var(--spacing-1);
32
+ margin: 0;
33
+ padding: var(--spacing-1);
34
+ list-style: none;
35
+ }
36
+
37
+ .crewlet-make-row__cell {
38
+ display: flex;
39
+ min-width: 0;
40
+ }
41
+
42
+ .crewlet-make-row__item {
43
+ display: flex;
44
+ flex: 1;
45
+ flex-direction: column;
46
+ align-items: center;
47
+ gap: var(--spacing-2);
48
+ min-width: 0;
49
+ box-sizing: border-box;
50
+ padding: var(--spacing-3) var(--spacing-2);
51
+ border: 1px solid transparent;
52
+ border-radius: var(--radius-md);
53
+ color: var(--color-text-primary);
54
+ text-decoration: none;
55
+ outline: none;
56
+ transition:
57
+ background-color var(--motion-duration-fast) var(--motion-easing-out),
58
+ border-color var(--motion-duration-fast) var(--motion-easing-out),
59
+ box-shadow var(--motion-duration-fast) var(--motion-easing-out);
60
+ }
61
+
62
+ /* THE GLYPH ON ITS KIND'S TINT, the one coloured thing in the item. */
63
+ .crewlet-make-row__mark {
64
+ display: inline-flex;
65
+ flex: none;
66
+ align-items: center;
67
+ justify-content: center;
68
+ width: 32px;
69
+ height: 32px;
70
+ border-radius: var(--radius-md);
71
+ background: var(--crewlet-kind-fill);
72
+ box-shadow: inset 0 0 0 1px var(--crewlet-kind-line);
73
+ color: var(--crewlet-kind-ink);
74
+ }
75
+
76
+ .crewlet-make-row__words {
77
+ display: flex;
78
+ flex-direction: column;
79
+ align-items: center;
80
+ min-width: 0;
81
+ max-width: 100%;
82
+ }
83
+
84
+ .crewlet-make-row__name,
85
+ .crewlet-make-row__detail {
86
+ max-width: 100%;
87
+ overflow: hidden;
88
+ text-overflow: ellipsis;
89
+ white-space: nowrap;
90
+ }
91
+
92
+ .crewlet-make-row__name {
93
+ font-size: var(--font-size-sm);
94
+ font-weight: var(--font-weight-medium);
95
+ line-height: 1.3;
96
+ }
97
+
98
+ /* WHAT IT IS FOR is the widest step's: on a narrower tray the name alone
99
+ says it, and the details are kept as the item's description. */
100
+ .crewlet-make-row__detail {
101
+ display: none;
102
+ color: var(--color-text-tertiary);
103
+ font-size: var(--font-size-xs);
104
+ line-height: 1.35;
105
+ }
106
+
107
+ @container (width >= 560px) {
108
+ .crewlet-make-row__list {
109
+ grid-template-columns: repeat(6, minmax(0, 1fr));
110
+ }
111
+
112
+ .crewlet-make-row__item {
113
+ padding: var(--spacing-2) var(--spacing-1);
114
+ }
115
+ }
116
+
117
+ @container (width >= 920px) {
118
+ .crewlet-make-row__item {
119
+ flex-direction: row;
120
+ gap: var(--spacing-3);
121
+ padding: var(--spacing-2);
122
+ }
123
+
124
+ .crewlet-make-row__words {
125
+ align-items: flex-start;
126
+ }
127
+
128
+ .crewlet-make-row__detail {
129
+ display: block;
130
+ }
131
+ }
132
+
133
+ /* AN ITEM LIFTS OFF THE BENCH under the pointer as a card: the card's
134
+ ground, the hairline a card is found by and the lightest shadow, and
135
+ nothing inside it moves. */
136
+ a.crewlet-make-row__item:hover {
137
+ border-color: var(--color-border-default);
138
+ background-color: var(--color-surface-subtle);
139
+ box-shadow: var(--shadow-xs);
140
+ }
141
+
142
+ a.crewlet-make-row__item:active {
143
+ background-color: var(--color-surface-pressed);
144
+ box-shadow: none;
145
+ }
146
+
147
+ /* ON ITS OWN EDGE: an item draws a hairline once lifted, so the ring sits on
148
+ it rather than standing off it with a gap between two edges. */
149
+ .crewlet-make-row__item:focus-visible {
150
+ outline: 2px solid var(--color-focus);
151
+ outline-offset: var(--size-focus-ring-inset-offset);
152
+ }
153
+
154
+ .crewlet-make-row__item--disabled {
155
+ cursor: not-allowed;
156
+ }
157
+
158
+ .crewlet-make-row__item--disabled .crewlet-make-row__mark,
159
+ .crewlet-make-row__item--disabled .crewlet-make-row__words {
160
+ opacity: 0.55;
161
+ }
162
+
163
+ @media (prefers-reduced-motion: reduce) {
164
+ .crewlet-make-row__item {
165
+ transition: none;
166
+ }
167
+ }
@@ -26,6 +26,13 @@ export interface ArtifactPanelProps {
26
26
  onExpandedChange?: ((expanded: boolean) => void) | undefined;
27
27
  /** Controls in the head, before expand and close. */
28
28
  actions?: ReactNode;
29
+ /**
30
+ * What stays under the body however far it scrolls: the panel's own
31
+ * commit, such as a hand-off's Send. Drawn on a hairline at the panel's
32
+ * foot, never inside the scrolling body, so it is in reach while the
33
+ * reader is at the top of a long form.
34
+ */
35
+ footer?: ReactNode;
29
36
  /**
30
37
  * Whether focus moves to the panel's heading when it opens. True when the
31
38
  * reader opened it; false for a panel a link opened on arrival, which must
@@ -56,7 +63,7 @@ export interface ArtifactPanelProps {
56
63
  * portalled out of it, and the press that closes one of them never reaches
57
64
  * this.
58
65
  */
59
- export declare function ArtifactPanel({ title, icon, onClose, size, expanded, onExpandedChange, actions, focusOnOpen, labels, className, children, }: ArtifactPanelProps): import("react").JSX.Element;
66
+ export declare function ArtifactPanel({ title, icon, onClose, size, expanded, onExpandedChange, actions, footer, focusOnOpen, labels, className, children, }: ArtifactPanelProps): import("react").JSX.Element;
60
67
  export interface ArtifactWorkspaceProps {
61
68
  /** The open panel, if any: an [ArtifactPanel]. */
62
69
  panel?: ReactNode;
@@ -1,4 +1,4 @@
1
- export { ARTIFACT_PANEL_LABELS, ArtifactPanel, ArtifactWorkspace } from '../chunk-HUVG2FFT.js';
1
+ export { ARTIFACT_PANEL_LABELS, ArtifactPanel, ArtifactWorkspace } from '../chunk-Y5BD4MTE.js';
2
2
  import '../chunk-PQADV6P6.js';
3
3
  import '../chunk-4FQT6ZAY.js';
4
4
  import '../chunk-BZFWDIV6.js';
@@ -117,6 +117,15 @@
117
117
  overscroll-behavior: contain;
118
118
  }
119
119
 
120
+ /* THE FOOT holds the panel's own commit, outside the scrolling body, so it
121
+ stays in reach at every scroll. Its inset is the body's. */
122
+ .crewlet-artifact-panel__foot {
123
+ flex: none;
124
+ padding: var(--spacing-3) var(--spacing-4);
125
+ border-top: 1px solid var(--color-border-default);
126
+ background: var(--color-surface-background);
127
+ }
128
+
120
129
  /* NOT ROOM FOR TWO COLUMNS: the panel slides over the artifact's end edge,
121
130
  raised off it, rather than squeezing the artifact under a useful width. */
122
131
  @container crewlet-artifact-workspace (width < 960px) {
@@ -1,6 +1,6 @@
1
- export { AuthLayout } from '../chunk-VDPJGP4Q.js';
1
+ export { AuthLayout } from '../chunk-WX2NIG4G.js';
2
2
  import '../chunk-7KBNFFM3.js';
3
- import '../chunk-ACA27MZH.js';
3
+ import '../chunk-5QXRI35B.js';
4
4
  import '../chunk-AV2DXAEL.js';
5
5
  import '../chunk-BHHIIK3M.js';
6
6
  import '../chunk-PQADV6P6.js';
@@ -1,8 +1,8 @@
1
- export { AvatarPicker } from '../chunk-FJJHD73S.js';
1
+ export { AvatarPicker } from '../chunk-GYBDPCRC.js';
2
2
  import '../chunk-SUXP4OBT.js';
3
3
  import '../chunk-K3IJQNB7.js';
4
- import '../chunk-YEVG2X5R.js';
5
4
  import '../chunk-AYKXMIOR.js';
5
+ import '../chunk-YEVG2X5R.js';
6
6
  import '../chunk-CCAXYHQS.js';
7
7
  import '../chunk-VL6CUNSX.js';
8
8
  import '../chunk-RKKO7QHH.js';
@@ -1,7 +1,7 @@
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-3P4Y5RX6.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-4BYHAOHH.js';
2
2
  import '../chunk-LM3ISVJA.js';
3
- import '../chunk-SMBKXWML.js';
4
3
  import '../chunk-6ZJ3N7QI.js';
4
+ import '../chunk-SMBKXWML.js';
5
5
  import '../chunk-OMV5W53A.js';
6
6
  import '../chunk-R25RGPUB.js';
7
7
  import '../chunk-OG6CL3EB.js';
@@ -48,9 +48,10 @@
48
48
  * are counter-scaled by the zoom, so a board's label is readable, its edge is
49
49
  * a hairline and its handle is a full pointer target whatever the zoom, while
50
50
  * the board itself scales with the canvas. What a board says is held to the
51
- * room it is drawn in (`boardRoom`): a name too narrow to read is not drawn,
51
+ * room it is drawn in: a name with too little room is shortened to a few
52
+ * letters, then to the board's number, and only then left out (`boardName`),
52
53
  * and a placeholder drops the lines it has no room for rather than spill them
53
- * over the boards beside it.
54
+ * over the boards beside it (`boardRoom`).
54
55
  */
55
56
  import { type ReactNode, type Ref } from 'react';
56
57
  import { type CanvasHandle, type CanvasLabels, type CanvasPoint } from '../Canvas/index.js';
@@ -215,19 +216,32 @@ export interface CanvasBoardProps {
215
216
  className?: string | undefined;
216
217
  }
217
218
  /**
218
- * WHAT A BOARD HAS ROOM TO SAY, from its size on screen.
219
- *
220
- * `title` is whether its name is drawn above it: a name narrower than a few
221
- * letters reads as a stray mark, so a board drawn narrower than
222
- * [BOARD_TITLE_MIN_WIDTH] goes unnamed until it is zoomed into. `lines` is how
223
- * many of a placeholder's two lines (its size, then why it is not running) fit
224
- * inside it at the chrome's own type, so the lines it has no room for are left
225
- * out rather than clipped at both ends.
219
+ * WHAT A BOARD'S PLACEHOLDER HAS ROOM TO SAY, from its size on screen: how
220
+ * many of its two lines (its size, then why it is not running) fit inside it
221
+ * at the chrome's own type, so the lines it has no room for are left out
222
+ * rather than clipped at both ends.
226
223
  */
227
224
  export declare function boardRoom(width: number, height: number): {
228
- title: boolean;
229
225
  lines: 0 | 1 | 2;
230
226
  };
231
- /** The narrowest a board is drawn, in screen pixels, with its name above it. */
232
- export declare const BOARD_TITLE_MIN_WIDTH = 40;
227
+ /**
228
+ * WHAT A BOARD IS CALLED ABOVE IT, from the room its name row has on screen
229
+ * (`room`, in screen pixels: the board's width, less what the row's other
230
+ * controls take).
231
+ *
232
+ * Its name, while at least [BOARD_NAME_MIN_CHARS] letters and an ellipsis
233
+ * fit, so a shortened name still says which board it is ("Hom..." rather than
234
+ * "H..." or a lone ellipsis); `whole` is false once the name may be shortened,
235
+ * so the full name can be offered as a tooltip. Narrower than that, its place
236
+ * in the design ("3"), which a reader can count to and which stays legible
237
+ * down to a single digit's width. Narrower still, nothing: a mark that narrow
238
+ * reads as a stray scratch. The name row is counter-scaled, so the type is the
239
+ * same size at every zoom and only the room changes.
240
+ */
241
+ export declare function boardName(title: string, position: number, room: number): {
242
+ text: string;
243
+ whole: boolean;
244
+ } | null;
245
+ /** The fewest letters a shortened board name keeps before its ellipsis. */
246
+ export declare const BOARD_NAME_MIN_CHARS = 3;
233
247
  export declare function CanvasBoard({ label, boards, notes, renderBoard, maxLive, minLiveWidth, editable, minSide, maxSide, onBoardChange, onNoteChange, onNoteRemove, onNoteCreate, onBoardCreate, onBoardRemove, onOpen, onActivate, selected: heldSelection, onSelectedChange, controlsExtra, toolbar, labels, canvasLabels, canvasRef, className, }: CanvasBoardProps): import("react").JSX.Element;
@@ -1,5 +1,5 @@
1
1
  import './CanvasBoard.css';
2
- export { BOARD_TITLE_MIN_WIDTH, CanvasBoard, CANVAS_BOARD_MIN_ZOOM, CANVAS_NOTE_COLORS, TITLE_GLYPH_EM, boardRoom, titleSize, } from './CanvasBoard.js';
2
+ export { BOARD_NAME_MIN_CHARS, CanvasBoard, CANVAS_BOARD_MIN_ZOOM, CANVAS_NOTE_COLORS, TITLE_GLYPH_EM, boardName, boardRoom, titleSize, } from './CanvasBoard.js';
3
3
  export type { CanvasBoardItem, CanvasBoardLabels, CanvasBoardNote, CanvasBoardProps, CanvasBoardRect, CanvasBoardSelection, CanvasBoardTool, CanvasNoteColor, } from './CanvasBoard.js';
4
4
  export { CANVAS_BOARD_MAX_LIVE, CANVAS_BOARD_MIN_LIVE_WIDTH, liveBoards } from './budget.js';
5
5
  export type { BoardFrame } from './budget.js';
@@ -1,11 +1,11 @@
1
- export { BOARD_TITLE_MIN_WIDTH, CANVAS_BOARD_MAX_LIVE, CANVAS_BOARD_MIN_LIVE_WIDTH, CANVAS_BOARD_MIN_ZOOM, CANVAS_NOTE_COLORS, CanvasBoard, TITLE_GLYPH_EM, boardRoom, liveBoards, titleSize } from '../chunk-E35CMI5D.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-FHHYXZSP.js';
2
2
  import '../chunk-5SZGKSGL.js';
3
- import '../chunk-3Y56GQPM.js';
3
+ import '../chunk-7VAUGG6B.js';
4
4
  import '../chunk-PGRPNDWM.js';
5
- import '../chunk-3P4Y5RX6.js';
5
+ import '../chunk-4BYHAOHH.js';
6
6
  import '../chunk-LM3ISVJA.js';
7
- import '../chunk-SMBKXWML.js';
8
7
  import '../chunk-6ZJ3N7QI.js';
8
+ import '../chunk-SMBKXWML.js';
9
9
  import '../chunk-OMV5W53A.js';
10
10
  import '../chunk-R25RGPUB.js';
11
11
  import '../chunk-OG6CL3EB.js';
@@ -82,19 +82,26 @@
82
82
  }
83
83
 
84
84
  /*
85
- * HOVER, then SELECTION, in the accent: one screen pixel and then two, over
86
- * the hairline. Hovering a board's name is hovering its board, which is how a
87
- * reader finds the board a name belongs to on a crowded canvas.
85
+ * HOVER, then SELECTION: one screen pixel each, over the hairline. Hover is
86
+ * the selected edge, the accent mixed toward the canvas, so pointing at a
87
+ * board previews the pick without claiming it; selection is the full accent,
88
+ * crisp, with its four corners drawn, which are what say "this one" on a
89
+ * canvas where a board's own content can be any colour. It was two pixels,
90
+ * the focus ring's weight in the focus ring's hue, so a picked board and the
91
+ * board the keyboard was on read alike; the 2px ring is the live board's now
92
+ * alone ([data-active], below), which takes the pointer like a focused frame.
93
+ * Hovering a board's name is hovering its board, which is how a reader finds
94
+ * the board a name belongs to on a crowded canvas.
88
95
  */
89
96
  .crewlet-canvas-board__board:hover .crewlet-canvas-board__body,
90
97
  .crewlet-canvas-board__note:hover {
91
- outline: calc(1px * var(--crewlet-canvas-board-unzoom)) solid var(--color-brand-accent);
98
+ outline: calc(1px * var(--crewlet-canvas-board-unzoom)) solid var(--color-border-selected);
92
99
  outline-offset: 0;
93
100
  }
94
101
 
95
102
  .crewlet-canvas-board__board[data-selected] .crewlet-canvas-board__body,
96
103
  .crewlet-canvas-board__note[data-selected] {
97
- outline: calc(2px * var(--crewlet-canvas-board-unzoom)) solid var(--color-brand-accent);
104
+ outline: calc(1px * var(--crewlet-canvas-board-unzoom)) solid var(--color-brand-accent);
98
105
  outline-offset: 0;
99
106
  }
100
107
 
@@ -202,7 +209,7 @@
202
209
  transform-origin: bottom left;
203
210
  }
204
211
 
205
- /* A board drawn too narrow to name goes unnamed (`boardRoom`). */
212
+ /* A board drawn too narrow for even its number goes unnamed (`boardName`). */
206
213
  .crewlet-canvas-board__board[data-untitled] > .crewlet-canvas-board__chrome {
207
214
  display: none;
208
215
  }
@@ -1,9 +1,9 @@
1
- export { CanvasToolbar, toolForKey } from '../chunk-3Y56GQPM.js';
1
+ export { CanvasToolbar, toolForKey } from '../chunk-7VAUGG6B.js';
2
2
  import '../chunk-PGRPNDWM.js';
3
- import '../chunk-3P4Y5RX6.js';
3
+ import '../chunk-4BYHAOHH.js';
4
4
  import '../chunk-LM3ISVJA.js';
5
- import '../chunk-SMBKXWML.js';
6
5
  import '../chunk-6ZJ3N7QI.js';
6
+ import '../chunk-SMBKXWML.js';
7
7
  import '../chunk-OMV5W53A.js';
8
8
  import '../chunk-R25RGPUB.js';
9
9
  import '../chunk-OG6CL3EB.js';
@@ -1,4 +1,4 @@
1
- export { Card } from '../chunk-ACA27MZH.js';
1
+ export { Card } from '../chunk-5QXRI35B.js';
2
2
  export { useCardHeaderSlot } from '../chunk-AV2DXAEL.js';
3
3
  import '../chunk-BHHIIK3M.js';
4
4
  import '../chunk-PQADV6P6.js';
@@ -42,7 +42,7 @@
42
42
  * `box-shadow: <shadow>, none` is invalid at computed-value time, so the
43
43
  * declaration is dropped and the light card loses the elevation the list was
44
44
  * built around. Alone on a pseudo element the same token is valid in both
45
- * themes, and it composes with the selection ring rather than replacing
45
+ * themes, and it composes with a chosen card's edge rather than replacing
46
46
  * whichever was declared last, exactly as the rail does.
47
47
  */
48
48
  .crewlet-card--elevated::after {
@@ -116,8 +116,8 @@
116
116
  /*
117
117
  * THE FLUSH RECIPE. The slots reach the card's edges, and the clip is what
118
118
  * makes the header's hairline and a table's own corners follow the radius
119
- * instead of crossing it. The selection ring survives the clip because it is
120
- * an INSET shadow; an outset one would be cut off here.
119
+ * instead of crossing it. A chosen card's edge and fill survive the clip
120
+ * because they are its own border and background.
121
121
  */
122
122
  .crewlet-card--flush {
123
123
  overflow: hidden;
@@ -200,29 +200,34 @@
200
200
 
201
201
  /* One ring, over the card's own boundary rather than 2px off it, which is two
202
202
  edges with a gap between them: the rule every field keeps (see Input.css).
203
- A chosen card keeps an accent line inside the ring, since the selection
204
- ring below is two pixels deep and the focus ring covers one of them. */
203
+ On a chosen card it covers the selected edge, and the selected fill inside
204
+ it still says the card is chosen. */
205
205
  .crewlet-card.is-interactive:focus-visible {
206
206
  outline: 2px solid var(--color-focus);
207
207
  outline-offset: var(--size-focus-ring-inset-offset);
208
208
  }
209
209
 
210
210
  /*
211
- * Chosen. A ring rather than a tint, because a card carries its own surface
212
- * and a tint under it would change the ground every value on it was measured
213
- * against.
211
+ * Chosen, as every chosen option in the package is drawn: the selected edge
212
+ * (the accent mixed toward the card) over the selected fill. It was the full
213
+ * accent border under --shadow-selection, a second accent ring two pixels
214
+ * deep, which is the focus ring's weight in the focus ring's hue, so a grid
215
+ * of cards showed the pick and the keyboard's place alike. The fill is laid
216
+ * as an IMAGE over the card's own surface rather than in place of it, so the
217
+ * card keeps its ground and the tint composites over it, as it does over a
218
+ * row.
214
219
  */
215
220
  .crewlet-card.is-selected {
216
- box-shadow: var(--shadow-selection);
217
- border-color: var(--color-brand-accent);
221
+ border-color: var(--color-border-selected);
222
+ background-image: linear-gradient(var(--color-surface-selected), var(--color-surface-selected));
218
223
  }
219
224
 
220
225
  /* ---- Rails ------------------------------------------------------------- */
221
226
 
222
227
  /*
223
228
  * A state down the leading edge. Drawn as a pseudo element rather than a
224
- * border or an inset shadow, so it composes with the elevated shadow and the
225
- * selection ring instead of replacing whichever one was declared last.
229
+ * border or an inset shadow, so it composes with the elevated shadow and a
230
+ * chosen card's edge instead of replacing whichever one was declared last.
226
231
  */
227
232
  .crewlet-card--rail-info::before,
228
233
  .crewlet-card--rail-warning::before,
@@ -1,5 +1,6 @@
1
- export { Checkbox, CheckboxGroup } from '../chunk-CPEPST4S.js';
2
- import '../chunk-6QFAK2WV.js';
1
+ export { Checkbox, CheckboxGroup } from '../chunk-PJIPUEJ3.js';
2
+ import '../chunk-IUYUS2SO.js';
3
+ import '../chunk-YSGLEHND.js';
3
4
  import '../chunk-PQADV6P6.js';
4
5
  import '../chunk-4FQT6ZAY.js';
5
6
  import '../chunk-BZFWDIV6.js';
@@ -1,3 +1,3 @@
1
- export { ChoiceButtons } from '../chunk-YSJC7AZC.js';
1
+ export { ChoiceButtons } from '../chunk-BWOIUOO3.js';
2
2
  import '../chunk-BZFWDIV6.js';
3
3
  import '../chunk-ODEQTPFM.js';
@@ -36,6 +36,16 @@
36
36
  border-color var(--motion-duration-fast) var(--motion-easing-default);
37
37
  }
38
38
 
39
+ /*
40
+ * AN OPTION WITH A DETAIL STARTS AT ITS TOP. Laid out as tiles (a host's grid
41
+ * of columns), the options in one row stretch to the tallest, and centred
42
+ * text put a one-line detail's label lower than its neighbour's two-line
43
+ * one. A column of options is unchanged: each is as tall as its own text.
44
+ */
45
+ .crewlet-choice-buttons__option:has(.crewlet-choice-buttons__detail) {
46
+ align-items: flex-start;
47
+ }
48
+
39
49
  .crewlet-choice-buttons__option:hover:not([aria-disabled='true']) {
40
50
  background: var(--color-surface-elevated);
41
51
  border-color: var(--color-border-strong-hover);
@@ -1,2 +1,2 @@
1
- export { ChoiceList } from '../chunk-ZU3DUXD2.js';
1
+ export { ChoiceList } from '../chunk-WZGYIVYH.js';
2
2
  import '../chunk-ODEQTPFM.js';
@@ -1,7 +1,9 @@
1
1
  /*
2
2
  * A short list of answers in one bordered box: a radio, the label with a line
3
3
  * of detail under it, and a tag at the row's end. The selected row takes the
4
- * accent's soft fill, so the answer reads at a glance without the radio.
4
+ * selected fill (the accent's soft tint), so the answer reads at a glance; the
5
+ * radio is the mark that clears 3:1, and no row is ever ringed in the accent,
6
+ * which is the focus ring's colour.
5
7
  */
6
8
  .crewlet-choice-list {
7
9
  /* The platform's radio, sized here so a panel can line up with the text beside it. */
@@ -66,21 +68,47 @@
66
68
  }
67
69
 
68
70
  .crewlet-choice-list__row.is-checked {
69
- background: var(--color-brand-accent-soft);
71
+ background: var(--color-surface-selected);
70
72
  }
71
73
 
72
74
  .crewlet-choice-list.is-disabled .crewlet-choice-list__row {
73
75
  cursor: not-allowed;
74
76
  }
75
77
 
78
+ /*
79
+ * THE RADIO IS DRAWN, not the platform's. In a dark palette the platform's
80
+ * own radio fills an unchosen answer with a grey disc, which beside the one
81
+ * chosen read as a second, muted choice. Drawn here, an unchosen answer is an
82
+ * empty ring on the control boundary (3:1 on every ground) and the chosen one
83
+ * the accent ring round an accent dot. Forced colours hand it back to the
84
+ * platform, which draws it in the system's own colours.
85
+ */
76
86
  .crewlet-choice-list__radio {
87
+ appearance: none;
88
+ display: inline-grid;
89
+ place-content: center;
90
+ flex: none;
91
+ box-sizing: border-box;
77
92
  width: var(--crewlet-choice-list-radio-size);
78
93
  height: var(--crewlet-choice-list-radio-size);
79
94
  margin: 3px 0 0;
80
- accent-color: var(--color-brand-accent);
95
+ border: 1px solid var(--color-border-control);
96
+ border-radius: 50%;
97
+ background: transparent;
81
98
  cursor: inherit;
82
99
  }
83
100
 
101
+ .crewlet-choice-list__radio:checked {
102
+ border-color: var(--color-brand-accent);
103
+ background: radial-gradient(circle, var(--color-brand-accent) 0 3px, transparent 3.5px);
104
+ }
105
+
106
+ @media (forced-colors: active) {
107
+ .crewlet-choice-list__radio {
108
+ appearance: auto;
109
+ }
110
+ }
111
+
84
112
  /* A radio draws its own edge, so the ring sits on it, as a checkbox's does. */
85
113
  .crewlet-choice-list__radio:focus-visible {
86
114
  outline: 2px solid var(--color-focus);
@@ -105,13 +133,16 @@
105
133
  overflow-wrap: anywhere;
106
134
  }
107
135
 
136
+ /* A tag says something ABOUT an answer ("Suggested"), so it is set in the
137
+ tertiary ink: in the accent ink it was a second accent mark on the chosen
138
+ row, beside the radio and the fill that already say which one is chosen. */
108
139
  .crewlet-choice-list__tag {
109
140
  padding-top: 2px;
110
141
  font-size: var(--font-size-2xs);
111
142
  font-weight: 500;
112
143
  letter-spacing: 0.05em;
113
144
  text-transform: uppercase;
114
- color: var(--color-brand-accent-ink);
145
+ color: var(--color-text-tertiary);
115
146
  white-space: nowrap;
116
147
  }
117
148
 
@@ -131,7 +162,7 @@
131
162
  padding: var(--spacing-1) var(--spacing-2) var(--spacing-3) calc(var(--spacing-2) + var(--crewlet-choice-list-radio-size) + var(--spacing-3));
132
163
  border-end-start-radius: var(--radius-sm);
133
164
  border-end-end-radius: var(--radius-sm);
134
- background: var(--color-brand-accent-soft);
165
+ background: var(--color-surface-selected);
135
166
  }
136
167
 
137
168
  .crewlet-choice-list__footer {
@@ -1,6 +1,7 @@
1
- export { Combobox } from '../chunk-QS4ZGTEU.js';
1
+ export { Combobox } from '../chunk-PPFX6GRK.js';
2
2
  import '../chunk-F73MC7EZ.js';
3
- import '../chunk-6QFAK2WV.js';
3
+ import '../chunk-IUYUS2SO.js';
4
+ import '../chunk-YSGLEHND.js';
4
5
  import '../chunk-PQADV6P6.js';
5
6
  import '../chunk-R25RGPUB.js';
6
7
  import '../chunk-4FQT6ZAY.js';