@crisp-ui-kit/crisp 0.57.3 → 0.57.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/dist/assigneepicker.css +13 -0
  2. package/dist/assigneepicker.d.ts +7 -0
  3. package/dist/assigneepicker.layered.css +15 -0
  4. package/dist/button.css +1 -1
  5. package/dist/button.layered.css +1 -1
  6. package/dist/cjs/components/button/button.recipe.js +15 -10
  7. package/dist/cjs/components/datatable/datatable.js +6 -3
  8. package/dist/cjs/components/datatable/datatable.recipe.js +35 -2
  9. package/dist/cjs/components/menu/menu.js +48 -8
  10. package/dist/cjs/components/multiselect/multiselect.js +3 -0
  11. package/dist/cjs/components/multiselect/multiselect.recipe.js +18 -0
  12. package/dist/cjs/components/select/select.js +2 -2
  13. package/dist/cjs/components/select/select.recipe.js +19 -0
  14. package/dist/cjs/core/index.js +2 -1
  15. package/dist/cjs/core/place-floating.js +38 -0
  16. package/dist/cjs/index.js +8 -0
  17. package/dist/cjs/product/assigneepicker/assigneepicker.js +127 -0
  18. package/dist/cjs/product/assigneepicker/assigneepicker.recipe.js +36 -0
  19. package/dist/cjs/product/assigneepicker/index.js +7 -0
  20. package/dist/cjs/product/notesgallery/index.js +7 -0
  21. package/dist/cjs/product/notesgallery/notesgallery.js +80 -0
  22. package/dist/cjs/product/notesgallery/notesgallery.recipe.js +46 -0
  23. package/dist/cjs/product/objectpagemenu/index.js +17 -0
  24. package/dist/cjs/product/objectpagemenu/objectpagemenu.js +26 -0
  25. package/dist/cjs/product/objectpagemenu/objectpagemenu.recipe.js +30 -0
  26. package/dist/cjs/product/objectsettings/objectsettings.js +107 -14
  27. package/dist/cjs/product/recordpage/recordpage.js +64 -5
  28. package/dist/cjs/product/recordpage/recordpage.recipe.js +38 -0
  29. package/dist/cjs/product/recordpicker/index.js +7 -0
  30. package/dist/cjs/product/recordpicker/recordpicker.js +100 -0
  31. package/dist/cjs/product/recordpicker/recordpicker.recipe.js +36 -0
  32. package/dist/cjs/product/savedviews/index.js +2 -1
  33. package/dist/cjs/product/savedviews/savedviews.js +22 -0
  34. package/dist/cjs/product/savedviews/savedviews.recipe.js +47 -0
  35. package/dist/cjs/product/share/index.js +7 -0
  36. package/dist/cjs/product/share/share.js +179 -0
  37. package/dist/cjs/product/share/share.recipe.js +114 -0
  38. package/dist/cjs/product/shortcutssheet/index.js +17 -0
  39. package/dist/cjs/product/shortcutssheet/shortcutssheet.js +125 -0
  40. package/dist/cjs/product/shortcutssheet/shortcutssheet.recipe.js +50 -0
  41. package/dist/cjs/product/taskeditpopover/index.js +7 -0
  42. package/dist/cjs/product/taskeditpopover/taskeditpopover.js +159 -0
  43. package/dist/cjs/product/taskeditpopover/taskeditpopover.recipe.js +68 -0
  44. package/dist/cjs/product/workspaceswitchermenu/index.js +17 -0
  45. package/dist/cjs/product/workspaceswitchermenu/workspaceswitchermenu.js +38 -0
  46. package/dist/cjs/product/workspaceswitchermenu/workspaceswitchermenu.recipe.js +34 -0
  47. package/dist/cjs/tokens/palette.js +27 -0
  48. package/dist/cjs/tokens/semantic.js +20 -0
  49. package/dist/datatable.css +40 -7
  50. package/dist/datatable.layered.css +40 -7
  51. package/dist/esm/components/button/button.recipe.js +15 -10
  52. package/dist/esm/components/datatable/datatable.js +6 -3
  53. package/dist/esm/components/datatable/datatable.recipe.js +35 -2
  54. package/dist/esm/components/menu/menu.js +47 -7
  55. package/dist/esm/components/multiselect/multiselect.js +3 -0
  56. package/dist/esm/components/multiselect/multiselect.recipe.js +18 -0
  57. package/dist/esm/components/select/select.js +2 -2
  58. package/dist/esm/components/select/select.recipe.js +19 -0
  59. package/dist/esm/core/index.js +1 -1
  60. package/dist/esm/core/place-floating.js +37 -0
  61. package/dist/esm/index.js +8 -0
  62. package/dist/esm/product/assigneepicker/assigneepicker.js +91 -0
  63. package/dist/esm/product/assigneepicker/assigneepicker.recipe.js +33 -0
  64. package/dist/esm/product/assigneepicker/index.js +2 -0
  65. package/dist/esm/product/notesgallery/index.js +2 -0
  66. package/dist/esm/product/notesgallery/notesgallery.js +44 -0
  67. package/dist/esm/product/notesgallery/notesgallery.recipe.js +43 -0
  68. package/dist/esm/product/objectpagemenu/index.js +1 -0
  69. package/dist/esm/product/objectpagemenu/objectpagemenu.js +23 -0
  70. package/dist/esm/product/objectpagemenu/objectpagemenu.recipe.js +27 -0
  71. package/dist/esm/product/objectsettings/objectsettings.js +106 -13
  72. package/dist/esm/product/recordpage/recordpage.js +64 -5
  73. package/dist/esm/product/recordpage/recordpage.recipe.js +38 -0
  74. package/dist/esm/product/recordpicker/index.js +2 -0
  75. package/dist/esm/product/recordpicker/recordpicker.js +64 -0
  76. package/dist/esm/product/recordpicker/recordpicker.recipe.js +33 -0
  77. package/dist/esm/product/savedviews/index.js +1 -1
  78. package/dist/esm/product/savedviews/savedviews.js +22 -1
  79. package/dist/esm/product/savedviews/savedviews.recipe.js +47 -0
  80. package/dist/esm/product/share/index.js +2 -0
  81. package/dist/esm/product/share/share.js +143 -0
  82. package/dist/esm/product/share/share.recipe.js +111 -0
  83. package/dist/esm/product/shortcutssheet/index.js +1 -0
  84. package/dist/esm/product/shortcutssheet/shortcutssheet.js +88 -0
  85. package/dist/esm/product/shortcutssheet/shortcutssheet.recipe.js +47 -0
  86. package/dist/esm/product/taskeditpopover/index.js +2 -0
  87. package/dist/esm/product/taskeditpopover/taskeditpopover.js +123 -0
  88. package/dist/esm/product/taskeditpopover/taskeditpopover.recipe.js +65 -0
  89. package/dist/esm/product/workspaceswitchermenu/index.js +1 -0
  90. package/dist/esm/product/workspaceswitchermenu/workspaceswitchermenu.js +35 -0
  91. package/dist/esm/product/workspaceswitchermenu/workspaceswitchermenu.recipe.js +31 -0
  92. package/dist/esm/tokens/palette.js +27 -0
  93. package/dist/esm/tokens/semantic.js +20 -0
  94. package/dist/multiselect.css +18 -0
  95. package/dist/multiselect.layered.css +18 -0
  96. package/dist/native/tokens.d.ts +1 -1
  97. package/dist/native/tokens.js +56 -4
  98. package/dist/notesgallery.css +15 -0
  99. package/dist/notesgallery.d.ts +7 -0
  100. package/dist/notesgallery.layered.css +17 -0
  101. package/dist/objectpagemenu.css +3 -0
  102. package/dist/objectpagemenu.d.ts +7 -0
  103. package/dist/objectpagemenu.layered.css +5 -0
  104. package/dist/recordpage.css +36 -0
  105. package/dist/recordpage.layered.css +36 -0
  106. package/dist/recordpicker.css +13 -0
  107. package/dist/recordpicker.d.ts +7 -0
  108. package/dist/recordpicker.layered.css +15 -0
  109. package/dist/savedviews.css +47 -0
  110. package/dist/savedviews.layered.css +47 -0
  111. package/dist/select.css +19 -0
  112. package/dist/select.layered.css +19 -0
  113. package/dist/share.css +84 -0
  114. package/dist/share.d.ts +7 -0
  115. package/dist/share.layered.css +86 -0
  116. package/dist/shortcutssheet.css +24 -0
  117. package/dist/shortcutssheet.d.ts +7 -0
  118. package/dist/shortcutssheet.layered.css +26 -0
  119. package/dist/styles.css +387 -8
  120. package/dist/styles.layered.css +387 -8
  121. package/dist/taskeditpopover.css +36 -0
  122. package/dist/taskeditpopover.d.ts +7 -0
  123. package/dist/taskeditpopover.layered.css +38 -0
  124. package/dist/tokens.css +26 -0
  125. package/dist/tokens.json +56 -4
  126. package/dist/types/components/button/button.recipe.d.ts +2 -3
  127. package/dist/types/components/datatable/datatable.d.ts +8 -0
  128. package/dist/types/components/menu/menu.d.ts +50 -7
  129. package/dist/types/components/multiselect/multiselect.d.ts +9 -0
  130. package/dist/types/components/select/select.d.ts +10 -0
  131. package/dist/types/core/index.d.ts +1 -1
  132. package/dist/types/core/place-floating.d.ts +37 -0
  133. package/dist/types/index.d.ts +8 -0
  134. package/dist/types/product/assigneepicker/assigneepicker.d.ts +36 -0
  135. package/dist/types/product/assigneepicker/assigneepicker.recipe.d.ts +3 -0
  136. package/dist/types/product/assigneepicker/index.d.ts +2 -0
  137. package/dist/types/product/notesgallery/index.d.ts +2 -0
  138. package/dist/types/product/notesgallery/notesgallery.d.ts +54 -0
  139. package/dist/types/product/notesgallery/notesgallery.recipe.d.ts +3 -0
  140. package/dist/types/product/objectpagemenu/index.d.ts +1 -0
  141. package/dist/types/product/objectpagemenu/objectpagemenu.d.ts +40 -0
  142. package/dist/types/product/objectpagemenu/objectpagemenu.recipe.d.ts +17 -0
  143. package/dist/types/product/objectsettings/objectsettings.d.ts +71 -15
  144. package/dist/types/product/recordpage/index.d.ts +1 -1
  145. package/dist/types/product/recordpage/recordpage.d.ts +96 -1
  146. package/dist/types/product/recordpicker/index.d.ts +2 -0
  147. package/dist/types/product/recordpicker/recordpicker.d.ts +38 -0
  148. package/dist/types/product/recordpicker/recordpicker.recipe.d.ts +3 -0
  149. package/dist/types/product/savedviews/index.d.ts +1 -1
  150. package/dist/types/product/savedviews/savedviews.d.ts +36 -0
  151. package/dist/types/product/share/index.d.ts +2 -0
  152. package/dist/types/product/share/share.d.ts +85 -0
  153. package/dist/types/product/share/share.recipe.d.ts +3 -0
  154. package/dist/types/product/shortcutssheet/index.d.ts +1 -0
  155. package/dist/types/product/shortcutssheet/shortcutssheet.d.ts +49 -0
  156. package/dist/types/product/shortcutssheet/shortcutssheet.recipe.d.ts +3 -0
  157. package/dist/types/product/taskeditpopover/index.d.ts +2 -0
  158. package/dist/types/product/taskeditpopover/taskeditpopover.d.ts +67 -0
  159. package/dist/types/product/taskeditpopover/taskeditpopover.recipe.d.ts +3 -0
  160. package/dist/types/product/workspaceswitchermenu/index.d.ts +1 -0
  161. package/dist/types/product/workspaceswitchermenu/workspaceswitchermenu.d.ts +54 -0
  162. package/dist/types/product/workspaceswitchermenu/workspaceswitchermenu.recipe.d.ts +19 -0
  163. package/dist/types/tokens/contract.d.ts +13 -0
  164. package/dist/types/tokens/palette.d.ts +52 -0
  165. package/dist/types/tokens/semantic.d.ts +20 -0
  166. package/dist/workspaceswitchermenu.css +4 -0
  167. package/dist/workspaceswitchermenu.d.ts +7 -0
  168. package/dist/workspaceswitchermenu.layered.css +6 -0
  169. package/package.json +41 -1
@@ -1,4 +1,5 @@
1
1
  import * as React from "react";
2
+ import type { SelectOption } from "../../components/select";
2
3
  export type ObjectSummary = {
3
4
  id: string;
4
5
  name: React.ReactNode;
@@ -127,6 +128,9 @@ export type AttributeRow = {
127
128
  dataType: React.ReactNode;
128
129
  /** e.g. "Unique" — rendered as a plain constraint label per row. */
129
130
  constraint?: React.ReactNode;
131
+ /** The attribute's own slug (crisp#673, G-107) — "Copy slug" needs
132
+ * something to copy; omit on a row with no slug of its own yet. */
133
+ slug?: string;
130
134
  system?: boolean;
131
135
  enriched?: boolean;
132
136
  };
@@ -134,6 +138,21 @@ export type AttributesTableProps = {
134
138
  attributes: AttributeRow[];
135
139
  onOpenAttribute?: (id: string) => void;
136
140
  onEditAttribute?: (id: string) => void;
141
+ /** crisp#673, G-107. */
142
+ onDuplicateAttribute?: (id: string) => void;
143
+ /** Defaults to a real `navigator.clipboard.writeText(id)` when omitted —
144
+ * the same default-with-override shape `CommentsPanel`'s `onCopyLink`
145
+ * already has, so a consumer only needs this to know when it happened
146
+ * (a toast, analytics), not to implement the copy itself. */
147
+ onCopyId?: (id: string) => void;
148
+ /** Same default-clipboard-write shape as `onCopyId`, over the row's own
149
+ * `slug`. A row with no `slug` renders the item disabled rather than
150
+ * copying an empty string. */
151
+ onCopySlug?: (slug: string) => void;
152
+ /** Opens Attio's own rename-slug flow — crisp models no slug-editing UI
153
+ * of its own (out of scope, same reasoning as the plan-gated notices
154
+ * elsewhere), just the entry point into it. */
155
+ onChangeSlug?: (id: string) => void;
137
156
  onArchiveAttribute?: (id: string) => void;
138
157
  onReorder?: (rows: AttributeRow[]) => void;
139
158
  onCreateAttribute?: () => void;
@@ -149,14 +168,20 @@ export type AttributesTableProps = {
149
168
  systemLabel?: string;
150
169
  enrichedLabel?: string;
151
170
  editLabel?: string;
171
+ duplicateLabel?: string;
172
+ copyIdLabel?: string;
173
+ copySlugLabel?: string;
174
+ changeSlugLabel?: string;
152
175
  archiveLabel?: string;
153
176
  /** Overrides the row "…" menu entirely — return the `MenuItem`s a
154
- * consumer's own actions need (crisp#660). Attio's own row menu is
155
- * Edit/Archive (the default, unchanged when this is omitted); a
156
- * consumer whose data isn't Attio's own attribute model (no "archive"
157
- * concept, a different action set entirely) supplies its own instead of
158
- * working around two fixed items that don't fit. Receives the row so an
159
- * item's handler can close over its id. */
177
+ * consumer's own actions need (crisp#660). Attio's own row menu (crisp#673,
178
+ * G-107, corrects this comment's former "Edit/Archive" claim — the real
179
+ * menu has six items) is Edit attribute/Duplicate attribute/Copy ID/Copy
180
+ * slug/Change slug/Archive attribute (the default, unchanged when this is
181
+ * omitted); a consumer whose data isn't Attio's own attribute model (no
182
+ * "archive"/"slug" concept, a different action set entirely) supplies its
183
+ * own instead of working around six fixed items that don't fit. Receives
184
+ * the row so an item's handler can close over its id. */
160
185
  rowActions?: (row: AttributeRow) => React.ReactNode;
161
186
  emptyLabel?: React.ReactNode;
162
187
  };
@@ -169,7 +194,7 @@ export type AttributesTableProps = {
169
194
  * measures 40px here — a real, small divergence left to DataTable's owner
170
195
  * rather than patched locally (see the PR).
171
196
  */
172
- export declare function AttributesTable({ attributes, onOpenAttribute, onEditAttribute, onArchiveAttribute, onReorder, onCreateAttribute, title: titleProp, subtitle: subtitleProp, createLabel: createLabelProp, searchPlaceholder: searchPlaceholderProp, filterLabel: filterLabelProp, nameColumnLabel: nameColumnLabelProp, dataTypeColumnLabel: dataTypeColumnLabelProp, constraintsColumnLabel: constraintsColumnLabelProp, propertiesColumnLabel: propertiesColumnLabelProp, systemLabel: systemLabelProp, enrichedLabel: enrichedLabelProp, editLabel: editLabelProp, archiveLabel: archiveLabelProp, rowActions, emptyLabel, }: AttributesTableProps): React.JSX.Element;
197
+ export declare function AttributesTable({ attributes, onOpenAttribute, onEditAttribute, onDuplicateAttribute, onCopyId, onCopySlug, onChangeSlug, onArchiveAttribute, onReorder, onCreateAttribute, title: titleProp, subtitle: subtitleProp, createLabel: createLabelProp, searchPlaceholder: searchPlaceholderProp, filterLabel: filterLabelProp, nameColumnLabel: nameColumnLabelProp, dataTypeColumnLabel: dataTypeColumnLabelProp, constraintsColumnLabel: constraintsColumnLabelProp, propertiesColumnLabel: propertiesColumnLabelProp, systemLabel: systemLabelProp, enrichedLabel: enrichedLabelProp, editLabel: editLabelProp, duplicateLabel: duplicateLabelProp, copyIdLabel: copyIdLabelProp, copySlugLabel: copySlugLabelProp, changeSlugLabel: changeSlugLabelProp, archiveLabel: archiveLabelProp, rowActions, emptyLabel, }: AttributesTableProps): React.JSX.Element;
173
198
  export declare namespace AttributesTable {
174
199
  var displayName: string;
175
200
  }
@@ -212,6 +237,9 @@ export declare function AttributeTypeSelect({ value, onValueChange, options, aiA
212
237
  export declare namespace AttributeTypeSelect {
213
238
  var displayName: string;
214
239
  }
240
+ export declare const CURRENCY_DISPLAY_OPTIONS: SelectOption[];
241
+ export declare const CURRENCY_DECIMAL_PLACES_OPTIONS: SelectOption[];
242
+ export declare const CURRENCY_GROUPING_OPTIONS: SelectOption[];
215
243
  export type CreateAttributeDialogProps = {
216
244
  type: string;
217
245
  onTypeChange: (value: string) => void;
@@ -221,6 +249,27 @@ export type CreateAttributeDialogProps = {
221
249
  onNameChange: (value: string) => void;
222
250
  description: string;
223
251
  onDescriptionChange: (value: string) => void;
252
+ /** Currency's own extra fields (shown only while `type === "currency"`).
253
+ * See `CURRENCY_DISPLAY_OPTIONS`/`CURRENCY_DECIMAL_PLACES_OPTIONS`/
254
+ * `CURRENCY_GROUPING_OPTIONS` for the (small, fixed) defaults; there is
255
+ * no default `currencyOptions` — a real currency list is the consumer's
256
+ * own reference data. */
257
+ currency?: string;
258
+ onCurrencyChange?: (value: string) => void;
259
+ currencyOptions?: SelectOption[];
260
+ display?: string;
261
+ onDisplayChange?: (value: string) => void;
262
+ displayOptions?: SelectOption[];
263
+ decimalPlaces?: string;
264
+ onDecimalPlacesChange?: (value: string) => void;
265
+ decimalPlacesOptions?: SelectOption[];
266
+ grouping?: string;
267
+ onGroupingChange?: (value: string) => void;
268
+ groupingOptions?: SelectOption[];
269
+ currencyFieldLabel?: string;
270
+ displayFieldLabel?: string;
271
+ decimalPlacesFieldLabel?: string;
272
+ groupingFieldLabel?: string;
224
273
  aiAutofillEnabled?: boolean;
225
274
  onAiAutofillChange?: (enabled: boolean) => void;
226
275
  onSubmit: () => void;
@@ -237,15 +286,22 @@ export type CreateAttributeDialogProps = {
237
286
  createLabel?: string;
238
287
  };
239
288
  /**
240
- * "Create attribute" (crisp#637, P-125, verified live): Attribute Type
241
- * select (defaults to Text) + Name (autofocused) + Description (optional)
242
- * + an AI-autofill switch row, footer Cancel/Create. Built on `FormDialog`
243
- * in its plain (non-`createMode`) shape — Attio's own footer here has a
244
- * real Cancel button, unlike the record-create dialog `createMode` models
245
- * (crisp#548), so `createMode` would be the wrong fit even though the
246
- * button carries the same ⌘↵ hint; that hint is rendered locally instead.
289
+ * "Create attribute" (crisp#637/#673, P-125, verified live): Attribute Type
290
+ * select (defaults to Text, type-ahead search built in via `Select`'s own
291
+ * `searchable`) + Name (autofocused on open, and again after picking a type
292
+ * — G-106) + Description (optional) + Currency's own four extra required
293
+ * fields when `type === "currency"` (G-104) + an AI-autofill switch row,
294
+ * footer Cancel/Create. Built on `FormDialog` in its plain (non-`createMode`)
295
+ * shape — Attio's own footer here has a real Cancel button, unlike the
296
+ * record-create dialog `createMode` models (crisp#548), so `createMode`
297
+ * would be the wrong fit even though the button carries the same ⌘↵ hint;
298
+ * that hint is rendered locally instead. The outside-click/Escape
299
+ * "Discard changes" confirm gated on dirty state (G-105) needed no work
300
+ * here at all — `FormDialog` already tracks dirtiness generically and shows
301
+ * it, so this dialog inherited it for free; `CreateAttributeDialog`'s own
302
+ * tests below just pin the behaviour to this component specifically.
247
303
  */
248
- export declare function CreateAttributeDialog({ type, onTypeChange, typeOptions, aiAutofillTypeOptions, name, onNameChange, description, onDescriptionChange, aiAutofillEnabled, onAiAutofillChange, onSubmit, onClose, busy, error, title: titleProp, attributeTypeLabel: attributeTypeLabelProp, nameLabel: nameLabelProp, descriptionLabel: descriptionLabelProp, descriptionPlaceholder: descriptionPlaceholderProp, aiAutofillLabel: aiAutofillLabelProp, setUpAiAutofillLabel: setUpAiAutofillLabelProp, createLabel: createLabelProp, }: CreateAttributeDialogProps): React.JSX.Element;
304
+ export declare function CreateAttributeDialog({ type, onTypeChange, typeOptions, aiAutofillTypeOptions, name, onNameChange, description, onDescriptionChange, currency, onCurrencyChange, currencyOptions, display, onDisplayChange, displayOptions, decimalPlaces, onDecimalPlacesChange, decimalPlacesOptions, grouping, onGroupingChange, groupingOptions, currencyFieldLabel: currencyFieldLabelProp, displayFieldLabel: displayFieldLabelProp, decimalPlacesFieldLabel: decimalPlacesFieldLabelProp, groupingFieldLabel: groupingFieldLabelProp, aiAutofillEnabled, onAiAutofillChange, onSubmit, onClose, busy, error, title: titleProp, attributeTypeLabel: attributeTypeLabelProp, nameLabel: nameLabelProp, descriptionLabel: descriptionLabelProp, descriptionPlaceholder: descriptionPlaceholderProp, aiAutofillLabel: aiAutofillLabelProp, setUpAiAutofillLabel: setUpAiAutofillLabelProp, createLabel: createLabelProp, }: CreateAttributeDialogProps): React.JSX.Element;
249
305
  export declare namespace CreateAttributeDialog {
250
306
  var displayName: string;
251
307
  }
@@ -1,4 +1,4 @@
1
1
  export { type Column, type ColumnType, type EntityValue, type ReferenceOption, type Row, type StatusOption, tagTone, } from "./column";
2
2
  export { type EditableOption, editableInputType, useEditableField, } from "./editable-field";
3
- export { RecordDetails, type RecordDetailsProps, RecordPage, type RecordPageHighlight, type RecordPageLabels, type RecordPageLabelsInput, RecordPageMain, type RecordPageMainProps, type RecordPageNote, type RecordPageProps, type RecordPageSection, type RecordPageTab, type RecordPageTask, recordPageLabels, } from "./recordpage";
3
+ export { RecordDetails, type RecordDetailsProps, RecordPage, type RecordPageHighlight, type RecordPageLabels, type RecordPageLabelsInput, RecordPageMain, type RecordPageMainProps, type RecordPageMenuAction, type RecordPageNote, type RecordPageProps, type RecordPageSection, type RecordPageTab, type RecordPageTask, recordPageLabels, } from "./recordpage";
4
4
  export { recordpageRecipe } from "./recordpage.recipe";
@@ -78,6 +78,22 @@ export type RecordPageQuickAction = {
78
78
  icon: LucideIcon;
79
79
  onSelect?: () => void;
80
80
  };
81
+ /**
82
+ * One consumer-supplied item in the "…" record-actions menu (crisp#1012) —
83
+ * appended after Attio's own fixed group (Merge records/Configure page/Copy
84
+ * page URL/Copy record ID, Add to favorites), before Delete. Own group,
85
+ * separator-delimited on both sides, never merged into Attio's own items —
86
+ * the same "caller's own list, not a merge" choice `tabs` (#379) and
87
+ * `highlights` (#528) already make.
88
+ */
89
+ export type RecordPageMenuAction = {
90
+ label: string;
91
+ icon: LucideIcon;
92
+ onSelect: () => void;
93
+ /** Red text/icon, `MenuItem`'s own `danger` — for a destructive action
94
+ * that isn't Delete itself (Delete has its own dedicated `onDelete`). */
95
+ danger?: boolean;
96
+ };
81
97
  export type RecordPageProps = Omit<React.ComponentPropsWithoutRef<"div">, "children"> & {
82
98
  record: Row;
83
99
  columns: Column[];
@@ -196,6 +212,74 @@ export type RecordPageProps = Omit<React.ComponentPropsWithoutRef<"div">, "child
196
212
  * convention) — Attio's own Share opens a dialog crisp has no measured
197
213
  * content for; only the entry point is in scope here (#864). */
198
214
  onShare?: () => void;
215
+ /**
216
+ * crisp#1012: the header entity's `Avatar` `shape` — defaults to
217
+ * `"rounded"` (Attio's own CRM entities), matching `DataTable`'s own
218
+ * `avatarShape` prop (#892) exactly, for a consumer whose record type
219
+ * reads as a person (GRC's Employee, `"circle"`) rather than a company/
220
+ * generic entity.
221
+ */
222
+ avatarShape?: "rounded" | "circle";
223
+ /**
224
+ * crisp#1012: wires the entity header's Pencil "edit record" button,
225
+ * which drew with no `onClick` at all before this. The button itself
226
+ * still always renders (same as Merge/Configure page/Copy page URL/Copy
227
+ * record ID below, and Compose email/Add to list's own documented "this
228
+ * component draws the chrome, a consumer wires the behaviour") — omit
229
+ * to keep it exactly as inert as it always was. Named `onEditRecord`,
230
+ * not `onEdit` — that name is already `onEdit`'s own per-FIELD commit
231
+ * handler above; reusing it here for a whole-record action would be two
232
+ * unrelated things behind one prop.
233
+ */
234
+ onEditRecord?: () => void;
235
+ /**
236
+ * crisp#1012: wires the "…" menu's "Delete record" item, chrome-only (no
237
+ * `onSelect` at all) before this. Delete itself always renders — it's
238
+ * one of Attio's own fixed 6 items (#621/#905), not a consumer-optional
239
+ * one — omit to leave it exactly as inert as Merge/Configure/Copy page
240
+ * URL/Copy record ID already are by default.
241
+ */
242
+ onDelete?: () => void;
243
+ /**
244
+ * crisp#1012: appends the caller's own items to the "…" menu, in their
245
+ * own separator-delimited group between Attio's fixed items and Delete
246
+ * — e.g. an object-specific "Mark reviewed", or routing "Edit" to a full
247
+ * external form instead of `RecordDetails`' own inline click-to-edit for
248
+ * an object where that's the only real editor (internal/grc's own
249
+ * `EDIT_OPENS_FORM`, the case this was built for). Omit for the built-in
250
+ * group alone.
251
+ */
252
+ actions?: RecordPageMenuAction[];
253
+ /**
254
+ * crisp#1019: hides the plain breadcrumb row (has no effect in peek mode
255
+ * — when `onClose` is set, the peek header replaces it entirely already).
256
+ * Default `true`, no change for an existing consumer — for one whose own
257
+ * app shell already renders a breadcrumb of its own (a second one would
258
+ * otherwise double up), pass `false`.
259
+ */
260
+ showBreadcrumb?: boolean;
261
+ /**
262
+ * crisp#1019: hides the topbar's Share button. Default `true` — Share
263
+ * itself is still unconditional chrome with no built-in dialog (`onShare`
264
+ * "renders regardless" per its own doc above); this is a SEPARATE,
265
+ * explicit opt-out, not tied to whether `onShare` is supplied — a missing
266
+ * handler must never silently hide a button an existing consumer already
267
+ * sees, the same reasoning #1012's `onEditRecord`/`onDelete` already
268
+ * settled for the "…" menu's own always-visible items.
269
+ */
270
+ showShare?: boolean;
271
+ /** crisp#1019: hides the topbar's "Ask AI" button — pure Attio branding
272
+ * chrome with no consumer hook of its own. Default `true`. */
273
+ showAskAttio?: boolean;
274
+ /**
275
+ * crisp#1019: hides the topbar's Comments toggle icon (which opens
276
+ * `RecordPage`'s own internal comments panel) — for a consumer whose
277
+ * Comments live somewhere else in its own UI already (a tab, say),
278
+ * rather than a second, competing entry point to the same feature.
279
+ * Default `true`. Independent of the `comments`/`onPostComment` props
280
+ * above, which control the panel's DATA, not this button's visibility.
281
+ */
282
+ showComments?: boolean;
199
283
  };
200
284
  /**
201
285
  * Every chrome string RecordPage renders. Supplied as a PARTIAL map, so
@@ -262,6 +346,17 @@ export type RecordPageLabels = {
262
346
  upgradeToViewCalls: string;
263
347
  callsUpgradeHint: string;
264
348
  upgrade: string;
349
+ /** The "Run workflow" quick action's own popover (#620): title, search
350
+ * placeholder, empty state, and its "Create new workflow" link. Chrome
351
+ * only, like Compose email/Add to list above -- crisp has no workflow
352
+ * data model to search over yet. */
353
+ selectWorkflowTitle: string;
354
+ closeWorkflowPopover: string;
355
+ searchWorkflowsPlaceholder: string;
356
+ noWorkflows: string;
357
+ createNewWorkflow: string;
358
+ /** Footer keyboard hint under the "Select workflow" popover's empty list. */
359
+ navigate: string;
265
360
  highlights: string;
266
361
  recordDetails: string;
267
362
  searchFields: string;
@@ -401,7 +496,7 @@ export declare namespace RecordPageMain {
401
496
  * Emails sections (Notes & Tasks are live — add and check things off). Drop it
402
497
  * into the app's main content area.
403
498
  */
404
- 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;
499
+ 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, avatarShape, onEditRecord, onDelete, actions, showBreadcrumb, showShare, showAskAttio, showComments, ...rest }: RecordPageProps): React.JSX.Element;
405
500
  export declare namespace RecordPage {
406
501
  var displayName: string;
407
502
  }
@@ -0,0 +1,2 @@
1
+ export { RecordPicker, type RecordPickerProps, type RecordPickerRecord, } from "./recordpicker";
2
+ export { recordpickerRecipe } from "./recordpicker.recipe";
@@ -0,0 +1,38 @@
1
+ import * as React from "react";
2
+ export type RecordPickerRecord = {
3
+ id: string;
4
+ name: React.ReactNode;
5
+ /** Per-type icon, consumer-supplied -- crisp has no built-in
6
+ * object-type-to-icon mapping (same reasoning as `TaskList`'s own
7
+ * `record`/`meta` slots). */
8
+ icon?: React.ReactNode;
9
+ };
10
+ export type RecordPickerProps = Omit<React.ComponentPropsWithoutRef<"div">, "children" | "onSelect"> & {
11
+ records: RecordPickerRecord[];
12
+ /** Shows the measured "Loading..." row instead of the list (the results
13
+ * are still in flight). */
14
+ loading?: boolean;
15
+ onSelect?: (record: RecordPickerRecord) => void;
16
+ query?: string;
17
+ onQueryChange?: (query: string) => void;
18
+ searchLabel?: string;
19
+ loadingLabel?: string;
20
+ emptyLabel?: React.ReactNode;
21
+ className?: string;
22
+ };
23
+ /**
24
+ * The record-search picker behind a task's "Add record" chip -- measured
25
+ * live on app.attio.com's Tasks page ("Edit task" -> "Add record"): a
26
+ * "Search..." row, then a FLAT list mixed across every object type (a
27
+ * person result sat first, ahead of several companies, with no section
28
+ * headers -- unlike the mention picker's own grouped Users/Records shape,
29
+ * crisp#646). Attio's own live search took a moment to resolve, showing a
30
+ * centred spinner + "Loading..." row meanwhile; not independently
31
+ * re-measured against a second empty-results case, so `emptyLabel`'s
32
+ * default copy ("No records") is inferred by symmetry with
33
+ * `AssigneePicker`'s own measured "No users", not itself pixel-measured.
34
+ */
35
+ export declare function RecordPicker({ records, loading, onSelect, query: queryProp, onQueryChange, searchLabel: searchLabelProp, loadingLabel: loadingLabelProp, emptyLabel: emptyLabelProp, className, ...rest }: RecordPickerProps): React.JSX.Element;
36
+ export declare namespace RecordPicker {
37
+ var displayName: string;
38
+ }
@@ -0,0 +1,3 @@
1
+ declare const config: import("../..").RecipeConfig<{}>;
2
+ export declare const recordpickerRecipe: import("../..").RecipeFn<{}>;
3
+ export default config;
@@ -1,2 +1,2 @@
1
- export { type SavedView, SavedViews, type SavedViewsProps, } from "./savedviews";
1
+ export { type SavedView, SavedViews, type SavedViewsProps, SavedViewsSaveBar, type SavedViewsSaveBarProps, } from "./savedviews";
2
2
  export { savedviewsRecipe } from "./savedviews.recipe";
@@ -90,3 +90,39 @@ export declare function SavedViews({ label, icon, views, activeId, onSelect, onC
90
90
  export declare namespace SavedViews {
91
91
  var displayName: string;
92
92
  }
93
+ export type SavedViewsSaveBarProps = React.ComponentPropsWithoutRef<"div"> & {
94
+ /** Commits the live state (filters/sort/columns/…) back onto the loaded
95
+ * view — Attio's own "Save for everyone". */
96
+ onSave: () => void;
97
+ /** Reverts the live state to the loaded view's own saved snapshot. */
98
+ onDiscard: () => void;
99
+ /**
100
+ * Saves the live state as a brand-new view instead — the split button's
101
+ * own chevron menu (measured: exactly one item, "Save as new view").
102
+ * Omit to render a plain button with no chevron/menu.
103
+ */
104
+ onSaveAsNew?: () => void;
105
+ discardLabel?: string;
106
+ saveLabel?: string;
107
+ saveAsNewLabel?: string;
108
+ /** aria-label on the chevron trigger when `onSaveAsNew` is given. */
109
+ saveOptionsLabel?: string;
110
+ className?: string;
111
+ };
112
+ /**
113
+ * The "unsaved changes" bar for a currently loaded saved view — Attio's own
114
+ * "Discard changes" + a split "Save for everyone ▾" button, measured live
115
+ * (app.attio.com, a saved Companies view with its sort changed). Not a part
116
+ * of `SavedViews`' own trigger/panel: Attio renders this in the page
117
+ * toolbar's own trailing slot, replacing whatever sits there at rest
118
+ * (Import/Export, "+ New …") — the same slot `TableToolbar`'s own
119
+ * `children` prop already documents ("Right-aligned actions after the
120
+ * count"). A consumer swaps this in for that slot's usual content once its
121
+ * own dirty check (live filters/sort/columns vs. the loaded view's
122
+ * snapshot) is true, and swaps it back out once it's false — this
123
+ * component itself carries no dirty state or visibility toggle.
124
+ */
125
+ export declare function SavedViewsSaveBar({ onSave, onDiscard, onSaveAsNew, discardLabel: discardLabelProp, saveLabel: saveLabelProp, saveAsNewLabel: saveAsNewLabelProp, saveOptionsLabel: saveOptionsLabelProp, className, ...rest }: SavedViewsSaveBarProps): React.JSX.Element;
126
+ export declare namespace SavedViewsSaveBar {
127
+ var displayName: string;
128
+ }
@@ -0,0 +1,2 @@
1
+ export { type ShareMember, SharePopover, type SharePopoverProps, type ShareRoleOption, } from "./share";
2
+ export { shareRecipe } from "./share.recipe";
@@ -0,0 +1,85 @@
1
+ import * as React from "react";
2
+ import { type SelectOption } from "../../components/select";
3
+ export type ShareRoleOption = SelectOption;
4
+ export type ShareMember = {
5
+ id: string;
6
+ name: React.ReactNode;
7
+ email?: React.ReactNode;
8
+ /** Defaults to a lettered `Avatar` seeded from `name`'s first character. */
9
+ avatar?: React.ReactNode;
10
+ /** The row's own access value, one of `memberRoleOptions`. */
11
+ access: string;
12
+ /** Disables this row's access select (Attio greys the signed-in user's
13
+ * own row on the Pro-gated surface — still rendered, never editable). */
14
+ accessDisabled?: boolean;
15
+ };
16
+ export type SharePopoverProps = Omit<React.ComponentPropsWithoutRef<"div">, "children"> & {
17
+ /** The element that toggles the popover (Attio's own "Share" button). */
18
+ trigger: React.ReactElement;
19
+ align?: "start" | "end";
20
+ open?: boolean;
21
+ defaultOpen?: boolean;
22
+ onOpenChange?: (open: boolean) => void;
23
+ /** Controlled active tab. Omit to let the popover manage it. */
24
+ tab?: "members" | "automations";
25
+ defaultTab?: "members" | "automations";
26
+ onTabChange?: (tab: "members" | "automations") => void;
27
+ membersTabLabel?: string;
28
+ automationsTabLabel?: string;
29
+ /** The workspace's own avatar/icon, shown at the "Workspace access" row. */
30
+ workspaceIcon?: React.ReactNode;
31
+ workspaceAccessLabel?: string;
32
+ workspaceAccessValue: string;
33
+ workspaceAccessOptions: ShareRoleOption[];
34
+ onWorkspaceAccessChange?: (value: string) => void;
35
+ /**
36
+ * A slot for the plan-gated upsell card ("Workspace and advanced
37
+ * permissions are not supported on your current plan" + Upgrade, or the
38
+ * Pro "Advanced sharing" card) — crisp has no billing concept, so it
39
+ * never renders this content itself; a consumer on a gated plan supplies
40
+ * its own copy/CTA here. Omit entirely on an ungated plan.
41
+ */
42
+ advancedSharing?: React.ReactNode;
43
+ /** "Clear permissions" — real, ungated action (unlike `advancedSharing`). */
44
+ onClearPermissions?: () => void;
45
+ clearPermissionsLabel?: string;
46
+ /** The Members tab's "Individual members" list — one row per workspace
47
+ * member with their own access select. Omit to hide the section. */
48
+ members?: ShareMember[];
49
+ membersSectionLabel?: string;
50
+ memberRoleOptions: ShareRoleOption[];
51
+ onMemberAccessChange?: (id: string, value: string) => void;
52
+ /** The Automations tab's search + role + Add row. */
53
+ automationSearchValue?: string;
54
+ defaultAutomationSearchValue?: string;
55
+ onAutomationSearchChange?: (query: string) => void;
56
+ automationSearchPlaceholder?: string;
57
+ automationRoleValue: string;
58
+ automationRoleOptions: ShareRoleOption[];
59
+ onAutomationRoleChange?: (value: string) => void;
60
+ onAddAutomation?: () => void;
61
+ /** Disables "Add" (Attio disables it on an empty search). */
62
+ addAutomationDisabled?: boolean;
63
+ addAutomationLabel?: string;
64
+ learnMoreHref?: string;
65
+ learnMoreLabel?: string;
66
+ "aria-label"?: string;
67
+ className?: string;
68
+ };
69
+ /**
70
+ * A Share/permissions popover — measured live on app.attio.com (both an
71
+ * object table's and a List's own "Share" trigger, techpartners workspace):
72
+ * Members/Automations pill tabs, a "Workspace access" row (avatar + label +
73
+ * a `Read and write ⌄`-style role select), an optional plan-gated upsell
74
+ * slot, a "Clear permissions" action, an "Individual members" list (one row
75
+ * per member, its own role select), and — on the Automations tab — a
76
+ * search box + role select + "Add" row. Both tabs share a trailing "Learn
77
+ * more about permissions" link.
78
+ *
79
+ * Its own floating shell (not the generic `Popover`): the measured surface
80
+ * is 440px wide, past `Popover`'s 360px content cap. See share.recipe.ts.
81
+ */
82
+ export declare function SharePopover({ trigger, align, open: openProp, defaultOpen, onOpenChange, tab: tabProp, defaultTab, onTabChange, membersTabLabel: membersTabLabelProp, automationsTabLabel: automationsTabLabelProp, workspaceIcon, workspaceAccessLabel: workspaceAccessLabelProp, workspaceAccessValue, workspaceAccessOptions, onWorkspaceAccessChange, advancedSharing, onClearPermissions, clearPermissionsLabel: clearPermissionsLabelProp, members, membersSectionLabel: membersSectionLabelProp, memberRoleOptions, onMemberAccessChange, automationSearchValue, defaultAutomationSearchValue, onAutomationSearchChange, automationSearchPlaceholder: automationSearchPlaceholderProp, automationRoleValue, automationRoleOptions, onAutomationRoleChange, onAddAutomation, addAutomationDisabled, addAutomationLabel: addAutomationLabelProp, learnMoreHref, learnMoreLabel: learnMoreLabelProp, "aria-label": ariaLabel, className, ...rest }: SharePopoverProps): React.JSX.Element;
83
+ export declare namespace SharePopover {
84
+ var displayName: string;
85
+ }
@@ -0,0 +1,3 @@
1
+ declare const config: import("../..").RecipeConfig<{}>;
2
+ export declare const shareRecipe: import("../..").RecipeFn<{}>;
3
+ export default config;
@@ -0,0 +1 @@
1
+ export * from "./shortcutssheet";
@@ -0,0 +1,49 @@
1
+ import * as React from "react";
2
+ /** One simultaneous key combo — each entry its own `Kbd` chip, no separator
3
+ * between them (e.g. `["⌘", "K"]` for ⌘K, `["⌘", "⇧", "↑"]` for ⌘⇧↑). */
4
+ export type ShortcutStep = React.ReactNode[];
5
+ export type ShortcutRow = {
6
+ description: React.ReactNode;
7
+ /** More than one step is a SEQUENTIAL shortcut (Attio's own "G then H") —
8
+ * a `then` label renders between them. A single step is a simultaneous
9
+ * combo and gets no separator. */
10
+ steps: ShortcutStep[];
11
+ };
12
+ export type ShortcutSection = {
13
+ label: React.ReactNode;
14
+ rows: ShortcutRow[];
15
+ };
16
+ /**
17
+ * Attio's own canonical keyboard-shortcut list (crisp#615), live-measured
18
+ * off app.attio.com/techpartners' "Keyboard shortcuts" panel (Help →
19
+ * "Shortcuts") — 34 rows across 4 sections. The issue's own quoted table
20
+ * collapsed a few of these ("Navigate to the cell above/right/below/left",
21
+ * "Go to next/previous cell") into one row each; the live panel renders
22
+ * them as separate rows, which is what this list follows.
23
+ */
24
+ export declare const defaultShortcutSections: ShortcutSection[];
25
+ export type ShortcutsSheetProps = {
26
+ open: boolean;
27
+ onOpenChange: (open: boolean) => void;
28
+ /** Defaults to `defaultShortcutSections`. Swap in your own translated
29
+ * array — this is DATA, not one prop per string, the same way
30
+ * `Command`'s own default items are. */
31
+ sections?: ShortcutSection[];
32
+ title?: string;
33
+ /** The connector between a sequential shortcut's two steps (default
34
+ * "then", as in Attio's own "G then H"). */
35
+ thenLabel?: string;
36
+ /** aria-label on the close button (default "Close", `Drawer`'s own). */
37
+ closeLabel?: string;
38
+ className?: string;
39
+ } & Omit<React.ComponentPropsWithoutRef<"div">, "title" | "className" | "children">;
40
+ /**
41
+ * Attio's "Keyboard shortcuts" panel (crisp#615, parity row P-106) — a
42
+ * `Drawer` narrowed to the measured 360px (Drawer's own default is 420px),
43
+ * listing `sections` grouped with a hairline-free 10px row rhythm and a
44
+ * 20px gap before each new section label.
45
+ */
46
+ export declare function ShortcutsSheet({ open, onOpenChange, sections, title: titleProp, thenLabel: thenLabelProp, closeLabel, className, ...rest }: ShortcutsSheetProps): React.JSX.Element;
47
+ export declare namespace ShortcutsSheet {
48
+ var displayName: string;
49
+ }
@@ -0,0 +1,3 @@
1
+ declare const config: import("../..").RecipeConfig<{}>;
2
+ export declare const shortcutssheetRecipe: import("../..").RecipeFn<{}>;
3
+ export default config;
@@ -0,0 +1,2 @@
1
+ export { TaskEditPopover, type TaskEditPopoverProps } from "./taskeditpopover";
2
+ export { taskeditpopoverRecipe } from "./taskeditpopover.recipe";
@@ -0,0 +1,67 @@
1
+ import * as React from "react";
2
+ import { type AssigneePickerUser } from "../assigneepicker/assigneepicker";
3
+ import { type RecordPickerRecord } from "../recordpicker/recordpicker";
4
+ export type { AssigneePickerUser, RecordPickerRecord };
5
+ export type TaskEditPopoverProps = {
6
+ /** The element that opens the popover (a task row, typically). */
7
+ trigger: React.ReactElement;
8
+ open?: boolean;
9
+ defaultOpen?: boolean;
10
+ onOpenChange?: (open: boolean) => void;
11
+ title: string;
12
+ onTitleChange?: (title: string) => void;
13
+ done?: boolean;
14
+ onToggleDone?: (done: boolean) => void;
15
+ /** The due-date chip's own label, already formatted (e.g. "August 26,
16
+ * 2026"). Omit for the unset placeholder. */
17
+ dueDateLabel?: React.ReactNode;
18
+ /** The due-date chip's own sub-popover content -- a date picker is a
19
+ * separate, already-scoped surface elsewhere in crisp, so this stays a
20
+ * consumer-supplied slot rather than a second one built here. */
21
+ dueDatePicker?: React.ReactNode;
22
+ /** The task's current single assignee. */
23
+ assignee?: AssigneePickerUser | null;
24
+ /** Candidate users for the assignee picker's list. */
25
+ users?: AssigneePickerUser[];
26
+ onAssigneeChange?: (user: AssigneePickerUser | null) => void;
27
+ /** How many records are already linked -- Attio's own chip reads "Add
28
+ * record" at 0 and "`N` linked record(s)" from 1 up (live-confirmed:
29
+ * opening the composer from a record's own Activity tab pre-links that
30
+ * record and the chip already reads "1 linked record"). */
31
+ linkedRecordCount?: number;
32
+ /** Search results for the record picker. */
33
+ recordCandidates?: RecordPickerRecord[];
34
+ recordCandidatesLoading?: boolean;
35
+ onRecordQueryChange?: (query: string) => void;
36
+ onSelectRecord?: (record: RecordPickerRecord) => void;
37
+ /** The kebab's own dropdown content (e.g. a `Menu` with "Delete task"). */
38
+ menu?: React.ReactNode;
39
+ onCancel?: () => void;
40
+ onSave?: () => void;
41
+ headingLabel?: string;
42
+ closeLabel?: string;
43
+ dueDatePlaceholder?: string;
44
+ assignLabel?: string;
45
+ assignedToLabel?: string;
46
+ addRecordLabel?: string;
47
+ linkedRecordLabel?: string;
48
+ moreActionsLabel?: string;
49
+ cancelLabel?: string;
50
+ /** The Cancel button's key-cap caption (default "Esc"). */
51
+ cancelKeyLabel?: string;
52
+ saveLabel?: string;
53
+ className?: string;
54
+ };
55
+ /**
56
+ * A task's "Edit task" popover -- measured live on app.attio.com's Tasks
57
+ * page: a checkbox + editable title, then a chip row (due date / assigned /
58
+ * add record), a "more actions" kebab, and Cancel/Save. Composes
59
+ * `AssigneePicker` and `RecordPicker` (both crisp#626) behind their own
60
+ * chips, using the same core floating primitives `Popover` itself is built
61
+ * on rather than `Popover` directly (its content hardcodes a 360px max
62
+ * width, well under this popover's own measured 800px).
63
+ */
64
+ export declare function TaskEditPopover({ trigger, open: openProp, defaultOpen, onOpenChange, title, onTitleChange, done, onToggleDone, dueDateLabel, dueDatePicker, assignee, users, onAssigneeChange, linkedRecordCount, recordCandidates, recordCandidatesLoading, onRecordQueryChange, onSelectRecord, menu, onCancel, onSave, headingLabel: headingLabelProp, closeLabel: closeLabelProp, dueDatePlaceholder: dueDatePlaceholderProp, assignLabel: assignLabelProp, assignedToLabel: assignedToLabelProp, addRecordLabel: addRecordLabelProp, linkedRecordLabel: linkedRecordLabelProp, moreActionsLabel: moreActionsLabelProp, cancelLabel: cancelLabelProp, cancelKeyLabel: cancelKeyLabelProp, saveLabel: saveLabelProp, className, }: TaskEditPopoverProps): React.JSX.Element;
65
+ export declare namespace TaskEditPopover {
66
+ var displayName: string;
67
+ }
@@ -0,0 +1,3 @@
1
+ declare const config: import("../..").RecipeConfig<{}>;
2
+ export declare const taskeditpopoverRecipe: import("../..").RecipeFn<{}>;
3
+ export default config;
@@ -0,0 +1 @@
1
+ export * from "./workspaceswitchermenu";