@crisp-ui-kit/crisp 0.57.0 → 0.57.2

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 (293) hide show
  1. package/dist/accentpicker.css +5 -0
  2. package/dist/accentpicker.d.ts +7 -0
  3. package/dist/accentpicker.layered.css +7 -0
  4. package/dist/authshell.css +9 -4
  5. package/dist/authshell.layered.css +9 -4
  6. package/dist/avatar.css +1 -1
  7. package/dist/avatar.layered.css +1 -1
  8. package/dist/badge.css +5 -5
  9. package/dist/badge.layered.css +5 -5
  10. package/dist/board.css +28 -8
  11. package/dist/board.layered.css +28 -8
  12. package/dist/bottomsheet.css +26 -0
  13. package/dist/bottomsheet.d.ts +7 -0
  14. package/dist/bottomsheet.layered.css +28 -0
  15. package/dist/button.css +9 -8
  16. package/dist/button.layered.css +9 -8
  17. package/dist/checkbox.css +7 -3
  18. package/dist/checkbox.layered.css +7 -3
  19. package/dist/chip.css +15 -0
  20. package/dist/chip.d.ts +3 -1
  21. package/dist/chip.layered.css +15 -0
  22. package/dist/chipgroup.css +5 -0
  23. package/dist/chipgroup.d.ts +7 -0
  24. package/dist/chipgroup.layered.css +7 -0
  25. package/dist/cjs/components/accentpicker/accentpicker.js +66 -0
  26. package/dist/cjs/components/accentpicker/accentpicker.recipe.js +25 -0
  27. package/dist/cjs/components/accentpicker/index.js +7 -0
  28. package/dist/cjs/components/avatar/avatar.recipe.js +4 -1
  29. package/dist/cjs/components/badge/badge.recipe.js +38 -10
  30. package/dist/cjs/components/bottomsheet/bottomsheet.js +90 -0
  31. package/dist/cjs/components/bottomsheet/bottomsheet.recipe.js +77 -0
  32. package/dist/cjs/components/bottomsheet/index.js +9 -0
  33. package/dist/cjs/components/button/button.recipe.js +55 -21
  34. package/dist/cjs/components/checkbox/checkbox.recipe.js +61 -9
  35. package/dist/cjs/components/chip/chip.js +14 -2
  36. package/dist/cjs/components/chip/chip.recipe.js +69 -1
  37. package/dist/cjs/components/chipgroup/chipgroup.js +51 -0
  38. package/dist/cjs/components/chipgroup/chipgroup.recipe.js +36 -0
  39. package/dist/cjs/components/chipgroup/index.js +7 -0
  40. package/dist/cjs/components/datatable/datatable.js +5 -1
  41. package/dist/cjs/components/datatable/datatable.recipe.js +11 -2
  42. package/dist/cjs/components/dialog/dialog.recipe.js +21 -10
  43. package/dist/cjs/components/emptystate/emptystate.recipe.js +7 -2
  44. package/dist/cjs/components/fileupload/fileupload.js +21 -4
  45. package/dist/cjs/components/input/index.js +2 -1
  46. package/dist/cjs/components/input/input.js +33 -3
  47. package/dist/cjs/components/input/input.recipe.js +22 -7
  48. package/dist/cjs/components/menu/menu.recipe.js +21 -7
  49. package/dist/cjs/components/menusheet/index.js +9 -0
  50. package/dist/cjs/components/menusheet/menusheet.js +133 -0
  51. package/dist/cjs/components/menusheet/menusheet.recipe.js +103 -0
  52. package/dist/cjs/components/multiselect/multiselect.js +2 -2
  53. package/dist/cjs/components/multiselect/multiselect.recipe.js +45 -12
  54. package/dist/cjs/components/progress/progress.js +21 -4
  55. package/dist/cjs/components/progress/progress.recipe.js +30 -0
  56. package/dist/cjs/components/select/select.js +3 -3
  57. package/dist/cjs/components/select/select.recipe.js +63 -10
  58. package/dist/cjs/components/snackbar/index.js +8 -0
  59. package/dist/cjs/components/snackbar/snackbar.js +121 -0
  60. package/dist/cjs/components/snackbar/snackbar.recipe.js +71 -0
  61. package/dist/cjs/components/tabletoolbar/tabletoolbar.chrome.js +7 -2
  62. package/dist/cjs/components/tabletoolbar/tabletoolbar.js +37 -12
  63. package/dist/cjs/components/tabs/tabs.js +10 -4
  64. package/dist/cjs/components/tabs/tabs.recipe.js +23 -6
  65. package/dist/cjs/components/text/text.recipe.js +8 -7
  66. package/dist/cjs/components/textarea/textarea.js +3 -2
  67. package/dist/cjs/components/textarea/textarea.recipe.js +13 -9
  68. package/dist/cjs/components/textlink/textlink.recipe.js +6 -3
  69. package/dist/cjs/index.js +8 -0
  70. package/dist/cjs/product/authshell/authshell.recipe.js +5 -1
  71. package/dist/cjs/product/command/command.recipe.js +4 -1
  72. package/dist/cjs/product/comments/comments.js +7 -2
  73. package/dist/cjs/product/comments/comments.recipe.js +25 -7
  74. package/dist/cjs/product/memberssettings/index.js +6 -0
  75. package/dist/cjs/product/memberssettings/memberssettings.js +99 -0
  76. package/dist/cjs/product/memberssettings/memberssettings.recipe.js +83 -0
  77. package/dist/cjs/product/notificationssettings/index.js +5 -0
  78. package/dist/cjs/product/notificationssettings/notificationssettings.js +19 -0
  79. package/dist/cjs/product/notificationssettings/notificationssettings.recipe.js +44 -0
  80. package/dist/cjs/product/recordpage/recordpage.js +101 -9
  81. package/dist/cjs/product/recordpage/recordpage.recipe.js +43 -6
  82. package/dist/cjs/product/workspacegeneralsettings/index.js +5 -0
  83. package/dist/cjs/product/workspacegeneralsettings/workspacegeneralsettings.js +21 -0
  84. package/dist/cjs/product/workspacegeneralsettings/workspacegeneralsettings.recipe.js +51 -0
  85. package/dist/cjs/tokens/contract.js +1 -0
  86. package/dist/cjs/tokens/elevation.js +8 -5
  87. package/dist/cjs/tokens/palette.js +107 -33
  88. package/dist/cjs/tokens/scale.js +45 -2
  89. package/dist/cjs/tokens/semantic.js +26 -0
  90. package/dist/columncalc.css +15 -7
  91. package/dist/columncalc.layered.css +15 -7
  92. package/dist/command.css +23 -19
  93. package/dist/command.layered.css +23 -19
  94. package/dist/comments.css +28 -19
  95. package/dist/comments.d.ts +2 -2
  96. package/dist/comments.layered.css +28 -19
  97. package/dist/datatable.css +161 -67
  98. package/dist/datatable.layered.css +161 -67
  99. package/dist/datepicker.css +13 -41
  100. package/dist/datepicker.layered.css +13 -41
  101. package/dist/datepickerfield.css +4 -1
  102. package/dist/datepickerfield.layered.css +4 -1
  103. package/dist/dialog.css +12 -7
  104. package/dist/dialog.layered.css +12 -7
  105. package/dist/emptystate.css +5 -3
  106. package/dist/emptystate.layered.css +5 -3
  107. package/dist/esm/components/accentpicker/accentpicker.js +30 -0
  108. package/dist/esm/components/accentpicker/accentpicker.recipe.js +22 -0
  109. package/dist/esm/components/accentpicker/index.js +2 -0
  110. package/dist/esm/components/avatar/avatar.recipe.js +4 -1
  111. package/dist/esm/components/badge/badge.recipe.js +38 -10
  112. package/dist/esm/components/bottomsheet/bottomsheet.js +52 -0
  113. package/dist/esm/components/bottomsheet/bottomsheet.recipe.js +74 -0
  114. package/dist/esm/components/bottomsheet/index.js +2 -0
  115. package/dist/esm/components/button/button.recipe.js +56 -22
  116. package/dist/esm/components/checkbox/checkbox.recipe.js +61 -9
  117. package/dist/esm/components/chip/chip.js +14 -2
  118. package/dist/esm/components/chip/chip.recipe.js +69 -1
  119. package/dist/esm/components/chipgroup/chipgroup.js +15 -0
  120. package/dist/esm/components/chipgroup/chipgroup.recipe.js +33 -0
  121. package/dist/esm/components/chipgroup/index.js +2 -0
  122. package/dist/esm/components/datatable/datatable.js +5 -1
  123. package/dist/esm/components/datatable/datatable.recipe.js +11 -2
  124. package/dist/esm/components/dialog/dialog.recipe.js +22 -11
  125. package/dist/esm/components/emptystate/emptystate.recipe.js +7 -2
  126. package/dist/esm/components/fileupload/fileupload.js +20 -5
  127. package/dist/esm/components/input/index.js +1 -1
  128. package/dist/esm/components/input/input.js +33 -3
  129. package/dist/esm/components/input/input.recipe.js +23 -8
  130. package/dist/esm/components/menu/menu.recipe.js +21 -7
  131. package/dist/esm/components/menusheet/index.js +2 -0
  132. package/dist/esm/components/menusheet/menusheet.js +95 -0
  133. package/dist/esm/components/menusheet/menusheet.recipe.js +100 -0
  134. package/dist/esm/components/multiselect/multiselect.js +2 -2
  135. package/dist/esm/components/multiselect/multiselect.recipe.js +45 -12
  136. package/dist/esm/components/progress/progress.js +22 -5
  137. package/dist/esm/components/progress/progress.recipe.js +30 -0
  138. package/dist/esm/components/select/select.js +3 -3
  139. package/dist/esm/components/select/select.recipe.js +63 -10
  140. package/dist/esm/components/snackbar/index.js +2 -0
  141. package/dist/esm/components/snackbar/snackbar.js +84 -0
  142. package/dist/esm/components/snackbar/snackbar.recipe.js +68 -0
  143. package/dist/esm/components/tabletoolbar/tabletoolbar.chrome.js +7 -2
  144. package/dist/esm/components/tabletoolbar/tabletoolbar.js +37 -12
  145. package/dist/esm/components/tabs/tabs.js +10 -4
  146. package/dist/esm/components/tabs/tabs.recipe.js +23 -6
  147. package/dist/esm/components/text/text.recipe.js +8 -7
  148. package/dist/esm/components/textarea/textarea.js +3 -2
  149. package/dist/esm/components/textarea/textarea.recipe.js +14 -10
  150. package/dist/esm/components/textlink/textlink.recipe.js +6 -3
  151. package/dist/esm/index.js +8 -0
  152. package/dist/esm/product/authshell/authshell.recipe.js +5 -1
  153. package/dist/esm/product/command/command.recipe.js +4 -1
  154. package/dist/esm/product/comments/comments.js +7 -2
  155. package/dist/esm/product/comments/comments.recipe.js +25 -7
  156. package/dist/esm/product/memberssettings/index.js +1 -0
  157. package/dist/esm/product/memberssettings/memberssettings.js +62 -0
  158. package/dist/esm/product/memberssettings/memberssettings.recipe.js +80 -0
  159. package/dist/esm/product/notificationssettings/index.js +1 -0
  160. package/dist/esm/product/notificationssettings/notificationssettings.js +16 -0
  161. package/dist/esm/product/notificationssettings/notificationssettings.recipe.js +41 -0
  162. package/dist/esm/product/recordpage/recordpage.js +102 -10
  163. package/dist/esm/product/recordpage/recordpage.recipe.js +43 -6
  164. package/dist/esm/product/workspacegeneralsettings/index.js +1 -0
  165. package/dist/esm/product/workspacegeneralsettings/workspacegeneralsettings.js +18 -0
  166. package/dist/esm/product/workspacegeneralsettings/workspacegeneralsettings.recipe.js +48 -0
  167. package/dist/esm/tokens/contract.js +2 -1
  168. package/dist/esm/tokens/elevation.js +8 -5
  169. package/dist/esm/tokens/palette.js +107 -33
  170. package/dist/esm/tokens/scale.js +44 -1
  171. package/dist/esm/tokens/semantic.js +26 -0
  172. package/dist/fileupload.css +3 -1
  173. package/dist/fileupload.layered.css +3 -1
  174. package/dist/input.css +11 -2
  175. package/dist/input.layered.css +11 -2
  176. package/dist/listpage.css +3 -1
  177. package/dist/listpage.layered.css +3 -1
  178. package/dist/memberssettings.css +67 -0
  179. package/dist/memberssettings.d.ts +7 -0
  180. package/dist/memberssettings.layered.css +69 -0
  181. package/dist/menu.css +2 -2
  182. package/dist/menu.layered.css +2 -2
  183. package/dist/menusheet.css +36 -0
  184. package/dist/menusheet.d.ts +7 -0
  185. package/dist/menusheet.layered.css +38 -0
  186. package/dist/multiselect.css +17 -6
  187. package/dist/multiselect.d.ts +2 -2
  188. package/dist/multiselect.layered.css +17 -6
  189. package/dist/native/tokens.d.ts +2 -1
  190. package/dist/native/tokens.js +53 -25
  191. package/dist/notificationssettings.css +22 -0
  192. package/dist/notificationssettings.d.ts +7 -0
  193. package/dist/notificationssettings.layered.css +24 -0
  194. package/dist/objectsettings.css +4 -4
  195. package/dist/objectsettings.layered.css +4 -4
  196. package/dist/progress.css +3 -0
  197. package/dist/progress.layered.css +3 -0
  198. package/dist/recordpage.css +67 -23
  199. package/dist/recordpage.layered.css +67 -23
  200. package/dist/recordpanel.css +35 -16
  201. package/dist/recordpanel.layered.css +35 -16
  202. package/dist/resizablepanel.css +8 -5
  203. package/dist/resizablepanel.layered.css +8 -5
  204. package/dist/richtext.css +24 -8
  205. package/dist/richtext.layered.css +24 -8
  206. package/dist/savedviews.css +9 -2
  207. package/dist/savedviews.layered.css +9 -2
  208. package/dist/select.css +47 -7
  209. package/dist/select.d.ts +2 -2
  210. package/dist/select.layered.css +47 -7
  211. package/dist/settingsshell.css +2 -3
  212. package/dist/settingsshell.layered.css +2 -3
  213. package/dist/slider.css +6 -27
  214. package/dist/slider.layered.css +6 -27
  215. package/dist/snackbar.css +24 -0
  216. package/dist/snackbar.d.ts +7 -0
  217. package/dist/snackbar.layered.css +26 -0
  218. package/dist/statcard.css +3 -1
  219. package/dist/statcard.layered.css +3 -1
  220. package/dist/styles.css +927 -365
  221. package/dist/styles.layered.css +927 -365
  222. package/dist/table.css +28 -10
  223. package/dist/table.layered.css +28 -10
  224. package/dist/tabletoolbar.css +35 -24
  225. package/dist/tabletoolbar.layered.css +35 -24
  226. package/dist/tabs.css +18 -4
  227. package/dist/tabs.layered.css +18 -4
  228. package/dist/text.css +1 -1
  229. package/dist/text.layered.css +1 -1
  230. package/dist/textarea.css +4 -7
  231. package/dist/textarea.layered.css +4 -7
  232. package/dist/textlink.css +2 -2
  233. package/dist/textlink.layered.css +2 -2
  234. package/dist/themepicker.css +2 -1
  235. package/dist/themepicker.layered.css +2 -1
  236. package/dist/tokens.css +31 -13
  237. package/dist/tokens.json +53 -25
  238. package/dist/types/components/accentpicker/accentpicker.d.ts +23 -0
  239. package/dist/types/components/accentpicker/accentpicker.recipe.d.ts +3 -0
  240. package/dist/types/components/accentpicker/index.d.ts +2 -0
  241. package/dist/types/components/bottomsheet/bottomsheet.d.ts +35 -0
  242. package/dist/types/components/bottomsheet/bottomsheet.recipe.d.ts +3 -0
  243. package/dist/types/components/bottomsheet/index.d.ts +2 -0
  244. package/dist/types/components/button/button.recipe.d.ts +13 -8
  245. package/dist/types/components/checkbox/checkbox.recipe.d.ts +28 -5
  246. package/dist/types/components/chip/chip.d.ts +22 -0
  247. package/dist/types/components/chip/chip.recipe.d.ts +48 -0
  248. package/dist/types/components/chipgroup/chipgroup.d.ts +14 -0
  249. package/dist/types/components/chipgroup/chipgroup.recipe.d.ts +5 -0
  250. package/dist/types/components/chipgroup/index.d.ts +2 -0
  251. package/dist/types/components/datatable/datatable.d.ts +19 -0
  252. package/dist/types/components/fileupload/fileupload.d.ts +26 -0
  253. package/dist/types/components/input/index.d.ts +1 -1
  254. package/dist/types/components/input/input.d.ts +84 -0
  255. package/dist/types/components/menusheet/index.d.ts +2 -0
  256. package/dist/types/components/menusheet/menusheet.d.ts +42 -0
  257. package/dist/types/components/menusheet/menusheet.recipe.d.ts +3 -0
  258. package/dist/types/components/multiselect/multiselect.d.ts +4 -3
  259. package/dist/types/components/multiselect/multiselect.recipe.d.ts +3 -0
  260. package/dist/types/components/progress/progress.d.ts +16 -4
  261. package/dist/types/components/progress/progress.recipe.d.ts +22 -0
  262. package/dist/types/components/select/select.d.ts +6 -5
  263. package/dist/types/components/select/select.recipe.d.ts +3 -0
  264. package/dist/types/components/snackbar/index.d.ts +2 -0
  265. package/dist/types/components/snackbar/snackbar.d.ts +36 -0
  266. package/dist/types/components/snackbar/snackbar.recipe.d.ts +5 -0
  267. package/dist/types/components/tabletoolbar/tabletoolbar.d.ts +28 -1
  268. package/dist/types/components/tabs/tabs.d.ts +11 -1
  269. package/dist/types/components/textarea/textarea.d.ts +16 -0
  270. package/dist/types/index.d.ts +8 -0
  271. package/dist/types/product/comments/comments.d.ts +9 -3
  272. package/dist/types/product/comments/comments.recipe.d.ts +12 -2
  273. package/dist/types/product/memberssettings/index.d.ts +1 -0
  274. package/dist/types/product/memberssettings/memberssettings.d.ts +85 -0
  275. package/dist/types/product/memberssettings/memberssettings.recipe.d.ts +3 -0
  276. package/dist/types/product/notificationssettings/index.d.ts +1 -0
  277. package/dist/types/product/notificationssettings/notificationssettings.d.ts +37 -0
  278. package/dist/types/product/notificationssettings/notificationssettings.recipe.d.ts +3 -0
  279. package/dist/types/product/recordpage/recordpage.d.ts +89 -2
  280. package/dist/types/product/workspacegeneralsettings/index.d.ts +1 -0
  281. package/dist/types/product/workspacegeneralsettings/workspacegeneralsettings.d.ts +48 -0
  282. package/dist/types/product/workspacegeneralsettings/workspacegeneralsettings.recipe.d.ts +3 -0
  283. package/dist/types/tokens/contract.d.ts +7 -1
  284. package/dist/types/tokens/elevation.d.ts +8 -5
  285. package/dist/types/tokens/palette.d.ts +28 -12
  286. package/dist/types/tokens/scale.d.ts +12 -1
  287. package/dist/types/tokens/semantic.d.ts +17 -0
  288. package/dist/wheelpicker.css +4 -2
  289. package/dist/wheelpicker.layered.css +4 -2
  290. package/dist/workspacegeneralsettings.css +30 -0
  291. package/dist/workspacegeneralsettings.d.ts +7 -0
  292. package/dist/workspacegeneralsettings.layered.css +32 -0
  293. package/package.json +41 -1
@@ -32,4 +32,19 @@
32
32
  .crisp-chip--tone_orange {
33
33
  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);
34
34
  }
35
+ .crisp-chip--appearance_filled {
36
+
37
+ }
38
+ .crisp-chip--appearance_outline {
39
+ background: transparent;
40
+ }
41
+ .crisp-chip--selected_true {
42
+ background: var(--crisp-bg-neutral-inverted); color: var(--crisp-fg-on-neutral-inverted); box-shadow: none;
43
+ }
44
+ .crisp-chip--selected_false {
45
+
46
+ }
47
+ .crisp-chip--compound_0 {
48
+ box-shadow: inset 0 0 0 1px var(--crisp-border-default);
49
+ }
35
50
  }
@@ -0,0 +1,5 @@
1
+ .crisp-chipgroup {
2
+ display: flex; flex-wrap: nowrap; align-items: center; gap: var(--crisp-space-1-5); overflow-x: auto; overscroll-behavior-x: contain; scroll-snap-type: x mandatory; -webkit-overflow-scrolling: touch; scrollbar-width: none; -ms-overflow-style: none;
3
+ &::-webkit-scrollbar { display: none; }
4
+ & > * { flex-shrink: 0; scroll-snap-align: start; }
5
+ }
@@ -0,0 +1,7 @@
1
+ import type { RecipeFn } from "../core/types";
2
+
3
+ export interface ChipgroupVariants {
4
+
5
+ }
6
+
7
+ export declare const chipgroupRecipe: RecipeFn<{ }>;
@@ -0,0 +1,7 @@
1
+ @layer crisp-components {
2
+ .crisp-chipgroup {
3
+ display: flex; flex-wrap: nowrap; align-items: center; gap: var(--crisp-space-1-5); overflow-x: auto; overscroll-behavior-x: contain; scroll-snap-type: x mandatory; -webkit-overflow-scrolling: touch; scrollbar-width: none; -ms-overflow-style: none;
4
+ &::-webkit-scrollbar { display: none; }
5
+ & > * { flex-shrink: 0; scroll-snap-align: start; }
6
+ }
7
+ }
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.AccentPicker = AccentPicker;
37
+ const jsx_runtime_1 = require("react/jsx-runtime");
38
+ const React = __importStar(require("react"));
39
+ const radiogroup_1 = require("../radiogroup");
40
+ const accentpicker_recipe_1 = require("./accentpicker.recipe");
41
+ /**
42
+ * A row of selectable colour swatches — Attio's own accent-colour picker
43
+ * (Settings > Appearance). Not a fixed palette: pass the colours (and the
44
+ * accent isn't crisp's concern to theme the app with — this only picks one).
45
+ * Same roving-focus/arrow-key model every other crisp radio-like control
46
+ * shares (`useRadioGroupKeyboard`, also used by `RadioGroup` and
47
+ * `Segmented`).
48
+ */
49
+ function AccentPicker({ colors, value, defaultValue, onValueChange, className, onKeyDown: onKeyDownProp, ...rest }) {
50
+ const [internal, setInternal] = React.useState(defaultValue);
51
+ const selected = value ?? internal;
52
+ const select = (v) => {
53
+ if (value === undefined)
54
+ setInternal(v);
55
+ onValueChange?.(v);
56
+ };
57
+ const { onKeyDown, groupRef } = (0, radiogroup_1.useRadioGroupKeyboard)({ select });
58
+ return ((0, jsx_runtime_1.jsx)("div", { ref: groupRef, role: "radiogroup", className: (0, accentpicker_recipe_1.accentpickerRecipe)({ className }), ...rest, onKeyDown: (e) => {
59
+ onKeyDown(e);
60
+ onKeyDownProp?.(e);
61
+ }, children: colors.map((color) => {
62
+ const checked = selected === color;
63
+ return ((0, jsx_runtime_1.jsx)("button", { type: "button", role: "radio", "aria-checked": checked, "aria-label": color, "data-value": color, tabIndex: checked ? 0 : -1, className: "crisp-accentpicker-swatch", style: { borderColor: checked ? color : "transparent" }, onClick: () => select(color), children: (0, jsx_runtime_1.jsx)("svg", { width: "22", height: "22", viewBox: "0 0 22 22", fill: "none", "aria-hidden": "true", children: (0, jsx_runtime_1.jsx)("circle", { cx: "11", cy: "11", r: "9", fill: color }) }) }, color));
64
+ }) }));
65
+ }
66
+ AccentPicker.displayName = "AccentPicker";
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.accentpickerRecipe = void 0;
4
+ const core_1 = require("../../core");
5
+ const tokens_1 = require("../../tokens");
6
+ // A row of selectable colour swatches — measured live on Attio's Appearance
7
+ // settings page (crisp#635): `role="radiogroup"`, `display: flex; gap: 8px`.
8
+ // Each swatch is a 24x24 circular button, `border: 1px solid transparent`
9
+ // at rest; the CHECKED swatch's border switches to its own colour (not a
10
+ // fixed brand ring) — measured directly on the DOM (`border: 1px solid
11
+ // rgb(38,109,240)` on the checked blue swatch, `1px solid rgba(0,0,0,0)` on
12
+ // every unchecked one). That per-swatch colour is data, not a class, so it's
13
+ // set inline by the component, not here. Inside sits a 22x22 SVG with one
14
+ // solid r=9 (18px) circle -- no separate ring/dot layer, contrary to an
15
+ // earlier, less precise read of this same control.
16
+ const config = (0, core_1.defineRecipe)({
17
+ name: "accentpicker",
18
+ base: `display: flex; gap: ${tokens_1.contract.space["2"]};
19
+ & .crisp-accentpicker-swatch { box-sizing: border-box; display: inline-flex; align-items: center; justify-content: center;
20
+ width: 24px; height: 24px; padding: 0; margin: 0; border-radius: ${tokens_1.contract.radius.full}; border: 1px solid transparent;
21
+ background: none; font-family: inherit; cursor: pointer; }
22
+ & .crisp-accentpicker-swatch:focus-visible { outline: 2px solid ${tokens_1.contract.bgBrandSolid}; outline-offset: 2px; }`,
23
+ });
24
+ exports.accentpickerRecipe = (0, core_1.resolveRecipe)(config);
25
+ exports.default = config;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.accentpickerRecipe = exports.AccentPicker = void 0;
4
+ var accentpicker_1 = require("./accentpicker");
5
+ Object.defineProperty(exports, "AccentPicker", { enumerable: true, get: function () { return accentpicker_1.AccentPicker; } });
6
+ var accentpicker_recipe_1 = require("./accentpicker.recipe");
7
+ Object.defineProperty(exports, "accentpickerRecipe", { enumerable: true, get: function () { return accentpicker_recipe_1.accentpickerRecipe; } });
@@ -39,7 +39,10 @@ const spec = (0, core_1.defineSpec)({
39
39
  color: tokens_1.contract.fgNeutralMuted,
40
40
  boxShadow: `inset 0 0 0 1px ${tokens_1.contract.borderDefault}`,
41
41
  },
42
- brand: { background: tokens_1.contract.bgBrandSolid, color: "#fff" },
42
+ // your-moon/crisp#897: `bgBrandContrast`, the darker AA-safe sibling
43
+ // of the accent blue (`bgBrandSolid`, #0298d9, only 3.23:1 with
44
+ // white) -- keeps white text, matching every other tone here.
45
+ brand: { background: tokens_1.contract.bgBrandContrast, color: "#fff" },
43
46
  orange: { background: tokens_1.contract.bgOrange, color: "#fff" },
44
47
  cyan: { background: tokens_1.contract.bgCyan, color: "#fff" },
45
48
  purple: { background: tokens_1.contract.bgPurple, color: "#fff" },
@@ -92,7 +92,11 @@ const spec = (0, core_1.defineSpec)({
92
92
  paddingInline: tokens_1.contract.space["1"],
93
93
  fontSize: tokens_1.contract.text.sm,
94
94
  lineHeight: "16px",
95
- borderRadius: tokens_1.contract.radius.sm,
95
+ // your-moon/crisp#919: seed-design's own Badge (`badge.yaml`)
96
+ // is a small rounded-rect at every size, never a pill -- its
97
+ // small/medium step is `$radius.r1` = 4px (`radius.xs`), not the 6px
98
+ // `radius.sm` this used to share with Chip's old rounded-rect shape.
99
+ borderRadius: tokens_1.contract.radius.xs,
96
100
  },
97
101
  // crisp#696: Attio's tag pill (Standard/System/Enriched) measures
98
102
  // 20px h / 4px padding / 12px text / 16px line-height / 3px gap -- was
@@ -104,14 +108,24 @@ const spec = (0, core_1.defineSpec)({
104
108
  fontSize: tokens_1.contract.text.sm,
105
109
  lineHeight: "16px",
106
110
  gap: "3px",
107
- borderRadius: tokens_1.contract.radius.sm,
111
+ // your-moon/crisp#919: same seed radius step as `small`
112
+ // above -- seed's Badge treats small/medium as one radius step
113
+ // (`$radius.r1` = 4px), unlike Button/Input's per-size table.
114
+ borderRadius: tokens_1.contract.radius.xs,
108
115
  },
109
116
  // crisp#805: measured live against Attio's real status/stage chip
110
- // (Deals "Deal stage" column, All Deals table view) -- radius 9px, not
111
- // `radius.chip`'s 7px, and asymmetric padding (room for a leading dot/
112
- // icon: 1px top/bottom, 6px trailing, 4px leading), not a symmetric
113
- // 9px. Height/font/tracking are unchanged (still not independently
114
- // re-measured this round, per #696's own note).
117
+ // (Deals "Deal stage" column, All Deals table view) -- asymmetric
118
+ // padding (room for a leading dot/icon: 1px top/bottom, 6px trailing,
119
+ // 4px leading), not a symmetric 9px. Height/font/tracking are
120
+ // unchanged (still not independently re-measured this round, per
121
+ // #696's own note).
122
+ // your-moon/crisp#919: radius was Attio's own measured 9px
123
+ // (`radius.lg`, deliberately not `radius.chip`'s then-7px) -- now
124
+ // `radius.sm` (6px), seed-design's own Badge large step
125
+ // (`$radius.r1_5`). Radius specifically is one of the values this
126
+ // migration takes from seed over an Attio measurement (colours/radii/
127
+ // control-styling/elevation all do); the padding/height facts above
128
+ // are unaffected and still Attio's.
115
129
  large: {
116
130
  height: tokens_1.contract.size.chip,
117
131
  paddingBlock: tokens_1.contract.space.px,
@@ -119,7 +133,7 @@ const spec = (0, core_1.defineSpec)({
119
133
  paddingInlineEnd: tokens_1.contract.space["1.5"],
120
134
  fontSize: tokens_1.contract.text.lg,
121
135
  letterSpacing: "-0.1px",
122
- borderRadius: tokens_1.contract.radius.lg,
136
+ borderRadius: tokens_1.contract.radius.sm,
123
137
  },
124
138
  },
125
139
  variant: { soft: {}, solid: {} },
@@ -129,8 +143,14 @@ const spec = (0, core_1.defineSpec)({
129
143
  {
130
144
  variant: "solid",
131
145
  tone: "brand",
146
+ // your-moon/crisp#897: `bgBrandContrast`, not `bgBrandSolid` — white
147
+ // text on the exact accent blue (#0298d9) only clears 3.23:1;
148
+ // `bgBrandContrast` is the darker sibling built to clear 4.5:1+ with
149
+ // white, so `fgOnBrand` (white) stays right rather than `fgOnTone`
150
+ // (ink read off-brand next to solid `success`/`warning`/`danger`,
151
+ // which really do need it).
132
152
  decls: {
133
- background: tokens_1.contract.bgBrandSolid,
153
+ background: tokens_1.contract.bgBrandContrast,
134
154
  color: tokens_1.contract.fgOnBrand,
135
155
  boxShadow: "none",
136
156
  },
@@ -143,7 +163,15 @@ const spec = (0, core_1.defineSpec)({
143
163
  {
144
164
  variant: "solid",
145
165
  tone: "warning",
146
- decls: { background: tokens_1.contract.bgWarning, color: tokens_1.contract.fgOnTone, boxShadow: "none" },
166
+ // seed-identity migration (your-moon/crisp#890): `bgWarningSolid`, not
167
+ // `bgWarning` — seed's own solid warning fill is a distinct, paler
168
+ // yellow from the accent every other tone's solid fill reuses
169
+ // directly (see tokens/palette.ts's `amberSolid` comment).
170
+ decls: {
171
+ background: tokens_1.contract.bgWarningSolid,
172
+ color: tokens_1.contract.fgOnTone,
173
+ boxShadow: "none",
174
+ },
147
175
  },
148
176
  {
149
177
  variant: "solid",
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.BottomSheet = BottomSheet;
37
+ exports.BottomSheetBody = BottomSheetBody;
38
+ exports.BottomSheetFooter = BottomSheetFooter;
39
+ const jsx_runtime_1 = require("react/jsx-runtime");
40
+ const dialog = __importStar(require("@zag-js/dialog"));
41
+ const react_1 = require("@zag-js/react");
42
+ const lucide_react_1 = require("lucide-react");
43
+ const React = __importStar(require("react"));
44
+ const core_1 = require("../../core");
45
+ const bottomsheet_recipe_1 = require("./bottomsheet.recipe");
46
+ let instanceCounter = 0;
47
+ function useBottomSheetInstanceId() {
48
+ const idRef = React.useRef(null);
49
+ if (idRef.current == null) {
50
+ instanceCounter += 1;
51
+ idRef.current = `crisp-bottomsheet-${instanceCounter}`;
52
+ }
53
+ return idRef.current;
54
+ }
55
+ /**
56
+ * A mobile bottom sheet — composes Zag's dialog machine (focus trap, scroll
57
+ * lock, Escape / outside-click dismissal) with a panel that slides up from
58
+ * the bottom edge. Compose the body with `BottomSheetBody` and actions with
59
+ * `BottomSheetFooter`.
60
+ */
61
+ function BottomSheet({ open, onOpenChange, title, description, headerAlign = "left", showCloseButton, "aria-label": ariaLabel, closeLabel: closeLabelProp, children, className, "aria-describedby": describedBy, ...rest }) {
62
+ const closeLabel = (0, core_1.useCrispMessage)(closeLabelProp, "Close");
63
+ const id = useBottomSheetInstanceId();
64
+ const service = (0, react_1.useMachine)(dialog.machine, {
65
+ id,
66
+ open,
67
+ onOpenChange(details) {
68
+ onOpenChange(details.open);
69
+ },
70
+ "aria-label": typeof title === "string" ? title : ariaLabel,
71
+ // Defer to a nested Menu/Select/Popover/ContextMenu's own Escape
72
+ // handling (#361) -- same reasoning as Dialog/Drawer, same machine.
73
+ onEscapeKeyDown(event) {
74
+ if ((0, core_1.hasOpenFloatingLayer)())
75
+ event.preventDefault();
76
+ },
77
+ });
78
+ const api = dialog.connect(service, react_1.normalizeProps);
79
+ if (!api.open)
80
+ return null;
81
+ const hasClose = showCloseButton ?? title != null;
82
+ return ((0, jsx_runtime_1.jsx)(react_1.Portal, { children: (0, jsx_runtime_1.jsxs)("div", { className: (0, bottomsheet_recipe_1.bottomsheetRecipe)(), children: [(0, jsx_runtime_1.jsx)("div", { ...api.getBackdropProps(), className: "crisp-bottomsheet-backdrop" }), (0, jsx_runtime_1.jsx)("div", { ...api.getPositionerProps(), className: "crisp-bottomsheet-positioner", children: (0, jsx_runtime_1.jsxs)("div", { ...rest, ...(0, core_1.withDescribedBy)(api.getContentProps(), describedBy), className: (0, core_1.cx)("crisp-bottomsheet-content", className), "data-header-align": headerAlign, "data-has-close": hasClose ? "" : undefined, children: [(title != null || description != null) && ((0, jsx_runtime_1.jsxs)("div", { className: "crisp-bottomsheet-header", children: [title != null && ((0, jsx_runtime_1.jsx)("span", { ...api.getTitleProps(), className: "crisp-bottomsheet-title", children: title })), description != null && ((0, jsx_runtime_1.jsx)("span", { className: "crisp-bottomsheet-description", children: description })), hasClose && ((0, jsx_runtime_1.jsx)("button", { type: "button", ...api.getCloseTriggerProps(), className: "crisp-bottomsheet-close", "aria-label": closeLabel, children: (0, jsx_runtime_1.jsx)(lucide_react_1.X, { size: 16, strokeWidth: 2, "aria-hidden": "true" }) }))] })), children] }) })] }) }));
83
+ }
84
+ BottomSheet.displayName = "BottomSheet";
85
+ function BottomSheetBody({ children }) {
86
+ return (0, jsx_runtime_1.jsx)("div", { className: "crisp-bottomsheet-body", children: children });
87
+ }
88
+ function BottomSheetFooter({ children, }) {
89
+ return (0, jsx_runtime_1.jsx)("div", { className: "crisp-bottomsheet-footer", children: children });
90
+ }
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.bottomsheetRecipe = void 0;
4
+ const core_1 = require("../../core");
5
+ const tokens_1 = require("../../tokens");
6
+ // A mobile bottom sheet — daangn/seed-design's
7
+ // packages/rootage/components/bottom-sheet.yaml (dev@e1c486b904297f7b6a8f17b8523f732c37015d60),
8
+ // not Attio (no such component there; crisp#911). Composes @zag-js/dialog, the
9
+ // same headless machine Dialog/Drawer already use, with a panel that slides
10
+ // up from the bottom edge over a scrim -- only the TOP corners round; the
11
+ // panel sits flush with the viewport's bottom edge, unlike Drawer's own
12
+ // 8px-gutter floating panel. Every numeric value below cites its yaml line.
13
+ const config = (0, core_1.defineRecipe)({
14
+ name: "bottomsheet",
15
+ base: `display: contents; font-family: ${tokens_1.contract.font.sans};
16
+ & .crisp-bottomsheet-backdrop {
17
+ position: fixed; inset: 0; z-index: 60;
18
+ background: ${tokens_1.contract.bgOverlayStrong}; /* bottom-sheet.yaml:99 backdrop.color = $color.bg.overlay -- a different, darker, theme-constant scrim than the Dialog bgScrim token, see its own comment */
19
+ opacity: 1; transition: opacity 300ms cubic-bezier(0,0,.15,1); /* bottom-sheet.yaml:100-102 enterDuration/enterTimingFunction */
20
+ @starting-style { opacity: 0; }
21
+ }
22
+ & .crisp-bottomsheet-positioner {
23
+ position: fixed; inset: 0; z-index: 61;
24
+ display: flex; align-items: flex-end; justify-content: center;
25
+ }
26
+ & .crisp-bottomsheet-content {
27
+ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
28
+ position: relative; box-sizing: border-box; display: flex; flex-direction: column;
29
+ overflow: hidden; width: 100%; max-width: 480px; /* bottom-sheet.yaml:110 content.maxWidth */
30
+ max-height: 85vh;
31
+ background: ${tokens_1.contract.bgSurface}; /* bottom-sheet.yaml:109 content.color = $color.bg.layer-floating */
32
+ border-radius: ${tokens_1.contract.radius["4xl"]} ${tokens_1.contract.radius["4xl"]} 0 0; /* bottom-sheet.yaml:111 content.topCornerRadius = $radius.r6 (24px), bottom flush with the viewport */
33
+ transform: translateY(0);
34
+ transition: transform 300ms cubic-bezier(.03,.4,.1,1); /* bottom-sheet.yaml:112-113 content.enterDuration/enterTimingFunction (enter-expressive) */
35
+ @starting-style { transform: translateY(100%); }
36
+ }
37
+ & .crisp-bottomsheet-header {
38
+ position: relative; display: flex; flex-direction: column;
39
+ gap: ${tokens_1.contract.space["2"]}; /* bottom-sheet.yaml:120 header.gap = $dimension.x2 (8px) */
40
+ padding-top: ${tokens_1.contract.space["6"]}; padding-bottom: ${tokens_1.contract.space["4"]}; /* bottom-sheet.yaml:121-122 header.paddingTop/paddingBottom = $dimension.x6/x4 (24px/16px) */
41
+ flex-shrink: 0;
42
+ }
43
+ & .crisp-bottomsheet-title {
44
+ color: ${tokens_1.contract.fgPrimary}; /* bottom-sheet.yaml:130 title.color = $color.fg.neutral */
45
+ font-size: 22px; line-height: 30px; font-weight: ${tokens_1.contract.weight.bold}; /* bottom-sheet.yaml:131-133 title.fontSize/lineHeight/fontWeight = $font-size.t8/$line-height.t8/bold */
46
+ padding-inline: ${tokens_1.contract.space["4"]}; /* default (headerAlignment=left, no close button): bottom-sheet.yaml:150-152 */
47
+ }
48
+ &[data-header-align="left"][data-has-close] .crisp-bottomsheet-title { padding-inline-start: ${tokens_1.contract.space["4"]}; padding-inline-end: 56px; } /* bottom-sheet.yaml:141-144 */
49
+ &[data-header-align="center"] .crisp-bottomsheet-title { text-align: center; }
50
+ &[data-header-align="center"][data-has-close] .crisp-bottomsheet-title { padding-inline: 56px; } /* bottom-sheet.yaml:154-157 */
51
+ & .crisp-bottomsheet-description {
52
+ color: ${tokens_1.contract.fgMuted}; /* bottom-sheet.yaml:138 description.color = $color.fg.neutral-muted */
53
+ font-size: ${tokens_1.contract.text.xl}; line-height: 22px; font-weight: ${tokens_1.contract.weight.regular}; /* bottom-sheet.yaml:139-141 description.fontSize/lineHeight/fontWeight = $font-size.t5/$line-height.t5/regular */
54
+ padding-inline: ${tokens_1.contract.space["4"]}; /* bottom-sheet.yaml:142 description.paddingX = global-gutter (16px) */
55
+ }
56
+ & .crisp-bottomsheet-close {
57
+ position: absolute; top: ${tokens_1.contract.space["6"]}; inset-inline-end: ${tokens_1.contract.space["4"]}; /* bottom-sheet.yaml:145-146 closeButton.fromTop/fromRight = $dimension.x6/x4 (24px/16px) */
58
+ display: inline-flex; align-items: center; justify-content: center;
59
+ width: 28px; height: 28px; margin: 0; padding: 0; border: none; border-radius: ${tokens_1.contract.radius.md};
60
+ background: none; color: ${tokens_1.contract.fgMuted}; font-family: inherit; cursor: pointer;
61
+ }
62
+ & .crisp-bottomsheet-close:hover { background: color-mix(in srgb, ${tokens_1.contract.fgPrimary} 6%, transparent); color: ${tokens_1.contract.fgPrimary}; }
63
+ & .crisp-bottomsheet-body {
64
+ flex: 1; min-height: 0; overflow-y: auto;
65
+ padding-inline: ${tokens_1.contract.space["4"]}; /* bottom-sheet.yaml:126 body.paddingX = global-gutter (16px) -- no vertical padding in the spec */
66
+ }
67
+ & .crisp-bottomsheet-footer {
68
+ display: flex; align-items: center; justify-content: flex-end; gap: ${tokens_1.contract.space["3"]};
69
+ flex-shrink: 0;
70
+ padding-inline: ${tokens_1.contract.space["4"]}; padding-top: ${tokens_1.contract.space["3"]}; padding-bottom: ${tokens_1.contract.space["4"]}; /* bottom-sheet.yaml:127-129 footer.paddingX/paddingTop/paddingBottom = global-gutter/x3/x4 (16px/12px/16px) */
71
+ }`,
72
+ variants: {},
73
+ defaultVariants: {},
74
+ compoundVariants: [],
75
+ });
76
+ exports.bottomsheetRecipe = (0, core_1.resolveRecipe)(config);
77
+ exports.default = config;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.bottomsheetRecipe = exports.BottomSheetFooter = exports.BottomSheetBody = exports.BottomSheet = void 0;
4
+ var bottomsheet_1 = require("./bottomsheet");
5
+ Object.defineProperty(exports, "BottomSheet", { enumerable: true, get: function () { return bottomsheet_1.BottomSheet; } });
6
+ Object.defineProperty(exports, "BottomSheetBody", { enumerable: true, get: function () { return bottomsheet_1.BottomSheetBody; } });
7
+ Object.defineProperty(exports, "BottomSheetFooter", { enumerable: true, get: function () { return bottomsheet_1.BottomSheetFooter; } });
8
+ var bottomsheet_recipe_1 = require("./bottomsheet.recipe");
9
+ Object.defineProperty(exports, "bottomsheetRecipe", { enumerable: true, get: function () { return bottomsheet_recipe_1.bottomsheetRecipe; } });
@@ -25,44 +25,70 @@ const spec = (0, core_1.defineSpec)({
25
25
  },
26
26
  parts: [
27
27
  { selector: "&:disabled", decls: { opacity: 0.5, cursor: "not-allowed" } },
28
+ // your-moon/crisp#910: seed-design's every Button variant
29
+ // gives press feedback as a `scaleScope: self` micro-interaction, not a
30
+ // shadow/fill change alone (`action-button.yaml`, read in the seed raw
31
+ // dump) -- on top of, not instead of, each intent's own colour-on-press
32
+ // below. Root-level so it applies uniformly across all four intents.
33
+ { selector: "&:active", decls: { transform: "scale(0.98)" } },
28
34
  ],
29
35
  variants: {
30
36
  intent: {
31
37
  primary: {
32
38
  decls: {
33
- background: tokens_1.contract.bgBrandSolid,
39
+ // your-moon/crisp#897: `bgBrandContrast`, not `bgBrandSolid` —
40
+ // white text on the exact accent blue (#0298d9) only clears
41
+ // 3.23:1; `bgBrandContrast` is the darker sibling built to clear
42
+ // white at 4.5:1+, keeping `fgOnBrand` (white) rather than
43
+ // reaching for `fgOnTone` (ink read off-brand — seed's own solid
44
+ // buttons use white).
45
+ background: tokens_1.contract.bgBrandContrast,
34
46
  color: tokens_1.contract.fgOnBrand,
35
- // crisp#494: the inset ring is a black tint, not white -- live-
36
- // measured on Attio's own "New Company" button as
37
- // rgba(0,0,0,0.06), not the rgba(255,255,255,0.07) both solid
38
- // intents shared. The other two shadow layers already matched
39
- // exactly.
40
- boxShadow: "inset 0 0 0 1px rgba(0,0,0,0.06), 0 2px 4px -2px rgba(38,109,240,0.12), 0 3px 6px -2px rgba(38,109,240,0.08)",
47
+ // your-moon/crisp#910: seed's brandSolid carries no
48
+ // shadow/ring at all (`action-button.yaml`: `border: none`, no
49
+ // shadow key) -- dropped the coloured ambient drop-shadow and the
50
+ // black-tint inset ring (crisp#494) that were tuned for Attio's
51
+ // own look, per the owner's directive that elevation/control
52
+ // styling now follows seed, not Attio.
53
+ boxShadow: "none",
41
54
  },
55
+ // your-moon/crisp#897: a brightness filter, not a second background
56
+ // swap — matches `danger`'s own pattern below. `bgBrandSolidPressed`
57
+ // remains the accent's own hover-darken for the many OTHER
58
+ // consumers that pair `bgBrandSolid` with white already (out of
59
+ // scope for this fix; tracked separately), so reusing it here would
60
+ // have made primary's rest-to-hover jump inconsistent with its own
61
+ // rest fill's new, darker starting point.
42
62
  parts: [
43
- { selector: "&:hover", decls: { background: tokens_1.contract.bgBrandSolidPressed } },
44
- {
45
- selector: "&:active",
46
- decls: { background: tokens_1.contract.bgBrandSolidPressed },
47
- },
63
+ { selector: "&:hover", decls: { filter: "brightness(0.96)" } },
64
+ { selector: "&:active", decls: { filter: "brightness(0.92)" } },
48
65
  ],
49
66
  },
50
67
  neutral: {
51
68
  decls: {
52
- background: tokens_1.contract.bgSurface,
69
+ // your-moon/crisp#910: seed's `neutralWeak` fill is
70
+ // `bg.neutral-weak` (#f3f4f5) at rest, not an opaque white --
71
+ // `bgNeutralWeak` is already this exact hex (no new measurement).
72
+ // No border/shadow in seed's spec either; dropped `e.field`'s
73
+ // 3-layer button-chrome glow for the same reason primary/danger
74
+ // lost theirs.
75
+ background: tokens_1.contract.bgNeutralWeak,
53
76
  color: tokens_1.contract.fgPrimary,
54
- boxShadow: tokens_1.elevation.field,
77
+ boxShadow: "none",
55
78
  },
56
- parts: [{ selector: "&:hover", decls: { background: tokens_1.contract.bgRaised } }],
79
+ parts: [
80
+ // seed's neutralWeak "pressed" bg (#eeeff1) is `borderSubtle`'s
81
+ // own already-exact value -- reused, not a fresh literal.
82
+ { selector: "&:hover", decls: { background: tokens_1.contract.borderSubtle } },
83
+ ],
57
84
  },
58
85
  danger: {
59
86
  decls: {
60
87
  background: tokens_1.contract.bgDangerSolid,
61
88
  color: tokens_1.contract.fgOnBrand,
62
- // Same corrected inset ring as primary (crisp#494) -- shared
63
- // literal, same solid-fill button family; the coloured layers
64
- // themselves weren't independently re-measured this round.
65
- boxShadow: "inset 0 0 0 1px rgba(0,0,0,0.06), 0 2px 4px -2px rgba(186,37,37,0.20), 0 3px 6px -2px rgba(186,37,37,0.12)",
89
+ // your-moon/crisp#910: same "no shadow at all" call as
90
+ // primary above -- seed's criticalSolid carries no ring either.
91
+ boxShadow: "none",
66
92
  },
67
93
  parts: [
68
94
  { selector: "&:hover", decls: { filter: "brightness(0.96)" } },
@@ -72,7 +98,12 @@ const spec = (0, core_1.defineSpec)({
72
98
  ghost: {
73
99
  decls: {
74
100
  background: "transparent",
75
- color: tokens_1.contract.fgMuted,
101
+ // your-moon/crisp#910: seed's `ghost` enabled label/icon
102
+ // colour is `fg.neutral` (full ink), not a de-emphasised muted
103
+ // grey that only darkens on hover -- `action-button.yaml`'s own
104
+ // enabled-state colour table has no separate "muted" step for
105
+ // ghost. Real behaviour change, flagged in HANDOFF/CHANGELOG.
106
+ color: tokens_1.contract.fgPrimary,
76
107
  boxShadow: "none",
77
108
  },
78
109
  parts: [
@@ -122,7 +153,10 @@ const spec = (0, core_1.defineSpec)({
122
153
  height: "40px",
123
154
  paddingInline: "14px",
124
155
  fontSize: tokens_1.contract.text.lg,
125
- borderRadius: "10px",
156
+ // your-moon/crisp#910: was a stray literal `10px`, matching neither
157
+ // the token scale nor seed's own large-size radius (`$radius.r3` =
158
+ // 12px, `action-button.yaml`) -- now the actual `xl` token.
159
+ borderRadius: tokens_1.contract.radius.xl,
126
160
  },
127
161
  },
128
162
  shape: {