@crewlethq/ui 0.17.1 → 0.18.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 (146) hide show
  1. package/README.md +36 -1
  2. package/dist/AccessDeniedCard/AccessDeniedCard.d.ts +39 -0
  3. package/dist/AccessDeniedCard/index.d.ts +3 -0
  4. package/dist/AccessDeniedCard/index.js +8 -0
  5. package/dist/AccessDeniedCard-WXM5DBDZ.css +8 -0
  6. package/dist/ArtifactCard/ArtifactCard.d.ts +61 -0
  7. package/dist/ArtifactCard/index.d.ts +3 -0
  8. package/dist/ArtifactCard/index.js +12 -0
  9. package/dist/ArtifactCard-EXVAEBV6.css +109 -0
  10. package/dist/AvatarPicker/index.js +4 -4
  11. package/dist/ChangeMark/ChangeMark.d.ts +26 -0
  12. package/dist/ChangeMark/index.d.ts +3 -0
  13. package/dist/ChangeMark/index.js +8 -0
  14. package/dist/ChangeMark-3VMTW7MT.css +22 -0
  15. package/dist/Combobox/index.js +1 -1
  16. package/dist/CommandPalette/index.js +3 -3
  17. package/dist/CursorFlag/CursorFlag.d.ts +34 -0
  18. package/dist/CursorFlag/index.d.ts +3 -0
  19. package/dist/CursorFlag/index.js +3 -0
  20. package/dist/CursorFlag-AJQJBUGY.css +61 -0
  21. package/dist/DataTable/index.js +6 -6
  22. package/dist/DataView/index.js +12 -12
  23. package/dist/DateTimePicker/index.js +2 -2
  24. package/dist/FollowBanner/FollowBanner.d.ts +35 -0
  25. package/dist/FollowBanner/index.d.ts +2 -0
  26. package/dist/FollowBanner/index.js +7 -0
  27. package/dist/FrameProtocol/index.d.ts +2 -0
  28. package/dist/FrameProtocol/index.js +2 -0
  29. package/dist/FrameProtocol/protocol.d.ts +164 -0
  30. package/dist/HuePicker/index.js +2 -2
  31. package/dist/LinkInterstitial/LinkInterstitial.d.ts +41 -0
  32. package/dist/LinkInterstitial/index.d.ts +3 -0
  33. package/dist/LinkInterstitial/index.js +11 -0
  34. package/dist/LinkInterstitial-ET4MSVSV.css +34 -0
  35. package/dist/ListInput/index.js +1 -1
  36. package/dist/LiveCursor/LiveCursor.d.ts +34 -0
  37. package/dist/LiveCursor/index.d.ts +3 -0
  38. package/dist/LiveCursor/index.js +4 -0
  39. package/dist/LiveCursor-DZHGIYWE.css +47 -0
  40. package/dist/MarkdownEditor/index.js +2 -2
  41. package/dist/Modal/index.js +2 -2
  42. package/dist/OrgTable/index.js +2 -2
  43. package/dist/PresenceModel/index.d.ts +2 -0
  44. package/dist/PresenceModel/index.js +3 -0
  45. package/dist/PresenceModel/presence.d.ts +80 -0
  46. package/dist/PresenceRing/PresenceRing.d.ts +31 -0
  47. package/dist/PresenceRing/index.d.ts +3 -0
  48. package/dist/PresenceRing/index.js +2 -0
  49. package/dist/PresenceRing-M4C22Q6U.css +68 -0
  50. package/dist/PresenceStack/PresenceStack.d.ts +36 -0
  51. package/dist/PresenceStack/index.d.ts +3 -0
  52. package/dist/PresenceStack/index.js +9 -0
  53. package/dist/PresenceStack-QSXQJND5.css +59 -0
  54. package/dist/PricingCard/index.js +2 -2
  55. package/dist/Principal/Principal.d.ts +35 -0
  56. package/dist/Principal/index.d.ts +2 -0
  57. package/dist/Principal/index.js +4 -0
  58. package/dist/PrincipalPicker/PrincipalPicker.d.ts +45 -0
  59. package/dist/PrincipalPicker/index.d.ts +3 -0
  60. package/dist/PrincipalPicker/index.js +12 -0
  61. package/dist/PrincipalPicker-7NNZTGUP.css +41 -0
  62. package/dist/SandboxedFrame/SandboxedFrame.d.ts +142 -0
  63. package/dist/SandboxedFrame/index.d.ts +3 -0
  64. package/dist/SandboxedFrame/index.js +8 -0
  65. package/dist/SandboxedFrame-L6HBQZCD.css +50 -0
  66. package/dist/ShareDialog/ShareDialog.d.ts +101 -0
  67. package/dist/ShareDialog/index.d.ts +5 -0
  68. package/dist/ShareDialog/index.js +19 -0
  69. package/dist/ShareDialog/roles.d.ts +10 -0
  70. package/dist/ShareDialog-YZ4F37MW.css +146 -0
  71. package/dist/SheetGrid/SheetGrid.d.ts +78 -0
  72. package/dist/SheetGrid/cells.d.ts +117 -0
  73. package/dist/SheetGrid/index.d.ts +5 -0
  74. package/dist/SheetGrid/index.js +18 -0
  75. package/dist/SheetGrid-4HOXDVIB.css +595 -0
  76. package/dist/SheetModel/clipboard.d.ts +37 -0
  77. package/dist/SheetModel/edits.d.ts +68 -0
  78. package/dist/SheetModel/index.d.ts +14 -0
  79. package/dist/SheetModel/index.js +3 -0
  80. package/dist/SheetModel/labels.d.ts +71 -0
  81. package/dist/SheetModel/navigation.d.ts +79 -0
  82. package/dist/SheetModel/options.d.ts +28 -0
  83. package/dist/SheetModel/types.d.ts +126 -0
  84. package/dist/SheetModel/values.d.ts +76 -0
  85. package/dist/SheetModel/view.d.ts +32 -0
  86. package/dist/Switcher/index.js +5 -5
  87. package/dist/Tag/Tag.d.ts +13 -0
  88. package/dist/Tag/index.js +1 -1
  89. package/dist/{Tag-4BRQS6GN.css → Tag-SRGTK5KI.css} +42 -0
  90. package/dist/TagsInput/index.js +2 -2
  91. package/dist/ThemeSwitcher/apply.d.ts +43 -0
  92. package/dist/ThemeSwitcher/index.d.ts +4 -2
  93. package/dist/ThemeSwitcher/index.js +3 -2
  94. package/dist/ThemeSwitcher/preferences.d.ts +2 -19
  95. package/dist/ThemeToggle/index.js +3 -2
  96. package/dist/TimeWindowPicker/index.js +3 -3
  97. package/dist/Timeline/Timeline.d.ts +7 -2
  98. package/dist/Timeline/index.js +1 -1
  99. package/dist/VersionTimeline/VersionTimeline.d.ts +76 -0
  100. package/dist/VersionTimeline/index.d.ts +3 -0
  101. package/dist/VersionTimeline/index.js +10 -0
  102. package/dist/VersionTimeline-EBJ6MIPJ.css +108 -0
  103. package/dist/{chunk-SBRE7IML.js → chunk-2ONWEDQT.js} +1 -1
  104. package/dist/chunk-2YR5ZPQ3.js +216 -0
  105. package/dist/chunk-3BYIWOTV.js +29 -0
  106. package/dist/chunk-3UAA4IWJ.js +98 -0
  107. package/dist/chunk-4KP4RC3O.js +25 -0
  108. package/dist/chunk-4U3GQ7D2.js +99 -0
  109. package/dist/chunk-5XACKNYR.js +53 -0
  110. package/dist/{chunk-FSKTOIYC.js → chunk-76FXDZAZ.js} +2 -2
  111. package/dist/chunk-A7EBCHEG.js +49 -0
  112. package/dist/{chunk-JCO3SIST.js → chunk-AQCV62K6.js} +1 -1
  113. package/dist/{chunk-O67VF5MS.js → chunk-AUQPBL4O.js} +2 -2
  114. package/dist/{chunk-HENOTGUV.js → chunk-BOW2VUCH.js} +2 -2
  115. package/dist/{chunk-UCYIRDND.js → chunk-DQSXWQMJ.js} +1 -1
  116. package/dist/chunk-ESKP3TXM.js +1 -0
  117. package/dist/chunk-F6V2PTN6.js +142 -0
  118. package/dist/chunk-FW7HN6AP.js +40 -0
  119. package/dist/chunk-FYXRWBJJ.js +1235 -0
  120. package/dist/{chunk-LOECRMHA.js → chunk-GFV4LJHH.js} +4 -3
  121. package/dist/chunk-I6POAB4V.js +20 -0
  122. package/dist/{chunk-PQ63NLFC.js → chunk-IFKBDRNJ.js} +1 -1
  123. package/dist/{chunk-6NN2F7GM.js → chunk-KVT3TJVG.js} +4 -4
  124. package/dist/chunk-LFZ45HV2.js +46 -0
  125. package/dist/{chunk-6TSZCBID.js → chunk-NP2C4Y4E.js} +1 -1
  126. package/dist/{chunk-FA2V2VT6.js → chunk-NZY77ZDU.js} +3 -3
  127. package/dist/chunk-PPAQFGS2.js +12 -0
  128. package/dist/chunk-S35G6PNC.js +80 -0
  129. package/dist/chunk-VYDFB6PJ.js +243 -0
  130. package/dist/chunk-WXAULPBH.js +135 -0
  131. package/dist/chunk-YM3GJHGW.js +69 -0
  132. package/dist/chunk-YYZRLLLY.js +822 -0
  133. package/dist/{chunk-K3OWD7BJ.js → chunk-Z24ZUSTX.js} +4 -19
  134. package/dist/chunk-ZXXDZJQN.js +36 -0
  135. package/dist/generated/index.d.ts +18 -0
  136. package/dist/generated/index.js +82 -62
  137. package/dist/index.js +82 -62
  138. package/dist/styles.css +1578 -149
  139. package/dist/utils/index.js +1 -1
  140. package/package.json +3 -3
  141. package/dist/{chunk-DEEVA6TV.js → chunk-2TZATTIU.js} +1 -1
  142. package/dist/{chunk-2UU5IGZI.js → chunk-5NVKTB6E.js} +1 -1
  143. package/dist/{chunk-CRVETI5L.js → chunk-CENOOTAV.js} +0 -0
  144. package/dist/{chunk-JF7X673Z.js → chunk-ERV5BUS3.js} +1 -1
  145. package/dist/{chunk-NXDEPUVG.js → chunk-PA4CYTBY.js} +1 -1
  146. package/dist/{chunk-77IEHFY4.js → chunk-QQGWES46.js} +1 -1
package/dist/styles.css CHANGED
@@ -1,3 +1,14 @@
1
+ /* AccessDeniedCard-WXM5DBDZ.css */
2
+ /* The card holds one empty state and nothing else, at a reading width, so a
3
+ refusal in a wide viewer body reads as one sentence rather than a banner. */
4
+
5
+ .crewlet-access-denied-card {
6
+ width: 100%;
7
+ max-width: var(--size-measure);
8
+ margin-inline: auto;
9
+ }
10
+
11
+
1
12
  /* Accordion-ZI2WLD5C.css */
2
13
  /*
3
14
  * Accordion: a stack of disclosures, one hairline between them.
@@ -1256,6 +1267,118 @@ a.crewlet-account-row__who:focus-visible {
1256
1267
  }
1257
1268
 
1258
1269
 
1270
+ /* ArtifactCard-EXVAEBV6.css */
1271
+ /*
1272
+ * A card in a gallery: the preview on top at a fixed ratio, so a grid of them
1273
+ * lines up whatever each preview is, then the title and up to three lines of
1274
+ * facts. `compact` is a row with the kind's glyph in place of the preview.
1275
+ */
1276
+
1277
+ .crewlet-artifact-card {
1278
+ display: flex;
1279
+ flex-direction: column;
1280
+ min-width: 0;
1281
+ overflow: hidden;
1282
+ color: inherit;
1283
+ text-decoration: none;
1284
+ }
1285
+
1286
+ .crewlet-artifact-card--compact {
1287
+ flex-direction: row;
1288
+ align-items: flex-start;
1289
+ gap: var(--spacing-3);
1290
+ padding: var(--spacing-3);
1291
+ }
1292
+
1293
+ .crewlet-artifact-card__preview {
1294
+ display: flex;
1295
+ align-items: center;
1296
+ justify-content: center;
1297
+ aspect-ratio: 16 / 9;
1298
+ overflow: hidden;
1299
+ border-bottom: 1px solid var(--color-border-default);
1300
+ background: var(--color-surface-inset);
1301
+ color: var(--color-text-tertiary);
1302
+ }
1303
+
1304
+ .crewlet-artifact-card__glyph {
1305
+ display: inline-flex;
1306
+ color: var(--color-text-tertiary);
1307
+ }
1308
+
1309
+ .crewlet-artifact-card__glyph--compact {
1310
+ flex: none;
1311
+ align-items: center;
1312
+ justify-content: center;
1313
+ width: var(--size-control-md);
1314
+ height: var(--size-control-md);
1315
+ border-radius: var(--radius-md);
1316
+ background: var(--color-surface-inset);
1317
+ }
1318
+
1319
+ .crewlet-artifact-card__body {
1320
+ display: flex;
1321
+ flex-direction: column;
1322
+ gap: var(--spacing-1);
1323
+ min-width: 0;
1324
+ padding: var(--spacing-3);
1325
+ }
1326
+
1327
+ .crewlet-artifact-card--compact .crewlet-artifact-card__body {
1328
+ padding: 0;
1329
+ }
1330
+
1331
+ .crewlet-artifact-card__title-row {
1332
+ display: flex;
1333
+ align-items: center;
1334
+ gap: var(--spacing-1);
1335
+ min-width: 0;
1336
+ }
1337
+
1338
+ .crewlet-artifact-card__title {
1339
+ overflow: hidden;
1340
+ color: var(--color-text-primary);
1341
+ font-weight: var(--font-weight-semibold);
1342
+ text-overflow: ellipsis;
1343
+ white-space: nowrap;
1344
+ }
1345
+
1346
+ .crewlet-artifact-card__pin {
1347
+ display: inline-flex;
1348
+ flex: none;
1349
+ color: var(--color-text-tertiary);
1350
+ }
1351
+
1352
+ .crewlet-artifact-card__facts {
1353
+ display: flex;
1354
+ flex-direction: column;
1355
+ gap: var(--spacing-1);
1356
+ color: var(--color-text-tertiary);
1357
+ font-size: var(--font-size-xs);
1358
+ }
1359
+
1360
+ .crewlet-artifact-card__line {
1361
+ display: flex;
1362
+ flex-wrap: wrap;
1363
+ align-items: center;
1364
+ gap: var(--spacing-1) var(--spacing-2);
1365
+ min-width: 0;
1366
+ }
1367
+
1368
+ .crewlet-artifact-card__owner,
1369
+ .crewlet-artifact-card__presence {
1370
+ display: inline-flex;
1371
+ align-items: center;
1372
+ gap: var(--spacing-1);
1373
+ min-width: 0;
1374
+ }
1375
+
1376
+ .crewlet-artifact-card__changes {
1377
+ color: var(--color-text-secondary);
1378
+ font-weight: var(--font-weight-medium);
1379
+ }
1380
+
1381
+
1259
1382
  /* AuthLayout-ODHBUPHQ.css */
1260
1383
  /*
1261
1384
  * The sign-in page: one narrow column near the top of the window.
@@ -3513,6 +3636,31 @@ a.crewlet-breadcrumb__crumb:focus-visible {
3513
3636
  }
3514
3637
 
3515
3638
 
3639
+ /* ChangeMark-3VMTW7MT.css */
3640
+ /*
3641
+ * A change mark (ChangeMark.tsx): a notch in the top end corner of whatever
3642
+ * it sits on, which is the nearest positioned ancestor. A triangle drawn by
3643
+ * two borders, so it is a shape at any zoom and needs no glyph.
3644
+ */
3645
+
3646
+ .crewlet-change-mark {
3647
+ position: absolute;
3648
+ top: 0;
3649
+ inset-inline-end: 0;
3650
+ width: 0;
3651
+ height: 0;
3652
+ border-top: var(--spacing-2) solid var(--color-change-mark);
3653
+ border-inline-start: var(--spacing-2) solid transparent;
3654
+ pointer-events: auto;
3655
+ }
3656
+
3657
+ @media (forced-colors: active) {
3658
+ .crewlet-change-mark {
3659
+ border-top-color: CanvasText;
3660
+ }
3661
+ }
3662
+
3663
+
3516
3664
  /* CharacterPicker-ZEYIKUNQ.css */
3517
3665
  /*
3518
3666
  * The grid of characters.
@@ -5671,6 +5819,70 @@ a.crewlet-breadcrumb__crumb:focus-visible {
5671
5819
  }
5672
5820
 
5673
5821
 
5822
+ /* CursorFlag-AJQJBUGY.css */
5823
+ /*
5824
+ * A collaborator's name flag (CursorFlag.tsx): the name on a plate of their
5825
+ * presence hue, in the ink the palette suite holds at 4.5:1 on every hue.
5826
+ */
5827
+
5828
+ .crewlet-cursor-flag {
5829
+ display: inline-flex;
5830
+ align-items: center;
5831
+ gap: var(--spacing-1);
5832
+ box-sizing: border-box;
5833
+ max-width: 16em;
5834
+ padding: 0 calc(var(--spacing-1) * 1.5);
5835
+ border-radius: var(--radius-pill);
5836
+ background: var(--crewlet-presence-hue);
5837
+ box-shadow: var(--shadow-cursor);
5838
+ color: var(--color-presence-flag-text);
5839
+ font-family: var(--font-family-sans);
5840
+ font-size: var(--font-size-2xs);
5841
+ font-weight: var(--font-weight-semibold);
5842
+ line-height: var(--font-line-height-normal);
5843
+ white-space: nowrap;
5844
+ pointer-events: none;
5845
+ user-select: none;
5846
+ }
5847
+
5848
+ .crewlet-cursor-flag--agent {
5849
+ border-radius: var(--radius-xs);
5850
+ }
5851
+
5852
+ .crewlet-cursor-flag__name {
5853
+ overflow: hidden;
5854
+ text-overflow: ellipsis;
5855
+ }
5856
+
5857
+ .crewlet-cursor-flag__glyph {
5858
+ flex: none;
5859
+ }
5860
+
5861
+ /* Pinned to the element it labels, which is the nearest positioned ancestor. */
5862
+ .crewlet-cursor-flag--top-end,
5863
+ .crewlet-cursor-flag--bottom-end {
5864
+ position: absolute;
5865
+ inset-inline-end: 0;
5866
+ z-index: var(--z-index-presence);
5867
+ }
5868
+
5869
+ .crewlet-cursor-flag--top-end {
5870
+ bottom: 100%;
5871
+ }
5872
+
5873
+ .crewlet-cursor-flag--bottom-end {
5874
+ top: 100%;
5875
+ }
5876
+
5877
+ @media (forced-colors: active) {
5878
+ .crewlet-cursor-flag {
5879
+ border: 1px solid CanvasText;
5880
+ background: Canvas;
5881
+ color: CanvasText;
5882
+ }
5883
+ }
5884
+
5885
+
5674
5886
  /* DataTable-WZK3V62B.css */
5675
5887
  /* ─────────────────────────────────────────────────────────────────
5676
5888
  * Default variant.
@@ -11363,6 +11575,43 @@ svg.crewlet-datetime__chevron {
11363
11575
  }
11364
11576
 
11365
11577
 
11578
+ /* LinkInterstitial-ET4MSVSV.css */
11579
+ /*
11580
+ * The destination, said twice: the host as the claim a reader decides on, in
11581
+ * the title's register, then the whole address in mono for whoever wants to
11582
+ * read it exactly. The address wraps anywhere, because a long URL that does
11583
+ * not wrap pushes the dialog wider than a phone.
11584
+ */
11585
+
11586
+ .crewlet-link-interstitial {
11587
+ display: flex;
11588
+ flex-direction: column;
11589
+ gap: var(--spacing-2);
11590
+ padding: var(--spacing-3);
11591
+ border-radius: var(--radius-md);
11592
+ background: var(--color-surface-inset);
11593
+ }
11594
+
11595
+ .crewlet-link-interstitial__label {
11596
+ color: var(--color-text-tertiary);
11597
+ font-size: var(--font-size-xs);
11598
+ font-weight: var(--font-weight-medium);
11599
+ }
11600
+
11601
+ .crewlet-link-interstitial__host {
11602
+ color: var(--color-text-primary);
11603
+ font-size: var(--font-size-lg);
11604
+ font-weight: var(--font-weight-semibold);
11605
+ overflow-wrap: anywhere;
11606
+ }
11607
+
11608
+ .crewlet-link-interstitial__href {
11609
+ align-self: flex-start;
11610
+ max-width: 100%;
11611
+ overflow-wrap: anywhere;
11612
+ }
11613
+
11614
+
11366
11615
  /* List-MYJIV6MP.css */
11367
11616
  /*
11368
11617
  * The non-tabular list. One row recipe, four framings.
@@ -11853,6 +12102,56 @@ svg.crewlet-datetime__chevron {
11853
12102
  }
11854
12103
 
11855
12104
 
12105
+ /* LiveCursor-DZHGIYWE.css */
12106
+ /*
12107
+ * A collaborator's live pointer and its flag (LiveCursor.tsx). It stands at a
12108
+ * point by transform, so a moving cursor repaints without a layout, and the
12109
+ * flag hangs below and after the pointer's tip.
12110
+ */
12111
+
12112
+ .crewlet-live-cursor {
12113
+ position: absolute;
12114
+ top: 0;
12115
+ left: 0;
12116
+ z-index: var(--z-index-presence);
12117
+ display: block;
12118
+ pointer-events: none;
12119
+ }
12120
+
12121
+ .crewlet-live-cursor__pointer {
12122
+ display: block;
12123
+ color: var(--crewlet-presence-hue);
12124
+ }
12125
+
12126
+ .crewlet-live-cursor__flag {
12127
+ position: absolute;
12128
+ top: calc(var(--spacing-4) + var(--spacing-1));
12129
+ left: var(--spacing-3);
12130
+ }
12131
+
12132
+ .crewlet-live-cursor--resting {
12133
+ opacity: 0.4;
12134
+ }
12135
+
12136
+ .crewlet-live-cursor--gone {
12137
+ display: none;
12138
+ }
12139
+
12140
+ @media (prefers-reduced-motion: no-preference) {
12141
+ .crewlet-live-cursor--glide {
12142
+ transition:
12143
+ transform var(--motion-duration-fast) linear,
12144
+ opacity var(--motion-duration-base) var(--motion-easing-default);
12145
+ }
12146
+ }
12147
+
12148
+ @media (forced-colors: active) {
12149
+ .crewlet-live-cursor__pointer {
12150
+ color: Highlight;
12151
+ }
12152
+ }
12153
+
12154
+
11856
12155
  /* MarkdownEditor-ZLSHTOIZ.css */
11857
12156
  /*
11858
12157
  * Writing markdown (MarkdownEditor.tsx): the bar, the source or its preview,
@@ -14495,60 +14794,193 @@ svg.crewlet-datetime__chevron {
14495
14794
  }
14496
14795
 
14497
14796
 
14498
- /* PricingCard-HTAHG4ST.css */
14797
+ /* PresenceRing-M4C22Q6U.css */
14499
14798
  /*
14500
- * PricingCard, the plan-tier card surface.
14501
- *
14502
- * The primitive owns the outer card (border, radius, padding, states), the
14503
- * header, the price block and the grid container, and leaves the body and the
14504
- * footer to the caller.
14799
+ * The presence hues and the ring drawn in them (PresenceRing.tsx).
14505
14800
  *
14506
- * EVERY COLOUR IS A TOKEN NOW. The tags, the price note and the card's own
14507
- * ground were dark-theme literals: an amber at rgba(251, 191, 36, 0.75), a
14508
- * green at #86efac and a white lift at 2 percent, none of which is visible on
14509
- * a light page. The status hues here are the same soft-and-ink pairs the Tag
14510
- * and the Callout draw, so a "Save 10 percent" chip and a success tag on the
14511
- * screen behind it are the same green.
14801
+ * ONE TABLE OF HUES for every presence mark: a ring, a flag, a cursor and a
14802
+ * badge's ring each read `--crewlet-presence-hue` from the class
14803
+ * `presenceHueClass` writes, so the six node hues are spelt once. The hue is
14804
+ * the presence colour exception: it ties a mark to a name and is spent on
14805
+ * nothing else.
14512
14806
  */
14513
14807
 
14514
- /* ── Grid container ─────────────────────────────────────────────── */
14515
- .crewlet-pricing-card-grid {
14516
- display: grid;
14517
- grid-template-columns: repeat(4, minmax(0, 1fr));
14518
- gap: var(--spacing-3);
14519
- align-items: stretch;
14808
+ .crewlet-presence-hue--purple {
14809
+ --crewlet-presence-hue: var(--color-node-purple);
14520
14810
  }
14521
14811
 
14522
- @media (max-width: 1200px) {
14523
- .crewlet-pricing-card-grid {
14524
- grid-template-columns: repeat(2, minmax(0, 1fr));
14525
- }
14812
+ .crewlet-presence-hue--cyan {
14813
+ --crewlet-presence-hue: var(--color-node-cyan);
14526
14814
  }
14527
14815
 
14528
- @media (max-width: 768px) {
14529
- .crewlet-pricing-card-grid {
14530
- grid-template-columns: minmax(0, 1fr);
14531
- }
14816
+ .crewlet-presence-hue--green {
14817
+ --crewlet-presence-hue: var(--color-node-green);
14532
14818
  }
14533
14819
 
14534
- /* ── Card root ──────────────────────────────────────────────────── */
14535
- .crewlet-pricing-card {
14536
- text-align: left;
14537
- /* The card recipe, flat: the card's surface, its hairline and its 12px
14538
- corner. One card surface across the system, so a plan tier and a
14539
- dashboard panel are the same object. */
14540
- background: var(--color-surface-subtle);
14541
- border: 1px solid var(--color-border-default);
14542
- border-radius: var(--radius-lg);
14543
- padding: var(--spacing-4);
14544
- display: flex;
14545
- flex-direction: column;
14546
- gap: var(--spacing-3);
14547
- font-family: var(--font-family-sans);
14548
- color: var(--color-text-primary);
14549
- min-width: 0;
14550
- container-type: inline-size;
14551
- transition:
14820
+ .crewlet-presence-hue--amber {
14821
+ --crewlet-presence-hue: var(--color-node-amber);
14822
+ }
14823
+
14824
+ .crewlet-presence-hue--rose {
14825
+ --crewlet-presence-hue: var(--color-node-rose);
14826
+ }
14827
+
14828
+ .crewlet-presence-hue--blue {
14829
+ --crewlet-presence-hue: var(--color-node-blue);
14830
+ }
14831
+
14832
+ .crewlet-presence-hue--neutral {
14833
+ --crewlet-presence-hue: var(--color-border-strong);
14834
+ }
14835
+
14836
+ /*
14837
+ * THE RING IS INSET and drawn on a pseudo element, so it never moves the
14838
+ * content, never doubles the element's own border and is never read. 2px,
14839
+ * the weight a selection ring is drawn at.
14840
+ */
14841
+ .crewlet-presence-ring {
14842
+ --crewlet-presence-ring-inset: 1px;
14843
+ position: relative;
14844
+ display: inline-block;
14845
+ }
14846
+
14847
+ .crewlet-presence-ring::after {
14848
+ position: absolute;
14849
+ inset: var(--crewlet-presence-ring-inset);
14850
+ z-index: var(--z-index-presence);
14851
+ border: 2px solid var(--crewlet-presence-hue);
14852
+ border-radius: inherit;
14853
+ content: '';
14854
+ pointer-events: none;
14855
+ }
14856
+
14857
+ .crewlet-presence-ring--idle::after {
14858
+ border-style: dashed;
14859
+ }
14860
+
14861
+ @media (forced-colors: active) {
14862
+ .crewlet-presence-ring::after {
14863
+ border-color: Highlight;
14864
+ }
14865
+ }
14866
+
14867
+
14868
+ /* PresenceStack-QSXQJND5.css */
14869
+ /*
14870
+ * Who is here (PresenceStack.tsx), on the avatar stack's own geometry: the
14871
+ * overlap and the counted chip are the stack's. What this adds is the ring in
14872
+ * each present collaborator's hue, outside the cut-out, and the idle fade.
14873
+ */
14874
+
14875
+ /* The wrapper (a span, or a button when badges select) carries no edge of its
14876
+ own: the cut-out and the hue ring are drawn on the badge inside it, which
14877
+ has the badge's own outline to follow. */
14878
+ .crewlet-presence-stack > .crewlet-presence-stack__member {
14879
+ display: inline-flex;
14880
+ flex: none;
14881
+ padding: 0;
14882
+ border: 0;
14883
+ background: none;
14884
+ box-shadow: none;
14885
+ color: inherit;
14886
+ font: inherit;
14887
+ }
14888
+
14889
+ .crewlet-presence-stack > .crewlet-presence-stack__member--human {
14890
+ border-radius: var(--radius-circle);
14891
+ }
14892
+
14893
+ .crewlet-presence-stack > .crewlet-presence-stack__member--agent {
14894
+ border-radius: var(--radius-sm);
14895
+ }
14896
+
14897
+ button.crewlet-presence-stack__member {
14898
+ cursor: pointer;
14899
+ }
14900
+
14901
+ button.crewlet-presence-stack__member:focus-visible {
14902
+ outline: 2px solid var(--color-focus);
14903
+ outline-offset: var(--size-focus-ring-inset-offset);
14904
+ }
14905
+
14906
+ .crewlet-presence-stack .crewlet-presence-stack__badge {
14907
+ box-shadow: 0 0 0 2px var(--crewlet-avatar-stack-ground);
14908
+ }
14909
+
14910
+ /* The hue ring sits outside the cut-out, so it reads as a ring round the
14911
+ badge rather than a stroke on it. */
14912
+ .crewlet-presence-stack .crewlet-presence-stack__badge--present {
14913
+ box-shadow:
14914
+ 0 0 0 2px var(--crewlet-avatar-stack-ground),
14915
+ 0 0 0 4px var(--crewlet-presence-hue);
14916
+ }
14917
+
14918
+ .crewlet-presence-stack .crewlet-presence-stack__badge--idle {
14919
+ opacity: 0.5;
14920
+ }
14921
+
14922
+ @media (forced-colors: active) {
14923
+ .crewlet-presence-stack .crewlet-presence-stack__badge--present {
14924
+ outline: 2px solid Highlight;
14925
+ outline-offset: 2px;
14926
+ }
14927
+ }
14928
+
14929
+
14930
+ /* PricingCard-HTAHG4ST.css */
14931
+ /*
14932
+ * PricingCard, the plan-tier card surface.
14933
+ *
14934
+ * The primitive owns the outer card (border, radius, padding, states), the
14935
+ * header, the price block and the grid container, and leaves the body and the
14936
+ * footer to the caller.
14937
+ *
14938
+ * EVERY COLOUR IS A TOKEN NOW. The tags, the price note and the card's own
14939
+ * ground were dark-theme literals: an amber at rgba(251, 191, 36, 0.75), a
14940
+ * green at #86efac and a white lift at 2 percent, none of which is visible on
14941
+ * a light page. The status hues here are the same soft-and-ink pairs the Tag
14942
+ * and the Callout draw, so a "Save 10 percent" chip and a success tag on the
14943
+ * screen behind it are the same green.
14944
+ */
14945
+
14946
+ /* ── Grid container ─────────────────────────────────────────────── */
14947
+ .crewlet-pricing-card-grid {
14948
+ display: grid;
14949
+ grid-template-columns: repeat(4, minmax(0, 1fr));
14950
+ gap: var(--spacing-3);
14951
+ align-items: stretch;
14952
+ }
14953
+
14954
+ @media (max-width: 1200px) {
14955
+ .crewlet-pricing-card-grid {
14956
+ grid-template-columns: repeat(2, minmax(0, 1fr));
14957
+ }
14958
+ }
14959
+
14960
+ @media (max-width: 768px) {
14961
+ .crewlet-pricing-card-grid {
14962
+ grid-template-columns: minmax(0, 1fr);
14963
+ }
14964
+ }
14965
+
14966
+ /* ── Card root ──────────────────────────────────────────────────── */
14967
+ .crewlet-pricing-card {
14968
+ text-align: left;
14969
+ /* The card recipe, flat: the card's surface, its hairline and its 12px
14970
+ corner. One card surface across the system, so a plan tier and a
14971
+ dashboard panel are the same object. */
14972
+ background: var(--color-surface-subtle);
14973
+ border: 1px solid var(--color-border-default);
14974
+ border-radius: var(--radius-lg);
14975
+ padding: var(--spacing-4);
14976
+ display: flex;
14977
+ flex-direction: column;
14978
+ gap: var(--spacing-3);
14979
+ font-family: var(--font-family-sans);
14980
+ color: var(--color-text-primary);
14981
+ min-width: 0;
14982
+ container-type: inline-size;
14983
+ transition:
14552
14984
  border-color var(--motion-duration-fast) var(--motion-easing-default),
14553
14985
  background var(--motion-duration-fast) var(--motion-easing-default),
14554
14986
  box-shadow var(--motion-duration-fast) var(--motion-easing-default);
@@ -14779,6 +15211,50 @@ svg.crewlet-datetime__chevron {
14779
15211
  }
14780
15212
 
14781
15213
 
15214
+ /* PrincipalPicker-7NNZTGUP.css */
15215
+ /*
15216
+ * The suggestions under the field, grouped by kind. A row is the badge and the
15217
+ * name with its second line, the shape every list of principals in the
15218
+ * product draws.
15219
+ */
15220
+
15221
+ .crewlet-principal-picker {
15222
+ flex: 1 1 auto;
15223
+ min-width: 0;
15224
+ }
15225
+
15226
+ .crewlet-principal-picker__group + .crewlet-principal-picker__group {
15227
+ margin-top: var(--spacing-1);
15228
+ padding-top: var(--spacing-1);
15229
+ border-top: 1px solid var(--color-border-default);
15230
+ }
15231
+
15232
+ .crewlet-principal-picker__heading {
15233
+ padding: var(--spacing-1) var(--spacing-2);
15234
+ color: var(--color-text-tertiary);
15235
+ font-size: var(--font-size-xs);
15236
+ font-weight: var(--font-weight-medium);
15237
+ }
15238
+
15239
+ .crewlet-principal-picker__option {
15240
+ display: flex;
15241
+ align-items: center;
15242
+ gap: var(--spacing-2);
15243
+ }
15244
+
15245
+ .crewlet-principal-picker__text {
15246
+ display: flex;
15247
+ flex-direction: column;
15248
+ min-width: 0;
15249
+ }
15250
+
15251
+ .crewlet-principal-picker__name {
15252
+ overflow: hidden;
15253
+ text-overflow: ellipsis;
15254
+ white-space: nowrap;
15255
+ }
15256
+
15257
+
14782
15258
  /* Prose-BTXNFT2Q.css */
14783
15259
  /*
14784
15260
  * Natural language: the proportional face, real leading, a bounded measure.
@@ -15113,6 +15589,59 @@ svg.crewlet-datetime__chevron {
15113
15589
  }
15114
15590
 
15115
15591
 
15592
+ /* SandboxedFrame-L6HBQZCD.css */
15593
+ /*
15594
+ * The frame fills the box it is given. The page around it does not scroll
15595
+ * round the artifact: the artifact scrolls inside its own document, which is
15596
+ * what a viewer body that holds one wants.
15597
+ *
15598
+ * The region takes focus when the frame hands it back, and keeps the
15599
+ * document's own focus treatment then: a reader who just left a page by
15600
+ * keyboard needs to see where they landed.
15601
+ */
15602
+
15603
+ .crewlet-sandboxed-frame {
15604
+ position: relative;
15605
+ display: flex;
15606
+ flex-direction: column;
15607
+ width: 100%;
15608
+ height: 100%;
15609
+ min-height: 0;
15610
+ overflow: hidden;
15611
+ border-radius: var(--radius-md);
15612
+ background: var(--color-surface-background);
15613
+ }
15614
+
15615
+ .crewlet-sandboxed-frame__frame {
15616
+ flex: 1 1 auto;
15617
+ display: block;
15618
+ width: 100%;
15619
+ height: 100%;
15620
+ border: 0;
15621
+ background: transparent;
15622
+ }
15623
+
15624
+ /* Kept out of sight while it starts, so a document that has not painted in
15625
+ the reader's palette yet is never what they see. It still loads. */
15626
+ .crewlet-sandboxed-frame[data-state='loading'] .crewlet-sandboxed-frame__frame {
15627
+ visibility: hidden;
15628
+ }
15629
+
15630
+ .crewlet-sandboxed-frame__loading {
15631
+ position: absolute;
15632
+ inset: 0;
15633
+ display: flex;
15634
+ padding: var(--spacing-3);
15635
+ }
15636
+
15637
+ .crewlet-sandboxed-frame__end {
15638
+ display: flex;
15639
+ flex-direction: column;
15640
+ justify-content: flex-start;
15641
+ padding: var(--spacing-4);
15642
+ }
15643
+
15644
+
15116
15645
  /* SearchTrigger-KIZLWBEH.css */
15117
15646
  /*
15118
15647
  * A button drawn as the field it stands in for.
@@ -15953,140 +16482,887 @@ svg.crewlet-select__chevron {
15953
16482
  cursor: not-allowed;
15954
16483
  }
15955
16484
 
15956
- .crewlet-select__option-tick {
15957
- display: inline-flex;
15958
- align-items: center;
15959
- justify-content: center;
15960
- flex: none;
15961
- width: 16px;
15962
- height: 16px;
15963
- margin-top: 1px;
15964
- color: var(--color-brand-accent-ink);
16485
+ .crewlet-select__option-tick {
16486
+ display: inline-flex;
16487
+ align-items: center;
16488
+ justify-content: center;
16489
+ flex: none;
16490
+ width: 16px;
16491
+ height: 16px;
16492
+ margin-top: 1px;
16493
+ color: var(--color-brand-accent-ink);
16494
+ }
16495
+
16496
+ /*
16497
+ * AT THE ROW'S END in a list whose rows lead with a mark (see `tickAtEnd`),
16498
+ * so the mark starts at the panel's edge. After a hint it follows the hint,
16499
+ * which already takes the free space; without one it takes it itself.
16500
+ */
16501
+ .crewlet-select__option-body + .crewlet-select__option-tick--end {
16502
+ margin-left: auto;
16503
+ }
16504
+
16505
+ .crewlet-select__option-body {
16506
+ display: flex;
16507
+ flex-direction: column;
16508
+ gap: 1px;
16509
+ min-width: 0;
16510
+ }
16511
+
16512
+ /*
16513
+ * WHAT AN OPTION DRAWS BEFORE ITS LABEL (a swatch, an avatar, a glyph),
16514
+ * centred on the label's first line rather than on the row, so a row with a
16515
+ * second line keeps its mark beside the words it belongs to. The same slot on
16516
+ * the trigger, while that option is the one chosen, sits on the value's line.
16517
+ */
16518
+ .crewlet-select__option-leading,
16519
+ .crewlet-select__leading {
16520
+ display: inline-flex;
16521
+ align-items: center;
16522
+ flex: none;
16523
+ }
16524
+
16525
+ .crewlet-select__option-leading {
16526
+ min-height: calc(var(--font-line-height-normal) * 1em);
16527
+ }
16528
+
16529
+ /* A hint ends the row's FIRST line, on the label's baseline, rather than
16530
+ sitting on the row's top edge at its own smaller size. */
16531
+ .crewlet-select__option:has(> .crewlet-listbox__hint) .crewlet-select__option-body,
16532
+ .crewlet-select__option > .crewlet-listbox__hint {
16533
+ align-self: baseline;
16534
+ }
16535
+
16536
+ /*
16537
+ * ONE LINE, WHICH IS WHAT THE ELLIPSIS BELOW WAS ALWAYS FOR. `overflow:
16538
+ * hidden` clips what leaves the box and `text-overflow` replaces what a LINE
16539
+ * cannot hold — and neither does anything to text that is simply allowed to
16540
+ * wrap, which is what this rule did without `white-space`. A long option
16541
+ * silently grew a second line instead of ellipsing, and with the row's own
16542
+ * flex minimum gone (see Listbox.css) that second line was drawn over the
16543
+ * option underneath.
16544
+ *
16545
+ * The trigger's `.crewlet-select__label` a hundred lines above has carried all
16546
+ * three since it was written; this is the same register on the same text, and
16547
+ * `.crewlet-listbox__hint` states the rule outright — "never wrapped: a hint
16548
+ * that broke across two lines turned every row in the list a different
16549
+ * height".
16550
+ */
16551
+ .crewlet-select__option-label {
16552
+ overflow: hidden;
16553
+ text-overflow: ellipsis;
16554
+ white-space: nowrap;
16555
+ }
16556
+
16557
+ .crewlet-select__option-desc {
16558
+ font-size: var(--font-size-2xs);
16559
+ line-height: var(--font-line-height-normal);
16560
+ color: var(--color-text-tertiary);
16561
+ }
16562
+
16563
+ /* The second line stays the second line on the row the reader is on: it is
16564
+ the same fact, and a description that changes colour with the highlight
16565
+ reads as a different kind of thing under the pointer. */
16566
+ .crewlet-select__menu .crewlet-listbox__option.is-highlight .crewlet-select__option-desc {
16567
+ color: var(--color-text-tertiary);
16568
+ }
16569
+
16570
+ /* ── The search box ──────────────────────────────────────────────────── */
16571
+
16572
+ /*
16573
+ * THE RING IS DRAWN WHERE THE ELEMENT IS. The input below clears the user
16574
+ * agent's outline, and the frame's `:focus-within` rule is the package's one
16575
+ * replacement for it — but that rule's own premise is that everything
16576
+ * focusable sits INSIDE `.crewlet-select`, and this box does not: the panel is
16577
+ * portalled into the layer host, outside that subtree, so `:focus-within`
16578
+ * could never match while focus was in the search field. And focus is moved
16579
+ * here on every open, so the one control a searchable Select puts a reader in
16580
+ * was the one with no focus indicator at all.
16581
+ *
16582
+ * On the band rather than the input, and INSET, because the panel clips: an
16583
+ * outset ring on the input would be cut by the menu's own `overflow: hidden`.
16584
+ */
16585
+ .crewlet-select__search:focus-within {
16586
+ outline: 1px solid var(--color-focus);
16587
+ outline-offset: -1px;
16588
+ }
16589
+
16590
+ .crewlet-select__search {
16591
+ display: flex;
16592
+ align-items: center;
16593
+ gap: var(--spacing-2);
16594
+ padding: var(--spacing-2) var(--spacing-3);
16595
+ border-bottom: 1px solid var(--color-border-default);
16596
+ color: var(--color-text-tertiary);
16597
+ flex: none;
16598
+ }
16599
+
16600
+ .crewlet-select__search-input {
16601
+ flex: 1;
16602
+ min-width: 0;
16603
+ background: transparent;
16604
+ border: none;
16605
+ outline: none;
16606
+ font: inherit;
16607
+ font-size: var(--font-size-compact);
16608
+ color: var(--color-text-primary);
16609
+ }
16610
+
16611
+ .crewlet-select__search-input::placeholder {
16612
+ color: var(--color-text-tertiary);
16613
+ opacity: 1;
16614
+ }
16615
+
16616
+ @media (prefers-reduced-motion: reduce) {
16617
+ .crewlet-select {
16618
+ transition: none;
16619
+ }
16620
+ }
16621
+
16622
+
16623
+ /* ShareDialog-YZ4F37MW.css */
16624
+ /*
16625
+ * Three blocks under the title: who to add and at what role, who has access,
16626
+ * and what the whole company may do. Each row of the audience is the badge,
16627
+ * the name over its second line, and the controls at the inline end; the note
16628
+ * and a refusal run the full width under it, so a long sentence never pushes
16629
+ * the controls out of line with the rows above and below.
16630
+ */
16631
+
16632
+ .crewlet-share-dialog__add {
16633
+ display: flex;
16634
+ align-items: flex-start;
16635
+ gap: var(--spacing-2);
16636
+ }
16637
+
16638
+ .crewlet-share-dialog__section {
16639
+ display: flex;
16640
+ flex-direction: column;
16641
+ gap: var(--spacing-2);
16642
+ }
16643
+
16644
+ .crewlet-share-dialog__heading {
16645
+ margin: 0;
16646
+ color: var(--color-text-secondary);
16647
+ font-size: var(--font-size-sm);
16648
+ font-weight: var(--font-weight-semibold);
16649
+ }
16650
+
16651
+ .crewlet-share-dialog__audience {
16652
+ display: flex;
16653
+ flex-direction: column;
16654
+ gap: var(--spacing-1);
16655
+ margin: 0;
16656
+ padding: 0;
16657
+ list-style: none;
16658
+ }
16659
+
16660
+ .crewlet-share-dialog__row {
16661
+ display: grid;
16662
+ grid-template-columns: auto minmax(0, 1fr) auto;
16663
+ align-items: center;
16664
+ column-gap: var(--spacing-3);
16665
+ padding: var(--spacing-2) 0;
16666
+ }
16667
+
16668
+ .crewlet-share-dialog__who {
16669
+ display: flex;
16670
+ flex-direction: column;
16671
+ min-width: 0;
16672
+ }
16673
+
16674
+ .crewlet-share-dialog__name {
16675
+ overflow: hidden;
16676
+ color: var(--color-text-primary);
16677
+ font-weight: var(--font-weight-medium);
16678
+ text-overflow: ellipsis;
16679
+ white-space: nowrap;
16680
+ }
16681
+
16682
+ .crewlet-share-dialog__you,
16683
+ .crewlet-share-dialog__detail {
16684
+ color: var(--color-text-tertiary);
16685
+ font-weight: var(--font-weight-regular);
16686
+ }
16687
+
16688
+ .crewlet-share-dialog__detail {
16689
+ overflow: hidden;
16690
+ font-size: var(--font-size-xs);
16691
+ text-overflow: ellipsis;
16692
+ white-space: nowrap;
16693
+ }
16694
+
16695
+ .crewlet-share-dialog__controls {
16696
+ display: flex;
16697
+ align-items: center;
16698
+ justify-content: flex-end;
16699
+ gap: var(--spacing-1);
16700
+ }
16701
+
16702
+ .crewlet-share-dialog__role,
16703
+ .crewlet-share-dialog__saving {
16704
+ color: var(--color-text-secondary);
16705
+ font-size: var(--font-size-sm);
16706
+ }
16707
+
16708
+ .crewlet-share-dialog__saving {
16709
+ color: var(--color-text-tertiary);
16710
+ }
16711
+
16712
+ .crewlet-share-dialog__note,
16713
+ .crewlet-share-dialog__refusal {
16714
+ grid-column: 2 / -1;
16715
+ font-size: var(--font-size-xs);
16716
+ }
16717
+
16718
+ .crewlet-share-dialog__note {
16719
+ color: var(--color-text-tertiary);
16720
+ }
16721
+
16722
+ .crewlet-share-dialog__refusal {
16723
+ color: var(--color-feedback-danger-ink);
16724
+ }
16725
+
16726
+ .crewlet-share-dialog__refusal:empty {
16727
+ display: none;
16728
+ }
16729
+
16730
+ .crewlet-share-dialog__company {
16731
+ display: flex;
16732
+ align-items: center;
16733
+ gap: var(--spacing-2);
16734
+ }
16735
+
16736
+ .crewlet-share-dialog__company-text {
16737
+ margin: 0;
16738
+ color: var(--color-text-primary);
16739
+ }
16740
+
16741
+ .crewlet-share-dialog__link {
16742
+ display: flex;
16743
+ flex-wrap: wrap;
16744
+ align-items: center;
16745
+ gap: var(--spacing-2);
16746
+ }
16747
+
16748
+ .crewlet-share-dialog__link-note {
16749
+ color: var(--color-text-tertiary);
16750
+ font-size: var(--font-size-xs);
16751
+ }
16752
+
16753
+ /* Under the phone breakpoint the row's controls go under the name, so a
16754
+ role select and a remove control never squeeze the name to an ellipsis. */
16755
+ @media (width < 640px) {
16756
+ .crewlet-share-dialog__row {
16757
+ grid-template-columns: auto minmax(0, 1fr);
16758
+ }
16759
+
16760
+ .crewlet-share-dialog__controls {
16761
+ grid-column: 2 / -1;
16762
+ justify-content: flex-start;
16763
+ }
16764
+
16765
+ .crewlet-share-dialog__add {
16766
+ flex-direction: column;
16767
+ align-items: stretch;
16768
+ }
16769
+ }
16770
+
16771
+
16772
+ /* SheetGrid-4HOXDVIB.css */
16773
+ /*
16774
+ * The editable sheet (SheetGrid.tsx) and its cells (cells.tsx).
16775
+ *
16776
+ * ONE EDGE PER CELL. Each cell draws its trailing and bottom hairline only, so
16777
+ * two neighbours never draw two lines between them, and every mark laid over a
16778
+ * cell (the active cell's ring, a collaborator's ring, a selection) is inset
16779
+ * inside that edge rather than doubling it.
16780
+ *
16781
+ * The rows are positioned in a body as tall as every row together, and only
16782
+ * the rows in view are in the document. Every row is a grid on the one column
16783
+ * template the component writes, so a cell is exactly as wide as its header.
16784
+ */
16785
+
16786
+ .crewlet-sheet-grid {
16787
+ --crewlet-sheet-row-height: var(--size-sheet-row);
16788
+ position: relative;
16789
+ display: flex;
16790
+ flex-direction: column;
16791
+ min-width: 0;
16792
+ min-height: 0;
16793
+ color: var(--color-text-primary);
16794
+ font-family: var(--font-family-sans);
16795
+ font-size: var(--font-size-sm);
16796
+ }
16797
+
16798
+ /* Measured by the component: the resolved row height at the current density. */
16799
+ .crewlet-sheet-grid__probe {
16800
+ position: absolute;
16801
+ width: 0;
16802
+ height: var(--size-sheet-row);
16803
+ visibility: hidden;
16804
+ pointer-events: none;
16805
+ }
16806
+
16807
+ .crewlet-sheet-grid__scroller {
16808
+ position: relative;
16809
+ flex: 1 1 auto;
16810
+ min-height: 0;
16811
+ max-width: 100%;
16812
+ overflow: auto;
16813
+ border: 1px solid var(--color-border-default);
16814
+ border-radius: var(--radius-md);
16815
+ background: var(--color-surface-background);
16816
+ }
16817
+
16818
+ .crewlet-sheet-grid__grid {
16819
+ position: relative;
16820
+ min-width: 100%;
16821
+ }
16822
+
16823
+ .crewlet-sheet-grid__row {
16824
+ display: grid;
16825
+ grid-template-columns: var(--crewlet-sheet-columns);
16826
+ height: var(--crewlet-sheet-row-height);
16827
+ }
16828
+
16829
+ .crewlet-sheet-grid__head {
16830
+ position: sticky;
16831
+ top: 0;
16832
+ z-index: var(--z-index-sticky);
16833
+ }
16834
+
16835
+ .crewlet-sheet-grid__body {
16836
+ position: relative;
16837
+ }
16838
+
16839
+ .crewlet-sheet-grid__body > .crewlet-sheet-grid__row {
16840
+ position: absolute;
16841
+ right: 0;
16842
+ left: 0;
16843
+ }
16844
+
16845
+ .crewlet-sheet-grid__corner,
16846
+ .crewlet-sheet-grid__header,
16847
+ .crewlet-sheet-grid__rownum,
16848
+ .crewlet-sheet-grid__cell {
16849
+ position: relative;
16850
+ display: flex;
16851
+ align-items: center;
16852
+ box-sizing: border-box;
16853
+ min-width: 0;
16854
+ border-right: 1px solid var(--color-border-default);
16855
+ border-bottom: 1px solid var(--color-border-default);
16856
+ background: var(--color-surface-background);
16857
+ }
16858
+
16859
+ .crewlet-sheet-grid__corner,
16860
+ .crewlet-sheet-grid__header {
16861
+ background: var(--color-surface-subtle);
16862
+ color: var(--color-text-secondary);
16863
+ font-size: var(--font-size-xs);
16864
+ font-weight: var(--font-weight-semibold);
16865
+ }
16866
+
16867
+ .crewlet-sheet-grid__corner,
16868
+ .crewlet-sheet-grid__rownum {
16869
+ position: sticky;
16870
+ inset-inline-start: 0;
16871
+ z-index: var(--z-index-raised);
16872
+ justify-content: center;
16873
+ }
16874
+
16875
+ .crewlet-sheet-grid__corner {
16876
+ z-index: var(--z-index-sticky);
16877
+ }
16878
+
16879
+ .crewlet-sheet-grid__header {
16880
+ gap: var(--spacing-1);
16881
+ padding: 0 var(--spacing-2);
16882
+ cursor: default;
16883
+ user-select: none;
16884
+ }
16885
+
16886
+ .crewlet-sheet-grid__header-label {
16887
+ overflow: hidden;
16888
+ text-overflow: ellipsis;
16889
+ white-space: nowrap;
16890
+ }
16891
+
16892
+ .crewlet-sheet-grid__sort {
16893
+ display: inline-flex;
16894
+ flex: none;
16895
+ color: var(--color-text-tertiary);
16896
+ }
16897
+
16898
+ .crewlet-sheet-grid__header-presence {
16899
+ display: inline-flex;
16900
+ flex: none;
16901
+ gap: var(--spacing-1);
16902
+ margin-inline-start: auto;
16903
+ }
16904
+
16905
+ .crewlet-sheet-grid .crewlet-sheet-grid__header-badge {
16906
+ box-shadow: 0 0 0 2px var(--crewlet-presence-hue);
16907
+ }
16908
+
16909
+ .crewlet-sheet-grid__rownum {
16910
+ color: var(--color-text-tertiary);
16911
+ font-size: var(--font-size-xs);
16912
+ font-variant-numeric: tabular-nums;
16913
+ }
16914
+
16915
+ /* The bar at a row's leading edge while somebody has it selected. */
16916
+ .crewlet-sheet-grid__rownum--present::before {
16917
+ position: absolute;
16918
+ top: 0;
16919
+ bottom: 0;
16920
+ inset-inline-start: 0;
16921
+ width: 3px;
16922
+ background: var(--crewlet-presence-hue);
16923
+ content: '';
16924
+ }
16925
+
16926
+ .crewlet-sheet-grid__cell {
16927
+ padding: 0 var(--spacing-2);
16928
+ outline: none;
16929
+ }
16930
+
16931
+ .crewlet-sheet-grid__cell--frozen,
16932
+ .crewlet-sheet-grid__header.crewlet-sheet-grid__cell--frozen {
16933
+ position: sticky;
16934
+ z-index: var(--z-index-raised);
16935
+ }
16936
+
16937
+ .crewlet-sheet-grid__header.crewlet-sheet-grid__cell--frozen {
16938
+ z-index: var(--z-index-sticky);
16939
+ }
16940
+
16941
+ .crewlet-sheet-grid__cell--number,
16942
+ .crewlet-sheet-grid__cell--rating {
16943
+ justify-content: flex-end;
16944
+ }
16945
+
16946
+ .crewlet-sheet-grid__cell--checkbox {
16947
+ justify-content: center;
16948
+ }
16949
+
16950
+ .crewlet-sheet-grid__cell--selected {
16951
+ background: var(--color-brand-accent-soft);
16952
+ }
16953
+
16954
+ .crewlet-sheet-grid__cell:focus-visible,
16955
+ .crewlet-sheet-grid__header:focus-visible {
16956
+ outline: 2px solid var(--color-focus);
16957
+ /* Inside a box that scrolls, an outset ring is clipped by the scroller and
16958
+ painted over by the next row. */
16959
+ outline-offset: var(--size-focus-ring-inset-offset);
16960
+ }
16961
+
16962
+ .crewlet-sheet-grid__cell--editing {
16963
+ z-index: var(--z-index-presence);
16964
+ overflow: visible;
16965
+ }
16966
+
16967
+ .crewlet-sheet-grid__value {
16968
+ display: flex;
16969
+ align-items: center;
16970
+ min-width: 0;
16971
+ max-width: 100%;
16972
+ overflow: hidden;
16973
+ }
16974
+
16975
+ .crewlet-sheet-grid__cell--editing > .crewlet-sheet-grid__value {
16976
+ visibility: hidden;
16977
+ }
16978
+
16979
+ /* PENDING (D23): the reader's value, drawn at once, underlined dashed until
16980
+ the engine confirms it. The word is in the cell's description and the strip. */
16981
+ .crewlet-sheet-grid__cell--pending > .crewlet-sheet-grid__value {
16982
+ text-decoration: underline dashed var(--color-text-tertiary);
16983
+ text-underline-offset: 3px;
16984
+ }
16985
+
16986
+ .crewlet-sheet-grid__cell--pending > .crewlet-sheet-grid__value::after {
16987
+ position: absolute;
16988
+ right: var(--spacing-1);
16989
+ bottom: 2px;
16990
+ left: var(--spacing-1);
16991
+ border-bottom: 1px dashed var(--color-text-tertiary);
16992
+ content: '';
16993
+ }
16994
+
16995
+ .crewlet-sheet-grid__refused {
16996
+ display: inline-flex;
16997
+ flex: none;
16998
+ margin-inline-start: auto;
16999
+ padding-inline-start: var(--spacing-1);
17000
+ color: var(--color-feedback-danger-ink);
17001
+ }
17002
+
17003
+ .crewlet-sheet-grid__message {
17004
+ position: absolute;
17005
+ top: 100%;
17006
+ inset-inline-start: 0;
17007
+ z-index: var(--z-index-presence);
17008
+ box-sizing: border-box;
17009
+ width: max-content;
17010
+ max-width: 20rem;
17011
+ padding: var(--spacing-1) var(--spacing-2);
17012
+ border: 1px solid var(--color-feedback-danger-line);
17013
+ border-radius: var(--radius-sm);
17014
+ background: var(--color-surface-elevated);
17015
+ box-shadow: var(--shadow-md);
17016
+ color: var(--color-feedback-danger-ink);
17017
+ font-size: var(--font-size-xs);
17018
+ white-space: normal;
17019
+ }
17020
+
17021
+ .crewlet-sheet-grid__history {
17022
+ position: absolute;
17023
+ top: 50%;
17024
+ inset-inline-end: var(--spacing-1);
17025
+ display: inline-flex;
17026
+ align-items: center;
17027
+ justify-content: center;
17028
+ padding: var(--spacing-1);
17029
+ border: 0;
17030
+ border-radius: var(--radius-sm);
17031
+ background: var(--color-surface-elevated);
17032
+ color: var(--color-text-secondary);
17033
+ transform: translateY(-50%);
17034
+ cursor: pointer;
17035
+ }
17036
+
17037
+ .crewlet-sheet-grid__history:hover {
17038
+ color: var(--color-text-primary);
17039
+ }
17040
+
17041
+ .crewlet-sheet-grid__foot {
17042
+ display: flex;
17043
+ flex-wrap: wrap;
17044
+ align-items: center;
17045
+ justify-content: space-between;
17046
+ gap: var(--spacing-2);
17047
+ padding: var(--spacing-2) 0;
17048
+ color: var(--color-text-tertiary);
17049
+ font-size: var(--font-size-xs);
17050
+ }
17051
+
17052
+ .crewlet-sheet-grid__sync {
17053
+ display: inline-flex;
17054
+ align-items: center;
17055
+ gap: var(--spacing-2);
17056
+ margin-inline-start: auto;
17057
+ }
17058
+
17059
+ .crewlet-sheet-grid__sync--failed {
17060
+ color: var(--color-feedback-danger-ink);
17061
+ }
17062
+
17063
+ /* ── the cells, alone or in the grid ─────────────────────────────────────── */
17064
+
17065
+ .crewlet-sheet-cell__text {
17066
+ overflow: hidden;
17067
+ text-overflow: ellipsis;
17068
+ white-space: nowrap;
17069
+ }
17070
+
17071
+ .crewlet-sheet-cell__number {
17072
+ font-variant-numeric: tabular-nums;
17073
+ }
17074
+
17075
+ .crewlet-sheet-cell__muted {
17076
+ color: var(--color-text-tertiary);
17077
+ }
17078
+
17079
+ .crewlet-sheet-cell__chips {
17080
+ display: inline-flex;
17081
+ gap: var(--spacing-1);
17082
+ min-width: 0;
17083
+ overflow: hidden;
17084
+ }
17085
+
17086
+ .crewlet-sheet-cell__person {
17087
+ display: inline-flex;
17088
+ align-items: center;
17089
+ gap: var(--spacing-1);
17090
+ min-width: 0;
17091
+ }
17092
+
17093
+ .crewlet-sheet-cell__link {
17094
+ overflow: hidden;
17095
+ color: var(--color-text-link-quiet);
17096
+ text-overflow: ellipsis;
17097
+ white-space: nowrap;
17098
+ }
17099
+
17100
+ .crewlet-sheet-cell__link:hover {
17101
+ color: var(--color-brand-accent-ink);
17102
+ }
17103
+
17104
+ .crewlet-sheet-cell__checkbox {
17105
+ display: inline-flex;
17106
+ align-items: center;
17107
+ }
17108
+
17109
+ .crewlet-sheet-cell__check {
17110
+ display: inline-flex;
17111
+ align-items: center;
17112
+ justify-content: center;
17113
+ box-sizing: border-box;
17114
+ width: var(--spacing-4);
17115
+ height: var(--spacing-4);
17116
+ border: 1px solid var(--color-border-control);
17117
+ border-radius: var(--radius-xs);
17118
+ background: var(--color-surface-background);
17119
+ color: var(--color-text-on-accent);
17120
+ }
17121
+
17122
+ .crewlet-sheet-cell__check--on {
17123
+ border-color: var(--color-brand-accent);
17124
+ background: var(--color-brand-accent);
17125
+ }
17126
+
17127
+ .crewlet-sheet-cell__rating,
17128
+ .crewlet-sheet-cell__stars {
17129
+ display: inline-flex;
17130
+ align-items: center;
17131
+ }
17132
+
17133
+ .crewlet-sheet-cell__star {
17134
+ color: var(--color-text-tertiary);
17135
+ }
17136
+
17137
+ .crewlet-sheet-cell__star--on {
17138
+ color: var(--color-feedback-warning);
17139
+ }
17140
+
17141
+ .crewlet-sheet-cell {
17142
+ position: relative;
17143
+ display: inline-flex;
17144
+ flex-direction: column;
17145
+ gap: var(--spacing-1);
17146
+ min-width: 0;
17147
+ }
17148
+
17149
+ .crewlet-sheet-cell__face {
17150
+ display: inline-flex;
17151
+ align-items: center;
17152
+ box-sizing: border-box;
17153
+ min-height: var(--size-control-md);
17154
+ padding: 0 var(--spacing-2);
17155
+ border: 1px solid var(--color-border-control);
17156
+ border-radius: var(--radius-md);
17157
+ background: var(--color-surface-background);
17158
+ color: inherit;
17159
+ font: inherit;
17160
+ text-align: start;
17161
+ cursor: pointer;
17162
+ }
17163
+
17164
+ .crewlet-sheet-cell__face[aria-disabled='true'] {
17165
+ cursor: default;
17166
+ }
17167
+
17168
+ .crewlet-sheet-cell__face:focus-visible {
17169
+ outline: 2px solid var(--color-focus);
17170
+ outline-offset: var(--size-focus-ring-inset-offset);
17171
+ }
17172
+
17173
+ .crewlet-sheet-cell--pending .crewlet-sheet-cell__face {
17174
+ border-style: dashed;
17175
+ }
17176
+
17177
+ .crewlet-sheet-cell__refusal {
17178
+ display: inline-flex;
17179
+ align-items: center;
17180
+ gap: var(--spacing-1);
17181
+ color: var(--color-feedback-danger-ink);
17182
+ font-size: var(--font-size-xs);
17183
+ }
17184
+
17185
+ /* ── the editors ─────────────────────────────────────────────────────────── */
17186
+
17187
+ .crewlet-sheet-editor {
17188
+ position: absolute;
17189
+ inset: 0;
17190
+ z-index: var(--z-index-presence);
17191
+ }
17192
+
17193
+ .crewlet-sheet-cell .crewlet-sheet-editor {
17194
+ position: relative;
17195
+ inset: auto;
17196
+ }
17197
+
17198
+ .crewlet-sheet-editor__input {
17199
+ box-sizing: border-box;
17200
+ width: 100%;
17201
+ height: 100%;
17202
+ min-height: var(--size-control-md);
17203
+ padding: 0 var(--spacing-2);
17204
+ border: 0;
17205
+ border-radius: 0;
17206
+ background: var(--color-surface-elevated);
17207
+ box-shadow: inset 0 0 0 2px var(--color-focus);
17208
+ color: var(--color-text-primary);
17209
+ font: inherit;
17210
+ }
17211
+
17212
+ .crewlet-sheet-editor__input:focus-visible,
17213
+ .crewlet-sheet-editor__filter:focus-visible,
17214
+ .crewlet-sheet-editor__textarea:focus-visible {
17215
+ outline: 2px solid var(--color-focus);
17216
+ outline-offset: var(--size-focus-ring-inset-offset);
17217
+ }
17218
+
17219
+ .crewlet-sheet-editor__panel {
17220
+ position: absolute;
17221
+ top: 100%;
17222
+ inset-inline-start: 0;
17223
+ z-index: var(--z-index-presence);
17224
+ display: flex;
17225
+ flex-direction: column;
17226
+ gap: var(--spacing-2);
17227
+ box-sizing: border-box;
17228
+ min-width: 100%;
17229
+ width: max-content;
17230
+ max-width: min(24rem, 90vw);
17231
+ padding: var(--spacing-2);
17232
+ border: 1px solid var(--color-border-default);
17233
+ border-radius: var(--radius-md);
17234
+ background: var(--color-surface-elevated);
17235
+ box-shadow: var(--shadow-lg);
17236
+ }
17237
+
17238
+ .crewlet-sheet-editor--above .crewlet-sheet-editor__panel {
17239
+ top: auto;
17240
+ bottom: 100%;
17241
+ }
17242
+
17243
+ .crewlet-sheet-editor--list .crewlet-sheet-editor__panel,
17244
+ .crewlet-sheet-editor--long .crewlet-sheet-editor__panel {
17245
+ top: 0;
17246
+ min-width: max(100%, 14rem);
17247
+ }
17248
+
17249
+ .crewlet-sheet-editor--list.crewlet-sheet-editor--above .crewlet-sheet-editor__panel,
17250
+ .crewlet-sheet-editor--long.crewlet-sheet-editor--above .crewlet-sheet-editor__panel {
17251
+ top: auto;
17252
+ bottom: 0;
17253
+ }
17254
+
17255
+ .crewlet-sheet-editor__filter,
17256
+ .crewlet-sheet-editor__textarea {
17257
+ box-sizing: border-box;
17258
+ width: 100%;
17259
+ padding: var(--spacing-1) var(--spacing-2);
17260
+ border: 1px solid var(--color-border-control);
17261
+ border-radius: var(--radius-sm);
17262
+ background: var(--color-surface-background);
17263
+ color: var(--color-text-primary);
17264
+ font: inherit;
15965
17265
  }
15966
17266
 
15967
- /*
15968
- * AT THE ROW'S END in a list whose rows lead with a mark (see `tickAtEnd`),
15969
- * so the mark starts at the panel's edge. After a hint it follows the hint,
15970
- * which already takes the free space; without one it takes it itself.
15971
- */
15972
- .crewlet-select__option-body + .crewlet-select__option-tick--end {
15973
- margin-left: auto;
17267
+ .crewlet-sheet-editor__textarea {
17268
+ min-width: 20rem;
17269
+ max-width: 100%;
17270
+ resize: vertical;
15974
17271
  }
15975
17272
 
15976
- .crewlet-select__option-body {
17273
+ .crewlet-sheet-editor__list {
15977
17274
  display: flex;
15978
17275
  flex-direction: column;
15979
- gap: 1px;
15980
- min-width: 0;
17276
+ max-height: 16rem;
17277
+ margin: 0;
17278
+ padding: 0;
17279
+ overflow-y: auto;
17280
+ list-style: none;
15981
17281
  }
15982
17282
 
15983
- /*
15984
- * WHAT AN OPTION DRAWS BEFORE ITS LABEL (a swatch, an avatar, a glyph),
15985
- * centred on the label's first line rather than on the row, so a row with a
15986
- * second line keeps its mark beside the words it belongs to. The same slot on
15987
- * the trigger, while that option is the one chosen, sits on the value's line.
15988
- */
15989
- .crewlet-select__option-leading,
15990
- .crewlet-select__leading {
15991
- display: inline-flex;
17283
+ .crewlet-sheet-editor__option {
17284
+ display: flex;
15992
17285
  align-items: center;
15993
- flex: none;
15994
- }
15995
-
15996
- .crewlet-select__option-leading {
15997
- min-height: calc(var(--font-line-height-normal) * 1em);
17286
+ gap: var(--spacing-2);
17287
+ min-height: var(--size-row-sm);
17288
+ padding: 0 var(--spacing-2);
17289
+ border-radius: var(--radius-sm);
17290
+ cursor: pointer;
15998
17291
  }
15999
17292
 
16000
- /* A hint ends the row's FIRST line, on the label's baseline, rather than
16001
- sitting on the row's top edge at its own smaller size. */
16002
- .crewlet-select__option:has(> .crewlet-listbox__hint) .crewlet-select__option-body,
16003
- .crewlet-select__option > .crewlet-listbox__hint {
16004
- align-self: baseline;
17293
+ .crewlet-sheet-editor__option--highlight {
17294
+ background: var(--color-surface-hover);
16005
17295
  }
16006
17296
 
16007
- /*
16008
- * ONE LINE, WHICH IS WHAT THE ELLIPSIS BELOW WAS ALWAYS FOR. `overflow:
16009
- * hidden` clips what leaves the box and `text-overflow` replaces what a LINE
16010
- * cannot hold — and neither does anything to text that is simply allowed to
16011
- * wrap, which is what this rule did without `white-space`. A long option
16012
- * silently grew a second line instead of ellipsing, and with the row's own
16013
- * flex minimum gone (see Listbox.css) that second line was drawn over the
16014
- * option underneath.
16015
- *
16016
- * The trigger's `.crewlet-select__label` a hundred lines above has carried all
16017
- * three since it was written; this is the same register on the same text, and
16018
- * `.crewlet-listbox__hint` states the rule outright — "never wrapped: a hint
16019
- * that broke across two lines turned every row in the list a different
16020
- * height".
16021
- */
16022
- .crewlet-select__option-label {
16023
- overflow: hidden;
16024
- text-overflow: ellipsis;
16025
- white-space: nowrap;
17297
+ .crewlet-sheet-editor__mark {
17298
+ display: inline-flex;
17299
+ flex: none;
17300
+ width: var(--spacing-3);
17301
+ color: var(--color-brand-accent-ink);
16026
17302
  }
16027
17303
 
16028
- .crewlet-select__option-desc {
16029
- font-size: var(--font-size-2xs);
16030
- line-height: var(--font-line-height-normal);
17304
+ .crewlet-sheet-editor__empty {
17305
+ padding: var(--spacing-2);
16031
17306
  color: var(--color-text-tertiary);
16032
17307
  }
16033
17308
 
16034
- /* The second line stays the second line on the row the reader is on: it is
16035
- the same fact, and a description that changes colour with the highlight
16036
- reads as a different kind of thing under the pointer. */
16037
- .crewlet-select__menu .crewlet-listbox__option.is-highlight .crewlet-select__option-desc {
16038
- color: var(--color-text-tertiary);
17309
+ .crewlet-sheet-editor__error {
17310
+ display: flex;
17311
+ align-items: center;
17312
+ gap: var(--spacing-1);
17313
+ margin: 0;
17314
+ color: var(--color-feedback-danger-ink);
17315
+ font-size: var(--font-size-xs);
16039
17316
  }
16040
17317
 
16041
- /* ── The search box ──────────────────────────────────────────────────── */
17318
+ .crewlet-sheet-editor__conflict {
17319
+ display: flex;
17320
+ flex-direction: column;
17321
+ gap: var(--spacing-2);
17322
+ padding-top: var(--spacing-2);
17323
+ border-top: 1px solid var(--color-border-default);
17324
+ }
16042
17325
 
16043
- /*
16044
- * THE RING IS DRAWN WHERE THE ELEMENT IS. The input below clears the user
16045
- * agent's outline, and the frame's `:focus-within` rule is the package's one
16046
- * replacement for it — but that rule's own premise is that everything
16047
- * focusable sits INSIDE `.crewlet-select`, and this box does not: the panel is
16048
- * portalled into the layer host, outside that subtree, so `:focus-within`
16049
- * could never match while focus was in the search field. And focus is moved
16050
- * here on every open, so the one control a searchable Select puts a reader in
16051
- * was the one with no focus indicator at all.
16052
- *
16053
- * On the band rather than the input, and INSET, because the panel clips: an
16054
- * outset ring on the input would be cut by the menu's own `overflow: hidden`.
16055
- */
16056
- .crewlet-select__search:focus-within {
16057
- outline: 1px solid var(--color-focus);
16058
- outline-offset: -1px;
17326
+ .crewlet-sheet-editor__conflict-text {
17327
+ margin: 0;
17328
+ color: var(--color-text-secondary);
17329
+ font-size: var(--font-size-xs);
16059
17330
  }
16060
17331
 
16061
- .crewlet-select__search {
17332
+ .crewlet-sheet-editor__conflict-actions {
16062
17333
  display: flex;
16063
- align-items: center;
17334
+ flex-wrap: wrap;
16064
17335
  gap: var(--spacing-2);
16065
- padding: var(--spacing-2) var(--spacing-3);
16066
- border-bottom: 1px solid var(--color-border-default);
16067
- color: var(--color-text-tertiary);
16068
- flex: none;
16069
17336
  }
16070
17337
 
16071
- .crewlet-select__search-input {
16072
- flex: 1;
16073
- min-width: 0;
16074
- background: transparent;
16075
- border: none;
16076
- outline: none;
16077
- font: inherit;
16078
- font-size: var(--font-size-compact);
16079
- color: var(--color-text-primary);
16080
- }
17338
+ /* A PHONE: the list and long text editors open as a sheet from the bottom of
17339
+ the screen rather than from a cell a thumb has to keep in view. */
17340
+ @media (width < 640px) {
17341
+ .crewlet-sheet-grid .crewlet-sheet-editor--list .crewlet-sheet-editor__panel,
17342
+ .crewlet-sheet-grid .crewlet-sheet-editor--long .crewlet-sheet-editor__panel {
17343
+ position: fixed;
17344
+ top: auto;
17345
+ right: 0;
17346
+ bottom: 0;
17347
+ left: 0;
17348
+ width: auto;
17349
+ max-width: none;
17350
+ border-radius: var(--radius-lg) var(--radius-lg) 0 0;
17351
+ }
16081
17352
 
16082
- .crewlet-select__search-input::placeholder {
16083
- color: var(--color-text-tertiary);
16084
- opacity: 1;
17353
+ .crewlet-sheet-editor__textarea {
17354
+ min-width: 0;
17355
+ }
16085
17356
  }
16086
17357
 
16087
- @media (prefers-reduced-motion: reduce) {
16088
- .crewlet-select {
16089
- transition: none;
17358
+ @media (forced-colors: active) {
17359
+ .crewlet-sheet-grid__cell--selected {
17360
+ background: Highlight;
17361
+ color: HighlightText;
17362
+ }
17363
+
17364
+ .crewlet-sheet-grid__rownum--present::before {
17365
+ background: Highlight;
16090
17366
  }
16091
17367
  }
16092
17368
 
@@ -18704,7 +19980,7 @@ b.crewlet-switcher__match {
18704
19980
  }
18705
19981
 
18706
19982
 
18707
- /* Tag-4BRQS6GN.css */
19983
+ /* Tag-SRGTK5KI.css */
18708
19984
  /*
18709
19985
  * The tag: a small pill naming a state, a category or a value.
18710
19986
  *
@@ -18906,6 +20182,48 @@ b.crewlet-switcher__match {
18906
20182
  --crewlet-tag-line: var(--color-brand-accent-soft-strong);
18907
20183
  }
18908
20184
 
20185
+ /*
20186
+ * A HUE AN AUTHOR CHOSE for a value (a select option's colour), drawn in the
20187
+ * node steps: the hue's fill under its ink, the line as the outline. Like a
20188
+ * tinted tone, the pill needs no edge of its own at rest: the hue separates
20189
+ * it from any neutral ground.
20190
+ */
20191
+ .crewlet-tag--hue-purple {
20192
+ --crewlet-tag-fill: var(--color-node-purple-fill);
20193
+ --crewlet-tag-ink: var(--color-node-purple-ink);
20194
+ --crewlet-tag-line: var(--color-node-purple-line);
20195
+ }
20196
+
20197
+ .crewlet-tag--hue-cyan {
20198
+ --crewlet-tag-fill: var(--color-node-cyan-fill);
20199
+ --crewlet-tag-ink: var(--color-node-cyan-ink);
20200
+ --crewlet-tag-line: var(--color-node-cyan-line);
20201
+ }
20202
+
20203
+ .crewlet-tag--hue-green {
20204
+ --crewlet-tag-fill: var(--color-node-green-fill);
20205
+ --crewlet-tag-ink: var(--color-node-green-ink);
20206
+ --crewlet-tag-line: var(--color-node-green-line);
20207
+ }
20208
+
20209
+ .crewlet-tag--hue-amber {
20210
+ --crewlet-tag-fill: var(--color-node-amber-fill);
20211
+ --crewlet-tag-ink: var(--color-node-amber-ink);
20212
+ --crewlet-tag-line: var(--color-node-amber-line);
20213
+ }
20214
+
20215
+ .crewlet-tag--hue-rose {
20216
+ --crewlet-tag-fill: var(--color-node-rose-fill);
20217
+ --crewlet-tag-ink: var(--color-node-rose-ink);
20218
+ --crewlet-tag-line: var(--color-node-rose-line);
20219
+ }
20220
+
20221
+ .crewlet-tag--hue-blue {
20222
+ --crewlet-tag-fill: var(--color-node-blue-fill);
20223
+ --crewlet-tag-ink: var(--color-node-blue-ink);
20224
+ --crewlet-tag-line: var(--color-node-blue-line);
20225
+ }
20226
+
18909
20227
  /* ── appearance ────────────────────────────────────────────────────────── */
18910
20228
 
18911
20229
  /*
@@ -22297,6 +23615,117 @@ svg.crewlet-time-window__tick {
22297
23615
  }
22298
23616
 
22299
23617
 
23618
+ /* VersionTimeline-EBJ6MIPJ.css */
23619
+ /*
23620
+ * A version list beside the version on show. The row's main line is the
23621
+ * button that shows it; the controls sit under the facts, so a reader scanning
23622
+ * the list reads numbers and names rather than a column of buttons.
23623
+ */
23624
+
23625
+ .crewlet-version-timeline {
23626
+ display: flex;
23627
+ flex-direction: column;
23628
+ gap: var(--spacing-2);
23629
+ min-width: 0;
23630
+ }
23631
+
23632
+ .crewlet-version-timeline__select {
23633
+ display: flex;
23634
+ flex-direction: column;
23635
+ align-items: flex-start;
23636
+ gap: var(--spacing-1);
23637
+ width: 100%;
23638
+ margin: 0;
23639
+ padding: var(--spacing-1) var(--spacing-2);
23640
+ border: 0;
23641
+ border-radius: var(--radius-sm);
23642
+ background: transparent;
23643
+ color: var(--color-text-primary);
23644
+ font: inherit;
23645
+ text-align: start;
23646
+ cursor: pointer;
23647
+ }
23648
+
23649
+ .crewlet-version-timeline__select:hover {
23650
+ background: var(--color-surface-hover);
23651
+ }
23652
+
23653
+ /* The version on show. The accent means "where the reader is", which is
23654
+ exactly what this row is. */
23655
+ .crewlet-version-timeline__select[aria-current='true'] {
23656
+ background: var(--color-brand-accent-soft);
23657
+ box-shadow: inset 2px 0 0 var(--color-brand-accent);
23658
+ }
23659
+
23660
+ .crewlet-version-timeline__head {
23661
+ display: flex;
23662
+ flex-wrap: wrap;
23663
+ align-items: baseline;
23664
+ gap: var(--spacing-2);
23665
+ }
23666
+
23667
+ .crewlet-version-timeline__number {
23668
+ font-weight: var(--font-weight-semibold);
23669
+ font-variant-numeric: tabular-nums;
23670
+ }
23671
+
23672
+ .crewlet-version-timeline__latest,
23673
+ .crewlet-version-timeline__label {
23674
+ padding: 0 var(--spacing-1);
23675
+ border-radius: var(--radius-xs);
23676
+ font-size: var(--font-size-xs);
23677
+ }
23678
+
23679
+ .crewlet-version-timeline__latest {
23680
+ background: var(--color-surface-inset);
23681
+ color: var(--color-text-secondary);
23682
+ }
23683
+
23684
+ .crewlet-version-timeline__label {
23685
+ border: 1px solid var(--color-border-default);
23686
+ color: var(--color-text-primary);
23687
+ }
23688
+
23689
+ .crewlet-version-timeline__summary {
23690
+ color: var(--color-text-secondary);
23691
+ overflow-wrap: anywhere;
23692
+ }
23693
+
23694
+ .crewlet-version-timeline__meta,
23695
+ .crewlet-version-timeline__source {
23696
+ display: flex;
23697
+ flex-wrap: wrap;
23698
+ align-items: center;
23699
+ gap: var(--spacing-1);
23700
+ padding-inline: var(--spacing-2);
23701
+ color: var(--color-text-tertiary);
23702
+ font-size: var(--font-size-xs);
23703
+ }
23704
+
23705
+ .crewlet-version-timeline__actions {
23706
+ display: flex;
23707
+ flex-wrap: wrap;
23708
+ gap: var(--spacing-1);
23709
+ padding-inline: var(--spacing-1);
23710
+ }
23711
+
23712
+ /* The version compared against carries the same edge in the strong neutral:
23713
+ it is the other side of the comparison, not where the reader is, so it does
23714
+ not take the accent. */
23715
+ .is-compared > .crewlet-timeline__body > .crewlet-version-timeline__select {
23716
+ box-shadow: inset 2px 0 0 var(--color-border-strong);
23717
+ }
23718
+
23719
+ .crewlet-version-timeline__gap {
23720
+ margin: 0;
23721
+ padding: var(--spacing-2) var(--spacing-3);
23722
+ border: 1px dashed var(--color-border-default);
23723
+ border-radius: var(--radius-md);
23724
+ color: var(--color-text-tertiary);
23725
+ font-size: var(--font-size-xs);
23726
+ }
23727
+
23728
+
22300
23729
  /* VisuallyHidden-L552H7OA.css */
22301
23730
  /*
22302
23731
  * Hidden from the eye, read by everything else.