@crisp-ui-kit/crisp 0.31.4 → 0.31.6

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 (130) hide show
  1. package/dist/authshell.css +1 -1
  2. package/dist/cjs/components/accordion/accordion.recipe.js +1 -1
  3. package/dist/cjs/components/barchart/barchart.recipe.js +1 -1
  4. package/dist/cjs/components/breadcrumb/breadcrumb.recipe.js +1 -1
  5. package/dist/cjs/components/bulkbar/bulkbar.recipe.js +1 -1
  6. package/dist/cjs/components/callout/callout.recipe.js +1 -1
  7. package/dist/cjs/components/checkbox/checkbox.recipe.js +1 -1
  8. package/dist/cjs/components/columncalc/columncalc.recipe.js +2 -2
  9. package/dist/cjs/components/datatable/datatable.recipe.js +5 -5
  10. package/dist/cjs/components/datepicker/datepicker.recipe.js +3 -3
  11. package/dist/cjs/components/datepickerfield/datepickerfield.recipe.js +2 -2
  12. package/dist/cjs/components/dialog/dialog.recipe.js +1 -1
  13. package/dist/cjs/components/donutchart/donutchart.recipe.js +1 -1
  14. package/dist/cjs/components/emptystate/emptystate.recipe.js +2 -2
  15. package/dist/cjs/components/fileupload/fileupload.recipe.js +6 -6
  16. package/dist/cjs/components/formfield/formfield.recipe.js +1 -1
  17. package/dist/cjs/components/input/input.recipe.js +1 -1
  18. package/dist/cjs/components/linechart/linechart.recipe.js +1 -1
  19. package/dist/cjs/components/menu/menu.recipe.js +2 -2
  20. package/dist/cjs/components/multiselect/multiselect.recipe.js +1 -1
  21. package/dist/cjs/components/progress/progress.recipe.js +1 -1
  22. package/dist/cjs/components/quantitypicker/quantitypicker.recipe.js +2 -2
  23. package/dist/cjs/components/radiogroup/radiogroup.recipe.js +1 -1
  24. package/dist/cjs/components/resizablepanel/resizablepanel.recipe.js +2 -2
  25. package/dist/cjs/components/segmented/segmented.recipe.js +1 -1
  26. package/dist/cjs/components/select/select.recipe.js +2 -2
  27. package/dist/cjs/components/slider/slider.recipe.js +2 -2
  28. package/dist/cjs/components/stagebar/stagebar.recipe.js +1 -1
  29. package/dist/cjs/components/statcard/statcard.recipe.js +2 -2
  30. package/dist/cjs/components/switch/switch.recipe.js +1 -1
  31. package/dist/cjs/components/table/table.recipe.js +1 -1
  32. package/dist/cjs/components/tabletoolbar/tabletoolbar.chrome.js +2 -2
  33. package/dist/cjs/components/tabletoolbar/tabletoolbar.recipe.js +1 -1
  34. package/dist/cjs/components/tabs/tabs.recipe.js +1 -1
  35. package/dist/cjs/components/textarea/textarea.recipe.js +1 -1
  36. package/dist/cjs/components/tooltip/tooltip.recipe.js +1 -1
  37. package/dist/cjs/core/dialog-description.js +1 -1
  38. package/dist/cjs/index.js +1 -1
  39. package/dist/cjs/product/appshell/appshell.recipe.js +1 -1
  40. package/dist/cjs/product/authshell/authshell.recipe.js +3 -3
  41. package/dist/cjs/product/board/board.recipe.js +1 -1
  42. package/dist/cjs/product/entitycard/entitycard.recipe.js +1 -1
  43. package/dist/cjs/product/flowcanvas/flowcanvas.recipe.js +1 -1
  44. package/dist/cjs/product/inbox/inbox.recipe.js +1 -1
  45. package/dist/cjs/product/listpage/listpage.recipe.js +1 -1
  46. package/dist/cjs/product/onboarding/onboarding.recipe.js +1 -1
  47. package/dist/cjs/product/recordpage/recordpage.recipe.js +2 -2
  48. package/dist/cjs/product/recordpanel/recordpanel.recipe.js +1 -1
  49. package/dist/cjs/product/recordstable/recordstable.recipe.js +2 -2
  50. package/dist/cjs/product/recordstable/recordstable.tag.js +1 -1
  51. package/dist/cjs/product/richtext/richtext.recipe.js +1 -1
  52. package/dist/cjs/product/settingssection/settingssection.recipe.js +1 -1
  53. package/dist/cjs/product/settingsshell/settingsshell.recipe.js +2 -2
  54. package/dist/cjs/product/tasklist/tasklist.recipe.js +1 -1
  55. package/dist/cjs/product/trialbanner/trialbanner.recipe.js +2 -2
  56. package/dist/cjs/product/viewtoggle/viewtoggle.recipe.js +1 -1
  57. package/dist/cjs/tokens/elevation.js +4 -4
  58. package/dist/cjs/tokens/palette.js +2 -2
  59. package/dist/cjs/tokens/scale.js +6 -6
  60. package/dist/cjs/tokens/semantic.js +1 -1
  61. package/dist/columncalc.css +1 -1
  62. package/dist/datatable.css +5 -5
  63. package/dist/esm/components/accordion/accordion.recipe.js +1 -1
  64. package/dist/esm/components/barchart/barchart.recipe.js +1 -1
  65. package/dist/esm/components/breadcrumb/breadcrumb.recipe.js +1 -1
  66. package/dist/esm/components/bulkbar/bulkbar.recipe.js +1 -1
  67. package/dist/esm/components/callout/callout.recipe.js +1 -1
  68. package/dist/esm/components/checkbox/checkbox.recipe.js +1 -1
  69. package/dist/esm/components/columncalc/columncalc.recipe.js +2 -2
  70. package/dist/esm/components/datatable/datatable.recipe.js +5 -5
  71. package/dist/esm/components/datepicker/datepicker.recipe.js +3 -3
  72. package/dist/esm/components/datepickerfield/datepickerfield.recipe.js +2 -2
  73. package/dist/esm/components/dialog/dialog.recipe.js +1 -1
  74. package/dist/esm/components/donutchart/donutchart.recipe.js +1 -1
  75. package/dist/esm/components/emptystate/emptystate.recipe.js +2 -2
  76. package/dist/esm/components/fileupload/fileupload.recipe.js +6 -6
  77. package/dist/esm/components/formfield/formfield.recipe.js +1 -1
  78. package/dist/esm/components/input/input.recipe.js +1 -1
  79. package/dist/esm/components/linechart/linechart.recipe.js +1 -1
  80. package/dist/esm/components/menu/menu.recipe.js +2 -2
  81. package/dist/esm/components/multiselect/multiselect.recipe.js +1 -1
  82. package/dist/esm/components/progress/progress.recipe.js +1 -1
  83. package/dist/esm/components/quantitypicker/quantitypicker.recipe.js +2 -2
  84. package/dist/esm/components/radiogroup/radiogroup.recipe.js +1 -1
  85. package/dist/esm/components/resizablepanel/resizablepanel.recipe.js +2 -2
  86. package/dist/esm/components/segmented/segmented.recipe.js +1 -1
  87. package/dist/esm/components/select/select.recipe.js +2 -2
  88. package/dist/esm/components/slider/slider.recipe.js +2 -2
  89. package/dist/esm/components/stagebar/stagebar.recipe.js +1 -1
  90. package/dist/esm/components/statcard/statcard.recipe.js +2 -2
  91. package/dist/esm/components/switch/switch.recipe.js +1 -1
  92. package/dist/esm/components/table/table.recipe.js +1 -1
  93. package/dist/esm/components/tabletoolbar/tabletoolbar.chrome.js +2 -2
  94. package/dist/esm/components/tabletoolbar/tabletoolbar.recipe.js +1 -1
  95. package/dist/esm/components/tabs/tabs.recipe.js +1 -1
  96. package/dist/esm/components/textarea/textarea.recipe.js +1 -1
  97. package/dist/esm/components/tooltip/tooltip.recipe.js +1 -1
  98. package/dist/esm/core/dialog-description.js +1 -1
  99. package/dist/esm/index.js +1 -1
  100. package/dist/esm/product/appshell/appshell.recipe.js +1 -1
  101. package/dist/esm/product/authshell/authshell.recipe.js +3 -3
  102. package/dist/esm/product/board/board.recipe.js +1 -1
  103. package/dist/esm/product/entitycard/entitycard.recipe.js +1 -1
  104. package/dist/esm/product/flowcanvas/flowcanvas.recipe.js +1 -1
  105. package/dist/esm/product/inbox/inbox.recipe.js +1 -1
  106. package/dist/esm/product/listpage/listpage.recipe.js +1 -1
  107. package/dist/esm/product/onboarding/onboarding.recipe.js +1 -1
  108. package/dist/esm/product/recordpage/recordpage.recipe.js +2 -2
  109. package/dist/esm/product/recordpanel/recordpanel.recipe.js +1 -1
  110. package/dist/esm/product/recordstable/recordstable.recipe.js +2 -2
  111. package/dist/esm/product/recordstable/recordstable.tag.js +1 -1
  112. package/dist/esm/product/richtext/richtext.recipe.js +1 -1
  113. package/dist/esm/product/settingssection/settingssection.recipe.js +1 -1
  114. package/dist/esm/product/settingsshell/settingsshell.recipe.js +2 -2
  115. package/dist/esm/product/tasklist/tasklist.recipe.js +1 -1
  116. package/dist/esm/product/trialbanner/trialbanner.recipe.js +2 -2
  117. package/dist/esm/product/viewtoggle/viewtoggle.recipe.js +1 -1
  118. package/dist/esm/tokens/elevation.js +4 -4
  119. package/dist/esm/tokens/palette.js +2 -2
  120. package/dist/esm/tokens/scale.js +6 -6
  121. package/dist/esm/tokens/semantic.js +1 -1
  122. package/dist/fileupload.css +2 -2
  123. package/dist/recordpage.css +1 -1
  124. package/dist/recordstable.css +1 -1
  125. package/dist/settingsshell.css +1 -1
  126. package/dist/styles.css +12 -12
  127. package/dist/types/core/dialog-description.d.ts +1 -1
  128. package/dist/types/product/recordstable/recordstable.tag.d.ts +1 -1
  129. package/dist/types/tokens/elevation.d.ts +4 -4
  130. package/package.json +1 -1
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.onboardingRecipe = void 0;
4
4
  const core_1 = require("../../core");
5
5
  const tokens_1 = require("../../tokens");
6
- // An onboarding checklist card — measured from Attio's floating "Getting started"
6
+ // An onboarding checklist card — measured from a floating "Getting started"
7
7
  // widget: a title + menu/minimize header, a "N/total steps" subtitle, a
8
8
  // segmented progress bar (filled pills brand, rest 4% ink), then step rows with
9
9
  // an icon + label; completed rows strike through and show a brand check.
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.recordpageRecipe = void 0;
4
4
  const core_1 = require("../../core");
5
5
  const tokens_1 = require("../../tokens");
6
- // The full-page company record view Attio opens when you click into a record —
6
+ // The full-page company record view opened when you click into a record —
7
7
  // measured from the live app. A slim top bar (breadcrumb · logo · name 16/600 ·
8
8
  // actions), then a two-column body: a 320px left "Record Details" attribute
9
9
  // column (transparent, border-right) and a flexible main area whose tab bar
@@ -53,7 +53,7 @@ const config = (0, core_1.defineRecipe)({
53
53
  & .recordpage-section { padding-top: ${tokens_1.contract.space["2"]}; }
54
54
  & .recordpage-section-title { font-size: ${tokens_1.contract.text.sm}; font-weight: ${tokens_1.contract.weight.medium}; letter-spacing: -0.12px; color: color-mix(in srgb, ${tokens_1.contract.fgPrimary} 63%, transparent); padding: ${tokens_1.contract.space["1"]}; }
55
55
  /* main-area section headers (Highlights / Activity / Emails / Notes / Tasks)
56
- are 14px in Attio; the left column's (Record Details / Lists) stay 12px. */
56
+ are 14px; the left column's (Record Details / Lists) stay 12px. */
57
57
  & .recordpage-main .recordpage-section-title { font-size: ${tokens_1.contract.text.lg}; }
58
58
  & .recordpage-detailhead { display: flex; align-items: center; gap: ${tokens_1.contract.space["0.5"]}; margin-bottom: ${tokens_1.contract.space["3"]}; padding-inline-end: ${tokens_1.contract.space["0.5"]}; }
59
59
  & .recordpage-collapse { display: inline-flex; align-items: center; gap: 2px; flex: 1; min-width: 0; margin: 0; border: none; background: none; padding: ${tokens_1.contract.space["1"]}; border-radius: ${tokens_1.contract.radius.md}; font-family: inherit; font-size: ${tokens_1.contract.text.sm}; font-weight: ${tokens_1.contract.weight.medium}; letter-spacing: -0.12px; color: ${tokens_1.contract.fgMuted}; cursor: pointer; text-align: start; }
@@ -5,7 +5,7 @@ const core_1 = require("../../core");
5
5
  const tokens_1 = require("../../tokens");
6
6
  const recordstable_tag_1 = require("../recordstable/recordstable.tag");
7
7
  // A right-side record peek panel — slides in over the main content to show one
8
- // record's fields, the way Attio opens a row. Positioned absolutely inside a
8
+ // record's fields, the way a row peek panel opens. Positioned absolutely inside a
9
9
  // relative container (the app main area); slides in via @starting-style.
10
10
  const config = (0, core_1.defineRecipe)({
11
11
  name: "recordpanel",
@@ -5,7 +5,7 @@ const tabletoolbar_chrome_1 = require("../../components/tabletoolbar/tabletoolba
5
5
  const core_1 = require("../../core");
6
6
  const tokens_1 = require("../../tokens");
7
7
  const recordstable_tag_1 = require("./recordstable.tag");
8
- // Attio's record grid, measured: 36px rows, 1px borderSubtle (#eeeff1) grid
8
+ // A record grid, measured: 36px rows, 1px borderSubtle (#eeeff1) grid
9
9
  // lines on BOTH axes, sticky checkbox + entity (first) columns, entity = 16px
10
10
  // avatar + 14px/500 name, 28px toolbar controls, a floating bulk-action bar.
11
11
  //
@@ -115,7 +115,7 @@ ${(0, tabletoolbar_chrome_1.toolbarChromeBody)("recordstable")}
115
115
  /* box-shadow has no logical form either: the bleed follows the scrolled
116
116
  content, which is the opposite side under RTL. */
117
117
  [dir="rtl"] & .recordstable-scroll[data-scrolled] .recordstable-col-entity { box-shadow: -6px 0 16px 4px rgba(0,0,0,0.12); }
118
- /* AI-enriched values carry a purple wash. Measured from Attio:
118
+ /* AI-enriched values carry a purple wash. Measured live:
119
119
  a full-bleed overlay at #9b69ff 4% (== bgPurple), composited OVER
120
120
  whatever row-state background the cell already has, which is why it
121
121
  is an ::after and not a background. */
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.recordTagCss = void 0;
4
4
  const tokens_1 = require("../../tokens");
5
5
  /**
6
- * The record tag/chip, measured from Attio: 22px tall, `padding: 0 4px`,
6
+ * The record tag/chip, measured live: 22px tall, `padding: 0 4px`,
7
7
  * `border-radius: ${c.radius.chip}`, 14px/20px at weight 500, and a 1px inset ring in the
8
8
  * tone's colour.
9
9
  *
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.richtextRecipe = void 0;
4
4
  const core_1 = require("../../core");
5
5
  const tokens_1 = require("../../tokens");
6
- // A block rich-text editor — measured from Attio's Notes editor: a large 32/36
6
+ // A block rich-text editor — measured from a Notes editor: a large 32/36
7
7
  // title, a 14/20 prose body (headings, lists, quote, code, marks, links), and a
8
8
  // floating selection toolbar. Built on contentEditable so it stays dependency-
9
9
  // free. Placeholders show via [data-empty]::before.
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.settingssectionRecipe = void 0;
4
4
  const core_1 = require("../../core");
5
5
  const tokens_1 = require("../../tokens");
6
- // A settings section — measured from Attio's Settings pages: a 16px/600 title
6
+ // A settings section — measured from Settings pages: a 16px/600 title
7
7
  // with an optional subtitle, then a stack of rows (form fields, toggles…). Rows
8
8
  // gap evenly; an optional trailing action sits on the title row.
9
9
  const config = (0, core_1.defineRecipe)({
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.settingsshellRecipe = void 0;
4
4
  const core_1 = require("../../core");
5
5
  const tokens_1 = require("../../tokens");
6
- // The Settings layout — measured from Attio's Settings: a 256px left nav with a
6
+ // The Settings layout — measured from a Settings screen: a 256px left nav with a
7
7
  // back header, a search field, and grouped nav items (active row raised), beside
8
8
  // a scrolling content pane. Sits inside whatever height its container gives it.
9
9
  const config = (0, core_1.defineRecipe)({
@@ -18,7 +18,7 @@ const config = (0, core_1.defineRecipe)({
18
18
 
19
19
  & .settingsshell-search { display: flex; align-items: center; gap: ${tokens_1.contract.space["2"]}; height: 32px; margin-bottom: ${tokens_1.contract.space["2"]}; padding: 0 ${tokens_1.contract.space["2.5"]}; border-radius: ${tokens_1.contract.radius.md}; background: ${tokens_1.contract.bgSurface}; box-shadow: inset 0 0 0 1px ${tokens_1.contract.borderDefault}; color: ${tokens_1.contract.fgMuted}; }
20
20
  /* The field box owns the ring, so focus has to move it -- the inner
21
- input kills its own outline. Measured on Attio: a focused field's
21
+ input kills its own outline. Measured live: a focused field's
22
22
  input carries box-shadow: none while its wrapper carries
23
23
  inset 0 0 0 1px #266df0. */
24
24
  & .settingsshell-search:focus-within { box-shadow: inset 0 0 0 1px ${tokens_1.contract.bgBrandSolid}; }
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.tasklistRecipe = void 0;
4
4
  const core_1 = require("../../core");
5
5
  const tokens_1 = require("../../tokens");
6
- // A task list — measured from Attio's Tasks page: optional group headers, then
6
+ // A task list — measured from a Tasks page: optional group headers, then
7
7
  // rows of a round complete-checkbox + title + trailing meta (due date, record,
8
8
  // assignee). Completed rows strike through; overdue due-dates go red.
9
9
  const config = (0, core_1.defineRecipe)({
@@ -3,9 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.trialbannerRecipe = void 0;
4
4
  const core_1 = require("../../core");
5
5
  const tokens_1 = require("../../tokens");
6
- // A compact trial / upgrade banner — measured from Attio's sidebar footer: an
6
+ // A compact trial / upgrade banner — measured from a sidebar footer: an
7
7
  // icon + a message on the left and a small action pill on the right, in a 28px
8
- // row. The action uses Attio's soft-glow outlined-button shadow.
8
+ // row. The action uses the measured soft-glow outlined-button shadow.
9
9
  const config = (0, core_1.defineRecipe)({
10
10
  name: "trialbanner",
11
11
  base: `display: flex; align-items: center; gap: ${tokens_1.contract.space["1.5"]}; box-sizing: border-box; min-height: 28px;
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.viewtoggleRecipe = void 0;
4
4
  const core_1 = require("../../core");
5
5
  const tokens_1 = require("../../tokens");
6
- // A compact icon toggle — measured from Attio's list/grid switch: a 28px track
6
+ // A compact icon toggle — measured from a list/grid switch: a 28px track
7
7
  // (radius 10, ~5% ink) padded 2px, holding 24px icon tiles (radius 8). The
8
8
  // selected tile gets a raised surface with a soft shadow.
9
9
  const config = (0, core_1.defineRecipe)({
@@ -3,10 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.elevation = void 0;
4
4
  const contract_1 = require("./contract");
5
5
  /**
6
- * Attio's measured elevation recipes, written **once**.
6
+ * The measured elevation recipes, written **once**.
7
7
  *
8
8
  * The whole product runs on two elevation tiers plus one control shadow
9
- * (measured live — see `docs/study/attio-panels.md` §4). Before this module each
9
+ * (measured live — see the panels study §4). Before this module each
10
10
  * surface carried its own copy of the string: the tier-1 stack appeared in 9
11
11
  * places, the control shadow in 12. Copies drift, and every drift was a real
12
12
  * bug — `Drawer`/`RecordPanel` grew invented directional shadows, `BulkBar`'s
@@ -23,14 +23,14 @@ exports.elevation = {
23
23
  /**
24
24
  * Tier 2 — the modal frosted bezel (Dialog, Command). Sits on the
25
25
  * `bgOverlayFrost` 60% + `blur(15px)` surface at radius 16, wrapping an inner
26
- * card at radius 12. Attio dims nothing behind it; the blur does the work.
26
+ * card at radius 12. Nothing is dimmed behind it; the blur does the work.
27
27
  */
28
28
  modal: `0 8px 28px -6px ${contract_1.contract.shadowOverlay1}, 0 18px 88px -4px ${contract_1.contract.shadowOverlay2}, 0 0 1px ${contract_1.contract.shadowOverlay3}`,
29
29
  /**
30
30
  * The neutral/outlined control shadow — buttons, inputs, textareas, the
31
31
  * sidebar search, record-page actions.
32
32
  *
33
- * The two raw values **are** the measured Attio value (Lessons 22 and 29) and
33
+ * The two raw values **are** the measured value (Lessons 22 and 29) and
34
34
  * must stay raw. `rgba(0,0,0,0.04)` equals `tileActiveShadow`'s light value by
35
35
  * coincidence, not by meaning; tokenizing it would delete a measured layer in
36
36
  * dark mode. Only the ring is theme-aware, via `ringNeutral`.
@@ -5,7 +5,7 @@ exports.palette = {
5
5
  gray00: { light: "#ffffff", dark: "#0a0a0a" },
6
6
  white: { light: "#ffffff", dark: "#ffffff" },
7
7
  // the counterpart to `white`: ink that does NOT flip with the theme, for text
8
- // on a bright tone fill. Same value as gray900's light side (Attio's measured
8
+ // on a bright tone fill. Same value as gray900's light side (the measured
9
9
  // near-black), named separately because its job is not "primary foreground".
10
10
  ink: { light: "#101112", dark: "#101112" },
11
11
  gray50: { light: "#f4f4f5", dark: "#101112" },
@@ -31,7 +31,7 @@ exports.palette = {
31
31
  // A red dark enough to carry white text. red600 cannot: white on it is
32
32
  // 3.91:1 light / 3.05:1 dark, and the solid button's hover DARKENS the fill
33
33
  // (filter: brightness), so dark ink fails there instead (4.49 at hover).
34
- // Measured from Attio's own stylesheet, which ships this red alongside the
34
+ // Measured from the reference stylesheet, which ships this red alongside the
35
35
  // #EB3B3B it uses for destructive menu TEXT. Does not flip: a filled
36
36
  // destructive control needs the same white-bearing fill in both themes.
37
37
  red700: { light: "#ba2525", dark: "#ba2525" },
@@ -3,7 +3,7 @@
3
3
  // component sizing. Theme-invariant (identical in light/dark), so it is emitted
4
4
  // once into :root, unlike the color tokens which flip per theme.
5
5
  //
6
- // Derived by measuring the live Attio app (not taste): its spacing is a
6
+ // Derived by measuring a live production app (not taste): its spacing is a
7
7
  // 2px-granular / 4px-base scale — the values 1,2,4,6,8,10,12,16 account for
8
8
  // nearly every gap/pad/margin in the sidebar. Radii cluster at 6/8/9 + a pill.
9
9
  // Recipes MUST reference these through the contract (`c.space[...]`), never a
@@ -25,10 +25,10 @@ exports.space = {
25
25
  "6": "24px",
26
26
  "8": "32px", // overlay / empty-state padding
27
27
  };
28
- // Corner radius. sm/md/lg are the three Attio uses on stacked surfaces
28
+ // Corner radius. sm/md/lg are the three used on stacked surfaces
29
29
  // (inputs, rows, tiles); full is the pill.
30
30
  exports.radius = {
31
- chip: "7px", // tag / chip corner — the single most used radius in Attio
31
+ chip: "7px", // tag / chip corner — the single most used radius
32
32
  sm: "6px", // chips, badges
33
33
  md: "8px", // inputs, search box
34
34
  lg: "9px", // rows, tiles, list items
@@ -40,20 +40,20 @@ exports.radius = {
40
40
  // radius (row height, header height, the nav icon box).
41
41
  exports.size = {
42
42
  icon: "16px", // nav / control glyph box
43
- chip: "22px", // tag / chip height — Attio's most repeated small control
43
+ chip: "22px", // tag / chip height — the most repeated small control
44
44
  row: "28px", // nav item · search · control height
45
45
  menuRow: "32px", // overlay row: menu item, select option, bulk-bar button
46
46
  tableRow: "36px", // data-grid row height
47
47
  tableHeader: "40px", // data-grid header row height
48
48
  header: "48px", // workspace-switcher header height
49
- // Attio's date picker, measured: a 32px day with a 2px gap on both axes, so
49
+ // The measured date picker: a 32px day with a 2px gap on both axes, so
50
50
  // the pitch is 34. The gap is expressed as the cell being 2px taller than the
51
51
  // highlight rather than as a grid gap, because crisp's range bridge spans
52
52
  // whole cells and a column gap would cut it.
53
53
  calendarCell: "34px", // calendar day pitch (32px day + 2px gap)
54
54
  calendarPill: "32px", // the day highlight itself
55
55
  };
56
- // Typography — Attio's UI runs entirely on Inter. Sizes measured in the sidebar
56
+ // Typography — the measured UI runs entirely on Inter. Sizes measured in the sidebar
57
57
  // collapse onto 11/12/13/14/16 (lg = 14px is the default body/label size);
58
58
  // weights are 400/500/600 with 500 the UI default.
59
59
  exports.font = {
@@ -51,7 +51,7 @@ exports.semantic = {
51
51
  bgCyan: "cyan600",
52
52
  bgPurple: "purple600",
53
53
  bgSidebar: "graySidebar",
54
- // #fbfbfb — Attio's subtle raised fill; the active tab pill uses the same
54
+ // #fbfbfb — the subtle raised fill; the active tab pill uses the same
55
55
  // value as the sidebar, so it shares the palette entry under a neutral name.
56
56
  bgSubtle: "graySidebar",
57
57
  };
@@ -4,7 +4,7 @@
4
4
  shrink the button back to its text. Make the wrapper fill too, so the
5
5
  whole cell stays clickable. */
6
6
  & .menu { width: 100%; height: 100%; }
7
- /* Attio's hit target is the WHOLE summary cell -- measured 246x37 with
7
+ /* The hit target is the WHOLE summary cell -- measured 246x37 with
8
8
  padding 0 12px, not a content-sized chip. Clicking anywhere in the cell
9
9
  opens the aggregation menu. */
10
10
  & .columncalc-trigger { display: flex; align-items: center; gap: var(--space-1); width: 100%; height: 100%; min-height: var(--size-tableRow); margin: 0; padding: 0 var(--space-3); border: none; border-radius: var(--radius-md); background: transparent; color: var(--fg-muted); font-family: inherit; font-size: var(--text-md); font-weight: var(--weight-medium); white-space: nowrap; cursor: pointer; transition: background-color .12s, color .12s; }
@@ -7,7 +7,7 @@
7
7
  & .datatable-search input::placeholder { color: var(--fg-muted); }
8
8
  & .datatable-search input:focus { box-shadow: inset 0 0 0 1px var(--bg-brand-solid); }
9
9
  & .datatable-count { margin-inline-start: auto; font-size: var(--text-md); color: var(--fg-muted); }
10
- /* Attio's header cell has no padding of its own -- the button owns the
10
+ /* The header cell has no padding of its own -- the button owns the
11
11
  full cell so the whole header is clickable (its own inset is 12px).
12
12
  Mirrors the summary-row fix. */
13
13
  & th { padding: 0; }
@@ -21,11 +21,11 @@
21
21
  & th .menu { width: 100%; height: 100%; }
22
22
  & .datatable-th-inner { display: inline-flex; align-items: center; gap: var(--space-1-5); width: 100%; min-width: 0; height: 100%; }
23
23
  & .datatable-th-inner > svg { flex-shrink: 0; color: var(--fg-muted); }
24
- /* Attio's summary cell has NO padding of its own -- the calculation trigger
24
+ /* The summary cell has NO padding of its own -- the calculation trigger
25
25
  owns the whole 246x37 area so a click anywhere in the cell opens the
26
26
  menu. Zero the cell's inset and let ColumnCalc supply the 12px. */
27
27
  & tfoot td { padding: 0; }
28
- /* Group heading row -- Attio groups a view under a subtle label with the
28
+ /* Group heading row -- a view is grouped under a subtle label with the
29
29
  bucket's count beside it. */
30
30
  & .datatable-viewsettings { display: inline-flex; align-items: center; gap: var(--space-1-5); height: var(--size-row); margin: 0; padding: 0 var(--space-2); border: none; border-radius: var(--radius-md); background: transparent; color: var(--fg-muted); font-family: inherit; font-size: var(--text-md); font-weight: var(--weight-medium); white-space: nowrap; cursor: pointer; transition: background-color .12s, color .12s; }
31
31
  & .datatable-viewsettings:hover { background: color-mix(in srgb, var(--fg-primary) 4%, transparent); color: var(--fg-primary); }
@@ -83,13 +83,13 @@
83
83
  & .datatable-tag[data-tone="orange"] { background: color-mix(in srgb, var(--bg-orange) 16%, transparent); color: color-mix(in srgb, var(--bg-orange) 82%, var(--fg-primary)); }
84
84
  & .datatable-num { font-variant-numeric: tabular-nums; }
85
85
  & .datatable-muted { color: var(--fg-muted); }
86
- /* row drag-to-reorder -- Attio's Settings > Objects > Attributes measures
86
+ /* row drag-to-reorder -- a Settings > Objects > Attributes screen measures
87
87
  a leading 20px grip column, a 16px grip icon, and the row's own
88
88
  hairline doubling as the drop indicator (it tints toward the brand
89
89
  colour as the active drop target). The affordance + geometry are
90
90
  measured; the drag MECHANISM is crisp's existing house idiom -- HTML5
91
91
  draggable + dataTransfer, the same one column reorder already uses
92
- (RecordsTable's reorderColumn) -- not Attio's own proprietary
92
+ (RecordsTable's reorderColumn) -- not a proprietary
93
93
  pointer-events implementation. */
94
94
  & .datatable-col-grip { width: 20px; padding: 0; text-align: center; }
95
95
  & .datatable-grip { display: inline-flex; align-items: center; justify-content: center; width: 100%; height: 100%; margin: 0; border: none; border-radius: 0; background: none; font-family: inherit; color: var(--fg-muted); cursor: grab; }
@@ -1,6 +1,6 @@
1
1
  import { defineRecipe, resolveRecipe } from "../../core/index.js";
2
2
  import { contract as c } from "../../tokens/index.js";
3
- // A stack of collapsible sections — Attio's sidebar sections / "view all".
3
+ // A stack of collapsible sections — sidebar sections / "view all".
4
4
  // The panel animates height via the grid-template-rows 0fr->1fr technique.
5
5
  const config = defineRecipe({
6
6
  name: "accordion",
@@ -1,6 +1,6 @@
1
1
  import { defineRecipe, resolveRecipe } from "../../core/index.js";
2
2
  import { contract as c } from "../../tokens/index.js";
3
- // A responsive bar chart — measured from Attio's Reports dashboard: brand bars
3
+ // A responsive bar chart — measured from a Reports dashboard: brand bars
4
4
  // with rounded tops over dashed horizontal gridlines, a value axis on the left,
5
5
  // and category labels below. Pure CSS (no SVG), so it scales with its container.
6
6
  const config = defineRecipe({
@@ -1,6 +1,6 @@
1
1
  import { defineRecipe, resolveRecipe, rtlFlipCss } from "../../core/index.js";
2
2
  import { contract as c } from "../../tokens/index.js";
3
- // A breadcrumb trail — Attio's record-page nav ("Companies / Google").
3
+ // A breadcrumb trail — record-page nav ("Companies / Google").
4
4
  const config = defineRecipe({
5
5
  name: "breadcrumb",
6
6
  base: `display: flex; align-items: center; gap: ${c.space["0.5"]}; font-family: ${c.font.sans}; font-size: ${c.text.lg};
@@ -2,7 +2,7 @@ import { defineRecipe, resolveRecipe } from "../../core/index.js";
2
2
  import { contract as c, elevation as e } from "../../tokens/index.js";
3
3
  // A floating bulk-action bar — the pill that rises from the bottom of a
4
4
  // selection surface (a table, a gallery) when one or more rows are selected.
5
- // Measured from Attio's records-table bulk bar. The root is an absolutely-
5
+ // Measured from a records-table bulk bar. The root is an absolutely-
6
6
  // positioned anchor that centres the bar with flex (NOT a transform): a resting
7
7
  // transform on the bar would reparent any `position: fixed` menu inside it (the
8
8
  // "More" overflow), detaching it — the enter slide lives in @starting-style only.
@@ -1,6 +1,6 @@
1
1
  import { defineRecipe, resolveRecipe } from "../../core/index.js";
2
2
  import { contract as c } from "../../tokens/index.js";
3
- // A callout / banner — Attio's inline info notices (e.g. "Changes apply to all
3
+ // A callout / banner — inline info notices (e.g. "Changes apply to all
4
4
  // workspaces", the trial banner). Tone tints the background + icon.
5
5
  const config = defineRecipe({
6
6
  name: "callout",
@@ -1,6 +1,6 @@
1
1
  import { defineRecipe, resolveRecipe } from "../../core/index.js";
2
2
  import { contract as c } from "../../tokens/index.js";
3
- // A 16px square checkbox measured from Attio's record grid: r6, a subtle 1px
3
+ // A 16px square checkbox measured from a record grid: r6, a subtle 1px
4
4
  // inset ring when empty, brand fill + white check when on. The check is a
5
5
  // data-URI SVG background so it renders reliably (input pseudo-content doesn't).
6
6
  const CHECK = "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\")";
@@ -1,6 +1,6 @@
1
1
  import { defineRecipe, resolveRecipe } from "../../core/index.js";
2
2
  import { contract as c } from "../../tokens/index.js";
3
- // Attio's column footer calculation. The summary row is 36px and sticky at the
3
+ // The column footer calculation. The summary row is 36px and sticky at the
4
4
  // grid's bottom edge; each cell holds a quiet trigger that reads "Add
5
5
  // calculation" until an aggregation is chosen, then shows the value with its
6
6
  // operation name beside it.
@@ -11,7 +11,7 @@ const config = defineRecipe({
11
11
  shrink the button back to its text. Make the wrapper fill too, so the
12
12
  whole cell stays clickable. */
13
13
  & .menu { width: 100%; height: 100%; }
14
- /* Attio's hit target is the WHOLE summary cell -- measured 246x37 with
14
+ /* The hit target is the WHOLE summary cell -- measured 246x37 with
15
15
  padding 0 12px, not a content-sized chip. Clicking anywhere in the cell
16
16
  opens the aggregation menu. */
17
17
  & .columncalc-trigger { display: flex; align-items: center; gap: ${c.space["1"]}; width: 100%; height: 100%; min-height: ${c.size.tableRow}; margin: 0; padding: 0 ${c.space["3"]}; border: none; border-radius: ${c.radius.md}; background: transparent; color: ${c.fgMuted}; font-family: inherit; font-size: ${c.text.md}; font-weight: ${c.weight.medium}; white-space: nowrap; cursor: pointer; transition: background-color .12s, color .12s; }
@@ -14,7 +14,7 @@ const config = defineRecipe({
14
14
  & .datatable-search input::placeholder { color: ${c.fgMuted}; }
15
15
  & .datatable-search input:focus { box-shadow: inset 0 0 0 1px ${c.bgBrandSolid}; }
16
16
  & .datatable-count { margin-inline-start: auto; font-size: ${c.text.md}; color: ${c.fgMuted}; }
17
- /* Attio's header cell has no padding of its own -- the button owns the
17
+ /* The header cell has no padding of its own -- the button owns the
18
18
  full cell so the whole header is clickable (its own inset is 12px).
19
19
  Mirrors the summary-row fix. */
20
20
  & th { padding: 0; }
@@ -28,11 +28,11 @@ const config = defineRecipe({
28
28
  & th .menu { width: 100%; height: 100%; }
29
29
  & .datatable-th-inner { display: inline-flex; align-items: center; gap: ${c.space["1.5"]}; width: 100%; min-width: 0; height: 100%; }
30
30
  & .datatable-th-inner > svg { flex-shrink: 0; color: ${c.fgMuted}; }
31
- /* Attio's summary cell has NO padding of its own -- the calculation trigger
31
+ /* The summary cell has NO padding of its own -- the calculation trigger
32
32
  owns the whole 246x37 area so a click anywhere in the cell opens the
33
33
  menu. Zero the cell's inset and let ColumnCalc supply the 12px. */
34
34
  & tfoot td { padding: 0; }
35
- /* Group heading row -- Attio groups a view under a subtle label with the
35
+ /* Group heading row -- a view is grouped under a subtle label with the
36
36
  bucket's count beside it. */
37
37
  & .datatable-viewsettings { display: inline-flex; align-items: center; gap: ${c.space["1.5"]}; height: ${c.size.row}; margin: 0; padding: 0 ${c.space["2"]}; border: none; border-radius: ${c.radius.md}; background: transparent; color: ${c.fgMuted}; font-family: inherit; font-size: ${c.text.md}; font-weight: ${c.weight.medium}; white-space: nowrap; cursor: pointer; transition: background-color .12s, color .12s; }
38
38
  & .datatable-viewsettings:hover { background: color-mix(in srgb, ${c.fgPrimary} 4%, transparent); color: ${c.fgPrimary}; }
@@ -90,13 +90,13 @@ const config = defineRecipe({
90
90
  & .datatable-tag[data-tone="orange"] { background: color-mix(in srgb, ${c.bgOrange} 16%, transparent); color: color-mix(in srgb, ${c.bgOrange} 82%, ${c.fgPrimary}); }
91
91
  & .datatable-num { font-variant-numeric: tabular-nums; }
92
92
  & .datatable-muted { color: ${c.fgMuted}; }
93
- /* row drag-to-reorder -- Attio's Settings > Objects > Attributes measures
93
+ /* row drag-to-reorder -- a Settings > Objects > Attributes screen measures
94
94
  a leading 20px grip column, a 16px grip icon, and the row's own
95
95
  hairline doubling as the drop indicator (it tints toward the brand
96
96
  colour as the active drop target). The affordance + geometry are
97
97
  measured; the drag MECHANISM is crisp's existing house idiom -- HTML5
98
98
  draggable + dataTransfer, the same one column reorder already uses
99
- (RecordsTable's reorderColumn) -- not Attio's own proprietary
99
+ (RecordsTable's reorderColumn) -- not a proprietary
100
100
  pointer-events implementation. */
101
101
  & .datatable-col-grip { width: 20px; padding: 0; text-align: center; }
102
102
  & .datatable-grip { display: inline-flex; align-items: center; justify-content: center; width: 100%; height: 100%; margin: 0; border: none; border-radius: 0; background: none; font-family: inherit; color: ${c.fgMuted}; cursor: grab; }
@@ -1,8 +1,8 @@
1
1
  import { defineRecipe, resolveRecipe } from "../../core/index.js";
2
2
  import { contract as c } from "../../tokens/index.js";
3
- // seed-design's calendar structure on Attio's measured scale. The behaviour,
4
- // markup and range model are seed's; every visual value is measured from Attio's
5
- // own date picker (app.attio.com, task due-date field): a 32px day on a 34px
3
+ // seed-design's calendar structure on the measured scale. The behaviour,
4
+ // markup and range model are seed's; every visual value is measured from a
5
+ // live date picker (task due-date field): a 32px day on a 34px
6
6
  // pitch, an 8px-radius highlight rather than a circle, 14/20 medium numerals and
7
7
  // the brand blue for the selection.
8
8
  //
@@ -1,8 +1,8 @@
1
1
  import { defineRecipe, resolveRecipe } from "../../core/index.js";
2
2
  import { contract as c } from "../../tokens/index.js";
3
- // The trigger crisp's DatePicker used to own, measured from Attio: a 32px
3
+ // The trigger crisp's DatePicker used to own, measured live: a 32px
4
4
  // outlined chip showing the value, opening a calendar in a popover. Split out
5
- // when DatePicker became seed-design's bare calendar, so this Attio-measured
5
+ // when DatePicker became seed-design's bare calendar, so this measured
6
6
  // field survives unchanged for the consumers already using it.
7
7
  const config = defineRecipe({
8
8
  name: "datepickerfield",
@@ -1,6 +1,6 @@
1
1
  import { defineRecipe, resolveRecipe } from "../../core/index.js";
2
2
  import { contract as c, elevation as e } from "../../tokens/index.js";
3
- // A modal dialog surface — measured from Attio's create-record modal: a radius-16
3
+ // A modal dialog surface — measured from a create-record modal: a radius-16
4
4
  // frosted-glass card (60% tinted background + 15px backdrop blur, both re-measured
5
5
  // per theme — light uses a blue-tinted 3-layer shadow, dark drops to a plain
6
6
  // 2-layer black shadow) with a bordered header (title + close), a scrollable
@@ -1,6 +1,6 @@
1
1
  import { defineRecipe, resolveRecipe } from "../../core/index.js";
2
2
  import { contract as c } from "../../tokens/index.js";
3
- // A donut / ring chart — measured from Attio's Reports breakdown reports: a
3
+ // A donut / ring chart — measured from Reports breakdown reports: a
4
4
  // segmented ring with a centred total, plus a legend of coloured swatches with
5
5
  // labels and values. Pure SVG ring; HTML legend.
6
6
  const config = defineRecipe({
@@ -12,9 +12,9 @@ const config = defineRecipe({
12
12
  variant: {
13
13
  // compact icon tile (default)
14
14
  default: ``,
15
- // a large icon on a dotted-grid backdrop — Attio's Developers/Reports empty state
15
+ // a large icon on a dotted-grid backdrop — a Developers/Reports empty state
16
16
  illustrated: `& .emptystate-icon { width: 132px; height: 96px; margin-bottom: ${c.space["2"]}; border-radius: 0; color: color-mix(in srgb, ${c.fgPrimary} 22%, transparent); background: radial-gradient(circle, color-mix(in srgb, ${c.fgPrimary} 12%, transparent) 1.2px, transparent 1.2px) 0 0 / 16px 16px; }`,
17
- // Attio's full-view empty state (measured from a filtered-to-zero records table):
17
+ // A full-view empty state (measured from a filtered-to-zero records table):
18
18
  // a 45px ringed circle icon, a 20/24 semibold heading, a 14/20 medium muted body,
19
19
  // then a primary action. Gaps are 16 / 8 / 16 (icon→title→desc→action).
20
20
  page: `gap: ${c.space["2"]};
@@ -1,16 +1,16 @@
1
1
  import { defineRecipe, resolveRecipe } from "../../core/index.js";
2
2
  import { contract as c } from "../../tokens/index.js";
3
- // seed-design's file-upload behaviour on Attio's measured scale.
3
+ // seed-design's file-upload behaviour on the measured scale.
4
4
  //
5
- // Measured from Attio's record Files pane (Deal record → Files, empty state):
5
+ // Measured from a record Files pane (Deal record → Files, empty state):
6
6
  // the title is 16/20 at weight 600 in `rgb(16,17,18)` (= gray900 = fgPrimary),
7
7
  // the hint 14/20 at weight 500 in `rgba(0,0,0,0.63)`, and the action button is
8
8
  // 28px tall with an 8px corner.
9
9
  //
10
- // Attio draws NO boundary around that pane -- the whole surface is the drop
10
+ // That pane draws NO boundary around itself -- the whole surface is the drop
11
11
  // target -- but a reusable dropzone needs an edge, so the dashed affordance is
12
12
  // crisp's own measured one from `sidebar-newlist` (1px dashed borderDefault,
13
- // r8, bgRaised on hover) rather than a new invention. Attio's drag-OVER
13
+ // r8, bgRaised on hover) rather than a new invention. The drag-OVER
14
14
  // treatment could not be measured: synthetic DragEvents do not trigger its
15
15
  // handlers. The active state therefore reuses the brand emphasis crisp already
16
16
  // uses for a live drag affordance (`appshell-resize[data-dragging]`).
@@ -40,12 +40,12 @@ const config = defineRecipe({
40
40
  & .fileupload-zone[data-disabled] { opacity: .5; cursor: not-allowed; }
41
41
  & .fileupload-zone[data-invalid] { border-color: ${c.bgDanger}; }
42
42
 
43
- /* Attio: "No files" 16/20 weight 600 */
43
+ /* "No files" 16/20 weight 600 */
44
44
  & .fileupload-title {
45
45
  color: ${c.fgPrimary}; font-size: ${c.text.xl}; line-height: 20px;
46
46
  font-weight: ${c.weight.semibold};
47
47
  }
48
- /* Attio: the hint line, 14/20 weight 500 at 63% of the foreground */
48
+ /* The hint line, 14/20 weight 500 at 63% of the foreground */
49
49
  & .fileupload-hint {
50
50
  color: color-mix(in srgb, ${c.fgPrimary} 63%, transparent);
51
51
  font-size: ${c.text.lg}; line-height: 20px;
@@ -1,6 +1,6 @@
1
1
  import { defineRecipe, resolveRecipe } from "../../core/index.js";
2
2
  import { contract as c } from "../../tokens/index.js";
3
- // A labelled form field — measured from Attio's Settings forms: a 12px/500 muted
3
+ // A labelled form field — measured from Settings forms: a 12px/500 muted
4
4
  // label above the control, with an optional description or danger error line
5
5
  // below. Wraps any control (Input, Select, Textarea…).
6
6
  const config = defineRecipe({
@@ -1,6 +1,6 @@
1
1
  import { defineRecipe, resolveRecipe } from "../../core/index.js";
2
2
  import { contract as c, elevation as e } from "../../tokens/index.js";
3
- // Geometry is Attio's, measured: 32/36px tall, r8/r10, 10/12px side padding.
3
+ // Geometry is measured: 32/36px tall, r8/r10, 10/12px side padding.
4
4
  // The FOCUS TREATMENT is seed-design's, measured from @seed-design/css: a 2px
5
5
  // ring on an ::after overlay that is present-but-transparent at rest, so
6
6
  // focusing cannot shift layout the way a width change would, and animates
@@ -1,6 +1,6 @@
1
1
  import { defineRecipe, resolveRecipe } from "../../core/index.js";
2
2
  import { contract as c } from "../../tokens/index.js";
3
- // A responsive line chart — measured from Attio's Reports historical charts: a
3
+ // A responsive line chart — measured from Reports historical charts: a
4
4
  // brand line with a soft area fill over dashed horizontal gridlines, a value
5
5
  // axis on the left, and category labels below. The plot is an SVG stretched to
6
6
  // its box (non-scaling stroke keeps the line crisp); axes are HTML.
@@ -1,7 +1,7 @@
1
1
  import { defineRecipe, resolveRecipe } from "../../core/index.js";
2
2
  import { contract as c, elevation as e } from "../../tokens/index.js";
3
- // A dropdown menu — same popover surface Attio uses for its ⋯ / sort / filter
4
- // menus (measured from the app's listboxes): radius 12, 4px padding, a layered
3
+ // A dropdown menu — same popover surface used for ⋯ / sort / filter
4
+ // menus (measured from listboxes): radius 12, 4px padding, a layered
5
5
  // soft shadow, over 32px items (radius 8, icon + label + optional shortcut /
6
6
  // check). The content is rendered inside this relative root so it keeps these
7
7
  // nested styles while escaping the trigger's own box.
@@ -1,6 +1,6 @@
1
1
  import { defineRecipe, resolveRecipe } from "../../core/index.js";
2
2
  import { contract as c, elevation as e } from "../../tokens/index.js";
3
- // A multi-select / tag editor — measured from Attio's cell tag picker: an
3
+ // A multi-select / tag editor — measured from a cell tag picker: an
4
4
  // outlined trigger showing the selected values as coloured chips, opening a
5
5
  // popover with a search field over rows of "[coloured chip] … [checkbox]" that
6
6
  // toggle on click. The popover keeps these nested styles by rendering inside
@@ -1,7 +1,7 @@
1
1
  import { defineRecipe, resolveRecipe } from "../../core/index.js";
2
2
  import { contract as c } from "../../tokens/index.js";
3
3
  // A progress indicator — a continuous brand-filled track, or a segmented row of
4
- // pills (Attio's "Getting started 3/6" bar).
4
+ // pills (a "Getting started 3/6" bar).
5
5
  const config = defineRecipe({
6
6
  name: "progress",
7
7
  base: `display: block; box-sizing: border-box; height: 6px; border-radius: ${c.radius.full}; background: color-mix(in srgb, ${c.fgPrimary} 8%, transparent); overflow: hidden;
@@ -2,8 +2,8 @@ import { defineRecipe, resolveRecipe } from "../../core/index.js";
2
2
  import { contract as c } from "../../tokens/index.js";
3
3
  // seed-design's quantity-picker, shape for shape, in crisp's colours.
4
4
  //
5
- // Attio has no stepper — its quantity-ish fields are plain number inputs — so
6
- // as with Slider there is nothing of Attio's to measure and the GEOMETRY is
5
+ // No stepper exists — quantity-ish fields are plain number inputs — so
6
+ // as with Slider there is nothing measured to draw from and the GEOMETRY is
7
7
  // seed's own, read from `@seed-design/css/recipes/quantity-picker.css`:
8
8
  //
9
9
  // size root height / button square radius icon text
@@ -1,6 +1,6 @@
1
1
  import { defineRecipe, resolveRecipe } from "../../core/index.js";
2
2
  import { contract as c } from "../../tokens/index.js";
3
- // A radio group with two shapes, measured from Attio's settings: the default is
3
+ // A radio group with two shapes, measured from settings: the default is
4
4
  // a column of rows (a 16px ring that fills brand when selected + a label); the
5
5
  // `card` variant is a row of bordered preview cards (radius 16) whose border
6
6
  // turns brand (#266df0) when selected — the Appearance "Theme" picker.