@crisp-ui-kit/crisp 0.57.3 → 0.57.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assigneepicker.css +13 -0
- package/dist/assigneepicker.d.ts +7 -0
- package/dist/assigneepicker.layered.css +15 -0
- package/dist/button.css +1 -1
- package/dist/button.layered.css +1 -1
- package/dist/cjs/components/button/button.recipe.js +15 -10
- package/dist/cjs/components/datatable/datatable.js +6 -3
- package/dist/cjs/components/datatable/datatable.recipe.js +35 -2
- package/dist/cjs/components/menu/menu.js +48 -8
- package/dist/cjs/components/multiselect/multiselect.js +3 -0
- package/dist/cjs/components/multiselect/multiselect.recipe.js +18 -0
- package/dist/cjs/components/select/select.js +2 -2
- package/dist/cjs/components/select/select.recipe.js +19 -0
- package/dist/cjs/core/index.js +2 -1
- package/dist/cjs/core/place-floating.js +38 -0
- package/dist/cjs/index.js +8 -0
- package/dist/cjs/product/assigneepicker/assigneepicker.js +127 -0
- package/dist/cjs/product/assigneepicker/assigneepicker.recipe.js +36 -0
- package/dist/cjs/product/assigneepicker/index.js +7 -0
- package/dist/cjs/product/notesgallery/index.js +7 -0
- package/dist/cjs/product/notesgallery/notesgallery.js +80 -0
- package/dist/cjs/product/notesgallery/notesgallery.recipe.js +46 -0
- package/dist/cjs/product/objectpagemenu/index.js +17 -0
- package/dist/cjs/product/objectpagemenu/objectpagemenu.js +26 -0
- package/dist/cjs/product/objectpagemenu/objectpagemenu.recipe.js +30 -0
- package/dist/cjs/product/objectsettings/objectsettings.js +107 -14
- package/dist/cjs/product/recordpage/recordpage.js +64 -5
- package/dist/cjs/product/recordpage/recordpage.recipe.js +38 -0
- package/dist/cjs/product/recordpicker/index.js +7 -0
- package/dist/cjs/product/recordpicker/recordpicker.js +100 -0
- package/dist/cjs/product/recordpicker/recordpicker.recipe.js +36 -0
- package/dist/cjs/product/savedviews/index.js +2 -1
- package/dist/cjs/product/savedviews/savedviews.js +22 -0
- package/dist/cjs/product/savedviews/savedviews.recipe.js +47 -0
- package/dist/cjs/product/share/index.js +7 -0
- package/dist/cjs/product/share/share.js +179 -0
- package/dist/cjs/product/share/share.recipe.js +114 -0
- package/dist/cjs/product/shortcutssheet/index.js +17 -0
- package/dist/cjs/product/shortcutssheet/shortcutssheet.js +125 -0
- package/dist/cjs/product/shortcutssheet/shortcutssheet.recipe.js +50 -0
- package/dist/cjs/product/taskeditpopover/index.js +7 -0
- package/dist/cjs/product/taskeditpopover/taskeditpopover.js +159 -0
- package/dist/cjs/product/taskeditpopover/taskeditpopover.recipe.js +68 -0
- package/dist/cjs/product/workspaceswitchermenu/index.js +17 -0
- package/dist/cjs/product/workspaceswitchermenu/workspaceswitchermenu.js +38 -0
- package/dist/cjs/product/workspaceswitchermenu/workspaceswitchermenu.recipe.js +34 -0
- package/dist/cjs/tokens/palette.js +27 -0
- package/dist/cjs/tokens/semantic.js +20 -0
- package/dist/datatable.css +40 -7
- package/dist/datatable.layered.css +40 -7
- package/dist/esm/components/button/button.recipe.js +15 -10
- package/dist/esm/components/datatable/datatable.js +6 -3
- package/dist/esm/components/datatable/datatable.recipe.js +35 -2
- package/dist/esm/components/menu/menu.js +47 -7
- package/dist/esm/components/multiselect/multiselect.js +3 -0
- package/dist/esm/components/multiselect/multiselect.recipe.js +18 -0
- package/dist/esm/components/select/select.js +2 -2
- package/dist/esm/components/select/select.recipe.js +19 -0
- package/dist/esm/core/index.js +1 -1
- package/dist/esm/core/place-floating.js +37 -0
- package/dist/esm/index.js +8 -0
- package/dist/esm/product/assigneepicker/assigneepicker.js +91 -0
- package/dist/esm/product/assigneepicker/assigneepicker.recipe.js +33 -0
- package/dist/esm/product/assigneepicker/index.js +2 -0
- package/dist/esm/product/notesgallery/index.js +2 -0
- package/dist/esm/product/notesgallery/notesgallery.js +44 -0
- package/dist/esm/product/notesgallery/notesgallery.recipe.js +43 -0
- package/dist/esm/product/objectpagemenu/index.js +1 -0
- package/dist/esm/product/objectpagemenu/objectpagemenu.js +23 -0
- package/dist/esm/product/objectpagemenu/objectpagemenu.recipe.js +27 -0
- package/dist/esm/product/objectsettings/objectsettings.js +106 -13
- package/dist/esm/product/recordpage/recordpage.js +64 -5
- package/dist/esm/product/recordpage/recordpage.recipe.js +38 -0
- package/dist/esm/product/recordpicker/index.js +2 -0
- package/dist/esm/product/recordpicker/recordpicker.js +64 -0
- package/dist/esm/product/recordpicker/recordpicker.recipe.js +33 -0
- package/dist/esm/product/savedviews/index.js +1 -1
- package/dist/esm/product/savedviews/savedviews.js +22 -1
- package/dist/esm/product/savedviews/savedviews.recipe.js +47 -0
- package/dist/esm/product/share/index.js +2 -0
- package/dist/esm/product/share/share.js +143 -0
- package/dist/esm/product/share/share.recipe.js +111 -0
- package/dist/esm/product/shortcutssheet/index.js +1 -0
- package/dist/esm/product/shortcutssheet/shortcutssheet.js +88 -0
- package/dist/esm/product/shortcutssheet/shortcutssheet.recipe.js +47 -0
- package/dist/esm/product/taskeditpopover/index.js +2 -0
- package/dist/esm/product/taskeditpopover/taskeditpopover.js +123 -0
- package/dist/esm/product/taskeditpopover/taskeditpopover.recipe.js +65 -0
- package/dist/esm/product/workspaceswitchermenu/index.js +1 -0
- package/dist/esm/product/workspaceswitchermenu/workspaceswitchermenu.js +35 -0
- package/dist/esm/product/workspaceswitchermenu/workspaceswitchermenu.recipe.js +31 -0
- package/dist/esm/tokens/palette.js +27 -0
- package/dist/esm/tokens/semantic.js +20 -0
- package/dist/multiselect.css +18 -0
- package/dist/multiselect.layered.css +18 -0
- package/dist/native/tokens.d.ts +1 -1
- package/dist/native/tokens.js +56 -4
- package/dist/notesgallery.css +15 -0
- package/dist/notesgallery.d.ts +7 -0
- package/dist/notesgallery.layered.css +17 -0
- package/dist/objectpagemenu.css +3 -0
- package/dist/objectpagemenu.d.ts +7 -0
- package/dist/objectpagemenu.layered.css +5 -0
- package/dist/recordpage.css +36 -0
- package/dist/recordpage.layered.css +36 -0
- package/dist/recordpicker.css +13 -0
- package/dist/recordpicker.d.ts +7 -0
- package/dist/recordpicker.layered.css +15 -0
- package/dist/savedviews.css +47 -0
- package/dist/savedviews.layered.css +47 -0
- package/dist/select.css +19 -0
- package/dist/select.layered.css +19 -0
- package/dist/share.css +84 -0
- package/dist/share.d.ts +7 -0
- package/dist/share.layered.css +86 -0
- package/dist/shortcutssheet.css +24 -0
- package/dist/shortcutssheet.d.ts +7 -0
- package/dist/shortcutssheet.layered.css +26 -0
- package/dist/styles.css +387 -8
- package/dist/styles.layered.css +387 -8
- package/dist/taskeditpopover.css +36 -0
- package/dist/taskeditpopover.d.ts +7 -0
- package/dist/taskeditpopover.layered.css +38 -0
- package/dist/tokens.css +26 -0
- package/dist/tokens.json +56 -4
- package/dist/types/components/button/button.recipe.d.ts +2 -3
- package/dist/types/components/datatable/datatable.d.ts +8 -0
- package/dist/types/components/menu/menu.d.ts +50 -7
- package/dist/types/components/multiselect/multiselect.d.ts +9 -0
- package/dist/types/components/select/select.d.ts +10 -0
- package/dist/types/core/index.d.ts +1 -1
- package/dist/types/core/place-floating.d.ts +37 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/product/assigneepicker/assigneepicker.d.ts +36 -0
- package/dist/types/product/assigneepicker/assigneepicker.recipe.d.ts +3 -0
- package/dist/types/product/assigneepicker/index.d.ts +2 -0
- package/dist/types/product/notesgallery/index.d.ts +2 -0
- package/dist/types/product/notesgallery/notesgallery.d.ts +54 -0
- package/dist/types/product/notesgallery/notesgallery.recipe.d.ts +3 -0
- package/dist/types/product/objectpagemenu/index.d.ts +1 -0
- package/dist/types/product/objectpagemenu/objectpagemenu.d.ts +40 -0
- package/dist/types/product/objectpagemenu/objectpagemenu.recipe.d.ts +17 -0
- package/dist/types/product/objectsettings/objectsettings.d.ts +71 -15
- package/dist/types/product/recordpage/index.d.ts +1 -1
- package/dist/types/product/recordpage/recordpage.d.ts +96 -1
- package/dist/types/product/recordpicker/index.d.ts +2 -0
- package/dist/types/product/recordpicker/recordpicker.d.ts +38 -0
- package/dist/types/product/recordpicker/recordpicker.recipe.d.ts +3 -0
- package/dist/types/product/savedviews/index.d.ts +1 -1
- package/dist/types/product/savedviews/savedviews.d.ts +36 -0
- package/dist/types/product/share/index.d.ts +2 -0
- package/dist/types/product/share/share.d.ts +85 -0
- package/dist/types/product/share/share.recipe.d.ts +3 -0
- package/dist/types/product/shortcutssheet/index.d.ts +1 -0
- package/dist/types/product/shortcutssheet/shortcutssheet.d.ts +49 -0
- package/dist/types/product/shortcutssheet/shortcutssheet.recipe.d.ts +3 -0
- package/dist/types/product/taskeditpopover/index.d.ts +2 -0
- package/dist/types/product/taskeditpopover/taskeditpopover.d.ts +67 -0
- package/dist/types/product/taskeditpopover/taskeditpopover.recipe.d.ts +3 -0
- package/dist/types/product/workspaceswitchermenu/index.d.ts +1 -0
- package/dist/types/product/workspaceswitchermenu/workspaceswitchermenu.d.ts +54 -0
- package/dist/types/product/workspaceswitchermenu/workspaceswitchermenu.recipe.d.ts +19 -0
- package/dist/types/tokens/contract.d.ts +13 -0
- package/dist/types/tokens/palette.d.ts +52 -0
- package/dist/types/tokens/semantic.d.ts +20 -0
- package/dist/workspaceswitchermenu.css +4 -0
- package/dist/workspaceswitchermenu.d.ts +7 -0
- package/dist/workspaceswitchermenu.layered.css +6 -0
- package/package.json +41 -1
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { defineRecipe, resolveRecipe } from "../../core/index.js";
|
|
2
|
+
import { contract as c } from "../../tokens/index.js";
|
|
3
|
+
// The "Edit task" popover -- measured live on app.attio.com's Tasks page
|
|
4
|
+
// (click a task row): an 800px-wide floating card, radius 12, a single
|
|
5
|
+
// subtle 1px ring shadow (no blur/offset layer -- lighter than
|
|
6
|
+
// `elevation.floating`, which every other crisp overlay uses; this one
|
|
7
|
+
// really does measure as just the ring, confirmed by walking every
|
|
8
|
+
// ancestor up to the floating root). Same core floating primitives
|
|
9
|
+
// `Popover`/`savedviews` already use directly (this doesn't reuse
|
|
10
|
+
// `Popover` itself: its own `.crisp-popover-content` hardcodes a
|
|
11
|
+
// max-width of min(360px, 92vw), far under this popover's measured width).
|
|
12
|
+
//
|
|
13
|
+
// Three rows: a 44px header (icon+"Edit task", a bottom hairline divider,
|
|
14
|
+
// a close button), a body row (checkbox + editable title), and a 44px
|
|
15
|
+
// footer (the due-date/assigned/add-record chip row on the left, the
|
|
16
|
+
// kebab + Cancel/Save on the right). The chip row's own 10px/400 muted
|
|
17
|
+
// caption size and the footer buttons' matching 10px labels don't fit any
|
|
18
|
+
// existing text-scale token (closest is `text.xs` at 11px) -- raw px per
|
|
19
|
+
// Golden Rule 3's "genuinely intrinsic size" exception, same as
|
|
20
|
+
// `dialog.recipe.ts`'s own submit-key glyphs.
|
|
21
|
+
const config = defineRecipe({
|
|
22
|
+
name: "taskeditpopover",
|
|
23
|
+
// Portaled root: position/z-index/the open transition live here as raw
|
|
24
|
+
// literal CSS (not `base`, which lightningcss nests under `.${prefixed}`
|
|
25
|
+
// at BUILD time -- fine for the plain declarations below, but this exact
|
|
26
|
+
// selector text has to exist as source text for `spec-check.mjs`'s
|
|
27
|
+
// overlay-escape/animation scan, the same reason Popover/Menu/Select
|
|
28
|
+
// declare their own portaled root in `globalCss` rather than `base`).
|
|
29
|
+
globalCss: `.crisp-taskeditpopover { position: fixed; z-index: 70; pointer-events: auto; opacity: 1; transform: scale(1); transition: opacity 0.08s ease, transform 0.08s ease; @starting-style { opacity: 0; transform: scale(0.97) translateY(-4px); } }`,
|
|
30
|
+
base: `display: flex; flex-direction: column; box-sizing: border-box; width: 800px; max-width: 92vw; border-radius: ${c.radius.xl}; background: ${c.bgSurface}; box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.07); font-family: ${c.font.sans};
|
|
31
|
+
-webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
|
|
32
|
+
|
|
33
|
+
& .crisp-taskeditpopover-header { display: flex; align-items: center; justify-content: space-between; gap: ${c.space["2"]}; height: 44px; box-sizing: border-box; padding: 0 ${c.space["2"]} 0 ${c.space["3"]}; border-bottom: 1px solid ${c.borderSubtle}; }
|
|
34
|
+
& .crisp-taskeditpopover-heading { display: flex; align-items: center; gap: ${c.space["1"]}; font-size: ${c.text.lg}; font-weight: ${c.weight.medium}; color: ${c.fgPrimary}; }
|
|
35
|
+
& .crisp-taskeditpopover-heading svg { flex-shrink: 0; color: ${c.fgMuted}; }
|
|
36
|
+
& .crisp-taskeditpopover-close { display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; width: 28px; height: 28px; margin: 0; padding: 0; border: none; border-radius: ${c.radius.md}; background: none; color: ${c.fgMuted}; font-family: inherit; cursor: pointer; }
|
|
37
|
+
& .crisp-taskeditpopover-close:hover { background: ${c.bgRaised}; color: ${c.fgPrimary}; }
|
|
38
|
+
|
|
39
|
+
& .crisp-taskeditpopover-body { display: flex; align-items: center; gap: ${c.space["2.5"]}; min-height: 52px; box-sizing: border-box; padding: ${c.space["3"]}; }
|
|
40
|
+
& .crisp-taskeditpopover-check { appearance: none; -webkit-appearance: none; box-sizing: border-box; flex-shrink: 0; margin: 0; width: 16px; height: 16px; border: none; border-radius: ${c.radius.full}; background: ${c.bgSurface}; box-shadow: inset 0 0 0 1px color-mix(in srgb, ${c.fgPrimary} 9%, transparent); cursor: pointer; }
|
|
41
|
+
& .crisp-taskeditpopover-check:hover { box-shadow: inset 0 0 0 1px color-mix(in srgb, ${c.fgPrimary} 30%, transparent); }
|
|
42
|
+
& .crisp-taskeditpopover-check:checked { background: ${c.bgBrandSolid} center / 10px no-repeat; box-shadow: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 12 12' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2.5 6.5 5 9l4.5-5'/%3E%3C/svg%3E"); }
|
|
43
|
+
& .crisp-taskeditpopover-title { flex: 1; min-width: 0; border: none; border-radius: ${c.radius.sm}; outline: none; background: none; font-family: inherit; font-size: ${c.text.lg}; font-weight: ${c.weight.medium}; color: ${c.fgPrimary}; }
|
|
44
|
+
& .crisp-taskeditpopover-title:focus-visible { outline: 2px solid ${c.strokeFocusRing}; outline-offset: 2px; }
|
|
45
|
+
|
|
46
|
+
& .crisp-taskeditpopover-footer { display: flex; align-items: center; justify-content: space-between; gap: ${c.space["2"]}; height: 44px; box-sizing: border-box; padding: 0 ${c.space["2"]} 0 ${c.space["3"]}; }
|
|
47
|
+
& .crisp-taskeditpopover-chips { display: flex; align-items: center; gap: ${c.space["1"]}; min-width: 0; }
|
|
48
|
+
& .crisp-taskeditpopover-chip { display: inline-flex; align-items: center; gap: 6px; flex-shrink: 0; height: 28px; box-sizing: border-box; padding: 4px 8px 4px 6px; border: none; border-radius: ${c.radius.md}; background: none; color: color-mix(in srgb, ${c.fgPrimary} 55%, transparent); font-family: inherit; font-size: 10px; white-space: nowrap; cursor: pointer; }
|
|
49
|
+
& .crisp-taskeditpopover-chip svg { flex-shrink: 0; }
|
|
50
|
+
& .crisp-taskeditpopover-chip:hover { background: ${c.bgRaised}; }
|
|
51
|
+
|
|
52
|
+
& .crisp-taskeditpopover-actions { display: flex; align-items: center; gap: ${c.space["2"]}; flex-shrink: 0; }
|
|
53
|
+
& .crisp-taskeditpopover-kebab { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; margin: 0; padding: 6px; border: none; border-radius: ${c.radius.md}; background: none; color: ${c.fgPrimary}; font-family: inherit; cursor: pointer; }
|
|
54
|
+
& .crisp-taskeditpopover-kebab:hover { background: ${c.bgRaised}; }
|
|
55
|
+
& .crisp-taskeditpopover-cancel { display: inline-flex; align-items: center; gap: 6px; height: 28px; box-sizing: border-box; padding: 4px 6px 4px 8px; border: none; border-radius: ${c.radius.md}; background: none; color: ${c.fgPrimary}; font-family: inherit; font-size: 10px; cursor: pointer; }
|
|
56
|
+
& .crisp-taskeditpopover-cancel:hover { background: ${c.bgRaised}; }
|
|
57
|
+
& .crisp-taskeditpopover-save { display: inline-flex; align-items: center; gap: 6px; height: 28px; box-sizing: border-box; padding: 4px 6px 4px 8px; border: none; border-radius: ${c.radius.md}; background: ${c.bgBrandSolid}; color: ${c.fgOnBrand}; font-family: inherit; font-size: 10px; cursor: pointer; }
|
|
58
|
+
& .crisp-taskeditpopover-save:hover { background: ${c.bgBrandSolidPressed}; }
|
|
59
|
+
& .crisp-taskeditpopover-key { color: color-mix(in srgb, currentColor 55%, transparent); font-size: 10px; }`,
|
|
60
|
+
variants: {},
|
|
61
|
+
defaultVariants: {},
|
|
62
|
+
compoundVariants: [],
|
|
63
|
+
});
|
|
64
|
+
export const taskeditpopoverRecipe = resolveRecipe(config);
|
|
65
|
+
export default config;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./workspaceswitchermenu.js";
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { CircleArrowUp, CircleCheck, Grid2x2, HeartHandshake, LogOut, Plus, Settings, User, UserPlus, } from "lucide-react";
|
|
3
|
+
import { Avatar } from "../../components/avatar/index.js";
|
|
4
|
+
import { MenuItem, MenuSeparator } from "../../components/menu/index.js";
|
|
5
|
+
import { useCrispMessage } from "../../core/index.js";
|
|
6
|
+
/**
|
|
7
|
+
* The FIXED content of Attio's own workspace-switcher popover (crisp#632) —
|
|
8
|
+
* live-measured off app.attio.com/techpartners: each workspace as a
|
|
9
|
+
* checked/unchecked row, then New workspace, then Account settings /
|
|
10
|
+
* Workspace settings, then Invite members / Upgrade Attio / Refer another
|
|
11
|
+
* team, then Apps and integrations, then Sign out — each group separated by
|
|
12
|
+
* a hairline, matching a 280px-wide popover.
|
|
13
|
+
*
|
|
14
|
+
* This is CONTENT, not a component with its own trigger/popover: pass it as
|
|
15
|
+
* `Sidebar`'s own `workspaceMenu` prop (crisp#415 already builds the real
|
|
16
|
+
* menu-button trigger/popover machinery around whatever children it's
|
|
17
|
+
* given — the workspace switcher itself has no fixed content of its own by
|
|
18
|
+
* design, since which settings exist is the consumer's; this is that fixed
|
|
19
|
+
* content, ready-made, the same way `defaultCommandItems` is for `Command`).
|
|
20
|
+
*/
|
|
21
|
+
export function WorkspaceSwitcherMenu({ workspaces, currentWorkspaceId, onSelectWorkspace, onNewWorkspace, onAccountSettings, onWorkspaceSettings, onInviteMembers, onUpgradeAttio, onReferAnotherTeam, onAppsAndIntegrations, onSignOut, newWorkspaceLabel, accountSettingsLabel, workspaceSettingsLabel, inviteMembersLabel, upgradeAttioLabel, referAnotherTeamLabel, appsAndIntegrationsLabel, signOutLabel, }) {
|
|
22
|
+
const newWorkspace = useCrispMessage(newWorkspaceLabel, "New workspace");
|
|
23
|
+
const accountSettings = useCrispMessage(accountSettingsLabel, "Account settings");
|
|
24
|
+
const workspaceSettings = useCrispMessage(workspaceSettingsLabel, "Workspace settings");
|
|
25
|
+
const inviteMembers = useCrispMessage(inviteMembersLabel, "Invite members");
|
|
26
|
+
const upgradeAttio = useCrispMessage(upgradeAttioLabel, "Upgrade Attio");
|
|
27
|
+
const referAnotherTeam = useCrispMessage(referAnotherTeamLabel, "Refer another team");
|
|
28
|
+
const appsAndIntegrations = useCrispMessage(appsAndIntegrationsLabel, "Apps and integrations");
|
|
29
|
+
const signOut = useCrispMessage(signOutLabel, "Sign out");
|
|
30
|
+
return (_jsxs(_Fragment, { children: [workspaces.map((ws) => {
|
|
31
|
+
const checked = ws.id === currentWorkspaceId;
|
|
32
|
+
return (_jsx(MenuItem, { icon: _jsx(Avatar, { size: "sm", shape: "rounded", tone: ws.avatarTone, children: ws.avatarLabel }), trailingIcon: checked ? (_jsx(CircleCheck, { size: 16, strokeWidth: 1.75, className: "crisp-workspaceswitchermenu-check" })) : undefined, "aria-checked": checked, onSelect: () => onSelectWorkspace?.(ws.id), children: ws.name }, ws.id));
|
|
33
|
+
}), _jsx(MenuItem, { icon: _jsx(Plus, { size: 16, strokeWidth: 1.75 }), onSelect: onNewWorkspace, children: newWorkspace }), _jsx(MenuSeparator, {}), _jsx(MenuItem, { icon: _jsx(User, { size: 16, strokeWidth: 1.75 }), onSelect: onAccountSettings, children: accountSettings }), _jsx(MenuItem, { icon: _jsx(Settings, { size: 16, strokeWidth: 1.75 }), onSelect: onWorkspaceSettings, children: workspaceSettings }), _jsx(MenuSeparator, {}), _jsx(MenuItem, { icon: _jsx(UserPlus, { size: 16, strokeWidth: 1.75 }), onSelect: onInviteMembers, children: inviteMembers }), _jsx(MenuItem, { icon: _jsx(CircleArrowUp, { size: 16, strokeWidth: 1.75 }), onSelect: onUpgradeAttio, children: upgradeAttio }), _jsx(MenuItem, { icon: _jsx(HeartHandshake, { size: 16, strokeWidth: 1.75 }), onSelect: onReferAnotherTeam, children: referAnotherTeam }), _jsx(MenuSeparator, {}), _jsx(MenuItem, { icon: _jsx(Grid2x2, { size: 16, strokeWidth: 1.75 }), onSelect: onAppsAndIntegrations, children: appsAndIntegrations }), _jsx(MenuSeparator, {}), _jsx(MenuItem, { icon: _jsx(LogOut, { "data-rtl-flip": "", size: 16, strokeWidth: 1.75 }), onSelect: onSignOut, children: signOut })] }));
|
|
34
|
+
}
|
|
35
|
+
WorkspaceSwitcherMenu.displayName = "WorkspaceSwitcherMenu";
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { defineRecipe, resolveRecipe } from "../../core/index.js";
|
|
2
|
+
import { contract as c } from "../../tokens/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* `WorkspaceSwitcherMenu` owns almost no styling of its own — every visible
|
|
5
|
+
* pixel besides the two rules below is `Menu`/`MenuItem`'s own
|
|
6
|
+
* already-measured recipe (crisp#632):
|
|
7
|
+
* - The RTL mirror for its "Sign out" icon: `LogOut` is treated as
|
|
8
|
+
* direction-bearing (`build/spec-check.mjs`'s own DIRECTIONAL set), so
|
|
9
|
+
* it's marked and mirrored the same way ObjectPageMenu's Notifications
|
|
10
|
+
* chevron is (crisp#616) — see that file's identical recipe for why this
|
|
11
|
+
* is a plain absolute selector, not `${rtlFlipCss}`'s `&`-nesting form.
|
|
12
|
+
* - The current-workspace checkmark's colour: `.crisp-menu-item svg` already
|
|
13
|
+
* sets every menu icon to `fgMuted` (menu.recipe.ts), which is deliberate
|
|
14
|
+
* there but wrong for THIS one glyph — Attio's own is brand-coloured, not
|
|
15
|
+
* muted, to read as a status rather than a plain icon. `svg` doubled in
|
|
16
|
+
* the selector (not just the class) so it outranks that rule under equal
|
|
17
|
+
* source order instead of depending on file concatenation order.
|
|
18
|
+
*/
|
|
19
|
+
const config = defineRecipe({
|
|
20
|
+
name: "workspaceswitchermenu",
|
|
21
|
+
base: "",
|
|
22
|
+
globalCss: `
|
|
23
|
+
[dir="rtl"] .crisp-menu-item svg[data-rtl-flip] { transform: scaleX(-1); }
|
|
24
|
+
.crisp-menu-item svg.crisp-workspaceswitchermenu-check { color: ${c.fgBrandContrast}; }
|
|
25
|
+
`,
|
|
26
|
+
variants: {},
|
|
27
|
+
defaultVariants: {},
|
|
28
|
+
compoundVariants: [],
|
|
29
|
+
});
|
|
30
|
+
export const workspaceswitchermenuRecipe = resolveRecipe(config);
|
|
31
|
+
export default config;
|
|
@@ -274,4 +274,31 @@ export const palette = {
|
|
|
274
274
|
// s3 (shadow.yaml) -- the listbox's single-layer floating shadow, in place
|
|
275
275
|
// of crisp's own multi-layer `elevation.floating` for this component only.
|
|
276
276
|
selectShadow: { light: "#0000001f", dark: "#000000cc" },
|
|
277
|
+
// your-moon/crisp#998: the 12-colour tag/option-colour palette a workspace
|
|
278
|
+
// admin picks for a Select/MultiSelect option, measured live off
|
|
279
|
+
// app.attio.com's Categories multi-select field (table-cell/column-editor
|
|
280
|
+
// pill, not the larger tinted-text activity-feed variant -- see
|
|
281
|
+
// ~/grc-parity/attio-tag-palette.md). All 12 are near-white pastels with
|
|
282
|
+
// flat black text regardless of which one -- Attio's theme toggle is
|
|
283
|
+
// off-limits (same restriction every other raw entry in this file notes),
|
|
284
|
+
// so no dark variant was reachable; light is reused for dark, same as
|
|
285
|
+
// `cyan600`/`purple600`/`orange600` above already do for the same reason.
|
|
286
|
+
// Numbered 1-12 rather than named: Attio assigns them by an internal hash
|
|
287
|
+
// of the option's id, not by any hue name a consumer would recognise.
|
|
288
|
+
tagSwatch1: { light: "#fff3cc", dark: "#fff3cc" },
|
|
289
|
+
tagSwatch2: { light: "#f4fbcb", dark: "#f4fbcb" },
|
|
290
|
+
tagSwatch3: { light: "#fdf7c4", dark: "#fdf7c4" },
|
|
291
|
+
tagSwatch4: { light: "#feecf3", dark: "#feecf3" },
|
|
292
|
+
tagSwatch5: { light: "#e0fced", dark: "#e0fced" },
|
|
293
|
+
tagSwatch6: { light: "#ddf7ff", dark: "#ddf7ff" },
|
|
294
|
+
tagSwatch7: { light: "#f6f7f7", dark: "#f6f7f7" },
|
|
295
|
+
tagSwatch8: { light: "#ffebeb", dark: "#ffebeb" },
|
|
296
|
+
tagSwatch9: { light: "#feeee1", dark: "#feeee1" },
|
|
297
|
+
tagSwatch10: { light: "#e5eeff", dark: "#e5eeff" },
|
|
298
|
+
tagSwatch11: { light: "#f5f0ff", dark: "#f5f0ff" },
|
|
299
|
+
tagSwatch12: { light: "#fdedff", dark: "#fdedff" },
|
|
300
|
+
// measured alongside the palette above: flat opaque black, not `ink`
|
|
301
|
+
// (#101112) -- a genuinely different, slightly darker hex Attio uses only
|
|
302
|
+
// for this one pill's text, regardless of which of the 12 backgrounds.
|
|
303
|
+
tagSwatchInk: { light: "#000000", dark: "#000000" },
|
|
277
304
|
};
|
|
@@ -126,4 +126,24 @@ export const semantic = {
|
|
|
126
126
|
strokeSelectDivider: "selectDivider",
|
|
127
127
|
fgSelectPlaceholder: "selectPlaceholder",
|
|
128
128
|
shadowSelect: "selectShadow",
|
|
129
|
+
/** your-moon/crisp#998: a Select/MultiSelect option's fixed tag colour
|
|
130
|
+
* (`swatch`, 1-12) -- see palette.ts's own comment on `tagSwatch1` for
|
|
131
|
+
* the measurement. Distinct from `Select`'s existing `color` (an
|
|
132
|
+
* arbitrary-CSS status dot) and `MultiSelect`'s existing `tone` (crisp's
|
|
133
|
+
* own semantic 7-tone chip family): this is Attio's own enumerable,
|
|
134
|
+
* workspace-admin-assigned palette, reproduced verbatim rather than
|
|
135
|
+
* mapped onto either existing mechanism. */
|
|
136
|
+
bgTagSwatch1: "tagSwatch1",
|
|
137
|
+
bgTagSwatch2: "tagSwatch2",
|
|
138
|
+
bgTagSwatch3: "tagSwatch3",
|
|
139
|
+
bgTagSwatch4: "tagSwatch4",
|
|
140
|
+
bgTagSwatch5: "tagSwatch5",
|
|
141
|
+
bgTagSwatch6: "tagSwatch6",
|
|
142
|
+
bgTagSwatch7: "tagSwatch7",
|
|
143
|
+
bgTagSwatch8: "tagSwatch8",
|
|
144
|
+
bgTagSwatch9: "tagSwatch9",
|
|
145
|
+
bgTagSwatch10: "tagSwatch10",
|
|
146
|
+
bgTagSwatch11: "tagSwatch11",
|
|
147
|
+
bgTagSwatch12: "tagSwatch12",
|
|
148
|
+
fgTagSwatch: "tagSwatchInk",
|
|
129
149
|
};
|
package/dist/multiselect.css
CHANGED
|
@@ -50,6 +50,24 @@
|
|
|
50
50
|
.crisp-recordstable-tag[data-tone="purple"] { background: color-mix(in srgb, var(--crisp-bg-purple) 16%, transparent); color: color-mix(in srgb, var(--crisp-bg-purple) 80%, var(--crisp-fg-primary)); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-bg-purple) 30%, transparent); }
|
|
51
51
|
.crisp-recordstable-tag[data-tone="cyan"] { background: color-mix(in srgb, var(--crisp-bg-cyan) 18%, transparent); color: color-mix(in srgb, var(--crisp-bg-cyan) 82%, var(--crisp-fg-primary)); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-bg-cyan) 30%, transparent); }
|
|
52
52
|
.crisp-recordstable-tag[data-tone="orange"] { background: color-mix(in srgb, var(--crisp-bg-orange) 16%, transparent); color: color-mix(in srgb, var(--crisp-bg-orange) 82%, var(--crisp-fg-primary)); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-bg-orange) 30%, transparent); }
|
|
53
|
+
/* your-moon/crisp#998: Attio's own 12-colour tag palette (measured live,
|
|
54
|
+
see tokens/palette.ts's tagSwatch1 comment) -- flat black text, no
|
|
55
|
+
ring/border, unlike the tone family above. 7px radius/10px text are
|
|
56
|
+
measured literals, no matching step in the shared scale (same as
|
|
57
|
+
Select's own .crisp-select-swatch). */
|
|
58
|
+
.crisp-multiselect-swatch { display: inline-flex; align-items: center; height: var(--crisp-size-chip); padding: 0 var(--crisp-space-1); border-radius: 7px; font-size: 10px; font-weight: var(--crisp-weight-regular); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--crisp-fg-tag-swatch); }
|
|
59
|
+
.crisp-multiselect-swatch[data-swatch="1"] { background: var(--crisp-bg-tag-swatch1); }
|
|
60
|
+
.crisp-multiselect-swatch[data-swatch="2"] { background: var(--crisp-bg-tag-swatch2); }
|
|
61
|
+
.crisp-multiselect-swatch[data-swatch="3"] { background: var(--crisp-bg-tag-swatch3); }
|
|
62
|
+
.crisp-multiselect-swatch[data-swatch="4"] { background: var(--crisp-bg-tag-swatch4); }
|
|
63
|
+
.crisp-multiselect-swatch[data-swatch="5"] { background: var(--crisp-bg-tag-swatch5); }
|
|
64
|
+
.crisp-multiselect-swatch[data-swatch="6"] { background: var(--crisp-bg-tag-swatch6); }
|
|
65
|
+
.crisp-multiselect-swatch[data-swatch="7"] { background: var(--crisp-bg-tag-swatch7); }
|
|
66
|
+
.crisp-multiselect-swatch[data-swatch="8"] { background: var(--crisp-bg-tag-swatch8); }
|
|
67
|
+
.crisp-multiselect-swatch[data-swatch="9"] { background: var(--crisp-bg-tag-swatch9); }
|
|
68
|
+
.crisp-multiselect-swatch[data-swatch="10"] { background: var(--crisp-bg-tag-swatch10); }
|
|
69
|
+
.crisp-multiselect-swatch[data-swatch="11"] { background: var(--crisp-bg-tag-swatch11); }
|
|
70
|
+
.crisp-multiselect-swatch[data-swatch="12"] { background: var(--crisp-bg-tag-swatch12); }
|
|
53
71
|
|
|
54
72
|
.crisp-multiselect {
|
|
55
73
|
position: relative; display: inline-flex; width: 100%; font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
|
|
@@ -51,6 +51,24 @@
|
|
|
51
51
|
.crisp-recordstable-tag[data-tone="purple"] { background: color-mix(in srgb, var(--crisp-bg-purple) 16%, transparent); color: color-mix(in srgb, var(--crisp-bg-purple) 80%, var(--crisp-fg-primary)); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-bg-purple) 30%, transparent); }
|
|
52
52
|
.crisp-recordstable-tag[data-tone="cyan"] { background: color-mix(in srgb, var(--crisp-bg-cyan) 18%, transparent); color: color-mix(in srgb, var(--crisp-bg-cyan) 82%, var(--crisp-fg-primary)); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-bg-cyan) 30%, transparent); }
|
|
53
53
|
.crisp-recordstable-tag[data-tone="orange"] { background: color-mix(in srgb, var(--crisp-bg-orange) 16%, transparent); color: color-mix(in srgb, var(--crisp-bg-orange) 82%, var(--crisp-fg-primary)); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-bg-orange) 30%, transparent); }
|
|
54
|
+
/* your-moon/crisp#998: Attio's own 12-colour tag palette (measured live,
|
|
55
|
+
see tokens/palette.ts's tagSwatch1 comment) -- flat black text, no
|
|
56
|
+
ring/border, unlike the tone family above. 7px radius/10px text are
|
|
57
|
+
measured literals, no matching step in the shared scale (same as
|
|
58
|
+
Select's own .crisp-select-swatch). */
|
|
59
|
+
.crisp-multiselect-swatch { display: inline-flex; align-items: center; height: var(--crisp-size-chip); padding: 0 var(--crisp-space-1); border-radius: 7px; font-size: 10px; font-weight: var(--crisp-weight-regular); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--crisp-fg-tag-swatch); }
|
|
60
|
+
.crisp-multiselect-swatch[data-swatch="1"] { background: var(--crisp-bg-tag-swatch1); }
|
|
61
|
+
.crisp-multiselect-swatch[data-swatch="2"] { background: var(--crisp-bg-tag-swatch2); }
|
|
62
|
+
.crisp-multiselect-swatch[data-swatch="3"] { background: var(--crisp-bg-tag-swatch3); }
|
|
63
|
+
.crisp-multiselect-swatch[data-swatch="4"] { background: var(--crisp-bg-tag-swatch4); }
|
|
64
|
+
.crisp-multiselect-swatch[data-swatch="5"] { background: var(--crisp-bg-tag-swatch5); }
|
|
65
|
+
.crisp-multiselect-swatch[data-swatch="6"] { background: var(--crisp-bg-tag-swatch6); }
|
|
66
|
+
.crisp-multiselect-swatch[data-swatch="7"] { background: var(--crisp-bg-tag-swatch7); }
|
|
67
|
+
.crisp-multiselect-swatch[data-swatch="8"] { background: var(--crisp-bg-tag-swatch8); }
|
|
68
|
+
.crisp-multiselect-swatch[data-swatch="9"] { background: var(--crisp-bg-tag-swatch9); }
|
|
69
|
+
.crisp-multiselect-swatch[data-swatch="10"] { background: var(--crisp-bg-tag-swatch10); }
|
|
70
|
+
.crisp-multiselect-swatch[data-swatch="11"] { background: var(--crisp-bg-tag-swatch11); }
|
|
71
|
+
.crisp-multiselect-swatch[data-swatch="12"] { background: var(--crisp-bg-tag-swatch12); }
|
|
54
72
|
|
|
55
73
|
.crisp-multiselect {
|
|
56
74
|
position: relative; display: inline-flex; width: 100%; font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
|
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" | "bgBrandContrast" | "fgBrandContrast" | "fgOnBrand" | "fgOnTone" | "bgSurface" | "bgRaised" | "bgSurfaceMuted" | "borderDefault" | "borderSubtle" | "borderDropzone" | "borderDivider" | "ringNeutral" | "ringField" | "ringSwitch" | "bgTileActive" | "shadowTileActive" | "bgScrim" | "bgOverlayStrong" | "strokeGroupDivider" | "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" | "bgWarningSolid" | "bgOrange" | "bgCyan" | "bgPurple" | "bgSidebar" | "bgSubtle" | "fgBrandSoft" | "fgSuccessSoft" | "fgWarningSoft" | "fgDangerSoft" | "fgNeutralSoft" | "bgPurpleSoft" | "fgPurpleSoft" | "ringPurpleSoft" | "ringBrandSoft" | "fgSelectNeutral" | "bgSelectListbox" | "strokeSelectTrigger" | "bgSelectPressed" | "bgSelectDisabled" | "strokeSelectInvalid" | "strokeSelectDivider" | "fgSelectPlaceholder" | "shadowSelect", string>;
|
|
5
|
+
export type ColorTokens = Record<"bgBrandSolid" | "bgBrandSolidPressed" | "bgBrandContrast" | "fgBrandContrast" | "fgOnBrand" | "fgOnTone" | "bgSurface" | "bgRaised" | "bgSurfaceMuted" | "borderDefault" | "borderSubtle" | "borderDropzone" | "borderDivider" | "ringNeutral" | "ringField" | "ringSwitch" | "bgTileActive" | "shadowTileActive" | "bgScrim" | "bgOverlayStrong" | "strokeGroupDivider" | "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" | "bgWarningSolid" | "bgOrange" | "bgCyan" | "bgPurple" | "bgSidebar" | "bgSubtle" | "fgBrandSoft" | "fgSuccessSoft" | "fgWarningSoft" | "fgDangerSoft" | "fgNeutralSoft" | "bgPurpleSoft" | "fgPurpleSoft" | "ringPurpleSoft" | "ringBrandSoft" | "fgSelectNeutral" | "bgSelectListbox" | "strokeSelectTrigger" | "bgSelectPressed" | "bgSelectDisabled" | "strokeSelectInvalid" | "strokeSelectDivider" | "fgSelectPlaceholder" | "shadowSelect" | "bgTagSwatch1" | "bgTagSwatch2" | "bgTagSwatch3" | "bgTagSwatch4" | "bgTagSwatch5" | "bgTagSwatch6" | "bgTagSwatch7" | "bgTagSwatch8" | "bgTagSwatch9" | "bgTagSwatch10" | "bgTagSwatch11" | "bgTagSwatch12" | "fgTagSwatch", 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
|
@@ -73,7 +73,20 @@ export const tokens = {
|
|
|
73
73
|
"strokeSelectInvalid": "#fa342c",
|
|
74
74
|
"strokeSelectDivider": "#00000010",
|
|
75
75
|
"fgSelectPlaceholder": "#b0b3ba",
|
|
76
|
-
"shadowSelect": "#0000001f"
|
|
76
|
+
"shadowSelect": "#0000001f",
|
|
77
|
+
"bgTagSwatch1": "#fff3cc",
|
|
78
|
+
"bgTagSwatch2": "#f4fbcb",
|
|
79
|
+
"bgTagSwatch3": "#fdf7c4",
|
|
80
|
+
"bgTagSwatch4": "#feecf3",
|
|
81
|
+
"bgTagSwatch5": "#e0fced",
|
|
82
|
+
"bgTagSwatch6": "#ddf7ff",
|
|
83
|
+
"bgTagSwatch7": "#f6f7f7",
|
|
84
|
+
"bgTagSwatch8": "#ffebeb",
|
|
85
|
+
"bgTagSwatch9": "#feeee1",
|
|
86
|
+
"bgTagSwatch10": "#e5eeff",
|
|
87
|
+
"bgTagSwatch11": "#f5f0ff",
|
|
88
|
+
"bgTagSwatch12": "#fdedff",
|
|
89
|
+
"fgTagSwatch": "#000000"
|
|
77
90
|
},
|
|
78
91
|
"dark": {
|
|
79
92
|
"bgBrandSolid": "#0298d9",
|
|
@@ -145,7 +158,20 @@ export const tokens = {
|
|
|
145
158
|
"strokeSelectInvalid": "#ff6e60",
|
|
146
159
|
"strokeSelectDivider": "#ffffff17",
|
|
147
160
|
"fgSelectPlaceholder": "#868b94",
|
|
148
|
-
"shadowSelect": "#000000cc"
|
|
161
|
+
"shadowSelect": "#000000cc",
|
|
162
|
+
"bgTagSwatch1": "#fff3cc",
|
|
163
|
+
"bgTagSwatch2": "#f4fbcb",
|
|
164
|
+
"bgTagSwatch3": "#fdf7c4",
|
|
165
|
+
"bgTagSwatch4": "#feecf3",
|
|
166
|
+
"bgTagSwatch5": "#e0fced",
|
|
167
|
+
"bgTagSwatch6": "#ddf7ff",
|
|
168
|
+
"bgTagSwatch7": "#f6f7f7",
|
|
169
|
+
"bgTagSwatch8": "#ffebeb",
|
|
170
|
+
"bgTagSwatch9": "#feeee1",
|
|
171
|
+
"bgTagSwatch10": "#e5eeff",
|
|
172
|
+
"bgTagSwatch11": "#f5f0ff",
|
|
173
|
+
"bgTagSwatch12": "#fdedff",
|
|
174
|
+
"fgTagSwatch": "#000000"
|
|
149
175
|
}
|
|
150
176
|
},
|
|
151
177
|
"palette": {
|
|
@@ -215,7 +241,20 @@ export const tokens = {
|
|
|
215
241
|
"selectInvalidStroke": "#fa342c",
|
|
216
242
|
"selectDivider": "#00000010",
|
|
217
243
|
"selectPlaceholder": "#b0b3ba",
|
|
218
|
-
"selectShadow": "#0000001f"
|
|
244
|
+
"selectShadow": "#0000001f",
|
|
245
|
+
"tagSwatch1": "#fff3cc",
|
|
246
|
+
"tagSwatch2": "#f4fbcb",
|
|
247
|
+
"tagSwatch3": "#fdf7c4",
|
|
248
|
+
"tagSwatch4": "#feecf3",
|
|
249
|
+
"tagSwatch5": "#e0fced",
|
|
250
|
+
"tagSwatch6": "#ddf7ff",
|
|
251
|
+
"tagSwatch7": "#f6f7f7",
|
|
252
|
+
"tagSwatch8": "#ffebeb",
|
|
253
|
+
"tagSwatch9": "#feeee1",
|
|
254
|
+
"tagSwatch10": "#e5eeff",
|
|
255
|
+
"tagSwatch11": "#f5f0ff",
|
|
256
|
+
"tagSwatch12": "#fdedff",
|
|
257
|
+
"tagSwatchInk": "#000000"
|
|
219
258
|
},
|
|
220
259
|
"dark": {
|
|
221
260
|
"gray00": "#0a0a0a",
|
|
@@ -283,7 +322,20 @@ export const tokens = {
|
|
|
283
322
|
"selectInvalidStroke": "#ff6e60",
|
|
284
323
|
"selectDivider": "#ffffff17",
|
|
285
324
|
"selectPlaceholder": "#868b94",
|
|
286
|
-
"selectShadow": "#000000cc"
|
|
325
|
+
"selectShadow": "#000000cc",
|
|
326
|
+
"tagSwatch1": "#fff3cc",
|
|
327
|
+
"tagSwatch2": "#f4fbcb",
|
|
328
|
+
"tagSwatch3": "#fdf7c4",
|
|
329
|
+
"tagSwatch4": "#feecf3",
|
|
330
|
+
"tagSwatch5": "#e0fced",
|
|
331
|
+
"tagSwatch6": "#ddf7ff",
|
|
332
|
+
"tagSwatch7": "#f6f7f7",
|
|
333
|
+
"tagSwatch8": "#ffebeb",
|
|
334
|
+
"tagSwatch9": "#feeee1",
|
|
335
|
+
"tagSwatch10": "#e5eeff",
|
|
336
|
+
"tagSwatch11": "#f5f0ff",
|
|
337
|
+
"tagSwatch12": "#fdedff",
|
|
338
|
+
"tagSwatchInk": "#000000"
|
|
287
339
|
}
|
|
288
340
|
},
|
|
289
341
|
"space": {
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
.crisp-notesgallery {
|
|
2
|
+
display: flex; flex-direction: column; min-height: 0; box-sizing: border-box; font-family: var(--crisp-font-sans); color: var(--crisp-fg-primary); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
|
|
3
|
+
& .crisp-notesgallery-tabs { display: flex; align-items: center; gap: var(--crisp-space-2); height: 44px; flex-shrink: 0; padding: 0 var(--crisp-space-3); }
|
|
4
|
+
& .crisp-notesgallery-toolbar { display: flex; align-items: center; gap: var(--crisp-space-2); height: var(--crisp-size-header); flex-shrink: 0; padding: 0 var(--crisp-space-3); }
|
|
5
|
+
& .crisp-notesgallery-toolbar-trail { display: flex; align-items: center; gap: var(--crisp-space-2); margin-inline-start: auto; }
|
|
6
|
+
& .crisp-notesgallery-favorites-section { background: var(--crisp-bg-subtle); box-shadow: inset 0 -1px 0 var(--crisp-border-subtle); }
|
|
7
|
+
& .crisp-notesgallery-favorites-label { padding: var(--crisp-space-2) var(--crisp-space-4) 0; font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-muted); }
|
|
8
|
+
& .crisp-notesgallery-favorites { display: flex; align-items: center; justify-content: center; min-height: 200px; padding: var(--crisp-space-6); }
|
|
9
|
+
& .crisp-notesgallery-favorites-empty { box-sizing: border-box; width: 100%; padding: var(--crisp-space-6); border: 1px dashed var(--crisp-border-default); border-radius: var(--crisp-radius-xl); text-align: center; font-size: var(--crisp-text-md); color: var(--crisp-fg-muted); }
|
|
10
|
+
& .crisp-notesgallery-body { flex: 1; min-height: 0; overflow-y: auto; padding: 0 var(--crisp-space-3) var(--crisp-space-3); }
|
|
11
|
+
& .crisp-notesgallery-group { display: flex; align-items: center; gap: var(--crisp-space-1-5); height: var(--crisp-size-menuRow); padding: var(--crisp-space-2) var(--crisp-space-1); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-muted); }
|
|
12
|
+
& .crisp-notesgallery-group-count { display: inline-flex; align-items: center; justify-content: center; min-width: 16px; height: 16px; padding: 0 var(--crisp-space-1); border-radius: var(--crisp-radius-sm); background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); font-size: var(--crisp-text-xs); color: var(--crisp-fg-muted); }
|
|
13
|
+
& .crisp-notesgallery-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(340px, 1fr)); gap: var(--crisp-space-4); padding-bottom: var(--crisp-space-4); }
|
|
14
|
+
& .crisp-notesgallery-empty { padding: var(--crisp-space-8) var(--crisp-space-3); text-align: center; font-size: var(--crisp-text-md); color: var(--crisp-fg-muted); }
|
|
15
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
@layer crisp-components {
|
|
2
|
+
.crisp-notesgallery {
|
|
3
|
+
display: flex; flex-direction: column; min-height: 0; box-sizing: border-box; font-family: var(--crisp-font-sans); color: var(--crisp-fg-primary); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
|
|
4
|
+
& .crisp-notesgallery-tabs { display: flex; align-items: center; gap: var(--crisp-space-2); height: 44px; flex-shrink: 0; padding: 0 var(--crisp-space-3); }
|
|
5
|
+
& .crisp-notesgallery-toolbar { display: flex; align-items: center; gap: var(--crisp-space-2); height: var(--crisp-size-header); flex-shrink: 0; padding: 0 var(--crisp-space-3); }
|
|
6
|
+
& .crisp-notesgallery-toolbar-trail { display: flex; align-items: center; gap: var(--crisp-space-2); margin-inline-start: auto; }
|
|
7
|
+
& .crisp-notesgallery-favorites-section { background: var(--crisp-bg-subtle); box-shadow: inset 0 -1px 0 var(--crisp-border-subtle); }
|
|
8
|
+
& .crisp-notesgallery-favorites-label { padding: var(--crisp-space-2) var(--crisp-space-4) 0; font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-muted); }
|
|
9
|
+
& .crisp-notesgallery-favorites { display: flex; align-items: center; justify-content: center; min-height: 200px; padding: var(--crisp-space-6); }
|
|
10
|
+
& .crisp-notesgallery-favorites-empty { box-sizing: border-box; width: 100%; padding: var(--crisp-space-6); border: 1px dashed var(--crisp-border-default); border-radius: var(--crisp-radius-xl); text-align: center; font-size: var(--crisp-text-md); color: var(--crisp-fg-muted); }
|
|
11
|
+
& .crisp-notesgallery-body { flex: 1; min-height: 0; overflow-y: auto; padding: 0 var(--crisp-space-3) var(--crisp-space-3); }
|
|
12
|
+
& .crisp-notesgallery-group { display: flex; align-items: center; gap: var(--crisp-space-1-5); height: var(--crisp-size-menuRow); padding: var(--crisp-space-2) var(--crisp-space-1); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-muted); }
|
|
13
|
+
& .crisp-notesgallery-group-count { display: inline-flex; align-items: center; justify-content: center; min-width: 16px; height: 16px; padding: 0 var(--crisp-space-1); border-radius: var(--crisp-radius-sm); background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); font-size: var(--crisp-text-xs); color: var(--crisp-fg-muted); }
|
|
14
|
+
& .crisp-notesgallery-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(340px, 1fr)); gap: var(--crisp-space-4); padding-bottom: var(--crisp-space-4); }
|
|
15
|
+
& .crisp-notesgallery-empty { padding: var(--crisp-space-8) var(--crisp-space-3); text-align: center; font-size: var(--crisp-text-md); color: var(--crisp-fg-muted); }
|
|
16
|
+
}
|
|
17
|
+
}
|
package/dist/recordpage.css
CHANGED
|
@@ -101,6 +101,18 @@
|
|
|
101
101
|
the component's own comment) -- NOT `display: contents`, which
|
|
102
102
|
drops a button's accessible semantics in some engines. */
|
|
103
103
|
& .crisp-recordpage-edit-trigger { display: inline-flex; flex-wrap: wrap; align-items: center; gap: var(--crisp-space-1); margin: 0; padding: 0; border: none; background: none; text-align: start; font: inherit; color: inherit; cursor: pointer; }
|
|
104
|
+
/* #990: measured live on app.attio.com's URL/domain attribute (hover the
|
|
105
|
+
row) -- the link itself never carries the edit affordance, a
|
|
106
|
+
separate 20px button trails it, mounting only on hover: 16px icon,
|
|
107
|
+
rgba(0,0,0,0.55) (crisp's own color-mix(fgPrimary 55%) -- the exact
|
|
108
|
+
formula .crisp-datatable-entity-action's identical muted icon
|
|
109
|
+
already uses), 6px radius (radius.sm). Reveal is opacity-based,
|
|
110
|
+
not the mount/unmount Attio's own DOM does, so a keyboard user
|
|
111
|
+
tabbing to it (:focus-visible) doesn't need the row hovered first --
|
|
112
|
+
same mechanism DataTable's own row actions (#601) already use. */
|
|
113
|
+
& .crisp-recordpage-edit-affordance { display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; width: 20px; height: 20px; margin: 0; padding: 0; border: none; border-radius: var(--crisp-radius-sm); background: none; font-family: inherit; color: color-mix(in srgb, var(--crisp-fg-primary) 55%, transparent); cursor: pointer; opacity: 0; transition: opacity .12s, background-color .12s, color .12s; }
|
|
114
|
+
& .crisp-recordpage-field:hover .crisp-recordpage-edit-affordance, & .crisp-recordpage-edit-affordance:focus-visible { opacity: 1; }
|
|
115
|
+
& .crisp-recordpage-edit-affordance:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); color: var(--crisp-fg-primary); }
|
|
104
116
|
& .crisp-recordpage-empty { color: var(--crisp-fg-muted); }
|
|
105
117
|
/* #431: measured live on app.attio.com's record page Details column --
|
|
106
118
|
clicking a field's value opens a plain, borderless field exactly
|
|
@@ -225,6 +237,30 @@
|
|
|
225
237
|
& .crisp-recordstable-tag[data-tone="purple"] { background: color-mix(in srgb, var(--crisp-bg-purple) 16%, transparent); color: color-mix(in srgb, var(--crisp-bg-purple) 80%, var(--crisp-fg-primary)); }
|
|
226
238
|
& .crisp-recordstable-tag[data-tone="cyan"] { background: color-mix(in srgb, var(--crisp-bg-cyan) 18%, transparent); color: color-mix(in srgb, var(--crisp-bg-cyan) 82%, var(--crisp-fg-primary)); }
|
|
227
239
|
& .crisp-recordstable-tag[data-tone="orange"] { background: color-mix(in srgb, var(--crisp-bg-orange) 16%, transparent); color: color-mix(in srgb, var(--crisp-bg-orange) 82%, var(--crisp-fg-primary)); }
|
|
240
|
+
/* #620: the "Run workflow" quick action's own popover -- measured live:
|
|
241
|
+
a centered, top-anchored overlay sharing product/command's own
|
|
242
|
+
Cmd-K-palette shell exactly (elevation.modal, bgOverlayFrost 60% +
|
|
243
|
+
blur(15px), radius 2xl/xl outer/inner) -- duplicated here rather than
|
|
244
|
+
imported, the same "own copy per product surface" choice already
|
|
245
|
+
made elsewhere in this codebase (product/command sits outside this
|
|
246
|
+
lane's own product/recordpage ownership). */
|
|
247
|
+
& .crisp-recordpage-workflow-backdrop { position: fixed; inset: 0; z-index: 60; background: transparent; }
|
|
248
|
+
& .crisp-recordpage-workflow-positioner { position: fixed; inset: 0; z-index: 61; display: flex; align-items: flex-start; justify-content: center; padding: 15vh var(--crisp-space-4) var(--crisp-space-4); }
|
|
249
|
+
& .crisp-recordpage-workflow-content { position: relative; display: flex; flex-direction: column; box-sizing: border-box; width: 90vw; max-width: 808px; padding: var(--crisp-space-1); border-radius: var(--crisp-radius-2xl); background: color-mix(in srgb, var(--crisp-bg-overlay-frost) 60%, transparent); backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px); box-shadow: 0 8px 28px -6px var(--crisp-shadow-overlay1), 0 18px 88px -4px var(--crisp-shadow-overlay2), 0 0 1px var(--crisp-shadow-overlay3); opacity: 1; transform: scale(1); transition: opacity .2s ease, transform .2s ease; @starting-style { opacity: 0; transform: scale(0.97); } }
|
|
250
|
+
& .crisp-recordpage-workflow-card { display: flex; flex-direction: column; box-sizing: border-box; border-radius: var(--crisp-radius-xl); background: var(--crisp-bg-surface); overflow: hidden; }
|
|
251
|
+
& .crisp-recordpage-workflow-header { display: flex; align-items: center; gap: var(--crisp-space-2); height: 52px; flex-shrink: 0; padding: 0 var(--crisp-space-2) 0 var(--crisp-space-4); }
|
|
252
|
+
& .crisp-recordpage-workflow-title { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); letter-spacing: -0.07px; color: var(--crisp-fg-primary); }
|
|
253
|
+
& .crisp-recordpage-workflow-close { display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; width: 28px; height: 28px; margin: 0; padding: 0; border: none; border-radius: var(--crisp-radius-md); background: none; color: color-mix(in srgb, var(--crisp-fg-primary) 55%, transparent); font-family: inherit; cursor: pointer; transition: background-color .12s, color .12s; }
|
|
254
|
+
& .crisp-recordpage-workflow-close:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); color: var(--crisp-fg-primary); }
|
|
255
|
+
& .crisp-recordpage-workflow-search { display: flex; align-items: center; min-height: 52px; padding: var(--crisp-space-4); }
|
|
256
|
+
& .crisp-recordpage-workflow-input { flex: 1; min-width: 0; border: none; outline: none; background: transparent; font-family: inherit; font-size: var(--crisp-text-xl); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-primary); }
|
|
257
|
+
& .crisp-recordpage-workflow-input::placeholder { color: var(--crisp-fg-muted); }
|
|
258
|
+
& .crisp-recordpage-workflow-sep { height: 1px; flex-shrink: 0; background: var(--crisp-border-subtle); }
|
|
259
|
+
& .crisp-recordpage-workflow-empty { display: flex; flex-direction: column; align-items: center; gap: var(--crisp-space-2); padding: var(--crisp-space-6) var(--crisp-space-3); text-align: center; }
|
|
260
|
+
& .crisp-recordpage-workflow-create { display: inline-flex; align-items: center; gap: var(--crisp-space-1-5); height: 32px; padding: 0 var(--crisp-space-3); margin-top: var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-md); background: var(--crisp-bg-surface); box-shadow: inset 0 0 0 1px var(--crisp-ring-neutral), 0 0 2px rgba(28,40,64,0.18), 0 1px 3px rgba(0,0,0,0.04); font-family: inherit; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-primary); cursor: pointer; transition: background-color .12s; }
|
|
261
|
+
& .crisp-recordpage-workflow-create:hover { background: var(--crisp-bg-raised); }
|
|
262
|
+
& .crisp-recordpage-workflow-footer { display: flex; align-items: center; height: 44px; flex-shrink: 0; padding: 0 var(--crisp-space-2-5); border-top: 1px solid var(--crisp-border-subtle); }
|
|
263
|
+
& .crisp-recordpage-workflow-footer-nav { display: flex; align-items: center; gap: var(--crisp-space-1-5); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); }
|
|
228
264
|
}
|
|
229
265
|
|
|
230
266
|
@media (prefers-reduced-motion: reduce) {
|
|
@@ -102,6 +102,18 @@
|
|
|
102
102
|
the component's own comment) -- NOT `display: contents`, which
|
|
103
103
|
drops a button's accessible semantics in some engines. */
|
|
104
104
|
& .crisp-recordpage-edit-trigger { display: inline-flex; flex-wrap: wrap; align-items: center; gap: var(--crisp-space-1); margin: 0; padding: 0; border: none; background: none; text-align: start; font: inherit; color: inherit; cursor: pointer; }
|
|
105
|
+
/* #990: measured live on app.attio.com's URL/domain attribute (hover the
|
|
106
|
+
row) -- the link itself never carries the edit affordance, a
|
|
107
|
+
separate 20px button trails it, mounting only on hover: 16px icon,
|
|
108
|
+
rgba(0,0,0,0.55) (crisp's own color-mix(fgPrimary 55%) -- the exact
|
|
109
|
+
formula .crisp-datatable-entity-action's identical muted icon
|
|
110
|
+
already uses), 6px radius (radius.sm). Reveal is opacity-based,
|
|
111
|
+
not the mount/unmount Attio's own DOM does, so a keyboard user
|
|
112
|
+
tabbing to it (:focus-visible) doesn't need the row hovered first --
|
|
113
|
+
same mechanism DataTable's own row actions (#601) already use. */
|
|
114
|
+
& .crisp-recordpage-edit-affordance { display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; width: 20px; height: 20px; margin: 0; padding: 0; border: none; border-radius: var(--crisp-radius-sm); background: none; font-family: inherit; color: color-mix(in srgb, var(--crisp-fg-primary) 55%, transparent); cursor: pointer; opacity: 0; transition: opacity .12s, background-color .12s, color .12s; }
|
|
115
|
+
& .crisp-recordpage-field:hover .crisp-recordpage-edit-affordance, & .crisp-recordpage-edit-affordance:focus-visible { opacity: 1; }
|
|
116
|
+
& .crisp-recordpage-edit-affordance:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); color: var(--crisp-fg-primary); }
|
|
105
117
|
& .crisp-recordpage-empty { color: var(--crisp-fg-muted); }
|
|
106
118
|
/* #431: measured live on app.attio.com's record page Details column --
|
|
107
119
|
clicking a field's value opens a plain, borderless field exactly
|
|
@@ -226,6 +238,30 @@
|
|
|
226
238
|
& .crisp-recordstable-tag[data-tone="purple"] { background: color-mix(in srgb, var(--crisp-bg-purple) 16%, transparent); color: color-mix(in srgb, var(--crisp-bg-purple) 80%, var(--crisp-fg-primary)); }
|
|
227
239
|
& .crisp-recordstable-tag[data-tone="cyan"] { background: color-mix(in srgb, var(--crisp-bg-cyan) 18%, transparent); color: color-mix(in srgb, var(--crisp-bg-cyan) 82%, var(--crisp-fg-primary)); }
|
|
228
240
|
& .crisp-recordstable-tag[data-tone="orange"] { background: color-mix(in srgb, var(--crisp-bg-orange) 16%, transparent); color: color-mix(in srgb, var(--crisp-bg-orange) 82%, var(--crisp-fg-primary)); }
|
|
241
|
+
/* #620: the "Run workflow" quick action's own popover -- measured live:
|
|
242
|
+
a centered, top-anchored overlay sharing product/command's own
|
|
243
|
+
Cmd-K-palette shell exactly (elevation.modal, bgOverlayFrost 60% +
|
|
244
|
+
blur(15px), radius 2xl/xl outer/inner) -- duplicated here rather than
|
|
245
|
+
imported, the same "own copy per product surface" choice already
|
|
246
|
+
made elsewhere in this codebase (product/command sits outside this
|
|
247
|
+
lane's own product/recordpage ownership). */
|
|
248
|
+
& .crisp-recordpage-workflow-backdrop { position: fixed; inset: 0; z-index: 60; background: transparent; }
|
|
249
|
+
& .crisp-recordpage-workflow-positioner { position: fixed; inset: 0; z-index: 61; display: flex; align-items: flex-start; justify-content: center; padding: 15vh var(--crisp-space-4) var(--crisp-space-4); }
|
|
250
|
+
& .crisp-recordpage-workflow-content { position: relative; display: flex; flex-direction: column; box-sizing: border-box; width: 90vw; max-width: 808px; padding: var(--crisp-space-1); border-radius: var(--crisp-radius-2xl); background: color-mix(in srgb, var(--crisp-bg-overlay-frost) 60%, transparent); backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px); box-shadow: 0 8px 28px -6px var(--crisp-shadow-overlay1), 0 18px 88px -4px var(--crisp-shadow-overlay2), 0 0 1px var(--crisp-shadow-overlay3); opacity: 1; transform: scale(1); transition: opacity .2s ease, transform .2s ease; @starting-style { opacity: 0; transform: scale(0.97); } }
|
|
251
|
+
& .crisp-recordpage-workflow-card { display: flex; flex-direction: column; box-sizing: border-box; border-radius: var(--crisp-radius-xl); background: var(--crisp-bg-surface); overflow: hidden; }
|
|
252
|
+
& .crisp-recordpage-workflow-header { display: flex; align-items: center; gap: var(--crisp-space-2); height: 52px; flex-shrink: 0; padding: 0 var(--crisp-space-2) 0 var(--crisp-space-4); }
|
|
253
|
+
& .crisp-recordpage-workflow-title { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); letter-spacing: -0.07px; color: var(--crisp-fg-primary); }
|
|
254
|
+
& .crisp-recordpage-workflow-close { display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; width: 28px; height: 28px; margin: 0; padding: 0; border: none; border-radius: var(--crisp-radius-md); background: none; color: color-mix(in srgb, var(--crisp-fg-primary) 55%, transparent); font-family: inherit; cursor: pointer; transition: background-color .12s, color .12s; }
|
|
255
|
+
& .crisp-recordpage-workflow-close:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); color: var(--crisp-fg-primary); }
|
|
256
|
+
& .crisp-recordpage-workflow-search { display: flex; align-items: center; min-height: 52px; padding: var(--crisp-space-4); }
|
|
257
|
+
& .crisp-recordpage-workflow-input { flex: 1; min-width: 0; border: none; outline: none; background: transparent; font-family: inherit; font-size: var(--crisp-text-xl); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-primary); }
|
|
258
|
+
& .crisp-recordpage-workflow-input::placeholder { color: var(--crisp-fg-muted); }
|
|
259
|
+
& .crisp-recordpage-workflow-sep { height: 1px; flex-shrink: 0; background: var(--crisp-border-subtle); }
|
|
260
|
+
& .crisp-recordpage-workflow-empty { display: flex; flex-direction: column; align-items: center; gap: var(--crisp-space-2); padding: var(--crisp-space-6) var(--crisp-space-3); text-align: center; }
|
|
261
|
+
& .crisp-recordpage-workflow-create { display: inline-flex; align-items: center; gap: var(--crisp-space-1-5); height: 32px; padding: 0 var(--crisp-space-3); margin-top: var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-md); background: var(--crisp-bg-surface); box-shadow: inset 0 0 0 1px var(--crisp-ring-neutral), 0 0 2px rgba(28,40,64,0.18), 0 1px 3px rgba(0,0,0,0.04); font-family: inherit; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-primary); cursor: pointer; transition: background-color .12s; }
|
|
262
|
+
& .crisp-recordpage-workflow-create:hover { background: var(--crisp-bg-raised); }
|
|
263
|
+
& .crisp-recordpage-workflow-footer { display: flex; align-items: center; height: 44px; flex-shrink: 0; padding: 0 var(--crisp-space-2-5); border-top: 1px solid var(--crisp-border-subtle); }
|
|
264
|
+
& .crisp-recordpage-workflow-footer-nav { display: flex; align-items: center; gap: var(--crisp-space-1-5); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); }
|
|
229
265
|
}
|
|
230
266
|
|
|
231
267
|
@media (prefers-reduced-motion: reduce) {
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
.crisp-recordpicker {
|
|
2
|
+
display: flex; flex-direction: column; box-sizing: border-box; width: 350px; font-family: var(--crisp-font-sans);
|
|
3
|
+
& .crisp-recordpicker-search { display: flex; align-items: center; gap: var(--crisp-space-2); height: 36px; padding: 0 var(--crisp-space-3); color: var(--crisp-fg-muted); }
|
|
4
|
+
& .crisp-recordpicker-search svg { flex-shrink: 0; }
|
|
5
|
+
& .crisp-recordpicker-search-input { flex: 1; min-width: 0; border: none; outline: none; background: none; font-family: inherit; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); line-height: 20px; color: var(--crisp-fg-primary); }
|
|
6
|
+
& .crisp-recordpicker-search-input::placeholder { color: var(--crisp-fg-muted); }
|
|
7
|
+
& .crisp-recordpicker-loading { display: flex; align-items: center; justify-content: center; gap: 10px; padding: var(--crisp-space-8) var(--crisp-space-3); color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); line-height: 20px; }
|
|
8
|
+
& .crisp-recordpicker-empty { padding: var(--crisp-space-4) var(--crisp-space-3); text-align: center; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); }
|
|
9
|
+
& .crisp-recordpicker-list { display: flex; flex-direction: column; margin: 0; padding: var(--crisp-space-1); list-style: none; max-height: 280px; overflow-y: auto; }
|
|
10
|
+
& .crisp-recordpicker-option { display: flex; align-items: center; gap: var(--crisp-space-2); width: 100%; box-sizing: border-box; height: 32px; padding: 0 var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-md); background: none; font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); text-align: start; cursor: pointer; }
|
|
11
|
+
& .crisp-recordpicker-option svg { flex-shrink: 0; color: var(--crisp-fg-muted); }
|
|
12
|
+
& .crisp-recordpicker-option:hover, & .crisp-recordpicker-option[data-highlighted] { background: var(--crisp-bg-raised); }
|
|
13
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
@layer crisp-components {
|
|
2
|
+
.crisp-recordpicker {
|
|
3
|
+
display: flex; flex-direction: column; box-sizing: border-box; width: 350px; font-family: var(--crisp-font-sans);
|
|
4
|
+
& .crisp-recordpicker-search { display: flex; align-items: center; gap: var(--crisp-space-2); height: 36px; padding: 0 var(--crisp-space-3); color: var(--crisp-fg-muted); }
|
|
5
|
+
& .crisp-recordpicker-search svg { flex-shrink: 0; }
|
|
6
|
+
& .crisp-recordpicker-search-input { flex: 1; min-width: 0; border: none; outline: none; background: none; font-family: inherit; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); line-height: 20px; color: var(--crisp-fg-primary); }
|
|
7
|
+
& .crisp-recordpicker-search-input::placeholder { color: var(--crisp-fg-muted); }
|
|
8
|
+
& .crisp-recordpicker-loading { display: flex; align-items: center; justify-content: center; gap: 10px; padding: var(--crisp-space-8) var(--crisp-space-3); color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); line-height: 20px; }
|
|
9
|
+
& .crisp-recordpicker-empty { padding: var(--crisp-space-4) var(--crisp-space-3); text-align: center; font-size: var(--crisp-text-lg); font-weight: var(--crisp-weight-medium); color: color-mix(in srgb, var(--crisp-fg-primary) 63%, transparent); }
|
|
10
|
+
& .crisp-recordpicker-list { display: flex; flex-direction: column; margin: 0; padding: var(--crisp-space-1); list-style: none; max-height: 280px; overflow-y: auto; }
|
|
11
|
+
& .crisp-recordpicker-option { display: flex; align-items: center; gap: var(--crisp-space-2); width: 100%; box-sizing: border-box; height: 32px; padding: 0 var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-md); background: none; font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); text-align: start; cursor: pointer; }
|
|
12
|
+
& .crisp-recordpicker-option svg { flex-shrink: 0; color: var(--crisp-fg-muted); }
|
|
13
|
+
& .crisp-recordpicker-option:hover, & .crisp-recordpicker-option[data-highlighted] { background: var(--crisp-bg-raised); }
|
|
14
|
+
}
|
|
15
|
+
}
|