@scalepad/ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. package/.ai/rules/date-handling.md +39 -0
  2. package/.ai/rules/figma-design-system.md +372 -0
  3. package/.ai/rules/figma-lm-design-system-keys.md +680 -0
  4. package/.ai/rules/file-extensions.md +13 -0
  5. package/.ai/rules/modal-confirmation-mutation.md +56 -0
  6. package/.ai/rules/react-hooks.md +29 -0
  7. package/.ai/rules/styling.md +83 -0
  8. package/AGENTS.md +37 -0
  9. package/README.md +125 -0
  10. package/figma.config.json +9 -0
  11. package/package.json +127 -0
  12. package/scripts/install-ai-rules.mjs +136 -0
  13. package/src/ThemeProvider.tsx +57 -0
  14. package/src/charts.ts +32 -0
  15. package/src/components/ActionCard/ActionCard.css.ts +60 -0
  16. package/src/components/ActionCard/ActionCard.tsx +154 -0
  17. package/src/components/ActionCard/index.ts +2 -0
  18. package/src/components/Anchor/Anchor.tsx +47 -0
  19. package/src/components/Anchor/index.ts +2 -0
  20. package/src/components/AppliedFiltersManagerBar/AppliedFiltersManagerBar.tsx +105 -0
  21. package/src/components/AppliedFiltersManagerBar/FilterBadge.css.ts +23 -0
  22. package/src/components/AppliedFiltersManagerBar/FilterBadge.tsx +50 -0
  23. package/src/components/AppliedFiltersManagerBar/index.ts +5 -0
  24. package/src/components/Badge/Badge.css.ts +72 -0
  25. package/src/components/Badge/Badge.figma.tsx +43 -0
  26. package/src/components/Badge/Badge.tsx +159 -0
  27. package/src/components/Badge/index.ts +2 -0
  28. package/src/components/BreadCrumb/BreadCrumb.tsx +62 -0
  29. package/src/components/BreadCrumb/index.ts +2 -0
  30. package/src/components/BulkActionBar/BulkActionBar.css.ts +26 -0
  31. package/src/components/BulkActionBar/BulkActionBar.tsx +164 -0
  32. package/src/components/BulkActionBar/index.ts +2 -0
  33. package/src/components/Button/Button.css.ts +272 -0
  34. package/src/components/Button/Button.figma.tsx +74 -0
  35. package/src/components/Button/Button.tsx +84 -0
  36. package/src/components/Button/index.ts +2 -0
  37. package/src/components/Charts/ChartTooltip.figma.tsx +33 -0
  38. package/src/components/Charts/ChartTooltip.tsx +101 -0
  39. package/src/components/Charts/MiniBarSparkline.tsx +75 -0
  40. package/src/components/Charts/StackedPatternBarChart.tsx +494 -0
  41. package/src/components/Charts/TrendAreaChart.css.ts +23 -0
  42. package/src/components/Charts/TrendAreaChart.tsx +210 -0
  43. package/src/components/Charts/index.ts +12 -0
  44. package/src/components/CodePanel/CodePanel.css.ts +113 -0
  45. package/src/components/CodePanel/CodePanel.tsx +121 -0
  46. package/src/components/CodePanel/index.ts +2 -0
  47. package/src/components/CommentComposer/CommentComposer.css.ts +60 -0
  48. package/src/components/CommentComposer/CommentComposer.tsx +181 -0
  49. package/src/components/CommentComposer/index.ts +2 -0
  50. package/src/components/ConfirmationModal/ConfirmationModal.tsx +149 -0
  51. package/src/components/ConfirmationModal/index.ts +2 -0
  52. package/src/components/ConfirmationTooltip/ConfirmationTooltip.tsx +132 -0
  53. package/src/components/ConfirmationTooltip/index.ts +2 -0
  54. package/src/components/DataDialog.figma.tsx +33 -0
  55. package/src/components/DataDialog.tsx +46 -0
  56. package/src/components/DataTable/DataTable.tsx +1042 -0
  57. package/src/components/DataTable/RowExpandToggle.tsx +105 -0
  58. package/src/components/DataTable/RowGroupHeader.tsx +190 -0
  59. package/src/components/DataTable/createActionsColumn.tsx +86 -0
  60. package/src/components/DataTable/index.ts +25 -0
  61. package/src/components/DatePicker/CustomRangePicker.tsx +59 -0
  62. package/src/components/DatePicker/DateInput.tsx +329 -0
  63. package/src/components/DatePicker/DateNavigator.tsx +486 -0
  64. package/src/components/DatePicker/DatePicker.tsx +242 -0
  65. package/src/components/DatePicker/MonthlyRangePicker.tsx +231 -0
  66. package/src/components/DatePicker/QuarterlyRangePicker.tsx +224 -0
  67. package/src/components/DatePicker/QuickPicksSidebar.tsx +242 -0
  68. package/src/components/DatePicker/YearlyRangePicker.tsx +171 -0
  69. package/src/components/DatePicker/index.ts +7 -0
  70. package/src/components/DatePicker/types.ts +12 -0
  71. package/src/components/DesignSystemPrimitives/FluidGrid.tsx +44 -0
  72. package/src/components/DesignSystemPrimitives/InteractivePrimitives.tsx +177 -0
  73. package/src/components/DesignSystemPrimitives/LayoutPrimitives.tsx +220 -0
  74. package/src/components/DesignSystemPrimitives/LayoutPrimitives.types.tsx +15 -0
  75. package/src/components/DesignSystemPrimitives/SurfacePrimitives.tsx +46 -0
  76. package/src/components/DesignSystemPrimitives/index.ts +55 -0
  77. package/src/components/Details/Details.css.ts +74 -0
  78. package/src/components/Details/Details.tsx +140 -0
  79. package/src/components/Details/index.ts +2 -0
  80. package/src/components/DownloadCard/DownloadCard.css.ts +22 -0
  81. package/src/components/DownloadCard/DownloadCard.tsx +63 -0
  82. package/src/components/DownloadCard/index.ts +2 -0
  83. package/src/components/Drawer/Drawer.css.ts +32 -0
  84. package/src/components/Drawer/Drawer.tsx +236 -0
  85. package/src/components/Drawer/hooks/useDetailDrawer.ts +61 -0
  86. package/src/components/Drawer/hooks/useDetailDrawerNavigation.ts +125 -0
  87. package/src/components/Drawer/hooks/useDetailDrawerNavigationContext.ts +66 -0
  88. package/src/components/EditableRichText/EditableRichText.css.ts +72 -0
  89. package/src/components/EditableRichText/EditableRichText.tsx +324 -0
  90. package/src/components/EditableRichText/index.ts +2 -0
  91. package/src/components/EditableSelect/EditableSelect.css.ts +62 -0
  92. package/src/components/EditableSelect/EditableSelect.tsx +224 -0
  93. package/src/components/EditableSelect/index.ts +2 -0
  94. package/src/components/EditableText/EditableText.tsx +377 -0
  95. package/src/components/EditableText/index.ts +2 -0
  96. package/src/components/EmptyState/EmptyState.figma.tsx +33 -0
  97. package/src/components/EmptyState/EmptyState.tsx +230 -0
  98. package/src/components/EmptyState/index.ts +2 -0
  99. package/src/components/ErrorBoundary.tsx +135 -0
  100. package/src/components/ErrorState/ErrorState.tsx +197 -0
  101. package/src/components/ErrorState/index.ts +2 -0
  102. package/src/components/FeatureCard.tsx +42 -0
  103. package/src/components/FilterMenu/FilterMenu.figma.tsx +30 -0
  104. package/src/components/FilterMenu/FilterMenu.tsx +198 -0
  105. package/src/components/FilterMenu/FilterSubMenuTypes/BooleanFilterSubmenu.tsx +46 -0
  106. package/src/components/FilterMenu/FilterSubMenuTypes/SearchableFilterSubmenu.tsx +239 -0
  107. package/src/components/FilterMenu/FilterSubMenuTypes/index.ts +8 -0
  108. package/src/components/FilterMenu/defaultFilterSchemas.ts +63 -0
  109. package/src/components/FilterMenu/helpers.ts +115 -0
  110. package/src/components/FilterMenu/index.ts +35 -0
  111. package/src/components/FilterMenu/types.ts +101 -0
  112. package/src/components/IconButton/IconButton.css.ts +272 -0
  113. package/src/components/IconButton/IconButton.figma.tsx +47 -0
  114. package/src/components/IconButton/IconButton.tsx +72 -0
  115. package/src/components/IconButton/README.md +230 -0
  116. package/src/components/IconButton/index.ts +2 -0
  117. package/src/components/InfiniteScrollSentinel.tsx +86 -0
  118. package/src/components/InfiniteScrollTrigger.tsx +78 -0
  119. package/src/components/InfoCard.figma.tsx +47 -0
  120. package/src/components/InfoCard.tsx +216 -0
  121. package/src/components/KbdHint/KbdHint.tsx +23 -0
  122. package/src/components/KbdHint/index.ts +2 -0
  123. package/src/components/LabeledField/LabeledField.tsx +21 -0
  124. package/src/components/LabeledField/index.ts +2 -0
  125. package/src/components/LookupSelect/LookupSelect.css.ts +149 -0
  126. package/src/components/LookupSelect/LookupSelect.tsx +325 -0
  127. package/src/components/LookupSelect/index.ts +2 -0
  128. package/src/components/Menu/Menu.css.ts +89 -0
  129. package/src/components/Menu/Menu.tsx +105 -0
  130. package/src/components/Menu/index.ts +2 -0
  131. package/src/components/MessageBox/MessageBox.tsx +168 -0
  132. package/src/components/MessageBox/index.ts +2 -0
  133. package/src/components/MetricDisplay/MetricDisplay.tsx +55 -0
  134. package/src/components/MetricDisplay/index.ts +1 -0
  135. package/src/components/MultiSelect/MultiSelect.tsx +278 -0
  136. package/src/components/MultiSelect/index.ts +2 -0
  137. package/src/components/Notifications/Notifications.tsx +12 -0
  138. package/src/components/Notifications/README.md +93 -0
  139. package/src/components/Notifications/index.ts +4 -0
  140. package/src/components/Notifications/showToast.tsx +100 -0
  141. package/src/components/PropertyRow/PropertyRow.tsx +96 -0
  142. package/src/components/PropertyRow/index.ts +2 -0
  143. package/src/components/RadioTile/RadioTile.tsx +253 -0
  144. package/src/components/RadioTile/index.ts +2 -0
  145. package/src/components/RichText/FormattingToolbar.css.ts +69 -0
  146. package/src/components/RichText/FormattingToolbar.tsx +112 -0
  147. package/src/components/RichText/RichTextInline.css.ts +54 -0
  148. package/src/components/RichText/RichTextInline.tsx +318 -0
  149. package/src/components/RichText/formattingCommands.ts +181 -0
  150. package/src/components/RichText/formattingTypes.ts +34 -0
  151. package/src/components/RichText/index.ts +49 -0
  152. package/src/components/RichText/richTextExtensions.ts +111 -0
  153. package/src/components/RichText/richTextHelpers.ts +65 -0
  154. package/src/components/RichText/richTextImage.ts +253 -0
  155. package/src/components/RichText/richTextImageHandlers.ts +244 -0
  156. package/src/components/RichText/richTextProse.css.ts +261 -0
  157. package/src/components/RichTextEditor/RichTextEditor.css.ts +82 -0
  158. package/src/components/RichTextEditor/RichTextEditor.tsx +204 -0
  159. package/src/components/RichTextEditor/index.ts +2 -0
  160. package/src/components/RichTextView/RichTextView.css.ts +11 -0
  161. package/src/components/RichTextView/RichTextView.tsx +114 -0
  162. package/src/components/RichTextView/index.ts +2 -0
  163. package/src/components/Schedule/Schedule.tsx +35 -0
  164. package/src/components/SchedulePicker/SchedulePicker.css.ts +42 -0
  165. package/src/components/SchedulePicker/SchedulePicker.tsx +130 -0
  166. package/src/components/SchedulePicker/index.ts +2 -0
  167. package/src/components/SearchableList/types.ts +30 -0
  168. package/src/components/SearchableSubMenu/SearchableSubMenu.css.ts +25 -0
  169. package/src/components/SearchableSubMenu/SearchableSubMenu.tsx +139 -0
  170. package/src/components/SearchableSubMenu/index.ts +2 -0
  171. package/src/components/Select/README.md +114 -0
  172. package/src/components/Select/Select.css.ts +110 -0
  173. package/src/components/Select/Select.tsx +133 -0
  174. package/src/components/Select/index.ts +2 -0
  175. package/src/components/SelectCreatable/SelectCreatable.css.ts +16 -0
  176. package/src/components/SelectCreatable/SelectCreatable.tsx +203 -0
  177. package/src/components/SelectCreatable/index.ts +2 -0
  178. package/src/components/SettingsCard/SettingsCard.tsx +98 -0
  179. package/src/components/SettingsCard/index.ts +2 -0
  180. package/src/components/Sidebar/Sidebar.css.ts +91 -0
  181. package/src/components/Sidebar/Sidebar.tsx +129 -0
  182. package/src/components/Sidebar/index.ts +5 -0
  183. package/src/components/SimpleList/SimpleList.css.ts +12 -0
  184. package/src/components/SimpleList/SimpleList.tsx +44 -0
  185. package/src/components/SimpleList/index.ts +2 -0
  186. package/src/components/SimpleTable/SimpleTable.tsx +296 -0
  187. package/src/components/SimpleTable/index.ts +2 -0
  188. package/src/components/SlashRichTextEditor/SelectionBubbleMenu.css.ts +62 -0
  189. package/src/components/SlashRichTextEditor/SelectionBubbleMenu.tsx +85 -0
  190. package/src/components/SlashRichTextEditor/SlashCommandMenu.css.ts +124 -0
  191. package/src/components/SlashRichTextEditor/SlashCommandMenu.tsx +168 -0
  192. package/src/components/SlashRichTextEditor/SlashRichTextEditor.css.ts +81 -0
  193. package/src/components/SlashRichTextEditor/SlashRichTextEditor.tsx +538 -0
  194. package/src/components/SlashRichTextEditor/SlashSuggestionExtension.ts +48 -0
  195. package/src/components/SlashRichTextEditor/index.ts +13 -0
  196. package/src/components/SlashRichTextEditor/types.ts +48 -0
  197. package/src/components/StatCard/StatCard.css.ts +70 -0
  198. package/src/components/StatCard/StatCard.tsx +201 -0
  199. package/src/components/StatCard/index.ts +1 -0
  200. package/src/components/StatusBadge/StatusBadge.tsx +70 -0
  201. package/src/components/StatusBadge/index.ts +2 -0
  202. package/src/components/StatusIndicator/StatusIndicator.tsx +67 -0
  203. package/src/components/StatusIndicator/index.ts +6 -0
  204. package/src/components/SubNavigation/SubNavigation.css.ts +72 -0
  205. package/src/components/SubNavigation/SubNavigation.tsx +104 -0
  206. package/src/components/SubNavigation/index.ts +2 -0
  207. package/src/components/SuspenseLoader.tsx +22 -0
  208. package/src/components/Table/SortableColumnHeader.tsx +99 -0
  209. package/src/components/Table/TableSkeletonRows.figma.tsx +22 -0
  210. package/src/components/Table/TableSkeletonRows.tsx +113 -0
  211. package/src/components/Table/index.ts +9 -0
  212. package/src/components/TableActionsMenu.tsx +58 -0
  213. package/src/components/TableCard.tsx +29 -0
  214. package/src/components/TableContainer/TableContainer.tsx +86 -0
  215. package/src/components/TableContainer/index.ts +2 -0
  216. package/src/components/TableControlBar/TableControlBar.tsx +156 -0
  217. package/src/components/TableControlBar/TableSelectionButton.tsx +57 -0
  218. package/src/components/TableControlBar/index.ts +13 -0
  219. package/src/components/TableControlBar/useTableControlBar.tsx +314 -0
  220. package/src/components/TableSelection/TableSelection.tsx +43 -0
  221. package/src/components/TableSelection/index.ts +5 -0
  222. package/src/components/Tabs/README.md +76 -0
  223. package/src/components/Tabs/Tabs.css.ts +54 -0
  224. package/src/components/Tabs/Tabs.figma.tsx +47 -0
  225. package/src/components/Tabs/Tabs.tsx +96 -0
  226. package/src/components/Tabs/index.ts +8 -0
  227. package/src/components/TextInput/README.md +98 -0
  228. package/src/components/TextInput/SearchTextInput.figma.tsx +22 -0
  229. package/src/components/TextInput/SearchTextInput.tsx +150 -0
  230. package/src/components/TextInput/TextInput.figma.tsx +44 -0
  231. package/src/components/TextInput/TextInput.tsx +42 -0
  232. package/src/components/TextInput/index.ts +4 -0
  233. package/src/components/ThemeSwitcher.figma.tsx +28 -0
  234. package/src/components/ThemeSwitcher.tsx +69 -0
  235. package/src/components/TrendBadge/TrendBadge.tsx +76 -0
  236. package/src/components/TrendBadge/index.ts +2 -0
  237. package/src/components/TruncatedText.tsx +115 -0
  238. package/src/components/Typography/Text.tsx +74 -0
  239. package/src/components/Typography/Title.tsx +100 -0
  240. package/src/components/Typography/index.ts +4 -0
  241. package/src/geist-fonts.ts +48 -0
  242. package/src/hooks/index.ts +31 -0
  243. package/src/hooks/useFilters.ts +152 -0
  244. package/src/hooks/useInfiniteScroll.ts +62 -0
  245. package/src/hooks/usePlatform.ts +33 -0
  246. package/src/hooks/useServerTable.ts +495 -0
  247. package/src/hooks/useTableSelection.ts +102 -0
  248. package/src/hooks/useTableSort.ts +259 -0
  249. package/src/index.ts +483 -0
  250. package/src/mantine.ts +25 -0
  251. package/src/theme/mantineVars.ts +12 -0
  252. package/src/theme/themeContract.css.ts +131 -0
  253. package/src/theme/themeVars.ts +31 -0
  254. package/src/theme.ts +168 -0
  255. package/src/tokens/color-types.ts +107 -0
  256. package/src/tokens/colors.ts +243 -0
  257. package/src/tokens/index.ts +14 -0
  258. package/src/tokens/radius.ts +17 -0
  259. package/src/tokens/semantic-colors.ts +224 -0
  260. package/src/tokens/semantic-tokens-css.ts +53 -0
  261. package/src/tokens/shadows.ts +11 -0
  262. package/src/tokens/spacing.ts +20 -0
  263. package/src/tokens/text-styles.ts +179 -0
  264. package/src/tokens/typography.ts +40 -0
  265. package/src/tokens/zIndex.ts +27 -0
  266. package/src/types/mantine-theme.d.ts +17 -0
  267. package/src/types/tanstack-table.d.ts +22 -0
  268. package/src/utils/avatar.ts +150 -0
  269. package/src/utils/chartHelpers.ts +53 -0
  270. package/src/utils/color-props.ts +77 -0
  271. package/src/utils/createDesignComponent.tsx +104 -0
  272. package/src/utils/nestFlatRows.ts +111 -0
  273. package/src/utils/withStaticComponents.ts +6 -0
@@ -0,0 +1,680 @@
1
+ <!-- Auto-generated from .cursor/rules/ at publish time. Do not edit here; edit the canonical source. -->
2
+
3
+ > **Path-context note:** Paths in this rule that begin with `src/frontend/ClientApps/packages/ui/src/...` refer to the ScalePad UI source tree as authored. In your consumer project, that source lives at `node_modules/@scalepad/ui/src/...`. Treat the two paths as interchangeable when you're reading examples.
4
+
5
+
6
+ # LM Design System — Cached Key Reference
7
+
8
+ This file is a **persistent cache of LM Design System keys** harvested by walking the canonical LM Design System file (`fileKey VCLfybgU3OaUUPrQdBaVmP`, ~60 component pages + foundations). It is the *authoritative* key map for the published library — every key in this file was verified live against the LM Design System file on the harvest date below.
9
+
10
+ Pair this with [`figma-design-system.mdc`](mdc:.cursor/rules/figma-design-system.mdc). That file owns the *rules* (when to use which component, forbidden patterns, role-based color mapping). This file owns the *keys* you'd otherwise have to search for.
11
+
12
+ **Last harvested:** 2026-05-14 (full walk of LM Design System file `VCLfybgU3OaUUPrQdBaVmP` — every component page, every local variable in `Tokens`/`spacing`/`border radii`/`typography`/`shadows`/`Primitives` collections, all 19 text styles, all 10 effect styles, and the curated subset of the 1,604 `Icon /` glyphs that recurs in real mockups).
13
+
14
+ ## How to use this file
15
+
16
+ 1. Pick the component / variable / style by **role** using the existing `figma-design-system.mdc` mapping (e.g., "primary CTA → Button + `Background/Primary/filled`").
17
+ 2. Look up its **key** in the tables below.
18
+ 3. Pass it directly to `figma.importComponentSetByKeyAsync(KEY)` (component set) / `figma.importComponentByKeyAsync(KEY)` (single component, including icons) / `figma.variables.importVariableByKeyAsync(KEY)` (variable) / `figma.importStyleByKeyAsync(KEY)` (text or effect style).
19
+ 4. **Always still read `componentPropertyDefinitions` at runtime** for `INSTANCE_SWAP`, `BOOLEAN`, and `TEXT` property keys — those `#nnn:m` suffixes are unstable per `figma-design-system.mdc` §9. The cache only short-circuits the *component-key* lookup.
20
+
21
+ If the cache is missing a component you need, run `search_design_system` once for that name, **add the key to this file**, then proceed.
22
+
23
+ ## When the cache is wrong
24
+
25
+ Keys here are LM Design System keys that were live as of the timestamp above. They can rot if upstream rebuilds a component from scratch (rare but possible). If `importComponentSetByKeyAsync(...)` throws or returns null:
26
+
27
+ 1. **STOP.** Don't fall back to `Basic Design System` or a primitive recreation.
28
+ 2. Re-resolve via `search_design_system` filtered to the LM library:
29
+ ```js
30
+ search_design_system({
31
+ fileKey: "VCLfybgU3OaUUPrQdBaVmP",
32
+ query: "<component name>",
33
+ includeComponents: true,
34
+ includeLibraryKeys: ["lk-5ca1dcd26f40f0d14e872ac95ebdb56292e1c16c64d9157f837dc2ae6441e3d4a025a1dbcaadcb677883d963c16f12bdaefe8caf762f8b9f9c10f6dbf68d2c8e"]
35
+ })
36
+ ```
37
+ 3. Update the relevant row in this file with the new key and commit.
38
+
39
+ You can spot-check a row at any time with this script via `use_figma` against the LM Design System file:
40
+
41
+ ```js
42
+ const c = await figma.importComponentSetByKeyAsync("KEY_TO_CHECK")
43
+ .catch(() => figma.importComponentByKeyAsync("KEY_TO_CHECK"));
44
+ return c ? { name: c.name, key: c.key, type: c.type } : { missing: true };
45
+ ```
46
+
47
+ For a full refresh, run the harvest script in the appendix at the bottom of this file.
48
+
49
+ ---
50
+
51
+ ## Components (LM Design System)
52
+
53
+ All keys below resolve as either `ComponentSetNode` (most multi-variant components) or `ComponentNode` (single-variant components, including every `Icon /` glyph). Use `importComponentSetByKeyAsync` for the `set` rows and `importComponentByKeyAsync` for the `comp` rows.
54
+
55
+ ### Containers / surfaces
56
+
57
+ | Name | Type | Key | Page |
58
+ |---|---|---|---|
59
+ | `Card` | set | `0f29334183eb5fffd7ce6beebb62d758327a5236` | Card |
60
+ | `Hover Card` | comp | `f3964bccdd934e468248e7d866e720b319f92456` | Hover Card |
61
+ | `Carousel` | set | `c1d5409491cba1627cc4d0918c93ba7a207918f7` | Carousel |
62
+ | `Carousel with Image` | set | `967c8e34d448e42ff2a702bcafb5a8825219b83c` | Carousel |
63
+ | `Callout` (banner-style inline notice — `Type=Info/Danger/Success/Warning`, `Position=Right/Left`) | set | `6509231a30cc8caa9b1040847f2bb30f270db52b` | Misc |
64
+ | `Alert` (multi-variant alert / banner) | set | `38dc127d1f81583311d1e37a103223acf84ef0a5` | Alert |
65
+ | `Empty state` | set | `d5fba3c0ddf2b9f347658e446504010747512764` | Empty |
66
+ | `Status Circle` | set | `663ae7beaa9491fc91135051e48cb9ffb3c319c8` | Misc |
67
+ | `Change Badge` | set | `31280f2292e8b43cdc4f637d55516b9ce75165c3` | Misc |
68
+ | `Skeleton` | comp | `6b46011edd627f2485618e8e379b8aaa7167de22` | Skeleton |
69
+ | `Spinner` | set | `c3898df54cec8c8c3692bf4d07517977a513698c` | Spinner |
70
+ | `Scrollbar` | set | `b1d005e1e9fb2149d61f7088014e0af64be1c085` | Scroll Area |
71
+ | `Resizable` | set | `7be5bebf7f512f3fd623d3047c34dc08e4b94c4c` | Resizable |
72
+ | `Separator` | set | `6920afed7202c1e7244009c1213b71f4d584cb7b` | Separator |
73
+ | `Progress` | set | `4005fbc918c35e9e41ae48438c772fe2c2e04d53` | Progress |
74
+
75
+ ### Modals / overlays / drawers
76
+
77
+ | Name | Type | Key | Page |
78
+ |---|---|---|---|
79
+ | `Alert Dialog` (preferred for confirmation / destructive prompts) | set | `9b2fb3dcc9a991615d1119cb0638f5a01682700f` | Alert Dialog |
80
+ | `Dialog` (content-rich modal — compose with `Dialog Header` + `Dialog Footer`) | set | `7355510e158a6763456b32c5343a21a027a8f6cc` | Dialog |
81
+ | `Dialog Header` | set | `e3c57b705bf84a29859ea446edb757328c227885` | Dialog |
82
+ | `Dialog Footer` | set | `56b420ff4f55552f3b6cfa17a6b90fdf4549d3d3` | Dialog |
83
+ | `Sheet` (side-anchored panel — the design-system equivalent of a right-side drawer) | set | `95fd92d0079824fe9bfd6c9cd49822e4a35cf858` | Drawer |
84
+ | `Drawer` (bottom-anchored panel for mobile / action sheets) | comp | `7d880c6632c54e5a8a8d4c7307c85ac2ff185635` | Action Sheet |
85
+ | `Sonner` (toast container) | set | `e947ca4364abc409cc36cdc35c29703ebe47ba11` | Sonner |
86
+ | `Sonner Content` (single toast row) | set | `38a3d2001929316b93c165073ccfb90b9e285ab8` | Sonner |
87
+ | `Tooltip` | set | `b4fa55d58176d8fc5d6fd827249816903951be4b` | Tooltip |
88
+
89
+ > **Right-side drawer convention:** for the Deliverables Send drawer / UC15 pattern, use `Sheet` (key above). The cache previously claimed Sheet didn't exist — that was wrong. Always import `Sheet` for side panels; only fall back to hand-built frames if Sheet's variant axes don't fit the spec.
90
+
91
+ ### Buttons / actions
92
+
93
+ | Name | Type | Key | Notes |
94
+ |---|---|---|---|
95
+ | `Button` | set | `83ac5b19c84a63a4fb5888f1cf5de00d9f465abc` | Variant axes: `Roundness`, `Variant` (Primary/Secondary/Outline/Outline Inverse/Tertiary/Ghost/Ghost Muted/Destructive), `Size` (sm/md/lg), `State`. Conditional left/right icons gated by `Show left icon#…` / `Show right icon#…` booleans paired with `⮑ Left Content#…` / `⮑ Right Content#…` swaps. |
96
+ | `Icon Button` (Primary-default) | set | `4275032237ea7d094b375f5334924fec5df83b84` | First of two distinct icon-button sets. Defaults to Primary fill. |
97
+ | `Icon Button` (Outline / Ghost) | set | `6619ae7ba231cafb15cfb32a9d52d6f64fb58a09` | The Icon Button shipped on the **Icon Button** page. Use for tertiary / table-row / drawer-header icon buttons. The whole component is the icon — set `⮑ Left icon`. |
98
+ | `Button Group` | set | `fbefd8f01379701a469aeaf8ee685210212c3872` | Segmented button row. |
99
+ | `Button Group Icon Button` | set | `127b50c74c4d843b0a7b789a40149227bac27d27` | Segmented icon-only row. |
100
+ | `Toggle Button` (text + state toggle) | set | `73bb2298383961cafc859ee3b949fd60171d8777` | Toggle & Toggle Group page. |
101
+ | `Toggle Icon Button` (icon-only toggle) | set | `6f75dc4ecf14bc91ff6f8fd427585b09fbcaca03` | Toggle & Toggle Group page. |
102
+ | `Anchor` (text-style link, aka "Link Button") | set | `bbf68c07ff7866fba0cac46dab317b2fc6212953` | Anchor page. Use this for inline links / `text-link` styled CTAs — do **not** approximate with `Button Variant=Ghost`. |
103
+ | `Pagination Button` | set | `fc13a98aec84e7e20d741074649d853fec830391` | |
104
+ | `Pagination` (full pagination row) | set | `a388a13d09a3f0741e26e80a98db08d4260f0e85` | |
105
+ | `Pagination Ellipsis` | comp | `600eb5db1ec37869979cf853ee7fd481881f11ed` | |
106
+
107
+ ### Form controls
108
+
109
+ | Name | Type | Key | Notes |
110
+ |---|---|---|---|
111
+ | `Vertical Field` | set | `ed788a01ea520f16c64f194b6b9fb12593804b02` | Default labeled control wrapper. Pick `Type` = `Text Value` / `Select` / `Radio` / `Textarea` / `Checkbox` / `Slider`. |
112
+ | `Horizontal Field` | set | `912e0649909171875af3923fbed470ba1eff40aa` | Same as Vertical Field but settings-style (label on the side). |
113
+ | `Label` | set | `a7a218d47139c95c64fdd277a40e2eb7cdca0ddc` | Standalone label used when a field's chrome isn't appropriate (e.g., inline with a Switch). |
114
+ | `Input` | set | `347a94c8eade0109b1a1fcf0271f7c5cae110762` | Bare text input. Decorations gated by `Show decoration left` / `Show decoration right` boolean — the decoration content is a nested instance you reach via `instance.children`. |
115
+ | `Input File` | set | `b4fe0d98fcfaca7ad3ac74dcad1d9ce22a0817df` | |
116
+ | `Input OTP` | set | `67a64a2350ff055c376bfe8662576a7724dc31c7` | One-time-password input. |
117
+ | `Textarea` | set | `45fd176668402614db675597438216697947eb0a` | Standalone multi-line input. |
118
+ | `Date Picker Input` | set | `32bfe5930fdf247890ba8f699d3eea925e0de61b` | |
119
+ | `Date Picker` (the calendar popover) | set | `d71e31e6a90dda96ce502b6a039f9ef5234e42c1` | |
120
+ | `Select & Combobox` | set | `29a0349a94c98ae411d4e1eff889594519a637e4` | Variant axes: `Size`, `State`, `Lines`. |
121
+ | `.Select Left Decoration` | set | `3996faef6f26d2378a2f5065dfb3a5727bcfd6d4` | Nested decoration component inside `Select & Combobox`. |
122
+ | `.Select & Combobox Right Decoration` | set | `f22f3c322b1be72b242740ea7170df71350e4560` | Nested decoration component inside `Select & Combobox`. |
123
+ | `Checkbox` | set | `831dd7f93a72d578b1c09e9deb567a76f05f3a6b` | Bare primitive. Use inside `Vertical Field` (`Type=Checkbox`) when a label is wanted. |
124
+ | `Checkbox Group` | set | `9ec19c7328172e3f9f8a59c12cb4fea8d9bf4c42` | Group of labeled checkboxes. |
125
+ | `Rich Checkbox Group` | set | `b1b98992bbebb2c02e65b349c1e5858c3b9ba2e7` | Card-styled checkbox group (description + icon per option). |
126
+ | `Radio` | set | `47984dd2aeea00635d14f1827626efe05ec702a9` | Bare primitive. Use inside `Vertical Field` (`Type=Radio`) when a label is wanted. |
127
+ | `Radio Group` | set | `d898dc14e851ca9f123dc40e636e9fda01e1cedd` | Group of labeled radios. |
128
+ | `Rich Radio Group` | set | `9f834aefd37f4f186dd83bd59856fb9ead65893f` | Card-styled radio group. |
129
+ | `Switch` | set | `467ceb6c29450fbeb8f26c66098e2588981d5404` | Bare primitive. |
130
+ | `Switch Group` | set | `8e6ecde9df41a0113b5cfdfefb266eb33a8dc686` | Group of labeled switches. |
131
+ | `Rich Switch Group` | set | `77c58246c3ba9fa81ea9aba6a731950d9019fe1c` | Card-styled switch group. |
132
+ | `Slider Horizontal` | set | `ec5b4949881cf6a8bc7d117294a0e1fc0383b362` | Bare primitive. |
133
+ | `Slider Vertical` | set | `f7416397e0c5e048d29bd5d838327cb1b1d936c3` | Bare primitive. |
134
+
135
+ ### Menus / context / command palette
136
+
137
+ | Name | Type | Key |
138
+ |---|---|---|
139
+ | `Menu` | set | `061bf1cd01957609661f25892ade298af5ef3d79` |
140
+ | `Menu Item` | set | `91f50c9daf4bd1ae1f3a862681cd31b6cad74bb6` |
141
+ | `Select Menu Group Label` | set | `6b0fc1a26e517e7f7fbd9988483e6f3645ad7b1f` |
142
+ | `Select Menu Overflow` | set | `d1f899145e8e2dc5051c709ee9a3b8376a1fa0b5` |
143
+ | `Filter Menu` | comp | `367e276ec7a33a3ed4d496a29236533c0ebd6ea4` |
144
+ | `Command` (Cmd-K palette container) | comp | `4f05ac1f176fbf2b9a7fc2b9d85eddec22e697e4` |
145
+ | `Command Item` | set | `2ab32dd50d528376676c5bee5cbb67a4a3d0da4d` |
146
+
147
+ ### Tabs / navigation / sidebar
148
+
149
+ | Name | Type | Key |
150
+ |---|---|---|
151
+ | `Tabs` (container) | set | `f06ad194542ddc5502822a71c0c1df40603657dd` |
152
+ | `Tab` (single tab) | set | `d1fe192462c90aac4b17d9c0e5ad0e4178c0c359` |
153
+ | `.Tabs Counter` | comp | `86f35577ae7a02351839c0680d3f78f3227e3dea` |
154
+ | `Accordion Trigger` | set | `d7ad877fa8f7146a240935e32c58c4923d7f5a9f` |
155
+ | `Accordion Content` | comp | `98a814093f0ae983c3490a1236edbe7d458bfb90` |
156
+ | `Breadcrumb` | comp | `23246290df930b56c71f92d1fbf9634714ba5a21` |
157
+ | `Navigation Menu` (top-bar pattern) | comp | `8f317d3955948412642f475292d5b2f93de3f4ec` |
158
+ | `.Navigation Menu Content` | comp | `fa0c7bb1ea1ad04dbfc59425a14acfea1c74809d` |
159
+ | `Sidebar Item / Collapsed` | set | `591ee5547d39353eeb0970ae2fb1dd96642c1243` |
160
+ | `Sidebar Item / Expanded / 1st Level` | set | `0038e7436094f39eff00d1897336f69b1d608faf` |
161
+ | `Sidebar Item / Expanded / 2nd Level` | set | `f686052899ef72071a9108bd26f350c0b833d08c` |
162
+ | `Sidebar Group Label` | set | `3b14566bd1e5f3c3e7706d66ed27004c5c56465f` |
163
+ | `Sidebar Badge` | comp | `adba54dbc4337f0754e59de3b34f1345a1cf559f` |
164
+ | `.Sidebar Mini Button` | set | `802813ca59ca41c0c02bbdd7ba67d232856c9c96` |
165
+
166
+ ### Identity / status
167
+
168
+ | Name | Type | Key |
169
+ |---|---|---|
170
+ | `Avatar` | set | `9ae2b0550502919c74a7571ded5239b407097a3e` |
171
+ | `Avatar Stack` | set | `e9bb0ddfc269b71bc55b7df17a68a1f78d863699` |
172
+ | `Badge` | set | `c128ae273e04b00c40c91dcf0cc9d3e95cf5f1bd` | Conditional left icon gated by `Show icon left` (note: word order differs from Button's `Show left icon`). |
173
+ | `Tag` | set | `b51cb156d50181556e46dad90493991e060a6d80` |
174
+ | `Kbd` (single key glyph) | comp | `4f9822d7743ad1a440b0d376ad016193cde37d0b` |
175
+ | `Kbd combo` (multi-key combo) | comp | `c52af997727421497d0ced1828dd1fb800b45588` |
176
+
177
+ ### Tables / data display
178
+
179
+ | Name | Type | Key |
180
+ |---|---|---|
181
+ | `Table Header` (Data Table) | set | `216e05c5dfadfcbf3d4da29844a841be9e30adad` |
182
+ | `Table Cell` (Data Table) | set | `192fc1ae7eb123f42f33e29d655f35a01a48b895` |
183
+ | `Basic Table Header` | set | `ad92cacb1db0538cc66609953f147a23bfbeac52` |
184
+ | `Basic Table Cell` | set | `0486d228774b49327f86f0bcbb44de3ece13c7cc` |
185
+
186
+ ### Charts (single-variant, frequently overridden — treat as templates)
187
+
188
+ | Name | Type | Key |
189
+ |---|---|---|
190
+ | `.Line Chart` | comp | `a49fd6cafff4ff8b89cc12e41908b5cb0df74724` |
191
+ | `.Vertical Bar Chart` | comp | `7101d9e2f079d91fe41beb59ae000acef0185eac` |
192
+ | `.Horizontal Bar Chart` | comp | `e8e82de897e7e1f01528963ec5a49e5347aed177` |
193
+ | `.Pie Chart` | comp | `31cf3019048e3e5a7ed97698f49922eeb2b0ef09` |
194
+ | `.Donut Chart` (A) | comp | `e8341848145fc5b1564458d29b2bd429a81be0bd` |
195
+ | `.Donut Chart` (B) | comp | `34e8512068ae70f8a468227148e11f7d87613a28` |
196
+ | `.Area Chart` | comp | `6f34337187dca54ca9ff19e11aed228a2637931b` |
197
+ | `.Radar Chart` | comp | `1a41eba006232f8b8df9039cf5c9dd643790924c` |
198
+ | `.Chart Tooltip 1` / `2` / `3` | comp | `dfa10c542950c6aa0b2cafbb2a8078a626a81914` / `19b4e5211f38f64a00f27608aa5b0b78a6f1c65c` / `2f082bd49a25fcea22afed8e64e0bbe48d5f4cbe` |
199
+
200
+ ### Icons (LM `Icon / *` lucide-aligned)
201
+
202
+ The LM Design System publishes **1,604** `Icon / *` glyphs. Caching all of them is wasteful; instead, this table holds the **commonly-used + gating/feedback** subset. For any other lucide name, run `search_design_system` once and append a row.
203
+
204
+ All icons are single `ComponentNode` instances (`type=comp`, no variants). Import with `figma.importComponentByKeyAsync(KEY)` and pass `.id` to `INSTANCE_SWAP` properties.
205
+
206
+ | Name | Key |
207
+ |---|---|
208
+ | `Icon / app-window-mac` | `48dedfa87c3de6768f8ddd3d7ba94f48b80a0a6e` |
209
+ | `Icon / arrow-down` | `83ba83ffd72acc11d8c5ec5d52e1a88f6d3035a0` |
210
+ | `Icon / arrow-down-right` | `06852a75502835b10f80032f1e782e3113248ed1` |
211
+ | `Icon / arrow-up` | `6062fe00e32815fc0695d36d6af037460af357e4` |
212
+ | `Icon / arrow-up-right` | `9768b1c497c73d540946bd1ffe81e0cbc7ad6e7a` |
213
+ | `Icon / badge` | `38f27e2c543a370dde289ebf1646de25952cedb9` |
214
+ | `Icon / bell` | `15b50b504aab3e064a481483a7f4ae3ee6eb0a3a` |
215
+ | `Icon / bell-off` | `7844466b29d39ce82e1f7527ffa86ce1bdf02d96` |
216
+ | `Icon / bell-ring` | `ce47086993f12659826fd16267a93036e8934bdc` |
217
+ | `Icon / book-lock` | `c2b9fa9ad869d181e45f3c5636fc995dc6ccbc83` |
218
+ | `Icon / bookmark` | `0a00513d41d19220c3b3ab3a8b6ab5c256d60e3e` |
219
+ | `Icon / building` | `487ad1d708e25b17bfd05e5305071446e79c1999` |
220
+ | `Icon / calendar` | `71fc8fe0f69a691440ca9eacd699b441c5656bac` |
221
+ | `Icon / calendar-check-2` | `725db216e3e98cf8d622337d9a95b926725a6b52` |
222
+ | `Icon / calendar-clock` | `3f11f6cfa445e5cd69c804236ce9460c7d5e99a1` |
223
+ | `Icon / check` (A) | `d14535899a911272aefb7325d17dc617817add2b` |
224
+ | `Icon / check` (B) | `02ff711acb59e3e7a6857a7115e6acc0f95befbf` |
225
+ | `Icon / chevron-down` (A) | `0c37c5f5e249a7590da0f2f8c5955289c11cabd9` |
226
+ | `Icon / chevron-down` (B) | `ebceaa30e9feaa91bbd0fb4b91c86b18fd3b65e8` |
227
+ | `Icon / chevron-first` | `18694f7f9972f91d6514c8def27b894299b0d248` |
228
+ | `Icon / chevron-last` | `2c19853e3042c918ca637ac988ced1af6d935703` |
229
+ | `Icon / chevron-left` | `72d936b121594f662e1b790b979c185f642f1038` |
230
+ | `Icon / chevron-right` | `a700ede13635584fbece55818efedd593dfc187e` |
231
+ | `Icon / chevrons-left-right` | `2d3541624e932cbb330d73dfd2c2e16de0630dff` |
232
+ | `Icon / chevrons-right-left` | `209b74f891be90b3e988d47bcd0bc3af7802fe7a` |
233
+ | `Icon / chevrons-up-down` | `c64fd83f6e1c12895d9721846a13028875d88dc3` |
234
+ | `Icon / circle` | `3302ebb70de30d2f353322933c8b931ea8503fec` |
235
+ | `Icon / circle-alert` | `dc7f84234c1e8a997e157079c5f3f61299a629f4` |
236
+ | `Icon / circle-check` | `103c73dedfdf6908777893fca795241382a2b9be` |
237
+ | `Icon / circle-check-big` | `3a81359a1248da153c0561882bf365f0d96d5fba` |
238
+ | `Icon / circle-dashed` | `089c62947f51875986cfa71188585886df7a215b` |
239
+ | `Icon / circle-dot` | `81bdf3fab326baa4c0f0f44b7154716f3c97c139` |
240
+ | `Icon / circle-help` | `f61e0e5d2cae220b15f7c95f6fc5bfe834aa17d6` |
241
+ | `Icon / circle-x` | `6537c90aa5f6b23d6a9a69f539029de04ea904c8` |
242
+ | `Icon / clipboard` | `959ac0c4b467a169a0ee5e77caa8a8de15c7c8ac` |
243
+ | `Icon / clipboard-check` | `f7ef86ae84bf62ceb859de3d3083fb479e6dd3f9` |
244
+ | `Icon / clipboard-list` | `d3fcc890b823d55c7051303876de32efe9b362e4` |
245
+ | `Icon / clock` | `ede22d08254ca531d91790fd40dd00d4dcfb389c` |
246
+ | `Icon / clock-alert` | `58836c40ffd586684281cb28bd556b794799df04` |
247
+ | `Icon / copy-plus` | `f3450dd631f85119a121e35a51c869095a477a33` |
248
+ | `Icon / credit-card` | `9c8adbffe6cb5c21757650f6d3bbbc5f82e6f736` |
249
+ | `Icon / dock` | `538cf8a87ae363b05ef0f7feaa0c1f3b8b98181f` |
250
+ | `Icon / dollar-sign` | `87bcf884816f6ab87ec3050a13a6092ab6b5e709` |
251
+ | `Icon / door-closed-locked` | `e7b3b57019250709d1d1c8918702a19c4fbbd262` |
252
+ | `Icon / dot` | `d118c0b3c1aec6c496c0344689a3ee31d31dda0b` |
253
+ | `Icon / earth` | `b642e6b4d52f660b1818009f82e469fd7affc634` |
254
+ | `Icon / earth-lock` | `0085377d536a16038f05d43b292713ec1aaf8f94` |
255
+ | `Icon / ellipsis` | `1901fb3e67d0e47f7afd9bb458633cc492f50e57` |
256
+ | `Icon / ellipsis-vertical` | `2af23624d40e3d99f876c71ad2ad596c3ec25b7e` |
257
+ | `Icon / external-link` (A) | `751466611bd2e46b25ca8059e609b8ddbe8791c8` |
258
+ | `Icon / external-link` (B) | `15119b55ba55d68a2ba0e58dfdf9fe36223a26b7` |
259
+ | `Icon / eye` | `92d2f21ce8e1661e712822684dc98f5d8ebd0d91` |
260
+ | `Icon / eye-closed` | `d6e0909b7732e3b250816c6378d83f18657c5b01` |
261
+ | `Icon / eye-off` | `5ffbaeb0692a86fcf71f86ffcf850538aa58d5e3` |
262
+ | `Icon / file` | `10088869da1c12d6dfbbafaa29070dab3c84a0b4` |
263
+ | `Icon / file-image` | `457c6e4349714854cb3b30f596d1eb7b57bef93d` |
264
+ | `Icon / file-lock` | `d86ad2f193c480dda24f2355361dabd1856deb8a` |
265
+ | `Icon / file-lock-2` | `df9d91325e557ab198e41413954801e001809a8a` |
266
+ | `Icon / file-plus` | `edc17f223c0196f7514370e37977567119b48cdf` |
267
+ | `Icon / file-text` | `b3f90098bf666854ea023f54c941d1296a9dad95` |
268
+ | `Icon / file-x` | `90b1ca3b377871ff32aa5b33c01812033504913c` |
269
+ | `Icon / files` | `cb4a44cc8f3cbfc229205e8cdaf899bc10e1623d` |
270
+ | `Icon / folder-lock` | `50be7d96ea44f883fd5123b4fddb22a920eef1ac` |
271
+ | `Icon / funnel` | `7e15d5497d041b94886e2c9f92a86eff5acc7d6a` |
272
+ | `Icon / funnel-plus` | `959a0e5bc35d44e849781b8c5aad448da88f18e9` |
273
+ | `Icon / funnel-x` | `9f3c14692d09bbe7f67a4d51ff75cf1f5a493512` |
274
+ | `Icon / globe-lock` | `b5baa7556c8c507d1d02a8b4df295d281b5eee7a` |
275
+ | `Icon / graduation-cap` | `3112a81dd7558dcf071c3998f86a6bd8173142ef` |
276
+ | `Icon / grip-horizontal` | `54c9b86f377cb73ddea5d317d3ecd56cd9bc09f8` |
277
+ | `Icon / hard-drive` | `fbab451abbd7306e5d941044773d79b8e6a85d5e` |
278
+ | `Icon / heading-1` | `b0f548c52d6490ea8b8d8a13ddefd778dbc7f38d` |
279
+ | `Icon / heading-2` | `0698a68f015046045343e5892c539a2b2df29892` |
280
+ | `Icon / heading-3` | `c8f0559baae0f88a34cf8995b08d44aa6bd06941` |
281
+ | `Icon / heading-4` | `b8f080650cf3df4d44530ba0c15ce83d4921975d` |
282
+ | `Icon / heading-5` | `c03624d07f62170a8dd6d1870fd0730f3ccae406` |
283
+ | `Icon / heading-6` | `bd2ebfed8fc61e21d54788a10777681ae51ec070` |
284
+ | `Icon / house` | `e4a907b8d78448aa8611c9b10995c99917651d72` |
285
+ | `Icon / id-card` | `08dfe1ffe95432a42f9e727745db4c6ff66da5b0` |
286
+ | `Icon / id-card-lanyard` | `16c9c27778a657bfdbe22322ce527d979e40e6d4` |
287
+ | `Icon / inbox` | `c42a04fe530257c9bddaf89f40b8173e792540d0` |
288
+ | `Icon / info` (A) | `9bb8dbbd966ce700dc5cf69fa91c00f656f63ccd` |
289
+ | `Icon / info` (B) | `9f692ed1274c27c31d75c5fac824e74a1809b0e7` |
290
+ | `Icon / layout-panel-top` | `8d857750df85086bfe65957c1eb250956b345161` |
291
+ | `Icon / library` | `82aca630108847760416ef37e8358984dd8c0640` |
292
+ | `Icon / library-big` | `cd335ffbb0c88063c0d9e42f928431f3605d4ece` |
293
+ | `Icon / link` | `e65f72553d5cf13707d982169f8722123aa59435` |
294
+ | `Icon / link-2` | `accfc57c25cc455be0d9f7b5204f1e3f87a3f82d` |
295
+ | `Icon / list-check` | `a7990549bd1dbe2f835819f515ca72288d594eb5` |
296
+ | `Icon / list-checks` | `affdce0eaebca5be28e734b6e993439343c15f6c` |
297
+ | `Icon / loader` | `76c0e27ca41803353547e743fa8aa5c20013c2af` |
298
+ | `Icon / loader-circle` | `96c71c4ce33c33e29f3bd5c84912fdd5e8e2b337` |
299
+ | `Icon / lock` (A) | `cd04904d18b1fb789dc07cb09713dfb1313f8d94` |
300
+ | `Icon / lock` (B) | `173fee46cb57e14f03c5da346ca7388153413ba4` |
301
+ | `Icon / lock-keyhole` | `dda555d2e45a5c3750b6ef38deb8795c128084f9` |
302
+ | `Icon / lock-keyhole-open` | `aaf99b7a16b2711af996f67edf7b07799ef323fd` |
303
+ | `Icon / lock-open` | `ac2ec9cc0c07ebbe2c90948d00a519ef33254d9a` |
304
+ | `Icon / mail` | `767170a5b43b0821f8accbfe46152cb6dc2dc5a8` |
305
+ | `Icon / mail-open` | `1c439cacf43a81a89bd7d55623d85cc4e99d9662` |
306
+ | `Icon / megaphone` | `aef7b9166671db4b8fb2c9a50752f8fe98d1c7c4` |
307
+ | `Icon / megaphone-off` | `92c398dce26b492444be0f564017e3232263e845` |
308
+ | `Icon / menu` | `66d85f73f04f3be4afd898307dff3fd41dd20309` |
309
+ | `Icon / message-circle` | `44cba4df514935f533826694738206e109c71043` |
310
+ | `Icon / message-circle-warning` | `8c1aaaa040b4e4b9fbb968e08816fadaa746e6c2` |
311
+ | `Icon / message-circle-x` | `1e46cdfc80ca7a54b0ac9419597746060a34bb44` |
312
+ | `Icon / message-square` | `14096253afb98635cc5634ff1a0dadb4a20ec49a` |
313
+ | `Icon / message-square-warning` | `07b458d52f3a49d774da321f07c443769df35460` |
314
+ | `Icon / message-square-x` | `7624cc8a1b3a05716d2c4e7df3867441a8272bc8` |
315
+ | `Icon / panel-right-open` | `521cf04f52693d89ba12c447310a9d74bbd6c979` |
316
+ | `Icon / pause` | `8c4ca9af197576e50bdc9e881a2613404f4d0f00` |
317
+ | `Icon / pencil` | `7cb87449cf95a1b4ce0fdbbc18143345482bb746` |
318
+ | `Icon / pencil-line` | `f10983d5e1f426ccfcbed00db38768fc5340fcd9` |
319
+ | `Icon / pencil-off` | `a7b6c6c2b90c062fd30298a986edbb18802f8ace` |
320
+ | `Icon / play` | `6627b7774fbbcc9db8182e97d9a0919a8d6ebf6f` |
321
+ | `Icon / plus` | `3e7fb085172dec0df62b8c77fc697e7fbd17ca1c` |
322
+ | `Icon / presentation` | `c982e74277f64f9799015d5c1d4d5f08ac5b923a` |
323
+ | `Icon / redo` | `d6be5e089a18f68f9939dd68fd647f148e5a846d` |
324
+ | `Icon / redo-2` | `178f78596fea2e79d4373e7ddbcb6c7be31d94ad` |
325
+ | `Icon / refresh-ccw` | `1ebf7f006909fc27a9c22862872be3c4f15f6ef7` |
326
+ | `Icon / refresh-cw` | `caee60932b9fe4523df5e27d2929e73983928218` |
327
+ | `Icon / rocket` | `0408c2f42ab180536f84e496bf217d03cac43e84` |
328
+ | `Icon / rotate-ccw` | `a845dfb108216270c0d5072d1a4237b881c7fa2f` |
329
+ | `Icon / rotate-cw` | `0d3c3104338d529e1387dcc16d929419f341a281` |
330
+ | `Icon / save` | `d2bf6f3da29449d87b334e91e6645de38c88cfe2` |
331
+ | `Icon / search` (A) | `7d1f43bf13a668ce07ddd137a606d467b78bc477` |
332
+ | `Icon / search` (B) | `3e4880f47595080124c42e4c6285cdb2db8e6122` |
333
+ | `Icon / send` | `0bfde168b58608619de5251621ad815cb99ee705` |
334
+ | `Icon / send-horizontal` | `b7c7fd708766e11987f937896d1e60c6ee2afb86` |
335
+ | `Icon / settings` | `40edd1462c34db3b77822952aa2c08aa3cf880ab` |
336
+ | `Icon / settings-2` | `ea728650f9a252fbc561cdc0d7fd5104f221c67f` |
337
+ | `Icon / share` | `b286bbfb91ceda5c3436c502ab9498dd54559947` |
338
+ | `Icon / share-2` | `9a03ca2aea3f85af208ea7295644769baeea7095` |
339
+ | `Icon / shield` | `1f733768457804ce6830e145dab4fe638eccd8fd` |
340
+ | `Icon / shield-alert` | `10507d1aebae6daf72c45f7216fdac99ce7d4f27` |
341
+ | `Icon / shield-ban` | `8befa856dc0c7f7778569725c976c2a6e478d33a` |
342
+ | `Icon / shield-check` | `eb83680be39826d1141f2ee939926bb0f37933dc` |
343
+ | `Icon / shield-off` | `bd3075e2b948d90b2bef4628ad2f699e59016b63` |
344
+ | `Icon / shield-x` | `5e50b59391f3201db81f61e5d53fd3d818857201` |
345
+ | `Icon / sliders-horizontal` | `922d35ecc5e53f16a09f9f10123cc89347189340` |
346
+ | `Icon / sliders-vertical` | `23861423e6a9b5ac7d340a92d5e736a97bae72d5` |
347
+ | `Icon / sparkles` (A) | `8e0f51866455fcbdbadb4de2d96834fe616c73db` |
348
+ | `Icon / sparkles` (B) | `8d3d1af2b52b08bee1c6a2af44bc2b90fa4914dc` |
349
+ | `Icon / square-chart-gantt` | `6d6bb52ce7079c5f4ef9b3d7398fbfdb7dc7b738` |
350
+ | `Icon / square-check-big` | `384262e5e0a21a7b634750af3fe277b669f259ff` |
351
+ | `Icon / square-dashed` | `83c199f78ce1b4e960d90b378c65fa3f73125638` |
352
+ | `Icon / square-pen` | `5a54027746c3b92fc045090d68bc2c62f8ff0cbc` |
353
+ | `Icon / square-plus` | `e32bb03c2797695b43175aef1009d2b551b32962` |
354
+ | `Icon / target` | `14d8efcd5209591502b3570ec6aabe6e41c13930` |
355
+ | `Icon / terminal` | `638d5f1213e80d818e026eaaf65b566b89892e28` |
356
+ | `Icon / trash` | `41d3a43afd232f7fac18ba8360b80352c11130e5` |
357
+ | `Icon / trash-2` | `43fa792c0b099e7d1a767989940f21e23447ae76` |
358
+ | `Icon / triangle-alert` | `e895cca7d73e78b424b63d2c017447344aba0486` |
359
+ | `Icon / undo` | `c9031fcd6b9a2446c258ca9e3720df46cdaf656e` |
360
+ | `Icon / undo-2` | `2d0031d3d3f14e12487b93a521e284ffc2bed565` |
361
+ | `Icon / unlink-2` | `7b9c77a191da3f3fe1c6cb50f928d5b001719ff5` |
362
+ | `Icon / user-check` | `e31c5f779c823b1f306d2fcc0cd1b9975818a6cd` |
363
+ | `Icon / user-plus` | `52b3d2eb884e5b16be0ca029ce2c7aa135cbf5e5` |
364
+ | `Icon / user-round` | `b27a2f7a75732f79ac0e4ab5bd6f42d148f7500c` |
365
+ | `Icon / users` | `9321d887ad9936cdfba0152ba617e2862c7dcc66` |
366
+ | `Icon / users-round` | `57990d1628d2480213c592c7d4003056805061a9` |
367
+ | `Icon / wallet-cards` | `c0d1c8fe1a01e6c77cb00a9921d206bde1ce9ce7` |
368
+ | `Icon / wand-sparkles` | `2afc3e3f8b3a523e2e2495f61e178a384bcb587b` |
369
+ | `Icon / x` | `b550df349a72e0591f5e8684ced1ad6a31193bfb` |
370
+
371
+ **About duplicate icon keys (rows marked A / B above):** the LM Design System exports the same lucide glyph under two different componentKey values (likely because the library was rebuilt at some point and old + new components both ship). Both resolve, both render identically. Use whichever you see first in the file you're editing — *don't switch keys mid-mockup* (different keys mean different "instances of the same icon" in the file's history, which complicates diffs).
372
+
373
+ **Missing icon?** The rule (`figma-design-system.mdc` §9) says: *if the icon doesn't exist in `Icon / *`, STOP and ask before creating a new vector.* Don't fall back to inline Lucide SVG. The full library has ~1,600 glyphs — almost any lucide name is there.
374
+
375
+ ---
376
+
377
+ ## Variables (LM Design System)
378
+
379
+ All variables below are published by `LM Design System` (`fileKey VCLfybgU3OaUUPrQdBaVmP`). Use `figma.variables.importVariableByKeyAsync(KEY)`, then bind via `setBoundVariable(prop, v)` for spacing / radius / opacity or `figma.variables.setBoundVariableForPaint({ type: 'SOLID', color: { r:0, g:0, b:0 } }, 'color', v)` for fills.
380
+
381
+ The canonical mockup-facing variables live in the **`Tokens`** collection (modes: `Light`, `Dark`). The `Primitives`, `spacing`, `border radii`, `typography`, `shadows` collections are *primitives* that `Tokens` aliases to — bind tokens, not primitives, unless you're matching an existing instance.
382
+
383
+ ### Tokens — Spacing (collection `Tokens`, scope `GAP` / padding)
384
+
385
+ | Name | Key |
386
+ |---|---|
387
+ | `Spacing/spacing-none` | `06387b4e45be87744542da700640d6bcebc78a8a` |
388
+ | `Spacing/spacing-xxs` | `4992c269f103f898da9fc26eb5710d57bfd3f5b8` |
389
+ | `Spacing/spacing-xs` | `8a89a1dec7d3697d4ff8d7e4333b6fcd8680cd31` |
390
+ | `Spacing/spacing-sm` | `cbd5c8cefd173b4b9f2967d01a1bfa099eaa6c25` |
391
+ | `Spacing/spacing-md` | `b277a46267e286cb020830f7552df5b93ab9f71e` |
392
+ | `Spacing/spacing-lg` | `9ba99264d46ba18949ba045af27cfb56f30b99ab` |
393
+ | `Spacing/spacing-xl` | `ae49029d2d4ee74048322b8c7ed1c1bb647716a9` |
394
+ | `Spacing/spacing-xxl` | `fdc1a74f0585a84e55aa9321283bbf4f59aa504e` |
395
+
396
+ ### Tokens — Padding (collection `Tokens`, scope `PADDING`)
397
+
398
+ | Name | Key |
399
+ |---|---|
400
+ | `Padding/padding-3xs` | `c8f061cf7b2ac5076c270c53f3ac8a876d0452c3` |
401
+ | `Padding/padding-xxs` | `c51abb895af33fa54406b4c81787c24ae9202245` |
402
+ | `Padding/padding-xs` | `4b6fc53af01e5919e0d7fa0d7973dd48bdce2136` |
403
+ | `Padding/padding-sm` | `8b8c6c7435a0ec9275ab70417b70af81ce45c9fb` |
404
+ | `Padding/padding-md` | `7ef2d2e5dd3c9b5d3fbe67e58f1c7c77b7281b38` |
405
+ | `Padding/padding-lg` | `8baacc2b469bbcb7ea23a7eb8070c595aa00241f` |
406
+ | `Padding/padding-xl` | `19033825f3ced422aa1c8968865088305d0aebdf` |
407
+
408
+ ### Tokens — Radius (collection `Tokens`, scope `CORNER_RADIUS`)
409
+
410
+ | Name | Key |
411
+ |---|---|
412
+ | `Radius/radius-none` | `b2bda96d4b43b0b5bfd10acda71d15849021d750` |
413
+ | `Radius/radius-xs` | `391dc99f0bc288b9a82f6428c6aa78024292e083` |
414
+ | `Radius/radius-sm` | `395f6a7f2fb06d86bcc5a76ff0ed6ba562998557` |
415
+ | `Radius/radius-md` | `6b97571775223cdd100b0dc73e189bfb061749fb` |
416
+ | `Radius/radius-lg` | `36f686ed1d63670870a7f2856bedd1647ab2c88a` |
417
+ | `Radius/radius-xl` | `baec715ce5231b5123fad63e27d48e399dd4d52b` |
418
+ | `Radius/radius-xxl` | `5bbe218d7f9ae3cf62ac623d180b6ac8a8c66102` |
419
+
420
+ ### Tokens — Background colors (scopes `FRAME_FILL`, `SHAPE_FILL`)
421
+
422
+ | Name | Key | Use |
423
+ |---|---|---|
424
+ | `Background/body` | `52513bc11e5c0580abd3cd0a03d360de12cd8a7a` | Page background |
425
+ | `Background/default` | `10dec4782710dc311907727685079bff06b7613d` | Card / sheet / modal background |
426
+ | `Background/default-hover` | `09b1a99abdd6f4bac8a2751654b28948077092dc` | Hover state of the default card / row surface |
427
+ | `Background/input` | `bd7267990f0010a4efecad15fe793484da314e99` | Input field background |
428
+ | `Background/transparent` (A) | `e0dcf0d6c855782adc2f0f56c874de2ec084a406` | Transparent surface |
429
+ | `Background/transparent` (B) | `608d056f8e39041f1d2e8cb9e8045d45653fecc9` | Transparent surface (alt — both resolve) |
430
+ | `Background/backdrop` | `4710c68999c063787fb17de262b7655378320ab3` | Modal / dialog backdrop |
431
+ | `Background/Disabled/default` | `f20528c3a6b546bc2ef96b9a496da5b8e2e5cd1f` | Disabled control surface |
432
+ | `Background/Primary/filled` | `e65fd87ad03448f2dbbb64c4f6036e7e8164cb43` | Primary CTA fill |
433
+ | `Background/Primary/filled-hover` | `1685ebd80ae53261c714b678731899d5ba028190` | Primary CTA hover |
434
+ | `Background/Primary/light` | `00a464c6d3ce2322e6e10b70e55d6c9715e46a58` | Soft brand surface (selected pill, info card) |
435
+ | `Background/Primary/light-hover` | `a4e387c0edfb905522c09505e5602d7315014a18` | Hover state of the soft brand surface |
436
+ | `Background/Inverse/filled` | `9093377117d56ba81616f32813c98c13e6a2902c` | Dark / inverse filled (tooltip body) |
437
+ | `Background/Inverse/filled-hover` | `414b4fd9fb1febe40b9dafdb906699bb671afa60` | Inverse filled hover |
438
+ | `Background/Subdued/light` | `5d739dea0ccc4129709e6b8296381d6f06caf6fa` | Subtle stripe / subdued chip |
439
+ | `Background/Subdued/light-hover` | `ff6cde23bcb84501a3741fb46a3d38aea8de5e93` | Hover state of subdued/light |
440
+ | `Background/Subdued/ultra-light` | `9d79dbbe5d7b938263c690c18faa7ba0b3a3156a` | Even lighter than `light` (use sparingly) |
441
+ | `Background/Subdued/filled` | `56ab97d799aa890f0f2dd248f47f0d4531a69250` | Filled neutral chip |
442
+ | `Background/Subdued/filled-hover` | `baa93962a667fd24f4a4fd8f99793afb2db43542` | Hover state of filled neutral chip |
443
+ | `Background/Success/filled` | `aacbc9b0b9e77cc760b23bb1d272de668feac2ae` | Filled success badge/pill |
444
+ | `Background/Success/filled-hover` | `caa2ec7744e6a79959a7f17664505b1bdf5e5aaf` | Success filled hover |
445
+ | `Background/Success/light` | `2347c1d6a29b324835c30343e2fadb1ab0f1ce12` | Soft success surface |
446
+ | `Background/Success/light-hover` | `93c28999cd0a59db846ddf4f2fb85e5056422130` | Soft success hover |
447
+ | `Background/Warning/filled` | `6734feb384b290204172575f24df75f84b79fe80` | Filled warning badge/pill |
448
+ | `Background/Warning/filled-hover` | `c9c5cf833dfa19bb66f392baab65d3dde9c1cc70` | Warning filled hover |
449
+ | `Background/Warning/light` | `609abf91cba99e5bc3c274e6a5855efd96dae72c` | Soft warning surface (banner) |
450
+ | `Background/Warning/light-hover` | `f7a99c0406ed5298ebe22c990c764a3198b6ae35` | Soft warning hover |
451
+ | `Background/Danger/filled` | `e9be878bae050092551b66ca9573105c098b24fc` | Filled danger badge/pill |
452
+ | `Background/Danger/filled-hover` | `23721533010ba96033b803378d39747f43ebd24a` | Danger filled hover |
453
+ | `Background/Danger/light` | `694048683bf1f76ccdfa3915e36269ef4e57bae8` | Soft danger surface |
454
+ | `Background/Danger/light-hover` | `54f47afcfd11736827a40393d1664ac7e6b7f09c` | Soft danger hover |
455
+ | `Background/Information/filled` | `7b6b7d14c196c332b55f4e95cec18f369dc627f2` | Filled info badge/pill |
456
+ | `Background/Information/filled-hover` | `296e88549f1adf7130c4f5bbe5ba5bb4dccc8f85` | Info filled hover |
457
+ | `Background/Information/light` | `b7eced23850a9a9209487c9096bd34eb5019627d` | Soft information surface |
458
+ | `Background/Information/light-hover` | `b78b70167a4d6cae7610a231cad8974476ab76ce` | Soft information hover |
459
+
460
+ ### Tokens — Text colors (scope `TEXT_FILL`)
461
+
462
+ | Name | Key | Use |
463
+ |---|---|---|
464
+ | `Text/default` | `bc94937d215bc657bb26cde7288359cd5dd65985` | Default body copy |
465
+ | `Text/title` | `012ef79215c139cfe600fa7221aad0a2646ff5ed` | Title / heading text |
466
+ | `Text/inverse` | `416f0e24026eb7dcfb72982f87f73b678f88af9f` | Text on filled-primary buttons / dark surfaces |
467
+ | `Text/link` | `d92682fbcfc18fb71b2be9adbe00fee556679b88` | Anchor / link text |
468
+ | `Text/Disabled/default` | `b3e9a269e1323f7d65995bc936472d21deeb7227` | Disabled text |
469
+ | `Text/Subdued/light` | `6e815520975899b2e26aa7f19fcf9d1bae46fecb` | Lightest helper / placeholder |
470
+ | `Text/Subdued/default` | `d65d1cae407989945e710ad12516e1c36cea48cf` | Slightly less prominent subdued |
471
+ | `Text/Subdued/strong` | `60a95e30b46826a011018b5a183c5f3326e74838` | Subdued body copy / helper text (default subdued) |
472
+ | `Text/Primary/default` | `fef372abe964123d2966485aee970066a814e00b` | Brand-tinted text on soft surface |
473
+ | `Text/Primary/light` | `a17344c4b8279d1d3648ccec7a895403b89c373d` | Lighter brand text |
474
+ | `Text/Danger/default` | `317fdbd8aad7710b34f0990cd409ecf8718ca942` | Danger label (default) |
475
+ | `Text/Danger/strong` | `28809203dc49db510dbbe8e6d77a286f5adc3140` | Danger label (strong emphasis) |
476
+ | `Text/Danger/disabled` | `75f8c3facd3aa67f9aba6d40348bb5403b681262` | Disabled-state danger text |
477
+ | `Text/Warning/default` | `77a9549ffb50845bced5e0eaaf4211f1091f0091` | Warning label (default) |
478
+ | `Text/Warning/strong` | `1e37a593af7adea77c69dde1132bd61fd89415c8` | Warning label (strong emphasis) |
479
+ | `Text/Success/default` | `44319f8e722bf528c4d3d64e85803e5909a1ed24` | Success label (default) |
480
+ | `Text/Success/strong` | `b67b9bfad949ab233528946c188db62c94704d5b` | Success label (strong emphasis) |
481
+ | `Text/Information/default` | `f39715f7718f13abb37ffe01f6422c6919e97664` | Information label (default) |
482
+ | `Text/Information/strong` | `65082668d80e212e83cbc0d900ef75a93820c1b6` | Information label (strong emphasis) |
483
+
484
+ ### Tokens — Stroke colors (borders / dividers)
485
+
486
+ | Name | Key | Use |
487
+ |---|---|---|
488
+ | `Stroke/default` (A) | `307a6b41b64b70e2b6eff918aa7507df5a3264a7` | Default border (canonical) |
489
+ | `Stroke/default` (B) | `d617fd8d4cf71f07592dd057ef20ae1d3278e0f6` | Default border (alt — both resolve) |
490
+ | `Stroke/light` | `bffb5c87c0ecd0c5e75e01bc293fe599feb70f3b` | Even softer than Subdued/default |
491
+ | `Stroke/strong` | `2f89c5517c5f216761f4580b07fb34c3bf48313e` | Stronger border |
492
+ | `Stroke/icon` | `05800ba55fc6ac06077cd02511a4ff8efe4af23e` | Inside icon component strokes |
493
+ | `Stroke/inverse` | `e650900a58ee6989ebdc643a15ac9730c000386d` | Border on dark surfaces |
494
+ | `Stroke/Subdued/default` | `c0014bd70506929db79e1e128343ac06073f4cb2` | Hairline border |
495
+ | `Stroke/Subdued/strong` (A) | `4a8c88824c55626f4fcfa95d5d27d0a5fb14e840` | Strong hairline (canonical) |
496
+ | `Stroke/Subdued/strong` (B) | `6c770ed214889c4112781b497f9aa8d5959267a8` | Strong hairline (alt — both resolve) |
497
+ | `Stroke/Primary/default` | `04a5170d1fc1b8e34555b94da8f2200642f20e52` | Brand border (focus accents) |
498
+ | `Stroke/Focus/default` | `3f1502930609b4d357b86537a22c6b6c6ae676d8` | Focus ring outline |
499
+ | `Stroke/Focus/strong` | `13cb74b2d9d1be284405402d25240a1b373bd0e6` | Stronger focus ring |
500
+ | `Stroke/Success/default` | `7a3157e3a3f4348b87eb86a2f03cf80a7adfcaf8` | Success border |
501
+ | `Stroke/Danger/default` | `2e691fe4b862d281235dd45530c6cdb008f0fa49` | Danger border |
502
+ | `Stroke/Warning/default` | `68a7727b7c058695724b98ac2138c73d49bd7aaf` | Warning border |
503
+ | `Stroke/Information/default` | `df5a5e0174fdc916be6bd0b3559a91c189bd97c4` | Information border |
504
+
505
+ ### Tokens — Icon colors
506
+
507
+ | Name | Key | Use |
508
+ |---|---|---|
509
+ | `Icon/light` | `d3597696b4d4397bfe00526f26980503d2acdf36` | Lightest icon fill |
510
+ | `Icon/medium` | `12919a5fcfc769f033afa52092f44d8f1463497a` | Mid-weight icon fill |
511
+ | `Icon/default` (A) | `730d09a845693bf9055d123ab2a34ca5420c97eb` | Default icon fill (canonical) |
512
+ | `Icon/default` (B) | `7380baab8c502f2723f47bc9306f3c0c56a1d7da` | Default icon fill (alt — both resolve) |
513
+ | `Icon/inverse` (A) | `480cbba5254ab4fbd364a09fde471a05f2968eeb` | Icon on dark surfaces (canonical) |
514
+ | `Icon/inverse` (B) | `bd103aefdd0d048e2b9dd5c41ea40d5caee21558` | Icon on dark surfaces (alt — both resolve) |
515
+ | `Icon/Primary/default` | `0fbff50fe16394f1221b4faa9d7c29249f299fec` | Brand icon fill on soft surfaces |
516
+ | `Icon/Primary/strong` | `0a09d5cb80dcffe3022fb96d9c88bc716009d321` | Brand icon (stronger emphasis) |
517
+ | `Icon/Danger/default` | `00e809157fabb2437c6d9b0e675c812221dafd44` | Danger-colored icon |
518
+ | `Icon/Danger/strong` | `54d54302f7147e363520e774a5066ae551893a6d` | Danger icon (strong) |
519
+ | `Icon/Danger/disabled` | `5411f78f51b3c0515317297d5a86e499206690f3` | Disabled danger icon |
520
+ | `Icon/Warning/default` | `481e8de9fd902ebe7bb5e9a2e8c727dfdccda1c9` | Warning-colored icon |
521
+ | `Icon/Warning/strong` | `1ada6a2845ab70e0e3c00fef4dc29bf174667a84` | Warning icon (strong) |
522
+ | `Icon/Success/default` | `cdad1c2a11cc9046c83a7e3153e33291a43766e8` | Success-colored icon |
523
+ | `Icon/Success/strong` | `bffd0c9a20ed277844840a209e7b6deea0ee6778` | Success icon (strong) |
524
+ | `Icon/Information/default` | `7b26b788f0bcd40ff429aab8a69788840c139175` | Information-colored icon |
525
+ | `Icon/Information/strong` | `6f94921017a8dec3193615a9e3b9dac24f686df6` | Information icon (strong) |
526
+
527
+ ### Primitives — DO NOT bind directly in new mockups
528
+
529
+ The `Primitives`, `spacing`, `border radii`, `typography`, `shadows` collections (~325 variables total) feed into the `Tokens` collection via aliasing. **Never bind primitives directly in new work** — always pick the semantic `Tokens` entry above. Listed only as historic reference; the harvest script in the appendix can dump them on demand.
530
+
531
+ ---
532
+
533
+ ## Text Styles (LM Design System)
534
+
535
+ Apply via `node.textStyleId = (await figma.importStyleByKeyAsync(KEY)).id`. Do not set `fontSize` / `fontName` / `lineHeight` / `letterSpacing` directly when a style exists.
536
+
537
+ | Style name | Key | Use |
538
+ |---|---|---|
539
+ | `heading 1` | `320e1fc9c6b2b0811c8d7ca29d14951f3d6f5107` | Page title (rare — marketing / empty states), 48 / Inter Bold |
540
+ | `heading 2` | `a46340ac0d32457b9ba2315ab3265a9224d33e4c` | Major section title, 28 / Inter Bold |
541
+ | `heading 3` | `0f23e20b331940e4ec67efeadbf405c1aaff7bc8` | Card title, drawer title, 24 / Inter Bold |
542
+ | `heading 4` | `3df703bd6aed5db248837666080bf27e3df419c2` | Subsection title, 20 / Inter Bold |
543
+ | `heading 5` | `2fd31f8aab4a94d2923c1a82cb1a6dd96d53524f` | Inline group title, 18 / Inter Bold |
544
+ | `Body/Body 1` | `4935c3fe1dee3b636babfc29a23f4b1d367be1b7` | Body copy (default, 14 / Inter Regular) |
545
+ | `Body/Body 1 Strong` | `090cc58fa693c88242496d1dbc1ce36c931c09ac` | Body copy with medium 500 emphasis (14 / Inter Medium) |
546
+ | `Body/Body 1 Stronger` | `5c2852798b45b4739de8726e1acd41aca06bbcf0` | Body copy with semibold 600 emphasis (14 / Inter Semi Bold) |
547
+ | `Caption 1/Caption 1` | `da18e6b7867950b09192f851ef777192357c4074` | Caption (default, 13 / Inter Regular) |
548
+ | `Caption 1/Caption 1 Strong` | `acbe1fc78493bb664c8c8d8f6600682ccb78b1a5` | Caption (medium, 13 / Inter Medium) |
549
+ | `Caption 1/Caption 1 Stronger` | `bf47c4f814e5a6697fa469a2759056f98dd73c33` | Caption (semibold, 13 / Inter Semi Bold) |
550
+ | `Caption 2/Caption 2` | `7ef3860935ba2fd6662d56df175cdc4c432ff5b8` | Small caption (12 / Inter Regular) |
551
+ | `Caption 2/Caption 2 Strong` | `5b07351948994efd612d8f03f2471e43c2afed89` | Small caption (medium, 12 / Inter Medium) |
552
+ | `Caption 2/Caption 2 Stronger` | `6059aceac5f1a045664856a62abc76c840c1cec7` | Small caption (semibold, 12 / Inter Semi Bold) |
553
+ | `Caption 3/Caption 3` | `5253102bdf07e1d097d0256eebd0accb8ac4f8c4` | Smallest caption (11 / Inter Regular) |
554
+ | `Caption 3/Caption 3 Strong` | `78ed1d8198293c4d5e3f68f90f46f57a8fd60e66` | Smallest caption (medium, 11 / Inter Medium) |
555
+ | `Caption 3/Caption 3 Stronger` | `38ebe9788e5a6884296a6910044d5191dd766f59` | Smallest caption (semibold, 11 / Inter Semi Bold) |
556
+ | `Small Caps` | `b2e75efed92eae8ef2290b0357e94cebd7e30f8e` | All-caps section label (12 / Inter Semi Bold) |
557
+ | `monospaced` | `f2da26c94c428a2d113df9d5e05eee666b4b9a5e` | Code / kbd (16 / Menlo Regular) |
558
+
559
+ > Total: 19 published text styles in the LM Design System (all listed above). No others exist.
560
+
561
+ ---
562
+
563
+ ## Effect Styles (LM Design System)
564
+
565
+ Apply via `node.effectStyleId = (await figma.importStyleByKeyAsync(KEY)).id`. Never construct a manual `DROP_SHADOW` effect when one of these covers the role.
566
+
567
+ | Style name | Key | Use |
568
+ |---|---|---|
569
+ | `shadow-2xs` | `caae14087a765e2f30174f2d516f4141c45465c3` | Hairline shadow under chips |
570
+ | `shadow-xs` | `5754b14fde60b47aab8314daa3266b9e2f947884` | Subtle separator |
571
+ | `shadow-sm` (A) | `9f174f17971aea71cb22829b293d116618594c23` | Inline cards, popover tip (canonical) |
572
+ | `shadow-sm` (B) | `2a7ce2770d882ee56d652d3610e6c081541f2880` | Inline cards (alt — both resolve) |
573
+ | `shadow-md` | `4d3453fef1076b543c1a4f49417487c8bb34006d` | Default elevated card |
574
+ | `shadow-lg` | `77dfe131d8eb7f2152ed31f6e5126927d1e2d52c` | Drawer, popover floating layer |
575
+ | `shadow-xl` | `10587aea6203933ca62e0719808cc4082f1b881f` | High elevation (modal halo) |
576
+ | `shadow-2xl` | `560ff64c1104f519e88384f88f1b225f350cce7e` | Highest elevation |
577
+ | `focus ring` | `1f1a63f2f9c07491b75572225dfeac434549cdeb` | Default focus outline (use for keyboard-focus states) |
578
+ | `focus ring sidebar` | `26cf504a8a9a25de554e8e3e16a12a3c21f3e8d3` | Focus outline tuned for sidebar items |
579
+ | `focus ring error` | `cb571d4c0cd0ad5703ff10720e8872eebf047f82` | Focus outline for danger / invalid states |
580
+
581
+ > Total: 10 published effect styles in the LM Design System. No others exist.
582
+
583
+ ---
584
+
585
+ ## Confirmed absent from LM Design System
586
+
587
+ Components that the library does **not** publish under their shadcn-canonical names (verified on the harvest date):
588
+
589
+ | Wanted | Substitute |
590
+ |---|---|
591
+ | `Popover` | Use `Hover Card` (hover-trigger) or `Dialog` / `Sheet` (click-trigger). No standalone `Popover` set ships. |
592
+ | `Banner` (named that) | Use `Alert` or `Callout` — both are banner-style inline notices. |
593
+ | `Toast` (named that) | Use `Sonner` / `Sonner Content` — same role, different name. |
594
+
595
+ (If you find one of these later published under its canonical name, add a row to the relevant table above and remove it here.)
596
+
597
+ ---
598
+
599
+ ## Reference Mockup Anchors (LM Vision file `AE4ZLZoEgdJList3S4eJ7q`)
600
+
601
+ Use these as visual / structural references when starting new mockups. They are *built correctly* per the rules in `figma-design-system.mdc`.
602
+
603
+ | Purpose | Node ID | Notes |
604
+ |---|---|---|
605
+ | **List page shell** (Deliverables tab — sidebar + main content) | `5787:30996` | Foundation — list-page reusable shell. Branch every list-page mockup from here. |
606
+ | **Pass-2 UC wrapper section** | `5501:1549` | Parent of every Pass-2 UC mockup; child sections live at `5555:14` (UC11), `5680:13` (UC15), `5582:13` (UC19), `5588:13` (UC20), `5592:13` (UC30), `5601:13` (UC31), `5604:13` (UC32), `5613:13` (UC34), `5633:13` (UC33), `5644:13` (UC18), `5701:13` (UC16), `5710:13` (UC16 Ad Hoc editor), `5722:13` (UC22). |
607
+ | **Foundation list-page parent section** | `5501:1550` | Section that contains the canonical list-page frame referenced above. |
608
+ | **Alert Dialog assembled sample** | `4141:5746` | Pre-assembled Alert Dialog instance — copy this, override the body text and footer buttons. Do NOT recompose `Dialog + Dialog Header + Dialog Footer` for confirmation prompts. |
609
+ | **UC11 wrapper** (4 share-modal states) | `5555:14` | Modal chrome reference. |
610
+ | **UC15 wrapper** (3 send-drawer states) | `5680:13` | Sheet / drawer chrome reference. |
611
+ | **UC22 wrapper** (3 public recipient states) | `5722:13` | Branded chrome reference. |
612
+ | **UC3 default editor** | reference via parent page `5269:6651` → "Foundation — Editor" section | Walk the page when you start an editor-chrome mockup. |
613
+
614
+ The Pass-2 UC mockups are on Figma page **`🍿 Deliverables`** (pageId `5269:6651`). Always `await figma.setCurrentPageAsync(page)` to switch to that page before targeting any of the IDs above.
615
+
616
+ ---
617
+
618
+ ## Pre-Flight, with the cache
619
+
620
+ The `figma-design-system.mdc` §3 pre-flight expects `search_design_system` calls before the first `use_figma` mutation. **With this cache present, replace them with:**
621
+
622
+ 1. **Read this file** — pick the keys you need by role.
623
+ 2. **Open the LM Vision reference frame** (`5787:30996` for list pages, `5555:14` / `5680:13` / `5722:13` for modal / drawer / public chrome) via `get_design_context` to confirm visual conventions.
624
+ 3. **Only run `search_design_system`** for any component you need that is missing from this cache. When you run a search, update this file with the new key in the same change.
625
+
626
+ If any cached key fails at runtime, follow "When the cache is wrong" above.
627
+
628
+ Always pass `skillNames: "figma-use,figma-generate-design"` (and any other applicable skill names) to `use_figma` for logging.
629
+
630
+ ---
631
+
632
+ ## Appendix — Full re-harvest script
633
+
634
+ If the cache feels stale (e.g., upstream did a major library rebuild), run this against `VCLfybgU3OaUUPrQdBaVmP` via `use_figma`. It returns the full component map, all variables in `Tokens`, all text styles, and all effect styles. Paste the result into the tables above (skip variants inside component sets — only the set key and standalone components are useful).
635
+
636
+ ```js
637
+ // 1. Components: only sets + standalone components on every component page.
638
+ const skip = new Set(['Cover & Changes','---','Typography','Icons','Shadows','Colors','All Components','Screen examples']);
639
+ const components = [];
640
+ for (const page of figma.root.children) {
641
+ if (skip.has(page.name)) continue;
642
+ await figma.setCurrentPageAsync(page);
643
+ for (const child of page.children) {
644
+ if (child.type === 'COMPONENT_SET') components.push({ page: page.name, t: 'set', name: child.name, key: child.key });
645
+ else if (child.type === 'COMPONENT') components.push({ page: page.name, t: 'comp', name: child.name, key: child.key });
646
+ else if (child.type === 'FRAME' || child.type === 'SECTION') {
647
+ const inner = child.findAll(n => n.type === 'COMPONENT_SET' || (n.type === 'COMPONENT' && n.parent && n.parent.type !== 'COMPONENT_SET'));
648
+ for (const n of inner) components.push({ page: page.name, t: n.type === 'COMPONENT_SET' ? 'set' : 'comp', name: n.name, key: n.key });
649
+ }
650
+ }
651
+ }
652
+
653
+ // 2. Tokens variables.
654
+ const collections = await figma.variables.getLocalVariableCollectionsAsync();
655
+ const tokens = collections.find(c => c.name === 'Tokens');
656
+ const tokenVars = [];
657
+ for (const id of tokens.variableIds) {
658
+ const v = await figma.variables.getVariableByIdAsync(id);
659
+ if (v) tokenVars.push({ name: v.name, key: v.key, type: v.resolvedType });
660
+ }
661
+
662
+ // 3. Text + effect styles.
663
+ const textStyles = (await figma.getLocalTextStylesAsync()).map(s => ({ name: s.name, key: s.key, fontSize: s.fontSize, fontName: s.fontName }));
664
+ const effectStyles = (await figma.getLocalEffectStylesAsync()).map(s => ({ name: s.name, key: s.key }));
665
+
666
+ return { components, tokenVars, textStyles, effectStyles };
667
+ ```
668
+
669
+ For icons, run a separate call (the Icons page has ~1,600 single components):
670
+
671
+ ```js
672
+ const icons = [];
673
+ const iconsPage = figma.root.children.find(p => p.name === 'Icons');
674
+ await figma.setCurrentPageAsync(iconsPage);
675
+ iconsPage.findAll(n => {
676
+ if (n.type === 'COMPONENT' && n.parent.type !== 'COMPONENT_SET') icons.push({ name: n.name, key: n.key });
677
+ return false;
678
+ });
679
+ return icons;
680
+ ```