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