@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.
Files changed (169) hide show
  1. package/dist/assigneepicker.css +13 -0
  2. package/dist/assigneepicker.d.ts +7 -0
  3. package/dist/assigneepicker.layered.css +15 -0
  4. package/dist/button.css +1 -1
  5. package/dist/button.layered.css +1 -1
  6. package/dist/cjs/components/button/button.recipe.js +15 -10
  7. package/dist/cjs/components/datatable/datatable.js +6 -3
  8. package/dist/cjs/components/datatable/datatable.recipe.js +35 -2
  9. package/dist/cjs/components/menu/menu.js +48 -8
  10. package/dist/cjs/components/multiselect/multiselect.js +3 -0
  11. package/dist/cjs/components/multiselect/multiselect.recipe.js +18 -0
  12. package/dist/cjs/components/select/select.js +2 -2
  13. package/dist/cjs/components/select/select.recipe.js +19 -0
  14. package/dist/cjs/core/index.js +2 -1
  15. package/dist/cjs/core/place-floating.js +38 -0
  16. package/dist/cjs/index.js +8 -0
  17. package/dist/cjs/product/assigneepicker/assigneepicker.js +127 -0
  18. package/dist/cjs/product/assigneepicker/assigneepicker.recipe.js +36 -0
  19. package/dist/cjs/product/assigneepicker/index.js +7 -0
  20. package/dist/cjs/product/notesgallery/index.js +7 -0
  21. package/dist/cjs/product/notesgallery/notesgallery.js +80 -0
  22. package/dist/cjs/product/notesgallery/notesgallery.recipe.js +46 -0
  23. package/dist/cjs/product/objectpagemenu/index.js +17 -0
  24. package/dist/cjs/product/objectpagemenu/objectpagemenu.js +26 -0
  25. package/dist/cjs/product/objectpagemenu/objectpagemenu.recipe.js +30 -0
  26. package/dist/cjs/product/objectsettings/objectsettings.js +107 -14
  27. package/dist/cjs/product/recordpage/recordpage.js +64 -5
  28. package/dist/cjs/product/recordpage/recordpage.recipe.js +38 -0
  29. package/dist/cjs/product/recordpicker/index.js +7 -0
  30. package/dist/cjs/product/recordpicker/recordpicker.js +100 -0
  31. package/dist/cjs/product/recordpicker/recordpicker.recipe.js +36 -0
  32. package/dist/cjs/product/savedviews/index.js +2 -1
  33. package/dist/cjs/product/savedviews/savedviews.js +22 -0
  34. package/dist/cjs/product/savedviews/savedviews.recipe.js +47 -0
  35. package/dist/cjs/product/share/index.js +7 -0
  36. package/dist/cjs/product/share/share.js +179 -0
  37. package/dist/cjs/product/share/share.recipe.js +114 -0
  38. package/dist/cjs/product/shortcutssheet/index.js +17 -0
  39. package/dist/cjs/product/shortcutssheet/shortcutssheet.js +125 -0
  40. package/dist/cjs/product/shortcutssheet/shortcutssheet.recipe.js +50 -0
  41. package/dist/cjs/product/taskeditpopover/index.js +7 -0
  42. package/dist/cjs/product/taskeditpopover/taskeditpopover.js +159 -0
  43. package/dist/cjs/product/taskeditpopover/taskeditpopover.recipe.js +68 -0
  44. package/dist/cjs/product/workspaceswitchermenu/index.js +17 -0
  45. package/dist/cjs/product/workspaceswitchermenu/workspaceswitchermenu.js +38 -0
  46. package/dist/cjs/product/workspaceswitchermenu/workspaceswitchermenu.recipe.js +34 -0
  47. package/dist/cjs/tokens/palette.js +27 -0
  48. package/dist/cjs/tokens/semantic.js +20 -0
  49. package/dist/datatable.css +40 -7
  50. package/dist/datatable.layered.css +40 -7
  51. package/dist/esm/components/button/button.recipe.js +15 -10
  52. package/dist/esm/components/datatable/datatable.js +6 -3
  53. package/dist/esm/components/datatable/datatable.recipe.js +35 -2
  54. package/dist/esm/components/menu/menu.js +47 -7
  55. package/dist/esm/components/multiselect/multiselect.js +3 -0
  56. package/dist/esm/components/multiselect/multiselect.recipe.js +18 -0
  57. package/dist/esm/components/select/select.js +2 -2
  58. package/dist/esm/components/select/select.recipe.js +19 -0
  59. package/dist/esm/core/index.js +1 -1
  60. package/dist/esm/core/place-floating.js +37 -0
  61. package/dist/esm/index.js +8 -0
  62. package/dist/esm/product/assigneepicker/assigneepicker.js +91 -0
  63. package/dist/esm/product/assigneepicker/assigneepicker.recipe.js +33 -0
  64. package/dist/esm/product/assigneepicker/index.js +2 -0
  65. package/dist/esm/product/notesgallery/index.js +2 -0
  66. package/dist/esm/product/notesgallery/notesgallery.js +44 -0
  67. package/dist/esm/product/notesgallery/notesgallery.recipe.js +43 -0
  68. package/dist/esm/product/objectpagemenu/index.js +1 -0
  69. package/dist/esm/product/objectpagemenu/objectpagemenu.js +23 -0
  70. package/dist/esm/product/objectpagemenu/objectpagemenu.recipe.js +27 -0
  71. package/dist/esm/product/objectsettings/objectsettings.js +106 -13
  72. package/dist/esm/product/recordpage/recordpage.js +64 -5
  73. package/dist/esm/product/recordpage/recordpage.recipe.js +38 -0
  74. package/dist/esm/product/recordpicker/index.js +2 -0
  75. package/dist/esm/product/recordpicker/recordpicker.js +64 -0
  76. package/dist/esm/product/recordpicker/recordpicker.recipe.js +33 -0
  77. package/dist/esm/product/savedviews/index.js +1 -1
  78. package/dist/esm/product/savedviews/savedviews.js +22 -1
  79. package/dist/esm/product/savedviews/savedviews.recipe.js +47 -0
  80. package/dist/esm/product/share/index.js +2 -0
  81. package/dist/esm/product/share/share.js +143 -0
  82. package/dist/esm/product/share/share.recipe.js +111 -0
  83. package/dist/esm/product/shortcutssheet/index.js +1 -0
  84. package/dist/esm/product/shortcutssheet/shortcutssheet.js +88 -0
  85. package/dist/esm/product/shortcutssheet/shortcutssheet.recipe.js +47 -0
  86. package/dist/esm/product/taskeditpopover/index.js +2 -0
  87. package/dist/esm/product/taskeditpopover/taskeditpopover.js +123 -0
  88. package/dist/esm/product/taskeditpopover/taskeditpopover.recipe.js +65 -0
  89. package/dist/esm/product/workspaceswitchermenu/index.js +1 -0
  90. package/dist/esm/product/workspaceswitchermenu/workspaceswitchermenu.js +35 -0
  91. package/dist/esm/product/workspaceswitchermenu/workspaceswitchermenu.recipe.js +31 -0
  92. package/dist/esm/tokens/palette.js +27 -0
  93. package/dist/esm/tokens/semantic.js +20 -0
  94. package/dist/multiselect.css +18 -0
  95. package/dist/multiselect.layered.css +18 -0
  96. package/dist/native/tokens.d.ts +1 -1
  97. package/dist/native/tokens.js +56 -4
  98. package/dist/notesgallery.css +15 -0
  99. package/dist/notesgallery.d.ts +7 -0
  100. package/dist/notesgallery.layered.css +17 -0
  101. package/dist/objectpagemenu.css +3 -0
  102. package/dist/objectpagemenu.d.ts +7 -0
  103. package/dist/objectpagemenu.layered.css +5 -0
  104. package/dist/recordpage.css +36 -0
  105. package/dist/recordpage.layered.css +36 -0
  106. package/dist/recordpicker.css +13 -0
  107. package/dist/recordpicker.d.ts +7 -0
  108. package/dist/recordpicker.layered.css +15 -0
  109. package/dist/savedviews.css +47 -0
  110. package/dist/savedviews.layered.css +47 -0
  111. package/dist/select.css +19 -0
  112. package/dist/select.layered.css +19 -0
  113. package/dist/share.css +84 -0
  114. package/dist/share.d.ts +7 -0
  115. package/dist/share.layered.css +86 -0
  116. package/dist/shortcutssheet.css +24 -0
  117. package/dist/shortcutssheet.d.ts +7 -0
  118. package/dist/shortcutssheet.layered.css +26 -0
  119. package/dist/styles.css +387 -8
  120. package/dist/styles.layered.css +387 -8
  121. package/dist/taskeditpopover.css +36 -0
  122. package/dist/taskeditpopover.d.ts +7 -0
  123. package/dist/taskeditpopover.layered.css +38 -0
  124. package/dist/tokens.css +26 -0
  125. package/dist/tokens.json +56 -4
  126. package/dist/types/components/button/button.recipe.d.ts +2 -3
  127. package/dist/types/components/datatable/datatable.d.ts +8 -0
  128. package/dist/types/components/menu/menu.d.ts +50 -7
  129. package/dist/types/components/multiselect/multiselect.d.ts +9 -0
  130. package/dist/types/components/select/select.d.ts +10 -0
  131. package/dist/types/core/index.d.ts +1 -1
  132. package/dist/types/core/place-floating.d.ts +37 -0
  133. package/dist/types/index.d.ts +8 -0
  134. package/dist/types/product/assigneepicker/assigneepicker.d.ts +36 -0
  135. package/dist/types/product/assigneepicker/assigneepicker.recipe.d.ts +3 -0
  136. package/dist/types/product/assigneepicker/index.d.ts +2 -0
  137. package/dist/types/product/notesgallery/index.d.ts +2 -0
  138. package/dist/types/product/notesgallery/notesgallery.d.ts +54 -0
  139. package/dist/types/product/notesgallery/notesgallery.recipe.d.ts +3 -0
  140. package/dist/types/product/objectpagemenu/index.d.ts +1 -0
  141. package/dist/types/product/objectpagemenu/objectpagemenu.d.ts +40 -0
  142. package/dist/types/product/objectpagemenu/objectpagemenu.recipe.d.ts +17 -0
  143. package/dist/types/product/objectsettings/objectsettings.d.ts +71 -15
  144. package/dist/types/product/recordpage/index.d.ts +1 -1
  145. package/dist/types/product/recordpage/recordpage.d.ts +96 -1
  146. package/dist/types/product/recordpicker/index.d.ts +2 -0
  147. package/dist/types/product/recordpicker/recordpicker.d.ts +38 -0
  148. package/dist/types/product/recordpicker/recordpicker.recipe.d.ts +3 -0
  149. package/dist/types/product/savedviews/index.d.ts +1 -1
  150. package/dist/types/product/savedviews/savedviews.d.ts +36 -0
  151. package/dist/types/product/share/index.d.ts +2 -0
  152. package/dist/types/product/share/share.d.ts +85 -0
  153. package/dist/types/product/share/share.recipe.d.ts +3 -0
  154. package/dist/types/product/shortcutssheet/index.d.ts +1 -0
  155. package/dist/types/product/shortcutssheet/shortcutssheet.d.ts +49 -0
  156. package/dist/types/product/shortcutssheet/shortcutssheet.recipe.d.ts +3 -0
  157. package/dist/types/product/taskeditpopover/index.d.ts +2 -0
  158. package/dist/types/product/taskeditpopover/taskeditpopover.d.ts +67 -0
  159. package/dist/types/product/taskeditpopover/taskeditpopover.recipe.d.ts +3 -0
  160. package/dist/types/product/workspaceswitchermenu/index.d.ts +1 -0
  161. package/dist/types/product/workspaceswitchermenu/workspaceswitchermenu.d.ts +54 -0
  162. package/dist/types/product/workspaceswitchermenu/workspaceswitchermenu.recipe.d.ts +19 -0
  163. package/dist/types/tokens/contract.d.ts +13 -0
  164. package/dist/types/tokens/palette.d.ts +52 -0
  165. package/dist/types/tokens/semantic.d.ts +20 -0
  166. package/dist/workspaceswitchermenu.css +4 -0
  167. package/dist/workspaceswitchermenu.d.ts +7 -0
  168. package/dist/workspaceswitchermenu.layered.css +6 -0
  169. 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
  };
@@ -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;
@@ -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>>;
@@ -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,7 @@
1
+ import type { RecipeFn } from "../core/types";
2
+
3
+ export interface NotesgalleryVariants {
4
+
5
+ }
6
+
7
+ export declare const notesgalleryRecipe: RecipeFn<{ }>;
@@ -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
+ }
@@ -0,0 +1,3 @@
1
+
2
+ [dir="rtl"] .crisp-menu-item svg[data-rtl-flip] { transform: scaleX(-1); }
3
+
@@ -0,0 +1,7 @@
1
+ import type { RecipeFn } from "../core/types";
2
+
3
+ export interface ObjectpagemenuVariants {
4
+
5
+ }
6
+
7
+ export declare const objectpagemenuRecipe: RecipeFn<{ }>;
@@ -0,0 +1,5 @@
1
+ @layer crisp-components {
2
+
3
+ [dir="rtl"] .crisp-menu-item svg[data-rtl-flip] { transform: scaleX(-1); }
4
+
5
+ }
@@ -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,7 @@
1
+ import type { RecipeFn } from "../core/types";
2
+
3
+ export interface RecordpickerVariants {
4
+
5
+ }
6
+
7
+ export declare const recordpickerRecipe: RecipeFn<{ }>;
@@ -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
+ }