@crisp-ui-kit/crisp 0.57.2 → 0.57.4

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 (200) hide show
  1. package/dist/assigneepicker.css +13 -0
  2. package/dist/assigneepicker.d.ts +7 -0
  3. package/dist/assigneepicker.layered.css +15 -0
  4. package/dist/button.css +3 -0
  5. package/dist/button.d.ts +2 -2
  6. package/dist/button.layered.css +3 -0
  7. package/dist/chip.css +1 -1
  8. package/dist/chip.layered.css +1 -1
  9. package/dist/cjs/components/breadcrumb/breadcrumb.js +1 -1
  10. package/dist/cjs/components/button/button.recipe.js +33 -0
  11. package/dist/cjs/components/chip/chip.recipe.js +3 -1
  12. package/dist/cjs/components/datatable/datatable.js +6 -3
  13. package/dist/cjs/components/datatable/datatable.recipe.js +45 -6
  14. package/dist/cjs/components/datepickerfield/datepickerfield.js +2 -2
  15. package/dist/cjs/components/datepickerfield/datepickerfield.recipe.js +16 -3
  16. package/dist/cjs/components/menu/menu.js +65 -9
  17. package/dist/cjs/components/multiselect/multiselect.js +3 -0
  18. package/dist/cjs/components/multiselect/multiselect.recipe.js +18 -0
  19. package/dist/cjs/components/select/select.js +2 -2
  20. package/dist/cjs/components/select/select.recipe.js +19 -0
  21. package/dist/cjs/components/table/table.recipe.js +7 -1
  22. package/dist/cjs/core/floating-portal.js +7 -4
  23. package/dist/cjs/core/index.js +2 -1
  24. package/dist/cjs/core/place-floating.js +38 -0
  25. package/dist/cjs/index.js +8 -0
  26. package/dist/cjs/product/assigneepicker/assigneepicker.js +127 -0
  27. package/dist/cjs/product/assigneepicker/assigneepicker.recipe.js +36 -0
  28. package/dist/cjs/product/assigneepicker/index.js +7 -0
  29. package/dist/cjs/product/inbox/inbox.js +11 -3
  30. package/dist/cjs/product/notesgallery/index.js +7 -0
  31. package/dist/cjs/product/notesgallery/notesgallery.js +80 -0
  32. package/dist/cjs/product/notesgallery/notesgallery.recipe.js +46 -0
  33. package/dist/cjs/product/objectpagemenu/index.js +17 -0
  34. package/dist/cjs/product/objectpagemenu/objectpagemenu.js +26 -0
  35. package/dist/cjs/product/objectpagemenu/objectpagemenu.recipe.js +30 -0
  36. package/dist/cjs/product/objectsettings/objectsettings.js +107 -14
  37. package/dist/cjs/product/recordpage/index.js +2 -1
  38. package/dist/cjs/product/recordpage/recordpage.js +112 -7
  39. package/dist/cjs/product/recordpage/recordpage.recipe.js +63 -0
  40. package/dist/cjs/product/recordpicker/index.js +7 -0
  41. package/dist/cjs/product/recordpicker/recordpicker.js +100 -0
  42. package/dist/cjs/product/recordpicker/recordpicker.recipe.js +36 -0
  43. package/dist/cjs/product/savedviews/index.js +2 -1
  44. package/dist/cjs/product/savedviews/savedviews.js +22 -0
  45. package/dist/cjs/product/savedviews/savedviews.recipe.js +47 -0
  46. package/dist/cjs/product/share/index.js +7 -0
  47. package/dist/cjs/product/share/share.js +179 -0
  48. package/dist/cjs/product/share/share.recipe.js +114 -0
  49. package/dist/cjs/product/shortcutssheet/index.js +17 -0
  50. package/dist/cjs/product/shortcutssheet/shortcutssheet.js +125 -0
  51. package/dist/cjs/product/shortcutssheet/shortcutssheet.recipe.js +50 -0
  52. package/dist/cjs/product/taskeditpopover/index.js +7 -0
  53. package/dist/cjs/product/taskeditpopover/taskeditpopover.js +159 -0
  54. package/dist/cjs/product/taskeditpopover/taskeditpopover.recipe.js +68 -0
  55. package/dist/cjs/product/workspaceswitchermenu/index.js +17 -0
  56. package/dist/cjs/product/workspaceswitchermenu/workspaceswitchermenu.js +38 -0
  57. package/dist/cjs/product/workspaceswitchermenu/workspaceswitchermenu.recipe.js +34 -0
  58. package/dist/cjs/tokens/palette.js +27 -0
  59. package/dist/cjs/tokens/semantic.js +20 -0
  60. package/dist/datatable.css +50 -11
  61. package/dist/datatable.layered.css +50 -11
  62. package/dist/datepickerfield.css +8 -2
  63. package/dist/datepickerfield.d.ts +2 -2
  64. package/dist/datepickerfield.layered.css +8 -2
  65. package/dist/esm/components/breadcrumb/breadcrumb.js +1 -1
  66. package/dist/esm/components/button/button.recipe.js +33 -0
  67. package/dist/esm/components/chip/chip.recipe.js +3 -1
  68. package/dist/esm/components/datatable/datatable.js +6 -3
  69. package/dist/esm/components/datatable/datatable.recipe.js +45 -6
  70. package/dist/esm/components/datepickerfield/datepickerfield.js +2 -2
  71. package/dist/esm/components/datepickerfield/datepickerfield.recipe.js +16 -3
  72. package/dist/esm/components/menu/menu.js +64 -8
  73. package/dist/esm/components/multiselect/multiselect.js +3 -0
  74. package/dist/esm/components/multiselect/multiselect.recipe.js +18 -0
  75. package/dist/esm/components/select/select.js +2 -2
  76. package/dist/esm/components/select/select.recipe.js +19 -0
  77. package/dist/esm/components/table/table.recipe.js +7 -1
  78. package/dist/esm/core/floating-portal.js +7 -4
  79. package/dist/esm/core/index.js +1 -1
  80. package/dist/esm/core/place-floating.js +37 -0
  81. package/dist/esm/index.js +8 -0
  82. package/dist/esm/product/assigneepicker/assigneepicker.js +91 -0
  83. package/dist/esm/product/assigneepicker/assigneepicker.recipe.js +33 -0
  84. package/dist/esm/product/assigneepicker/index.js +2 -0
  85. package/dist/esm/product/inbox/inbox.js +11 -3
  86. package/dist/esm/product/notesgallery/index.js +2 -0
  87. package/dist/esm/product/notesgallery/notesgallery.js +44 -0
  88. package/dist/esm/product/notesgallery/notesgallery.recipe.js +43 -0
  89. package/dist/esm/product/objectpagemenu/index.js +1 -0
  90. package/dist/esm/product/objectpagemenu/objectpagemenu.js +23 -0
  91. package/dist/esm/product/objectpagemenu/objectpagemenu.recipe.js +27 -0
  92. package/dist/esm/product/objectsettings/objectsettings.js +106 -13
  93. package/dist/esm/product/recordpage/index.js +1 -1
  94. package/dist/esm/product/recordpage/recordpage.js +112 -8
  95. package/dist/esm/product/recordpage/recordpage.recipe.js +63 -0
  96. package/dist/esm/product/recordpicker/index.js +2 -0
  97. package/dist/esm/product/recordpicker/recordpicker.js +64 -0
  98. package/dist/esm/product/recordpicker/recordpicker.recipe.js +33 -0
  99. package/dist/esm/product/savedviews/index.js +1 -1
  100. package/dist/esm/product/savedviews/savedviews.js +22 -1
  101. package/dist/esm/product/savedviews/savedviews.recipe.js +47 -0
  102. package/dist/esm/product/share/index.js +2 -0
  103. package/dist/esm/product/share/share.js +143 -0
  104. package/dist/esm/product/share/share.recipe.js +111 -0
  105. package/dist/esm/product/shortcutssheet/index.js +1 -0
  106. package/dist/esm/product/shortcutssheet/shortcutssheet.js +88 -0
  107. package/dist/esm/product/shortcutssheet/shortcutssheet.recipe.js +47 -0
  108. package/dist/esm/product/taskeditpopover/index.js +2 -0
  109. package/dist/esm/product/taskeditpopover/taskeditpopover.js +123 -0
  110. package/dist/esm/product/taskeditpopover/taskeditpopover.recipe.js +65 -0
  111. package/dist/esm/product/workspaceswitchermenu/index.js +1 -0
  112. package/dist/esm/product/workspaceswitchermenu/workspaceswitchermenu.js +35 -0
  113. package/dist/esm/product/workspaceswitchermenu/workspaceswitchermenu.recipe.js +31 -0
  114. package/dist/esm/tokens/palette.js +27 -0
  115. package/dist/esm/tokens/semantic.js +20 -0
  116. package/dist/multiselect.css +18 -0
  117. package/dist/multiselect.layered.css +18 -0
  118. package/dist/native/tokens.d.ts +1 -1
  119. package/dist/native/tokens.js +56 -4
  120. package/dist/notesgallery.css +15 -0
  121. package/dist/notesgallery.d.ts +7 -0
  122. package/dist/notesgallery.layered.css +17 -0
  123. package/dist/objectpagemenu.css +3 -0
  124. package/dist/objectpagemenu.d.ts +7 -0
  125. package/dist/objectpagemenu.layered.css +5 -0
  126. package/dist/recordpage.css +59 -0
  127. package/dist/recordpage.layered.css +59 -0
  128. package/dist/recordpicker.css +13 -0
  129. package/dist/recordpicker.d.ts +7 -0
  130. package/dist/recordpicker.layered.css +15 -0
  131. package/dist/savedviews.css +47 -0
  132. package/dist/savedviews.layered.css +47 -0
  133. package/dist/select.css +19 -0
  134. package/dist/select.layered.css +19 -0
  135. package/dist/share.css +84 -0
  136. package/dist/share.d.ts +7 -0
  137. package/dist/share.layered.css +86 -0
  138. package/dist/shortcutssheet.css +24 -0
  139. package/dist/shortcutssheet.d.ts +7 -0
  140. package/dist/shortcutssheet.layered.css +26 -0
  141. package/dist/styles.css +438 -16
  142. package/dist/styles.layered.css +438 -16
  143. package/dist/table.css +7 -2
  144. package/dist/table.layered.css +7 -2
  145. package/dist/taskeditpopover.css +36 -0
  146. package/dist/taskeditpopover.d.ts +7 -0
  147. package/dist/taskeditpopover.layered.css +38 -0
  148. package/dist/tokens.css +26 -0
  149. package/dist/tokens.json +56 -4
  150. package/dist/types/components/breadcrumb/breadcrumb.d.ts +9 -1
  151. package/dist/types/components/button/button.d.ts +2 -0
  152. package/dist/types/components/button/button.recipe.d.ts +12 -0
  153. package/dist/types/components/chip/chip.recipe.d.ts +1 -1
  154. package/dist/types/components/datatable/datatable.d.ts +8 -0
  155. package/dist/types/components/datepickerfield/datepickerfield.d.ts +4 -1
  156. package/dist/types/components/datepickerfield/datepickerfield.recipe.d.ts +18 -3
  157. package/dist/types/components/menu/menu.d.ts +50 -7
  158. package/dist/types/components/multiselect/multiselect.d.ts +9 -0
  159. package/dist/types/components/select/select.d.ts +10 -0
  160. package/dist/types/core/floating-portal.d.ts +6 -5
  161. package/dist/types/core/index.d.ts +1 -1
  162. package/dist/types/core/place-floating.d.ts +37 -0
  163. package/dist/types/index.d.ts +8 -0
  164. package/dist/types/product/assigneepicker/assigneepicker.d.ts +36 -0
  165. package/dist/types/product/assigneepicker/assigneepicker.recipe.d.ts +3 -0
  166. package/dist/types/product/assigneepicker/index.d.ts +2 -0
  167. package/dist/types/product/inbox/inbox.d.ts +13 -1
  168. package/dist/types/product/notesgallery/index.d.ts +2 -0
  169. package/dist/types/product/notesgallery/notesgallery.d.ts +54 -0
  170. package/dist/types/product/notesgallery/notesgallery.recipe.d.ts +3 -0
  171. package/dist/types/product/objectpagemenu/index.d.ts +1 -0
  172. package/dist/types/product/objectpagemenu/objectpagemenu.d.ts +40 -0
  173. package/dist/types/product/objectpagemenu/objectpagemenu.recipe.d.ts +17 -0
  174. package/dist/types/product/objectsettings/objectsettings.d.ts +71 -15
  175. package/dist/types/product/recordpage/index.d.ts +1 -1
  176. package/dist/types/product/recordpage/recordpage.d.ts +142 -1
  177. package/dist/types/product/recordpicker/index.d.ts +2 -0
  178. package/dist/types/product/recordpicker/recordpicker.d.ts +38 -0
  179. package/dist/types/product/recordpicker/recordpicker.recipe.d.ts +3 -0
  180. package/dist/types/product/savedviews/index.d.ts +1 -1
  181. package/dist/types/product/savedviews/savedviews.d.ts +36 -0
  182. package/dist/types/product/share/index.d.ts +2 -0
  183. package/dist/types/product/share/share.d.ts +85 -0
  184. package/dist/types/product/share/share.recipe.d.ts +3 -0
  185. package/dist/types/product/shortcutssheet/index.d.ts +1 -0
  186. package/dist/types/product/shortcutssheet/shortcutssheet.d.ts +49 -0
  187. package/dist/types/product/shortcutssheet/shortcutssheet.recipe.d.ts +3 -0
  188. package/dist/types/product/taskeditpopover/index.d.ts +2 -0
  189. package/dist/types/product/taskeditpopover/taskeditpopover.d.ts +67 -0
  190. package/dist/types/product/taskeditpopover/taskeditpopover.recipe.d.ts +3 -0
  191. package/dist/types/product/workspaceswitchermenu/index.d.ts +1 -0
  192. package/dist/types/product/workspaceswitchermenu/workspaceswitchermenu.d.ts +54 -0
  193. package/dist/types/product/workspaceswitchermenu/workspaceswitchermenu.recipe.d.ts +19 -0
  194. package/dist/types/tokens/contract.d.ts +13 -0
  195. package/dist/types/tokens/palette.d.ts +52 -0
  196. package/dist/types/tokens/semantic.d.ts +20 -0
  197. package/dist/workspaceswitchermenu.css +4 -0
  198. package/dist/workspaceswitchermenu.d.ts +7 -0
  199. package/dist/workspaceswitchermenu.layered.css +6 -0
  200. package/package.json +41 -1
package/dist/styles.css CHANGED
@@ -97,6 +97,19 @@
97
97
  --crisp-stroke-select-divider: #00000010;
98
98
  --crisp-fg-select-placeholder: #b0b3ba;
99
99
  --crisp-shadow-select: #0000001f;
100
+ --crisp-bg-tag-swatch1: #fff3cc;
101
+ --crisp-bg-tag-swatch2: #f4fbcb;
102
+ --crisp-bg-tag-swatch3: #fdf7c4;
103
+ --crisp-bg-tag-swatch4: #feecf3;
104
+ --crisp-bg-tag-swatch5: #e0fced;
105
+ --crisp-bg-tag-swatch6: #ddf7ff;
106
+ --crisp-bg-tag-swatch7: #f6f7f7;
107
+ --crisp-bg-tag-swatch8: #ffebeb;
108
+ --crisp-bg-tag-swatch9: #feeee1;
109
+ --crisp-bg-tag-swatch10: #e5eeff;
110
+ --crisp-bg-tag-swatch11: #f5f0ff;
111
+ --crisp-bg-tag-swatch12: #fdedff;
112
+ --crisp-fg-tag-swatch: #000000;
100
113
  }
101
114
 
102
115
  [data-theme="dark"] {
@@ -170,6 +183,19 @@
170
183
  --crisp-stroke-select-divider: #ffffff17;
171
184
  --crisp-fg-select-placeholder: #868b94;
172
185
  --crisp-shadow-select: #000000cc;
186
+ --crisp-bg-tag-swatch1: #fff3cc;
187
+ --crisp-bg-tag-swatch2: #f4fbcb;
188
+ --crisp-bg-tag-swatch3: #fdf7c4;
189
+ --crisp-bg-tag-swatch4: #feecf3;
190
+ --crisp-bg-tag-swatch5: #e0fced;
191
+ --crisp-bg-tag-swatch6: #ddf7ff;
192
+ --crisp-bg-tag-swatch7: #f6f7f7;
193
+ --crisp-bg-tag-swatch8: #ffebeb;
194
+ --crisp-bg-tag-swatch9: #feeee1;
195
+ --crisp-bg-tag-swatch10: #e5eeff;
196
+ --crisp-bg-tag-swatch11: #f5f0ff;
197
+ --crisp-bg-tag-swatch12: #fdedff;
198
+ --crisp-fg-tag-swatch: #000000;
173
199
  }
174
200
 
175
201
  :root {
@@ -467,6 +493,9 @@
467
493
  .crisp-button--size_sm {
468
494
  height: 24px; padding-inline: var(--crisp-space-1-5); font-size: var(--crisp-text-md); border-radius: var(--crisp-radius-md);
469
495
  }
496
+ .crisp-button--size_xs {
497
+ height: 20px; padding-inline: var(--crisp-space-1-5); font-size: var(--crisp-text-sm); line-height: 16px; letter-spacing: normal; border-radius: var(--crisp-radius-sm); gap: var(--crisp-space-1);
498
+ }
470
499
  .crisp-button--size_md {
471
500
  height: 28px; padding-inline: var(--crisp-space-2); font-size: var(--crisp-text-lg); border-radius: var(--crisp-radius-md);
472
501
  &[data-icon-start] { padding-inline-start: var(--crisp-space-1-5); }
@@ -575,7 +604,7 @@
575
604
  display: inline-flex; align-items: center; gap: 3px; height: var(--crisp-size-chip); min-width: 0; max-width: 100%; padding-inline: var(--crisp-space-1); border-radius: var(--crisp-radius-chip); font-size: var(--crisp-text-lg); line-height: 20px; font-weight: var(--crisp-weight-medium); white-space: nowrap;
576
605
  }
577
606
  .crisp-chip--truncate_true {
578
- & .crisp-chip-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; display: block; }
607
+ & .crisp-chip-label { min-width: 0; overflow: clip; text-overflow: ellipsis; white-space: nowrap; display: block; }
579
608
  }
580
609
  .crisp-chip--truncate_false {
581
610
 
@@ -851,7 +880,13 @@
851
880
  & .crisp-datatable-group-count { margin-inline-start: var(--crisp-space-1-5); color: var(--crisp-fg-muted); font-variant-numeric: tabular-nums; }
852
881
  & .crisp-datatable-th-rename { width: 100%; min-width: 0; height: var(--crisp-size-row); margin: 0; padding: 0 var(--crisp-space-1); border: none; border-radius: var(--crisp-radius-md); background: var(--crisp-bg-surface); box-shadow: inset 0 0 0 1px var(--crisp-bg-brand-solid); font-family: inherit; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-primary); outline: none; }
853
882
  & .crisp-datatable-th-rename:focus { box-shadow: inset 0 0 0 1px var(--crisp-bg-brand-solid); }
854
- & .crisp-datatable-th-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
883
+ /* #719: overflow: clip, not hidden, on every truncation rule below --
884
+ hidden still honours a programmatic scrollLeft assignment (found via
885
+ a screenshot tool that pans anything with scrollWidth > clientWidth),
886
+ blanking or fragmenting the visible text even though real user
887
+ scrolling was already blocked. clip renders the ellipsis identically
888
+ and leaves no scroll position to move. */
889
+ & .crisp-datatable-th-label { overflow: clip; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
855
890
  /* #465: 12px per the comment above (and Attio's measured header cell
856
891
  padding: 0 12px) -- was still c.space["2"] (8px), drifted from its
857
892
  own documented value. */
@@ -938,7 +973,7 @@
938
973
  /* reference picker: a leading 16px avatar per option, plus a trailing
939
974
  "Create X" row when the consumer supplies one (#449) -- same measured
940
975
  values as RecordsTable's own .crisp-recordstable-refoption*. */
941
- & .crisp-datatable-refoption { display: flex; align-items: center; gap: var(--crisp-space-2); min-width: 0; overflow: hidden; text-overflow: ellipsis; }
976
+ & .crisp-datatable-refoption { display: flex; align-items: center; gap: var(--crisp-space-2); min-width: 0; overflow: clip; text-overflow: ellipsis; }
942
977
  & .crisp-datatable-refoption-avatar { flex-shrink: 0; }
943
978
  & .crisp-datatable-refoption--create { color: var(--crisp-fg-muted); }
944
979
  & .crisp-datatable-empty { padding: var(--crisp-space-8) var(--crisp-space-3); text-align: center; color: var(--crisp-fg-muted); font-size: var(--crisp-text-lg); }
@@ -1014,7 +1049,7 @@
1014
1049
  (#833/#835/#848) that happened to apply the same 500 to every
1015
1050
  primary-column body cell regardless of type. Made explicit here so
1016
1051
  fixing that leak doesn't also (wrongly) drop entity names to 400. */
1017
- & .crisp-datatable-entity-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: var(--crisp-weight-medium); text-decoration: underline; text-decoration-color: color-mix(in srgb, var(--crisp-fg-primary) 9%, transparent); }
1052
+ & .crisp-datatable-entity-name { overflow: clip; text-overflow: ellipsis; white-space: nowrap; font-weight: var(--crisp-weight-medium); text-decoration: underline; text-decoration-color: color-mix(in srgb, var(--crisp-fg-primary) 9%, transparent); }
1018
1053
  /* #893: shared by the button (onEntityClick, a different record) and
1019
1054
  the anchor (href, the row's own record) -- was button-only, which
1020
1055
  silently left a real <a> unstyled the day #893 added one. */
@@ -1037,14 +1072,29 @@
1037
1072
  Avatar's own already-shipped shape="rounded" value, not a new number.
1038
1073
  shape="circle" reuses Avatar's own shape="circle" value (radius.full)
1039
1074
  the same way, measured live on a real Attio person avatar. */
1040
- & .crisp-datatable-avatar { width: var(--crisp-size-icon); height: var(--crisp-size-icon); border-radius: 30%; flex-shrink: 0; display: inline-flex; align-items: center; justify-content: center; font-size: 10px; line-height: 1; font-weight: var(--crisp-weight-semibold); text-transform: uppercase; color: var(--crisp-fg-on-brand); background: var(--crisp-bg-brand-solid); }
1075
+ & .crisp-datatable-avatar { width: var(--crisp-size-icon); height: var(--crisp-size-icon); border-radius: 30%; flex-shrink: 0; display: inline-flex; align-items: center; justify-content: center; font-size: 10px; line-height: 1; font-weight: var(--crisp-weight-semibold); text-transform: uppercase; color: var(--crisp-fg-on-tone); background: var(--crisp-bg-brand-solid); }
1041
1076
  & .crisp-datatable-avatar[data-shape="circle"] { border-radius: var(--crisp-radius-full); }
1042
- & .crisp-datatable-avatar[data-tone="success"] { background: var(--crisp-bg-success); }
1043
- & .crisp-datatable-avatar[data-tone="warning"] { background: var(--crisp-bg-warning); }
1044
- & .crisp-datatable-avatar[data-tone="danger"] { background: var(--crisp-bg-danger); }
1045
- & .crisp-datatable-avatar[data-tone="purple"] { background: var(--crisp-bg-purple); }
1046
- & .crisp-datatable-avatar[data-tone="cyan"] { background: var(--crisp-bg-cyan); }
1047
- & .crisp-datatable-avatar[data-tone="orange"] { background: var(--crisp-bg-orange); }
1077
+ /* your-moon/crisp#891: every data-tone override painted ONLY a
1078
+ background, inheriting the base rule's white fgOnBrand -- white
1079
+ clears AA against none of these seven fills (brand 3.23:1, success
1080
+ 3.96, warning 4.12, danger 3.76, purple 3.58, cyan 2.30, orange
1081
+ 2.77). fgOnTone (ink, #101112 -- semantic.ts's own comment: "dark ink
1082
+ clears AA on every tone in both themes") clears 4.5:1+ on every fill
1083
+ here with a comfortable margin (brand 5.85, success 4.77/6.29,
1084
+ danger 5.03/6.19, purple 5.27, cyan 8.23, orange 6.83, light/dark),
1085
+ so the base rule's colour moves there and every override keeps it --
1086
+ EXCEPT warning, whose raw fill (bgWarning) only clears 4.59:1 in
1087
+ light, too thin a margin to rely on: it takes bgWarningSolid instead,
1088
+ the same solid-warning-plus-ink pair Badge's own solid variant
1089
+ already established (13.98/7.83), for the same reason (see
1090
+ tokens/palette.ts's amberSolid comment). No background changes
1091
+ otherwise -- the fills themselves are unaffected, only the text. */
1092
+ & .crisp-datatable-avatar[data-tone="success"] { background: var(--crisp-bg-success); color: var(--crisp-fg-on-tone); }
1093
+ & .crisp-datatable-avatar[data-tone="warning"] { background: var(--crisp-bg-warning-solid); color: var(--crisp-fg-on-tone); }
1094
+ & .crisp-datatable-avatar[data-tone="danger"] { background: var(--crisp-bg-danger); color: var(--crisp-fg-on-tone); }
1095
+ & .crisp-datatable-avatar[data-tone="purple"] { background: var(--crisp-bg-purple); color: var(--crisp-fg-on-tone); }
1096
+ & .crisp-datatable-avatar[data-tone="cyan"] { background: var(--crisp-bg-cyan); color: var(--crisp-fg-on-tone); }
1097
+ & .crisp-datatable-avatar[data-tone="orange"] { background: var(--crisp-bg-orange); color: var(--crisp-fg-on-tone); }
1048
1098
  & .crisp-datatable-avatar img { width: 100%; height: 100%; border-radius: inherit; object-fit: cover; }
1049
1099
  & .crisp-datatable-tags { display: flex; align-items: center; gap: var(--crisp-space-1); overflow: hidden; }
1050
1100
  & .crisp-datatable-tag { display: inline-flex; align-items: center; height: var(--crisp-size-chip); padding: 0 var(--crisp-space-1); border-radius: var(--crisp-radius-chip); font-size: var(--crisp-text-lg); line-height: 20px; font-weight: var(--crisp-weight-medium); white-space: nowrap; background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); color: color-mix(in srgb, var(--crisp-fg-primary) 82%, transparent); }
@@ -1055,6 +1105,24 @@
1055
1105
  & .crisp-datatable-tag[data-tone="purple"] { background: color-mix(in srgb, var(--crisp-bg-purple) 16%, transparent); color: color-mix(in srgb, var(--crisp-bg-purple) 80%, var(--crisp-fg-primary)); }
1056
1106
  & .crisp-datatable-tag[data-tone="cyan"] { background: color-mix(in srgb, var(--crisp-bg-cyan) 18%, transparent); color: color-mix(in srgb, var(--crisp-bg-cyan) 82%, var(--crisp-fg-primary)); }
1057
1107
  & .crisp-datatable-tag[data-tone="orange"] { background: color-mix(in srgb, var(--crisp-bg-orange) 16%, transparent); color: color-mix(in srgb, var(--crisp-bg-orange) 82%, var(--crisp-fg-primary)); }
1108
+ /* your-moon/crisp#998: Attio's own 12-colour tag palette (measured
1109
+ live, see tokens/palette.ts's tagSwatch1 comment) -- flat black
1110
+ text, no ring, unlike the tone family above. 7px radius/10px text
1111
+ are measured literals (no matching step in the shared scale, same
1112
+ as Select's own .crisp-select-swatch). */
1113
+ & .crisp-datatable-swatch { display: inline-flex; align-items: center; height: var(--crisp-size-chip); padding: 0 var(--crisp-space-1); border-radius: 7px; font-size: 10px; font-weight: var(--crisp-weight-regular); white-space: nowrap; color: var(--crisp-fg-tag-swatch); }
1114
+ & .crisp-datatable-swatch[data-swatch="1"] { background: var(--crisp-bg-tag-swatch1); }
1115
+ & .crisp-datatable-swatch[data-swatch="2"] { background: var(--crisp-bg-tag-swatch2); }
1116
+ & .crisp-datatable-swatch[data-swatch="3"] { background: var(--crisp-bg-tag-swatch3); }
1117
+ & .crisp-datatable-swatch[data-swatch="4"] { background: var(--crisp-bg-tag-swatch4); }
1118
+ & .crisp-datatable-swatch[data-swatch="5"] { background: var(--crisp-bg-tag-swatch5); }
1119
+ & .crisp-datatable-swatch[data-swatch="6"] { background: var(--crisp-bg-tag-swatch6); }
1120
+ & .crisp-datatable-swatch[data-swatch="7"] { background: var(--crisp-bg-tag-swatch7); }
1121
+ & .crisp-datatable-swatch[data-swatch="8"] { background: var(--crisp-bg-tag-swatch8); }
1122
+ & .crisp-datatable-swatch[data-swatch="9"] { background: var(--crisp-bg-tag-swatch9); }
1123
+ & .crisp-datatable-swatch[data-swatch="10"] { background: var(--crisp-bg-tag-swatch10); }
1124
+ & .crisp-datatable-swatch[data-swatch="11"] { background: var(--crisp-bg-tag-swatch11); }
1125
+ & .crisp-datatable-swatch[data-swatch="12"] { background: var(--crisp-bg-tag-swatch12); }
1058
1126
  & .crisp-datatable-num { font-variant-numeric: tabular-nums; }
1059
1127
  & .crisp-datatable-muted { color: var(--crisp-fg-muted); }
1060
1128
  /* crisp#822 -- a date/datetime cell's danger/overdue tone: same token as
@@ -1065,7 +1133,7 @@
1065
1133
  own .crisp-recordstable-link, which this mirrors: no underline at
1066
1134
  rest, underline on hover, own-colour text rather than a browser-blue
1067
1135
  link. */
1068
- & .crisp-datatable-link { color: var(--crisp-fg-primary); text-decoration: none; overflow: hidden; text-overflow: ellipsis; }
1136
+ & .crisp-datatable-link { color: var(--crisp-fg-primary); text-decoration: none; overflow: clip; text-overflow: ellipsis; }
1069
1137
  & .crisp-datatable-link:hover { text-decoration: underline; }
1070
1138
  /* phone cell type/editor (#765) -- measured live: the dial-code prefix
1071
1139
  is a muted rgba(0,0,0,0.63) at 14px, matching every other muted-text
@@ -1241,10 +1309,10 @@
1241
1309
 
1242
1310
  .crisp-datepickerfield {
1243
1311
  display: inline-flex; font-family: var(--crisp-font-sans);
1244
- & .crisp-datepickerfield-box { display: inline-flex; align-items: center; box-sizing: border-box; height: 32px; margin: 0; border-radius: var(--crisp-radius-md); background: transparent; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-fg-primary) 7%, transparent); color: var(--crisp-fg-primary); font-family: inherit; font-size: var(--crisp-text-lg); }
1312
+ & .crisp-datepickerfield-box { display: inline-flex; align-items: center; width: 100%; box-sizing: border-box; height: 32px; margin: 0; border-radius: var(--crisp-radius-md); background: transparent; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-fg-primary) 7%, transparent); color: var(--crisp-fg-primary); font-family: inherit; font-size: var(--crisp-text-lg); }
1245
1313
  & .crisp-datepickerfield-box[data-ghost] { background: transparent; box-shadow: none; }
1246
1314
  & .crisp-datepickerfield-box[data-ghost]:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 4%, transparent); }
1247
- & .crisp-datepickerfield-trigger { display: inline-flex; align-items: center; gap: var(--crisp-space-2); height: 100%; padding: 0 var(--crisp-space-2-5); margin: 0; border: none; background: none; color: inherit; font-family: inherit; font-size: inherit; white-space: nowrap; cursor: pointer; }
1315
+ & .crisp-datepickerfield-trigger { flex: 1; min-width: 0; display: inline-flex; align-items: center; gap: var(--crisp-space-2); height: 100%; padding: 0 var(--crisp-space-2-5); margin: 0; border: none; background: none; color: inherit; font-family: inherit; font-size: inherit; white-space: nowrap; cursor: pointer; }
1248
1316
  & .crisp-datepickerfield-box[data-placeholder] .crisp-datepickerfield-trigger { color: var(--crisp-fg-muted); }
1249
1317
  & .crisp-datepickerfield-trigger svg { flex-shrink: 0; color: var(--crisp-fg-muted); }
1250
1318
  /* Reuses TableToolbar's measured filter-chip remove button
@@ -1259,6 +1327,12 @@
1259
1327
  & .crisp-datepickerfield-preset { height: var(--crisp-size-chip); padding: 0 var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-chip); background: var(--crisp-bg-raised); color: var(--crisp-fg-primary); font-family: inherit; font-size: var(--crisp-text-sm); cursor: pointer; }
1260
1328
  & .crisp-datepickerfield-preset:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 8%, transparent); }
1261
1329
  }
1330
+ .crisp-datepickerfield--width_full {
1331
+ width: 100%;
1332
+ }
1333
+ .crisp-datepickerfield--width_auto {
1334
+ width: auto;
1335
+ }
1262
1336
 
1263
1337
  .crisp-dialog {
1264
1338
  display: contents; font-family: var(--crisp-font-sans);
@@ -1758,6 +1832,24 @@
1758
1832
  .crisp-recordstable-tag[data-tone="purple"] { background: color-mix(in srgb, var(--crisp-bg-purple) 16%, transparent); color: color-mix(in srgb, var(--crisp-bg-purple) 80%, var(--crisp-fg-primary)); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-bg-purple) 30%, transparent); }
1759
1833
  .crisp-recordstable-tag[data-tone="cyan"] { background: color-mix(in srgb, var(--crisp-bg-cyan) 18%, transparent); color: color-mix(in srgb, var(--crisp-bg-cyan) 82%, var(--crisp-fg-primary)); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-bg-cyan) 30%, transparent); }
1760
1834
  .crisp-recordstable-tag[data-tone="orange"] { background: color-mix(in srgb, var(--crisp-bg-orange) 16%, transparent); color: color-mix(in srgb, var(--crisp-bg-orange) 82%, var(--crisp-fg-primary)); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-bg-orange) 30%, transparent); }
1835
+ /* your-moon/crisp#998: Attio's own 12-colour tag palette (measured live,
1836
+ see tokens/palette.ts's tagSwatch1 comment) -- flat black text, no
1837
+ ring/border, unlike the tone family above. 7px radius/10px text are
1838
+ measured literals, no matching step in the shared scale (same as
1839
+ Select's own .crisp-select-swatch). */
1840
+ .crisp-multiselect-swatch { display: inline-flex; align-items: center; height: var(--crisp-size-chip); padding: 0 var(--crisp-space-1); border-radius: 7px; font-size: 10px; font-weight: var(--crisp-weight-regular); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--crisp-fg-tag-swatch); }
1841
+ .crisp-multiselect-swatch[data-swatch="1"] { background: var(--crisp-bg-tag-swatch1); }
1842
+ .crisp-multiselect-swatch[data-swatch="2"] { background: var(--crisp-bg-tag-swatch2); }
1843
+ .crisp-multiselect-swatch[data-swatch="3"] { background: var(--crisp-bg-tag-swatch3); }
1844
+ .crisp-multiselect-swatch[data-swatch="4"] { background: var(--crisp-bg-tag-swatch4); }
1845
+ .crisp-multiselect-swatch[data-swatch="5"] { background: var(--crisp-bg-tag-swatch5); }
1846
+ .crisp-multiselect-swatch[data-swatch="6"] { background: var(--crisp-bg-tag-swatch6); }
1847
+ .crisp-multiselect-swatch[data-swatch="7"] { background: var(--crisp-bg-tag-swatch7); }
1848
+ .crisp-multiselect-swatch[data-swatch="8"] { background: var(--crisp-bg-tag-swatch8); }
1849
+ .crisp-multiselect-swatch[data-swatch="9"] { background: var(--crisp-bg-tag-swatch9); }
1850
+ .crisp-multiselect-swatch[data-swatch="10"] { background: var(--crisp-bg-tag-swatch10); }
1851
+ .crisp-multiselect-swatch[data-swatch="11"] { background: var(--crisp-bg-tag-swatch11); }
1852
+ .crisp-multiselect-swatch[data-swatch="12"] { background: var(--crisp-bg-tag-swatch12); }
1761
1853
 
1762
1854
  .crisp-multiselect {
1763
1855
  position: relative; display: inline-flex; width: 100%; font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
@@ -2051,6 +2143,25 @@
2051
2143
  .crisp-select-option[data-disabled] .crisp-select-option-description,
2052
2144
  .crisp-select-option[data-disabled] .crisp-select-option-check { color: var(--crisp-fg-disabled); }
2053
2145
  .crisp-select-option-dot { flex-shrink: 0; width: 8px; height: 8px; border-radius: var(--crisp-radius-full); margin-inline-end: var(--crisp-space-2); }
2146
+ /* your-moon/crisp#998: Attio's own 12-colour tag palette (measured live,
2147
+ see tokens/palette.ts's tagSwatch1 comment) -- the label itself as a
2148
+ filled pill, not a dot beside it. 7px radius/10px text have no
2149
+ matching step in the shared scale (radius.xs is 4px, .sm is 6px;
2150
+ text.xs is 11px), so both are the measured literals, same as
2151
+ DataTable's own avatar font-size (#891). */
2152
+ .crisp-select-swatch { display: inline-flex; align-items: center; height: var(--crisp-size-chip); padding: 0 var(--crisp-space-1); border-radius: 7px; font-size: 10px; font-weight: var(--crisp-weight-regular); color: var(--crisp-fg-tag-swatch); }
2153
+ .crisp-select-swatch[data-swatch="1"] { background: var(--crisp-bg-tag-swatch1); }
2154
+ .crisp-select-swatch[data-swatch="2"] { background: var(--crisp-bg-tag-swatch2); }
2155
+ .crisp-select-swatch[data-swatch="3"] { background: var(--crisp-bg-tag-swatch3); }
2156
+ .crisp-select-swatch[data-swatch="4"] { background: var(--crisp-bg-tag-swatch4); }
2157
+ .crisp-select-swatch[data-swatch="5"] { background: var(--crisp-bg-tag-swatch5); }
2158
+ .crisp-select-swatch[data-swatch="6"] { background: var(--crisp-bg-tag-swatch6); }
2159
+ .crisp-select-swatch[data-swatch="7"] { background: var(--crisp-bg-tag-swatch7); }
2160
+ .crisp-select-swatch[data-swatch="8"] { background: var(--crisp-bg-tag-swatch8); }
2161
+ .crisp-select-swatch[data-swatch="9"] { background: var(--crisp-bg-tag-swatch9); }
2162
+ .crisp-select-swatch[data-swatch="10"] { background: var(--crisp-bg-tag-swatch10); }
2163
+ .crisp-select-swatch[data-swatch="11"] { background: var(--crisp-bg-tag-swatch11); }
2164
+ .crisp-select-swatch[data-swatch="12"] { background: var(--crisp-bg-tag-swatch12); }
2054
2165
  .crisp-select-option-body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: var(--crisp-space-0-5); }
2055
2166
  .crisp-select-option-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
2056
2167
  .crisp-select-option-description { min-width: 0; overflow: hidden; text-overflow: ellipsis; color: var(--crisp-fg-neutral-subtle); }
@@ -2304,8 +2415,13 @@
2304
2415
  /* #465: 12px, not crisp's old 8px -- measured on a live header cell
2305
2416
  (padding: 0 12px) and independently on a body cell's text inset
2306
2417
  (getBoundingClientRect delta from the cell edge). Matches
2307
- ColumnCalc's own already-correct 12px trigger inset. */
2308
- & th, & td { position: relative; height: var(--crisp-size-tableRow); padding: 0 var(--crisp-space-3); border-bottom: 1px solid var(--crisp-border-subtle); border-inline-end: 1px solid var(--crisp-border-subtle); text-align: start; vertical-align: middle; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
2418
+ ColumnCalc's own already-correct 12px trigger inset. */ /* #719: overflow: clip, not hidden -- both render the ellipsis
2419
+ identically, but hidden still honours a programmatic scrollLeft
2420
+ assignment (a screenshot tool, a browser extension) even though it
2421
+ already blocks user-driven wheel/scrollbar input; clip leaves no
2422
+ scroll position for anything to move, so the truncated text can
2423
+ never be panned out of view. */
2424
+ & th, & td { position: relative; height: var(--crisp-size-tableRow); padding: 0 var(--crisp-space-3); border-bottom: 1px solid var(--crisp-border-subtle); border-inline-end: 1px solid var(--crisp-border-subtle); text-align: start; vertical-align: middle; white-space: nowrap; overflow: clip; text-overflow: ellipsis; }
2309
2425
  /* #554: sticky on the vertical axis, mirroring RecordsTable's own
2310
2426
  `.crisp-recordstable-th`. z-index 2 sits above a plain body cell (auto)
2311
2427
  and below a sticky-column corner cell (DataTable's `th[data-sticky]`,
@@ -2800,6 +2916,20 @@
2800
2916
  }
2801
2917
  }
2802
2918
 
2919
+ .crisp-assigneepicker {
2920
+ display: flex; flex-direction: column; box-sizing: border-box; width: 350px; font-family: var(--crisp-font-sans);
2921
+ & .crisp-assigneepicker-search { display: flex; align-items: center; gap: var(--crisp-space-2); height: 36px; padding: 0 var(--crisp-space-3); color: var(--crisp-fg-muted); }
2922
+ & .crisp-assigneepicker-search svg { flex-shrink: 0; }
2923
+ & .crisp-assigneepicker-search-input { flex: 1; min-width: 0; border: none; outline: none; background: none; font-family: inherit; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); line-height: 20px; color: var(--crisp-fg-primary); }
2924
+ & .crisp-assigneepicker-search-input::placeholder { color: var(--crisp-fg-muted); }
2925
+ & .crisp-assigneepicker-pill { display: flex; padding: 0 var(--crisp-space-3) var(--crisp-space-2); }
2926
+ & .crisp-assigneepicker-remove { display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; width: 14px; height: 14px; margin: 0; padding: 0; border: none; background: none; color: inherit; font-family: inherit; cursor: pointer; }
2927
+ & .crisp-assigneepicker-empty { padding: var(--crisp-space-4) var(--crisp-space-3); text-align: center; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); }
2928
+ & .crisp-assigneepicker-list { display: flex; flex-direction: column; margin: 0; padding: var(--crisp-space-1); list-style: none; }
2929
+ & .crisp-assigneepicker-option { display: flex; align-items: center; width: 100%; box-sizing: border-box; height: 32px; padding: 0 var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-md); background: none; font-family: inherit; text-align: start; cursor: pointer; }
2930
+ & .crisp-assigneepicker-option:hover, & .crisp-assigneepicker-option[data-highlighted] { background: var(--crisp-bg-raised); }
2931
+ }
2932
+
2803
2933
  .crisp-authshell {
2804
2934
  min-height: 100%; box-sizing: border-box; display: flex; flex-direction: column; align-items: center; position: relative; background: var(--crisp-bg-surface); font-family: var(--crisp-font-sans); font-size: var(--crisp-text-lg); line-height: 20px; color: var(--crisp-fg-primary); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
2805
2935
  &[data-single-pane] { justify-content: center; }
@@ -3378,6 +3508,22 @@
3378
3508
  }
3379
3509
  }
3380
3510
 
3511
+ .crisp-notesgallery {
3512
+ display: flex; flex-direction: column; min-height: 0; box-sizing: border-box; font-family: var(--crisp-font-sans); color: var(--crisp-fg-primary); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
3513
+ & .crisp-notesgallery-tabs { display: flex; align-items: center; gap: var(--crisp-space-2); height: 44px; flex-shrink: 0; padding: 0 var(--crisp-space-3); }
3514
+ & .crisp-notesgallery-toolbar { display: flex; align-items: center; gap: var(--crisp-space-2); height: var(--crisp-size-header); flex-shrink: 0; padding: 0 var(--crisp-space-3); }
3515
+ & .crisp-notesgallery-toolbar-trail { display: flex; align-items: center; gap: var(--crisp-space-2); margin-inline-start: auto; }
3516
+ & .crisp-notesgallery-favorites-section { background: var(--crisp-bg-subtle); box-shadow: inset 0 -1px 0 var(--crisp-border-subtle); }
3517
+ & .crisp-notesgallery-favorites-label { padding: var(--crisp-space-2) var(--crisp-space-4) 0; font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-muted); }
3518
+ & .crisp-notesgallery-favorites { display: flex; align-items: center; justify-content: center; min-height: 200px; padding: var(--crisp-space-6); }
3519
+ & .crisp-notesgallery-favorites-empty { box-sizing: border-box; width: 100%; padding: var(--crisp-space-6); border: 1px dashed var(--crisp-border-default); border-radius: var(--crisp-radius-xl); text-align: center; font-size: var(--crisp-text-md); color: var(--crisp-fg-muted); }
3520
+ & .crisp-notesgallery-body { flex: 1; min-height: 0; overflow-y: auto; padding: 0 var(--crisp-space-3) var(--crisp-space-3); }
3521
+ & .crisp-notesgallery-group { display: flex; align-items: center; gap: var(--crisp-space-1-5); height: var(--crisp-size-menuRow); padding: var(--crisp-space-2) var(--crisp-space-1); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-muted); }
3522
+ & .crisp-notesgallery-group-count { display: inline-flex; align-items: center; justify-content: center; min-width: 16px; height: 16px; padding: 0 var(--crisp-space-1); border-radius: var(--crisp-radius-sm); background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); font-size: var(--crisp-text-xs); color: var(--crisp-fg-muted); }
3523
+ & .crisp-notesgallery-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(340px, 1fr)); gap: var(--crisp-space-4); padding-bottom: var(--crisp-space-4); }
3524
+ & .crisp-notesgallery-empty { padding: var(--crisp-space-8) var(--crisp-space-3); text-align: center; font-size: var(--crisp-text-md); color: var(--crisp-fg-muted); }
3525
+ }
3526
+
3381
3527
  .crisp-notificationssettings {
3382
3528
  & .crisp-notificationssettings-page { display: flex; flex-direction: column; gap: var(--crisp-space-6); font-family: var(--crisp-font-sans); }
3383
3529
  & .crisp-notificationssettings-heading { display: flex; flex-direction: column; gap: var(--crisp-space-0-5); }
@@ -3401,6 +3547,10 @@
3401
3547
  & .crisp-notificationssettings-matrixrow-col { display: flex; align-items: center; justify-content: center; width: 64px; flex-shrink: 0; }
3402
3548
  }
3403
3549
 
3550
+
3551
+ [dir="rtl"] .crisp-menu-item svg[data-rtl-flip] { transform: scaleX(-1); }
3552
+
3553
+
3404
3554
  .crisp-objectsettings {
3405
3555
  & .crisp-objectsettings-page { display: flex; flex-direction: column; gap: var(--crisp-space-6); }
3406
3556
  & .crisp-objectsettings-head { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--crisp-space-4); }
@@ -3585,6 +3735,18 @@
3585
3735
  the component's own comment) -- NOT `display: contents`, which
3586
3736
  drops a button's accessible semantics in some engines. */
3587
3737
  & .crisp-recordpage-edit-trigger { display: inline-flex; flex-wrap: wrap; align-items: center; gap: var(--crisp-space-1); margin: 0; padding: 0; border: none; background: none; text-align: start; font: inherit; color: inherit; cursor: pointer; }
3738
+ /* #990: measured live on app.attio.com's URL/domain attribute (hover the
3739
+ row) -- the link itself never carries the edit affordance, a
3740
+ separate 20px button trails it, mounting only on hover: 16px icon,
3741
+ rgba(0,0,0,0.55) (crisp's own color-mix(fgPrimary 55%) -- the exact
3742
+ formula .crisp-datatable-entity-action's identical muted icon
3743
+ already uses), 6px radius (radius.sm). Reveal is opacity-based,
3744
+ not the mount/unmount Attio's own DOM does, so a keyboard user
3745
+ tabbing to it (:focus-visible) doesn't need the row hovered first --
3746
+ same mechanism DataTable's own row actions (#601) already use. */
3747
+ & .crisp-recordpage-edit-affordance { display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; width: 20px; height: 20px; margin: 0; padding: 0; border: none; border-radius: var(--crisp-radius-sm); background: none; font-family: inherit; color: color-mix(in srgb, var(--crisp-fg-primary) 55%, transparent); cursor: pointer; opacity: 0; transition: opacity .12s, background-color .12s, color .12s; }
3748
+ & .crisp-recordpage-field:hover .crisp-recordpage-edit-affordance, & .crisp-recordpage-edit-affordance:focus-visible { opacity: 1; }
3749
+ & .crisp-recordpage-edit-affordance:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); color: var(--crisp-fg-primary); }
3588
3750
  & .crisp-recordpage-empty { color: var(--crisp-fg-muted); }
3589
3751
  /* #431: measured live on app.attio.com's record page Details column --
3590
3752
  clicking a field's value opens a plain, borderless field exactly
@@ -3677,6 +3839,29 @@
3677
3839
  & .crisp-recordpage-task[data-done] .crisp-recordpage-task-text { text-decoration: line-through; color: var(--crisp-fg-muted); }
3678
3840
  & .crisp-recordpage-emptycard { display: flex; flex-direction: column; align-items: center; gap: var(--crisp-space-1-5); padding: var(--crisp-space-6) var(--crisp-space-3); border: 1px dashed var(--crisp-border-default); border-radius: var(--crisp-radius-xl); color: var(--crisp-fg-muted); font-size: var(--crisp-text-md); text-align: center; }
3679
3841
  & .crisp-recordpage-emptycard svg { color: var(--crisp-fg-muted); opacity: 0.7; }
3842
+ /* #622: the Activity tab's own toolbar -- "Filters" + "+ Add meeting",
3843
+ both the same measured button chrome as the topbar's own action
3844
+ buttons (28px, e.field shadow, 14/500 label). */
3845
+ & .crisp-recordpage-tabtoolbar { display: inline-flex; align-items: center; gap: var(--crisp-space-1-5); }
3846
+ /* #622: Files tab's empty state -- measured live on Attio's own record
3847
+ page (a company with no files uploaded). The 138x138 dotted-grid
3848
+ backdrop is the same measured tile EmptyState's records variant uses
3849
+ (crisp/#603), duplicated here rather than composed through that
3850
+ component because this surface's title (16/600) and body (14/500,
3851
+ 63%-mixed fgPrimary, not the flat fgMuted EmptyState uses) measure to
3852
+ their own values, matching neither of that component's existing
3853
+ variants. */
3854
+ & .crisp-recordpage-panel--center { flex: 1; align-items: center; justify-content: center; }
3855
+ & .crisp-recordpage-illustrated { display: flex; flex-direction: column; align-items: center; gap: var(--crisp-space-1-5); text-align: center; }
3856
+ & .crisp-recordpage-illustrated-icon { display: flex; align-items: center; justify-content: center; width: 138px; height: 138px; margin-bottom: var(--crisp-space-2); color: color-mix(in srgb, var(--crisp-fg-primary) 22%, transparent); background: radial-gradient(circle, color-mix(in srgb, var(--crisp-fg-primary) 12%, transparent) 1.2px, transparent 1.2px) 0 0 / 16px 16px; }
3857
+ & .crisp-recordpage-illustrated-title { font-size: var(--crisp-text-xl); font-weight: var(--crisp-weight-semibold); color: var(--crisp-fg-primary); }
3858
+ /* #988: the Calls tab's own gated state measures a larger 20/24 title
3859
+ than Files/Deals' 16/600 -- Attio's own "empty view" pattern (the
3860
+ same 20/600 EmptyState's page/records variants already carry, not a
3861
+ one-off). */
3862
+ & .crisp-recordpage-illustrated-title--lg { font-size: 20px; line-height: 24px; }
3863
+ & .crisp-recordpage-illustrated-desc { max-width: 320px; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); }
3864
+ & .crisp-recordpage-illustrated-actions { display: inline-flex; align-items: center; justify-content: center; flex-wrap: wrap; gap: var(--crisp-space-1-5); margin-top: var(--crisp-space-2); }
3680
3865
  & .crisp-recordpage-action[data-active] svg { color: #f5b83d; fill: #f5b83d; }
3681
3866
  & .crisp-recordstable-tag { display: inline-flex; align-items: center; height: var(--crisp-size-chip); padding: 0 var(--crisp-space-1); border-radius: var(--crisp-radius-chip); font-size: var(--crisp-text-lg); line-height: 20px; font-weight: var(--crisp-weight-medium); white-space: nowrap; background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); color: color-mix(in srgb, var(--crisp-fg-primary) 82%, transparent); }
3682
3867
  & .crisp-recordstable-tag[data-tone="brand"] { background: color-mix(in srgb, var(--crisp-bg-brand-solid) 14%, transparent); color: color-mix(in srgb, var(--crisp-bg-brand-solid) 82%, var(--crisp-fg-primary)); }
@@ -3686,6 +3871,30 @@
3686
3871
  & .crisp-recordstable-tag[data-tone="purple"] { background: color-mix(in srgb, var(--crisp-bg-purple) 16%, transparent); color: color-mix(in srgb, var(--crisp-bg-purple) 80%, var(--crisp-fg-primary)); }
3687
3872
  & .crisp-recordstable-tag[data-tone="cyan"] { background: color-mix(in srgb, var(--crisp-bg-cyan) 18%, transparent); color: color-mix(in srgb, var(--crisp-bg-cyan) 82%, var(--crisp-fg-primary)); }
3688
3873
  & .crisp-recordstable-tag[data-tone="orange"] { background: color-mix(in srgb, var(--crisp-bg-orange) 16%, transparent); color: color-mix(in srgb, var(--crisp-bg-orange) 82%, var(--crisp-fg-primary)); }
3874
+ /* #620: the "Run workflow" quick action's own popover -- measured live:
3875
+ a centered, top-anchored overlay sharing product/command's own
3876
+ Cmd-K-palette shell exactly (elevation.modal, bgOverlayFrost 60% +
3877
+ blur(15px), radius 2xl/xl outer/inner) -- duplicated here rather than
3878
+ imported, the same "own copy per product surface" choice already
3879
+ made elsewhere in this codebase (product/command sits outside this
3880
+ lane's own product/recordpage ownership). */
3881
+ & .crisp-recordpage-workflow-backdrop { position: fixed; inset: 0; z-index: 60; background: transparent; }
3882
+ & .crisp-recordpage-workflow-positioner { position: fixed; inset: 0; z-index: 61; display: flex; align-items: flex-start; justify-content: center; padding: 15vh var(--crisp-space-4) var(--crisp-space-4); }
3883
+ & .crisp-recordpage-workflow-content { position: relative; display: flex; flex-direction: column; box-sizing: border-box; width: 90vw; max-width: 808px; padding: var(--crisp-space-1); border-radius: var(--crisp-radius-2xl); background: color-mix(in srgb, var(--crisp-bg-overlay-frost) 60%, transparent); backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px); box-shadow: 0 8px 28px -6px var(--crisp-shadow-overlay1), 0 18px 88px -4px var(--crisp-shadow-overlay2), 0 0 1px var(--crisp-shadow-overlay3); opacity: 1; transform: scale(1); transition: opacity .2s ease, transform .2s ease; @starting-style { opacity: 0; transform: scale(0.97); } }
3884
+ & .crisp-recordpage-workflow-card { display: flex; flex-direction: column; box-sizing: border-box; border-radius: var(--crisp-radius-xl); background: var(--crisp-bg-surface); overflow: hidden; }
3885
+ & .crisp-recordpage-workflow-header { display: flex; align-items: center; gap: var(--crisp-space-2); height: 52px; flex-shrink: 0; padding: 0 var(--crisp-space-2) 0 var(--crisp-space-4); }
3886
+ & .crisp-recordpage-workflow-title { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); letter-spacing: -0.07px; color: var(--crisp-fg-primary); }
3887
+ & .crisp-recordpage-workflow-close { display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; width: 28px; height: 28px; margin: 0; padding: 0; border: none; border-radius: var(--crisp-radius-md); background: none; color: color-mix(in srgb, var(--crisp-fg-primary) 55%, transparent); font-family: inherit; cursor: pointer; transition: background-color .12s, color .12s; }
3888
+ & .crisp-recordpage-workflow-close:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); color: var(--crisp-fg-primary); }
3889
+ & .crisp-recordpage-workflow-search { display: flex; align-items: center; min-height: 52px; padding: var(--crisp-space-4); }
3890
+ & .crisp-recordpage-workflow-input { flex: 1; min-width: 0; border: none; outline: none; background: transparent; font-family: inherit; font-size: var(--crisp-text-xl); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-primary); }
3891
+ & .crisp-recordpage-workflow-input::placeholder { color: var(--crisp-fg-muted); }
3892
+ & .crisp-recordpage-workflow-sep { height: 1px; flex-shrink: 0; background: var(--crisp-border-subtle); }
3893
+ & .crisp-recordpage-workflow-empty { display: flex; flex-direction: column; align-items: center; gap: var(--crisp-space-2); padding: var(--crisp-space-6) var(--crisp-space-3); text-align: center; }
3894
+ & .crisp-recordpage-workflow-create { display: inline-flex; align-items: center; gap: var(--crisp-space-1-5); height: 32px; padding: 0 var(--crisp-space-3); margin-top: var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-md); background: var(--crisp-bg-surface); box-shadow: inset 0 0 0 1px var(--crisp-ring-neutral), 0 0 2px rgba(28,40,64,0.18), 0 1px 3px rgba(0,0,0,0.04); font-family: inherit; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-primary); cursor: pointer; transition: background-color .12s; }
3895
+ & .crisp-recordpage-workflow-create:hover { background: var(--crisp-bg-raised); }
3896
+ & .crisp-recordpage-workflow-footer { display: flex; align-items: center; height: 44px; flex-shrink: 0; padding: 0 var(--crisp-space-2-5); border-top: 1px solid var(--crisp-border-subtle); }
3897
+ & .crisp-recordpage-workflow-footer-nav { display: flex; align-items: center; gap: var(--crisp-space-1-5); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); }
3689
3898
  }
3690
3899
 
3691
3900
  @media (prefers-reduced-motion: reduce) {
@@ -3802,6 +4011,20 @@
3802
4011
  }
3803
4012
  }
3804
4013
 
4014
+ .crisp-recordpicker {
4015
+ display: flex; flex-direction: column; box-sizing: border-box; width: 350px; font-family: var(--crisp-font-sans);
4016
+ & .crisp-recordpicker-search { display: flex; align-items: center; gap: var(--crisp-space-2); height: 36px; padding: 0 var(--crisp-space-3); color: var(--crisp-fg-muted); }
4017
+ & .crisp-recordpicker-search svg { flex-shrink: 0; }
4018
+ & .crisp-recordpicker-search-input { flex: 1; min-width: 0; border: none; outline: none; background: none; font-family: inherit; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); line-height: 20px; color: var(--crisp-fg-primary); }
4019
+ & .crisp-recordpicker-search-input::placeholder { color: var(--crisp-fg-muted); }
4020
+ & .crisp-recordpicker-loading { display: flex; align-items: center; justify-content: center; gap: 10px; padding: var(--crisp-space-8) var(--crisp-space-3); color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); line-height: 20px; }
4021
+ & .crisp-recordpicker-empty { padding: var(--crisp-space-4) var(--crisp-space-3); text-align: center; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); }
4022
+ & .crisp-recordpicker-list { display: flex; flex-direction: column; margin: 0; padding: var(--crisp-space-1); list-style: none; max-height: 280px; overflow-y: auto; }
4023
+ & .crisp-recordpicker-option { display: flex; align-items: center; gap: var(--crisp-space-2); width: 100%; box-sizing: border-box; height: 32px; padding: 0 var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-md); background: none; font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); text-align: start; cursor: pointer; }
4024
+ & .crisp-recordpicker-option svg { flex-shrink: 0; color: var(--crisp-fg-muted); }
4025
+ & .crisp-recordpicker-option:hover, & .crisp-recordpicker-option[data-highlighted] { background: var(--crisp-bg-raised); }
4026
+ }
4027
+
3805
4028
  .crisp-richtext {
3806
4029
  display: flex; flex-direction: column; box-sizing: border-box; font-family: var(--crisp-font-sans); color: var(--crisp-fg-primary); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
3807
4030
  & .crisp-rte-title { font-size: 32px; line-height: 36px; font-weight: var(--crisp-weight-semibold); letter-spacing: -0.6px; color: var(--crisp-fg-primary); outline: none; }
@@ -3960,6 +4183,53 @@
3960
4183
  font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium);
3961
4184
  color: color-mix(in srgb, var(--crisp-fg-primary) 50%, transparent);
3962
4185
  }
4186
+
4187
+ /* crisp#568: the "Discard changes" / "Save for everyone ▾" bar a
4188
+ consumer swaps into its own toolbar's trailing slot (TableToolbar's
4189
+ own children prop already documents "right-aligned actions after the
4190
+ count") while the loaded view is dirty -- measured live on
4191
+ app.attio.com replacing that exact slot's usual Import/Export + New
4192
+ button. Not rendered inside SavedViews' own trigger/panel, which
4193
+ stays untouched; this is its own export, SavedViewsSaveBar. */
4194
+ .crisp-savedviews-savebar { display: flex; align-items: center; gap: var(--crisp-space-2); }
4195
+ /* Rest-state color is a 55% color-mix of fgPrimary -- measured
4196
+ identical to recordpanel's own ".crisp-recordpanel-section-action"
4197
+ (its own comment: "measured 10px/400, a lighter mix..." -- font size
4198
+ there was the SAME outer-vs-inner-div miss #688 corrected; the 55%
4199
+ mix itself checks out independently here). Hover repeats crisp's own
4200
+ already-measured Button ghost intent exactly (bgRaised + fgPrimary),
4201
+ confirmed live (hover bg rgba(0,0,0,.04) + ink text matches bgRaised
4202
+ + fgPrimary bit for bit) -- reused, not re-derived. */
4203
+ .crisp-savedviews-savebar-discard {
4204
+ box-sizing: border-box; display: inline-flex; align-items: center; height: 28px;
4205
+ margin: 0; padding-inline: var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-md);
4206
+ background: none; font-family: inherit; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium);
4207
+ color: color-mix(in srgb, var(--crisp-fg-primary) 55%, transparent); cursor: pointer;
4208
+ transition: background-color .12s ease, color .12s ease;
4209
+ }
4210
+ .crisp-savedviews-savebar-discard:hover { background: var(--crisp-bg-raised); color: var(--crisp-fg-primary); }
4211
+ /* the split "Save for everyone ▾" pill -- two adjacent buttons sharing
4212
+ one visual pill (measured: label half rounds only its outer/left
4213
+ corners, the chevron half only its outer/right corners, seamless
4214
+ between). Fill is crisp's OWN measured bgBrandContrast, not Attio's
4215
+ own literal button blue -- the owner's directive is Attio structure/
4216
+ sizing, seed-identity color (crisp direction doc). Hover/active reuse
4217
+ Button's own already-measured primary-intent brightness filter
4218
+ (crisp#910) rather than Attio's own literal darker fill, for the
4219
+ same reason. */
4220
+ .crisp-savedviews-savebar-save-group { display: flex; }
4221
+ .crisp-savedviews-savebar-save, .crisp-savedviews-savebar-save-chevron {
4222
+ box-sizing: border-box; display: inline-flex; align-items: center; justify-content: center;
4223
+ height: 28px; margin: 0; border: none; background: var(--crisp-bg-brand-contrast); color: var(--crisp-fg-on-brand);
4224
+ cursor: pointer; transition: filter .2s;
4225
+ }
4226
+ .crisp-savedviews-savebar-save:hover, .crisp-savedviews-savebar-save-chevron:hover { filter: brightness(0.96); }
4227
+ .crisp-savedviews-savebar-save:active, .crisp-savedviews-savebar-save-chevron:active { filter: brightness(0.92); }
4228
+ .crisp-savedviews-savebar-save {
4229
+ padding-inline: var(--crisp-space-2) var(--crisp-space-1-5); border-radius: var(--crisp-radius-md) 0 0 var(--crisp-radius-md);
4230
+ font-family: inherit; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium);
4231
+ }
4232
+ .crisp-savedviews-savebar-save-chevron { width: 28px; padding: 0; border-radius: 0 var(--crisp-radius-md) var(--crisp-radius-md) 0; }
3963
4233
 
3964
4234
  .crisp-savedviews {
3965
4235
  position: relative; display: inline-flex; font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; /* crisp/#772 follow-up, re-measured live 2026-09-25 in the trigger's
@@ -4036,6 +4306,116 @@
4036
4306
  }
4037
4307
 
4038
4308
 
4309
+ .crisp-share-content {
4310
+ font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
4311
+ position: fixed; z-index: 70; pointer-events: auto; box-sizing: border-box;
4312
+ width: 440px; max-width: 92vw;
4313
+ padding: var(--crisp-space-3); display: flex; flex-direction: column; gap: var(--crisp-space-3);
4314
+ border-radius: var(--crisp-radius-xl); background: var(--crisp-bg-popover); color: var(--crisp-fg-primary);
4315
+ box-shadow: inset 0 0 0 1px var(--crisp-ring-popover), 0 0 0 1px var(--crisp-shadow-popover1), 0 4px 8px -4px var(--crisp-shadow-popover2), 0 4px 12px -2px var(--crisp-shadow-popover3);
4316
+ opacity: 1; transform: none; transform-origin: top right;
4317
+ transition: opacity 0.08s ease, transform 0.08s ease;
4318
+ @starting-style { opacity: 0; transform: scale(0.97) translateY(-1px); }
4319
+ }
4320
+ .crisp-share-content[data-up] { transform-origin: bottom right; }
4321
+
4322
+ .crisp-share-tabs { display: flex; align-items: center; gap: var(--crisp-space-1); }
4323
+ .crisp-share-tab {
4324
+ box-sizing: border-box; display: inline-flex; align-items: center; gap: var(--crisp-space-1-5);
4325
+ height: var(--crisp-size-row); padding: 0 var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-md);
4326
+ background: transparent; color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent);
4327
+ font-family: inherit; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); letter-spacing: -0.07px;
4328
+ cursor: pointer; transition: background-color .12s ease, color .12s ease;
4329
+ }
4330
+ .crisp-share-tab svg { flex-shrink: 0; }
4331
+ .crisp-share-tab:hover { color: var(--crisp-fg-primary); }
4332
+ .crisp-share-tab[aria-selected="true"] { background: var(--crisp-bg-surface-muted); color: var(--crisp-fg-primary); }
4333
+
4334
+ .crisp-share-row { display: flex; align-items: center; gap: var(--crisp-space-2); min-height: 34px; }
4335
+ .crisp-share-row-label { flex: 1; min-width: 0; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-primary); letter-spacing: -0.07px; }
4336
+ .crisp-share-row .crisp-select { flex-shrink: 0; }
4337
+ .crisp-share-row .crisp-select .crisp-select-value,
4338
+ .crisp-share-row .crisp-select .crisp-select-chevron { color: color-mix(in srgb, var(--crisp-fg-primary) 55%, transparent); }
4339
+
4340
+ .crisp-share-clear {
4341
+ align-self: flex-start; margin: 0; padding: 0; border: none; background: none;
4342
+ font-family: inherit; font-size: var(--crisp-text-md); font-weight: var(--crisp-weight-medium);
4343
+ color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); cursor: pointer;
4344
+ }
4345
+ .crisp-share-clear:hover { color: var(--crisp-fg-primary); text-decoration: underline; }
4346
+
4347
+ .crisp-share-section-label {
4348
+ margin: 0; font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: color-mix(in srgb, var(--crisp-fg-primary) 50%, transparent);
4349
+ }
4350
+ .crisp-share-members { display: flex; flex-direction: column; gap: var(--crisp-space-2); }
4351
+ .crisp-share-member { display: flex; align-items: center; gap: var(--crisp-space-2); }
4352
+ .crisp-share-member-text { flex: 1; min-width: 0; display: flex; align-items: baseline; gap: var(--crisp-space-1-5); overflow: hidden; }
4353
+ .crisp-share-member-name { flex-shrink: 0; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-primary); letter-spacing: -0.07px; }
4354
+ .crisp-share-member-email { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); color: color-mix(in srgb, var(--crisp-fg-primary) 55%, transparent); letter-spacing: -0.07px; }
4355
+ .crisp-share-member .crisp-select { flex-shrink: 0; }
4356
+ .crisp-share-member .crisp-select .crisp-select-value,
4357
+ .crisp-share-member .crisp-select .crisp-select-chevron { color: color-mix(in srgb, var(--crisp-fg-primary) 55%, transparent); }
4358
+
4359
+ .crisp-share-automations-row { display: flex; align-items: center; gap: var(--crisp-space-2); }
4360
+ .crisp-share-automations-row .crisp-input { flex: 1; min-width: 0; }
4361
+ .crisp-share-automations-row .crisp-select { flex-shrink: 0; }
4362
+
4363
+ .crisp-share-add {
4364
+ flex-shrink: 0; box-sizing: border-box; display: inline-flex; align-items: center; justify-content: center;
4365
+ height: 32px; padding: 0 var(--crisp-space-2-5); border: none; border-radius: var(--crisp-radius-lg);
4366
+ background: var(--crisp-bg-brand-solid); color: var(--crisp-fg-on-brand);
4367
+ font-family: inherit; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); letter-spacing: -0.07px;
4368
+ cursor: pointer; transition: background-color .12s ease, opacity .12s ease;
4369
+ }
4370
+ .crisp-share-add:hover:not(:disabled) { background: var(--crisp-bg-brand-solid-pressed); }
4371
+ .crisp-share-add:disabled { opacity: 0.4; cursor: not-allowed; }
4372
+
4373
+ .crisp-share-learnmore {
4374
+ display: inline-flex; align-items: center; gap: var(--crisp-space-1-5);
4375
+ font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent);
4376
+ text-decoration: none;
4377
+ }
4378
+ .crisp-share-learnmore:hover { color: var(--crisp-fg-primary); }
4379
+ .crisp-share-learnmore svg { flex-shrink: 0; }
4380
+
4381
+ .crisp-share {
4382
+ display: contents; font-family: var(--crisp-font-sans);
4383
+ }
4384
+
4385
+ @media (prefers-reduced-motion: reduce) {
4386
+ .crisp-share, .crisp-share * {
4387
+ animation-duration: 0.01ms !important;
4388
+ animation-iteration-count: 1 !important;
4389
+ transition-duration: 0.01ms !important;
4390
+ }
4391
+ }
4392
+
4393
+
4394
+ /* Overrides Drawer's own 420px default (specificity: .crisp-drawer
4395
+ .crisp-drawer-content.crisp-shortcutssheet-panel, higher than
4396
+ Drawer's .crisp-drawer .crisp-drawer-content regardless of which
4397
+ chunk of dist/styles.css concatenates first). */
4398
+ .crisp-drawer .crisp-drawer-content.crisp-shortcutssheet-panel { width: 360px; }
4399
+
4400
+ .crisp-shortcutssheet-body { display: flex; flex-direction: column; gap: var(--crisp-space-2-5); }
4401
+ .crisp-shortcutssheet-section-label {
4402
+ font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium);
4403
+ color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent);
4404
+ }
4405
+ .crisp-shortcutssheet-section-label:not(:first-child) { margin-top: var(--crisp-space-2-5); }
4406
+ .crisp-shortcutssheet-row { display: flex; align-items: center; justify-content: space-between; gap: var(--crisp-space-1); }
4407
+ .crisp-shortcutssheet-desc {
4408
+ font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium);
4409
+ color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent);
4410
+ }
4411
+ .crisp-shortcutssheet-keys { display: flex; align-items: center; gap: var(--crisp-space-1); flex-shrink: 0; }
4412
+ .crisp-shortcutssheet-then {
4413
+ font-size: var(--crisp-text-xs); font-weight: var(--crisp-weight-medium);
4414
+ color: color-mix(in srgb, var(--crisp-fg-primary) 50%, transparent);
4415
+ }
4416
+
4417
+
4418
+
4039
4419
  .crisp-sidebar-ws-menu-content { width: 280px; }
4040
4420
 
4041
4421
  .crisp-sidebar {
@@ -4088,6 +4468,43 @@
4088
4468
  & .crisp-statlist-empty { padding: var(--crisp-space-4) 0; text-align: center; font-size: var(--crisp-text-md); color: var(--crisp-fg-muted); }
4089
4469
  }
4090
4470
 
4471
+ .crisp-taskeditpopover { position: fixed; z-index: 70; pointer-events: auto; opacity: 1; transform: scale(1); transition: opacity 0.08s ease, transform 0.08s ease; @starting-style { opacity: 0; transform: scale(0.97) translateY(-4px); } }
4472
+ .crisp-taskeditpopover {
4473
+ display: flex; flex-direction: column; box-sizing: border-box; width: 800px; max-width: 92vw; border-radius: var(--crisp-radius-xl); background: var(--crisp-bg-surface); box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.07); font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
4474
+ & .crisp-taskeditpopover-header { display: flex; align-items: center; justify-content: space-between; gap: var(--crisp-space-2); height: 44px; box-sizing: border-box; padding: 0 var(--crisp-space-2) 0 var(--crisp-space-3); border-bottom: 1px solid var(--crisp-border-subtle); }
4475
+ & .crisp-taskeditpopover-heading { display: flex; align-items: center; gap: var(--crisp-space-1); font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-primary); }
4476
+ & .crisp-taskeditpopover-heading svg { flex-shrink: 0; color: var(--crisp-fg-muted); }
4477
+ & .crisp-taskeditpopover-close { display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; width: 28px; height: 28px; margin: 0; padding: 0; border: none; border-radius: var(--crisp-radius-md); background: none; color: var(--crisp-fg-muted); font-family: inherit; cursor: pointer; }
4478
+ & .crisp-taskeditpopover-close:hover { background: var(--crisp-bg-raised); color: var(--crisp-fg-primary); }
4479
+ & .crisp-taskeditpopover-body { display: flex; align-items: center; gap: var(--crisp-space-2-5); min-height: 52px; box-sizing: border-box; padding: var(--crisp-space-3); }
4480
+ & .crisp-taskeditpopover-check { appearance: none; -webkit-appearance: none; box-sizing: border-box; flex-shrink: 0; margin: 0; width: 16px; height: 16px; border: none; border-radius: var(--crisp-radius-full); background: var(--crisp-bg-surface); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-fg-primary) 9%, transparent); cursor: pointer; }
4481
+ & .crisp-taskeditpopover-check:hover { box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-fg-primary) 30%, transparent); }
4482
+ & .crisp-taskeditpopover-check:checked { background: var(--crisp-bg-brand-solid) center / 10px no-repeat; box-shadow: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2.5 6.5 5 9l4.5-5'/%3E%3C/svg%3E"); }
4483
+ & .crisp-taskeditpopover-title { flex: 1; min-width: 0; border: none; border-radius: var(--crisp-radius-sm); outline: none; background: none; font-family: inherit; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-primary); }
4484
+ & .crisp-taskeditpopover-title:focus-visible { outline: 2px solid var(--crisp-stroke-focus-ring); outline-offset: 2px; }
4485
+ & .crisp-taskeditpopover-footer { display: flex; align-items: center; justify-content: space-between; gap: var(--crisp-space-2); height: 44px; box-sizing: border-box; padding: 0 var(--crisp-space-2) 0 var(--crisp-space-3); }
4486
+ & .crisp-taskeditpopover-chips { display: flex; align-items: center; gap: var(--crisp-space-1); min-width: 0; }
4487
+ & .crisp-taskeditpopover-chip { display: inline-flex; align-items: center; gap: 6px; flex-shrink: 0; height: 28px; box-sizing: border-box; padding: 4px 8px 4px 6px; border: none; border-radius: var(--crisp-radius-md); background: none; color: color-mix(in srgb, var(--crisp-fg-primary) 55%, transparent); font-family: inherit; font-size: 10px; white-space: nowrap; cursor: pointer; }
4488
+ & .crisp-taskeditpopover-chip svg { flex-shrink: 0; }
4489
+ & .crisp-taskeditpopover-chip:hover { background: var(--crisp-bg-raised); }
4490
+ & .crisp-taskeditpopover-actions { display: flex; align-items: center; gap: var(--crisp-space-2); flex-shrink: 0; }
4491
+ & .crisp-taskeditpopover-kebab { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; margin: 0; padding: 6px; border: none; border-radius: var(--crisp-radius-md); background: none; color: var(--crisp-fg-primary); font-family: inherit; cursor: pointer; }
4492
+ & .crisp-taskeditpopover-kebab:hover { background: var(--crisp-bg-raised); }
4493
+ & .crisp-taskeditpopover-cancel { display: inline-flex; align-items: center; gap: 6px; height: 28px; box-sizing: border-box; padding: 4px 6px 4px 8px; border: none; border-radius: var(--crisp-radius-md); background: none; color: var(--crisp-fg-primary); font-family: inherit; font-size: 10px; cursor: pointer; }
4494
+ & .crisp-taskeditpopover-cancel:hover { background: var(--crisp-bg-raised); }
4495
+ & .crisp-taskeditpopover-save { display: inline-flex; align-items: center; gap: 6px; height: 28px; box-sizing: border-box; padding: 4px 6px 4px 8px; border: none; border-radius: var(--crisp-radius-md); background: var(--crisp-bg-brand-solid); color: var(--crisp-fg-on-brand); font-family: inherit; font-size: 10px; cursor: pointer; }
4496
+ & .crisp-taskeditpopover-save:hover { background: var(--crisp-bg-brand-solid-pressed); }
4497
+ & .crisp-taskeditpopover-key { color: color-mix(in srgb, currentColor 55%, transparent); font-size: 10px; }
4498
+ }
4499
+
4500
+ @media (prefers-reduced-motion: reduce) {
4501
+ .crisp-taskeditpopover, .crisp-taskeditpopover * {
4502
+ animation-duration: 0.01ms !important;
4503
+ animation-iteration-count: 1 !important;
4504
+ transition-duration: 0.01ms !important;
4505
+ }
4506
+ }
4507
+
4091
4508
  .crisp-tasklist {
4092
4509
  display: flex; flex-direction: column; box-sizing: border-box; font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
4093
4510
  & .crisp-tasklist-group { display: flex; align-items: center; gap: var(--crisp-space-1-5); height: 36px; padding: 0 var(--crisp-space-2); font-size: var(--crisp-text-md); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-muted); }
@@ -4207,3 +4624,8 @@
4207
4624
  & .crisp-workspacegeneralsettings-rowtitle { font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-primary); }
4208
4625
  & .crisp-workspacegeneralsettings-dangerwarning { font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); }
4209
4626
  }
4627
+
4628
+
4629
+ [dir="rtl"] .crisp-menu-item svg[data-rtl-flip] { transform: scaleX(-1); }
4630
+ .crisp-menu-item svg.crisp-workspaceswitchermenu-check { color: var(--crisp-fg-brand-contrast); }
4631
+