@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
@@ -0,0 +1,85 @@
1
+ import * as React from "react";
2
+ import type { SelectOption } from "../../components/select";
3
+ export type MemberRow = {
4
+ id: string;
5
+ name: React.ReactNode;
6
+ isYou?: boolean;
7
+ email: string;
8
+ /** "Admin" renders Attio's measured purple role badge; any other value
9
+ * renders as plain text (Attio's own Member role has no pill). */
10
+ role: "Admin" | React.ReactNode;
11
+ teams?: React.ReactNode;
12
+ avatarSrc?: string;
13
+ };
14
+ export type MembersSettingsProps = Omit<React.ComponentPropsWithoutRef<"div">, "title"> & {
15
+ members: MemberRow[];
16
+ /** Search box value (controlled). */
17
+ searchValue?: string;
18
+ onSearchChange?: (value: string) => void;
19
+ onFilterClick?: () => void;
20
+ onInviteClick?: () => void;
21
+ onRowMenuClick?: (member: MemberRow) => void;
22
+ /** Which pill is active — Members is the only tab with a built shape
23
+ * (P-119/P-120); Teams renders `teamsContent` or a muted placeholder,
24
+ * since Attio's Teams tab body wasn't part of this issue's measurement. */
25
+ tab?: "members" | "teams";
26
+ onTabChange?: (tab: "members" | "teams") => void;
27
+ teamsContent?: React.ReactNode;
28
+ className?: string;
29
+ /** Chrome strings, each overridable for non-English UIs. */
30
+ title?: string;
31
+ description?: string;
32
+ learnMoreLabel?: string;
33
+ learnMoreHref?: string;
34
+ membersTabLabel?: string;
35
+ teamsTabLabel?: string;
36
+ tablistLabel?: string;
37
+ searchPlaceholder?: string;
38
+ filterLabel?: string;
39
+ inviteLabel?: string;
40
+ userColumnLabel?: string;
41
+ roleColumnLabel?: string;
42
+ teamsColumnLabel?: string;
43
+ memberActionsLabel?: string;
44
+ noTeamsLabel?: string;
45
+ };
46
+ /**
47
+ * Attio's "Members and teams" settings page (crisp#636, P-119/P-120):
48
+ * title + description, a Members/Teams segmented switcher, a
49
+ * search+Filter+Invite toolbar, and the members table (User/Role/Teams).
50
+ * Compose `InviteMembersDialog` alongside for the "Invite members" flow.
51
+ */
52
+ export declare function MembersSettings({ members, searchValue, onSearchChange, onFilterClick, onInviteClick, onRowMenuClick, tab: tabProp, onTabChange, teamsContent, className, title, description, learnMoreLabel, learnMoreHref, membersTabLabel, teamsTabLabel, tablistLabel, searchPlaceholder, filterLabel, inviteLabel, userColumnLabel, roleColumnLabel, teamsColumnLabel, memberActionsLabel, noTeamsLabel, ...rest }: MembersSettingsProps): React.JSX.Element;
53
+ export declare namespace MembersSettings {
54
+ var displayName: string;
55
+ }
56
+ export type InviteMembersDialogProps = Omit<React.ComponentPropsWithoutRef<"div">, "title" | "onSend" | "children"> & {
57
+ open: boolean;
58
+ onOpenChange: (open: boolean) => void;
59
+ /** Comma/newline-separated email list, as typed into the composer. */
60
+ emails: string;
61
+ onEmailsChange: (value: string) => void;
62
+ inviteAs: "member" | "admin";
63
+ onInviteAsChange: (value: "member" | "admin") => void;
64
+ team: string;
65
+ onTeamChange: (value: string) => void;
66
+ teamOptions?: SelectOption[];
67
+ onSend: () => void;
68
+ title?: string;
69
+ emailsPlaceholder?: string;
70
+ inviteAsFieldLabel?: string;
71
+ memberOptionLabel?: string;
72
+ adminOptionLabel?: string;
73
+ addToTeamFieldLabel?: string;
74
+ addToTeamPlaceholder?: string;
75
+ sendLabel?: string;
76
+ };
77
+ /**
78
+ * Attio's "Invite members" modal (crisp#636, P-120), measured live: 708px
79
+ * wide, a multi-email composer, an "Invite as" select (default Member) and
80
+ * an optional "Add to team" search-or-create select, footer "Send Invites".
81
+ */
82
+ export declare function InviteMembersDialog({ open, onOpenChange, emails, onEmailsChange, inviteAs, onInviteAsChange, team, onTeamChange, teamOptions, onSend, title, emailsPlaceholder, inviteAsFieldLabel, memberOptionLabel, adminOptionLabel, addToTeamFieldLabel, addToTeamPlaceholder, sendLabel, ...rest }: InviteMembersDialogProps): React.JSX.Element;
83
+ export declare namespace InviteMembersDialog {
84
+ var displayName: string;
85
+ }
@@ -0,0 +1,3 @@
1
+ declare const config: import("../..").RecipeConfig<{}>;
2
+ export declare const memberssettingsRecipe: import("../..").RecipeFn<{}>;
3
+ export default config;
@@ -0,0 +1 @@
1
+ export { type NotificationMatrixRow, NotificationsSettings, type NotificationsSettingsProps, } from "./notificationssettings";
@@ -0,0 +1,37 @@
1
+ import type * as React from "react";
2
+ export type NotificationMatrixRow = {
3
+ id: string;
4
+ title: React.ReactNode;
5
+ description: React.ReactNode;
6
+ email: boolean;
7
+ app: boolean;
8
+ };
9
+ export type NotificationsSettingsProps = Omit<React.ComponentPropsWithoutRef<"div">, "title"> & {
10
+ dailyDigestEnabled: boolean;
11
+ onDailyDigestChange: (enabled: boolean) => void;
12
+ rows: NotificationMatrixRow[];
13
+ onEmailChange: (id: string, checked: boolean) => void;
14
+ onAppChange: (id: string, checked: boolean) => void;
15
+ /** Chrome strings, each overridable for non-English UIs. */
16
+ title?: string;
17
+ description?: string;
18
+ learnMoreLabel?: string;
19
+ learnMoreHref?: string;
20
+ dailyDigestSectionTitle?: string;
21
+ dailyDigestRowTitle?: string;
22
+ dailyDigestRowDescription?: string;
23
+ collaborationSectionTitle?: string;
24
+ notifyMeAboutLabel?: string;
25
+ emailColumnLabel?: string;
26
+ appColumnLabel?: string;
27
+ };
28
+ /**
29
+ * Attio's "Notifications" settings page (crisp#630, P-083): title +
30
+ * description, a "Daily digest" card (a single toggle row), and a
31
+ * "Collaboration notifications" matrix — a header row plus one row per
32
+ * event, each with an Email and an App checkbox. Measured live.
33
+ */
34
+ export declare function NotificationsSettings({ dailyDigestEnabled, onDailyDigestChange, rows, onEmailChange, onAppChange, className, title, description, learnMoreLabel, learnMoreHref, dailyDigestSectionTitle, dailyDigestRowTitle, dailyDigestRowDescription, collaborationSectionTitle, notifyMeAboutLabel, emailColumnLabel, appColumnLabel, ...rest }: NotificationsSettingsProps): React.JSX.Element;
35
+ export declare namespace NotificationsSettings {
36
+ var displayName: string;
37
+ }
@@ -0,0 +1,3 @@
1
+ declare const config: import("../..").RecipeConfig<{}>;
2
+ export declare const notificationssettingsRecipe: import("../..").RecipeFn<{}>;
3
+ export default config;
@@ -1,8 +1,18 @@
1
1
  import { type LucideIcon } from "lucide-react";
2
2
  import * as React from "react";
3
+ import { type CommentAuthor, type CommentThread } from "../comments";
3
4
  import { type Column, type Row } from "./column";
5
+ /**
6
+ * `title` is optional (#871) — Attio's own note preview always has one (a
7
+ * real note defaults to "Untitled note" until renamed, confirmed live), but
8
+ * crisp's own data model has never carried a separate note title, only
9
+ * `text`, and no existing consumer supplies one. Adding it as optional
10
+ * rather than required keeps every existing `notes` array valid; a consumer
11
+ * with no title concept just gets the single remaining string inline.
12
+ */
4
13
  export type RecordPageNote = {
5
14
  id: string;
15
+ title?: string;
6
16
  text: string;
7
17
  time: string;
8
18
  };
@@ -90,6 +100,26 @@ export type RecordPageProps = Omit<React.ComponentPropsWithoutRef<"div">, "child
90
100
  /** When provided, shows a maximise/minimise button in the top bar. */
91
101
  onToggleFull?: () => void;
92
102
  full?: boolean;
103
+ /**
104
+ * The peek-style header (#624) — measured live: expanding a peek to its
105
+ * full record does NOT revert to the plain breadcrumb, it keeps a hybrid
106
+ * header (Close, Previous/Next, "N of M in <view>" counter), replacing the
107
+ * breadcrumb entirely rather than adding to it. Naming mirrors
108
+ * `RecordPanel`'s own identical props exactly (`onClose`/`closeLabel`,
109
+ * `onPrevious`/`previousRecordLabel`, `onNext`/`nextRecordLabel`,
110
+ * `counterLabel`) — a consumer wiring both components together (a list
111
+ * whose peek expands to this page) reuses the same handlers and state,
112
+ * not a second parallel API. `onClose` alone is enough to switch the
113
+ * topbar into this mode; Previous/Next/counter are each independently
114
+ * optional, same as `RecordPanel`'s own toolbar.
115
+ */
116
+ onClose?: () => void;
117
+ closeLabel?: string;
118
+ onPrevious?: () => void;
119
+ previousRecordLabel?: string;
120
+ onNext?: () => void;
121
+ nextRecordLabel?: string;
122
+ counterLabel?: React.ReactNode;
93
123
  className?: string;
94
124
  /**
95
125
  * Replaces the built-in CRM tab set. An app with a non-CRM domain (a
@@ -143,6 +173,29 @@ export type RecordPageProps = Omit<React.ComponentPropsWithoutRef<"div">, "child
143
173
  * the built-in CRM set.
144
174
  */
145
175
  highlights?: RecordPageHighlight[] | false;
176
+ /**
177
+ * Wires the header's Comments entry point (#864) to crisp's own,
178
+ * already-closed `product/comments` panel (#625) — the gap #864 found
179
+ * wasn't the comments feature itself, only that `RecordPage` never
180
+ * opened it. Controlled the same way `notes`/`tasks` are: supply this
181
+ * (even `[]`) and `onPostComment` to own the data yourself; omit both to
182
+ * let `RecordPage` keep a small self-contained thread list, same as its
183
+ * default Notes/Tasks behaviour.
184
+ */
185
+ comments?: CommentThread[];
186
+ onPostComment?: (text: string, threadId: string | null) => void;
187
+ /**
188
+ * Attributes a self-managed comment's `author` (id/name/avatar) — has no
189
+ * effect when `comments` is controlled, since then every thread's author
190
+ * is already the caller's own data. Defaults to a synthetic "You", same
191
+ * as Notes/Tasks already show for a comment-less consumer.
192
+ */
193
+ currentUser?: CommentAuthor;
194
+ /** Called when the header's Share button is clicked. Renders regardless
195
+ * (matching Compose email/Add to list's own no-op-until-wired
196
+ * convention) — Attio's own Share opens a dialog crisp has no measured
197
+ * content for; only the entry point is in scope here (#864). */
198
+ onShare?: () => void;
146
199
  };
147
200
  /**
148
201
  * Every chrome string RecordPage renders. Supplied as a PARTIAL map, so
@@ -161,6 +214,14 @@ export type RecordPageLabels = {
161
214
  addToFavourites: string;
162
215
  removeFromFavourites: string;
163
216
  copyRecordLink: string;
217
+ /** "…" record actions menu (#621): configure the record page's layout. */
218
+ configurePage: string;
219
+ /** "…" record actions menu (#621): copy this page's own URL. */
220
+ copyPageUrl: string;
221
+ /** "…" record actions menu (#621): copy the record's raw id. */
222
+ copyRecordId: string;
223
+ /** "…" record actions menu (#621): merge this record into another. */
224
+ mergeRecords: string;
164
225
  deleteRecord: string;
165
226
  linkRecords: string;
166
227
  logANote: string;
@@ -172,6 +233,10 @@ export type RecordPageLabels = {
172
233
  composeEmail: string;
173
234
  askAttio: string;
174
235
  addToList: string;
236
+ /** The header's text-only Share button (#864, measured: no icon). */
237
+ share: string;
238
+ /** aria-label on the header's Comments icon button (#864). */
239
+ comments: string;
175
240
  /** Empty state under the Lists panel. */
176
241
  noLists: string;
177
242
  highlights: string;
@@ -234,6 +299,28 @@ export type RecordDetailsProps = Omit<React.ComponentPropsWithoutRef<"div">, "ch
234
299
  onEdit?: (id: string, key: string, value: string) => Promise<void> | void;
235
300
  labels?: RecordPageLabelsInput;
236
301
  className?: string;
302
+ /**
303
+ * Drag-to-resize (#930) — the same shape `RecordPanel`'s own resize props
304
+ * already have (`resizable`/`width`/`defaultWidth`/`onWidthChange`/
305
+ * `minWidth`/`maxWidth`), so a consumer composing `RecordDetails`
306
+ * standalone (GRC's own record-page rail: its own header/tabs, this
307
+ * component for the details column only) gets Attio's real record-page
308
+ * details-column resize without reimplementing the drag math `RecordPage`
309
+ * already has internally for its own aside. Uncontrolled by default
310
+ * (`defaultWidth`); pass `width`/`onWidthChange` together to own it
311
+ * instead — same controlled/uncontrolled split as `RecordPanel`'s.
312
+ * `minWidth`/`maxWidth`/`defaultWidth` default to the exact clamp
313
+ * `RecordPage`'s own resizer already uses (#798, live-measured: 619/1170,
314
+ * 734 default) — reused, not re-measured. Omit `resizable` (the default)
315
+ * to keep rendering the plain, non-resizing block this component has
316
+ * always been.
317
+ */
318
+ resizable?: boolean;
319
+ width?: number;
320
+ defaultWidth?: number;
321
+ onWidthChange?: (width: number) => void;
322
+ minWidth?: number;
323
+ maxWidth?: number;
237
324
  };
238
325
  /**
239
326
  * The Details column's own field list, on its own (#528) — `RecordPage`'s
@@ -256,7 +343,7 @@ export type RecordDetailsProps = Omit<React.ComponentPropsWithoutRef<"div">, "ch
256
343
  * `RecordPage`'s own root does: `<div className={recordpageRecipe()}>`
257
344
  * (also exported from this package).
258
345
  */
259
- export declare function RecordDetails({ record, columns, sections, onEdit, labels, className, ...rest }: RecordDetailsProps): React.JSX.Element;
346
+ export declare function RecordDetails({ record, columns, sections, onEdit, labels, className, resizable, width: controlledWidth, defaultWidth, onWidthChange, minWidth, maxWidth, ...rest }: RecordDetailsProps): React.JSX.Element;
260
347
  export declare namespace RecordDetails {
261
348
  var displayName: string;
262
349
  }
@@ -268,7 +355,7 @@ export declare namespace RecordDetails {
268
355
  * Emails sections (Notes & Tasks are live — add and check things off). Drop it
269
356
  * into the app's main content area.
270
357
  */
271
- export declare function RecordPage({ record, columns, collection, labels, onBack, onToggleFull, full, className, onEdit, tabs: tabsProp, defaultTab, notes: notesProp, onAddNote, tasks: tasksProp, onAddTask, onToggleTask, sections, highlights: highlightsProp, quickActions: quickActionsProp, ...rest }: RecordPageProps): React.JSX.Element;
358
+ export declare function RecordPage({ record, columns, collection, labels, onBack, onToggleFull, full, onClose, closeLabel, onPrevious, previousRecordLabel, onNext, nextRecordLabel, counterLabel, className, onEdit, tabs: tabsProp, defaultTab, notes: notesProp, onAddNote, tasks: tasksProp, onAddTask, onToggleTask, sections, highlights: highlightsProp, quickActions: quickActionsProp, comments: commentsProp, onPostComment, currentUser, onShare, ...rest }: RecordPageProps): React.JSX.Element;
272
359
  export declare namespace RecordPage {
273
360
  var displayName: string;
274
361
  }
@@ -0,0 +1 @@
1
+ export { type WorkspaceExportRow, WorkspaceGeneralSettings, type WorkspaceGeneralSettingsProps, } from "./workspacegeneralsettings";
@@ -0,0 +1,48 @@
1
+ import type * as React from "react";
2
+ export type WorkspaceExportRow = {
3
+ id: string;
4
+ type: React.ReactNode;
5
+ date: React.ReactNode;
6
+ };
7
+ export type WorkspaceGeneralSettingsProps = Omit<React.ComponentPropsWithoutRef<"div">, "title"> & {
8
+ logoSrc?: string;
9
+ /** Shown in the logo tile when `logoSrc` is unset — the workspace's own initial. */
10
+ workspaceInitial: string;
11
+ onUploadLogo?: () => void;
12
+ name: string;
13
+ onNameChange: (value: string) => void;
14
+ slug: string;
15
+ onCopySlug?: () => void;
16
+ exports: WorkspaceExportRow[];
17
+ onStartExport?: () => void;
18
+ onDeleteWorkspace?: () => void;
19
+ /** Chrome strings, each overridable for non-English UIs. */
20
+ title?: string;
21
+ description?: string;
22
+ learnMoreLabel?: string;
23
+ learnMoreHref?: string;
24
+ logoHelpText?: string;
25
+ uploadLogoLabel?: string;
26
+ nameFieldLabel?: string;
27
+ slugFieldLabel?: string;
28
+ copySlugLabel?: string;
29
+ exportSectionTitle?: string;
30
+ exportSectionDescription?: string;
31
+ startExportLabel?: string;
32
+ typeColumnLabel?: string;
33
+ dateColumnLabel?: string;
34
+ noExportsLabel?: string;
35
+ dangerSectionTitle?: string;
36
+ deleteWorkspaceTitle?: string;
37
+ deleteWorkspaceWarning?: string;
38
+ deleteWorkspaceLabel?: string;
39
+ };
40
+ /**
41
+ * Attio's Settings → Workspace → General page (crisp#638, P-128), measured
42
+ * live: a logo + Name/Slug section, an "Export workspace data" table, and a
43
+ * "Danger zone" delete-workspace row.
44
+ */
45
+ export declare function WorkspaceGeneralSettings({ logoSrc, workspaceInitial, onUploadLogo, name, onNameChange, slug, onCopySlug, exports: exportRows, onStartExport, onDeleteWorkspace, className, title, description, learnMoreLabel, learnMoreHref, logoHelpText, uploadLogoLabel, nameFieldLabel, slugFieldLabel, copySlugLabel, exportSectionTitle, exportSectionDescription, startExportLabel, typeColumnLabel, dateColumnLabel, noExportsLabel, dangerSectionTitle, deleteWorkspaceTitle, deleteWorkspaceWarning, deleteWorkspaceLabel, ...rest }: WorkspaceGeneralSettingsProps): React.JSX.Element;
46
+ export declare namespace WorkspaceGeneralSettings {
47
+ var displayName: string;
48
+ }
@@ -0,0 +1,3 @@
1
+ declare const config: import("../..").RecipeConfig<{}>;
2
+ export declare const workspacegeneralsettingsRecipe: import("../..").RecipeFn<{}>;
3
+ export default config;
@@ -3,6 +3,8 @@ export type Theme = "light" | "dark";
3
3
  export declare const contract: MapLeafNodes<{
4
4
  bgBrandSolid: "brand600";
5
5
  bgBrandSolidPressed: "brand700";
6
+ bgBrandContrast: "brandContrast";
7
+ fgBrandContrast: "brandContrast";
6
8
  fgOnBrand: "white";
7
9
  fgOnTone: "ink";
8
10
  bgSurface: "gray00";
@@ -18,6 +20,8 @@ export declare const contract: MapLeafNodes<{
18
20
  bgTileActive: "tileActive";
19
21
  shadowTileActive: "tileActiveShadow";
20
22
  bgScrim: "bgScrim";
23
+ bgOverlayStrong: "bgOverlayStrong";
24
+ strokeGroupDivider: "strokeGroupDivider";
21
25
  fgAlertDescription: "fgAlertDescription";
22
26
  bgOverlayFrost: "overlayFrost";
23
27
  shadowOverlay1: "shadowOverlay1";
@@ -43,6 +47,7 @@ export declare const contract: MapLeafNodes<{
43
47
  strokeFocusRing: "focusRing";
44
48
  bgSuccess: "green600";
45
49
  bgWarning: "amber600";
50
+ bgWarningSolid: "amberSolid";
46
51
  bgOrange: "orange600";
47
52
  bgCyan: "cyan600";
48
53
  bgPurple: "purple600";
@@ -68,9 +73,10 @@ export declare const contract: MapLeafNodes<{
68
73
  shadowSelect: "selectShadow";
69
74
  }, `var(--${string})`> & {
70
75
  space: Record<"0.5" | "1" | "1.5" | "2" | "2.5" | "3" | "3.5" | "4" | "5" | "6" | "8" | "px", `var(--${string})`>;
71
- radius: Record<"2xl" | "3xl" | "chip" | "full" | "lg" | "md" | "sm" | "xl", `var(--${string})`>;
76
+ radius: Record<"2xl" | "3xl" | "4xl" | "chip" | "full" | "lg" | "md" | "sm" | "xl" | "xs", `var(--${string})`>;
72
77
  size: Record<"calendarCell" | "calendarPill" | "chip" | "header" | "icon" | "menuRow" | "row" | "selectIconLg" | "selectTriggerLg" | "selectTriggerMd" | "tableHeader" | "tableRow", `var(--${string})`>;
73
78
  font: Record<"sans", `var(--${string})`>;
74
79
  text: Record<"lg" | "md" | "sm" | "xl" | "xs", `var(--${string})`>;
75
80
  weight: Record<"bold" | "medium" | "regular" | "semibold", `var(--${string})`>;
81
+ tracking: Record<"18" | "20" | "24" | "26" | "28" | "32", `var(--${string})`>;
76
82
  };
@@ -11,9 +11,11 @@
11
11
  */
12
12
  export declare const elevation: {
13
13
  /**
14
- * Tier 1 — anything floating and *attached*: menus, popovers, dropdowns,
14
+ * Tier 1 — anything floating and *attached*: popovers, dropdowns,
15
15
  * hover-preview cards, the floating sidebar, the record peek, drawers, the
16
16
  * bulk bar. Pairs with a 10–12px radius and, for panels, an 8px gutter.
17
+ * NOT `Menu` (your-moon/crisp#934) -- that moved to
18
+ * `selectFloating`, seed-design's own flat shadow, below.
17
19
  */
18
20
  readonly floating: `inset 0 0 0 1px var(--${string}), 0 0 0 1px var(--${string}), 0 4px 8px -4px var(--${string}), 0 4px 12px -2px var(--${string})`;
19
21
  /**
@@ -56,10 +58,11 @@ export declare const elevation: {
56
58
  */
57
59
  readonly fieldNoRing: `0 0 2px rgba(28,40,64,0.18), 0 1px 3px rgba(0,0,0,0.04)`;
58
60
  /**
59
- * Select's own listbox shadow (crisp/#867) — seed-design's `$shadow.s3`, a
60
- * single layer, NOT `floating` above. This component follows seed, not
61
- * Attio, for the same reason `DatePicker` follows seed's calendar
62
- * structure: an explicit owner request to match seed-design exactly.
61
+ * Seed-design's own `$shadow.s3`, a single flat layer, NOT `floating`
62
+ * above. Originally Select's own listbox shadow (crisp/#867); also `Menu`'s
63
+ * (your-moon/crisp#934) -- the raw seed dump confirms Menu
64
+ * is the one component seed's own spec gives a shadow to at all, and it's
65
+ * this exact value. Despite the name, not exclusive to Select.
63
66
  */
64
67
  readonly selectFloating: `0 4px 16px var(--${string})`;
65
68
  };
@@ -12,7 +12,7 @@ export declare const palette: {
12
12
  readonly dark: "#101112";
13
13
  };
14
14
  readonly gray50: {
15
- readonly light: "#f4f4f5";
15
+ readonly light: "#f7f8f9";
16
16
  readonly dark: "#101112";
17
17
  };
18
18
  readonly gray900: {
@@ -20,7 +20,7 @@ export declare const palette: {
20
20
  readonly dark: "#f5f5f5";
21
21
  };
22
22
  readonly line200: {
23
- readonly light: "#e4e4e7";
23
+ readonly light: "#dcdee3";
24
24
  readonly dark: "#212224";
25
25
  };
26
26
  readonly line100: {
@@ -60,9 +60,17 @@ export declare const palette: {
60
60
  readonly dark: "rgba(0,0,0,0)";
61
61
  };
62
62
  readonly bgScrim: {
63
- readonly light: "rgba(0,0,0,0.25)";
63
+ readonly light: "rgba(0,0,0,0.45)";
64
64
  readonly dark: "rgba(0,0,0,0.55)";
65
65
  };
66
+ readonly bgOverlayStrong: {
67
+ readonly light: "#00000074";
68
+ readonly dark: "#00000074";
69
+ };
70
+ readonly strokeGroupDivider: {
71
+ readonly light: "#00000010";
72
+ readonly dark: "#ffffff17";
73
+ };
66
74
  readonly fgAlertDescription: {
67
75
  readonly light: "rgba(0,0,0,0.63)";
68
76
  readonly dark: "rgba(255,255,255,0.6)";
@@ -108,23 +116,27 @@ export declare const palette: {
108
116
  readonly dark: "#9a9aa2";
109
117
  };
110
118
  readonly brand600: {
111
- readonly light: "#266df0";
112
- readonly dark: "#266df0";
119
+ readonly light: "#0298d9";
120
+ readonly dark: "#0298d9";
113
121
  };
114
122
  readonly brand700: {
115
- readonly light: "#1f5fd6";
116
- readonly dark: "#1f5fd6";
123
+ readonly light: "#0283bb";
124
+ readonly dark: "#0283bb";
125
+ };
126
+ readonly brandContrast: {
127
+ readonly light: "#0278ac";
128
+ readonly dark: "#0278ac";
117
129
  };
118
130
  readonly red600: {
119
- readonly light: "#e5484d";
131
+ readonly light: "#fa342c";
120
132
  readonly dark: "#ff5a5f";
121
133
  };
122
134
  readonly red700: {
123
- readonly light: "#ba2525";
135
+ readonly light: "#ca1d13";
124
136
  readonly dark: "#ba2525";
125
137
  };
126
138
  readonly red500: {
127
- readonly light: "#eb3b3b";
139
+ readonly light: "#fa342c";
128
140
  readonly dark: "#ff5a5f";
129
141
  };
130
142
  readonly fieldFocus: {
@@ -160,11 +172,15 @@ export declare const palette: {
160
172
  readonly dark: "#5e98fe";
161
173
  };
162
174
  readonly green600: {
163
- readonly light: "#1f9d57";
175
+ readonly light: "#079171";
164
176
  readonly dark: "#2ea968";
165
177
  };
166
178
  readonly amber600: {
167
- readonly light: "#b5730f";
179
+ readonly light: "#9b7821";
180
+ readonly dark: "#e0982a";
181
+ };
182
+ readonly amberSolid: {
183
+ readonly light: "#fbdc65";
168
184
  readonly dark: "#e0982a";
169
185
  };
170
186
  readonly orange600: {
@@ -13,13 +13,15 @@ export declare const space: {
13
13
  readonly "8": "32px";
14
14
  };
15
15
  export declare const radius: {
16
- readonly chip: "7px";
16
+ readonly xs: "4px";
17
+ readonly chip: "999px";
17
18
  readonly sm: "6px";
18
19
  readonly md: "8px";
19
20
  readonly lg: "9px";
20
21
  readonly xl: "12px";
21
22
  readonly "2xl": "16px";
22
23
  readonly "3xl": "20px";
24
+ readonly "4xl": "24px";
23
25
  readonly full: "999px";
24
26
  };
25
27
  export declare const size: {
@@ -52,9 +54,18 @@ export declare const weight: {
52
54
  readonly semibold: "600";
53
55
  readonly bold: "700";
54
56
  };
57
+ export declare const tracking: {
58
+ readonly "18": "-0.36px";
59
+ readonly "20": "-0.4px";
60
+ readonly "24": "-0.48px";
61
+ readonly "26": "-0.52px";
62
+ readonly "28": "-0.56px";
63
+ readonly "32": "-0.64px";
64
+ };
55
65
  export type SpaceKey = keyof typeof space;
56
66
  export type RadiusKey = keyof typeof radius;
57
67
  export type SizeKey = keyof typeof size;
58
68
  export type FontKey = keyof typeof font;
59
69
  export type TextKey = keyof typeof text;
60
70
  export type WeightKey = keyof typeof weight;
71
+ export type TrackingKey = keyof typeof tracking;
@@ -1,6 +1,17 @@
1
1
  export declare const semantic: {
2
2
  bgBrandSolid: "brand600";
3
3
  bgBrandSolidPressed: "brand700";
4
+ /** your-moon/crisp#897: the AA-safe darker sibling of `bgBrandSolid` — a
5
+ * SOLID fill carrying white text (Button primary, Badge solid+brand,
6
+ * Avatar's brand tone). `bgBrandSolid` itself stays the exact brand
7
+ * accent (focus rings, selected states, icons, tints), unpaired with
8
+ * white text anywhere that matters for contrast. */
9
+ bgBrandContrast: "brandContrast";
10
+ /** your-moon/crisp#897: brand-coloured TEXT sitting on a white page
11
+ * (TextLink/Text's `brand` tone) — same value as `bgBrandContrast`,
12
+ * named separately because one's a background and one's a foreground,
13
+ * matching every other fg/bg pair in this file. */
14
+ fgBrandContrast: "brandContrast";
4
15
  fgOnBrand: "white";
5
16
  fgOnTone: "ink";
6
17
  bgSurface: "gray00";
@@ -24,6 +35,8 @@ export declare const semantic: {
24
35
  bgTileActive: "tileActive";
25
36
  shadowTileActive: "tileActiveShadow";
26
37
  bgScrim: "bgScrim";
38
+ bgOverlayStrong: "bgOverlayStrong";
39
+ strokeGroupDivider: "strokeGroupDivider";
27
40
  fgAlertDescription: "fgAlertDescription";
28
41
  bgOverlayFrost: "overlayFrost";
29
42
  shadowOverlay1: "shadowOverlay1";
@@ -60,6 +73,10 @@ export declare const semantic: {
60
73
  strokeFocusRing: "focusRing";
61
74
  bgSuccess: "green600";
62
75
  bgWarning: "amber600";
76
+ /** A SOLID warning fill (Badge's `variant="solid" tone="warning"`) — seed's
77
+ * own warning-solid is a distinct, paler yellow, not `bgWarning` tinted
78
+ * lighter. See `amberSolid` in palette.ts. */
79
+ bgWarningSolid: "amberSolid";
63
80
  bgOrange: "orange600";
64
81
  bgCyan: "cyan600";
65
82
  bgPurple: "purple600";
@@ -1,14 +1,16 @@
1
1
  .crisp-wheelpicker {
2
2
  position: relative; box-sizing: border-box; width: 100%; overflow: hidden; background: var(--crisp-bg-surface); font-family: var(--crisp-font-sans); /* the band the selected row sits in; behind the items, never hit-tested */
3
3
  & .crisp-wheelpicker-indicator { position: absolute; z-index: 0; inset-inline: var(--crisp-space-4); top: 50%; transform: translateY(-50%); border-radius: var(--crisp-radius-md); background: var(--crisp-bg-neutral-weak); pointer-events: none; }
4
- /* fades the rows furthest from the centre, so the column reads as a wheel rather than a list. 40% of the viewport, capped, top and bottom. */
4
+ /* fades the rows furthest from the centre, so the column reads as a wheel
5
+ rather than a list. 40% of the viewport, capped, top and bottom. */
5
6
  & .crisp-wheelpicker-fog { position: relative; z-index: 1; height: 100%; overflow: hidden; mask-image: linear-gradient( to bottom, transparent 0, #000 var(--crisp-wheelpicker-fog), #000 calc(100% - var(--crisp-wheelpicker-fog)), transparent 100% ); }
6
7
  & .crisp-wheelpicker-columns { display: flex; width: 100%; height: 100%; justify-content: center; }
7
8
  & .crisp-wheelpicker-column { box-sizing: border-box; flex: 0 0 auto; width: max-content; height: 100%; overflow-x: hidden; overflow-y: auto; overscroll-behavior-y: contain; overscroll-behavior-x: none; scroll-snap-type: y mandatory; touch-action: pan-y; scrollbar-width: none; -ms-overflow-style: none; outline: none; padding-block: var(--crisp-wheelpicker-offset); }
8
9
  & .crisp-wheelpicker-column::-webkit-scrollbar { display: none; }
9
10
  & .crisp-wheelpicker-item { display: flex; align-items: center; justify-content: center; scroll-snap-align: center; user-select: none; white-space: nowrap; padding-inline: var(--crisp-space-4); color: var(--crisp-fg-disabled); background: none; border: none; font: inherit; cursor: pointer; }
10
11
  & .crisp-wheelpicker-item[data-selected] { color: var(--crisp-fg-primary); }
11
- /* the ring is drawn on the SELECTED row, and only for keyboard focus: a pointer user has just tapped the row they meant and does not need it */
12
+ /* the ring is drawn on the SELECTED row, and only for keyboard focus:
13
+ a pointer user has just tapped the row they meant and does not need it */
12
14
  & .crisp-wheelpicker-column:focus-visible .crisp-wheelpicker-item[data-selected] { outline: 2px solid var(--crisp-stroke-focus-ring); outline-offset: -2px; border-radius: var(--crisp-radius-md); }
13
15
  }
14
16
  .crisp-wheelpicker--size_small {
@@ -2,14 +2,16 @@
2
2
  .crisp-wheelpicker {
3
3
  position: relative; box-sizing: border-box; width: 100%; overflow: hidden; background: var(--crisp-bg-surface); font-family: var(--crisp-font-sans); /* the band the selected row sits in; behind the items, never hit-tested */
4
4
  & .crisp-wheelpicker-indicator { position: absolute; z-index: 0; inset-inline: var(--crisp-space-4); top: 50%; transform: translateY(-50%); border-radius: var(--crisp-radius-md); background: var(--crisp-bg-neutral-weak); pointer-events: none; }
5
- /* fades the rows furthest from the centre, so the column reads as a wheel rather than a list. 40% of the viewport, capped, top and bottom. */
5
+ /* fades the rows furthest from the centre, so the column reads as a wheel
6
+ rather than a list. 40% of the viewport, capped, top and bottom. */
6
7
  & .crisp-wheelpicker-fog { position: relative; z-index: 1; height: 100%; overflow: hidden; mask-image: linear-gradient( to bottom, transparent 0, #000 var(--crisp-wheelpicker-fog), #000 calc(100% - var(--crisp-wheelpicker-fog)), transparent 100% ); }
7
8
  & .crisp-wheelpicker-columns { display: flex; width: 100%; height: 100%; justify-content: center; }
8
9
  & .crisp-wheelpicker-column { box-sizing: border-box; flex: 0 0 auto; width: max-content; height: 100%; overflow-x: hidden; overflow-y: auto; overscroll-behavior-y: contain; overscroll-behavior-x: none; scroll-snap-type: y mandatory; touch-action: pan-y; scrollbar-width: none; -ms-overflow-style: none; outline: none; padding-block: var(--crisp-wheelpicker-offset); }
9
10
  & .crisp-wheelpicker-column::-webkit-scrollbar { display: none; }
10
11
  & .crisp-wheelpicker-item { display: flex; align-items: center; justify-content: center; scroll-snap-align: center; user-select: none; white-space: nowrap; padding-inline: var(--crisp-space-4); color: var(--crisp-fg-disabled); background: none; border: none; font: inherit; cursor: pointer; }
11
12
  & .crisp-wheelpicker-item[data-selected] { color: var(--crisp-fg-primary); }
12
- /* the ring is drawn on the SELECTED row, and only for keyboard focus: a pointer user has just tapped the row they meant and does not need it */
13
+ /* the ring is drawn on the SELECTED row, and only for keyboard focus:
14
+ a pointer user has just tapped the row they meant and does not need it */
13
15
  & .crisp-wheelpicker-column:focus-visible .crisp-wheelpicker-item[data-selected] { outline: 2px solid var(--crisp-stroke-focus-ring); outline-offset: -2px; border-radius: var(--crisp-radius-md); }
14
16
  }
15
17
  .crisp-wheelpicker--size_small {
@@ -0,0 +1,30 @@
1
+ .crisp-workspacegeneralsettings {
2
+ & .crisp-workspacegeneralsettings-page { display: flex; flex-direction: column; gap: var(--crisp-space-6); font-family: var(--crisp-font-sans); }
3
+ & .crisp-workspacegeneralsettings-heading { display: flex; flex-direction: column; gap: var(--crisp-space-0-5); }
4
+ & .crisp-workspacegeneralsettings-title { font-size: 24px; line-height: 28px; font-weight: var(--crisp-weight-semibold); letter-spacing: -0.48px; color: var(--crisp-fg-primary); margin: 0; }
5
+ & .crisp-workspacegeneralsettings-desc { font-size: var(--crisp-text-lg); line-height: 20px; color: var(--crisp-fg-muted); margin: 0; }
6
+ & .crisp-workspacegeneralsettings-section { display: flex; flex-direction: column; gap: var(--crisp-space-4); }
7
+ & .crisp-workspacegeneralsettings-sectiontitle { font-size: 16px; line-height: 20px; font-weight: var(--crisp-weight-semibold); color: var(--crisp-fg-primary); margin: 0; }
8
+ & .crisp-workspacegeneralsettings-sectionhead { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--crisp-space-4); }
9
+ & .crisp-workspacegeneralsettings-sectionhead-text { display: flex; flex-direction: column; gap: var(--crisp-space-1); }
10
+ /* Logo row: a tile + helper text + "Upload logo" button. */
11
+ & .crisp-workspacegeneralsettings-logorow { display: flex; align-items: center; gap: var(--crisp-space-4); }
12
+ & .crisp-workspacegeneralsettings-logohelp { font-size: var(--crisp-text-sm); color: var(--crisp-fg-muted); }
13
+ & .crisp-workspacegeneralsettings-logotext { display: flex; flex-direction: column; align-items: flex-start; gap: var(--crisp-space-1); }
14
+ /* Name + Slug sit side by side, each ~half the content width. */
15
+ & .crisp-workspacegeneralsettings-fieldrow { display: flex; gap: var(--crisp-space-4); }
16
+ & .crisp-workspacegeneralsettings-fieldrow > * { flex: 1; min-width: 0; }
17
+ & .crisp-workspacegeneralsettings-slugfield { display: flex; align-items: center; gap: var(--crisp-space-1-5); }
18
+ & .crisp-workspacegeneralsettings-slugfield > :first-child { flex: 1; min-width: 0; }
19
+ & .crisp-workspacegeneralsettings-copybtn { display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; width: 32px; height: 32px; border: none; border-radius: var(--crisp-radius-md); background: none; font-family: inherit; color: var(--crisp-fg-muted); cursor: pointer; }
20
+ & .crisp-workspacegeneralsettings-copybtn:hover { background: var(--crisp-bg-raised); color: var(--crisp-fg-primary); }
21
+ /* Export-data empty state -- measured: 14/500/63%-opacity, centred in a
22
+ 40px row, no border of its own (the Table wrapper already draws it). */
23
+ & .crisp-workspacegeneralsettings-emptyrow { padding: var(--crisp-space-2-5) var(--crisp-space-4); font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); text-align: center; }
24
+ /* Danger zone: a red-tinted bordered row, distinct from every other
25
+ card on the page. */
26
+ & .crisp-workspacegeneralsettings-dangerrow { display: flex; align-items: center; justify-content: space-between; gap: var(--crisp-space-6); padding: var(--crisp-space-3) var(--crisp-space-4); border: 1px solid color-mix(in srgb, var(--crisp-bg-danger) 30%, transparent); border-radius: 12px; background: color-mix(in srgb, var(--crisp-bg-danger) 6%, transparent); }
27
+ & .crisp-workspacegeneralsettings-dangertext { display: flex; flex-direction: column; gap: var(--crisp-space-1); }
28
+ & .crisp-workspacegeneralsettings-rowtitle { font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-primary); }
29
+ & .crisp-workspacegeneralsettings-dangerwarning { font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); }
30
+ }