@crewlethq/ui 0.4.3 → 0.5.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 (237) hide show
  1. package/README.md +888 -24
  2. package/dist/Accordion/index.js +2 -2
  3. package/dist/AddPill/index.js +1 -1
  4. package/dist/{AddPill-DFWXYLIQ.css → AddPill-IJQYCY6C.css} +9 -0
  5. package/dist/AppShell/AppShell.d.ts +26 -5
  6. package/dist/AppShell/index.js +3 -3
  7. package/dist/{AppShell-NVE6LHNI.css → AppShell-XARELGIH.css} +178 -25
  8. package/dist/Avatar/Avatar.d.ts +85 -40
  9. package/dist/Avatar/AvatarStack.d.ts +76 -0
  10. package/dist/Avatar/index.d.ts +5 -2
  11. package/dist/Avatar/index.js +1 -1
  12. package/dist/Avatar-XID7Z74C.css +200 -0
  13. package/dist/AvatarStack-GEJBNV7E.css +72 -0
  14. package/dist/BrandLockup/index.js +1 -1
  15. package/dist/{BrandLockup-6ISDEHPJ.css → BrandLockup-JKGXFCZF.css} +25 -19
  16. package/dist/Button/Button.d.ts +7 -2
  17. package/dist/Button/index.js +1 -1
  18. package/dist/{Button-D4J6B4MA.css → Button-X4B2TJAQ.css} +50 -19
  19. package/dist/Callout/index.js +1 -1
  20. package/dist/Canvas/index.js +4 -4
  21. package/dist/Card/Card.d.ts +9 -5
  22. package/dist/Card/index.js +1 -1
  23. package/dist/{Card-RLR254LD.css → Card-GLP7SUV6.css} +25 -18
  24. package/dist/Charts/BarList.d.ts +18 -1
  25. package/dist/Charts/ChartTooltip.d.ts +68 -0
  26. package/dist/Charts/StackedBar.d.ts +25 -7
  27. package/dist/Charts/StackedColumns.d.ts +112 -0
  28. package/dist/Charts/TimeSeries.d.ts +33 -2
  29. package/dist/Charts/dataColor.d.ts +22 -14
  30. package/dist/Charts/index.d.ts +6 -0
  31. package/dist/Charts/index.js +1 -1
  32. package/dist/Charts/useChartHover.d.ts +56 -0
  33. package/dist/Charts-B3YEF7R4.css +742 -0
  34. package/dist/Checkbox/index.js +1 -1
  35. package/dist/{Checkbox-VGW26YLQ.css → Checkbox-BOXQ747I.css} +2 -2
  36. package/dist/CodeBlock/index.js +4 -4
  37. package/dist/Combobox/index.js +5 -5
  38. package/dist/CommandPalette/CommandPalette.d.ts +97 -6
  39. package/dist/CommandPalette/index.d.ts +1 -1
  40. package/dist/CommandPalette/index.js +9 -7
  41. package/dist/CommandPalette-C5AMKGN2.css +259 -0
  42. package/dist/Copyable/index.js +3 -3
  43. package/dist/DataTable/index.js +7 -7
  44. package/dist/{DataTable-ITNACQ2X.css → DataTable-OLHPF7D4.css} +44 -43
  45. package/dist/DataView/index.js +14 -14
  46. package/dist/{DataView-256YF32J.css → DataView-N6JX464S.css} +5 -4
  47. package/dist/DateTimePicker/index.js +5 -5
  48. package/dist/DiffList/index.js +1 -1
  49. package/dist/Disclosure/index.js +2 -2
  50. package/dist/EntityChip/EntityChip.d.ts +9 -12
  51. package/dist/EntityChip/index.d.ts +1 -1
  52. package/dist/EntityChip/index.js +2 -2
  53. package/dist/ErrorBoundary/index.js +2 -2
  54. package/dist/{ErrorBoundary-ME36CQTA.css → ErrorBoundary-U2PA3LY2.css} +4 -4
  55. package/dist/IconButton/index.js +1 -1
  56. package/dist/{IconButton-VQGNMJDI.css → IconButton-TVEUWK6L.css} +2 -2
  57. package/dist/ImageUpload/ImageUpload.d.ts +10 -7
  58. package/dist/ImageUpload/index.js +2 -2
  59. package/dist/{ImageUpload-HKFIZR6D.css → ImageUpload-YCHJMUGX.css} +24 -10
  60. package/dist/Input/index.js +2 -2
  61. package/dist/Kbd/Kbd.d.ts +14 -4
  62. package/dist/Kbd/index.js +1 -1
  63. package/dist/Kbd-JPLDVJIP.css +71 -0
  64. package/dist/Layer/index.js +1 -1
  65. package/dist/Link/index.js +1 -1
  66. package/dist/List/index.js +1 -1
  67. package/dist/{List-XTHESXLR.css → List-MYJIV6MP.css} +12 -2
  68. package/dist/ListInput/index.js +5 -5
  69. package/dist/Listbox/index.js +2 -2
  70. package/dist/Listbox/useListbox.d.ts +16 -0
  71. package/dist/Listbox/useOptionKeys.d.ts +12 -1
  72. package/dist/{Listbox-X2DOTSQA.css → Listbox-6WJNJQVQ.css} +60 -7
  73. package/dist/Menu/index.js +4 -4
  74. package/dist/{Menu-6DE7I66I.css → Menu-BT5PMFJI.css} +15 -0
  75. package/dist/Meter/Meter.d.ts +103 -16
  76. package/dist/Meter/index.d.ts +2 -2
  77. package/dist/Meter/index.js +1 -1
  78. package/dist/{Meter-SKOOXQBC.css → Meter-5VCSFMZW.css} +46 -7
  79. package/dist/Modal/index.js +4 -4
  80. package/dist/{Modal-XYQJ4BL6.css → Modal-JAYBS2KS.css} +13 -4
  81. package/dist/OrgLabel/OrgLabel.d.ts +60 -24
  82. package/dist/OrgLabel/index.d.ts +1 -1
  83. package/dist/OrgLabel/index.js +2 -1
  84. package/dist/{OrgLabel-D7U6QJZD.css → OrgLabel-CR233G34.css} +9 -18
  85. package/dist/OrgNode/index.js +3 -2
  86. package/dist/OrgTable/OrgTable.d.ts +2 -2
  87. package/dist/OrgTable/index.js +8 -7
  88. package/dist/Popover/index.js +2 -2
  89. package/dist/PricingCard/index.js +3 -3
  90. package/dist/{PricingCard-JFI7RYXP.css → PricingCard-7EFXRSD2.css} +4 -5
  91. package/dist/SearchTrigger/SearchTrigger.d.ts +23 -4
  92. package/dist/SearchTrigger/index.d.ts +1 -1
  93. package/dist/SearchTrigger/index.js +1 -1
  94. package/dist/SearchTrigger-Z5D4AAY7.css +112 -0
  95. package/dist/SegmentedControl/index.js +2 -2
  96. package/dist/SegmentedMeter/SegmentedMeter.d.ts +107 -0
  97. package/dist/SegmentedMeter/index.d.ts +3 -0
  98. package/dist/SegmentedMeter/index.js +2 -0
  99. package/dist/SegmentedMeter-KQNML2TW.css +109 -0
  100. package/dist/Select/index.js +3 -3
  101. package/dist/{Select-2X77FSWR.css → Select-E24U5LBC.css} +34 -0
  102. package/dist/Shortcut/index.js +2 -2
  103. package/dist/SidebarNav/SidebarNav.d.ts +85 -25
  104. package/dist/SidebarNav/index.d.ts +1 -1
  105. package/dist/SidebarNav/index.js +1 -1
  106. package/dist/SidebarNav-X5NLZNWA.css +424 -0
  107. package/dist/StatCard/StatCard.d.ts +59 -12
  108. package/dist/StatCard/index.d.ts +1 -1
  109. package/dist/StatCard/index.js +1 -1
  110. package/dist/StatCard-KPAFD4E2.css +204 -0
  111. package/dist/StatGroup/index.js +1 -1
  112. package/dist/{StatGroup-TGB6AEKM.css → StatGroup-HVG6O62W.css} +8 -9
  113. package/dist/StatusDot/StatusDot.d.ts +24 -6
  114. package/dist/StatusDot/index.js +1 -1
  115. package/dist/StatusDot-7OMCQCZF.css +186 -0
  116. package/dist/Stepper/Stepper.d.ts +78 -0
  117. package/dist/Stepper/index.d.ts +3 -0
  118. package/dist/Stepper/index.js +4 -0
  119. package/dist/Stepper-HW4JM3YH.css +176 -0
  120. package/dist/Table/index.js +1 -1
  121. package/dist/{Table-MDOLVUAW.css → Table-TGCS4C3F.css} +14 -4
  122. package/dist/Tabs/index.js +1 -1
  123. package/dist/{Tabs-VLICJFVB.css → Tabs-XCNPHA7B.css} +79 -27
  124. package/dist/Tag/Tag.d.ts +29 -22
  125. package/dist/Tag/index.js +2 -2
  126. package/dist/{Tag-VNZEYLB6.css → Tag-GBE7LQJP.css} +82 -83
  127. package/dist/TagsInput/index.js +6 -6
  128. package/dist/ThemeSwitcher/ThemeSwitcher.d.ts +53 -21
  129. package/dist/ThemeSwitcher/index.d.ts +3 -3
  130. package/dist/ThemeSwitcher/index.js +4 -3
  131. package/dist/ThemeSwitcher/preferences.d.ts +19 -5
  132. package/dist/ThemeToggle/ThemeToggle.d.ts +40 -0
  133. package/dist/ThemeToggle/index.d.ts +2 -0
  134. package/dist/ThemeToggle/index.js +5 -0
  135. package/dist/TimeWindowPicker/index.js +8 -8
  136. package/dist/Toaster/index.js +2 -2
  137. package/dist/Toolbar/index.js +2 -2
  138. package/dist/{Toolbar-IP6LXN45.css → Toolbar-HUOSMNTH.css} +3 -1
  139. package/dist/Tooltip/index.js +2 -2
  140. package/dist/Tree/index.d.ts +2 -2
  141. package/dist/Tree/index.js +1 -1
  142. package/dist/Tree/layout.d.ts +103 -28
  143. package/dist/TreeCanvas/TreeCanvas.d.ts +60 -14
  144. package/dist/TreeCanvas/index.d.ts +1 -1
  145. package/dist/TreeCanvas/index.js +6 -6
  146. package/dist/TreeCanvas/motion.d.ts +3 -2
  147. package/dist/{TreeCanvas-WBNQPHC7.css → TreeCanvas-HVOV4SQN.css} +154 -30
  148. package/dist/TreeGrid/index.js +4 -4
  149. package/dist/{chunk-F6OE5FH3.js → chunk-2FPENTCF.js} +1 -1
  150. package/dist/chunk-4AK52VHB.js +88 -0
  151. package/dist/{chunk-7EM5T4ME.js → chunk-4IQD3HUQ.js} +2 -2
  152. package/dist/{chunk-YODNNSZL.js → chunk-4PZ6FJKW.js} +43 -13
  153. package/dist/{chunk-F27EPQ7D.js → chunk-4UQ7SMPK.js} +1 -1
  154. package/dist/chunk-5QWIJSQM.js +73 -0
  155. package/dist/{chunk-GTOUGQQK.js → chunk-6MU7HNB4.js} +13 -10
  156. package/dist/{chunk-S2XHHEW4.js → chunk-74KMX7YH.js} +4 -4
  157. package/dist/{chunk-WNI2WSJF.js → chunk-7KBNFFM3.js} +1 -1
  158. package/dist/{chunk-DD5BBGBE.js → chunk-AUS5FNQE.js} +9 -5
  159. package/dist/{chunk-CMEE37QJ.js → chunk-BMYPGGPV.js} +4 -4
  160. package/dist/{chunk-H4FBTAYS.js → chunk-BNCCEER3.js} +8 -8
  161. package/dist/chunk-C5WJUZVR.js +56 -0
  162. package/dist/{chunk-5WS6L6FA.js → chunk-CAIHUYXV.js} +9 -9
  163. package/dist/{chunk-XV6WRMBC.js → chunk-CQY5NTRS.js} +4 -1
  164. package/dist/{chunk-UOGSZKLT.js → chunk-D6EVJUGU.js} +2 -2
  165. package/dist/{chunk-6ZFVFA56.js → chunk-DHPUMOTX.js} +2 -2
  166. package/dist/{chunk-HZ5XZNPS.js → chunk-DS2C73RJ.js} +3 -3
  167. package/dist/{chunk-O6232G37.js → chunk-DSUY5F4E.js} +17 -5
  168. package/dist/{chunk-Q4ZPPART.js → chunk-EFYPAJT3.js} +3 -3
  169. package/dist/{chunk-WQX73TWF.js → chunk-ERVO6OUF.js} +18 -17
  170. package/dist/{chunk-BZYDZBAN.js → chunk-ETYEBKR4.js} +3 -3
  171. package/dist/{chunk-34VGEDVV.js → chunk-FD5UEN6X.js} +30 -30
  172. package/dist/{chunk-5SDBMKUO.js → chunk-FIFNP6PL.js} +3 -3
  173. package/dist/{chunk-7HPRF5XN.js → chunk-FUF52K7E.js} +98 -16
  174. package/dist/{chunk-5KPQ6D7N.js → chunk-FZVJDJFN.js} +2 -2
  175. package/dist/chunk-IA232OTU.js +156 -0
  176. package/dist/{chunk-2EOKFKHX.js → chunk-IG27QX7Q.js} +7 -7
  177. package/dist/chunk-IKB6HFGK.js +55 -0
  178. package/dist/{chunk-FBZAKNSX.js → chunk-IPVQKAHO.js} +10 -7
  179. package/dist/{chunk-3EYF6HKB.js → chunk-IVFJD7WY.js} +28 -9
  180. package/dist/{chunk-WOYYD2YR.js → chunk-JGRNTBF2.js} +11 -11
  181. package/dist/chunk-K3OWD7BJ.js +121 -0
  182. package/dist/{chunk-BJSKPEZI.js → chunk-KD4H66L6.js} +7 -20
  183. package/dist/{chunk-SFZOKW2G.js → chunk-KJ34ZBBI.js} +8 -3
  184. package/dist/{chunk-HQNHV7D6.js → chunk-LFHCXZO5.js} +6 -6
  185. package/dist/{chunk-LWKJQTOM.js → chunk-MICH6QSJ.js} +1 -1
  186. package/dist/chunk-N3DPO6HG.js +226 -0
  187. package/dist/{chunk-S4GZWSKR.js → chunk-OM5E3TTK.js} +1 -1
  188. package/dist/{chunk-3QRYCPXQ.js → chunk-OPKIKM35.js} +6 -6
  189. package/dist/{chunk-5EKIWVOR.js → chunk-PGRPNDWM.js} +2 -2
  190. package/dist/{chunk-LFJ6UJTI.js → chunk-PQNILU27.js} +9 -9
  191. package/dist/{chunk-QNCVHRZL.js → chunk-QVAFL2LE.js} +1 -1
  192. package/dist/{chunk-QEUY3A5P.js → chunk-QY7UU5ZB.js} +3 -2
  193. package/dist/{chunk-ITHXJHBB.js → chunk-R25RGPUB.js} +1 -0
  194. package/dist/{chunk-KLJCCMF3.js → chunk-R6735B37.js} +2 -2
  195. package/dist/{chunk-3ZP55QZE.js → chunk-R6FBDTP3.js} +4 -4
  196. package/dist/{chunk-7FZ53WDJ.js → chunk-RIAZM6L3.js} +1 -1
  197. package/dist/chunk-RJM4QCGG.js +550 -0
  198. package/dist/{chunk-NTRZGNEX.js → chunk-S3BCVWTU.js} +215 -46
  199. package/dist/chunk-S7KW47IQ.js +121 -0
  200. package/dist/{chunk-OFHBK7RI.js → chunk-SJQ546ID.js} +34 -14
  201. package/dist/{chunk-D35VTV2Z.js → chunk-SV7QAONL.js} +1 -1
  202. package/dist/{chunk-IAJLHVUA.js → chunk-TIWAHZZ6.js} +1 -1
  203. package/dist/{chunk-2PRH365R.js → chunk-UA7O3KKJ.js} +1 -1
  204. package/dist/{chunk-NPZY6YYL.js → chunk-UG5ZMAXW.js} +6 -6
  205. package/dist/{chunk-FEFTGVMF.js → chunk-V2N3BMOT.js} +7 -2
  206. package/dist/{chunk-NDCATSW7.js → chunk-V34H2YCY.js} +1 -1
  207. package/dist/chunk-WIATRXEJ.js +22 -0
  208. package/dist/{chunk-5C5YMZQU.js → chunk-WOFOMTGB.js} +16 -10
  209. package/dist/{chunk-QYOFACSP.js → chunk-WSOFKOLP.js} +3 -3
  210. package/dist/{chunk-MNAXYY3R.js → chunk-WUVZDFHS.js} +31 -11
  211. package/dist/{chunk-UG46QBLT.js → chunk-YIMOT5OO.js} +10 -10
  212. package/dist/{chunk-2ZQMA2WB.js → chunk-ZPSOF6VL.js} +2 -2
  213. package/dist/generated/index.d.ts +3 -0
  214. package/dist/generated/index.js +66 -62
  215. package/dist/index.js +66 -62
  216. package/dist/styles.css +2719 -799
  217. package/dist/utils/index.d.ts +1 -1
  218. package/dist/utils/tone.d.ts +7 -12
  219. package/package.json +4 -4
  220. package/scripts/check-css-literals.mjs +159 -23
  221. package/scripts/check-css-variables.mjs +5 -3
  222. package/scripts/css-source.mjs +97 -5
  223. package/dist/Avatar-P2KRQM2B.css +0 -156
  224. package/dist/Charts-D7G2BSXH.css +0 -277
  225. package/dist/CommandPalette-CSJDUCQA.css +0 -115
  226. package/dist/Kbd-W66MXQI5.css +0 -61
  227. package/dist/SearchTrigger-QXOYAUUY.css +0 -79
  228. package/dist/SidebarNav-QGSFKZYA.css +0 -319
  229. package/dist/StatCard-KYPKZUWX.css +0 -111
  230. package/dist/StatusDot-HA2L2FSX.css +0 -84
  231. package/dist/chunk-22O7LAW2.js +0 -41
  232. package/dist/chunk-2HQR4U4D.js +0 -143
  233. package/dist/chunk-ESCO4XYW.js +0 -144
  234. package/dist/chunk-F4PJZ4ED.js +0 -245
  235. package/dist/chunk-PNFASD6F.js +0 -98
  236. package/dist/chunk-PZSWF74H.js +0 -15
  237. /package/dist/{chunk-ZCR6YGQ4.js → chunk-PKIN4IMB.js} +0 -0
@@ -0,0 +1,76 @@
1
+ import type { HTMLAttributes } from 'react';
2
+ import { type AvatarKind, type AvatarRing, type AvatarSizeStep } from './Avatar.js';
3
+ /** One badge in a stack. */
4
+ export interface AvatarStackMember {
5
+ /** Who: the initials, and a word of the stack's accessible name. */
6
+ name: string;
7
+ /** An agent (the default) is a squircle; a human is a circle. */
8
+ kind?: AvatarKind | undefined;
9
+ src?: string | undefined;
10
+ /** A state ring on this badge, as `Avatar` draws it. */
11
+ ring?: AvatarRing | undefined;
12
+ /**
13
+ * What tells two members apart when their names do not (a seat's handle, a
14
+ * person's id), unique within the stack. The name is used when it is absent.
15
+ */
16
+ id?: string | undefined;
17
+ }
18
+ export interface AvatarStackProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'children'> {
19
+ /** Everybody in the stack, in the order they are drawn. */
20
+ members: readonly AvatarStackMember[];
21
+ /**
22
+ * How many badges are drawn before the rest are counted in a chip.
23
+ *
24
+ * FOUR BY DEFAULT, because that is the most any stack in the approved design
25
+ * draws, and a stack is a glance at WHO rather than a roster: past four the
26
+ * overlapped monograms stop being read at all. A whole number of at least 1.
27
+ */
28
+ max?: number | undefined;
29
+ /**
30
+ * The badges' step, `sm` by default.
31
+ *
32
+ * NOT THE NEAREST STEP TO THE DESIGN'S 22px, which is `xs`, because the
33
+ * design draws its stacks' initials at 9px and this kit's smallest type is
34
+ * 11px. Behind the next badge's 6px and its 2px cut-out, a badge shows its
35
+ * box less 8px: at `xs` that leaves 9 of the 14px two mono initials take,
36
+ * 64% of them, the second letter gone to a stem. The design's own stack
37
+ * shows 77% of its initials, and `sm` is the smallest step that shows as
38
+ * much, at 85%.
39
+ */
40
+ size?: AvatarSizeStep | undefined;
41
+ /**
42
+ * The accessible name, where the derived one ("3 agents: SWE, CTO, PM") is
43
+ * not what the stack means where it stands ("Watching: …").
44
+ */
45
+ label?: string | undefined;
46
+ /**
47
+ * The names are already printed beside the stack, so it says nothing
48
+ * itself: "read by 3 agents today" beside a stack that read out the same
49
+ * three names would say them twice.
50
+ */
51
+ decorative?: boolean | undefined;
52
+ }
53
+ /**
54
+ * What a stack says to somebody who cannot see it: how many of each kind, and
55
+ * every name, the ones counted in the chip included.
56
+ *
57
+ * THE KINDS ARE COUNTED, NOT ASSUMED. A stack of watchers holds people and
58
+ * agents together, and "3 agents: Jane Founder, CTO, SWE" would call a person
59
+ * an agent to the one reader who cannot see the circle that says otherwise.
60
+ */
61
+ export declare function avatarStackLabel(members: readonly AvatarStackMember[]): string;
62
+ /**
63
+ * Several badges drawn as one mark: who is on something, at a glance.
64
+ *
65
+ * EACH BADGE OVERLAPS THE ONE BEFORE IT BY 6PX and is cut out of it by a 2px
66
+ * ring in the colour of the ground the stack stands on, which is the design's
67
+ * own stack. The ground is `--crewlet-avatar-stack-ground`, the sheet by
68
+ * default, which is where the design draws every stack; a stack standing on a
69
+ * card or on any other surface sets it on the stack. Past `max` the rest are
70
+ * counted in a chip, which is a PILL rather than either kind's outline: it is
71
+ * a number, not somebody.
72
+ *
73
+ * ONE IMAGE TO A SCREEN READER, named by `avatarStackLabel`, so a row reads
74
+ * "3 agents: SWE, CTO, PM" once rather than three badge names and a "+2".
75
+ */
76
+ export declare function AvatarStack({ members, max, size, label, decorative, className, style, ...rest }: AvatarStackProps): import("react").JSX.Element | null;
@@ -1,3 +1,6 @@
1
1
  import './Avatar.css';
2
- export { AVATAR_SIZES, Avatar, avatarPixels, avatarSquareCorner, avatarTint, getInitials } from './Avatar.js';
3
- export type { AvatarProps, AvatarShape, AvatarSize, AvatarSizeStep, AvatarTone, AvatarVariant } from './Avatar.js';
2
+ import './AvatarStack.css';
3
+ export { AVATAR_CORNER_RATIO, AVATAR_SIZES, Avatar, avatarCorner, avatarPixels, avatarTint, getInitials, } from './Avatar.js';
4
+ export type { AvatarKind, AvatarProps, AvatarRing, AvatarSize, AvatarSizeStep, AvatarTone } from './Avatar.js';
5
+ export { AvatarStack, avatarStackLabel } from './AvatarStack.js';
6
+ export type { AvatarStackMember, AvatarStackProps } from './AvatarStack.js';
@@ -1,2 +1,2 @@
1
- export { AVATAR_SIZES, Avatar, avatarPixels, avatarSquareCorner, avatarTint, getInitials } from '../chunk-PNFASD6F.js';
1
+ export { AVATAR_CORNER_RATIO, AVATAR_SIZES, Avatar, AvatarStack, avatarCorner, avatarPixels, avatarStackLabel, avatarTint, getInitials } from '../chunk-IA232OTU.js';
2
2
  import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,200 @@
1
+ /*
2
+ * The identity badge.
3
+ *
4
+ * IT IS NEUTRAL, and that is the whole rule. The system this replaces coloured
5
+ * a seat by `PALETTE[hash(name) % 8]`, over the same eight families it also
6
+ * spent on phases and event categories, so one amber meant "the execute
7
+ * phase", "the decision category" and "the Analyst" at once. A hash of a name
8
+ * carries no information: rename the seat and its colour changes, which is the
9
+ * proof it never meant anything. Identity is the OUTLINE (a squircle for an
10
+ * agent, a circle for a person), the monogram and the name.
11
+ *
12
+ * THE ONE HUE A BADGE CARRIES IS A STATE, as a ring round it, and the ring is
13
+ * the component's only coloured line.
14
+ *
15
+ * The seeded tints stay for the one case that earns them, a roster somebody
16
+ * scans, and their grounds are TOKENS: measured under white initials and held
17
+ * at 4.5:1 by the palette suite. Spelled as literals, five of the ten sat
18
+ * under that floor while the suite measured ten values nothing painted with.
19
+ */
20
+
21
+ .crewlet-avatar {
22
+ --crewlet-avatar-size: 32px;
23
+ display: inline-flex;
24
+ align-items: center;
25
+ justify-content: center;
26
+ flex: none;
27
+ width: var(--crewlet-avatar-size);
28
+ height: var(--crewlet-avatar-size);
29
+ overflow: hidden;
30
+ object-fit: cover;
31
+ font-family: var(--font-family-sans);
32
+ font-size: var(--font-size-xs);
33
+ font-weight: var(--font-weight-semibold);
34
+ letter-spacing: var(--font-letter-spacing-wide);
35
+ /* The document's own leading rather than a tight step of the badge's own.
36
+ The box is a fixed square that centres whatever line it holds, so the ink
37
+ lands in the same place either way; what the tight step bought was one
38
+ more number in a component that already sets four. */
39
+ line-height: var(--font-line-height-body);
40
+ text-transform: uppercase;
41
+ user-select: none;
42
+ box-sizing: border-box;
43
+ }
44
+
45
+ /*
46
+ * The four steps. Each pairs its box with a type step, so two initials sit
47
+ * inside the outline at every one of them. A numeric size sets the same
48
+ * `--crewlet-avatar-size` inline and computes its own type, because nothing in
49
+ * the scale can answer for an arbitrary box; everything else it takes from the
50
+ * rules below exactly as a step does.
51
+ */
52
+ .crewlet-avatar--xs {
53
+ --crewlet-avatar-size: 20px;
54
+ font-size: var(--font-size-2xs);
55
+ }
56
+
57
+ .crewlet-avatar--sm {
58
+ --crewlet-avatar-size: 26px;
59
+ font-size: var(--font-size-2xs);
60
+ }
61
+
62
+ .crewlet-avatar--md {
63
+ --crewlet-avatar-size: 32px;
64
+ font-size: var(--font-size-xs);
65
+ }
66
+
67
+ .crewlet-avatar--lg {
68
+ --crewlet-avatar-size: 40px;
69
+ font-size: var(--font-size-sm);
70
+ }
71
+
72
+ /* ── kinds ─────────────────────────────────────────────────────────────── */
73
+
74
+ /*
75
+ * AN AGENT IS A SQUIRCLE, set in the mono face: what the engine runs, named
76
+ * the way a handle is written.
77
+ *
78
+ * THE CORNER MOVES WITH THE BOX, at 0.29 of it (`AVATAR_CORNER_RATIO` in the
79
+ * component, which the suite holds equal to this number): the approved
80
+ * design's 7px at 24 and 9px at 30, as one proportion. It is computed here from
81
+ * the size property every step and every numeric size sets, so there is ONE
82
+ * ladder. There used to be two, a step table here and a numeric table in the
83
+ * component, and they disagreed: `size={80}` drew a squarer badge than
84
+ * `size="lg"` at half its width.
85
+ *
86
+ * WHERE THE BROWSER DRAWS A SQUIRCLE, IT IS A WHOLE ONE. `corner-shape:
87
+ * squircle` is a superellipse of exponent 4, which at a given radius reaches
88
+ * much closer to the box's corner than a circular arc does: at the 45 degree
89
+ * point it stands 0.159 of the radius in from each edge, against 0.293 for an
90
+ * arc. Kept at 0.29 of the box, that corner would stand 0.046 of the box in,
91
+ * half the design's depth and a nearly square badge. At half the box it stands
92
+ * 0.0795 of the box in, against the design's 0.0849 (0.13px at 24px), with the
93
+ * continuous curvature a squircle is for. So the corner is the circle token
94
+ * there, and the fallback above is what every other browser draws.
95
+ */
96
+ .crewlet-avatar--agent {
97
+ border-radius: calc(var(--crewlet-avatar-size) * 0.29);
98
+ font-family: var(--font-family-mono);
99
+ }
100
+
101
+ @supports (corner-shape: squircle) {
102
+ .crewlet-avatar--agent {
103
+ corner-shape: squircle;
104
+ border-radius: var(--radius-circle);
105
+ }
106
+ }
107
+
108
+ /* A PERSON IS A CIRCLE, set in the sans face, the round badge every member list
109
+ a reader has used already speaks. */
110
+ .crewlet-avatar--human {
111
+ border-radius: var(--radius-circle);
112
+ font-family: var(--font-family-sans);
113
+ }
114
+
115
+ .crewlet-avatar--image {
116
+ display: block;
117
+ object-fit: cover;
118
+ }
119
+
120
+ /* ── tones ─────────────────────────────────────────────────────────────── */
121
+
122
+ .crewlet-avatar--fallback {
123
+ border: 1px solid transparent;
124
+ }
125
+
126
+ /* The design's badge: the raised rung with the strong hairline round it and
127
+ the secondary ink, so a badge on a card reads as a mark standing on it
128
+ rather than as a hole in it. */
129
+ .crewlet-avatar--neutral {
130
+ background: var(--color-surface-elevated);
131
+ border-color: var(--color-border-strong);
132
+ color: var(--color-text-secondary);
133
+ }
134
+
135
+ .crewlet-avatar--seeded {
136
+ color: var(--color-text-on-accent);
137
+ }
138
+
139
+ .crewlet-avatar--tint-0 { background: var(--color-avatar-tint-0); }
140
+ .crewlet-avatar--tint-1 { background: var(--color-avatar-tint-1); }
141
+ .crewlet-avatar--tint-2 { background: var(--color-avatar-tint-2); }
142
+ .crewlet-avatar--tint-3 { background: var(--color-avatar-tint-3); }
143
+ .crewlet-avatar--tint-4 { background: var(--color-avatar-tint-4); }
144
+ .crewlet-avatar--tint-5 { background: var(--color-avatar-tint-5); }
145
+ .crewlet-avatar--tint-6 { background: var(--color-avatar-tint-6); }
146
+ .crewlet-avatar--tint-7 { background: var(--color-avatar-tint-7); }
147
+ .crewlet-avatar--tint-8 { background: var(--color-avatar-tint-8); }
148
+ .crewlet-avatar--tint-9 { background: var(--color-avatar-tint-9); }
149
+
150
+ /* ── the state ring ────────────────────────────────────────────────────── */
151
+
152
+ /*
153
+ * A 1.5px LINE 2px OUTSIDE THE BADGE, which is the design's ring: it draws a
154
+ * 3.5px shadow over a 2px one in the card's colour, and 3.5 less 2 is 1.5.
155
+ *
156
+ * AN OUTLINE RATHER THAN THAT SHADOW PAIR, for three reasons. The gap is
157
+ * TRANSPARENT, so the ring reads on whatever the badge stands on, where the
158
+ * design's gap is the card's own fill and cuts a card-coloured band into any
159
+ * other ground. An outline follows the corner, the squircle's included, in
160
+ * every engine this package supports. And forced-colors mode keeps an outline
161
+ * and drops every shadow, so the ring is still drawn for the readers who most
162
+ * need a boundary; it is drawn in the system colour there, which is why the
163
+ * state is always said in words beside the badge as well.
164
+ *
165
+ * LONGHANDS, so the tone rules below set the colour alone and cannot reset the
166
+ * geometry, whichever order they are read in. Each fill is measured at 3:1 as
167
+ * a mark on every opaque surface by @crewlethq/tokens, which is the floor a
168
+ * boundary a reader has to see is held to.
169
+ */
170
+ .crewlet-avatar--ring-info,
171
+ .crewlet-avatar--ring-warning,
172
+ .crewlet-avatar--ring-danger,
173
+ .crewlet-avatar--ring-success,
174
+ .crewlet-avatar--ring-brand {
175
+ outline-style: solid;
176
+ outline-width: 1.5px;
177
+ outline-offset: 2px;
178
+ }
179
+
180
+ .crewlet-avatar--ring-info {
181
+ outline-color: var(--color-feedback-info);
182
+ }
183
+
184
+ .crewlet-avatar--ring-warning {
185
+ outline-color: var(--color-feedback-warning);
186
+ }
187
+
188
+ .crewlet-avatar--ring-danger {
189
+ outline-color: var(--color-feedback-danger);
190
+ }
191
+
192
+ .crewlet-avatar--ring-success {
193
+ outline-color: var(--color-feedback-success);
194
+ }
195
+
196
+ /* SELECTED, in the accent, which is what the accent means: where the reader
197
+ is. It is the only place a badge spends the accent. */
198
+ .crewlet-avatar--ring-brand {
199
+ outline-color: var(--color-brand-accent);
200
+ }
@@ -0,0 +1,72 @@
1
+ /*
2
+ * Several badges as one mark (AvatarStack.tsx).
3
+ *
4
+ * THE DESIGN'S STACK: each badge overlaps the one before it by 6px and is cut
5
+ * out of it by a 2px ring in the ground's own colour, so the overlap reads as
6
+ * badges standing in front of each other rather than as one blot. The ring is
7
+ * a SHADOW rather than a border, because it has to fall outside the badge
8
+ * without moving it, and it is decoration: forced-colors mode drops it and the
9
+ * badges' own hairlines still separate them.
10
+ *
11
+ * THE GROUND IS A VARIABLE because a stack stands on whatever it is put on,
12
+ * and a cut-out in the sheet's colour on a card is a band of the wrong grey
13
+ * round every badge. It defaults to the SHEET, because that is where the
14
+ * approved design draws every stack it has: in the top bar of a page, over a
15
+ * board and over a knowledge page, and in a task's side column, all of them on
16
+ * the sheet, with the design's own cut-out drawn in the sheet's colour. A stack
17
+ * that stands on a card, or on anything else, sets it on the stack itself.
18
+ *
19
+ * Every rule is two classes deep, so it outweighs the badge's own one-class
20
+ * rules whichever order the stylesheets are bundled in.
21
+ */
22
+
23
+ .crewlet-avatar-stack {
24
+ --crewlet-avatar-stack-ground: var(--color-surface-background);
25
+ /* The badges' box, which the component sets from the step it was given; the
26
+ default is the default step's, sm. The chip reads it, so it stands exactly
27
+ as tall as the badges beside it. */
28
+ --crewlet-avatar-stack-size: 26px;
29
+ display: inline-flex;
30
+ flex: none;
31
+ align-items: center;
32
+ vertical-align: middle;
33
+ }
34
+
35
+ .crewlet-avatar-stack > .crewlet-avatar-stack__member {
36
+ box-shadow: 0 0 0 2px var(--crewlet-avatar-stack-ground);
37
+ }
38
+
39
+ /* The design's 6px, a little under a third of its 22px badge: enough that the
40
+ stack is one mark, little enough that every monogram stays readable. */
41
+ .crewlet-avatar-stack > .crewlet-avatar-stack__member + .crewlet-avatar-stack__member {
42
+ margin-inline-start: -6px;
43
+ }
44
+
45
+ /*
46
+ * THE COUNT OF THE REST. A PILL, where every badge is a squircle or a circle:
47
+ * it is a number rather than somebody, and drawn in either kind's outline it
48
+ * would read as one more agent or one more person. Otherwise it is the neutral
49
+ * badge exactly (the raised rung, the strong hairline, the secondary ink), in
50
+ * the sans face with tabular figures so "+9" and "+12" sit alike.
51
+ */
52
+ .crewlet-avatar-stack > .crewlet-avatar-stack__more {
53
+ display: inline-flex;
54
+ flex: none;
55
+ align-items: center;
56
+ justify-content: center;
57
+ box-sizing: border-box;
58
+ min-width: var(--crewlet-avatar-stack-size);
59
+ height: var(--crewlet-avatar-stack-size);
60
+ padding-inline: var(--spacing-1);
61
+ border: 1px solid var(--color-border-strong);
62
+ border-radius: var(--radius-pill);
63
+ background: var(--color-surface-elevated);
64
+ color: var(--color-text-secondary);
65
+ font-family: var(--font-family-sans);
66
+ font-size: var(--font-size-2xs);
67
+ font-weight: var(--font-weight-semibold);
68
+ font-variant-numeric: tabular-nums;
69
+ line-height: var(--font-line-height-tight);
70
+ white-space: nowrap;
71
+ user-select: none;
72
+ }
@@ -1,2 +1,2 @@
1
- export { BrandLockup } from '../chunk-WNI2WSJF.js';
1
+ export { BrandLockup } from '../chunk-7KBNFFM3.js';
2
2
  import '../chunk-ODEQTPFM.js';
@@ -9,12 +9,19 @@
9
9
 
10
10
  /*
11
11
  * IT FITS THE BAR IT IS DRAWN BESIDE. The rail's head is the top bar's own
12
- * height (64px, a fixed token at every density), so the lockup has to come in
12
+ * height (52px, a fixed token at every density), so the lockup has to come in
13
13
  * under that height with its context line on: mark 24 plus one 11px line at
14
- * the document's own leading plus twice the block padding is 56.5px at the
15
- * normal density and 58.7px at comfortable. It was 66.5px, which grew the head
16
- * past the bar and put a visible kink across the window on every deployment
17
- * that names a company.
14
+ * the document's own leading (15.95px) plus twice the block padding is 47.95px
15
+ * at the normal density and 49.07px at comfortable. It was 66.5px once, which
16
+ * grew the head past the bar and put a visible kink across the window on every
17
+ * deployment that names a company.
18
+ *
19
+ * THE BLOCK PADDING IS THE SMALL STEP for that reason. It was the 8px step
20
+ * while the bar was 64px; at 52px the same padding made the lockup 55.95px,
21
+ * past the bar again, and the mark and the context line cannot give anything
22
+ * up (the mark is the home link's 24px target, the line is the document's).
23
+ * The head centres the lockup, so the padding is the least room it keeps at
24
+ * the top and the bottom rather than the room it is drawn with.
18
25
  *
19
26
  * NO GAP BETWEEN THE TWO LINES. They are one lockup rather than two stacked
20
27
  * labels, and the leading is the space between them: a gap on top of it reads
@@ -33,7 +40,7 @@
33
40
  link's target height, so it sits on the 24px floor rather than under it.
34
41
  A consumer with a wider mark sets this rather than editing two rules. */
35
42
  --crewlet-brand-mark: 24px;
36
- padding: var(--spacing-2) calc(var(--size-nav-gutter) + var(--size-nav-row-pad));
43
+ padding: var(--spacing-1) calc(var(--size-nav-gutter) + var(--size-nav-row-pad));
37
44
  }
38
45
 
39
46
  .crewlet-brand__home {
@@ -72,7 +79,7 @@
72
79
  font-size: var(--font-size-sm);
73
80
  font-weight: var(--font-weight-semibold);
74
81
  letter-spacing: var(--font-letter-spacing-tight);
75
- line-height: var(--font-line-height-normal);
82
+ line-height: var(--font-line-height-body);
76
83
  color: var(--color-text-primary);
77
84
  overflow: hidden;
78
85
  text-overflow: ellipsis;
@@ -82,24 +89,23 @@
82
89
  /* Indented to the name above it by the mark's own box, and truncated: a
83
90
  company name is as long as somebody registered it.
84
91
 
85
- THE RAIL'S OWN MICRO-LABEL REGISTER, which is the wide step rather than the
86
- wider one an Eyebrow takes: this line and the nav's group labels are the two
87
- uppercase runs in the rail, they sit twenty pixels apart, and at the wider
88
- step the company's name was visibly broader than the sections under it
89
- rather than quieter than them. The suite holds the two together. */
92
+ THE RAIL'S ONE UPPERCASE RUN, on the wide step rather than the wider one an
93
+ Eyebrow takes: at the wider step the company's name was visibly broader
94
+ than the sections under it rather than quieter than them. The nav's group
95
+ labels twenty pixels below are sentence-case words at the caption step, so
96
+ the case and the size are what hold the two apart; the suite holds that. */
90
97
  .crewlet-brand__context {
91
98
  padding-left: calc(var(--crewlet-brand-mark) + var(--spacing-2));
92
99
  font-family: var(--font-family-sans);
93
100
  font-size: var(--font-size-2xs);
94
- /* THE REGULAR WEIGHT, which is the one thing that separates this line from
95
- the nav's group labels below it. The two are the only uppercase runs in
96
- the rail and they sit twenty pixels apart; drawn at the same size, the
97
- same tracking and the same weight they read as two headings of one list
98
- rather than as the company's name above the sections in it. A group name
99
- is what a reader scans, so the weight stays there and goes from here. */
101
+ /* THE REGULAR WEIGHT: the company's name is a quiet line under the product
102
+ name, not a heading. It used to be the one thing separating this line
103
+ from the nav's group labels, when both were uppercase at this size; the
104
+ labels are sentence case at the caption step now, and the weight stays
105
+ here because the line is still meant to be read past. */
100
106
  font-weight: var(--font-weight-regular);
101
107
  letter-spacing: var(--font-letter-spacing-wide);
102
- line-height: var(--font-line-height-normal);
108
+ line-height: var(--font-line-height-body);
103
109
  text-transform: uppercase;
104
110
  color: var(--color-text-tertiary);
105
111
  overflow: hidden;
@@ -1,5 +1,5 @@
1
1
  import { type AnchorHTMLAttributes, type ButtonHTMLAttributes, type ReactNode } from 'react';
2
- export type ButtonVariant = 'primary' | 'secondary' | 'outline' | 'tertiary' | 'accent' | 'danger';
2
+ export type ButtonVariant = 'primary' | 'secondary' | 'outline' | 'ghost' | 'accent' | 'danger';
3
3
  export type ButtonSize = 'small' | 'medium' | 'large';
4
4
  export type ButtonShape = 'square' | 'pill';
5
5
  interface ButtonLook {
@@ -7,7 +7,12 @@ interface ButtonLook {
7
7
  variant?: ButtonVariant | undefined;
8
8
  size?: ButtonSize | undefined;
9
9
  shape?: ButtonShape | undefined;
10
- /** Drawn before the label. A glyph component, not a name. */
10
+ /**
11
+ * Drawn before the label. A glyph component, not a name: a glyph strokes in
12
+ * `currentColor`, so it takes the label's ink on every variant. A brand
13
+ * mark such as `CrewletIcon` paints its own accent fill and disappears on
14
+ * the primary and accent fills, so it does not belong in this slot.
15
+ */
11
16
  leadingIcon?: ReactNode;
12
17
  /** Drawn after the label: a chevron, an external mark, a count. */
13
18
  trailingIcon?: ReactNode;
@@ -1,3 +1,3 @@
1
- export { Button, ButtonLink } from '../chunk-BZYDZBAN.js';
1
+ export { Button, ButtonLink } from '../chunk-ETYEBKR4.js';
2
2
  import '../chunk-BZFWDIV6.js';
3
3
  import '../chunk-ODEQTPFM.js';
@@ -4,9 +4,9 @@
4
4
  * SIX VARIANTS, AND THEY ARE A HIERARCHY RATHER THAN A PALETTE. primary is the
5
5
  * one action on the screen and takes the accent fill; secondary is everything
6
6
  * else; outline is the branded yes on a page that already has a primary;
7
- * tertiary is for a dense toolbar; danger is destructive, and the only one
8
- * that spends the critical hue. accent is primary's own recipe under the name
9
- * a caller may already have written.
7
+ * ghost is for a dense toolbar and the quiet second answer beside a primary;
8
+ * danger is destructive, and the only one that spends the critical hue. accent
9
+ * is primary's own recipe under the name a caller may already have written.
10
10
  *
11
11
  * THE ONE ACTION IS THE ACCENT FILL. It reads as the answer a screen is
12
12
  * asking for, which is what a filled monochrome button could not do beside a
@@ -16,9 +16,12 @@
16
16
  *
17
17
  * Every size is a --size-control-* step, so a button, a select and an input in
18
18
  * one row are the same height at every density, and none of them can fall
19
- * under the 24px a finger can hit. The padding ramp is one spacing step per
20
- * size, so a small button in a toolbar is tight and a large one on a landing
21
- * page is not.
19
+ * under the 24px a finger can hit. The steps are the approved design's own
20
+ * control rhythm, 30px and 26px for the medium and the small button, and they
21
+ * live in the tokens rather than here because the field and the segmented
22
+ * row beside a button stand at the same height. The padding ramp is one
23
+ * spacing step per size, so a small button in a toolbar is tight and a large
24
+ * one on a landing page is not.
22
25
  */
23
26
 
24
27
  .crewlet-btn {
@@ -136,9 +139,16 @@
136
139
  * Primary: the accent fill, and the one action on the screen.
137
140
  *
138
141
  * `accent` is the same recipe under the other name it is written as. They are
139
- * one rule rather than two, so the pair cannot drift into two blues, and the
142
+ * one rule rather than two, so the pair cannot drift into two violets, and the
140
143
  * name stays because call sites already spell it.
141
144
  *
145
+ * UNDER THE POINTER AND PRESSED IT DARKENS, a step each, and never brightens.
146
+ * The label is the on-accent white in both palettes, so a brighter fill is a
147
+ * step toward it: the approved design's brightness(1.08) hover took the dark
148
+ * accent's label from 4.53:1 to 4.18:1, under the text floor at the one moment
149
+ * the reader is about to press. The steps are tokens rather than a filter, so
150
+ * @crewlethq/tokens can measure them.
151
+ *
142
152
  * THE BORDER IS TRANSPARENT rather than the fill: a filled control needs no
143
153
  * boundary, and one drawn in the fill's own colour makes the button a step
144
154
  * wider than the secondary beside it in every forced-colors stylesheet that
@@ -163,16 +173,30 @@
163
173
  border-color: transparent;
164
174
  }
165
175
 
166
- /* Secondary: a surface with a visible boundary. Everything else. */
176
+ /*
177
+ * Secondary: everything else. The CARD's own ground inside the STRONG
178
+ * hairline, the approved design's button.
179
+ *
180
+ * STRONG, NOT DEFAULT, because a button stands on the very card it is filled
181
+ * with: every panel's actions sit on a card, and there the fill is no edge at
182
+ * all and the boundary is the whole of the button. The default hairline is
183
+ * the one that finds a CARD on the sheet, and a button drawn with it was a
184
+ * card-shaped outline of the panel's own divider; the strong step is the one
185
+ * a reader takes for a control's edge.
186
+ *
187
+ * Under the pointer it steps up a rung, to the raised ground, which the
188
+ * palette suite holds a visible step above the card, with the boundary a
189
+ * step stronger again; pressed, the pressed overlay.
190
+ */
167
191
  .crewlet-btn--secondary {
168
192
  background: var(--color-surface-subtle);
169
193
  color: var(--color-text-primary);
170
- border-color: var(--color-border-default);
194
+ border-color: var(--color-border-strong);
171
195
  }
172
196
 
173
197
  .crewlet-btn--secondary:hover:not(:disabled):not([aria-disabled='true']) {
174
198
  background: var(--color-surface-elevated);
175
- border-color: var(--color-border-hover);
199
+ border-color: var(--color-border-strong-hover);
176
200
  }
177
201
 
178
202
  .crewlet-btn--secondary:active:not(:disabled):not([aria-disabled='true']) {
@@ -191,19 +215,25 @@
191
215
  background: var(--color-brand-accent-soft);
192
216
  }
193
217
 
194
- /* Tertiary: borderless, for a dense toolbar. */
195
- .crewlet-btn--tertiary {
218
+ /*
219
+ * Ghost: no ground and no boundary, for a dense toolbar and for the quiet
220
+ * answer beside a primary ("Reassign" next to "Raise budget"). It is the word
221
+ * IconButton's borderless square uses, so a toolbar holding both is written
222
+ * in one vocabulary. Under the pointer it takes the hover overlay, the one
223
+ * every row takes, and its ink steps up to the primary text.
224
+ */
225
+ .crewlet-btn--ghost {
196
226
  background: transparent;
197
227
  color: var(--color-text-secondary);
198
228
  border-color: transparent;
199
229
  }
200
230
 
201
- .crewlet-btn--tertiary:hover:not(:disabled):not([aria-disabled='true']) {
231
+ .crewlet-btn--ghost:hover:not(:disabled):not([aria-disabled='true']) {
202
232
  background: var(--color-surface-hover);
203
233
  color: var(--color-text-primary);
204
234
  }
205
235
 
206
- .crewlet-btn--tertiary:active:not(:disabled):not([aria-disabled='true']) {
236
+ .crewlet-btn--ghost:active:not(:disabled):not([aria-disabled='true']) {
207
237
  background: var(--color-surface-pressed);
208
238
  }
209
239
 
@@ -212,15 +242,16 @@
212
242
  *
213
243
  * A SECONDARY THAT HAS GONE RED, not a red slab. It sits in the same row as
214
244
  * Cancel and it is the button a reader must not press by reflex, so it holds
215
- * the secondary's own weight until it is pointed at and states itself in its
216
- * INK, which is the step measured as text; the red fill it used to carry
217
- * pulled the eye to the destructive answer first on every dialog that had one.
218
- * The hue arrives on hover, as the tint plus the full fill on the boundary.
245
+ * the secondary's own weight, the card inside the strong hairline, until it
246
+ * is pointed at and states itself in its INK, which is the step measured as
247
+ * text; the red fill it used to carry pulled the eye to the destructive
248
+ * answer first on every dialog that had one. The hue arrives on hover, as the
249
+ * tint plus the full fill on the boundary.
219
250
  */
220
251
  .crewlet-btn--danger {
221
252
  background: var(--color-surface-subtle);
222
253
  color: var(--color-feedback-danger-ink);
223
- border-color: var(--color-border-default);
254
+ border-color: var(--color-border-strong);
224
255
  }
225
256
 
226
257
  .crewlet-btn--danger:hover:not(:disabled):not([aria-disabled='true']) {
@@ -1,2 +1,2 @@
1
- export { Callout } from '../chunk-3ZP55QZE.js';
1
+ export { Callout } from '../chunk-R6FBDTP3.js';
2
2
  import '../chunk-ODEQTPFM.js';
@@ -1,8 +1,8 @@
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, anchorView, beyondSlop, clampPan, clampZoom, fitView, panBy, pinchView, regionView, revealView, screenRect, toScreen, toWorld, wheelPixels, wheelZoomFactor, zoomAt, zoomLimits } from '../chunk-CMEE37QJ.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, anchorView, beyondSlop, clampPan, clampZoom, fitView, panBy, pinchView, regionView, revealView, screenRect, toScreen, toWorld, wheelPixels, wheelZoomFactor, zoomAt, zoomLimits } from '../chunk-BMYPGGPV.js';
2
2
  import '../chunk-53DVJCVW.js';
3
3
  import '../chunk-7RPGY3JE.js';
4
- import '../chunk-ITHXJHBB.js';
5
- import '../chunk-F27EPQ7D.js';
6
- import '../chunk-BZYDZBAN.js';
4
+ import '../chunk-R25RGPUB.js';
5
+ import '../chunk-4UQ7SMPK.js';
6
+ import '../chunk-ETYEBKR4.js';
7
7
  import '../chunk-BZFWDIV6.js';
8
8
  import '../chunk-ODEQTPFM.js';