@crisp-ui-kit/crisp 0.56.0 → 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/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/textlink/textlink.js +2 -2
- package/dist/cjs/components/textlink/textlink.recipe.js +18 -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 +8 -0
- 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/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/textlink/textlink.js +2 -2
- package/dist/esm/components/textlink/textlink.recipe.js +18 -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 +8 -0
- 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 +49 -6
- package/dist/select.css +80 -42
- package/dist/select.d.ts +3 -2
- package/dist/select.layered.css +80 -42
- package/dist/styles.css +199 -72
- package/dist/styles.layered.css +199 -72
- 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/textlink.css +9 -0
- package/dist/textlink.d.ts +2 -1
- package/dist/textlink.layered.css +9 -0
- package/dist/tokens.css +25 -0
- package/dist/tokens.json +49 -6
- 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/tabletoolbar/tabletoolbar.d.ts +14 -0
- package/dist/types/components/tabs/tabs.d.ts +9 -1
- package/dist/types/components/textlink/textlink.d.ts +8 -1
- package/dist/types/components/textlink/textlink.recipe.d.ts +10 -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 +5 -0
- package/dist/types/tokens/semantic.d.ts +18 -0
- package/package.json +1 -1
|
@@ -44,6 +44,15 @@ export const palette = {
|
|
|
44
44
|
// both themes (Switch's own spec), so this reuses ringField's dark value
|
|
45
45
|
// rather than inventing a third "field-adjacent ring, dark" colour.
|
|
46
46
|
ringSwitch: { light: "#d9dade", dark: "#212224" },
|
|
47
|
+
// Callout's bordered/banner look (crisp#869) — measured live on Attio's
|
|
48
|
+
// Objects settings page (the "Create custom objects... Upgrade" Pro-plan
|
|
49
|
+
// banner): `border: 1px solid rgb(214,229,255)`, an opaque colour, not a
|
|
50
|
+
// composited tint of `bgBrandSolid` (checked: no single color-mix
|
|
51
|
+
// percentage matches all three channels at once). Dark value not
|
|
52
|
+
// independently re-measured (Attio's own theme toggle is off-limits) —
|
|
53
|
+
// reuses `ringField`/`ringSwitch`'s existing dark ring (#212224), the same
|
|
54
|
+
// "edge visible against a dark surface" role those already establish.
|
|
55
|
+
ringBrandSoft: { light: "#d6e5ff", dark: "#212224" },
|
|
47
56
|
tileActive: { light: "#ffffff", dark: "#101112" },
|
|
48
57
|
tileActiveShadow: { light: "rgba(0,0,0,0.04)", dark: "rgba(0,0,0,0)" },
|
|
49
58
|
// Dialog's page-dimming backdrop (crisp#677) — measured live behind the
|
|
@@ -159,4 +168,36 @@ export const palette = {
|
|
|
159
168
|
purpleTint: { light: "#f5f0ff", dark: "#2f1e5a" },
|
|
160
169
|
softPurpleText: { light: "#6238b5", dark: "#d8c4ff" },
|
|
161
170
|
purpleRing: { light: "#e8ddfe", dark: "#45297d" },
|
|
171
|
+
// Select rebuilt to seed-design parity (crisp/#867), NOT Attio -- a
|
|
172
|
+
// deliberate one-component exception, the same way DatePicker already
|
|
173
|
+
// follows seed's calendar structure. Values below are resolved directly
|
|
174
|
+
// from `@seed-design/rootage`'s color.yaml (gray palette), not measured
|
|
175
|
+
// live, since there is no Attio reference for this component anymore.
|
|
176
|
+
// gray-00 / gray-200 (bg.layer-floating) -- the listbox surface. Distinct
|
|
177
|
+
// from `popoverBg` (crisp's Attio-measured popover, #fff/#17181a): the dark
|
|
178
|
+
// value differs (#1d2025), so this is its own token, not a reuse.
|
|
179
|
+
selectListboxBg: { light: "#ffffff", dark: "#1d2025" },
|
|
180
|
+
// gray-400 (stroke.neutral-weak) -- the trigger's real 1px border at rest.
|
|
181
|
+
selectTriggerStroke: { light: "#dcdee3", dark: "#393d46" },
|
|
182
|
+
// static-black/white-alpha (bg.transparent-pressed) -- the trigger/item
|
|
183
|
+
// press tint. Deliberately alpha, not a gray, so it reads the same over
|
|
184
|
+
// either surface colour.
|
|
185
|
+
selectPressedTint: { light: "#00000007", dark: "#ffffff0d" },
|
|
186
|
+
// gray-200 / gray-300 (bg.disabled) -- the trigger's disabled AND readonly
|
|
187
|
+
// fill. Distinct from `neutralWeak` (light matches, dark is #1d2025 not
|
|
188
|
+
// #2b2e35), so its own token rather than a reuse.
|
|
189
|
+
selectDisabledBg: { light: "#f3f4f5", dark: "#2b2e35" },
|
|
190
|
+
// red-700 (stroke.critical-solid) -- the trigger's invalid border. Distinct
|
|
191
|
+
// from crisp's own `bgDangerSolid`/`red700` (#ba2525, an Attio red): seed's
|
|
192
|
+
// red is a different hue entirely, and this component follows seed.
|
|
193
|
+
selectInvalidStroke: { light: "#fa342c", dark: "#ff6e60" },
|
|
194
|
+
// static-black/white-alpha (stroke.neutral-muted) -- the listbox's own
|
|
195
|
+
// divider slot (defined in select.yaml; not yet exposed on any consumer).
|
|
196
|
+
selectDivider: { light: "#00000010", dark: "#ffffff17" },
|
|
197
|
+
// gray-600 (fg.placeholder) -- distinct from `neutralSubtle` (its light/dark
|
|
198
|
+
// pair is the same two hexes, swapped), so its own token, not a reuse.
|
|
199
|
+
selectPlaceholder: { light: "#b0b3ba", dark: "#868b94" },
|
|
200
|
+
// s3 (shadow.yaml) -- the listbox's single-layer floating shadow, in place
|
|
201
|
+
// of crisp's own multi-layer `elevation.floating` for this component only.
|
|
202
|
+
selectShadow: { light: "#0000001f", dark: "#000000cc" },
|
|
162
203
|
};
|
package/dist/esm/tokens/scale.js
CHANGED
|
@@ -17,6 +17,7 @@ export const space = {
|
|
|
17
17
|
"2": "8px",
|
|
18
18
|
"2.5": "10px",
|
|
19
19
|
"3": "12px",
|
|
20
|
+
"3.5": "14px", // seed-design's $dimension.x3_5 — Select's medium trigger paddingX (crisp/#867)
|
|
20
21
|
"4": "16px",
|
|
21
22
|
"5": "20px",
|
|
22
23
|
"6": "24px",
|
|
@@ -31,6 +32,7 @@ export const radius = {
|
|
|
31
32
|
lg: "9px", // rows, tiles, list items
|
|
32
33
|
xl: "12px", // overlay items (command rows)
|
|
33
34
|
"2xl": "16px", // overlay panels (command surface)
|
|
35
|
+
"3xl": "20px", // seed-design's $radius.r5 — Select's listbox corner (crisp/#867)
|
|
34
36
|
full: "999px", // pills
|
|
35
37
|
};
|
|
36
38
|
// Component sizing — recurring measured dimensions that are neither spacing nor
|
|
@@ -49,6 +51,12 @@ export const size = {
|
|
|
49
51
|
// whole cells and a column gap would cut it.
|
|
50
52
|
calendarCell: "34px", // calendar day pitch (32px day + 2px gap)
|
|
51
53
|
calendarPill: "32px", // the day highlight itself
|
|
54
|
+
// seed-design's Select, resolved from select-trigger.yaml/select-item.yaml
|
|
55
|
+
// (crisp/#867) — this component follows seed, not Attio, so these sit
|
|
56
|
+
// alongside the measured scale rather than folding into it.
|
|
57
|
+
selectTriggerMd: "40px", // $dimension.x10 — the medium (default) trigger height
|
|
58
|
+
selectTriggerLg: "52px", // $dimension.x13 — the large trigger height
|
|
59
|
+
selectIconLg: "20px", // $dimension.x5 — large trigger's chevron
|
|
52
60
|
};
|
|
53
61
|
// Typography — the measured UI runs entirely on Inter. Sizes measured in the sidebar
|
|
54
62
|
// collapse onto 11/12/13/14/16 (lg = 14px is the default body/label size);
|
|
@@ -82,4 +82,22 @@ export const semantic = {
|
|
|
82
82
|
bgPurpleSoft: "purpleTint",
|
|
83
83
|
fgPurpleSoft: "softPurpleText",
|
|
84
84
|
ringPurpleSoft: "purpleRing",
|
|
85
|
+
/** Callout's bordered/banner look (crisp#869) — an opaque measured ring,
|
|
86
|
+
* not a `color-mix` tint of `bgBrandSolid` (see palette.ts's own comment). */
|
|
87
|
+
ringBrandSoft: "ringBrandSoft",
|
|
88
|
+
/** Select rebuilt to seed-design parity (crisp/#867) — see palette.ts's
|
|
89
|
+
* comment above `selectListboxBg` for why these are their own tokens
|
|
90
|
+
* rather than a reuse of an Attio-measured one. */
|
|
91
|
+
/** Seed's neutral ink (gray-1000) used as TEXT/icon colour — same palette
|
|
92
|
+
* entry as `strokeFieldFocus` (a ring), aliased separately because the
|
|
93
|
+
* role here is content colour, not a focus ring. */
|
|
94
|
+
fgSelectNeutral: "fieldFocus",
|
|
95
|
+
bgSelectListbox: "selectListboxBg",
|
|
96
|
+
strokeSelectTrigger: "selectTriggerStroke",
|
|
97
|
+
bgSelectPressed: "selectPressedTint",
|
|
98
|
+
bgSelectDisabled: "selectDisabledBg",
|
|
99
|
+
strokeSelectInvalid: "selectInvalidStroke",
|
|
100
|
+
strokeSelectDivider: "selectDivider",
|
|
101
|
+
fgSelectPlaceholder: "selectPlaceholder",
|
|
102
|
+
shadowSelect: "selectShadow",
|
|
85
103
|
};
|
package/dist/input.css
CHANGED
|
@@ -7,6 +7,10 @@
|
|
|
7
7
|
& .crisp-input-value:disabled { opacity: 0.5; cursor: not-allowed; }
|
|
8
8
|
&:has(.crisp-input-value:disabled) { opacity: 1; }
|
|
9
9
|
}
|
|
10
|
+
.crisp-input--size_sm {
|
|
11
|
+
height: var(--crisp-size-row); border-radius: var(--crisp-radius-md);
|
|
12
|
+
& .crisp-input-value { padding-inline: var(--crisp-space-2-5); }
|
|
13
|
+
}
|
|
10
14
|
.crisp-input--size_medium {
|
|
11
15
|
height: 32px; border-radius: var(--crisp-radius-md);
|
|
12
16
|
& .crisp-input-value { padding-inline: var(--crisp-space-2-5); }
|
package/dist/input.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { RecipeFn } from "../core/types";
|
|
2
2
|
|
|
3
3
|
export interface InputVariants {
|
|
4
|
-
size?: "medium" | "large";
|
|
4
|
+
size?: "sm" | "medium" | "large";
|
|
5
5
|
invalid?: boolean;
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
-
export declare const inputRecipe: RecipeFn<{ size: { medium: string; large: string }; invalid: { true: string; false: string } }>;
|
|
8
|
+
export declare const inputRecipe: RecipeFn<{ size: { sm: string; medium: string; large: string }; invalid: { true: string; false: string } }>;
|
package/dist/input.layered.css
CHANGED
|
@@ -8,6 +8,10 @@
|
|
|
8
8
|
& .crisp-input-value:disabled { opacity: 0.5; cursor: not-allowed; }
|
|
9
9
|
&:has(.crisp-input-value:disabled) { opacity: 1; }
|
|
10
10
|
}
|
|
11
|
+
.crisp-input--size_sm {
|
|
12
|
+
height: var(--crisp-size-row); border-radius: var(--crisp-radius-md);
|
|
13
|
+
& .crisp-input-value { padding-inline: var(--crisp-space-2-5); }
|
|
14
|
+
}
|
|
11
15
|
.crisp-input--size_medium {
|
|
12
16
|
height: 32px; border-radius: var(--crisp-radius-md);
|
|
13
17
|
& .crisp-input-value { padding-inline: var(--crisp-space-2-5); }
|
package/dist/menu.css
CHANGED
|
@@ -30,6 +30,14 @@
|
|
|
30
30
|
.crisp-menu-item--danger svg { color: var(--crisp-bg-danger); }
|
|
31
31
|
.crisp-menu-item--danger:hover, .crisp-menu-item--danger:focus-visible, .crisp-menu-item--danger[data-highlighted] { background: color-mix(in srgb, var(--crisp-bg-danger) 10%, transparent); }
|
|
32
32
|
.crisp-menu-item-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
|
|
33
|
+
/* crisp#875: same measured neutral chip TableToolbar's own ToolbarTool
|
|
34
|
+
count prop uses (re-confirmed on two live Attio surfaces this round:
|
|
35
|
+
the Sort tool's own "+N" overflow, a Kanban board's stage-column
|
|
36
|
+
count) -- a small badge, not bare text. */
|
|
37
|
+
.crisp-menu-item-count { flex-shrink: 0; margin-inline-start: var(--crisp-space-1-5); display: inline-flex; align-items: center; height: 16px; box-sizing: border-box;
|
|
38
|
+
padding: 0 var(--crisp-space-1); border-radius: var(--crisp-radius-sm); background: color-mix(in srgb, var(--crisp-fg-primary) 4%, transparent);
|
|
39
|
+
box-shadow: inset 0 0 0 1px var(--crisp-border-subtle); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-neutral-soft);
|
|
40
|
+
font-variant-numeric: tabular-nums; }
|
|
33
41
|
.crisp-menu-item-shortcut { flex-shrink: 0; margin-inline-start: var(--crisp-space-3); font-size: var(--crisp-text-sm); color: var(--crisp-fg-muted); letter-spacing: 0.02em; }
|
|
34
42
|
.crisp-menu-item-check { flex-shrink: 0; color: var(--crisp-bg-brand-solid); }
|
|
35
43
|
.crisp-menu-item-check--placeholder { width: 15px; }
|
package/dist/menu.layered.css
CHANGED
|
@@ -31,6 +31,14 @@
|
|
|
31
31
|
.crisp-menu-item--danger svg { color: var(--crisp-bg-danger); }
|
|
32
32
|
.crisp-menu-item--danger:hover, .crisp-menu-item--danger:focus-visible, .crisp-menu-item--danger[data-highlighted] { background: color-mix(in srgb, var(--crisp-bg-danger) 10%, transparent); }
|
|
33
33
|
.crisp-menu-item-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
|
|
34
|
+
/* crisp#875: same measured neutral chip TableToolbar's own ToolbarTool
|
|
35
|
+
count prop uses (re-confirmed on two live Attio surfaces this round:
|
|
36
|
+
the Sort tool's own "+N" overflow, a Kanban board's stage-column
|
|
37
|
+
count) -- a small badge, not bare text. */
|
|
38
|
+
.crisp-menu-item-count { flex-shrink: 0; margin-inline-start: var(--crisp-space-1-5); display: inline-flex; align-items: center; height: 16px; box-sizing: border-box;
|
|
39
|
+
padding: 0 var(--crisp-space-1); border-radius: var(--crisp-radius-sm); background: color-mix(in srgb, var(--crisp-fg-primary) 4%, transparent);
|
|
40
|
+
box-shadow: inset 0 0 0 1px var(--crisp-border-subtle); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-neutral-soft);
|
|
41
|
+
font-variant-numeric: tabular-nums; }
|
|
34
42
|
.crisp-menu-item-shortcut { flex-shrink: 0; margin-inline-start: var(--crisp-space-3); font-size: var(--crisp-text-sm); color: var(--crisp-fg-muted); letter-spacing: 0.02em; }
|
|
35
43
|
.crisp-menu-item-check { flex-shrink: 0; color: var(--crisp-bg-brand-solid); }
|
|
36
44
|
.crisp-menu-item-check--placeholder { width: 15px; }
|
package/dist/multiselect.css
CHANGED
|
@@ -1,36 +1,40 @@
|
|
|
1
1
|
|
|
2
|
-
/* pointer-events: auto (#375)
|
|
3
|
-
on document.body while open (Zag re-enables it only on layers IT
|
|
4
|
-
tracks), and the portaled listbox is outside Zag's knowledge -- it
|
|
5
|
-
inherited the lock, so every option was unclickable, hit-testing
|
|
6
|
-
right through to whatever real element sat behind it. */
|
|
2
|
+
/* pointer-events: auto (#375) -- see Select's matching comment. */
|
|
7
3
|
.crisp-multiselect-listbox {
|
|
8
4
|
font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
|
|
9
|
-
position: fixed; z-index: 70; pointer-events: auto; box-sizing: border-box; display: flex; flex-direction: column; gap: var(--crisp-space-
|
|
10
|
-
max-height:
|
|
11
|
-
border-radius: var(--crisp-radius-
|
|
12
|
-
box-shadow:
|
|
13
|
-
transform-origin: top left; opacity: 1; transform: none;
|
|
5
|
+
position: fixed; z-index: 70; pointer-events: auto; box-sizing: border-box; display: flex; flex-direction: column; gap: var(--crisp-space-2);
|
|
6
|
+
max-height: 480px; overflow-y: auto; padding: var(--crisp-space-2);
|
|
7
|
+
border-radius: var(--crisp-radius-3xl); background: var(--crisp-bg-select-listbox);
|
|
8
|
+
box-shadow: 0 4px 16px var(--crisp-shadow-select);
|
|
9
|
+
transform-origin: top left; opacity: 1; transform: none;
|
|
10
|
+
transition: opacity .15s cubic-bezier(0,0,.15,1), transform .15s cubic-bezier(0,0,.15,1);
|
|
14
11
|
}
|
|
15
12
|
.crisp-multiselect-listbox[data-up] { transform-origin: bottom left; }
|
|
16
|
-
.crisp-multiselect-listbox { @starting-style { opacity: 0; transform: scale(0.
|
|
17
|
-
|
|
13
|
+
.crisp-multiselect-listbox { @starting-style { opacity: 0; transform: scale(0.95); } }
|
|
14
|
+
/* LOCKED geometry (#481, guarded by build/spec-check.mjs): height 36px,
|
|
15
|
+
gap space["1.5"] (6px), no border-bottom -- an Attio measurement, not
|
|
16
|
+
part of this seed-parity pass. Only colours below follow Select. */
|
|
17
|
+
.crisp-multiselect-search { display: flex; align-items: center; gap: var(--crisp-space-1-5); height: 36px; flex-shrink: 0; margin: calc(-1 * var(--crisp-space-2)) calc(-1 * var(--crisp-space-2)) var(--crisp-space-2); padding: var(--crisp-space-2) var(--crisp-space-3); color: var(--crisp-fg-neutral-muted); }
|
|
18
18
|
.crisp-multiselect-search svg { flex-shrink: 0; }
|
|
19
|
-
.crisp-multiselect-search input { flex: 1; min-width: 0; border: none; outline: none; background: none; font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-
|
|
20
|
-
.crisp-multiselect-search input::placeholder { color: var(--crisp-fg-
|
|
21
|
-
/*
|
|
22
|
-
|
|
23
|
-
same "small muted heading above a run of rows" treatment. */
|
|
24
|
-
.crisp-multiselect-label { padding: var(--crisp-space-1-5) var(--crisp-space-2) var(--crisp-space-0-5); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-muted); }
|
|
19
|
+
.crisp-multiselect-search input { flex: 1; min-width: 0; border: none; outline: none; background: none; font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-select-neutral); }
|
|
20
|
+
.crisp-multiselect-search input::placeholder { color: var(--crisp-fg-select-placeholder); }
|
|
21
|
+
/* Same groupLabel treatment as Select's (13px/regular/neutral-subtle). */
|
|
22
|
+
.crisp-multiselect-label { padding: var(--crisp-space-2) var(--crisp-space-4) 0; font-size: var(--crisp-text-md); line-height: 18px; font-weight: var(--crisp-weight-regular); color: var(--crisp-fg-neutral-subtle); }
|
|
25
23
|
.crisp-multiselect-option {
|
|
26
|
-
box-sizing: border-box; display: flex; align-items: center; gap: var(--crisp-space-2);
|
|
27
|
-
padding:
|
|
24
|
+
box-sizing: border-box; display: flex; align-items: center; gap: var(--crisp-space-2); flex-shrink: 0;
|
|
25
|
+
padding: var(--crisp-space-2-5) var(--crisp-space-4); margin: 0; border: none; background: none; border-radius: var(--crisp-radius-xl);
|
|
26
|
+
font-family: inherit; text-align: start; cursor: pointer;
|
|
27
|
+
transition: background-color .15s cubic-bezier(.35,0,.35,1);
|
|
28
28
|
}
|
|
29
|
+
/* Keyboard/hover highlight keeps crisp's own visible neutral fill, same
|
|
30
|
+
reasoning as Select's matching rule (seed's own pressed tint is too
|
|
31
|
+
faint for a keyboard-navigation indicator). */
|
|
29
32
|
.crisp-multiselect-option[data-highlighted] { background: var(--crisp-bg-raised); }
|
|
33
|
+
.crisp-multiselect-option:active { background: var(--crisp-bg-select-pressed); }
|
|
30
34
|
.crisp-multiselect-option-chip { flex: 0 1 auto; min-width: 0; overflow: hidden; }
|
|
31
35
|
.crisp-multiselect-check { flex-shrink: 0; margin-inline-start: auto; display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 16px; border-radius: var(--crisp-radius-sm); box-shadow: inset 0 0 0 1.5px var(--crisp-border-default); color: transparent; }
|
|
32
36
|
.crisp-multiselect-option[aria-selected="true"] .crisp-multiselect-check { background: var(--crisp-bg-brand-solid); box-shadow: none; color: #fff; }
|
|
33
|
-
.crisp-multiselect-empty { padding: var(--crisp-space-3) var(--crisp-space-
|
|
37
|
+
.crisp-multiselect-empty { padding: var(--crisp-space-3) var(--crisp-space-4); text-align: center; font-size: var(--crisp-text-md); color: var(--crisp-fg-neutral-subtle); }
|
|
34
38
|
|
|
35
39
|
.crisp-recordstable-tag { display: inline-flex; align-items: center; height: var(--crisp-size-chip); padding: 0 var(--crisp-space-1); border-radius: var(--crisp-radius-chip); font-size: var(--crisp-text-lg); line-height: 20px; font-weight: var(--crisp-weight-medium); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); color: color-mix(in srgb, var(--crisp-fg-primary) 82%, transparent); box-shadow: inset 0 0 0 1px var(--crisp-border-subtle); }
|
|
36
40
|
.crisp-recordstable-tag[data-tone="brand"] { background: color-mix(in srgb, var(--crisp-bg-brand-solid) 14%, transparent); color: color-mix(in srgb, var(--crisp-bg-brand-solid) 82%, var(--crisp-fg-primary)); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-bg-brand-solid) 30%, transparent); }
|
|
@@ -43,21 +47,41 @@
|
|
|
43
47
|
|
|
44
48
|
.crisp-multiselect {
|
|
45
49
|
position: relative; display: inline-flex; width: 100%; font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
|
|
46
|
-
& .crisp-multiselect-trigger { box-sizing: border-box; display: flex; align-items: center;
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
& .crisp-multiselect-trigger:disabled {
|
|
50
|
+
& .crisp-multiselect-trigger { box-sizing: border-box; display: flex; align-items: center; width: 100%; min-width: 0; margin: 0; border: 1px solid var(--crisp-stroke-select-trigger); background: transparent; cursor: pointer; text-align: start; font-family: inherit; color: var(--crisp-fg-select-neutral); transition: background-color .15s cubic-bezier(.35,0,.35,1), border-color .1s cubic-bezier(.35,0,.35,1), border-width .1s cubic-bezier(.35,0,.35,1); }
|
|
51
|
+
/* Same pressed/disabled/readonly/focus model as Select's trigger -- see
|
|
52
|
+
that recipe's comment for why hover and an open/focus ring are gone. */
|
|
53
|
+
& .crisp-multiselect-trigger:active:not(:disabled):not([aria-readonly="true"]) { background: var(--crisp-bg-select-pressed); }
|
|
54
|
+
& .crisp-multiselect-trigger:focus-visible { outline: 2px solid var(--crisp-stroke-focus-ring); outline-offset: -2px; }
|
|
55
|
+
& .crisp-multiselect-trigger:disabled { background: var(--crisp-bg-select-disabled); cursor: not-allowed; }
|
|
56
|
+
& .crisp-multiselect-trigger:disabled .crisp-multiselect-placeholder, & .crisp-multiselect-trigger:disabled .crisp-multiselect-chevron { color: var(--crisp-fg-disabled); }
|
|
57
|
+
& .crisp-multiselect-trigger[aria-readonly="true"] { background: var(--crisp-bg-select-disabled); cursor: default; }
|
|
50
58
|
& .crisp-multiselect-chips { flex: 1; min-width: 0; display: flex; flex-wrap: wrap; align-items: center; gap: var(--crisp-space-1); }
|
|
51
|
-
& .crisp-multiselect-placeholder { color: var(--crisp-fg-
|
|
52
|
-
|
|
53
|
-
& .crisp-multiselect-
|
|
59
|
+
& .crisp-multiselect-placeholder { color: var(--crisp-fg-select-placeholder); }
|
|
60
|
+
/* closeRotateDuration/openRotateDuration, same asymmetric timing as Select's own chevron (see that recipe's comment). */
|
|
61
|
+
& .crisp-multiselect-chevron { flex-shrink: 0; color: var(--crisp-fg-neutral-muted); transition: transform .1s cubic-bezier(.35,0,.35,1); }
|
|
62
|
+
& .crisp-multiselect-trigger[data-open] .crisp-multiselect-chevron { transform: rotate(180deg); transition-duration: .15s; }
|
|
63
|
+
}
|
|
64
|
+
.crisp-multiselect--size_medium {
|
|
65
|
+
& .crisp-multiselect-trigger { min-height: var(--crisp-size-selectTriggerMd); border-radius: var(--crisp-radius-md); gap: var(--crisp-space-2); padding: var(--crisp-space-1) var(--crisp-space-3-5); }
|
|
66
|
+
& .crisp-multiselect-chevron { width: var(--crisp-size-icon); height: var(--crisp-size-icon); }
|
|
67
|
+
}
|
|
68
|
+
.crisp-multiselect--size_large {
|
|
69
|
+
& .crisp-multiselect-trigger { min-height: var(--crisp-size-selectTriggerLg); border-radius: var(--crisp-radius-xl); gap: var(--crisp-space-2-5); padding: var(--crisp-space-1-5) var(--crisp-space-4); }
|
|
70
|
+
& .crisp-multiselect-chevron { width: var(--crisp-size-selectIconLg); height: var(--crisp-size-selectIconLg); }
|
|
54
71
|
}
|
|
55
72
|
.crisp-multiselect--invalid_true {
|
|
56
|
-
& .crisp-multiselect-trigger
|
|
73
|
+
& .crisp-multiselect-trigger { border-width: 2px; border-color: var(--crisp-stroke-select-invalid); }
|
|
57
74
|
}
|
|
58
75
|
.crisp-multiselect--invalid_false {
|
|
59
76
|
|
|
60
77
|
}
|
|
78
|
+
.crisp-multiselect--variant_default {
|
|
79
|
+
|
|
80
|
+
}
|
|
81
|
+
.crisp-multiselect--variant_ghost {
|
|
82
|
+
& .crisp-multiselect-trigger { min-height: 0; height: 100%; border-color: transparent; }
|
|
83
|
+
& .crisp-multiselect-trigger:hover:not(:disabled) { background: var(--crisp-bg-select-pressed); }
|
|
84
|
+
}
|
|
61
85
|
|
|
62
86
|
@media (prefers-reduced-motion: reduce) {
|
|
63
87
|
.crisp-multiselect, .crisp-multiselect * {
|
package/dist/multiselect.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { RecipeFn } from "../core/types";
|
|
2
2
|
|
|
3
3
|
export interface MultiselectVariants {
|
|
4
|
+
size?: "medium" | "large";
|
|
4
5
|
invalid?: boolean;
|
|
6
|
+
variant?: "default" | "ghost";
|
|
5
7
|
}
|
|
6
8
|
|
|
7
|
-
export declare const multiselectRecipe: RecipeFn<{ invalid: { true: string; false: string } }>;
|
|
9
|
+
export declare const multiselectRecipe: RecipeFn<{ size: { medium: string; large: string }; invalid: { true: string; false: string }; variant: { default: string; ghost: string } }>;
|
|
@@ -1,37 +1,41 @@
|
|
|
1
1
|
@layer crisp-components {
|
|
2
2
|
|
|
3
|
-
/* pointer-events: auto (#375)
|
|
4
|
-
on document.body while open (Zag re-enables it only on layers IT
|
|
5
|
-
tracks), and the portaled listbox is outside Zag's knowledge -- it
|
|
6
|
-
inherited the lock, so every option was unclickable, hit-testing
|
|
7
|
-
right through to whatever real element sat behind it. */
|
|
3
|
+
/* pointer-events: auto (#375) -- see Select's matching comment. */
|
|
8
4
|
.crisp-multiselect-listbox {
|
|
9
5
|
font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
|
|
10
|
-
position: fixed; z-index: 70; pointer-events: auto; box-sizing: border-box; display: flex; flex-direction: column; gap: var(--crisp-space-
|
|
11
|
-
max-height:
|
|
12
|
-
border-radius: var(--crisp-radius-
|
|
13
|
-
box-shadow:
|
|
14
|
-
transform-origin: top left; opacity: 1; transform: none;
|
|
6
|
+
position: fixed; z-index: 70; pointer-events: auto; box-sizing: border-box; display: flex; flex-direction: column; gap: var(--crisp-space-2);
|
|
7
|
+
max-height: 480px; overflow-y: auto; padding: var(--crisp-space-2);
|
|
8
|
+
border-radius: var(--crisp-radius-3xl); background: var(--crisp-bg-select-listbox);
|
|
9
|
+
box-shadow: 0 4px 16px var(--crisp-shadow-select);
|
|
10
|
+
transform-origin: top left; opacity: 1; transform: none;
|
|
11
|
+
transition: opacity .15s cubic-bezier(0,0,.15,1), transform .15s cubic-bezier(0,0,.15,1);
|
|
15
12
|
}
|
|
16
13
|
.crisp-multiselect-listbox[data-up] { transform-origin: bottom left; }
|
|
17
|
-
.crisp-multiselect-listbox { @starting-style { opacity: 0; transform: scale(0.
|
|
18
|
-
|
|
14
|
+
.crisp-multiselect-listbox { @starting-style { opacity: 0; transform: scale(0.95); } }
|
|
15
|
+
/* LOCKED geometry (#481, guarded by build/spec-check.mjs): height 36px,
|
|
16
|
+
gap space["1.5"] (6px), no border-bottom -- an Attio measurement, not
|
|
17
|
+
part of this seed-parity pass. Only colours below follow Select. */
|
|
18
|
+
.crisp-multiselect-search { display: flex; align-items: center; gap: var(--crisp-space-1-5); height: 36px; flex-shrink: 0; margin: calc(-1 * var(--crisp-space-2)) calc(-1 * var(--crisp-space-2)) var(--crisp-space-2); padding: var(--crisp-space-2) var(--crisp-space-3); color: var(--crisp-fg-neutral-muted); }
|
|
19
19
|
.crisp-multiselect-search svg { flex-shrink: 0; }
|
|
20
|
-
.crisp-multiselect-search input { flex: 1; min-width: 0; border: none; outline: none; background: none; font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-
|
|
21
|
-
.crisp-multiselect-search input::placeholder { color: var(--crisp-fg-
|
|
22
|
-
/*
|
|
23
|
-
|
|
24
|
-
same "small muted heading above a run of rows" treatment. */
|
|
25
|
-
.crisp-multiselect-label { padding: var(--crisp-space-1-5) var(--crisp-space-2) var(--crisp-space-0-5); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-muted); }
|
|
20
|
+
.crisp-multiselect-search input { flex: 1; min-width: 0; border: none; outline: none; background: none; font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-select-neutral); }
|
|
21
|
+
.crisp-multiselect-search input::placeholder { color: var(--crisp-fg-select-placeholder); }
|
|
22
|
+
/* Same groupLabel treatment as Select's (13px/regular/neutral-subtle). */
|
|
23
|
+
.crisp-multiselect-label { padding: var(--crisp-space-2) var(--crisp-space-4) 0; font-size: var(--crisp-text-md); line-height: 18px; font-weight: var(--crisp-weight-regular); color: var(--crisp-fg-neutral-subtle); }
|
|
26
24
|
.crisp-multiselect-option {
|
|
27
|
-
box-sizing: border-box; display: flex; align-items: center; gap: var(--crisp-space-2);
|
|
28
|
-
padding:
|
|
25
|
+
box-sizing: border-box; display: flex; align-items: center; gap: var(--crisp-space-2); flex-shrink: 0;
|
|
26
|
+
padding: var(--crisp-space-2-5) var(--crisp-space-4); margin: 0; border: none; background: none; border-radius: var(--crisp-radius-xl);
|
|
27
|
+
font-family: inherit; text-align: start; cursor: pointer;
|
|
28
|
+
transition: background-color .15s cubic-bezier(.35,0,.35,1);
|
|
29
29
|
}
|
|
30
|
+
/* Keyboard/hover highlight keeps crisp's own visible neutral fill, same
|
|
31
|
+
reasoning as Select's matching rule (seed's own pressed tint is too
|
|
32
|
+
faint for a keyboard-navigation indicator). */
|
|
30
33
|
.crisp-multiselect-option[data-highlighted] { background: var(--crisp-bg-raised); }
|
|
34
|
+
.crisp-multiselect-option:active { background: var(--crisp-bg-select-pressed); }
|
|
31
35
|
.crisp-multiselect-option-chip { flex: 0 1 auto; min-width: 0; overflow: hidden; }
|
|
32
36
|
.crisp-multiselect-check { flex-shrink: 0; margin-inline-start: auto; display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 16px; border-radius: var(--crisp-radius-sm); box-shadow: inset 0 0 0 1.5px var(--crisp-border-default); color: transparent; }
|
|
33
37
|
.crisp-multiselect-option[aria-selected="true"] .crisp-multiselect-check { background: var(--crisp-bg-brand-solid); box-shadow: none; color: #fff; }
|
|
34
|
-
.crisp-multiselect-empty { padding: var(--crisp-space-3) var(--crisp-space-
|
|
38
|
+
.crisp-multiselect-empty { padding: var(--crisp-space-3) var(--crisp-space-4); text-align: center; font-size: var(--crisp-text-md); color: var(--crisp-fg-neutral-subtle); }
|
|
35
39
|
|
|
36
40
|
.crisp-recordstable-tag { display: inline-flex; align-items: center; height: var(--crisp-size-chip); padding: 0 var(--crisp-space-1); border-radius: var(--crisp-radius-chip); font-size: var(--crisp-text-lg); line-height: 20px; font-weight: var(--crisp-weight-medium); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); color: color-mix(in srgb, var(--crisp-fg-primary) 82%, transparent); box-shadow: inset 0 0 0 1px var(--crisp-border-subtle); }
|
|
37
41
|
.crisp-recordstable-tag[data-tone="brand"] { background: color-mix(in srgb, var(--crisp-bg-brand-solid) 14%, transparent); color: color-mix(in srgb, var(--crisp-bg-brand-solid) 82%, var(--crisp-fg-primary)); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-bg-brand-solid) 30%, transparent); }
|
|
@@ -44,21 +48,41 @@
|
|
|
44
48
|
|
|
45
49
|
.crisp-multiselect {
|
|
46
50
|
position: relative; display: inline-flex; width: 100%; font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
|
|
47
|
-
& .crisp-multiselect-trigger { box-sizing: border-box; display: flex; align-items: center;
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
& .crisp-multiselect-trigger:disabled {
|
|
51
|
+
& .crisp-multiselect-trigger { box-sizing: border-box; display: flex; align-items: center; width: 100%; min-width: 0; margin: 0; border: 1px solid var(--crisp-stroke-select-trigger); background: transparent; cursor: pointer; text-align: start; font-family: inherit; color: var(--crisp-fg-select-neutral); transition: background-color .15s cubic-bezier(.35,0,.35,1), border-color .1s cubic-bezier(.35,0,.35,1), border-width .1s cubic-bezier(.35,0,.35,1); }
|
|
52
|
+
/* Same pressed/disabled/readonly/focus model as Select's trigger -- see
|
|
53
|
+
that recipe's comment for why hover and an open/focus ring are gone. */
|
|
54
|
+
& .crisp-multiselect-trigger:active:not(:disabled):not([aria-readonly="true"]) { background: var(--crisp-bg-select-pressed); }
|
|
55
|
+
& .crisp-multiselect-trigger:focus-visible { outline: 2px solid var(--crisp-stroke-focus-ring); outline-offset: -2px; }
|
|
56
|
+
& .crisp-multiselect-trigger:disabled { background: var(--crisp-bg-select-disabled); cursor: not-allowed; }
|
|
57
|
+
& .crisp-multiselect-trigger:disabled .crisp-multiselect-placeholder, & .crisp-multiselect-trigger:disabled .crisp-multiselect-chevron { color: var(--crisp-fg-disabled); }
|
|
58
|
+
& .crisp-multiselect-trigger[aria-readonly="true"] { background: var(--crisp-bg-select-disabled); cursor: default; }
|
|
51
59
|
& .crisp-multiselect-chips { flex: 1; min-width: 0; display: flex; flex-wrap: wrap; align-items: center; gap: var(--crisp-space-1); }
|
|
52
|
-
& .crisp-multiselect-placeholder { color: var(--crisp-fg-
|
|
53
|
-
|
|
54
|
-
& .crisp-multiselect-
|
|
60
|
+
& .crisp-multiselect-placeholder { color: var(--crisp-fg-select-placeholder); }
|
|
61
|
+
/* closeRotateDuration/openRotateDuration, same asymmetric timing as Select's own chevron (see that recipe's comment). */
|
|
62
|
+
& .crisp-multiselect-chevron { flex-shrink: 0; color: var(--crisp-fg-neutral-muted); transition: transform .1s cubic-bezier(.35,0,.35,1); }
|
|
63
|
+
& .crisp-multiselect-trigger[data-open] .crisp-multiselect-chevron { transform: rotate(180deg); transition-duration: .15s; }
|
|
64
|
+
}
|
|
65
|
+
.crisp-multiselect--size_medium {
|
|
66
|
+
& .crisp-multiselect-trigger { min-height: var(--crisp-size-selectTriggerMd); border-radius: var(--crisp-radius-md); gap: var(--crisp-space-2); padding: var(--crisp-space-1) var(--crisp-space-3-5); }
|
|
67
|
+
& .crisp-multiselect-chevron { width: var(--crisp-size-icon); height: var(--crisp-size-icon); }
|
|
68
|
+
}
|
|
69
|
+
.crisp-multiselect--size_large {
|
|
70
|
+
& .crisp-multiselect-trigger { min-height: var(--crisp-size-selectTriggerLg); border-radius: var(--crisp-radius-xl); gap: var(--crisp-space-2-5); padding: var(--crisp-space-1-5) var(--crisp-space-4); }
|
|
71
|
+
& .crisp-multiselect-chevron { width: var(--crisp-size-selectIconLg); height: var(--crisp-size-selectIconLg); }
|
|
55
72
|
}
|
|
56
73
|
.crisp-multiselect--invalid_true {
|
|
57
|
-
& .crisp-multiselect-trigger
|
|
74
|
+
& .crisp-multiselect-trigger { border-width: 2px; border-color: var(--crisp-stroke-select-invalid); }
|
|
58
75
|
}
|
|
59
76
|
.crisp-multiselect--invalid_false {
|
|
60
77
|
|
|
61
78
|
}
|
|
79
|
+
.crisp-multiselect--variant_default {
|
|
80
|
+
|
|
81
|
+
}
|
|
82
|
+
.crisp-multiselect--variant_ghost {
|
|
83
|
+
& .crisp-multiselect-trigger { min-height: 0; height: 100%; border-color: transparent; }
|
|
84
|
+
& .crisp-multiselect-trigger:hover:not(:disabled) { background: var(--crisp-bg-select-pressed); }
|
|
85
|
+
}
|
|
62
86
|
|
|
63
87
|
@media (prefers-reduced-motion: reduce) {
|
|
64
88
|
.crisp-multiselect, .crisp-multiselect * {
|
package/dist/native/tokens.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// The same tokens the CSS custom properties carry, resolved per theme, with
|
|
3
3
|
// dimensions as numbers for React Native and Lynx style objects.
|
|
4
4
|
export type Theme = "light" | "dark";
|
|
5
|
-
export type ColorTokens = Record<"bgBrandSolid" | "bgBrandSolidPressed" | "fgOnBrand" | "fgOnTone" | "bgSurface" | "bgRaised" | "bgSurfaceMuted" | "borderDefault" | "borderSubtle" | "borderDropzone" | "borderDivider" | "ringNeutral" | "ringField" | "ringSwitch" | "bgTileActive" | "shadowTileActive" | "bgScrim" | "fgAlertDescription" | "bgOverlayFrost" | "shadowOverlay1" | "shadowOverlay2" | "shadowOverlay3" | "bgPopover" | "ringPopover" | "shadowPopover1" | "shadowPopover2" | "shadowPopover3" | "fgPrimary" | "fgMuted" | "bgDanger" | "bgDangerSolid" | "fgDanger" | "strokeFieldFocus" | "fgDisabled" | "bgNeutralWeak" | "bgNeutralInverted" | "fgOnNeutralInverted" | "fgNeutralSubtle" | "fgNeutralMuted" | "strokeFocusRing" | "bgSuccess" | "bgWarning" | "bgOrange" | "bgCyan" | "bgPurple" | "bgSidebar" | "bgSubtle" | "fgBrandSoft" | "fgSuccessSoft" | "fgWarningSoft" | "fgDangerSoft" | "fgNeutralSoft" | "bgPurpleSoft" | "fgPurpleSoft" | "ringPurpleSoft", string>;
|
|
5
|
+
export type ColorTokens = Record<"bgBrandSolid" | "bgBrandSolidPressed" | "fgOnBrand" | "fgOnTone" | "bgSurface" | "bgRaised" | "bgSurfaceMuted" | "borderDefault" | "borderSubtle" | "borderDropzone" | "borderDivider" | "ringNeutral" | "ringField" | "ringSwitch" | "bgTileActive" | "shadowTileActive" | "bgScrim" | "fgAlertDescription" | "bgOverlayFrost" | "shadowOverlay1" | "shadowOverlay2" | "shadowOverlay3" | "bgPopover" | "ringPopover" | "shadowPopover1" | "shadowPopover2" | "shadowPopover3" | "fgPrimary" | "fgMuted" | "bgDanger" | "bgDangerSolid" | "fgDanger" | "strokeFieldFocus" | "fgDisabled" | "bgNeutralWeak" | "bgNeutralInverted" | "fgOnNeutralInverted" | "fgNeutralSubtle" | "fgNeutralMuted" | "strokeFocusRing" | "bgSuccess" | "bgWarning" | "bgOrange" | "bgCyan" | "bgPurple" | "bgSidebar" | "bgSubtle" | "fgBrandSoft" | "fgSuccessSoft" | "fgWarningSoft" | "fgDangerSoft" | "fgNeutralSoft" | "bgPurpleSoft" | "fgPurpleSoft" | "ringPurpleSoft" | "ringBrandSoft" | "fgSelectNeutral" | "bgSelectListbox" | "strokeSelectTrigger" | "bgSelectPressed" | "bgSelectDisabled" | "strokeSelectInvalid" | "strokeSelectDivider" | "fgSelectPlaceholder" | "shadowSelect", string>;
|
|
6
6
|
export declare const tokens: {
|
|
7
7
|
color: Record<Theme, ColorTokens>;
|
|
8
8
|
palette: Record<Theme, Record<string, string>>;
|
package/dist/native/tokens.js
CHANGED
|
@@ -58,7 +58,17 @@ export const tokens = {
|
|
|
58
58
|
"fgNeutralSoft": "#505155",
|
|
59
59
|
"bgPurpleSoft": "#f5f0ff",
|
|
60
60
|
"fgPurpleSoft": "#6238b5",
|
|
61
|
-
"ringPurpleSoft": "#e8ddfe"
|
|
61
|
+
"ringPurpleSoft": "#e8ddfe",
|
|
62
|
+
"ringBrandSoft": "#d6e5ff",
|
|
63
|
+
"fgSelectNeutral": "#1a1c20",
|
|
64
|
+
"bgSelectListbox": "#ffffff",
|
|
65
|
+
"strokeSelectTrigger": "#dcdee3",
|
|
66
|
+
"bgSelectPressed": "#00000007",
|
|
67
|
+
"bgSelectDisabled": "#f3f4f5",
|
|
68
|
+
"strokeSelectInvalid": "#fa342c",
|
|
69
|
+
"strokeSelectDivider": "#00000010",
|
|
70
|
+
"fgSelectPlaceholder": "#b0b3ba",
|
|
71
|
+
"shadowSelect": "#0000001f"
|
|
62
72
|
},
|
|
63
73
|
"dark": {
|
|
64
74
|
"bgBrandSolid": "#266df0",
|
|
@@ -115,7 +125,17 @@ export const tokens = {
|
|
|
115
125
|
"fgNeutralSoft": "#9a9aa2",
|
|
116
126
|
"bgPurpleSoft": "#2f1e5a",
|
|
117
127
|
"fgPurpleSoft": "#d8c4ff",
|
|
118
|
-
"ringPurpleSoft": "#45297d"
|
|
128
|
+
"ringPurpleSoft": "#45297d",
|
|
129
|
+
"ringBrandSoft": "#212224",
|
|
130
|
+
"fgSelectNeutral": "#f3f4f5",
|
|
131
|
+
"bgSelectListbox": "#1d2025",
|
|
132
|
+
"strokeSelectTrigger": "#393d46",
|
|
133
|
+
"bgSelectPressed": "#ffffff0d",
|
|
134
|
+
"bgSelectDisabled": "#2b2e35",
|
|
135
|
+
"strokeSelectInvalid": "#ff6e60",
|
|
136
|
+
"strokeSelectDivider": "#ffffff17",
|
|
137
|
+
"fgSelectPlaceholder": "#868b94",
|
|
138
|
+
"shadowSelect": "#000000cc"
|
|
119
139
|
}
|
|
120
140
|
},
|
|
121
141
|
"palette": {
|
|
@@ -132,6 +152,7 @@ export const tokens = {
|
|
|
132
152
|
"ringNeutral": "transparent",
|
|
133
153
|
"ringField": "rgba(0,0,0,0.06)",
|
|
134
154
|
"ringSwitch": "#d9dade",
|
|
155
|
+
"ringBrandSoft": "#d6e5ff",
|
|
135
156
|
"tileActive": "#ffffff",
|
|
136
157
|
"tileActiveShadow": "rgba(0,0,0,0.04)",
|
|
137
158
|
"bgScrim": "rgba(0,0,0,0.25)",
|
|
@@ -172,7 +193,15 @@ export const tokens = {
|
|
|
172
193
|
"softNeutralText": "#505155",
|
|
173
194
|
"purpleTint": "#f5f0ff",
|
|
174
195
|
"softPurpleText": "#6238b5",
|
|
175
|
-
"purpleRing": "#e8ddfe"
|
|
196
|
+
"purpleRing": "#e8ddfe",
|
|
197
|
+
"selectListboxBg": "#ffffff",
|
|
198
|
+
"selectTriggerStroke": "#dcdee3",
|
|
199
|
+
"selectPressedTint": "#00000007",
|
|
200
|
+
"selectDisabledBg": "#f3f4f5",
|
|
201
|
+
"selectInvalidStroke": "#fa342c",
|
|
202
|
+
"selectDivider": "#00000010",
|
|
203
|
+
"selectPlaceholder": "#b0b3ba",
|
|
204
|
+
"selectShadow": "#0000001f"
|
|
176
205
|
},
|
|
177
206
|
"dark": {
|
|
178
207
|
"gray00": "#0a0a0a",
|
|
@@ -187,6 +216,7 @@ export const tokens = {
|
|
|
187
216
|
"ringNeutral": "#212224",
|
|
188
217
|
"ringField": "#212224",
|
|
189
218
|
"ringSwitch": "#212224",
|
|
219
|
+
"ringBrandSoft": "#212224",
|
|
190
220
|
"tileActive": "#101112",
|
|
191
221
|
"tileActiveShadow": "rgba(0,0,0,0)",
|
|
192
222
|
"bgScrim": "rgba(0,0,0,0.55)",
|
|
@@ -227,7 +257,15 @@ export const tokens = {
|
|
|
227
257
|
"softNeutralText": "#9a9aa2",
|
|
228
258
|
"purpleTint": "#2f1e5a",
|
|
229
259
|
"softPurpleText": "#d8c4ff",
|
|
230
|
-
"purpleRing": "#45297d"
|
|
260
|
+
"purpleRing": "#45297d",
|
|
261
|
+
"selectListboxBg": "#1d2025",
|
|
262
|
+
"selectTriggerStroke": "#393d46",
|
|
263
|
+
"selectPressedTint": "#ffffff0d",
|
|
264
|
+
"selectDisabledBg": "#2b2e35",
|
|
265
|
+
"selectInvalidStroke": "#ff6e60",
|
|
266
|
+
"selectDivider": "#ffffff17",
|
|
267
|
+
"selectPlaceholder": "#868b94",
|
|
268
|
+
"selectShadow": "#000000cc"
|
|
231
269
|
}
|
|
232
270
|
},
|
|
233
271
|
"space": {
|
|
@@ -241,7 +279,8 @@ export const tokens = {
|
|
|
241
279
|
"px": 1,
|
|
242
280
|
"0.5": 2,
|
|
243
281
|
"1.5": 6,
|
|
244
|
-
"2.5": 10
|
|
282
|
+
"2.5": 10,
|
|
283
|
+
"3.5": 14
|
|
245
284
|
},
|
|
246
285
|
"radius": {
|
|
247
286
|
"chip": 7,
|
|
@@ -250,6 +289,7 @@ export const tokens = {
|
|
|
250
289
|
"lg": 9,
|
|
251
290
|
"xl": 12,
|
|
252
291
|
"2xl": 16,
|
|
292
|
+
"3xl": 20,
|
|
253
293
|
"full": 999
|
|
254
294
|
},
|
|
255
295
|
"size": {
|
|
@@ -261,7 +301,10 @@ export const tokens = {
|
|
|
261
301
|
"tableHeader": 40,
|
|
262
302
|
"header": 48,
|
|
263
303
|
"calendarCell": 34,
|
|
264
|
-
"calendarPill": 32
|
|
304
|
+
"calendarPill": 32,
|
|
305
|
+
"selectTriggerMd": 40,
|
|
306
|
+
"selectTriggerLg": 52,
|
|
307
|
+
"selectIconLg": 20
|
|
265
308
|
},
|
|
266
309
|
"text": {
|
|
267
310
|
"xs": 11,
|