@crisp-ui-kit/crisp 0.31.3 → 0.31.5

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 (253) hide show
  1. package/dist/authshell.css +1 -1
  2. package/dist/cjs/components/accordion/accordion.js +1 -1
  3. package/dist/cjs/components/accordion/accordion.recipe.js +1 -1
  4. package/dist/cjs/components/avatargroup/avatargroup.js +1 -1
  5. package/dist/cjs/components/barchart/barchart.js +1 -1
  6. package/dist/cjs/components/barchart/barchart.recipe.js +1 -1
  7. package/dist/cjs/components/breadcrumb/breadcrumb.js +1 -1
  8. package/dist/cjs/components/breadcrumb/breadcrumb.recipe.js +1 -1
  9. package/dist/cjs/components/bulkbar/bulkbar.js +1 -1
  10. package/dist/cjs/components/bulkbar/bulkbar.recipe.js +1 -1
  11. package/dist/cjs/components/callout/callout.js +1 -1
  12. package/dist/cjs/components/callout/callout.recipe.js +1 -1
  13. package/dist/cjs/components/checkbox/checkbox.js +1 -1
  14. package/dist/cjs/components/checkbox/checkbox.recipe.js +1 -1
  15. package/dist/cjs/components/columncalc/columncalc.js +2 -2
  16. package/dist/cjs/components/columncalc/columncalc.recipe.js +2 -2
  17. package/dist/cjs/components/datatable/datatable.js +5 -5
  18. package/dist/cjs/components/datatable/datatable.recipe.js +5 -5
  19. package/dist/cjs/components/datepicker/datepicker.recipe.js +3 -3
  20. package/dist/cjs/components/datepickerfield/datepickerfield.js +1 -1
  21. package/dist/cjs/components/datepickerfield/datepickerfield.recipe.js +2 -2
  22. package/dist/cjs/components/dialog/dialog.js +1 -1
  23. package/dist/cjs/components/dialog/dialog.recipe.js +1 -1
  24. package/dist/cjs/components/donutchart/donutchart.js +1 -1
  25. package/dist/cjs/components/donutchart/donutchart.recipe.js +1 -1
  26. package/dist/cjs/components/emptystate/emptystate.recipe.js +2 -2
  27. package/dist/cjs/components/fileupload/fileupload.js +1 -1
  28. package/dist/cjs/components/fileupload/fileupload.recipe.js +6 -6
  29. package/dist/cjs/components/formfield/formfield.js +1 -1
  30. package/dist/cjs/components/formfield/formfield.recipe.js +1 -1
  31. package/dist/cjs/components/input/input.recipe.js +1 -1
  32. package/dist/cjs/components/linechart/linechart.js +1 -1
  33. package/dist/cjs/components/linechart/linechart.recipe.js +1 -1
  34. package/dist/cjs/components/menu/menu.js +1 -1
  35. package/dist/cjs/components/menu/menu.recipe.js +2 -2
  36. package/dist/cjs/components/multiselect/multiselect.js +1 -1
  37. package/dist/cjs/components/multiselect/multiselect.recipe.js +1 -1
  38. package/dist/cjs/components/progress/progress.recipe.js +1 -1
  39. package/dist/cjs/components/quantitypicker/quantitypicker.recipe.js +2 -2
  40. package/dist/cjs/components/radiogroup/radiogroup.js +1 -1
  41. package/dist/cjs/components/radiogroup/radiogroup.recipe.js +1 -1
  42. package/dist/cjs/components/resizablepanel/resizablepanel.js +1 -1
  43. package/dist/cjs/components/resizablepanel/resizablepanel.recipe.js +2 -2
  44. package/dist/cjs/components/segmented/segmented.js +1 -1
  45. package/dist/cjs/components/segmented/segmented.recipe.js +1 -1
  46. package/dist/cjs/components/select/select.js +1 -1
  47. package/dist/cjs/components/select/select.recipe.js +2 -2
  48. package/dist/cjs/components/slider/slider.recipe.js +2 -2
  49. package/dist/cjs/components/stagebar/stagebar.js +1 -1
  50. package/dist/cjs/components/stagebar/stagebar.recipe.js +1 -1
  51. package/dist/cjs/components/statcard/statcard.js +1 -1
  52. package/dist/cjs/components/statcard/statcard.recipe.js +2 -2
  53. package/dist/cjs/components/switch/switch.js +1 -1
  54. package/dist/cjs/components/switch/switch.recipe.js +1 -1
  55. package/dist/cjs/components/table/table.recipe.js +1 -1
  56. package/dist/cjs/components/tabletoolbar/tabletoolbar.chrome.js +2 -2
  57. package/dist/cjs/components/tabletoolbar/tabletoolbar.js +2 -2
  58. package/dist/cjs/components/tabletoolbar/tabletoolbar.recipe.js +1 -1
  59. package/dist/cjs/components/tabs/tabs.js +2 -2
  60. package/dist/cjs/components/tabs/tabs.recipe.js +1 -1
  61. package/dist/cjs/components/textarea/textarea.js +1 -1
  62. package/dist/cjs/components/textarea/textarea.recipe.js +1 -1
  63. package/dist/cjs/components/tooltip/tooltip.js +1 -1
  64. package/dist/cjs/components/tooltip/tooltip.recipe.js +1 -1
  65. package/dist/cjs/product/appshell/appshell.js +4 -4
  66. package/dist/cjs/product/appshell/appshell.recipe.js +1 -1
  67. package/dist/cjs/product/authshell/authshell.js +1 -1
  68. package/dist/cjs/product/authshell/authshell.recipe.js +3 -3
  69. package/dist/cjs/product/board/board.js +1 -1
  70. package/dist/cjs/product/board/board.recipe.js +1 -1
  71. package/dist/cjs/product/command/command.js +1 -1
  72. package/dist/cjs/product/entitycard/entitycard.js +1 -1
  73. package/dist/cjs/product/entitycard/entitycard.recipe.js +1 -1
  74. package/dist/cjs/product/flowcanvas/flowcanvas.js +1 -1
  75. package/dist/cjs/product/flowcanvas/flowcanvas.recipe.js +1 -1
  76. package/dist/cjs/product/inbox/inbox.js +1 -1
  77. package/dist/cjs/product/inbox/inbox.recipe.js +1 -1
  78. package/dist/cjs/product/listpage/listpage.js +1 -1
  79. package/dist/cjs/product/listpage/listpage.recipe.js +1 -1
  80. package/dist/cjs/product/onboarding/onboarding.js +1 -1
  81. package/dist/cjs/product/onboarding/onboarding.recipe.js +1 -1
  82. package/dist/cjs/product/recordpage/recordpage.js +7 -7
  83. package/dist/cjs/product/recordpage/recordpage.recipe.js +2 -2
  84. package/dist/cjs/product/recordpanel/recordpanel.recipe.js +1 -1
  85. package/dist/cjs/product/recordstable/recordstable.js +9 -9
  86. package/dist/cjs/product/recordstable/recordstable.recipe.js +2 -2
  87. package/dist/cjs/product/recordstable/recordstable.tag.js +1 -1
  88. package/dist/cjs/product/richtext/richtext.js +1 -1
  89. package/dist/cjs/product/richtext/richtext.recipe.js +1 -1
  90. package/dist/cjs/product/settingssection/settingssection.js +1 -1
  91. package/dist/cjs/product/settingssection/settingssection.recipe.js +1 -1
  92. package/dist/cjs/product/settingsshell/settingsshell.js +1 -1
  93. package/dist/cjs/product/settingsshell/settingsshell.recipe.js +2 -2
  94. package/dist/cjs/product/sidebar/sidebar.js +6 -6
  95. package/dist/cjs/product/tasklist/tasklist.js +1 -1
  96. package/dist/cjs/product/tasklist/tasklist.recipe.js +1 -1
  97. package/dist/cjs/product/trialbanner/trialbanner.js +1 -1
  98. package/dist/cjs/product/trialbanner/trialbanner.recipe.js +2 -2
  99. package/dist/cjs/product/viewtoggle/viewtoggle.js +1 -1
  100. package/dist/cjs/product/viewtoggle/viewtoggle.recipe.js +1 -1
  101. package/dist/columncalc.css +1 -1
  102. package/dist/datatable.css +5 -5
  103. package/dist/esm/components/accordion/accordion.js +1 -1
  104. package/dist/esm/components/accordion/accordion.recipe.js +1 -1
  105. package/dist/esm/components/avatargroup/avatargroup.js +1 -1
  106. package/dist/esm/components/barchart/barchart.js +1 -1
  107. package/dist/esm/components/barchart/barchart.recipe.js +1 -1
  108. package/dist/esm/components/breadcrumb/breadcrumb.js +1 -1
  109. package/dist/esm/components/breadcrumb/breadcrumb.recipe.js +1 -1
  110. package/dist/esm/components/bulkbar/bulkbar.js +1 -1
  111. package/dist/esm/components/bulkbar/bulkbar.recipe.js +1 -1
  112. package/dist/esm/components/callout/callout.js +1 -1
  113. package/dist/esm/components/callout/callout.recipe.js +1 -1
  114. package/dist/esm/components/checkbox/checkbox.js +1 -1
  115. package/dist/esm/components/checkbox/checkbox.recipe.js +1 -1
  116. package/dist/esm/components/columncalc/columncalc.js +2 -2
  117. package/dist/esm/components/columncalc/columncalc.recipe.js +2 -2
  118. package/dist/esm/components/datatable/datatable.js +5 -5
  119. package/dist/esm/components/datatable/datatable.recipe.js +5 -5
  120. package/dist/esm/components/datepicker/datepicker.recipe.js +3 -3
  121. package/dist/esm/components/datepickerfield/datepickerfield.js +1 -1
  122. package/dist/esm/components/datepickerfield/datepickerfield.recipe.js +2 -2
  123. package/dist/esm/components/dialog/dialog.js +1 -1
  124. package/dist/esm/components/dialog/dialog.recipe.js +1 -1
  125. package/dist/esm/components/donutchart/donutchart.js +1 -1
  126. package/dist/esm/components/donutchart/donutchart.recipe.js +1 -1
  127. package/dist/esm/components/emptystate/emptystate.recipe.js +2 -2
  128. package/dist/esm/components/fileupload/fileupload.js +1 -1
  129. package/dist/esm/components/fileupload/fileupload.recipe.js +6 -6
  130. package/dist/esm/components/formfield/formfield.js +1 -1
  131. package/dist/esm/components/formfield/formfield.recipe.js +1 -1
  132. package/dist/esm/components/input/input.recipe.js +1 -1
  133. package/dist/esm/components/linechart/linechart.js +1 -1
  134. package/dist/esm/components/linechart/linechart.recipe.js +1 -1
  135. package/dist/esm/components/menu/menu.js +1 -1
  136. package/dist/esm/components/menu/menu.recipe.js +2 -2
  137. package/dist/esm/components/multiselect/multiselect.js +1 -1
  138. package/dist/esm/components/multiselect/multiselect.recipe.js +1 -1
  139. package/dist/esm/components/progress/progress.recipe.js +1 -1
  140. package/dist/esm/components/quantitypicker/quantitypicker.recipe.js +2 -2
  141. package/dist/esm/components/radiogroup/radiogroup.js +1 -1
  142. package/dist/esm/components/radiogroup/radiogroup.recipe.js +1 -1
  143. package/dist/esm/components/resizablepanel/resizablepanel.js +1 -1
  144. package/dist/esm/components/resizablepanel/resizablepanel.recipe.js +2 -2
  145. package/dist/esm/components/segmented/segmented.js +1 -1
  146. package/dist/esm/components/segmented/segmented.recipe.js +1 -1
  147. package/dist/esm/components/select/select.js +1 -1
  148. package/dist/esm/components/select/select.recipe.js +2 -2
  149. package/dist/esm/components/slider/slider.recipe.js +2 -2
  150. package/dist/esm/components/stagebar/stagebar.js +1 -1
  151. package/dist/esm/components/stagebar/stagebar.recipe.js +1 -1
  152. package/dist/esm/components/statcard/statcard.js +1 -1
  153. package/dist/esm/components/statcard/statcard.recipe.js +2 -2
  154. package/dist/esm/components/switch/switch.js +1 -1
  155. package/dist/esm/components/switch/switch.recipe.js +1 -1
  156. package/dist/esm/components/table/table.recipe.js +1 -1
  157. package/dist/esm/components/tabletoolbar/tabletoolbar.chrome.js +2 -2
  158. package/dist/esm/components/tabletoolbar/tabletoolbar.js +2 -2
  159. package/dist/esm/components/tabletoolbar/tabletoolbar.recipe.js +1 -1
  160. package/dist/esm/components/tabs/tabs.js +2 -2
  161. package/dist/esm/components/tabs/tabs.recipe.js +1 -1
  162. package/dist/esm/components/textarea/textarea.js +1 -1
  163. package/dist/esm/components/textarea/textarea.recipe.js +1 -1
  164. package/dist/esm/components/tooltip/tooltip.js +1 -1
  165. package/dist/esm/components/tooltip/tooltip.recipe.js +1 -1
  166. package/dist/esm/product/appshell/appshell.js +4 -4
  167. package/dist/esm/product/appshell/appshell.recipe.js +1 -1
  168. package/dist/esm/product/authshell/authshell.js +1 -1
  169. package/dist/esm/product/authshell/authshell.recipe.js +3 -3
  170. package/dist/esm/product/board/board.js +1 -1
  171. package/dist/esm/product/board/board.recipe.js +1 -1
  172. package/dist/esm/product/command/command.js +1 -1
  173. package/dist/esm/product/entitycard/entitycard.js +1 -1
  174. package/dist/esm/product/entitycard/entitycard.recipe.js +1 -1
  175. package/dist/esm/product/flowcanvas/flowcanvas.js +1 -1
  176. package/dist/esm/product/flowcanvas/flowcanvas.recipe.js +1 -1
  177. package/dist/esm/product/inbox/inbox.js +1 -1
  178. package/dist/esm/product/inbox/inbox.recipe.js +1 -1
  179. package/dist/esm/product/listpage/listpage.js +1 -1
  180. package/dist/esm/product/listpage/listpage.recipe.js +1 -1
  181. package/dist/esm/product/onboarding/onboarding.js +1 -1
  182. package/dist/esm/product/onboarding/onboarding.recipe.js +1 -1
  183. package/dist/esm/product/recordpage/recordpage.js +7 -7
  184. package/dist/esm/product/recordpage/recordpage.recipe.js +2 -2
  185. package/dist/esm/product/recordpanel/recordpanel.recipe.js +1 -1
  186. package/dist/esm/product/recordstable/recordstable.js +9 -9
  187. package/dist/esm/product/recordstable/recordstable.recipe.js +2 -2
  188. package/dist/esm/product/recordstable/recordstable.tag.js +1 -1
  189. package/dist/esm/product/richtext/richtext.js +1 -1
  190. package/dist/esm/product/richtext/richtext.recipe.js +1 -1
  191. package/dist/esm/product/settingssection/settingssection.js +1 -1
  192. package/dist/esm/product/settingssection/settingssection.recipe.js +1 -1
  193. package/dist/esm/product/settingsshell/settingsshell.js +1 -1
  194. package/dist/esm/product/settingsshell/settingsshell.recipe.js +2 -2
  195. package/dist/esm/product/sidebar/sidebar.js +6 -6
  196. package/dist/esm/product/tasklist/tasklist.js +1 -1
  197. package/dist/esm/product/tasklist/tasklist.recipe.js +1 -1
  198. package/dist/esm/product/trialbanner/trialbanner.js +1 -1
  199. package/dist/esm/product/trialbanner/trialbanner.recipe.js +2 -2
  200. package/dist/esm/product/viewtoggle/viewtoggle.js +1 -1
  201. package/dist/esm/product/viewtoggle/viewtoggle.recipe.js +1 -1
  202. package/dist/fileupload.css +2 -2
  203. package/dist/recordpage.css +1 -1
  204. package/dist/recordstable.css +1 -1
  205. package/dist/settingsshell.css +1 -1
  206. package/dist/styles.css +12 -12
  207. package/dist/types/components/avatargroup/avatargroup.d.ts +1 -1
  208. package/dist/types/components/barchart/barchart.d.ts +1 -1
  209. package/dist/types/components/breadcrumb/breadcrumb.d.ts +1 -1
  210. package/dist/types/components/bulkbar/bulkbar.d.ts +1 -1
  211. package/dist/types/components/callout/callout.d.ts +1 -1
  212. package/dist/types/components/checkbox/checkbox.d.ts +1 -1
  213. package/dist/types/components/columncalc/columncalc.d.ts +5 -5
  214. package/dist/types/components/datatable/datatable.d.ts +5 -5
  215. package/dist/types/components/datepickerfield/datepickerfield.d.ts +1 -1
  216. package/dist/types/components/dialog/dialog.d.ts +1 -1
  217. package/dist/types/components/donutchart/donutchart.d.ts +1 -1
  218. package/dist/types/components/emptystate/emptystate.d.ts +1 -1
  219. package/dist/types/components/formfield/formfield.d.ts +1 -1
  220. package/dist/types/components/linechart/linechart.d.ts +1 -1
  221. package/dist/types/components/menu/menu.d.ts +1 -1
  222. package/dist/types/components/multiselect/multiselect.d.ts +1 -1
  223. package/dist/types/components/progress/progress.d.ts +1 -1
  224. package/dist/types/components/radiogroup/radiogroup.d.ts +1 -1
  225. package/dist/types/components/resizablepanel/resizablepanel.d.ts +4 -4
  226. package/dist/types/components/segmented/segmented.d.ts +1 -1
  227. package/dist/types/components/select/select.d.ts +2 -2
  228. package/dist/types/components/stagebar/stagebar.d.ts +1 -1
  229. package/dist/types/components/statcard/statcard.d.ts +1 -1
  230. package/dist/types/components/switch/switch.d.ts +1 -1
  231. package/dist/types/components/tabletoolbar/tabletoolbar.d.ts +1 -1
  232. package/dist/types/components/tabs/tabs.d.ts +2 -2
  233. package/dist/types/components/textarea/textarea.d.ts +1 -1
  234. package/dist/types/components/tooltip/tooltip.d.ts +1 -1
  235. package/dist/types/product/appshell/appshell.d.ts +2 -2
  236. package/dist/types/product/authshell/authshell.d.ts +1 -1
  237. package/dist/types/product/board/board.d.ts +1 -1
  238. package/dist/types/product/entitycard/entitycard.d.ts +1 -1
  239. package/dist/types/product/flowcanvas/flowcanvas.d.ts +1 -1
  240. package/dist/types/product/inbox/inbox.d.ts +1 -1
  241. package/dist/types/product/listpage/listpage.d.ts +1 -1
  242. package/dist/types/product/onboarding/onboarding.d.ts +1 -1
  243. package/dist/types/product/recordpage/recordpage.d.ts +2 -2
  244. package/dist/types/product/recordstable/recordstable.d.ts +10 -4
  245. package/dist/types/product/recordstable/recordstable.tag.d.ts +1 -1
  246. package/dist/types/product/richtext/richtext.d.ts +1 -1
  247. package/dist/types/product/settingssection/settingssection.d.ts +1 -1
  248. package/dist/types/product/settingsshell/settingsshell.d.ts +1 -1
  249. package/dist/types/product/sidebar/sidebar.d.ts +10 -10
  250. package/dist/types/product/tasklist/tasklist.d.ts +1 -1
  251. package/dist/types/product/trialbanner/trialbanner.d.ts +1 -1
  252. package/dist/types/product/viewtoggle/viewtoggle.d.ts +1 -1
  253. package/package.json +1 -1
@@ -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;
@@ -52,7 +52,7 @@ function useFieldWiring({ htmlFor, messageId, invalid, required, }) {
52
52
  }, [htmlFor, messageId, invalid, required]);
53
53
  }
54
54
  /**
55
- * A labelled form field — measured from Attio's Settings forms. A muted label
55
+ * A labelled form field — measured from settings forms. A muted label
56
56
  * above any control, with an optional description or error line below. When
57
57
  * `error` is set it replaces the description; the control is given
58
58
  * `aria-describedby`, plus `aria-invalid` and `aria-required` as they apply.
@@ -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
@@ -10,7 +10,7 @@ function niceNum(raw) {
10
10
  return step * mag;
11
11
  }
12
12
  /**
13
- * A responsive line chart — measured from Attio's Reports historical charts.
13
+ * A responsive line chart — measured from a reports historical chart.
14
14
  * A stretched SVG line/area (non-scaling stroke keeps it crisp) over dashed
15
15
  * gridlines; dots are HTML so they stay round. `role="img"` with a summary.
16
16
  */
@@ -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.
@@ -6,7 +6,7 @@ import { menuRecipe } from "./menu.recipe.js";
6
6
  import { useMenuKeyboard } from "./menu-keyboard.js";
7
7
  const MenuContext = React.createContext(null);
8
8
  /**
9
- * A dropdown menu — the ⋯ / sort / filter menu surface, on Attio's measured
9
+ * A dropdown menu — the ⋯ / sort / filter menu surface, on a measured
10
10
  * popover. Give it a `trigger` element and Menu items as children. Opens on
11
11
  * click / ↓ / Enter; roving-focus keyboard model (↑/↓ move, Home/End jump,
12
12
  * typeahead, Enter/Space select, Esc closes and returns focus to the trigger);
@@ -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.
@@ -24,7 +24,7 @@ function Chip({ opt }) {
24
24
  return (_jsx("span", { className: "recordstable-tag", "data-tone": opt.tone ?? toneFor(opt.value), children: opt.label }));
25
25
  }
26
26
  /**
27
- * A multi-select / tag editor — measured from Attio's cell tag picker. The
27
+ * A multi-select / tag editor — measured from a cell tag picker. The
28
28
  * outlined trigger shows the selected values as coloured chips; it opens a
29
29
  * popover with a search field over rows of "[chip] … [checkbox]" that toggle on
30
30
  * click (the menu stays open). Keyboard: ↑/↓ move, Enter toggles, Esc closes.
@@ -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
@@ -5,7 +5,7 @@ import { radiogroupRecipe } from "./radiogroup.recipe.js";
5
5
  import { useRadioGroupKeyboard } from "./radiogroup-keyboard.js";
6
6
  const RadioContext = React.createContext(null);
7
7
  /**
8
- * A radio group — measured from Attio's settings. `default` renders rows (a ring
8
+ * A radio group — measured from a settings page. `default` renders rows (a ring
9
9
  * that fills brand when selected + a label); `card` renders a row of bordered
10
10
  * preview cards whose border turns brand when picked (the Theme picker). Arrow
11
11
  * keys move between options (roving focus). Controlled or uncontrolled.
@@ -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.
@@ -53,7 +53,7 @@ export function writeStoredPercent(key, percent, storage = window.localStorage)
53
53
  }
54
54
  }
55
55
  /**
56
- * Attio's adjustable-panel primitive: a spacer that reserves layout width
56
+ * An adjustable-panel primitive: a spacer that reserves layout width
57
57
  * plus a panel that overlays it, so the panel can move between docked
58
58
  * (in-flow) and floating (`position: fixed`, an overlay) without a reflow
59
59
  * glitch. Drag the edge handle to resize; constraints are CSS `min-width`/
@@ -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
- // Attio's adjustable-panel primitive (measured live — see
4
- // docs/study/attio-panels.md §1-2). Two elements carry the layout: an
3
+ // The adjustable-panel primitive (measured live). Two elements carry the
4
+ // layout: an
5
5
  // invisible SPACER that reserves flow width (it alone animates `width`, a
6
6
  // cheap reflow of a leaf node) and the PANEL, taken out of flow with
7
7
  // `position: absolute` and drawn on top of the spacer. That split is what
@@ -4,7 +4,7 @@ import { useLabelAssociation } from "../../core/index.js";
4
4
  import { useRadioGroupKeyboard } from "../radiogroup/index.js";
5
5
  import { segmentedRecipe } from "./segmented.recipe.js";
6
6
  /**
7
- * A segmented control (single-choice toggle) — measured from Attio's view
7
+ * A segmented control (single-choice toggle) — measured from a view
8
8
  * switcher. `role="radiogroup"` over `role="radio"` buttons with roving
9
9
  * tabindex and ←/→ (Home/End) keyboard selection.
10
10
  */
@@ -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 segmented control — Attio's view switcher: a subtle track holding options,
3
+ // A segmented control — a view switcher: a subtle track holding options,
4
4
  // the selected one raised on a white pill.
5
5
  const config = defineRecipe({
6
6
  name: "segmented",
@@ -10,7 +10,7 @@ function optionText(o) {
10
10
  return typeof o.label === "string" ? o.label : o.value;
11
11
  }
12
12
  /**
13
- * A select / dropdown — the settings control, measured from Attio, with an
13
+ * A select / dropdown — the settings control, measured live, with an
14
14
  * optional Linear-style search. A `role="combobox"` trigger opens a
15
15
  * `role="listbox"`; pass `searchable` to add a filter field at the top (with a
16
16
  * "No results" empty state). Full keyboard model — ↑/↓ move, Enter/Space pick,
@@ -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 select / dropdown, measured from Attio's settings: a 32px combobox trigger
3
+ // A select / dropdown, measured from settings: a 32px combobox trigger
4
4
  // (radius 9, value + a 16px chevron) over a listbox — radius 12, 4px padding, a
5
5
  // layered soft shadow — of 32px options (radius 8, 6/8 padding) that show a
6
6
  // check on the selected one and highlight on hover / keyboard. The listbox is
@@ -54,7 +54,7 @@ const config = defineRecipe({
54
54
  `,
55
55
  variants: {
56
56
  // ghost: borderless at rest (transparent), reveals a subtle fill on hover —
57
- // Attio's inline selects (e.g. the sort configurator).
57
+ // inline selects (e.g. the sort configurator).
58
58
  variant: {
59
59
  default: "",
60
60
  ghost: `
@@ -2,9 +2,9 @@ import { defineRecipe, resolveRecipe } from "../../core/index.js";
2
2
  import { contract as c, elevation as e } from "../../tokens/index.js";
3
3
  // seed-design's slider, shape for shape, in crisp's colours.
4
4
  //
5
- // Attio ships no slider anywhere — Records, Reports, Settings and the record
5
+ // No slider ships anywhere — Records, Reports, Settings and the record
6
6
  // pages contain no `input[type=range]` or `[role=slider]` — so there is nothing
7
- // of Attio's to measure. The GEOMETRY is therefore seed's own, read from
7
+ // measured to draw from. The GEOMETRY is therefore seed's own, read from
8
8
  // `@seed-design/css/recipes/slider.css`: a 26px control row, a 4px track on
9
9
  // `radius.full`, a 20px thumb whose visible disc is an `::after` that scales to
10
10
  // 1.2 while dragging, and a 2px focus ring offset 2px.
@@ -2,7 +2,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { stagebarRecipe } from "./stagebar.recipe.js";
3
3
  const DEFAULT = "#266df0";
4
4
  /**
5
- * A pipeline stage bar — measured from Attio's Deal-stage Highlight. Each stage
5
+ * A pipeline stage bar — measured from a deal-stage highlight. Each stage
6
6
  * is a segment tinted with its colour; the current stage is at full strength.
7
7
  */
8
8
  export function StageBar({ stages, current, "aria-label": ariaLabel, className, ...rest }) {
@@ -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 pipeline stage indicator — Attio's Deal-stage Highlight bar: one segment per
3
+ // A pipeline stage indicator — a Deal-stage Highlight bar: one segment per
4
4
  // stage, each tinted with its stage colour, the current stage at full strength.
5
5
  const config = defineRecipe({
6
6
  name: "stagebar",
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { ArrowDown, ArrowUp } from "lucide-react";
3
3
  import { statcardRecipe } from "./statcard.recipe.js";
4
4
  /**
5
- * A single-metric KPI tile — measured from Attio's Reports number/insight cards.
5
+ * A single-metric KPI tile — measured from a reports number/insight card.
6
6
  * Label, a large value, and an optional up/down delta pill with a caption.
7
7
  */
8
8
  export function StatCard({ label, icon, value, delta, deltaSuffix = "%", caption, card, className, ...rest }) {
@@ -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 single-metric KPI tile — measured from Attio's Reports "Insight" number
3
+ // A single-metric KPI tile — measured from a Reports "Insight" number
4
4
  // report: a small muted label, a large semibold value, and an optional delta
5
5
  // pill (green up / red down) with a caption. Fills its container.
6
6
  const config = defineRecipe({
@@ -18,7 +18,7 @@ const config = defineRecipe({
18
18
  & .statcard-delta[data-trend="flat"] { background: color-mix(in srgb, ${c.fgPrimary} 6%, transparent); color: ${c.fgMuted}; }`,
19
19
  variants: {
20
20
  // Opt-in chrome for consumers who want the tile self-contained instead of
21
- // hand-wrapping it in <Card><CardBody>. Not measured as part of the Attio
21
+ // hand-wrapping it in <Card><CardBody>. Not measured as part of the
22
22
  // report tile itself (the tile sits bare inside the report's own Card —
23
23
  // see the docs page) — reuses Card's exact border/radius/bg rather than
24
24
  // inventing a new value, since it is only ever an explicit opt-in.
@@ -3,7 +3,7 @@ import * as React from "react";
3
3
  import { formValueStyle, useFormReset } from "../../core/index.js";
4
4
  import { switchRecipe } from "./switch.recipe.js";
5
5
  /**
6
- * An on/off toggle — the settings switch, measured from Attio. Renders a
6
+ * An on/off toggle — the settings switch, measured live. Renders a
7
7
  * `role="switch"` button (a native checkbox's semantics without its box), so
8
8
  * label association and keyboard (Space/Enter) come for free. Controlled via
9
9
  * `checked`/`onCheckedChange`, or uncontrolled from `defaultChecked`.
@@ -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 settings toggle, measured from the live app: a 24×16 pill track that
3
+ // A settings toggle, measured from the live app: a 24×16 pill track that
4
4
  // flips from a muted grey to brand blue (#266df0), with a 12px white thumb
5
5
  // (2px inset) that slides 8px across. background + transform both animate .2s.
6
6
  const config = defineRecipe({
@@ -2,7 +2,7 @@ import { defineRecipe, resolveRecipe } from "../../core/index.js";
2
2
  import { contract as c } from "../../tokens/index.js";
3
3
  // A general-purpose, composable data table — the lightweight primitive for
4
4
  // arbitrary tabular data (as opposed to `product/recordstable`, which is a
5
- // faithful rebuild of Attio's heavy records grid). It carries the SAME measured
5
+ // faithful rebuild of a heavy records grid). It carries the SAME measured
6
6
  // grid styling as RecordsTable — 36px rows, a 40px header, hairline vertical +
7
7
  // horizontal grid lines — so `DataTable` (built on this) matches that polish.
8
8
  const config = defineRecipe({
@@ -1,12 +1,12 @@
1
1
  import { contract as c, elevation as e } from "../../tokens/index.js";
2
- // The measured chrome of Attio's table toolbar: the Sort/Filter controls, the
2
+ // The measured chrome of the table toolbar: the Sort/Filter controls, the
3
3
  // menu/popover surface they open into, the sort-condition rows, and the filter
4
4
  // chips. It lives here, parameterised by class prefix, because TWO surfaces
5
5
  // render it — the standalone `TableToolbar` primitive and `RecordsTable`, whose
6
6
  // markup predates it and must keep its own `recordstable-` class names.
7
7
  //
8
8
  // These strings were MOVED out of `recordstable.recipe.ts` verbatim, not
9
- // retyped: every value is still the one measured from Attio. Do not "tidy" them.
9
+ // retyped: every value is still the one originally measured. Do not "tidy" them.
10
10
  //
11
11
  // It comes in two halves because RecordsTable interleaves three rules of its own
12
12
  // (the context-menu z-index and the column drop-target) into the middle of the
@@ -28,7 +28,7 @@ const asText = (v) => {
28
28
  // Before the generic object branch, which would look for `.name`, find none
29
29
  // and return "" — turning every Date into the empty string (#185). The ISO
30
30
  // date is stable and locale-independent, so `contains "2026-06"` works; it
31
- // will not match "16/06/2026", and a date-aware operator set is Attio's
31
+ // will not match "16/06/2026", and a date-aware operator set needs a
32
32
  // date-picker UI, which has to be measured before it can be built.
33
33
  if (v instanceof Date)
34
34
  return Number.isNaN(v.getTime()) ? "" : v.toISOString().slice(0, 10);
@@ -90,7 +90,7 @@ export function applySorts(rows, sorts, get = (row, key) => row[key]) {
90
90
  });
91
91
  }
92
92
  /**
93
- * Attio's table toolbar as a standalone primitive: the Sort and Filter
93
+ * The table toolbar as a standalone primitive: the Sort and Filter
94
94
  * controls, their menus, the sort-condition rows and the filter chips.
95
95
  *
96
96
  * `RecordsTable` renders this same measured chrome internally; this is the
@@ -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
  import { toolbarChromeBody, toolbarChromeHead } from "./tabletoolbar.chrome.js";
4
- // Attio's table toolbar, measured: 28px controls, the Sort/Filter buttons and
4
+ // The table toolbar, measured: 28px controls, the Sort/Filter buttons and
5
5
  // the menus they open, sort-condition rows, and the filter chips. The chrome
6
6
  // itself lives in ./tabletoolbar.chrome.ts because RecordsTable renders the
7
7
  // same measured surface under its own class prefix — one source, two prefixes,
@@ -4,8 +4,8 @@ import { tabsRecipe } from "./tabs.recipe.js";
4
4
  import { useTablistKeyboard } from "./tabs-keyboard.js";
5
5
  /**
6
6
  * A row of text tabs over a sliding ink underline — the record-view tab bar,
7
- * measured from Attio. Roving-tabindex keyboard model (←/→ move + activate,
8
- * Home/End jump); activation follows focus, matching Attio. Controlled via
7
+ * measured live. Roving-tabindex keyboard model (←/→ move + activate,
8
+ * Home/End jump); activation follows focus. Controlled via
9
9
  * `value`/`onValueChange`, or uncontrolled from `defaultValue`.
10
10
  */
11
11
  export function Tabs({ tabs, value, defaultValue, onValueChange, leading, children, className, "aria-label": ariaLabel, ...rest }) {
@@ -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 record-view tabs: a row of segmented tab buttons over a 1px baseline.
3
+ // Record-view tabs: a row of segmented tab buttons over a 1px baseline.
4
4
  // The active tab is a light pill — bg #fbfbfb + inset ring borderSubtle, r8 —
5
5
  // with a 2px ink underline that slides along the baseline; inactive tabs are
6
6
  // muted and fill to a subtle pill on hover. Each tab carries a 16px leading icon
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import * as React from "react";
3
3
  import { textareaRecipe } from "./textarea.recipe.js";
4
4
  /**
5
- * A multiline text field — measured from Attio's settings. Forwards every native
5
+ * A multiline text field — measured from settings. Forwards every native
6
6
  * `<textarea>` prop; pass `showCount` with `maxLength` to render a live
7
7
  * character counter (which turns red if the value exceeds the limit).
8
8
  */
@@ -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 multiline text field, measured from Attio's settings "Personal context": an
3
+ // A multiline text field, measured from a settings "Personal context" field: an
4
4
  // inset 1px ring (radius 8), 14px text, 6/10 padding, and an optional character
5
5
  // counter pinned bottom-right (12px, muted). Focus rings the field brand.
6
6
  const config = defineRecipe({
@@ -3,7 +3,7 @@ import * as React from "react";
3
3
  import { createPortal } from "react-dom";
4
4
  import { tooltipRecipe } from "./tooltip.recipe.js";
5
5
  /**
6
- * A hover/focus tooltip — a dark hint chip measured from Attio. Wraps its
6
+ * A hover/focus tooltip — a dark hint chip measured live. Wraps its
7
7
  * trigger in an inline element, shows after `delay` on pointer-enter / focus,
8
8
  * and hides on leave / blur / Escape. The bubble is portaled and positioned
9
9
  * above the trigger (flipping below near the top edge).
@@ -1,6 +1,6 @@
1
1
  import { defineRecipe, resolveRecipe } from "../../core/index.js";
2
2
  import { contract as c } from "../../tokens/index.js";
3
- // The floating bubble for a Tooltip — Attio's dark hint chip. Applied to the
3
+ // The floating bubble for a Tooltip — a dark hint chip. Applied to the
4
4
  // portaled bubble itself (not a wrapper), so its styles survive the portal.
5
5
  const config = defineRecipe({
6
6
  name: "tooltip",
@@ -4,8 +4,8 @@ import * as React from "react";
4
4
  import { isRtlElement } from "../../core/index.js";
5
5
  import { appshellRecipe } from "./appshell.recipe.js";
6
6
  /**
7
- * App-shell layout with a collapsible + resizable sidebar, mirroring Attio's
8
- * window: drag the sidebar's right edge to resize, press the sidebar's
7
+ * App-shell layout with a collapsible + resizable sidebar, mirroring a live
8
+ * app's window: drag the sidebar's right edge to resize, press the sidebar's
9
9
  * collapse button to slide it away (a floating button brings it back). The
10
10
  * sidebar pane clips rather than squishing, so its content never reflows.
11
11
  */
@@ -32,8 +32,8 @@ export function AppShell({ sidebar, children, width: widthProp, defaultWidth = 2
32
32
  // it there. Mirroring the handle's CSS without this is the half-conversion
33
33
  // lesson 54 is about, which is why both change in one commit (#212).
34
34
  const dir = isRtlElement(e.currentTarget) ? -1 : 1;
35
- // Attio only enters the drag state once the pointer has actually moved — a
36
- // click on the handle is not a drag, so the blue bar must not flash on press.
35
+ // Only enter the drag state once the pointer has actually moved — a click
36
+ // on the handle is not a drag, so the blue bar must not flash on press.
37
37
  let moved = false;
38
38
  let last = startW;
39
39
  const prevSelect = document.body.style.userSelect;
@@ -1,7 +1,7 @@
1
1
  import { defineRecipe, resolveRecipe, rtlFlipCss } from "../../core/index.js";
2
2
  import { contract as c } from "../../tokens/index.js";
3
3
  // App-shell layout: a collapsible + resizable sidebar pane next to a main pane,
4
- // mirroring how Attio's window works. The sidebar pane clips (never squishes)
4
+ // mirroring a familiar app-window layout. The sidebar pane clips (never squishes)
5
5
  // when collapsing, and a drag handle on its edge resizes it.
6
6
  const config = defineRecipe({
7
7
  name: "appshell",
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { authshellRecipe } from "./authshell.recipe.js";
3
3
  /**
4
- * The Attio welcome/auth layout (app.attio.com/welcome/*) — measured live.
4
+ * The welcome/auth layout — measured live.
5
5
  * A centered page frame: an optional top progress bar, a logo, a two-pane
6
6
  * card (the form + an optional product preview, hidden under 1200px), and
7
7
  * a footer. Auth-surface Input/FormField/Button treatment (flatter fields,
@@ -1,11 +1,11 @@
1
1
  import { defineRecipe, resolveRecipe } from "../../core/index.js";
2
2
  import { contract as c } from "../../tokens/index.js";
3
- // Attio's welcome/auth surface (app.attio.com/welcome/*) — measured live,
3
+ // A welcome/auth surface — measured live,
4
4
  // 2026-09-15. A centered page frame holding a two-pane card: the form on the
5
5
  // left, an optional product preview on the right, with an optional top
6
6
  // progress bar and a footer under the card. Every value below is measured
7
7
  // from the live app, EXCEPT the 1200px preview-hiding breakpoint (called out
8
- // at the container query below) — Attio drops the pane in JS somewhere between a
8
+ // at the container query below) — the pane drops out in JS somewhere between a
9
9
  // measured 954px and 1393px viewport width, so 1200px is chosen, not measured.
10
10
  const config = defineRecipe({
11
11
  name: "authshell",
@@ -48,7 +48,7 @@ const config = defineRecipe({
48
48
  & .authshell-body .button { height: 36px; padding-inline: ${c.space["3"]}; border-radius: 10px; }
49
49
  & .authshell-body .button--intent_primary { box-shadow: inset 0 0 0 1px rgba(0,0,0,0.06), 0 2px 4px -2px rgba(38,109,240,0.12), 0 3px 6px -2px rgba(38,109,240,0.08); }
50
50
 
51
- /* Attio drops the preview pane in JS on narrow viewports (measured: two
51
+ /* The preview pane drops out in JS on narrow viewports (measured: two
52
52
  panes at 1393px, one at 954px), so 1200px is a chosen threshold inside
53
53
  that bracket, not a measured value. A CONTAINER query, not a media
54
54
  query: the shell is embedded in the docs inside an ~800px column, where
@@ -6,7 +6,7 @@ import { boardRecipe } from "./board.recipe.js";
6
6
  * A kanban board with native drag-and-drop between columns. Cards are
7
7
  * `draggable`; dropping one on a column reparents it via `onCardsChange`
8
8
  * (the parent owns the cards, so the move is a controlled state update).
9
- * Measured from Attio's Deals pipeline.
9
+ * Measured from a deals pipeline.
10
10
  */
11
11
  export function Board({ columns, cards, onCardsChange, renderCard, onNewCard, newCardLabel = "New", getCardLabel, announceMove = (column, card) => card ? `${card} moved to ${column}` : `Moved to ${column}`, className, ...rest }) {
12
12
  const [dragId, setDragId] = React.useState(null);
@@ -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 kanban board — measured from Attio's Deals pipeline: horizontally scrolling
3
+ // A kanban board — measured from a Deals pipeline: horizontally scrolling
4
4
  // columns (dot + title + count header, a "New" button, a stack of draggable
5
5
  // cards), with the hovered drop column highlighted.
6
6
  const config = defineRecipe({
@@ -208,7 +208,7 @@ export function Command({ open, onOpenChange, items = defaultCommandItems, place
208
208
  combo.setInputValue("", "script");
209
209
  combo.clearHighlightValue();
210
210
  }, [open]);
211
- // The footer's primary button mirrors the currently highlighted row (Attio
211
+ // The footer's primary button mirrors the currently highlighted row (this
212
212
  // shows the active action there and runs it on ↵ / click).
213
213
  const highlightedItem = filteredItems.find((item) => item.id === combo.highlightedValue) ??
214
214
  filteredItems[0];
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { entitycardRecipe } from "./entitycard.recipe.js";
3
3
  /**
4
- * A note / entity card — measured from Attio's Notes grid. A bordered white
4
+ * A note / entity card — measured from a notes grid. A bordered white
5
5
  * card with an author row, a title, a clamped excerpt, and a footer row with a
6
6
  * right-aligned date. Rendered as a button so the whole card is clickable.
7
7
  */
@@ -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 note / entity card — measured from Attio's Notes grid: a bordered white card
3
+ // A note / entity card — measured from a Notes grid: a bordered white card
4
4
  // with an author row (avatar + name) at the top, a title, a clamped excerpt,
5
5
  // and a footer row (avatar + name … date). The whole card is clickable.
6
6
  const config = defineRecipe({
@@ -6,7 +6,7 @@ const GRID = 20;
6
6
  const clampZoom = (z) => Math.min(1.5, Math.max(0.5, z));
7
7
  /**
8
8
  * A pannable, zoomable node canvas with draggable nodes and connecting edges —
9
- * measured from Attio's Workflows editor. Drag a node to move it (fires
9
+ * measured from a workflows editor. Drag a node to move it (fires
10
10
  * `onNodesChange`); drag the background to pan; use the toolbar to zoom.
11
11
  */
12
12
  export function FlowCanvas({ nodes, edges, onNodesChange, renderNode, nodeWidth = 240, nodeHeight = 64, "aria-label": ariaLabel, className, zoomOutLabel = "Zoom out", zoomInLabel = "Zoom in", resetLabel = "Reset", edgesLabel = "Edges", ...rest }) {
@@ -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 pannable, zoomable node canvas — measured from Attio's Workflows editor:
3
+ // A pannable, zoomable node canvas — measured from a Workflows editor:
4
4
  // a dotted-grid background, draggable node cards, and connecting edges with dots.
5
5
  const config = defineRecipe({
6
6
  name: "flowcanvas",
@@ -4,7 +4,7 @@ import * as React from "react";
4
4
  import { useTablistKeyboard } from "../../components/tabs/index.js";
5
5
  import { inboxRecipe } from "./inbox.recipe.js";
6
6
  /**
7
- * A notifications inbox panel — measured from Attio's notification flyout. A
7
+ * A notifications inbox panel — measured from a notification flyout. A
8
8
  * title, Notifications/Requests tabs with counts, then notification rows
9
9
  * (avatar + message + time + unread dot) or a centred empty state. Put it inside
10
10
  * a Popover for the flyout.
@@ -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 notifications inbox panel — measured from Attio's notification flyout: a
3
+ // A notifications inbox panel — measured from a notification flyout: a
4
4
  // ~380px rounded panel with a title, "Notifications / Requests" tabs (with
5
5
  // counts), then notification rows (avatar + message + time + unread dot) or a
6
6
  // centred empty state. Drop it in a Popover for the flyout, or use standalone.