@crisp-ui-kit/crisp 0.57.1 → 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 (252) hide show
  1. package/dist/authshell.css +9 -4
  2. package/dist/authshell.layered.css +9 -4
  3. package/dist/badge.css +3 -3
  4. package/dist/badge.layered.css +3 -3
  5. package/dist/board.css +28 -8
  6. package/dist/board.layered.css +28 -8
  7. package/dist/bottomsheet.css +26 -0
  8. package/dist/bottomsheet.d.ts +7 -0
  9. package/dist/bottomsheet.layered.css +28 -0
  10. package/dist/button.css +7 -6
  11. package/dist/button.layered.css +7 -6
  12. package/dist/checkbox.css +7 -3
  13. package/dist/checkbox.layered.css +7 -3
  14. package/dist/chip.css +15 -0
  15. package/dist/chip.d.ts +3 -1
  16. package/dist/chip.layered.css +15 -0
  17. package/dist/chipgroup.css +5 -0
  18. package/dist/chipgroup.d.ts +7 -0
  19. package/dist/chipgroup.layered.css +7 -0
  20. package/dist/cjs/components/badge/badge.recipe.js +22 -8
  21. package/dist/cjs/components/bottomsheet/bottomsheet.js +90 -0
  22. package/dist/cjs/components/bottomsheet/bottomsheet.recipe.js +77 -0
  23. package/dist/cjs/components/bottomsheet/index.js +9 -0
  24. package/dist/cjs/components/button/button.recipe.js +39 -15
  25. package/dist/cjs/components/checkbox/checkbox.recipe.js +61 -9
  26. package/dist/cjs/components/chip/chip.js +14 -2
  27. package/dist/cjs/components/chip/chip.recipe.js +69 -1
  28. package/dist/cjs/components/chipgroup/chipgroup.js +51 -0
  29. package/dist/cjs/components/chipgroup/chipgroup.recipe.js +36 -0
  30. package/dist/cjs/components/chipgroup/index.js +7 -0
  31. package/dist/cjs/components/datatable/datatable.js +5 -1
  32. package/dist/cjs/components/datatable/datatable.recipe.js +11 -2
  33. package/dist/cjs/components/dialog/dialog.recipe.js +21 -10
  34. package/dist/cjs/components/emptystate/emptystate.recipe.js +7 -2
  35. package/dist/cjs/components/fileupload/fileupload.js +21 -4
  36. package/dist/cjs/components/input/index.js +2 -1
  37. package/dist/cjs/components/input/input.js +31 -1
  38. package/dist/cjs/components/input/input.recipe.js +16 -9
  39. package/dist/cjs/components/menu/menu.recipe.js +21 -7
  40. package/dist/cjs/components/menusheet/index.js +9 -0
  41. package/dist/cjs/components/menusheet/menusheet.js +133 -0
  42. package/dist/cjs/components/menusheet/menusheet.recipe.js +103 -0
  43. package/dist/cjs/components/multiselect/multiselect.js +1 -1
  44. package/dist/cjs/components/multiselect/multiselect.recipe.js +33 -9
  45. package/dist/cjs/components/select/select.js +1 -1
  46. package/dist/cjs/components/select/select.recipe.js +38 -12
  47. package/dist/cjs/components/snackbar/index.js +8 -0
  48. package/dist/cjs/components/snackbar/snackbar.js +121 -0
  49. package/dist/cjs/components/snackbar/snackbar.recipe.js +71 -0
  50. package/dist/cjs/components/tabletoolbar/tabletoolbar.chrome.js +7 -2
  51. package/dist/cjs/components/tabletoolbar/tabletoolbar.js +37 -12
  52. package/dist/cjs/components/tabs/tabs.js +10 -4
  53. package/dist/cjs/components/tabs/tabs.recipe.js +23 -6
  54. package/dist/cjs/components/textarea/textarea.recipe.js +11 -8
  55. package/dist/cjs/index.js +7 -0
  56. package/dist/cjs/product/authshell/authshell.recipe.js +5 -1
  57. package/dist/cjs/product/command/command.recipe.js +4 -1
  58. package/dist/cjs/product/comments/comments.js +7 -2
  59. package/dist/cjs/product/comments/comments.recipe.js +25 -7
  60. package/dist/cjs/product/memberssettings/index.js +6 -0
  61. package/dist/cjs/product/memberssettings/memberssettings.js +99 -0
  62. package/dist/cjs/product/memberssettings/memberssettings.recipe.js +83 -0
  63. package/dist/cjs/product/notificationssettings/index.js +5 -0
  64. package/dist/cjs/product/notificationssettings/notificationssettings.js +19 -0
  65. package/dist/cjs/product/notificationssettings/notificationssettings.recipe.js +44 -0
  66. package/dist/cjs/product/recordpage/recordpage.js +57 -6
  67. package/dist/cjs/product/recordpage/recordpage.recipe.js +43 -6
  68. package/dist/cjs/product/workspacegeneralsettings/index.js +5 -0
  69. package/dist/cjs/product/workspacegeneralsettings/workspacegeneralsettings.js +21 -0
  70. package/dist/cjs/product/workspacegeneralsettings/workspacegeneralsettings.recipe.js +51 -0
  71. package/dist/cjs/tokens/contract.js +1 -0
  72. package/dist/cjs/tokens/elevation.js +8 -5
  73. package/dist/cjs/tokens/palette.js +28 -8
  74. package/dist/cjs/tokens/scale.js +44 -2
  75. package/dist/cjs/tokens/semantic.js +2 -0
  76. package/dist/columncalc.css +15 -7
  77. package/dist/columncalc.layered.css +15 -7
  78. package/dist/command.css +23 -19
  79. package/dist/command.layered.css +23 -19
  80. package/dist/comments.css +28 -19
  81. package/dist/comments.d.ts +2 -2
  82. package/dist/comments.layered.css +28 -19
  83. package/dist/datatable.css +161 -67
  84. package/dist/datatable.layered.css +161 -67
  85. package/dist/datepicker.css +13 -41
  86. package/dist/datepicker.layered.css +13 -41
  87. package/dist/datepickerfield.css +4 -1
  88. package/dist/datepickerfield.layered.css +4 -1
  89. package/dist/dialog.css +12 -7
  90. package/dist/dialog.layered.css +12 -7
  91. package/dist/emptystate.css +5 -3
  92. package/dist/emptystate.layered.css +5 -3
  93. package/dist/esm/components/badge/badge.recipe.js +22 -8
  94. package/dist/esm/components/bottomsheet/bottomsheet.js +52 -0
  95. package/dist/esm/components/bottomsheet/bottomsheet.recipe.js +74 -0
  96. package/dist/esm/components/bottomsheet/index.js +2 -0
  97. package/dist/esm/components/button/button.recipe.js +40 -16
  98. package/dist/esm/components/checkbox/checkbox.recipe.js +61 -9
  99. package/dist/esm/components/chip/chip.js +14 -2
  100. package/dist/esm/components/chip/chip.recipe.js +69 -1
  101. package/dist/esm/components/chipgroup/chipgroup.js +15 -0
  102. package/dist/esm/components/chipgroup/chipgroup.recipe.js +33 -0
  103. package/dist/esm/components/chipgroup/index.js +2 -0
  104. package/dist/esm/components/datatable/datatable.js +5 -1
  105. package/dist/esm/components/datatable/datatable.recipe.js +11 -2
  106. package/dist/esm/components/dialog/dialog.recipe.js +22 -11
  107. package/dist/esm/components/emptystate/emptystate.recipe.js +7 -2
  108. package/dist/esm/components/fileupload/fileupload.js +20 -5
  109. package/dist/esm/components/input/index.js +1 -1
  110. package/dist/esm/components/input/input.js +30 -0
  111. package/dist/esm/components/input/input.recipe.js +17 -10
  112. package/dist/esm/components/menu/menu.recipe.js +21 -7
  113. package/dist/esm/components/menusheet/index.js +2 -0
  114. package/dist/esm/components/menusheet/menusheet.js +95 -0
  115. package/dist/esm/components/menusheet/menusheet.recipe.js +100 -0
  116. package/dist/esm/components/multiselect/multiselect.js +1 -1
  117. package/dist/esm/components/multiselect/multiselect.recipe.js +33 -9
  118. package/dist/esm/components/select/select.js +1 -1
  119. package/dist/esm/components/select/select.recipe.js +38 -12
  120. package/dist/esm/components/snackbar/index.js +2 -0
  121. package/dist/esm/components/snackbar/snackbar.js +84 -0
  122. package/dist/esm/components/snackbar/snackbar.recipe.js +68 -0
  123. package/dist/esm/components/tabletoolbar/tabletoolbar.chrome.js +7 -2
  124. package/dist/esm/components/tabletoolbar/tabletoolbar.js +37 -12
  125. package/dist/esm/components/tabs/tabs.js +10 -4
  126. package/dist/esm/components/tabs/tabs.recipe.js +23 -6
  127. package/dist/esm/components/textarea/textarea.recipe.js +12 -9
  128. package/dist/esm/index.js +7 -0
  129. package/dist/esm/product/authshell/authshell.recipe.js +5 -1
  130. package/dist/esm/product/command/command.recipe.js +4 -1
  131. package/dist/esm/product/comments/comments.js +7 -2
  132. package/dist/esm/product/comments/comments.recipe.js +25 -7
  133. package/dist/esm/product/memberssettings/index.js +1 -0
  134. package/dist/esm/product/memberssettings/memberssettings.js +62 -0
  135. package/dist/esm/product/memberssettings/memberssettings.recipe.js +80 -0
  136. package/dist/esm/product/notificationssettings/index.js +1 -0
  137. package/dist/esm/product/notificationssettings/notificationssettings.js +16 -0
  138. package/dist/esm/product/notificationssettings/notificationssettings.recipe.js +41 -0
  139. package/dist/esm/product/recordpage/recordpage.js +58 -7
  140. package/dist/esm/product/recordpage/recordpage.recipe.js +43 -6
  141. package/dist/esm/product/workspacegeneralsettings/index.js +1 -0
  142. package/dist/esm/product/workspacegeneralsettings/workspacegeneralsettings.js +18 -0
  143. package/dist/esm/product/workspacegeneralsettings/workspacegeneralsettings.recipe.js +48 -0
  144. package/dist/esm/tokens/contract.js +2 -1
  145. package/dist/esm/tokens/elevation.js +8 -5
  146. package/dist/esm/tokens/palette.js +28 -8
  147. package/dist/esm/tokens/scale.js +43 -1
  148. package/dist/esm/tokens/semantic.js +2 -0
  149. package/dist/fileupload.css +3 -1
  150. package/dist/fileupload.layered.css +3 -1
  151. package/dist/input.css +6 -4
  152. package/dist/input.layered.css +6 -4
  153. package/dist/listpage.css +3 -1
  154. package/dist/listpage.layered.css +3 -1
  155. package/dist/memberssettings.css +67 -0
  156. package/dist/memberssettings.d.ts +7 -0
  157. package/dist/memberssettings.layered.css +69 -0
  158. package/dist/menu.css +2 -2
  159. package/dist/menu.layered.css +2 -2
  160. package/dist/menusheet.css +36 -0
  161. package/dist/menusheet.d.ts +7 -0
  162. package/dist/menusheet.layered.css +38 -0
  163. package/dist/multiselect.css +13 -6
  164. package/dist/multiselect.layered.css +13 -6
  165. package/dist/native/tokens.d.ts +2 -1
  166. package/dist/native/tokens.js +20 -3
  167. package/dist/notificationssettings.css +22 -0
  168. package/dist/notificationssettings.d.ts +7 -0
  169. package/dist/notificationssettings.layered.css +24 -0
  170. package/dist/objectsettings.css +4 -4
  171. package/dist/objectsettings.layered.css +4 -4
  172. package/dist/recordpage.css +67 -23
  173. package/dist/recordpage.layered.css +67 -23
  174. package/dist/recordpanel.css +35 -16
  175. package/dist/recordpanel.layered.css +35 -16
  176. package/dist/resizablepanel.css +8 -5
  177. package/dist/resizablepanel.layered.css +8 -5
  178. package/dist/richtext.css +24 -8
  179. package/dist/richtext.layered.css +24 -8
  180. package/dist/savedviews.css +9 -2
  181. package/dist/savedviews.layered.css +9 -2
  182. package/dist/select.css +25 -5
  183. package/dist/select.layered.css +25 -5
  184. package/dist/settingsshell.css +2 -3
  185. package/dist/settingsshell.layered.css +2 -3
  186. package/dist/slider.css +6 -27
  187. package/dist/slider.layered.css +6 -27
  188. package/dist/snackbar.css +24 -0
  189. package/dist/snackbar.d.ts +7 -0
  190. package/dist/snackbar.layered.css +26 -0
  191. package/dist/statcard.css +3 -1
  192. package/dist/statcard.layered.css +3 -1
  193. package/dist/styles.css +859 -345
  194. package/dist/styles.layered.css +859 -345
  195. package/dist/table.css +28 -10
  196. package/dist/table.layered.css +28 -10
  197. package/dist/tabletoolbar.css +35 -24
  198. package/dist/tabletoolbar.layered.css +35 -24
  199. package/dist/tabs.css +18 -4
  200. package/dist/tabs.layered.css +18 -4
  201. package/dist/textarea.css +2 -6
  202. package/dist/textarea.layered.css +2 -6
  203. package/dist/themepicker.css +2 -1
  204. package/dist/themepicker.layered.css +2 -1
  205. package/dist/tokens.css +13 -2
  206. package/dist/tokens.json +20 -3
  207. package/dist/types/components/bottomsheet/bottomsheet.d.ts +35 -0
  208. package/dist/types/components/bottomsheet/bottomsheet.recipe.d.ts +3 -0
  209. package/dist/types/components/bottomsheet/index.d.ts +2 -0
  210. package/dist/types/components/button/button.recipe.d.ts +11 -6
  211. package/dist/types/components/checkbox/checkbox.recipe.d.ts +28 -5
  212. package/dist/types/components/chip/chip.d.ts +22 -0
  213. package/dist/types/components/chip/chip.recipe.d.ts +48 -0
  214. package/dist/types/components/chipgroup/chipgroup.d.ts +14 -0
  215. package/dist/types/components/chipgroup/chipgroup.recipe.d.ts +5 -0
  216. package/dist/types/components/chipgroup/index.d.ts +2 -0
  217. package/dist/types/components/datatable/datatable.d.ts +19 -0
  218. package/dist/types/components/fileupload/fileupload.d.ts +26 -0
  219. package/dist/types/components/input/index.d.ts +1 -1
  220. package/dist/types/components/input/input.d.ts +72 -0
  221. package/dist/types/components/menusheet/index.d.ts +2 -0
  222. package/dist/types/components/menusheet/menusheet.d.ts +42 -0
  223. package/dist/types/components/menusheet/menusheet.recipe.d.ts +3 -0
  224. package/dist/types/components/snackbar/index.d.ts +2 -0
  225. package/dist/types/components/snackbar/snackbar.d.ts +36 -0
  226. package/dist/types/components/snackbar/snackbar.recipe.d.ts +5 -0
  227. package/dist/types/components/tabletoolbar/tabletoolbar.d.ts +28 -1
  228. package/dist/types/components/tabs/tabs.d.ts +11 -1
  229. package/dist/types/index.d.ts +7 -0
  230. package/dist/types/product/comments/comments.d.ts +9 -3
  231. package/dist/types/product/comments/comments.recipe.d.ts +12 -2
  232. package/dist/types/product/memberssettings/index.d.ts +1 -0
  233. package/dist/types/product/memberssettings/memberssettings.d.ts +85 -0
  234. package/dist/types/product/memberssettings/memberssettings.recipe.d.ts +3 -0
  235. package/dist/types/product/notificationssettings/index.d.ts +1 -0
  236. package/dist/types/product/notificationssettings/notificationssettings.d.ts +37 -0
  237. package/dist/types/product/notificationssettings/notificationssettings.recipe.d.ts +3 -0
  238. package/dist/types/product/recordpage/recordpage.d.ts +53 -2
  239. package/dist/types/product/workspacegeneralsettings/index.d.ts +1 -0
  240. package/dist/types/product/workspacegeneralsettings/workspacegeneralsettings.d.ts +48 -0
  241. package/dist/types/product/workspacegeneralsettings/workspacegeneralsettings.recipe.d.ts +3 -0
  242. package/dist/types/tokens/contract.d.ts +4 -1
  243. package/dist/types/tokens/elevation.d.ts +8 -5
  244. package/dist/types/tokens/palette.d.ts +9 -1
  245. package/dist/types/tokens/scale.d.ts +11 -1
  246. package/dist/types/tokens/semantic.d.ts +2 -0
  247. package/dist/wheelpicker.css +4 -2
  248. package/dist/wheelpicker.layered.css +4 -2
  249. package/dist/workspacegeneralsettings.css +30 -0
  250. package/dist/workspacegeneralsettings.d.ts +7 -0
  251. package/dist/workspacegeneralsettings.layered.css +32 -0
  252. package/package.json +36 -1
@@ -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
  }
@@ -4,6 +4,7 @@ export * from "./components/avatar";
4
4
  export * from "./components/avatargroup";
5
5
  export * from "./components/badge";
6
6
  export * from "./components/barchart";
7
+ export * from "./components/bottomsheet";
7
8
  export * from "./components/breadcrumb";
8
9
  export * from "./components/bulkbar";
9
10
  export * from "./components/button";
@@ -11,6 +12,7 @@ export * from "./components/callout";
11
12
  export * from "./components/card";
12
13
  export * from "./components/checkbox";
13
14
  export * from "./components/chip";
15
+ export * from "./components/chipgroup";
14
16
  export * from "./components/columncalc";
15
17
  export * from "./components/composewindow";
16
18
  export * from "./components/contextmenu";
@@ -32,6 +34,7 @@ export * from "./components/kbd";
32
34
  export * from "./components/linechart";
33
35
  export * from "./components/mentionchip";
34
36
  export * from "./components/menu";
37
+ export * from "./components/menusheet";
35
38
  export * from "./components/middletruncate";
36
39
  export * from "./components/multiselect";
37
40
  export * from "./components/personchip";
@@ -45,6 +48,7 @@ export * from "./components/select";
45
48
  export * from "./components/skeleton";
46
49
  export * from "./components/skiplink";
47
50
  export * from "./components/slider";
51
+ export * from "./components/snackbar";
48
52
  export * from "./components/spinner";
49
53
  export * from "./components/stagebar";
50
54
  export * from "./components/statcard";
@@ -75,7 +79,9 @@ export * from "./product/headerbar";
75
79
  export * from "./product/importdialog";
76
80
  export * from "./product/inbox";
77
81
  export * from "./product/listpage";
82
+ export * from "./product/memberssettings";
78
83
  export * from "./product/navitem";
84
+ export * from "./product/notificationssettings";
79
85
  export * from "./product/objectsettings";
80
86
  export * from "./product/onboarding";
81
87
  export * from "./product/recordpage";
@@ -90,4 +96,5 @@ export * from "./product/tasklist";
90
96
  export * from "./product/themepicker";
91
97
  export * from "./product/trialbanner";
92
98
  export * from "./product/viewtoggle";
99
+ export * from "./product/workspacegeneralsettings";
93
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";
@@ -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;
@@ -2,8 +2,17 @@ import { type LucideIcon } from "lucide-react";
2
2
  import * as React from "react";
3
3
  import { type CommentAuthor, type CommentThread } from "../comments";
4
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
+ */
5
13
  export type RecordPageNote = {
6
14
  id: string;
15
+ title?: string;
7
16
  text: string;
8
17
  time: string;
9
18
  };
@@ -91,6 +100,26 @@ export type RecordPageProps = Omit<React.ComponentPropsWithoutRef<"div">, "child
91
100
  /** When provided, shows a maximise/minimise button in the top bar. */
92
101
  onToggleFull?: () => void;
93
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;
94
123
  className?: string;
95
124
  /**
96
125
  * Replaces the built-in CRM tab set. An app with a non-CRM domain (a
@@ -270,6 +299,28 @@ export type RecordDetailsProps = Omit<React.ComponentPropsWithoutRef<"div">, "ch
270
299
  onEdit?: (id: string, key: string, value: string) => Promise<void> | void;
271
300
  labels?: RecordPageLabelsInput;
272
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;
273
324
  };
274
325
  /**
275
326
  * The Details column's own field list, on its own (#528) — `RecordPage`'s
@@ -292,7 +343,7 @@ export type RecordDetailsProps = Omit<React.ComponentPropsWithoutRef<"div">, "ch
292
343
  * `RecordPage`'s own root does: `<div className={recordpageRecipe()}>`
293
344
  * (also exported from this package).
294
345
  */
295
- 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;
296
347
  export declare namespace RecordDetails {
297
348
  var displayName: string;
298
349
  }
@@ -304,7 +355,7 @@ export declare namespace RecordDetails {
304
355
  * Emails sections (Notes & Tasks are live — add and check things off). Drop it
305
356
  * into the app's main content area.
306
357
  */
307
- 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, comments: commentsProp, onPostComment, currentUser, onShare, ...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;
308
359
  export declare namespace RecordPage {
309
360
  var displayName: string;
310
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;
@@ -20,6 +20,8 @@ export declare const contract: MapLeafNodes<{
20
20
  bgTileActive: "tileActive";
21
21
  shadowTileActive: "tileActiveShadow";
22
22
  bgScrim: "bgScrim";
23
+ bgOverlayStrong: "bgOverlayStrong";
24
+ strokeGroupDivider: "strokeGroupDivider";
23
25
  fgAlertDescription: "fgAlertDescription";
24
26
  bgOverlayFrost: "overlayFrost";
25
27
  shadowOverlay1: "shadowOverlay1";
@@ -71,9 +73,10 @@ export declare const contract: MapLeafNodes<{
71
73
  shadowSelect: "selectShadow";
72
74
  }, `var(--${string})`> & {
73
75
  space: Record<"0.5" | "1" | "1.5" | "2" | "2.5" | "3" | "3.5" | "4" | "5" | "6" | "8" | "px", `var(--${string})`>;
74
- radius: Record<"2xl" | "3xl" | "chip" | "full" | "lg" | "md" | "sm" | "xl" | "xs", `var(--${string})`>;
76
+ radius: Record<"2xl" | "3xl" | "4xl" | "chip" | "full" | "lg" | "md" | "sm" | "xl" | "xs", `var(--${string})`>;
75
77
  size: Record<"calendarCell" | "calendarPill" | "chip" | "header" | "icon" | "menuRow" | "row" | "selectIconLg" | "selectTriggerLg" | "selectTriggerMd" | "tableHeader" | "tableRow", `var(--${string})`>;
76
78
  font: Record<"sans", `var(--${string})`>;
77
79
  text: Record<"lg" | "md" | "sm" | "xl" | "xs", `var(--${string})`>;
78
80
  weight: Record<"bold" | "medium" | "regular" | "semibold", `var(--${string})`>;
81
+ tracking: Record<"18" | "20" | "24" | "26" | "28" | "32", `var(--${string})`>;
79
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
  };
@@ -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)";
@@ -14,13 +14,14 @@ export declare const space: {
14
14
  };
15
15
  export declare const radius: {
16
16
  readonly xs: "4px";
17
- readonly chip: "7px";
17
+ readonly chip: "999px";
18
18
  readonly sm: "6px";
19
19
  readonly md: "8px";
20
20
  readonly lg: "9px";
21
21
  readonly xl: "12px";
22
22
  readonly "2xl": "16px";
23
23
  readonly "3xl": "20px";
24
+ readonly "4xl": "24px";
24
25
  readonly full: "999px";
25
26
  };
26
27
  export declare const size: {
@@ -53,9 +54,18 @@ export declare const weight: {
53
54
  readonly semibold: "600";
54
55
  readonly bold: "700";
55
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
+ };
56
65
  export type SpaceKey = keyof typeof space;
57
66
  export type RadiusKey = keyof typeof radius;
58
67
  export type SizeKey = keyof typeof size;
59
68
  export type FontKey = keyof typeof font;
60
69
  export type TextKey = keyof typeof text;
61
70
  export type WeightKey = keyof typeof weight;
71
+ export type TrackingKey = keyof typeof tracking;
@@ -35,6 +35,8 @@ export declare const semantic: {
35
35
  bgTileActive: "tileActive";
36
36
  shadowTileActive: "tileActiveShadow";
37
37
  bgScrim: "bgScrim";
38
+ bgOverlayStrong: "bgOverlayStrong";
39
+ strokeGroupDivider: "strokeGroupDivider";
38
40
  fgAlertDescription: "fgAlertDescription";
39
41
  bgOverlayFrost: "overlayFrost";
40
42
  shadowOverlay1: "shadowOverlay1";
@@ -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 {