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