@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
@@ -267,6 +267,25 @@ export type DataTableColumn<T> = {
267
267
  * row's own record — that's what `onRowClick` is for. Ignored on any
268
268
  * other `type`. */
269
269
  onEntityClick?: (row: T) => void;
270
+ /** `type: "entity"` only (#893) — a column-scoped link to the ROW'S OWN
271
+ * record, rendered as a real `<a href>` (matching Attio's own measured
272
+ * markup exactly — its entity cell name is a genuine anchor, confirmed
273
+ * via `outerHTML`, not a button with a click handler). Distinct from
274
+ * `onEntityClick` above (a DIFFERENT record than the row) and from the
275
+ * table-level `onRowClick` (fires for a click on any non-editable cell
276
+ * in the row, not just this column) — a consumer whose other columns
277
+ * select-on-click can't wire `onRowClick` for this without turning every
278
+ * cell in the row into a navigation trigger too. Set at most one of
279
+ * `href`/`onEntityClick` per column; `href` wins if both are given. */
280
+ href?: (row: T) => string;
281
+ /** `type: "entity"` only (#892) — the avatar's corner shape: Attio's own
282
+ * measured default (a company/object logo, `border-radius: 30%`, already
283
+ * `Avatar`'s own `shape="rounded"` value) or `"circle"` (`Avatar`'s own
284
+ * `shape="circle"`, `border-radius: 50%`) for a person entity — measured
285
+ * live on a real Attio People avatar. Naming matches `Avatar`'s own
286
+ * `shape` prop values exactly. Default `"rounded"`, so every existing
287
+ * entity column (Companies-style) is unaffected. */
288
+ avatarShape?: "rounded" | "circle";
270
289
  /** `type: "entity"` only (crisp/#601, checklist G-048) — a right-aligned
271
290
  * "Open preview" icon that appears on row hover (or keyboard focus),
272
291
  * alongside `onOpenComments` below. Matches Attio's own measured pair
@@ -9,12 +9,38 @@ export type FileUploadLabels = {
9
9
  errors: Record<string, string>;
10
10
  };
11
11
  export declare const fileUploadLabels: FileUploadLabels;
12
+ export type FileUploadItemProps = {
13
+ name: string;
14
+ /** Bytes. Omit for a caller with no size to report. */
15
+ size?: number;
16
+ status?: FileEntry["status"];
17
+ /** 0-100. Only drawn while `status === "uploading"`. */
18
+ progress?: number;
19
+ /** Omit to render a non-removable row. */
20
+ onRemove?: () => void;
21
+ /** Required whenever `onRemove` is passed — the remove button's accessible name. */
22
+ removeLabel?: string;
23
+ className?: string;
24
+ };
25
+ /**
26
+ * One row of `FileUpload`'s own accepted-file list (crisp#965) — icon-free
27
+ * name + trailing size + remove, `min-height: size.tableRow` on `bgRaised`
28
+ * (measured from a data-grid row, see `fileupload.recipe.ts`). Exported on
29
+ * its own because `FileUpload` internally only lists `File` objects from the
30
+ * current browser session; a caller with already-persisted attachments
31
+ * (fetched from a server, never a real `File`) has no `acceptedFileEntries`
32
+ * to hand it and needs the identical row for its own list instead of
33
+ * hand-rolling one.
34
+ */
35
+ export declare function FileUploadItem({ name, size, status, progress, onRemove, removeLabel, className, }: FileUploadItemProps): React.JSX.Element;
12
36
  export type FileUploadProps = UseFileUploadProps & Omit<React.ComponentPropsWithoutRef<"div">, keyof UseFileUploadProps | "children"> & {
13
37
  /** PARTIAL override of the chrome strings; anything omitted keeps its default. */
14
38
  labels?: Partial<Omit<FileUploadLabels, "errors">> & {
15
39
  errors?: Record<string, string>;
16
40
  };
17
41
  };
42
+ /** 1000-based, matching how every file manager reports size. */
43
+ export declare function formatSize(bytes: number): string;
18
44
  /**
19
45
  * A file dropzone with an accepted-file list, driven by seed-design's headless
20
46
  * engine so the behaviour — drag state, accept/reject, per-file upload status —
@@ -1,2 +1,2 @@
1
- export { Input, type InputProps } from "./input";
1
+ export { Input, type InputProps, InputShell, type InputShellProps, } from "./input";
2
2
  export { inputRecipe } from "./input.recipe";
@@ -4,6 +4,12 @@ import { inputRecipe } from "./input.recipe";
4
4
  export type InputProps = Omit<React.ComponentPropsWithoutRef<"input">, "size"> & VariantProps<typeof inputRecipe> & {
5
5
  /** Class for the wrapper that draws the field chrome and focus ring. */
6
6
  className?: string;
7
+ /**
8
+ * Content after the value (crisp#634) — e.g. an "Edit" button on a
9
+ * read-only field. Measured live on Attio's own Settings > Profile
10
+ * primary-email field.
11
+ */
12
+ suffix?: React.ReactNode;
7
13
  };
8
14
  export declare const Input: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>, "ref">, "size"> & VariantProps<import("../..").RecipeFn<{
9
15
  size: {
@@ -30,4 +36,82 @@ export declare const Input: React.ForwardRefExoticComponent<Omit<Omit<React.Deta
30
36
  }> & {
31
37
  /** Class for the wrapper that draws the field chrome and focus ring. */
32
38
  className?: string;
39
+ /**
40
+ * Content after the value (crisp#634) — e.g. an "Edit" button on a
41
+ * read-only field. Measured live on Attio's own Settings > Profile
42
+ * primary-email field.
43
+ */
44
+ suffix?: React.ReactNode;
33
45
  } & React.RefAttributes<HTMLInputElement>>;
46
+ export type InputShellProps = React.ComponentPropsWithoutRef<"div"> & VariantProps<typeof inputRecipe> & {
47
+ /**
48
+ * Tints the shell to match `Input`'s own read-only fill (crisp#634).
49
+ * `Input` derives this from the native `readOnly` attribute already on
50
+ * its `<input>`; `InputShell`'s children aren't necessarily a real
51
+ * form control (a CodeMirror instance, say), so there's no DOM
52
+ * attribute to read it off — an explicit prop instead.
53
+ */
54
+ readOnly?: boolean;
55
+ suffix?: React.ReactNode;
56
+ };
57
+ /**
58
+ * crisp#917: the same field chrome `Input` draws (border, focus ring,
59
+ * radius, size, invalid/read-only states) around arbitrary children instead
60
+ * of a hardcoded `<input>` — for a third-party editor (CodeMirror, a
61
+ * rich-text widget, a masked-input library) that needs to mount into a
62
+ * plain element rather than a native `<input>`.
63
+ *
64
+ * Deliberately NOT `asChild` (crisp's usual `Primitive`/`Slot` pattern, used
65
+ * by `Button`/`Chip`/`Avatar`/etc. elsewhere): those merge the shell's own
66
+ * props onto ONE child, replacing it outright — correct when the shell
67
+ * and the interactive surface are the same element. `Input`'s real shape is
68
+ * TWO parts, an outer shell hosting the `::after` focus ring plus an inner
69
+ * value that carries the actual text/interaction; a rich editor mounts its
70
+ * own DOM subtree inside a container div, which is exactly what `children`
71
+ * gives it, not what replacing a single node would.
72
+ *
73
+ * Only draws the OUTER shell (`inputRecipe`'s own class — border, ring,
74
+ * radius, size-driven height, background, `data-readonly` tint) around
75
+ * `children` unchanged, the same granularity GRC's own pre-existing
76
+ * workaround (internal/grc#159, reaching into `.crisp-input`/
77
+ * `.crisp-input--size_medium` by hand) already used — NOT `.crisp-input-
78
+ * value`'s own text-field resets (`border: none`, `padding-inline`, `font:
79
+ * inherit`, …), which assume a real `<input>` and would fight a rich
80
+ * editor's own internal layout. A child that wants to fill the shell the
81
+ * way `Input`'s own `<input>` does should set its own sizing (e.g. `flex: 1
82
+ * 1 auto; min-width: 0; width: 100%; height: 100%`), same as any block
83
+ * content dropped into an `inline-flex` container.
84
+ */
85
+ export declare const InputShell: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & VariantProps<import("../..").RecipeFn<{
86
+ size: {
87
+ sm: string;
88
+ medium: string;
89
+ large: string;
90
+ };
91
+ invalid: {
92
+ true: string;
93
+ false: string;
94
+ };
95
+ }> & {
96
+ config: import("../..").RecipeConfig<{
97
+ size: {
98
+ sm: string;
99
+ medium: string;
100
+ large: string;
101
+ };
102
+ invalid: {
103
+ true: string;
104
+ false: string;
105
+ };
106
+ }>;
107
+ }> & {
108
+ /**
109
+ * Tints the shell to match `Input`'s own read-only fill (crisp#634).
110
+ * `Input` derives this from the native `readOnly` attribute already on
111
+ * its `<input>`; `InputShell`'s children aren't necessarily a real
112
+ * form control (a CodeMirror instance, say), so there's no DOM
113
+ * attribute to read it off — an explicit prop instead.
114
+ */
115
+ readOnly?: boolean;
116
+ suffix?: React.ReactNode;
117
+ } & React.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,2 @@
1
+ export { MenuSheet, MenuSheetGroup, MenuSheetItem, type MenuSheetItemProps, type MenuSheetProps, } from "./menusheet";
2
+ export { menusheetRecipe } from "./menusheet.recipe";
@@ -0,0 +1,42 @@
1
+ import * as React from "react";
2
+ export type MenuSheetProps = Omit<React.ComponentPropsWithoutRef<"div">, "title" | "children"> & {
3
+ open: boolean;
4
+ onOpenChange: (open: boolean) => void;
5
+ title?: React.ReactNode;
6
+ description?: React.ReactNode;
7
+ footer?: React.ReactNode;
8
+ "aria-label"?: string;
9
+ children?: React.ReactNode;
10
+ };
11
+ /**
12
+ * A mobile menu sheet -- a focus-trapped bottom sheet (same Zag dialog
13
+ * machine as BottomSheet) whose body is a role=menu list, with the identical
14
+ * keyboard model Menu already uses: arrow keys move, Home/End jump,
15
+ * typeahead, Enter/Space select, Escape closes. Compose items with
16
+ * MenuSheetItem, and group a run of them in one rounded card with
17
+ * MenuSheetGroup.
18
+ */
19
+ export declare function MenuSheet({ open, onOpenChange, title, description, footer, "aria-label": ariaLabel, children, className, "aria-describedby": describedBy, ...rest }: MenuSheetProps): React.JSX.Element | null;
20
+ export declare namespace MenuSheet {
21
+ var displayName: string;
22
+ }
23
+ export declare function MenuSheetGroup({ children }: {
24
+ children?: React.ReactNode;
25
+ }): React.JSX.Element;
26
+ export declare namespace MenuSheetGroup {
27
+ var displayName: string;
28
+ }
29
+ export type MenuSheetItemProps = {
30
+ children: React.ReactNode;
31
+ icon?: React.ReactNode;
32
+ description?: React.ReactNode;
33
+ tone?: "neutral" | "critical";
34
+ disabled?: boolean;
35
+ onSelect?: () => void;
36
+ /** Keep the sheet open after selecting (default closes). */
37
+ closeOnSelect?: boolean;
38
+ };
39
+ export declare function MenuSheetItem({ children, icon, description, tone, disabled, onSelect, closeOnSelect, }: MenuSheetItemProps): React.JSX.Element;
40
+ export declare namespace MenuSheetItem {
41
+ var displayName: string;
42
+ }
@@ -0,0 +1,3 @@
1
+ declare const config: import("../..").RecipeConfig<{}>;
2
+ export declare const menusheetRecipe: import("../..").RecipeFn<{}>;
3
+ export default config;
@@ -53,10 +53,11 @@ export type MultiSelectProps = Omit<React.ComponentPropsWithoutRef<"div">, "valu
53
53
  /** 2px red border + `aria-invalid`, matching `Input`'s and `Select`'s. */
54
54
  invalid?: boolean;
55
55
  /**
56
- * seed-design's two Select-family sizes (crisp/#882): `medium` (default,
57
- * 40px trigger floor) or `large` (52px). Purely visual.
56
+ * `small` (default, crisp/#889) is Attio's own 32px trigger floor — lines
57
+ * up with `Input`'s own size. `medium`/`large` are seed-design's own
58
+ * 40px/52px floors (crisp/#882), opt-in. Purely visual.
58
59
  */
59
- size?: "medium" | "large";
60
+ size?: "small" | "medium" | "large";
60
61
  /**
61
62
  * `ghost` fills whatever row it's embedded in instead of the fixed
62
63
  * trigger height — for inline table cell editors (crisp/#882, matching
@@ -1,5 +1,6 @@
1
1
  declare const config: import("../..").RecipeConfig<{
2
2
  size: {
3
+ small: string;
3
4
  medium: string;
4
5
  large: string;
5
6
  };
@@ -14,6 +15,7 @@ declare const config: import("../..").RecipeConfig<{
14
15
  }>;
15
16
  export declare const multiselectRecipe: import("../..").RecipeFn<{
16
17
  size: {
18
+ small: string;
17
19
  medium: string;
18
20
  large: string;
19
21
  };
@@ -28,6 +30,7 @@ export declare const multiselectRecipe: import("../..").RecipeFn<{
28
30
  }> & {
29
31
  config: import("../..").RecipeConfig<{
30
32
  size: {
33
+ small: string;
31
34
  medium: string;
32
35
  large: string;
33
36
  };
@@ -5,15 +5,27 @@ export type ProgressProps = React.ComponentPropsWithoutRef<"div"> & {
5
5
  max?: number;
6
6
  /** Render as N discrete segments (a step bar) instead of a continuous fill. */
7
7
  segments?: number;
8
+ /**
9
+ * `"linear"` (default) or `"circular"` — a small ring, measured live on
10
+ * Attio's own Settings > Profile character-counter (crisp#634).
11
+ */
12
+ variant?: "linear" | "circular";
13
+ /**
14
+ * Circular only: outer diameter in px. Default 18 is Attio's own measured
15
+ * size; `strokeWidth` scales proportionally at other sizes (18px's own
16
+ * 1.6px ratio) since only the one size was ever measured.
17
+ */
18
+ size?: number;
8
19
  "aria-label"?: string;
9
20
  className?: string;
10
21
  };
11
22
  /**
12
- * A progress bar — a continuous brand fill, or a segmented row of pills when
13
- * `segments` is set (the "Getting started 3/6" pattern). Reports its state via
14
- * `role="progressbar"` and the ARIA value attributes.
23
+ * A progress bar — a continuous brand fill, a segmented row of pills when
24
+ * `segments` is set (the "Getting started 3/6" pattern), or a small ring
25
+ * (`variant="circular"`, a character-counter's own progress). Reports its
26
+ * state via `role="progressbar"` and the ARIA value attributes.
15
27
  */
16
- export declare function Progress({ value, max, segments, "aria-label": ariaLabel, className, ...rest }: ProgressProps): import("react").JSX.Element;
28
+ export declare function Progress({ value, max, segments, variant, size, "aria-label": ariaLabel, className, ...rest }: ProgressProps): import("react").JSX.Element;
17
29
  export declare namespace Progress {
18
30
  var displayName: string;
19
31
  }
@@ -42,6 +42,28 @@ declare const spec: {
42
42
  readonly decls: {
43
43
  background: `var(--${string})`;
44
44
  };
45
+ }, {
46
+ readonly selector: "&[data-variant=\"circular\"]";
47
+ readonly decls: {
48
+ readonly display: "inline-flex";
49
+ readonly height: "auto";
50
+ readonly borderRadius: "0";
51
+ readonly background: "transparent";
52
+ readonly overflow: "visible";
53
+ };
54
+ }, {
55
+ readonly slot: "circleTrack";
56
+ readonly selector: "& .crisp-progress-circle-track";
57
+ readonly decls: {
58
+ readonly stroke: `color-mix(in srgb, var(--${string}) 14%, transparent)`;
59
+ };
60
+ }, {
61
+ readonly slot: "circleFill";
62
+ readonly selector: "& .crisp-progress-circle-fill";
63
+ readonly decls: {
64
+ readonly stroke: `var(--${string})`;
65
+ readonly transition: "stroke-dashoffset 0.25s ease";
66
+ };
45
67
  }];
46
68
  };
47
69
  declare const config: import("../..").RecipeConfig<Record<string, Record<string, string>>>;
@@ -56,12 +56,13 @@ export type SelectProps = Omit<React.ComponentPropsWithoutRef<"div">, "value" |
56
56
  /** `full` (default) fills its container; `auto` sizes to content. */
57
57
  width?: "full" | "auto";
58
58
  /**
59
- * seed-design's two Select sizes (crisp/#867): `medium` (default, 40px
60
- * trigger) for general use, `large` (52px) where the surrounding layout
61
- * calls for it. Purely visual — everything else about the control is
62
- * identical between the two.
59
+ * `small` (default, crisp/#889) is Attio's own 32px trigger height — lines
60
+ * up with `Input`'s own size, since the two sit side by side in every
61
+ * form. `medium`/`large` are seed-design's own 40px/52px (crisp/#867),
62
+ * opt-in where the surrounding layout calls for a bigger control. Purely
63
+ * visual — the listbox/item chrome is identical across all three.
63
64
  */
64
- size?: "medium" | "large";
65
+ size?: "small" | "medium" | "large";
65
66
  /**
66
67
  * Answered and locked, not editable — unlike `disabled`, the trigger stays
67
68
  * focusable and its text stays full-strength ink (crisp/#867, seed-design's
@@ -4,6 +4,7 @@ declare const config: import("../..").RecipeConfig<{
4
4
  auto: string;
5
5
  };
6
6
  size: {
7
+ small: string;
7
8
  medium: string;
8
9
  large: string;
9
10
  };
@@ -22,6 +23,7 @@ export declare const selectRecipe: import("../..").RecipeFn<{
22
23
  auto: string;
23
24
  };
24
25
  size: {
26
+ small: string;
25
27
  medium: string;
26
28
  large: string;
27
29
  };
@@ -40,6 +42,7 @@ export declare const selectRecipe: import("../..").RecipeFn<{
40
42
  auto: string;
41
43
  };
42
44
  size: {
45
+ small: string;
43
46
  medium: string;
44
47
  large: string;
45
48
  };
@@ -0,0 +1,2 @@
1
+ export { type SnackbarOptions, SnackbarProvider, type SnackbarVariant, useSnackbar, } from "./snackbar";
2
+ export { snackbarRecipe } from "./snackbar.recipe";
@@ -0,0 +1,36 @@
1
+ import * as React from "react";
2
+ export type SnackbarVariant = "default" | "positive" | "critical";
3
+ export type SnackbarOptions = {
4
+ message: React.ReactNode;
5
+ variant?: SnackbarVariant;
6
+ /** Auto-dismiss after this many ms (0 = sticky). Defaults to the provider's. */
7
+ duration?: number;
8
+ action?: {
9
+ label: string;
10
+ onClick: () => void;
11
+ };
12
+ };
13
+ type SnackbarApi = {
14
+ show: (o: SnackbarOptions) => number;
15
+ dismiss: (id: number) => void;
16
+ };
17
+ /**
18
+ * Wrap your app in a `SnackbarProvider`, then call `useSnackbar().show({...})`
19
+ * from anywhere to queue a bottom-anchored snackbar. Only one shows at a time
20
+ * (seed-design's mobile pattern, crisp#911) -- a second call queues behind the
21
+ * first and shows once it dismisses. Auto-dismisses after `duration` (default
22
+ * 4s; 0 keeps it until `dismiss()` or its action fires -- there is no close
23
+ * button, matching seed's own anatomy, which has none).
24
+ */
25
+ export declare function SnackbarProvider({ children, duration, regionLabel: regionLabelProp, }: {
26
+ children: React.ReactNode;
27
+ duration?: number;
28
+ /** aria-label on the always-mounted notifications region (default
29
+ * "Notifications"). */
30
+ regionLabel?: string;
31
+ }): React.JSX.Element;
32
+ export declare namespace SnackbarProvider {
33
+ var displayName: string;
34
+ }
35
+ export declare function useSnackbar(): SnackbarApi;
36
+ export {};
@@ -0,0 +1,5 @@
1
+ declare const config: import("../..").RecipeConfig<{}>;
2
+ export declare const snackbarRecipe: import("../..").RecipeFn<{}> & {
3
+ config: import("../..").RecipeConfig<{}>;
4
+ };
5
+ export default config;
@@ -152,6 +152,26 @@ export type TableToolbarProps = Omit<React.ComponentPropsWithoutRef<"div">, "chi
152
152
  * "Delete filter" (this prop's original default) after a re-measurement
153
153
  * caught the wrong word. */
154
154
  deleteFilterLabel?: string;
155
+ /**
156
+ * Overrides for the filter chip's operator words ("contains", "is any
157
+ * of", …) — crisp/#962: these came from a plain internal lookup table
158
+ * with no prop of their own, so a consumer's own non-English UI (GRC's
159
+ * Mongolian locale) had no discoverable way to translate them short of
160
+ * adding entries to a `CrispMessagesProvider` dictionary keyed by the
161
+ * exact English string, undocumented and easy to miss. Partial, same as
162
+ * `RecordPage`'s/`RecordsTable`'s own `labels` object (`core/i18n.tsx`'s
163
+ * own doc comment: "a handful of product components already take their
164
+ * own translatable text as one big labels object rather than a prop per
165
+ * string") — this is the one TableToolbar string that's a lookup table
166
+ * keyed by an enum rather than a single piece of text, so it gets that
167
+ * treatment instead of thirteen new individual `xLabel` props. A
168
+ * `CrispMessagesProvider`'s `componentDefaults.tableToolbar` (see
169
+ * `useToolbarOperatorLabels` below) sits between the built-in English
170
+ * words and this prop; the OLD whole-dictionary-by-English-string path
171
+ * still works underneath both, unchanged, for any consumer already
172
+ * relying on it.
173
+ */
174
+ operatorLabels?: Partial<ToolbarOperatorLabels>;
155
175
  /** Label on the "ascending" sort-direction option (default "Ascending"). */
156
176
  ascendingLabel?: string;
157
177
  /** Label on the "descending" sort-direction option (default "Descending"). */
@@ -288,6 +308,13 @@ export type TableToolbarProps = Omit<React.ComponentPropsWithoutRef<"div">, "chi
288
308
  */
289
309
  nestedFieldPlaceholder?: (noun: string) => string;
290
310
  };
311
+ /** crisp/#962: the canonical English operator words, keyed the same way
312
+ * `RecordPageLabels` keys its own defaults — exported so a consumer's
313
+ * `CrispMessagesProvider` or `operatorLabels` override can be typed
314
+ * against the real key set instead of guessing `ToolbarFilterOp`'s
315
+ * strings by hand. */
316
+ export type ToolbarOperatorLabels = Record<ToolbarFilterOp, string>;
317
+ export declare const toolbarOperatorLabels: ToolbarOperatorLabels;
291
318
  /**
292
319
  * Applies a toolbar's filter conditions to any row array. Reads the raw value
293
320
  * at `row[key]` (override with `get` for derived fields) — never a formatted
@@ -313,7 +340,7 @@ export declare function applySorts<T>(rows: T[], sorts: ToolbarSort[], get?: (ro
313
340
  * this (Sort: Due date/Assignee/Creation date; Filter: Assignee/Record/
314
341
  * Created by), which one shared list can't reproduce.
315
342
  */
316
- export declare function TableToolbar({ columns, sortColumns: sortColumnsProp, filterColumns: filterColumnsProp, sorts: sortsProp, defaultSorts, onSortsChange, filters: filtersProp, defaultFilters, onFiltersChange, count, children, helpHref, className, sortLabel: sortLabelProp, filterLabel: filterLabelProp, reorderSortLabel: reorderSortLabelProp, noSortsLabel: noSortsLabelProp, addSortLabel: addSortLabelProp, learnSortingLabel: learnSortingLabelProp, selectConditionLabel: selectConditionLabelProp, sortFieldLabel: sortFieldLabelProp, sortDirectionLabel: sortDirectionLabelProp, removeSortLabel: removeSortLabelProp, filterFieldLabel: filterFieldLabelProp, filterFieldPlaceholder: filterFieldPlaceholderProp, filterValuePlaceholder: filterValuePlaceholderProp, filterOptionsLabel: filterOptionsLabelProp, deleteFilterLabel: deleteFilterLabelProp, ascendingLabel: ascendingLabelProp, descendingLabel: descendingLabelProp, sortTriggerLabel, filterTriggerLabel, inline, showSort, showViewSettings, viewSettingsRef, importExportRef, viewColumns: viewColumnsProp, shownKeys: shownKeysProp, defaultShownKeys, onShownKeysChange, viewSettingsLabel: viewSettingsLabelProp, reorderAttributeLabel: reorderAttributeLabelProp, hideAttributeLabel, addAttributeToViewLabel: addAttributeToViewLabelProp, searchAttributesPlaceholder: searchAttributesPlaceholderProp, importExportLabel: importExportLabelProp, onImportCsv, onExportCsv, onExportExcel, importExportHelpHref, importCsvLabel: importCsvLabelProp, exportCsvLabel: exportCsvLabelProp, exportExcelLabel: exportExcelLabelProp, learnImportExportLabel: learnImportExportLabelProp, backLabel: backLabelProp, nestedFieldPlaceholder, ...rest }: TableToolbarProps): React.JSX.Element;
343
+ export declare function TableToolbar({ columns, sortColumns: sortColumnsProp, filterColumns: filterColumnsProp, sorts: sortsProp, defaultSorts, onSortsChange, filters: filtersProp, defaultFilters, onFiltersChange, count, children, helpHref, className, sortLabel: sortLabelProp, filterLabel: filterLabelProp, reorderSortLabel: reorderSortLabelProp, noSortsLabel: noSortsLabelProp, addSortLabel: addSortLabelProp, learnSortingLabel: learnSortingLabelProp, selectConditionLabel: selectConditionLabelProp, sortFieldLabel: sortFieldLabelProp, sortDirectionLabel: sortDirectionLabelProp, removeSortLabel: removeSortLabelProp, filterFieldLabel: filterFieldLabelProp, filterFieldPlaceholder: filterFieldPlaceholderProp, filterValuePlaceholder: filterValuePlaceholderProp, filterOptionsLabel: filterOptionsLabelProp, deleteFilterLabel: deleteFilterLabelProp, operatorLabels, ascendingLabel: ascendingLabelProp, descendingLabel: descendingLabelProp, sortTriggerLabel, filterTriggerLabel, inline, showSort, showViewSettings, viewSettingsRef, importExportRef, viewColumns: viewColumnsProp, shownKeys: shownKeysProp, defaultShownKeys, onShownKeysChange, viewSettingsLabel: viewSettingsLabelProp, reorderAttributeLabel: reorderAttributeLabelProp, hideAttributeLabel, addAttributeToViewLabel: addAttributeToViewLabelProp, searchAttributesPlaceholder: searchAttributesPlaceholderProp, importExportLabel: importExportLabelProp, onImportCsv, onExportCsv, onExportExcel, importExportHelpHref, importCsvLabel: importCsvLabelProp, exportCsvLabel: exportCsvLabelProp, exportExcelLabel: exportExcelLabelProp, learnImportExportLabel: learnImportExportLabelProp, backLabel: backLabelProp, nestedFieldPlaceholder, ...rest }: TableToolbarProps): React.JSX.Element;
317
344
  export type ToolbarToolProps = React.ComponentPropsWithoutRef<"button"> & {
318
345
  /** Drawn the way Sort/Filter are once a condition is set (#399). */
319
346
  active?: boolean;
@@ -28,6 +28,16 @@ export type TabsProps = Omit<React.ComponentPropsWithoutRef<"div">, "value" | "d
28
28
  moreLabel?: (count: number) => React.ReactNode;
29
29
  /** aria-label on the overflow trigger/menu (default "More tabs"). */
30
30
  moreMenuLabel?: string;
31
+ /**
32
+ * How the tab row handles running out of width. `"collapse"` (default,
33
+ * crisp#863) hides trailing tabs behind a "+N more" menu, matching
34
+ * Attio's own record-view tabs. `"scroll"` (crisp#908) never hides a
35
+ * tab — the row scrolls horizontally instead, snapping each tab to the
36
+ * left edge, the pattern Naver/Kakao's own tab rows use
37
+ * (`docs/study/korean/`). Mutually exclusive: `"scroll"` never computes
38
+ * or renders the "+N more" trigger.
39
+ */
40
+ overflow?: "collapse" | "scroll";
31
41
  className?: string;
32
42
  "aria-label"?: string;
33
43
  };
@@ -37,7 +47,7 @@ export type TabsProps = Omit<React.ComponentPropsWithoutRef<"div">, "value" | "d
37
47
  * Home/End jump); activation follows focus. Controlled via
38
48
  * `value`/`onValueChange`, or uncontrolled from `defaultValue`.
39
49
  */
40
- export declare function Tabs({ tabs, value, defaultValue, onValueChange, leading, children, moreLabel, moreMenuLabel, className, fill, "aria-label": ariaLabel, ...rest }: TabsProps): React.JSX.Element;
50
+ export declare function Tabs({ tabs, value, defaultValue, onValueChange, leading, children, moreLabel, moreMenuLabel, overflow, className, fill, "aria-label": ariaLabel, ...rest }: TabsProps): React.JSX.Element;
41
51
  export declare namespace Tabs {
42
52
  var displayName: string;
43
53
  }
@@ -2,6 +2,14 @@ import * as React from "react";
2
2
  export type TextareaProps = React.ComponentPropsWithoutRef<"textarea"> & {
3
3
  /** Show a "N / maxLength" counter bottom-right (also caps input at maxLength). */
4
4
  showCount?: boolean;
5
+ /**
6
+ * Pair the counter with a small circular progress ring (crisp#634),
7
+ * measured live on Attio's own Settings > Profile "Personal context"
8
+ * field. Only meaningful alongside `showCount`+`maxLength` — not every
9
+ * counted textarea in Attio has one, so this is opt-in rather than tied
10
+ * to `showCount` itself.
11
+ */
12
+ showProgress?: boolean;
5
13
  /** Extra class on the wrapper. */
6
14
  wrapperClassName?: string;
7
15
  };
@@ -13,6 +21,14 @@ export type TextareaProps = React.ComponentPropsWithoutRef<"textarea"> & {
13
21
  export declare const Textarea: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.TextareaHTMLAttributes<HTMLTextAreaElement>, HTMLTextAreaElement>, "ref"> & {
14
22
  /** Show a "N / maxLength" counter bottom-right (also caps input at maxLength). */
15
23
  showCount?: boolean;
24
+ /**
25
+ * Pair the counter with a small circular progress ring (crisp#634),
26
+ * measured live on Attio's own Settings > Profile "Personal context"
27
+ * field. Only meaningful alongside `showCount`+`maxLength` — not every
28
+ * counted textarea in Attio has one, so this is opt-in rather than tied
29
+ * to `showCount` itself.
30
+ */
31
+ showProgress?: boolean;
16
32
  /** Extra class on the wrapper. */
17
33
  wrapperClassName?: string;
18
34
  } & React.RefAttributes<HTMLTextAreaElement>>;
@@ -1,8 +1,10 @@
1
+ export * from "./components/accentpicker";
1
2
  export * from "./components/accordion";
2
3
  export * from "./components/avatar";
3
4
  export * from "./components/avatargroup";
4
5
  export * from "./components/badge";
5
6
  export * from "./components/barchart";
7
+ export * from "./components/bottomsheet";
6
8
  export * from "./components/breadcrumb";
7
9
  export * from "./components/bulkbar";
8
10
  export * from "./components/button";
@@ -10,6 +12,7 @@ export * from "./components/callout";
10
12
  export * from "./components/card";
11
13
  export * from "./components/checkbox";
12
14
  export * from "./components/chip";
15
+ export * from "./components/chipgroup";
13
16
  export * from "./components/columncalc";
14
17
  export * from "./components/composewindow";
15
18
  export * from "./components/contextmenu";
@@ -31,6 +34,7 @@ export * from "./components/kbd";
31
34
  export * from "./components/linechart";
32
35
  export * from "./components/mentionchip";
33
36
  export * from "./components/menu";
37
+ export * from "./components/menusheet";
34
38
  export * from "./components/middletruncate";
35
39
  export * from "./components/multiselect";
36
40
  export * from "./components/personchip";
@@ -44,6 +48,7 @@ export * from "./components/select";
44
48
  export * from "./components/skeleton";
45
49
  export * from "./components/skiplink";
46
50
  export * from "./components/slider";
51
+ export * from "./components/snackbar";
47
52
  export * from "./components/spinner";
48
53
  export * from "./components/stagebar";
49
54
  export * from "./components/statcard";
@@ -74,7 +79,9 @@ export * from "./product/headerbar";
74
79
  export * from "./product/importdialog";
75
80
  export * from "./product/inbox";
76
81
  export * from "./product/listpage";
82
+ export * from "./product/memberssettings";
77
83
  export * from "./product/navitem";
84
+ export * from "./product/notificationssettings";
78
85
  export * from "./product/objectsettings";
79
86
  export * from "./product/onboarding";
80
87
  export * from "./product/recordpage";
@@ -89,4 +96,5 @@ export * from "./product/tasklist";
89
96
  export * from "./product/themepicker";
90
97
  export * from "./product/trialbanner";
91
98
  export * from "./product/viewtoggle";
99
+ export * from "./product/workspacegeneralsettings";
92
100
  export * from "./tokens";
@@ -1,5 +1,6 @@
1
1
  import * as React from "react";
2
- import { type MentionAnchor } from "../../core";
2
+ import { type MentionAnchor, type VariantProps } from "../../core";
3
+ import { commentsRecipe } from "./comments.recipe";
3
4
  /** One participant — crisp has no user model of its own, so every field
4
5
  * beyond `id`/`name` (avatar image, colour) is fully consumer-supplied, the
5
6
  * same split `Inbox`'s own `avatar` prop already draws. */
@@ -76,7 +77,7 @@ export type CommentMentionTriggerState = {
76
77
  * never read from the part that changed.
77
78
  */
78
79
  export declare function serializeComposerField(field: HTMLElement): string;
79
- export type CommentsPanelProps = Omit<React.ComponentPropsWithoutRef<"div">, "children" | "title" | "onCopy"> & {
80
+ export type CommentsPanelProps = Omit<React.ComponentPropsWithoutRef<"div">, "children" | "title" | "onCopy"> & VariantProps<typeof commentsRecipe> & {
80
81
  threads: CommentThread[];
81
82
  currentUserId: string;
82
83
  /** The record/page these comments belong to -- shown in the single-thread
@@ -168,8 +169,13 @@ export type CommentsPanelProps = Omit<React.ComponentPropsWithoutRef<"div">, "ch
168
169
  * nothing on its own beyond that data. See `CommentCountBadge` for the
169
170
  * separate row affordance (P-051) — deliberately NOT part of this
170
171
  * component, since it lives in a table cell this component doesn't own.
172
+ *
173
+ * `variant="drawer"` (default) is today's measured 320px + left-border
174
+ * look; `variant="pane"` (crisp#960) fills its container's width instead,
175
+ * for a consumer embedding this in a full-width tab pane rather than a
176
+ * true slide-over/drawer.
171
177
  */
172
- export declare function CommentsPanel({ threads, currentUserId, subject, subjectIcon, showResolved, onShowResolvedChange, onlyMine, onOnlyMineChange, activeThreadId: activeThreadIdProp, onActiveThreadChange, onPost, onReact, onResolve, onDelete, onCopyLink, emojiOptions, mentionTrigger, renderMentionPicker, onClose, closeLabel: closeLabelProp, backLabel: backLabelProp, title: titleProp, threadTitle: threadTitleProp, breadcrumbPrefix: breadcrumbPrefixProp, composerPlaceholder: composerPlaceholderProp, replyPlaceholder: replyPlaceholderProp, postLabel: postLabelProp, replyPostLabel: replyPostLabelProp, emptyLabel, filterLabel: filterLabelProp, showResolvedLabel: showResolvedLabelProp, onlyMineLabel: onlyMineLabelProp, replyActionLabel: replyActionLabelProp, reactActionLabel: reactActionLabelProp, resolveActionLabel: resolveActionLabelProp, resolvedByYouLabel: resolvedByYouLabelProp, resolvedByLabel, moreActionsLabel: moreActionsLabelProp, copyLinkLabel: copyLinkLabelProp, deleteLabel: deleteLabelProp, addReactionLabel: addReactionLabelProp, reactionSearchLabel: reactionSearchLabelProp, deleteConfirmTitle: deleteConfirmTitleProp, deleteConfirmBody: deleteConfirmBodyProp, deleteConfirmActionLabel: deleteConfirmActionLabelProp, cancelLabel: cancelLabelProp, composerMentionToolLabel: composerMentionToolLabelProp, className, ...rest }: CommentsPanelProps): React.JSX.Element;
178
+ export declare function CommentsPanel({ threads, currentUserId, subject, subjectIcon, showResolved, onShowResolvedChange, onlyMine, onOnlyMineChange, activeThreadId: activeThreadIdProp, onActiveThreadChange, onPost, onReact, onResolve, onDelete, onCopyLink, emojiOptions, mentionTrigger, renderMentionPicker, onClose, closeLabel: closeLabelProp, backLabel: backLabelProp, title: titleProp, threadTitle: threadTitleProp, breadcrumbPrefix: breadcrumbPrefixProp, composerPlaceholder: composerPlaceholderProp, replyPlaceholder: replyPlaceholderProp, postLabel: postLabelProp, replyPostLabel: replyPostLabelProp, emptyLabel, filterLabel: filterLabelProp, showResolvedLabel: showResolvedLabelProp, onlyMineLabel: onlyMineLabelProp, replyActionLabel: replyActionLabelProp, reactActionLabel: reactActionLabelProp, resolveActionLabel: resolveActionLabelProp, resolvedByYouLabel: resolvedByYouLabelProp, resolvedByLabel, moreActionsLabel: moreActionsLabelProp, copyLinkLabel: copyLinkLabelProp, deleteLabel: deleteLabelProp, addReactionLabel: addReactionLabelProp, reactionSearchLabel: reactionSearchLabelProp, deleteConfirmTitle: deleteConfirmTitleProp, deleteConfirmBody: deleteConfirmBodyProp, deleteConfirmActionLabel: deleteConfirmActionLabelProp, cancelLabel: cancelLabelProp, composerMentionToolLabel: composerMentionToolLabelProp, variant, className, ...rest }: CommentsPanelProps): React.JSX.Element;
173
179
  export declare namespace CommentsPanel {
174
180
  var displayName: string;
175
181
  }
@@ -1,3 +1,13 @@
1
- declare const config: import("../..").RecipeConfig<{}>;
2
- export declare const commentsRecipe: import("../..").RecipeFn<{}>;
1
+ declare const config: import("../..").RecipeConfig<{
2
+ variant: {
3
+ drawer: string;
4
+ pane: string;
5
+ };
6
+ }>;
7
+ export declare const commentsRecipe: import("../..").RecipeFn<{
8
+ variant: {
9
+ drawer: string;
10
+ pane: string;
11
+ };
12
+ }>;
3
13
  export default config;
@@ -0,0 +1 @@
1
+ export { InviteMembersDialog, type InviteMembersDialogProps, type MemberRow, MembersSettings, type MembersSettingsProps, } from "./memberssettings";