@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
@@ -73,7 +73,20 @@ export const tokens = {
73
73
  "strokeSelectInvalid": "#fa342c",
74
74
  "strokeSelectDivider": "#00000010",
75
75
  "fgSelectPlaceholder": "#b0b3ba",
76
- "shadowSelect": "#0000001f"
76
+ "shadowSelect": "#0000001f",
77
+ "bgTagSwatch1": "#fff3cc",
78
+ "bgTagSwatch2": "#f4fbcb",
79
+ "bgTagSwatch3": "#fdf7c4",
80
+ "bgTagSwatch4": "#feecf3",
81
+ "bgTagSwatch5": "#e0fced",
82
+ "bgTagSwatch6": "#ddf7ff",
83
+ "bgTagSwatch7": "#f6f7f7",
84
+ "bgTagSwatch8": "#ffebeb",
85
+ "bgTagSwatch9": "#feeee1",
86
+ "bgTagSwatch10": "#e5eeff",
87
+ "bgTagSwatch11": "#f5f0ff",
88
+ "bgTagSwatch12": "#fdedff",
89
+ "fgTagSwatch": "#000000"
77
90
  },
78
91
  "dark": {
79
92
  "bgBrandSolid": "#0298d9",
@@ -145,7 +158,20 @@ export const tokens = {
145
158
  "strokeSelectInvalid": "#ff6e60",
146
159
  "strokeSelectDivider": "#ffffff17",
147
160
  "fgSelectPlaceholder": "#868b94",
148
- "shadowSelect": "#000000cc"
161
+ "shadowSelect": "#000000cc",
162
+ "bgTagSwatch1": "#fff3cc",
163
+ "bgTagSwatch2": "#f4fbcb",
164
+ "bgTagSwatch3": "#fdf7c4",
165
+ "bgTagSwatch4": "#feecf3",
166
+ "bgTagSwatch5": "#e0fced",
167
+ "bgTagSwatch6": "#ddf7ff",
168
+ "bgTagSwatch7": "#f6f7f7",
169
+ "bgTagSwatch8": "#ffebeb",
170
+ "bgTagSwatch9": "#feeee1",
171
+ "bgTagSwatch10": "#e5eeff",
172
+ "bgTagSwatch11": "#f5f0ff",
173
+ "bgTagSwatch12": "#fdedff",
174
+ "fgTagSwatch": "#000000"
149
175
  }
150
176
  },
151
177
  "palette": {
@@ -215,7 +241,20 @@ export const tokens = {
215
241
  "selectInvalidStroke": "#fa342c",
216
242
  "selectDivider": "#00000010",
217
243
  "selectPlaceholder": "#b0b3ba",
218
- "selectShadow": "#0000001f"
244
+ "selectShadow": "#0000001f",
245
+ "tagSwatch1": "#fff3cc",
246
+ "tagSwatch2": "#f4fbcb",
247
+ "tagSwatch3": "#fdf7c4",
248
+ "tagSwatch4": "#feecf3",
249
+ "tagSwatch5": "#e0fced",
250
+ "tagSwatch6": "#ddf7ff",
251
+ "tagSwatch7": "#f6f7f7",
252
+ "tagSwatch8": "#ffebeb",
253
+ "tagSwatch9": "#feeee1",
254
+ "tagSwatch10": "#e5eeff",
255
+ "tagSwatch11": "#f5f0ff",
256
+ "tagSwatch12": "#fdedff",
257
+ "tagSwatchInk": "#000000"
219
258
  },
220
259
  "dark": {
221
260
  "gray00": "#0a0a0a",
@@ -283,7 +322,20 @@ export const tokens = {
283
322
  "selectInvalidStroke": "#ff6e60",
284
323
  "selectDivider": "#ffffff17",
285
324
  "selectPlaceholder": "#868b94",
286
- "selectShadow": "#000000cc"
325
+ "selectShadow": "#000000cc",
326
+ "tagSwatch1": "#fff3cc",
327
+ "tagSwatch2": "#f4fbcb",
328
+ "tagSwatch3": "#fdf7c4",
329
+ "tagSwatch4": "#feecf3",
330
+ "tagSwatch5": "#e0fced",
331
+ "tagSwatch6": "#ddf7ff",
332
+ "tagSwatch7": "#f6f7f7",
333
+ "tagSwatch8": "#ffebeb",
334
+ "tagSwatch9": "#feeee1",
335
+ "tagSwatch10": "#e5eeff",
336
+ "tagSwatch11": "#f5f0ff",
337
+ "tagSwatch12": "#fdedff",
338
+ "tagSwatchInk": "#000000"
287
339
  }
288
340
  },
289
341
  "space": {
@@ -0,0 +1,15 @@
1
+ .crisp-notesgallery {
2
+ 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;
3
+ & .crisp-notesgallery-tabs { display: flex; align-items: center; gap: var(--crisp-space-2); height: 44px; flex-shrink: 0; padding: 0 var(--crisp-space-3); }
4
+ & .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); }
5
+ & .crisp-notesgallery-toolbar-trail { display: flex; align-items: center; gap: var(--crisp-space-2); margin-inline-start: auto; }
6
+ & .crisp-notesgallery-favorites-section { background: var(--crisp-bg-subtle); box-shadow: inset 0 -1px 0 var(--crisp-border-subtle); }
7
+ & .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); }
8
+ & .crisp-notesgallery-favorites { display: flex; align-items: center; justify-content: center; min-height: 200px; padding: var(--crisp-space-6); }
9
+ & .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); }
10
+ & .crisp-notesgallery-body { flex: 1; min-height: 0; overflow-y: auto; padding: 0 var(--crisp-space-3) var(--crisp-space-3); }
11
+ & .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); }
12
+ & .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); }
13
+ & .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); }
14
+ & .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); }
15
+ }
@@ -0,0 +1,7 @@
1
+ import type { RecipeFn } from "../core/types";
2
+
3
+ export interface NotesgalleryVariants {
4
+
5
+ }
6
+
7
+ export declare const notesgalleryRecipe: RecipeFn<{ }>;
@@ -0,0 +1,17 @@
1
+ @layer crisp-components {
2
+ .crisp-notesgallery {
3
+ 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;
4
+ & .crisp-notesgallery-tabs { display: flex; align-items: center; gap: var(--crisp-space-2); height: 44px; flex-shrink: 0; padding: 0 var(--crisp-space-3); }
5
+ & .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); }
6
+ & .crisp-notesgallery-toolbar-trail { display: flex; align-items: center; gap: var(--crisp-space-2); margin-inline-start: auto; }
7
+ & .crisp-notesgallery-favorites-section { background: var(--crisp-bg-subtle); box-shadow: inset 0 -1px 0 var(--crisp-border-subtle); }
8
+ & .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); }
9
+ & .crisp-notesgallery-favorites { display: flex; align-items: center; justify-content: center; min-height: 200px; padding: var(--crisp-space-6); }
10
+ & .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); }
11
+ & .crisp-notesgallery-body { flex: 1; min-height: 0; overflow-y: auto; padding: 0 var(--crisp-space-3) var(--crisp-space-3); }
12
+ & .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); }
13
+ & .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); }
14
+ & .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); }
15
+ & .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); }
16
+ }
17
+ }
@@ -0,0 +1,3 @@
1
+
2
+ [dir="rtl"] .crisp-menu-item svg[data-rtl-flip] { transform: scaleX(-1); }
3
+
@@ -0,0 +1,7 @@
1
+ import type { RecipeFn } from "../core/types";
2
+
3
+ export interface ObjectpagemenuVariants {
4
+
5
+ }
6
+
7
+ export declare const objectpagemenuRecipe: RecipeFn<{ }>;
@@ -0,0 +1,5 @@
1
+ @layer crisp-components {
2
+
3
+ [dir="rtl"] .crisp-menu-item svg[data-rtl-flip] { transform: scaleX(-1); }
4
+
5
+ }
@@ -101,6 +101,18 @@
101
101
  the component's own comment) -- NOT `display: contents`, which
102
102
  drops a button's accessible semantics in some engines. */
103
103
  & .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; }
104
+ /* #990: measured live on app.attio.com's URL/domain attribute (hover the
105
+ row) -- the link itself never carries the edit affordance, a
106
+ separate 20px button trails it, mounting only on hover: 16px icon,
107
+ rgba(0,0,0,0.55) (crisp's own color-mix(fgPrimary 55%) -- the exact
108
+ formula .crisp-datatable-entity-action's identical muted icon
109
+ already uses), 6px radius (radius.sm). Reveal is opacity-based,
110
+ not the mount/unmount Attio's own DOM does, so a keyboard user
111
+ tabbing to it (:focus-visible) doesn't need the row hovered first --
112
+ same mechanism DataTable's own row actions (#601) already use. */
113
+ & .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; }
114
+ & .crisp-recordpage-field:hover .crisp-recordpage-edit-affordance, & .crisp-recordpage-edit-affordance:focus-visible { opacity: 1; }
115
+ & .crisp-recordpage-edit-affordance:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); color: var(--crisp-fg-primary); }
104
116
  & .crisp-recordpage-empty { color: var(--crisp-fg-muted); }
105
117
  /* #431: measured live on app.attio.com's record page Details column --
106
118
  clicking a field's value opens a plain, borderless field exactly
@@ -193,6 +205,29 @@
193
205
  & .crisp-recordpage-task[data-done] .crisp-recordpage-task-text { text-decoration: line-through; color: var(--crisp-fg-muted); }
194
206
  & .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; }
195
207
  & .crisp-recordpage-emptycard svg { color: var(--crisp-fg-muted); opacity: 0.7; }
208
+ /* #622: the Activity tab's own toolbar -- "Filters" + "+ Add meeting",
209
+ both the same measured button chrome as the topbar's own action
210
+ buttons (28px, e.field shadow, 14/500 label). */
211
+ & .crisp-recordpage-tabtoolbar { display: inline-flex; align-items: center; gap: var(--crisp-space-1-5); }
212
+ /* #622: Files tab's empty state -- measured live on Attio's own record
213
+ page (a company with no files uploaded). The 138x138 dotted-grid
214
+ backdrop is the same measured tile EmptyState's records variant uses
215
+ (crisp/#603), duplicated here rather than composed through that
216
+ component because this surface's title (16/600) and body (14/500,
217
+ 63%-mixed fgPrimary, not the flat fgMuted EmptyState uses) measure to
218
+ their own values, matching neither of that component's existing
219
+ variants. */
220
+ & .crisp-recordpage-panel--center { flex: 1; align-items: center; justify-content: center; }
221
+ & .crisp-recordpage-illustrated { display: flex; flex-direction: column; align-items: center; gap: var(--crisp-space-1-5); text-align: center; }
222
+ & .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; }
223
+ & .crisp-recordpage-illustrated-title { font-size: var(--crisp-text-xl); font-weight: var(--crisp-weight-semibold); color: var(--crisp-fg-primary); }
224
+ /* #988: the Calls tab's own gated state measures a larger 20/24 title
225
+ than Files/Deals' 16/600 -- Attio's own "empty view" pattern (the
226
+ same 20/600 EmptyState's page/records variants already carry, not a
227
+ one-off). */
228
+ & .crisp-recordpage-illustrated-title--lg { font-size: 20px; line-height: 24px; }
229
+ & .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); }
230
+ & .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); }
196
231
  & .crisp-recordpage-action[data-active] svg { color: #f5b83d; fill: #f5b83d; }
197
232
  & .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); }
198
233
  & .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)); }
@@ -202,6 +237,30 @@
202
237
  & .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)); }
203
238
  & .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)); }
204
239
  & .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)); }
240
+ /* #620: the "Run workflow" quick action's own popover -- measured live:
241
+ a centered, top-anchored overlay sharing product/command's own
242
+ Cmd-K-palette shell exactly (elevation.modal, bgOverlayFrost 60% +
243
+ blur(15px), radius 2xl/xl outer/inner) -- duplicated here rather than
244
+ imported, the same "own copy per product surface" choice already
245
+ made elsewhere in this codebase (product/command sits outside this
246
+ lane's own product/recordpage ownership). */
247
+ & .crisp-recordpage-workflow-backdrop { position: fixed; inset: 0; z-index: 60; background: transparent; }
248
+ & .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); }
249
+ & .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); } }
250
+ & .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; }
251
+ & .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); }
252
+ & .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); }
253
+ & .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; }
254
+ & .crisp-recordpage-workflow-close:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); color: var(--crisp-fg-primary); }
255
+ & .crisp-recordpage-workflow-search { display: flex; align-items: center; min-height: 52px; padding: var(--crisp-space-4); }
256
+ & .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); }
257
+ & .crisp-recordpage-workflow-input::placeholder { color: var(--crisp-fg-muted); }
258
+ & .crisp-recordpage-workflow-sep { height: 1px; flex-shrink: 0; background: var(--crisp-border-subtle); }
259
+ & .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; }
260
+ & .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; }
261
+ & .crisp-recordpage-workflow-create:hover { background: var(--crisp-bg-raised); }
262
+ & .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); }
263
+ & .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); }
205
264
  }
206
265
 
207
266
  @media (prefers-reduced-motion: reduce) {
@@ -102,6 +102,18 @@
102
102
  the component's own comment) -- NOT `display: contents`, which
103
103
  drops a button's accessible semantics in some engines. */
104
104
  & .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; }
105
+ /* #990: measured live on app.attio.com's URL/domain attribute (hover the
106
+ row) -- the link itself never carries the edit affordance, a
107
+ separate 20px button trails it, mounting only on hover: 16px icon,
108
+ rgba(0,0,0,0.55) (crisp's own color-mix(fgPrimary 55%) -- the exact
109
+ formula .crisp-datatable-entity-action's identical muted icon
110
+ already uses), 6px radius (radius.sm). Reveal is opacity-based,
111
+ not the mount/unmount Attio's own DOM does, so a keyboard user
112
+ tabbing to it (:focus-visible) doesn't need the row hovered first --
113
+ same mechanism DataTable's own row actions (#601) already use. */
114
+ & .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; }
115
+ & .crisp-recordpage-field:hover .crisp-recordpage-edit-affordance, & .crisp-recordpage-edit-affordance:focus-visible { opacity: 1; }
116
+ & .crisp-recordpage-edit-affordance:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); color: var(--crisp-fg-primary); }
105
117
  & .crisp-recordpage-empty { color: var(--crisp-fg-muted); }
106
118
  /* #431: measured live on app.attio.com's record page Details column --
107
119
  clicking a field's value opens a plain, borderless field exactly
@@ -194,6 +206,29 @@
194
206
  & .crisp-recordpage-task[data-done] .crisp-recordpage-task-text { text-decoration: line-through; color: var(--crisp-fg-muted); }
195
207
  & .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; }
196
208
  & .crisp-recordpage-emptycard svg { color: var(--crisp-fg-muted); opacity: 0.7; }
209
+ /* #622: the Activity tab's own toolbar -- "Filters" + "+ Add meeting",
210
+ both the same measured button chrome as the topbar's own action
211
+ buttons (28px, e.field shadow, 14/500 label). */
212
+ & .crisp-recordpage-tabtoolbar { display: inline-flex; align-items: center; gap: var(--crisp-space-1-5); }
213
+ /* #622: Files tab's empty state -- measured live on Attio's own record
214
+ page (a company with no files uploaded). The 138x138 dotted-grid
215
+ backdrop is the same measured tile EmptyState's records variant uses
216
+ (crisp/#603), duplicated here rather than composed through that
217
+ component because this surface's title (16/600) and body (14/500,
218
+ 63%-mixed fgPrimary, not the flat fgMuted EmptyState uses) measure to
219
+ their own values, matching neither of that component's existing
220
+ variants. */
221
+ & .crisp-recordpage-panel--center { flex: 1; align-items: center; justify-content: center; }
222
+ & .crisp-recordpage-illustrated { display: flex; flex-direction: column; align-items: center; gap: var(--crisp-space-1-5); text-align: center; }
223
+ & .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; }
224
+ & .crisp-recordpage-illustrated-title { font-size: var(--crisp-text-xl); font-weight: var(--crisp-weight-semibold); color: var(--crisp-fg-primary); }
225
+ /* #988: the Calls tab's own gated state measures a larger 20/24 title
226
+ than Files/Deals' 16/600 -- Attio's own "empty view" pattern (the
227
+ same 20/600 EmptyState's page/records variants already carry, not a
228
+ one-off). */
229
+ & .crisp-recordpage-illustrated-title--lg { font-size: 20px; line-height: 24px; }
230
+ & .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); }
231
+ & .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); }
197
232
  & .crisp-recordpage-action[data-active] svg { color: #f5b83d; fill: #f5b83d; }
198
233
  & .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); }
199
234
  & .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)); }
@@ -203,6 +238,30 @@
203
238
  & .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)); }
204
239
  & .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)); }
205
240
  & .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)); }
241
+ /* #620: the "Run workflow" quick action's own popover -- measured live:
242
+ a centered, top-anchored overlay sharing product/command's own
243
+ Cmd-K-palette shell exactly (elevation.modal, bgOverlayFrost 60% +
244
+ blur(15px), radius 2xl/xl outer/inner) -- duplicated here rather than
245
+ imported, the same "own copy per product surface" choice already
246
+ made elsewhere in this codebase (product/command sits outside this
247
+ lane's own product/recordpage ownership). */
248
+ & .crisp-recordpage-workflow-backdrop { position: fixed; inset: 0; z-index: 60; background: transparent; }
249
+ & .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); }
250
+ & .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); } }
251
+ & .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; }
252
+ & .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); }
253
+ & .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); }
254
+ & .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; }
255
+ & .crisp-recordpage-workflow-close:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); color: var(--crisp-fg-primary); }
256
+ & .crisp-recordpage-workflow-search { display: flex; align-items: center; min-height: 52px; padding: var(--crisp-space-4); }
257
+ & .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); }
258
+ & .crisp-recordpage-workflow-input::placeholder { color: var(--crisp-fg-muted); }
259
+ & .crisp-recordpage-workflow-sep { height: 1px; flex-shrink: 0; background: var(--crisp-border-subtle); }
260
+ & .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; }
261
+ & .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; }
262
+ & .crisp-recordpage-workflow-create:hover { background: var(--crisp-bg-raised); }
263
+ & .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); }
264
+ & .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); }
206
265
  }
207
266
 
208
267
  @media (prefers-reduced-motion: reduce) {
@@ -0,0 +1,13 @@
1
+ .crisp-recordpicker {
2
+ display: flex; flex-direction: column; box-sizing: border-box; width: 350px; font-family: var(--crisp-font-sans);
3
+ & .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); }
4
+ & .crisp-recordpicker-search svg { flex-shrink: 0; }
5
+ & .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); }
6
+ & .crisp-recordpicker-search-input::placeholder { color: var(--crisp-fg-muted); }
7
+ & .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; }
8
+ & .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); }
9
+ & .crisp-recordpicker-list { display: flex; flex-direction: column; margin: 0; padding: var(--crisp-space-1); list-style: none; max-height: 280px; overflow-y: auto; }
10
+ & .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; }
11
+ & .crisp-recordpicker-option svg { flex-shrink: 0; color: var(--crisp-fg-muted); }
12
+ & .crisp-recordpicker-option:hover, & .crisp-recordpicker-option[data-highlighted] { background: var(--crisp-bg-raised); }
13
+ }
@@ -0,0 +1,7 @@
1
+ import type { RecipeFn } from "../core/types";
2
+
3
+ export interface RecordpickerVariants {
4
+
5
+ }
6
+
7
+ export declare const recordpickerRecipe: RecipeFn<{ }>;
@@ -0,0 +1,15 @@
1
+ @layer crisp-components {
2
+ .crisp-recordpicker {
3
+ display: flex; flex-direction: column; box-sizing: border-box; width: 350px; font-family: var(--crisp-font-sans);
4
+ & .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); }
5
+ & .crisp-recordpicker-search svg { flex-shrink: 0; }
6
+ & .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); }
7
+ & .crisp-recordpicker-search-input::placeholder { color: var(--crisp-fg-muted); }
8
+ & .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; }
9
+ & .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); }
10
+ & .crisp-recordpicker-list { display: flex; flex-direction: column; margin: 0; padding: var(--crisp-space-1); list-style: none; max-height: 280px; overflow-y: auto; }
11
+ & .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; }
12
+ & .crisp-recordpicker-option svg { flex-shrink: 0; color: var(--crisp-fg-muted); }
13
+ & .crisp-recordpicker-option:hover, & .crisp-recordpicker-option[data-highlighted] { background: var(--crisp-bg-raised); }
14
+ }
15
+ }
@@ -71,6 +71,53 @@
71
71
  font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium);
72
72
  color: color-mix(in srgb, var(--crisp-fg-primary) 50%, transparent);
73
73
  }
74
+
75
+ /* crisp#568: the "Discard changes" / "Save for everyone ▾" bar a
76
+ consumer swaps into its own toolbar's trailing slot (TableToolbar's
77
+ own children prop already documents "right-aligned actions after the
78
+ count") while the loaded view is dirty -- measured live on
79
+ app.attio.com replacing that exact slot's usual Import/Export + New
80
+ button. Not rendered inside SavedViews' own trigger/panel, which
81
+ stays untouched; this is its own export, SavedViewsSaveBar. */
82
+ .crisp-savedviews-savebar { display: flex; align-items: center; gap: var(--crisp-space-2); }
83
+ /* Rest-state color is a 55% color-mix of fgPrimary -- measured
84
+ identical to recordpanel's own ".crisp-recordpanel-section-action"
85
+ (its own comment: "measured 10px/400, a lighter mix..." -- font size
86
+ there was the SAME outer-vs-inner-div miss #688 corrected; the 55%
87
+ mix itself checks out independently here). Hover repeats crisp's own
88
+ already-measured Button ghost intent exactly (bgRaised + fgPrimary),
89
+ confirmed live (hover bg rgba(0,0,0,.04) + ink text matches bgRaised
90
+ + fgPrimary bit for bit) -- reused, not re-derived. */
91
+ .crisp-savedviews-savebar-discard {
92
+ box-sizing: border-box; display: inline-flex; align-items: center; height: 28px;
93
+ margin: 0; padding-inline: var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-md);
94
+ background: none; font-family: inherit; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium);
95
+ color: color-mix(in srgb, var(--crisp-fg-primary) 55%, transparent); cursor: pointer;
96
+ transition: background-color .12s ease, color .12s ease;
97
+ }
98
+ .crisp-savedviews-savebar-discard:hover { background: var(--crisp-bg-raised); color: var(--crisp-fg-primary); }
99
+ /* the split "Save for everyone ▾" pill -- two adjacent buttons sharing
100
+ one visual pill (measured: label half rounds only its outer/left
101
+ corners, the chevron half only its outer/right corners, seamless
102
+ between). Fill is crisp's OWN measured bgBrandContrast, not Attio's
103
+ own literal button blue -- the owner's directive is Attio structure/
104
+ sizing, seed-identity color (crisp direction doc). Hover/active reuse
105
+ Button's own already-measured primary-intent brightness filter
106
+ (crisp#910) rather than Attio's own literal darker fill, for the
107
+ same reason. */
108
+ .crisp-savedviews-savebar-save-group { display: flex; }
109
+ .crisp-savedviews-savebar-save, .crisp-savedviews-savebar-save-chevron {
110
+ box-sizing: border-box; display: inline-flex; align-items: center; justify-content: center;
111
+ height: 28px; margin: 0; border: none; background: var(--crisp-bg-brand-contrast); color: var(--crisp-fg-on-brand);
112
+ cursor: pointer; transition: filter .2s;
113
+ }
114
+ .crisp-savedviews-savebar-save:hover, .crisp-savedviews-savebar-save-chevron:hover { filter: brightness(0.96); }
115
+ .crisp-savedviews-savebar-save:active, .crisp-savedviews-savebar-save-chevron:active { filter: brightness(0.92); }
116
+ .crisp-savedviews-savebar-save {
117
+ padding-inline: var(--crisp-space-2) var(--crisp-space-1-5); border-radius: var(--crisp-radius-md) 0 0 var(--crisp-radius-md);
118
+ font-family: inherit; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium);
119
+ }
120
+ .crisp-savedviews-savebar-save-chevron { width: 28px; padding: 0; border-radius: 0 var(--crisp-radius-md) var(--crisp-radius-md) 0; }
74
121
 
75
122
  .crisp-savedviews {
76
123
  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
@@ -72,6 +72,53 @@
72
72
  font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium);
73
73
  color: color-mix(in srgb, var(--crisp-fg-primary) 50%, transparent);
74
74
  }
75
+
76
+ /* crisp#568: the "Discard changes" / "Save for everyone ▾" bar a
77
+ consumer swaps into its own toolbar's trailing slot (TableToolbar's
78
+ own children prop already documents "right-aligned actions after the
79
+ count") while the loaded view is dirty -- measured live on
80
+ app.attio.com replacing that exact slot's usual Import/Export + New
81
+ button. Not rendered inside SavedViews' own trigger/panel, which
82
+ stays untouched; this is its own export, SavedViewsSaveBar. */
83
+ .crisp-savedviews-savebar { display: flex; align-items: center; gap: var(--crisp-space-2); }
84
+ /* Rest-state color is a 55% color-mix of fgPrimary -- measured
85
+ identical to recordpanel's own ".crisp-recordpanel-section-action"
86
+ (its own comment: "measured 10px/400, a lighter mix..." -- font size
87
+ there was the SAME outer-vs-inner-div miss #688 corrected; the 55%
88
+ mix itself checks out independently here). Hover repeats crisp's own
89
+ already-measured Button ghost intent exactly (bgRaised + fgPrimary),
90
+ confirmed live (hover bg rgba(0,0,0,.04) + ink text matches bgRaised
91
+ + fgPrimary bit for bit) -- reused, not re-derived. */
92
+ .crisp-savedviews-savebar-discard {
93
+ box-sizing: border-box; display: inline-flex; align-items: center; height: 28px;
94
+ margin: 0; padding-inline: var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-md);
95
+ background: none; font-family: inherit; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium);
96
+ color: color-mix(in srgb, var(--crisp-fg-primary) 55%, transparent); cursor: pointer;
97
+ transition: background-color .12s ease, color .12s ease;
98
+ }
99
+ .crisp-savedviews-savebar-discard:hover { background: var(--crisp-bg-raised); color: var(--crisp-fg-primary); }
100
+ /* the split "Save for everyone ▾" pill -- two adjacent buttons sharing
101
+ one visual pill (measured: label half rounds only its outer/left
102
+ corners, the chevron half only its outer/right corners, seamless
103
+ between). Fill is crisp's OWN measured bgBrandContrast, not Attio's
104
+ own literal button blue -- the owner's directive is Attio structure/
105
+ sizing, seed-identity color (crisp direction doc). Hover/active reuse
106
+ Button's own already-measured primary-intent brightness filter
107
+ (crisp#910) rather than Attio's own literal darker fill, for the
108
+ same reason. */
109
+ .crisp-savedviews-savebar-save-group { display: flex; }
110
+ .crisp-savedviews-savebar-save, .crisp-savedviews-savebar-save-chevron {
111
+ box-sizing: border-box; display: inline-flex; align-items: center; justify-content: center;
112
+ height: 28px; margin: 0; border: none; background: var(--crisp-bg-brand-contrast); color: var(--crisp-fg-on-brand);
113
+ cursor: pointer; transition: filter .2s;
114
+ }
115
+ .crisp-savedviews-savebar-save:hover, .crisp-savedviews-savebar-save-chevron:hover { filter: brightness(0.96); }
116
+ .crisp-savedviews-savebar-save:active, .crisp-savedviews-savebar-save-chevron:active { filter: brightness(0.92); }
117
+ .crisp-savedviews-savebar-save {
118
+ padding-inline: var(--crisp-space-2) var(--crisp-space-1-5); border-radius: var(--crisp-radius-md) 0 0 var(--crisp-radius-md);
119
+ font-family: inherit; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium);
120
+ }
121
+ .crisp-savedviews-savebar-save-chevron { width: 28px; padding: 0; border-radius: 0 var(--crisp-radius-md) var(--crisp-radius-md) 0; }
75
122
 
76
123
  .crisp-savedviews {
77
124
  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
package/dist/select.css CHANGED
@@ -62,6 +62,25 @@
62
62
  .crisp-select-option[data-disabled] .crisp-select-option-description,
63
63
  .crisp-select-option[data-disabled] .crisp-select-option-check { color: var(--crisp-fg-disabled); }
64
64
  .crisp-select-option-dot { flex-shrink: 0; width: 8px; height: 8px; border-radius: var(--crisp-radius-full); margin-inline-end: var(--crisp-space-2); }
65
+ /* your-moon/crisp#998: Attio's own 12-colour tag palette (measured live,
66
+ see tokens/palette.ts's tagSwatch1 comment) -- the label itself as a
67
+ filled pill, not a dot beside it. 7px radius/10px text have no
68
+ matching step in the shared scale (radius.xs is 4px, .sm is 6px;
69
+ text.xs is 11px), so both are the measured literals, same as
70
+ DataTable's own avatar font-size (#891). */
71
+ .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); }
72
+ .crisp-select-swatch[data-swatch="1"] { background: var(--crisp-bg-tag-swatch1); }
73
+ .crisp-select-swatch[data-swatch="2"] { background: var(--crisp-bg-tag-swatch2); }
74
+ .crisp-select-swatch[data-swatch="3"] { background: var(--crisp-bg-tag-swatch3); }
75
+ .crisp-select-swatch[data-swatch="4"] { background: var(--crisp-bg-tag-swatch4); }
76
+ .crisp-select-swatch[data-swatch="5"] { background: var(--crisp-bg-tag-swatch5); }
77
+ .crisp-select-swatch[data-swatch="6"] { background: var(--crisp-bg-tag-swatch6); }
78
+ .crisp-select-swatch[data-swatch="7"] { background: var(--crisp-bg-tag-swatch7); }
79
+ .crisp-select-swatch[data-swatch="8"] { background: var(--crisp-bg-tag-swatch8); }
80
+ .crisp-select-swatch[data-swatch="9"] { background: var(--crisp-bg-tag-swatch9); }
81
+ .crisp-select-swatch[data-swatch="10"] { background: var(--crisp-bg-tag-swatch10); }
82
+ .crisp-select-swatch[data-swatch="11"] { background: var(--crisp-bg-tag-swatch11); }
83
+ .crisp-select-swatch[data-swatch="12"] { background: var(--crisp-bg-tag-swatch12); }
65
84
  .crisp-select-option-body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: var(--crisp-space-0-5); }
66
85
  .crisp-select-option-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
67
86
  .crisp-select-option-description { min-width: 0; overflow: hidden; text-overflow: ellipsis; color: var(--crisp-fg-neutral-subtle); }
@@ -63,6 +63,25 @@
63
63
  .crisp-select-option[data-disabled] .crisp-select-option-description,
64
64
  .crisp-select-option[data-disabled] .crisp-select-option-check { color: var(--crisp-fg-disabled); }
65
65
  .crisp-select-option-dot { flex-shrink: 0; width: 8px; height: 8px; border-radius: var(--crisp-radius-full); margin-inline-end: var(--crisp-space-2); }
66
+ /* your-moon/crisp#998: Attio's own 12-colour tag palette (measured live,
67
+ see tokens/palette.ts's tagSwatch1 comment) -- the label itself as a
68
+ filled pill, not a dot beside it. 7px radius/10px text have no
69
+ matching step in the shared scale (radius.xs is 4px, .sm is 6px;
70
+ text.xs is 11px), so both are the measured literals, same as
71
+ DataTable's own avatar font-size (#891). */
72
+ .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); }
73
+ .crisp-select-swatch[data-swatch="1"] { background: var(--crisp-bg-tag-swatch1); }
74
+ .crisp-select-swatch[data-swatch="2"] { background: var(--crisp-bg-tag-swatch2); }
75
+ .crisp-select-swatch[data-swatch="3"] { background: var(--crisp-bg-tag-swatch3); }
76
+ .crisp-select-swatch[data-swatch="4"] { background: var(--crisp-bg-tag-swatch4); }
77
+ .crisp-select-swatch[data-swatch="5"] { background: var(--crisp-bg-tag-swatch5); }
78
+ .crisp-select-swatch[data-swatch="6"] { background: var(--crisp-bg-tag-swatch6); }
79
+ .crisp-select-swatch[data-swatch="7"] { background: var(--crisp-bg-tag-swatch7); }
80
+ .crisp-select-swatch[data-swatch="8"] { background: var(--crisp-bg-tag-swatch8); }
81
+ .crisp-select-swatch[data-swatch="9"] { background: var(--crisp-bg-tag-swatch9); }
82
+ .crisp-select-swatch[data-swatch="10"] { background: var(--crisp-bg-tag-swatch10); }
83
+ .crisp-select-swatch[data-swatch="11"] { background: var(--crisp-bg-tag-swatch11); }
84
+ .crisp-select-swatch[data-swatch="12"] { background: var(--crisp-bg-tag-swatch12); }
66
85
  .crisp-select-option-body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: var(--crisp-space-0-5); }
67
86
  .crisp-select-option-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
68
87
  .crisp-select-option-description { min-width: 0; overflow: hidden; text-overflow: ellipsis; color: var(--crisp-fg-neutral-subtle); }