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