@crisp-ui-kit/crisp 0.55.6 → 0.57.0
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/callout.css +6 -0
- package/dist/callout.d.ts +2 -2
- package/dist/callout.layered.css +6 -0
- package/dist/cjs/components/callout/callout.js +2 -2
- package/dist/cjs/components/callout/callout.recipe.js +15 -2
- package/dist/cjs/components/input/input.recipe.js +6 -0
- package/dist/cjs/components/menu/menu.js +2 -2
- package/dist/cjs/components/menu/menu.recipe.js +8 -0
- package/dist/cjs/components/multiselect/multiselect.js +23 -10
- package/dist/cjs/components/multiselect/multiselect.recipe.js +95 -65
- package/dist/cjs/components/select/listbox-keyboard.js +7 -1
- package/dist/cjs/components/select/select.js +24 -11
- package/dist/cjs/components/select/select.recipe.js +150 -78
- package/dist/cjs/components/statusdot/index.js +7 -0
- package/dist/cjs/components/statusdot/statusdot.js +15 -0
- package/dist/cjs/components/statusdot/statusdot.recipe.js +34 -0
- package/dist/cjs/components/tabletoolbar/tabletoolbar.js +3 -3
- package/dist/cjs/components/tabletoolbar/tabletoolbar.recipe.js +26 -1
- package/dist/cjs/components/tabs/tabs.js +63 -4
- package/dist/cjs/components/tabs/tabs.recipe.js +13 -0
- package/dist/cjs/components/text/text.recipe.js +10 -0
- package/dist/cjs/components/textlink/textlink.js +2 -2
- package/dist/cjs/components/textlink/textlink.recipe.js +18 -0
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/product/recordpage/recordpage.js +17 -4
- package/dist/cjs/tokens/elevation.js +7 -0
- package/dist/cjs/tokens/palette.js +41 -0
- package/dist/cjs/tokens/scale.js +16 -1
- package/dist/cjs/tokens/semantic.js +18 -0
- package/dist/esm/components/callout/callout.js +2 -2
- package/dist/esm/components/callout/callout.recipe.js +15 -2
- package/dist/esm/components/input/input.recipe.js +6 -0
- package/dist/esm/components/menu/menu.js +2 -2
- package/dist/esm/components/menu/menu.recipe.js +8 -0
- package/dist/esm/components/multiselect/multiselect.js +23 -10
- package/dist/esm/components/multiselect/multiselect.recipe.js +95 -65
- package/dist/esm/components/select/listbox-keyboard.js +7 -1
- package/dist/esm/components/select/select.js +24 -11
- package/dist/esm/components/select/select.recipe.js +150 -78
- package/dist/esm/components/statusdot/index.js +2 -0
- package/dist/esm/components/statusdot/statusdot.js +12 -0
- package/dist/esm/components/statusdot/statusdot.recipe.js +31 -0
- package/dist/esm/components/tabletoolbar/tabletoolbar.js +3 -3
- package/dist/esm/components/tabletoolbar/tabletoolbar.recipe.js +26 -1
- package/dist/esm/components/tabs/tabs.js +63 -4
- package/dist/esm/components/tabs/tabs.recipe.js +13 -0
- package/dist/esm/components/text/text.recipe.js +10 -0
- package/dist/esm/components/textlink/textlink.js +2 -2
- package/dist/esm/components/textlink/textlink.recipe.js +18 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/product/recordpage/recordpage.js +18 -5
- package/dist/esm/tokens/elevation.js +7 -0
- package/dist/esm/tokens/palette.js +41 -0
- package/dist/esm/tokens/scale.js +16 -1
- package/dist/esm/tokens/semantic.js +18 -0
- package/dist/input.css +4 -0
- package/dist/input.d.ts +2 -2
- package/dist/input.layered.css +4 -0
- package/dist/menu.css +8 -0
- package/dist/menu.layered.css +8 -0
- package/dist/multiselect.css +53 -29
- package/dist/multiselect.d.ts +3 -1
- package/dist/multiselect.layered.css +53 -29
- package/dist/native/tokens.d.ts +1 -1
- package/dist/native/tokens.js +50 -7
- package/dist/select.css +80 -42
- package/dist/select.d.ts +3 -2
- package/dist/select.layered.css +80 -42
- package/dist/statusdot.css +3 -0
- package/dist/statusdot.d.ts +7 -0
- package/dist/statusdot.layered.css +5 -0
- package/dist/styles.css +238 -73
- package/dist/styles.layered.css +238 -73
- package/dist/tabletoolbar.css +8 -1
- package/dist/tabletoolbar.layered.css +8 -1
- package/dist/tabs.css +6 -0
- package/dist/tabs.layered.css +6 -0
- package/dist/text.css +6 -0
- package/dist/text.d.ts +2 -2
- package/dist/text.layered.css +6 -0
- package/dist/textlink.css +9 -0
- package/dist/textlink.d.ts +2 -1
- package/dist/textlink.layered.css +9 -0
- package/dist/tokens.css +54 -1
- package/dist/tokens.json +50 -7
- package/dist/types/components/callout/callout.d.ts +9 -1
- package/dist/types/components/callout/callout.recipe.d.ts +12 -2
- package/dist/types/components/input/input.d.ts +2 -0
- package/dist/types/components/input/input.recipe.d.ts +3 -0
- package/dist/types/components/menu/menu.d.ts +7 -1
- package/dist/types/components/multiselect/multiselect.d.ts +24 -6
- package/dist/types/components/multiselect/multiselect.recipe.d.ts +24 -0
- package/dist/types/components/select/listbox-keyboard.d.ts +10 -1
- package/dist/types/components/select/select.d.ts +28 -6
- package/dist/types/components/select/select.recipe.d.ts +22 -10
- package/dist/types/components/statusdot/index.d.ts +2 -0
- package/dist/types/components/statusdot/statusdot.d.ts +21 -0
- package/dist/types/components/statusdot/statusdot.recipe.d.ts +15 -0
- package/dist/types/components/tabletoolbar/tabletoolbar.d.ts +14 -0
- package/dist/types/components/tabs/tabs.d.ts +9 -1
- package/dist/types/components/text/text.d.ts +4 -0
- package/dist/types/components/text/text.recipe.d.ts +12 -0
- package/dist/types/components/textlink/textlink.d.ts +8 -1
- package/dist/types/components/textlink/textlink.recipe.d.ts +10 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/product/recordpage/recordpage.d.ts +25 -1
- package/dist/types/tokens/contract.d.ts +13 -3
- package/dist/types/tokens/elevation.d.ts +7 -0
- package/dist/types/tokens/palette.d.ts +36 -0
- package/dist/types/tokens/scale.d.ts +6 -1
- package/dist/types/tokens/semantic.d.ts +18 -0
- package/package.json +6 -1
package/dist/tokens.css
CHANGED
|
@@ -1,3 +1,31 @@
|
|
|
1
|
+
@font-face {
|
|
2
|
+
font-family: "VK Sans Display";
|
|
3
|
+
src: local("VK Sans Display Regular");
|
|
4
|
+
font-weight: 400;
|
|
5
|
+
font-style: normal;
|
|
6
|
+
font-display: swap;
|
|
7
|
+
}
|
|
8
|
+
@font-face {
|
|
9
|
+
font-family: "VK Sans Display";
|
|
10
|
+
src: local("VK Sans Display Medium");
|
|
11
|
+
font-weight: 500;
|
|
12
|
+
font-style: normal;
|
|
13
|
+
font-display: swap;
|
|
14
|
+
}
|
|
15
|
+
@font-face {
|
|
16
|
+
font-family: "VK Sans Display";
|
|
17
|
+
src: local("VK Sans Display DemiBold");
|
|
18
|
+
font-weight: 600;
|
|
19
|
+
font-style: normal;
|
|
20
|
+
font-display: swap;
|
|
21
|
+
}
|
|
22
|
+
@font-face {
|
|
23
|
+
font-family: "VK Sans Display";
|
|
24
|
+
src: local("VK Sans Display Bold");
|
|
25
|
+
font-weight: 700;
|
|
26
|
+
font-style: normal;
|
|
27
|
+
font-display: swap;
|
|
28
|
+
}
|
|
1
29
|
:root {
|
|
2
30
|
--crisp-bg-brand-solid: #266df0;
|
|
3
31
|
--crisp-bg-brand-solid-pressed: #1f5fd6;
|
|
@@ -54,6 +82,16 @@
|
|
|
54
82
|
--crisp-bg-purple-soft: #f5f0ff;
|
|
55
83
|
--crisp-fg-purple-soft: #6238b5;
|
|
56
84
|
--crisp-ring-purple-soft: #e8ddfe;
|
|
85
|
+
--crisp-ring-brand-soft: #d6e5ff;
|
|
86
|
+
--crisp-fg-select-neutral: #1a1c20;
|
|
87
|
+
--crisp-bg-select-listbox: #ffffff;
|
|
88
|
+
--crisp-stroke-select-trigger: #dcdee3;
|
|
89
|
+
--crisp-bg-select-pressed: #00000007;
|
|
90
|
+
--crisp-bg-select-disabled: #f3f4f5;
|
|
91
|
+
--crisp-stroke-select-invalid: #fa342c;
|
|
92
|
+
--crisp-stroke-select-divider: #00000010;
|
|
93
|
+
--crisp-fg-select-placeholder: #b0b3ba;
|
|
94
|
+
--crisp-shadow-select: #0000001f;
|
|
57
95
|
}
|
|
58
96
|
|
|
59
97
|
[data-theme="dark"] {
|
|
@@ -112,6 +150,16 @@
|
|
|
112
150
|
--crisp-bg-purple-soft: #2f1e5a;
|
|
113
151
|
--crisp-fg-purple-soft: #d8c4ff;
|
|
114
152
|
--crisp-ring-purple-soft: #45297d;
|
|
153
|
+
--crisp-ring-brand-soft: #212224;
|
|
154
|
+
--crisp-fg-select-neutral: #f3f4f5;
|
|
155
|
+
--crisp-bg-select-listbox: #1d2025;
|
|
156
|
+
--crisp-stroke-select-trigger: #393d46;
|
|
157
|
+
--crisp-bg-select-pressed: #ffffff0d;
|
|
158
|
+
--crisp-bg-select-disabled: #2b2e35;
|
|
159
|
+
--crisp-stroke-select-invalid: #ff6e60;
|
|
160
|
+
--crisp-stroke-select-divider: #ffffff17;
|
|
161
|
+
--crisp-fg-select-placeholder: #868b94;
|
|
162
|
+
--crisp-shadow-select: #000000cc;
|
|
115
163
|
}
|
|
116
164
|
|
|
117
165
|
:root {
|
|
@@ -126,12 +174,14 @@
|
|
|
126
174
|
--crisp-space-0-5: 2px;
|
|
127
175
|
--crisp-space-1-5: 6px;
|
|
128
176
|
--crisp-space-2-5: 10px;
|
|
177
|
+
--crisp-space-3-5: 14px;
|
|
129
178
|
--crisp-radius-chip: 7px;
|
|
130
179
|
--crisp-radius-sm: 6px;
|
|
131
180
|
--crisp-radius-md: 8px;
|
|
132
181
|
--crisp-radius-lg: 9px;
|
|
133
182
|
--crisp-radius-xl: 12px;
|
|
134
183
|
--crisp-radius-2xl: 16px;
|
|
184
|
+
--crisp-radius-3xl: 20px;
|
|
135
185
|
--crisp-radius-full: 999px;
|
|
136
186
|
--crisp-size-icon: 16px;
|
|
137
187
|
--crisp-size-chip: 22px;
|
|
@@ -142,6 +192,9 @@
|
|
|
142
192
|
--crisp-size-header: 48px;
|
|
143
193
|
--crisp-size-calendarCell: 34px;
|
|
144
194
|
--crisp-size-calendarPill: 32px;
|
|
195
|
+
--crisp-size-selectTriggerMd: 40px;
|
|
196
|
+
--crisp-size-selectTriggerLg: 52px;
|
|
197
|
+
--crisp-size-selectIconLg: 20px;
|
|
145
198
|
--crisp-text-xs: 11px;
|
|
146
199
|
--crisp-text-sm: 12px;
|
|
147
200
|
--crisp-text-md: 13px;
|
|
@@ -151,5 +204,5 @@
|
|
|
151
204
|
--crisp-weight-medium: 500;
|
|
152
205
|
--crisp-weight-semibold: 600;
|
|
153
206
|
--crisp-weight-bold: 700;
|
|
154
|
-
--crisp-font-sans: "Inter", system-ui, -apple-system, "Segoe UI", sans-serif;
|
|
207
|
+
--crisp-font-sans: "VK Sans Display", "Inter", system-ui, -apple-system, "Segoe UI", sans-serif;
|
|
155
208
|
}
|
package/dist/tokens.json
CHANGED
|
@@ -55,7 +55,17 @@
|
|
|
55
55
|
"fgNeutralSoft": "#505155",
|
|
56
56
|
"bgPurpleSoft": "#f5f0ff",
|
|
57
57
|
"fgPurpleSoft": "#6238b5",
|
|
58
|
-
"ringPurpleSoft": "#e8ddfe"
|
|
58
|
+
"ringPurpleSoft": "#e8ddfe",
|
|
59
|
+
"ringBrandSoft": "#d6e5ff",
|
|
60
|
+
"fgSelectNeutral": "#1a1c20",
|
|
61
|
+
"bgSelectListbox": "#ffffff",
|
|
62
|
+
"strokeSelectTrigger": "#dcdee3",
|
|
63
|
+
"bgSelectPressed": "#00000007",
|
|
64
|
+
"bgSelectDisabled": "#f3f4f5",
|
|
65
|
+
"strokeSelectInvalid": "#fa342c",
|
|
66
|
+
"strokeSelectDivider": "#00000010",
|
|
67
|
+
"fgSelectPlaceholder": "#b0b3ba",
|
|
68
|
+
"shadowSelect": "#0000001f"
|
|
59
69
|
},
|
|
60
70
|
"dark": {
|
|
61
71
|
"bgBrandSolid": "#266df0",
|
|
@@ -112,7 +122,17 @@
|
|
|
112
122
|
"fgNeutralSoft": "#9a9aa2",
|
|
113
123
|
"bgPurpleSoft": "#2f1e5a",
|
|
114
124
|
"fgPurpleSoft": "#d8c4ff",
|
|
115
|
-
"ringPurpleSoft": "#45297d"
|
|
125
|
+
"ringPurpleSoft": "#45297d",
|
|
126
|
+
"ringBrandSoft": "#212224",
|
|
127
|
+
"fgSelectNeutral": "#f3f4f5",
|
|
128
|
+
"bgSelectListbox": "#1d2025",
|
|
129
|
+
"strokeSelectTrigger": "#393d46",
|
|
130
|
+
"bgSelectPressed": "#ffffff0d",
|
|
131
|
+
"bgSelectDisabled": "#2b2e35",
|
|
132
|
+
"strokeSelectInvalid": "#ff6e60",
|
|
133
|
+
"strokeSelectDivider": "#ffffff17",
|
|
134
|
+
"fgSelectPlaceholder": "#868b94",
|
|
135
|
+
"shadowSelect": "#000000cc"
|
|
116
136
|
}
|
|
117
137
|
},
|
|
118
138
|
"palette": {
|
|
@@ -129,6 +149,7 @@
|
|
|
129
149
|
"ringNeutral": "transparent",
|
|
130
150
|
"ringField": "rgba(0,0,0,0.06)",
|
|
131
151
|
"ringSwitch": "#d9dade",
|
|
152
|
+
"ringBrandSoft": "#d6e5ff",
|
|
132
153
|
"tileActive": "#ffffff",
|
|
133
154
|
"tileActiveShadow": "rgba(0,0,0,0.04)",
|
|
134
155
|
"bgScrim": "rgba(0,0,0,0.25)",
|
|
@@ -169,7 +190,15 @@
|
|
|
169
190
|
"softNeutralText": "#505155",
|
|
170
191
|
"purpleTint": "#f5f0ff",
|
|
171
192
|
"softPurpleText": "#6238b5",
|
|
172
|
-
"purpleRing": "#e8ddfe"
|
|
193
|
+
"purpleRing": "#e8ddfe",
|
|
194
|
+
"selectListboxBg": "#ffffff",
|
|
195
|
+
"selectTriggerStroke": "#dcdee3",
|
|
196
|
+
"selectPressedTint": "#00000007",
|
|
197
|
+
"selectDisabledBg": "#f3f4f5",
|
|
198
|
+
"selectInvalidStroke": "#fa342c",
|
|
199
|
+
"selectDivider": "#00000010",
|
|
200
|
+
"selectPlaceholder": "#b0b3ba",
|
|
201
|
+
"selectShadow": "#0000001f"
|
|
173
202
|
},
|
|
174
203
|
"dark": {
|
|
175
204
|
"gray00": "#0a0a0a",
|
|
@@ -184,6 +213,7 @@
|
|
|
184
213
|
"ringNeutral": "#212224",
|
|
185
214
|
"ringField": "#212224",
|
|
186
215
|
"ringSwitch": "#212224",
|
|
216
|
+
"ringBrandSoft": "#212224",
|
|
187
217
|
"tileActive": "#101112",
|
|
188
218
|
"tileActiveShadow": "rgba(0,0,0,0)",
|
|
189
219
|
"bgScrim": "rgba(0,0,0,0.55)",
|
|
@@ -224,7 +254,15 @@
|
|
|
224
254
|
"softNeutralText": "#9a9aa2",
|
|
225
255
|
"purpleTint": "#2f1e5a",
|
|
226
256
|
"softPurpleText": "#d8c4ff",
|
|
227
|
-
"purpleRing": "#45297d"
|
|
257
|
+
"purpleRing": "#45297d",
|
|
258
|
+
"selectListboxBg": "#1d2025",
|
|
259
|
+
"selectTriggerStroke": "#393d46",
|
|
260
|
+
"selectPressedTint": "#ffffff0d",
|
|
261
|
+
"selectDisabledBg": "#2b2e35",
|
|
262
|
+
"selectInvalidStroke": "#ff6e60",
|
|
263
|
+
"selectDivider": "#ffffff17",
|
|
264
|
+
"selectPlaceholder": "#868b94",
|
|
265
|
+
"selectShadow": "#000000cc"
|
|
228
266
|
}
|
|
229
267
|
},
|
|
230
268
|
"space": {
|
|
@@ -238,7 +276,8 @@
|
|
|
238
276
|
"px": 1,
|
|
239
277
|
"0.5": 2,
|
|
240
278
|
"1.5": 6,
|
|
241
|
-
"2.5": 10
|
|
279
|
+
"2.5": 10,
|
|
280
|
+
"3.5": 14
|
|
242
281
|
},
|
|
243
282
|
"radius": {
|
|
244
283
|
"chip": 7,
|
|
@@ -247,6 +286,7 @@
|
|
|
247
286
|
"lg": 9,
|
|
248
287
|
"xl": 12,
|
|
249
288
|
"2xl": 16,
|
|
289
|
+
"3xl": 20,
|
|
250
290
|
"full": 999
|
|
251
291
|
},
|
|
252
292
|
"size": {
|
|
@@ -258,7 +298,10 @@
|
|
|
258
298
|
"tableHeader": 40,
|
|
259
299
|
"header": 48,
|
|
260
300
|
"calendarCell": 34,
|
|
261
|
-
"calendarPill": 32
|
|
301
|
+
"calendarPill": 32,
|
|
302
|
+
"selectTriggerMd": 40,
|
|
303
|
+
"selectTriggerLg": 52,
|
|
304
|
+
"selectIconLg": 20
|
|
262
305
|
},
|
|
263
306
|
"text": {
|
|
264
307
|
"xs": 11,
|
|
@@ -268,7 +311,7 @@
|
|
|
268
311
|
"xl": 16
|
|
269
312
|
},
|
|
270
313
|
"font": {
|
|
271
|
-
"sans": "\"Inter\", system-ui, -apple-system, \"Segoe UI\", sans-serif"
|
|
314
|
+
"sans": "\"VK Sans Display\", \"Inter\", system-ui, -apple-system, \"Segoe UI\", sans-serif"
|
|
272
315
|
},
|
|
273
316
|
"weight": {
|
|
274
317
|
"regular": "400",
|
|
@@ -8,13 +8,21 @@ export type CalloutProps = Omit<React.ComponentPropsWithoutRef<"div">, "title">
|
|
|
8
8
|
children?: React.ReactNode;
|
|
9
9
|
/** Trailing action (e.g. a Button). */
|
|
10
10
|
action?: React.ReactNode;
|
|
11
|
+
/**
|
|
12
|
+
* A page-level banner look (crisp#869): a 1px border, 12px radius, tighter
|
|
13
|
+
* 8px/12px padding, and a brand-tinted background — measured live on
|
|
14
|
+
* Attio's own Objects settings page (a real full-width Pro-plan nudge).
|
|
15
|
+
* There's no measured close/dismiss button on that banner, so this adds
|
|
16
|
+
* none.
|
|
17
|
+
*/
|
|
18
|
+
bordered?: boolean;
|
|
11
19
|
className?: string;
|
|
12
20
|
};
|
|
13
21
|
/**
|
|
14
22
|
* An inline callout / banner — measured from info notices. `tone` tints
|
|
15
23
|
* the background and icon; pass a `title` and/or body `children`.
|
|
16
24
|
*/
|
|
17
|
-
export declare function Callout({ tone, icon, title, children, action, className, ...rest }: CalloutProps): React.JSX.Element;
|
|
25
|
+
export declare function Callout({ tone, icon, title, children, action, bordered, className, ...rest }: CalloutProps): React.JSX.Element;
|
|
18
26
|
export declare namespace Callout {
|
|
19
27
|
var displayName: string;
|
|
20
28
|
}
|
|
@@ -1,3 +1,13 @@
|
|
|
1
|
-
declare const config: import("../..").RecipeConfig<{
|
|
2
|
-
|
|
1
|
+
declare const config: import("../..").RecipeConfig<{
|
|
2
|
+
bordered: {
|
|
3
|
+
true: string;
|
|
4
|
+
false: string;
|
|
5
|
+
};
|
|
6
|
+
}>;
|
|
7
|
+
export declare const calloutRecipe: import("../..").RecipeFn<{
|
|
8
|
+
bordered: {
|
|
9
|
+
true: string;
|
|
10
|
+
false: string;
|
|
11
|
+
};
|
|
12
|
+
}>;
|
|
3
13
|
export default config;
|
|
@@ -7,6 +7,7 @@ export type InputProps = Omit<React.ComponentPropsWithoutRef<"input">, "size"> &
|
|
|
7
7
|
};
|
|
8
8
|
export declare const Input: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>, "ref">, "size"> & VariantProps<import("../..").RecipeFn<{
|
|
9
9
|
size: {
|
|
10
|
+
sm: string;
|
|
10
11
|
medium: string;
|
|
11
12
|
large: string;
|
|
12
13
|
};
|
|
@@ -17,6 +18,7 @@ export declare const Input: React.ForwardRefExoticComponent<Omit<Omit<React.Deta
|
|
|
17
18
|
}> & {
|
|
18
19
|
config: import("../..").RecipeConfig<{
|
|
19
20
|
size: {
|
|
21
|
+
sm: string;
|
|
20
22
|
medium: string;
|
|
21
23
|
large: string;
|
|
22
24
|
};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
declare const config: import("../..").RecipeConfig<{
|
|
2
2
|
size: {
|
|
3
|
+
sm: string;
|
|
3
4
|
medium: string;
|
|
4
5
|
large: string;
|
|
5
6
|
};
|
|
@@ -10,6 +11,7 @@ declare const config: import("../..").RecipeConfig<{
|
|
|
10
11
|
}>;
|
|
11
12
|
export declare const inputRecipe: import("../..").RecipeFn<{
|
|
12
13
|
size: {
|
|
14
|
+
sm: string;
|
|
13
15
|
medium: string;
|
|
14
16
|
large: string;
|
|
15
17
|
};
|
|
@@ -20,6 +22,7 @@ export declare const inputRecipe: import("../..").RecipeFn<{
|
|
|
20
22
|
}> & {
|
|
21
23
|
config: import("../..").RecipeConfig<{
|
|
22
24
|
size: {
|
|
25
|
+
sm: string;
|
|
23
26
|
medium: string;
|
|
24
27
|
large: string;
|
|
25
28
|
};
|
|
@@ -39,13 +39,19 @@ export type MenuItemProps = {
|
|
|
39
39
|
children: React.ReactNode;
|
|
40
40
|
icon?: React.ReactNode;
|
|
41
41
|
shortcut?: string;
|
|
42
|
+
/**
|
|
43
|
+
* A trailing count badge (crisp#875) — e.g. a saved-filter item showing
|
|
44
|
+
* how many rows match. Same measured neutral chip `ToolbarTool`'s own
|
|
45
|
+
* `count` prop uses, not bare text.
|
|
46
|
+
*/
|
|
47
|
+
count?: React.ReactNode;
|
|
42
48
|
danger?: boolean;
|
|
43
49
|
disabled?: boolean;
|
|
44
50
|
onSelect?: () => void;
|
|
45
51
|
/** Keep the menu open after selecting (default closes). */
|
|
46
52
|
closeOnSelect?: boolean;
|
|
47
53
|
};
|
|
48
|
-
export declare function MenuItem({ children, icon, shortcut, danger, disabled, onSelect, closeOnSelect, }: MenuItemProps): React.JSX.Element;
|
|
54
|
+
export declare function MenuItem({ children, icon, shortcut, count, danger, disabled, onSelect, closeOnSelect, }: MenuItemProps): React.JSX.Element;
|
|
49
55
|
export declare namespace MenuItem {
|
|
50
56
|
var displayName: string;
|
|
51
57
|
}
|
|
@@ -45,18 +45,36 @@ export type MultiSelectProps = Omit<React.ComponentPropsWithoutRef<"div">, "valu
|
|
|
45
45
|
/** Shown when the search matches nothing. */
|
|
46
46
|
emptyLabel?: string;
|
|
47
47
|
disabled?: boolean;
|
|
48
|
-
/**
|
|
48
|
+
/**
|
|
49
|
+
* Answered and locked, not editable — unlike `disabled`, the trigger stays
|
|
50
|
+
* focusable (crisp/#882, matching `Select`'s `readOnly`).
|
|
51
|
+
*/
|
|
52
|
+
readOnly?: boolean;
|
|
53
|
+
/** 2px red border + `aria-invalid`, matching `Input`'s and `Select`'s. */
|
|
49
54
|
invalid?: boolean;
|
|
55
|
+
/**
|
|
56
|
+
* seed-design's two Select-family sizes (crisp/#882): `medium` (default,
|
|
57
|
+
* 40px trigger floor) or `large` (52px). Purely visual.
|
|
58
|
+
*/
|
|
59
|
+
size?: "medium" | "large";
|
|
60
|
+
/**
|
|
61
|
+
* `ghost` fills whatever row it's embedded in instead of the fixed
|
|
62
|
+
* trigger height — for inline table cell editors (crisp/#882, matching
|
|
63
|
+
* `Select`'s `variant`).
|
|
64
|
+
*/
|
|
65
|
+
variant?: "default" | "ghost";
|
|
50
66
|
className?: string;
|
|
51
67
|
"aria-label"?: string;
|
|
52
68
|
};
|
|
53
69
|
/**
|
|
54
|
-
* A multi-select / tag editor
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
70
|
+
* A multi-select / tag editor, its trigger/listbox/item chrome built to the
|
|
71
|
+
* same seed-design parity as `Select` (crisp/#882, following #867/#879) —
|
|
72
|
+
* its own chip/checkbox picker behaviour is unchanged. The outlined trigger
|
|
73
|
+
* shows the selected values as coloured chips; it opens a popover with a
|
|
74
|
+
* search field over rows of "[chip] … [checkbox]" that toggle on click (the
|
|
75
|
+
* menu stays open). Keyboard: ↑/↓ move, Enter/Space toggle, Esc closes.
|
|
58
76
|
*/
|
|
59
|
-
export declare function MultiSelect({ options, value: valueProp, defaultValue, onValueChange, name, required, id, placeholder: placeholderProp, searchable, searchPlaceholder: searchPlaceholderProp, emptyLabel: emptyLabelProp, disabled, invalid, className, "aria-label": ariaLabel, ...rest }: MultiSelectProps): React.JSX.Element;
|
|
77
|
+
export declare function MultiSelect({ options, value: valueProp, defaultValue, onValueChange, name, required, id, placeholder: placeholderProp, searchable, searchPlaceholder: searchPlaceholderProp, emptyLabel: emptyLabelProp, disabled, readOnly, invalid, size, variant, className, "aria-label": ariaLabel, ...rest }: MultiSelectProps): React.JSX.Element;
|
|
60
78
|
export declare namespace MultiSelect {
|
|
61
79
|
var displayName: string;
|
|
62
80
|
}
|
|
@@ -1,20 +1,44 @@
|
|
|
1
1
|
declare const config: import("../..").RecipeConfig<{
|
|
2
|
+
size: {
|
|
3
|
+
medium: string;
|
|
4
|
+
large: string;
|
|
5
|
+
};
|
|
2
6
|
invalid: {
|
|
3
7
|
true: string;
|
|
4
8
|
false: string;
|
|
5
9
|
};
|
|
10
|
+
variant: {
|
|
11
|
+
default: string;
|
|
12
|
+
ghost: string;
|
|
13
|
+
};
|
|
6
14
|
}>;
|
|
7
15
|
export declare const multiselectRecipe: import("../..").RecipeFn<{
|
|
16
|
+
size: {
|
|
17
|
+
medium: string;
|
|
18
|
+
large: string;
|
|
19
|
+
};
|
|
8
20
|
invalid: {
|
|
9
21
|
true: string;
|
|
10
22
|
false: string;
|
|
11
23
|
};
|
|
24
|
+
variant: {
|
|
25
|
+
default: string;
|
|
26
|
+
ghost: string;
|
|
27
|
+
};
|
|
12
28
|
}> & {
|
|
13
29
|
config: import("../..").RecipeConfig<{
|
|
30
|
+
size: {
|
|
31
|
+
medium: string;
|
|
32
|
+
large: string;
|
|
33
|
+
};
|
|
14
34
|
invalid: {
|
|
15
35
|
true: string;
|
|
16
36
|
false: string;
|
|
17
37
|
};
|
|
38
|
+
variant: {
|
|
39
|
+
default: string;
|
|
40
|
+
ghost: string;
|
|
41
|
+
};
|
|
18
42
|
}>;
|
|
19
43
|
};
|
|
20
44
|
export default config;
|
|
@@ -19,6 +19,15 @@ export type UseListboxKeyboardOptions = {
|
|
|
19
19
|
* lands the user in the wrong place. Defaults to `close`.
|
|
20
20
|
*/
|
|
21
21
|
dismiss?: () => void;
|
|
22
|
+
/**
|
|
23
|
+
* Space also commits the highlighted option, matching seed-design's
|
|
24
|
+
* Select (crisp/#867: Enter AND Space both commit) and native `<select>`.
|
|
25
|
+
* Defaults `false` because this same hook wires a `searchable` popup's own
|
|
26
|
+
* text input — there, Space must stay a normal character, never a commit.
|
|
27
|
+
* Pass `true` only when the element this hook is bound to is NOT a text
|
|
28
|
+
* field (the trigger itself, when not `searchable`).
|
|
29
|
+
*/
|
|
30
|
+
commitOnSpace?: boolean;
|
|
22
31
|
};
|
|
23
32
|
/**
|
|
24
33
|
* The WAI-ARIA listbox keyboard model for a POPUP listbox: ↑/↓ to move the
|
|
@@ -33,6 +42,6 @@ export type UseListboxKeyboardOptions = {
|
|
|
33
42
|
* NOT for `WheelPicker`: that is an always-visible multi-column wheel that
|
|
34
43
|
* commits on move, so Enter, Escape and Tab have no meaning in it.
|
|
35
44
|
*/
|
|
36
|
-
export declare function useListboxKeyboard({ enabledIndexes, highlight, setHighlight, commit, close, dismiss, }: UseListboxKeyboardOptions): {
|
|
45
|
+
export declare function useListboxKeyboard({ enabledIndexes, highlight, setHighlight, commit, close, dismiss, commitOnSpace, }: UseListboxKeyboardOptions): {
|
|
37
46
|
onKeyDown: (e: React.KeyboardEvent) => void;
|
|
38
47
|
};
|
|
@@ -20,6 +20,12 @@ export type SelectOption = {
|
|
|
20
20
|
* with no `group` render exactly as before this existed.
|
|
21
21
|
*/
|
|
22
22
|
group?: string;
|
|
23
|
+
/**
|
|
24
|
+
* A second line under `label` (crisp/#867, seed-design's `SelectItem`
|
|
25
|
+
* label + description). Omit for the plain single-line row every existing
|
|
26
|
+
* consumer already renders.
|
|
27
|
+
*/
|
|
28
|
+
description?: React.ReactNode;
|
|
23
29
|
};
|
|
24
30
|
export type SelectProps = Omit<React.ComponentPropsWithoutRef<"div">, "value" | "defaultValue" | "onChange"> & {
|
|
25
31
|
options: SelectOption[];
|
|
@@ -49,6 +55,19 @@ export type SelectProps = Omit<React.ComponentPropsWithoutRef<"div">, "value" |
|
|
|
49
55
|
variant?: "default" | "ghost";
|
|
50
56
|
/** `full` (default) fills its container; `auto` sizes to content. */
|
|
51
57
|
width?: "full" | "auto";
|
|
58
|
+
/**
|
|
59
|
+
* seed-design's two Select sizes (crisp/#867): `medium` (default, 40px
|
|
60
|
+
* trigger) for general use, `large` (52px) where the surrounding layout
|
|
61
|
+
* calls for it. Purely visual — everything else about the control is
|
|
62
|
+
* identical between the two.
|
|
63
|
+
*/
|
|
64
|
+
size?: "medium" | "large";
|
|
65
|
+
/**
|
|
66
|
+
* Answered and locked, not editable — unlike `disabled`, the trigger stays
|
|
67
|
+
* focusable and its text stays full-strength ink (crisp/#867, seed-design's
|
|
68
|
+
* `readonly` state: the fill greys like `disabled`, the text doesn't).
|
|
69
|
+
*/
|
|
70
|
+
readOnly?: boolean;
|
|
52
71
|
/** Show a search field at the top of the list that filters options (Linear/cmdk style). */
|
|
53
72
|
searchable?: boolean;
|
|
54
73
|
searchPlaceholder?: string;
|
|
@@ -68,13 +87,16 @@ export type SelectProps = Omit<React.ComponentPropsWithoutRef<"div">, "value" |
|
|
|
68
87
|
id?: string;
|
|
69
88
|
};
|
|
70
89
|
/**
|
|
71
|
-
* A select / dropdown
|
|
72
|
-
*
|
|
73
|
-
* `
|
|
74
|
-
*
|
|
75
|
-
*
|
|
90
|
+
* A select / dropdown, built to seed-design's Select (crisp/#867) rather than
|
|
91
|
+
* measured from Attio — a deliberate one-component exception, the same way
|
|
92
|
+
* `DatePicker` follows seed's calendar structure — with an optional
|
|
93
|
+
* Linear-style search seed itself has no equivalent of. A `role="combobox"`
|
|
94
|
+
* trigger opens a `role="listbox"`; pass `searchable` to add a filter field
|
|
95
|
+
* at the top (with a "No results" empty state). Full keyboard model — ↑/↓
|
|
96
|
+
* move, Enter/Space pick, Esc close, Home/End jump, opens upward when tight.
|
|
97
|
+
* Controlled or uncontrolled.
|
|
76
98
|
*/
|
|
77
|
-
export declare function Select({ options, value, defaultValue, onValueChange, name, required, placeholder: placeholderProp, variant, width, searchable, searchPlaceholder: searchPlaceholderProp, onSearchChange, emptyLabel: emptyLabelProp, disabled, invalid, className, "aria-label": ariaLabel, id, ...rest }: SelectProps): React.JSX.Element;
|
|
99
|
+
export declare function Select({ options, value, defaultValue, onValueChange, name, required, placeholder: placeholderProp, variant, width, size, searchable, searchPlaceholder: searchPlaceholderProp, onSearchChange, emptyLabel: emptyLabelProp, disabled, readOnly, invalid, className, "aria-label": ariaLabel, id, ...rest }: SelectProps): React.JSX.Element;
|
|
78
100
|
export declare namespace Select {
|
|
79
101
|
var displayName: string;
|
|
80
102
|
}
|
|
@@ -1,44 +1,56 @@
|
|
|
1
1
|
declare const config: import("../..").RecipeConfig<{
|
|
2
|
-
variant: {
|
|
3
|
-
default: string;
|
|
4
|
-
ghost: string;
|
|
5
|
-
};
|
|
6
2
|
width: {
|
|
7
3
|
full: string;
|
|
8
4
|
auto: string;
|
|
9
5
|
};
|
|
6
|
+
size: {
|
|
7
|
+
medium: string;
|
|
8
|
+
large: string;
|
|
9
|
+
};
|
|
10
10
|
invalid: {
|
|
11
11
|
true: string;
|
|
12
12
|
false: string;
|
|
13
13
|
};
|
|
14
|
-
}>;
|
|
15
|
-
export declare const selectRecipe: import("../..").RecipeFn<{
|
|
16
14
|
variant: {
|
|
17
15
|
default: string;
|
|
18
16
|
ghost: string;
|
|
19
17
|
};
|
|
18
|
+
}>;
|
|
19
|
+
export declare const selectRecipe: import("../..").RecipeFn<{
|
|
20
20
|
width: {
|
|
21
21
|
full: string;
|
|
22
22
|
auto: string;
|
|
23
23
|
};
|
|
24
|
+
size: {
|
|
25
|
+
medium: string;
|
|
26
|
+
large: string;
|
|
27
|
+
};
|
|
24
28
|
invalid: {
|
|
25
29
|
true: string;
|
|
26
30
|
false: string;
|
|
27
31
|
};
|
|
32
|
+
variant: {
|
|
33
|
+
default: string;
|
|
34
|
+
ghost: string;
|
|
35
|
+
};
|
|
28
36
|
}> & {
|
|
29
37
|
config: import("../..").RecipeConfig<{
|
|
30
|
-
variant: {
|
|
31
|
-
default: string;
|
|
32
|
-
ghost: string;
|
|
33
|
-
};
|
|
34
38
|
width: {
|
|
35
39
|
full: string;
|
|
36
40
|
auto: string;
|
|
37
41
|
};
|
|
42
|
+
size: {
|
|
43
|
+
medium: string;
|
|
44
|
+
large: string;
|
|
45
|
+
};
|
|
38
46
|
invalid: {
|
|
39
47
|
true: string;
|
|
40
48
|
false: string;
|
|
41
49
|
};
|
|
50
|
+
variant: {
|
|
51
|
+
default: string;
|
|
52
|
+
ghost: string;
|
|
53
|
+
};
|
|
42
54
|
}>;
|
|
43
55
|
};
|
|
44
56
|
export default config;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type * as React from "react";
|
|
2
|
+
export type StatusDotProps = React.ComponentPropsWithoutRef<"span"> & {
|
|
3
|
+
/**
|
|
4
|
+
* The dot's fill — any CSS colour. Attio assigns an arbitrary colour per
|
|
5
|
+
* stage/status from its own picker (measured values aren't a fixed enum;
|
|
6
|
+
* see the recipe's doc), so this takes a colour directly rather than a
|
|
7
|
+
* `tone` name.
|
|
8
|
+
*/
|
|
9
|
+
color: string;
|
|
10
|
+
className?: string;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* A standalone coloured status/stage dot — a stage-column header's own
|
|
14
|
+
* colour swatch, a status field's leading indicator. Not a Badge: no pill,
|
|
15
|
+
* no text pairing required. Pass `children` (e.g. a label) alongside it in
|
|
16
|
+
* your own flex row; this renders only the dot.
|
|
17
|
+
*/
|
|
18
|
+
export declare function StatusDot({ color, className, style, ...rest }: StatusDotProps): React.JSX.Element;
|
|
19
|
+
export declare namespace StatusDot {
|
|
20
|
+
var displayName: string;
|
|
21
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
declare const spec: {
|
|
2
|
+
readonly name: "statusdot";
|
|
3
|
+
readonly base: {
|
|
4
|
+
readonly display: "inline-block";
|
|
5
|
+
readonly boxSizing: "border-box";
|
|
6
|
+
readonly flexShrink: 0;
|
|
7
|
+
readonly width: "12px";
|
|
8
|
+
readonly height: "12px";
|
|
9
|
+
readonly borderRadius: `var(--${string})`;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
declare const config: import("../..").RecipeConfig<Record<string, Record<string, string>>>;
|
|
13
|
+
export declare const statusdotRecipe: import("../..").RecipeFn<Record<string, Record<string, string>>>;
|
|
14
|
+
export { spec };
|
|
15
|
+
export default config;
|
|
@@ -320,6 +320,13 @@ export type ToolbarToolProps = React.ComponentPropsWithoutRef<"button"> & {
|
|
|
320
320
|
/** The quieter, no-ring variant Sort/Filter never use themselves, for a
|
|
321
321
|
* chip whose "on" state should read as less committed than a real filter. */
|
|
322
322
|
ghost?: boolean;
|
|
323
|
+
/**
|
|
324
|
+
* A trailing count badge (crisp#875) — a screen's own quick filter
|
|
325
|
+
* showing how many rows match, e.g. "My tasks 5". Measured live on two
|
|
326
|
+
* independent Attio surfaces (the Sort tool's own "+N" overflow, a Kanban
|
|
327
|
+
* board's stage-column count): a small neutral chip, not bare text.
|
|
328
|
+
*/
|
|
329
|
+
count?: React.ReactNode;
|
|
323
330
|
};
|
|
324
331
|
/**
|
|
325
332
|
* The Sort/Filter chip's own chrome (`.crisp-tabletoolbar-tool`), standalone
|
|
@@ -337,5 +344,12 @@ export declare const ToolbarTool: React.ForwardRefExoticComponent<Omit<React.Det
|
|
|
337
344
|
/** The quieter, no-ring variant Sort/Filter never use themselves, for a
|
|
338
345
|
* chip whose "on" state should read as less committed than a real filter. */
|
|
339
346
|
ghost?: boolean;
|
|
347
|
+
/**
|
|
348
|
+
* A trailing count badge (crisp#875) — a screen's own quick filter
|
|
349
|
+
* showing how many rows match, e.g. "My tasks 5". Measured live on two
|
|
350
|
+
* independent Attio surfaces (the Sort tool's own "+N" overflow, a Kanban
|
|
351
|
+
* board's stage-column count): a small neutral chip, not bare text.
|
|
352
|
+
*/
|
|
353
|
+
count?: React.ReactNode;
|
|
340
354
|
} & React.RefAttributes<HTMLButtonElement>>;
|
|
341
355
|
export {};
|
|
@@ -20,6 +20,14 @@ export type TabsProps = Omit<React.ComponentPropsWithoutRef<"div">, "value" | "d
|
|
|
20
20
|
leading?: React.ReactNode;
|
|
21
21
|
/** Rendered for the active tab. Receives the active value. */
|
|
22
22
|
children?: (value: string) => React.ReactNode;
|
|
23
|
+
/**
|
|
24
|
+
* The "+N more" overflow trigger's own label (crisp#863, confirmed live:
|
|
25
|
+
* Attio's own copy is exactly "+N more", a chevron after it). Receives
|
|
26
|
+
* the hidden-tab count. Defaults to that measured copy.
|
|
27
|
+
*/
|
|
28
|
+
moreLabel?: (count: number) => React.ReactNode;
|
|
29
|
+
/** aria-label on the overflow trigger/menu (default "More tabs"). */
|
|
30
|
+
moreMenuLabel?: string;
|
|
23
31
|
className?: string;
|
|
24
32
|
"aria-label"?: string;
|
|
25
33
|
};
|
|
@@ -29,7 +37,7 @@ export type TabsProps = Omit<React.ComponentPropsWithoutRef<"div">, "value" | "d
|
|
|
29
37
|
* Home/End jump); activation follows focus. Controlled via
|
|
30
38
|
* `value`/`onValueChange`, or uncontrolled from `defaultValue`.
|
|
31
39
|
*/
|
|
32
|
-
export declare function Tabs({ tabs, value, defaultValue, onValueChange, leading, children, className, fill, "aria-label": ariaLabel, ...rest }: TabsProps): React.JSX.Element;
|
|
40
|
+
export declare function Tabs({ tabs, value, defaultValue, onValueChange, leading, children, moreLabel, moreMenuLabel, className, fill, "aria-label": ariaLabel, ...rest }: TabsProps): React.JSX.Element;
|
|
33
41
|
export declare namespace Tabs {
|
|
34
42
|
var displayName: string;
|
|
35
43
|
}
|