@lar-works/design-system 0.2.0 → 0.3.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 (433) hide show
  1. package/README.md +5 -1
  2. package/dist/actions/Button.d.ts +39 -1
  3. package/dist/actions/Button.js +39 -9
  4. package/dist/actions/Button.js.map +1 -1
  5. package/dist/actions/ButtonLink.d.ts +5 -1
  6. package/dist/actions/ButtonLink.js +28 -2
  7. package/dist/actions/ButtonLink.js.map +1 -1
  8. package/dist/actions/ButtonRecipes.js +7 -0
  9. package/dist/actions/ButtonRecipes.js.map +1 -0
  10. package/dist/actions/IconButton.d.ts +2 -2
  11. package/dist/actions/IconButton.js +1 -1
  12. package/dist/actions/IconButton.js.map +1 -1
  13. package/dist/actions/ThemeSwitch.js +1 -1
  14. package/dist/board/ActivityLine.d.ts +36 -0
  15. package/dist/board/ActivityLine.js +144 -0
  16. package/dist/board/ActivityLine.js.map +1 -0
  17. package/dist/board/ActivityTrack.d.ts +11 -0
  18. package/dist/board/ActivityTrack.js +25 -0
  19. package/dist/board/ActivityTrack.js.map +1 -0
  20. package/dist/board/AddItem.d.ts +82 -0
  21. package/dist/board/AddItem.js +185 -0
  22. package/dist/board/AddItem.js.map +1 -0
  23. package/dist/board/Archive.d.ts +21 -0
  24. package/dist/board/Archive.js +63 -0
  25. package/dist/board/Archive.js.map +1 -0
  26. package/dist/board/Attention.d.ts +66 -0
  27. package/dist/board/Attention.js +122 -0
  28. package/dist/board/Attention.js.map +1 -0
  29. package/dist/board/BoardShell.d.ts +16 -0
  30. package/dist/board/BoardShell.js +35 -0
  31. package/dist/board/BoardShell.js.map +1 -0
  32. package/dist/board/BoardTitleBar.d.ts +50 -0
  33. package/dist/board/BoardTitleBar.js +125 -0
  34. package/dist/board/BoardTitleBar.js.map +1 -0
  35. package/dist/board/ButtonKinds.d.ts +24 -0
  36. package/dist/board/ButtonKinds.js +19 -0
  37. package/dist/board/ButtonKinds.js.map +1 -0
  38. package/dist/board/Cleanup.d.ts +8 -0
  39. package/dist/board/Cleanup.js +15 -0
  40. package/dist/board/Cleanup.js.map +1 -0
  41. package/dist/board/Counters.d.ts +101 -0
  42. package/dist/board/Counters.js +202 -0
  43. package/dist/board/Counters.js.map +1 -0
  44. package/dist/board/DataAttributes.d.ts +6 -0
  45. package/dist/board/Dependencies.d.ts +17 -0
  46. package/dist/board/Dependencies.js +44 -0
  47. package/dist/board/Dependencies.js.map +1 -0
  48. package/dist/board/Desk.d.ts +52 -0
  49. package/dist/board/Desk.js +130 -0
  50. package/dist/board/Desk.js.map +1 -0
  51. package/dist/board/Dossier.d.ts +100 -0
  52. package/dist/board/Dossier.js +194 -0
  53. package/dist/board/Dossier.js.map +1 -0
  54. package/dist/board/Filters.d.ts +33 -0
  55. package/dist/board/Filters.js +64 -0
  56. package/dist/board/Filters.js.map +1 -0
  57. package/dist/board/ItemDetails.d.ts +167 -0
  58. package/dist/board/ItemDetails.js +339 -0
  59. package/dist/board/ItemDetails.js.map +1 -0
  60. package/dist/board/ItemDialog.d.ts +73 -0
  61. package/dist/board/ItemDialog.js +140 -0
  62. package/dist/board/ItemDialog.js.map +1 -0
  63. package/dist/board/ItemParts.d.ts +42 -0
  64. package/dist/board/ItemParts.js +82 -0
  65. package/dist/board/ItemParts.js.map +1 -0
  66. package/dist/board/ItemProgress.d.ts +56 -0
  67. package/dist/board/ItemProgress.js +138 -0
  68. package/dist/board/ItemProgress.js.map +1 -0
  69. package/dist/board/List.d.ts +65 -0
  70. package/dist/board/List.js +118 -0
  71. package/dist/board/List.js.map +1 -0
  72. package/dist/board/LoadingScreen.d.ts +38 -0
  73. package/dist/board/LoadingScreen.js +74 -0
  74. package/dist/board/LoadingScreen.js.map +1 -0
  75. package/dist/board/NeedsYou.d.ts +13 -0
  76. package/dist/board/NeedsYou.js +31 -0
  77. package/dist/board/NeedsYou.js.map +1 -0
  78. package/dist/board/Onboarding.d.ts +53 -0
  79. package/dist/board/Onboarding.js +122 -0
  80. package/dist/board/Onboarding.js.map +1 -0
  81. package/dist/board/PartsList.d.ts +60 -0
  82. package/dist/board/PartsList.js +115 -0
  83. package/dist/board/PartsList.js.map +1 -0
  84. package/dist/board/ProjectIcon.d.ts +51 -0
  85. package/dist/board/ProjectIcon.js +120 -0
  86. package/dist/board/ProjectIcon.js.map +1 -0
  87. package/dist/board/PullRequests.d.ts +43 -0
  88. package/dist/board/PullRequests.js +83 -0
  89. package/dist/board/PullRequests.js.map +1 -0
  90. package/dist/board/RowStyles.js +14 -0
  91. package/dist/board/RowStyles.js.map +1 -0
  92. package/dist/board/Settings.d.ts +54 -0
  93. package/dist/board/Settings.js +112 -0
  94. package/dist/board/Settings.js.map +1 -0
  95. package/dist/board/Slices.d.ts +32 -0
  96. package/dist/board/Slices.js +88 -0
  97. package/dist/board/Slices.js.map +1 -0
  98. package/dist/board/SourceIcon.d.ts +12 -0
  99. package/dist/board/SourceIcon.js +24 -0
  100. package/dist/board/SourceIcon.js.map +1 -0
  101. package/dist/board/StagePane.d.ts +43 -0
  102. package/dist/board/StagePane.js +97 -0
  103. package/dist/board/StagePane.js.map +1 -0
  104. package/dist/board/StageRow.d.ts +141 -0
  105. package/dist/board/StageRow.js +287 -0
  106. package/dist/board/StageRow.js.map +1 -0
  107. package/dist/board/StageTrack.d.ts +18 -0
  108. package/dist/board/StageTrack.js +38 -0
  109. package/dist/board/StageTrack.js.map +1 -0
  110. package/dist/board/StartControls.d.ts +30 -0
  111. package/dist/board/StartControls.js +51 -0
  112. package/dist/board/StartControls.js.map +1 -0
  113. package/dist/board/StatusColors.d.ts +5 -0
  114. package/dist/board/StatusColors.js +17 -0
  115. package/dist/board/StatusColors.js.map +1 -0
  116. package/dist/board/StatusGlyph.d.ts +18 -0
  117. package/dist/board/StatusGlyph.js +51 -0
  118. package/dist/board/StatusGlyph.js.map +1 -0
  119. package/dist/board/Threads.d.ts +13 -0
  120. package/dist/board/Threads.js +35 -0
  121. package/dist/board/Threads.js.map +1 -0
  122. package/dist/board/TrackerLabels.d.ts +27 -0
  123. package/dist/board/TrackerLabels.js +56 -0
  124. package/dist/board/TrackerLabels.js.map +1 -0
  125. package/dist/board/UpdatePill.d.ts +52 -0
  126. package/dist/board/UpdatePill.js +188 -0
  127. package/dist/board/UpdatePill.js.map +1 -0
  128. package/dist/board/Vocabulary.d.ts +56 -0
  129. package/dist/board/Vocabulary.js +104 -0
  130. package/dist/board/Vocabulary.js.map +1 -0
  131. package/dist/board/Warnings.d.ts +35 -0
  132. package/dist/board/Warnings.js +85 -0
  133. package/dist/board/Warnings.js.map +1 -0
  134. package/dist/board/WorkMap.d.ts +136 -0
  135. package/dist/board/WorkMap.js +274 -0
  136. package/dist/board/WorkMap.js.map +1 -0
  137. package/dist/board/index.d.ts +42 -0
  138. package/dist/collections/CollectionState.d.ts +10 -1
  139. package/dist/collections/CollectionState.js +12 -5
  140. package/dist/collections/CollectionState.js.map +1 -1
  141. package/dist/collections/ResultList.js +1 -1
  142. package/dist/collections/ScrollRow.js +1 -1
  143. package/dist/collections/VirtualList.js +1 -1
  144. package/dist/display/Avatar.d.ts +5 -2
  145. package/dist/display/Avatar.js +2 -2
  146. package/dist/display/Avatar.js.map +1 -1
  147. package/dist/display/Badge.d.ts +6 -1
  148. package/dist/display/Badge.js +9 -4
  149. package/dist/display/Badge.js.map +1 -1
  150. package/dist/display/CheckList.js +1 -1
  151. package/dist/display/Comment.d.ts +12 -0
  152. package/dist/display/Comment.js +39 -0
  153. package/dist/display/Comment.js.map +1 -0
  154. package/dist/display/CopyButton.d.ts +10 -2
  155. package/dist/display/CopyButton.js +29 -16
  156. package/dist/display/CopyButton.js.map +1 -1
  157. package/dist/display/Diagram.d.ts +17 -0
  158. package/dist/display/Diagram.js +49 -0
  159. package/dist/display/Diagram.js.map +1 -0
  160. package/dist/display/ImagePicker.js +1 -1
  161. package/dist/display/InfoBox.js +2 -2
  162. package/dist/display/InsetPanel.d.ts +3 -1
  163. package/dist/display/InsetPanel.js +7 -4
  164. package/dist/display/InsetPanel.js.map +1 -1
  165. package/dist/display/ItemAction.js +2 -2
  166. package/dist/display/LabelChip.d.ts +26 -0
  167. package/dist/display/LabelChip.js +41 -0
  168. package/dist/display/LabelChip.js.map +1 -0
  169. package/dist/display/LabelTint.js +60 -0
  170. package/dist/display/LabelTint.js.map +1 -0
  171. package/dist/display/Person.d.ts +5 -0
  172. package/dist/display/Person.js +19 -0
  173. package/dist/display/Person.js.map +1 -0
  174. package/dist/display/PropertySheet.js +1 -1
  175. package/dist/display/RadioChoice.d.ts +9 -2
  176. package/dist/display/RadioChoice.js +5 -1
  177. package/dist/display/RadioChoice.js.map +1 -1
  178. package/dist/display/RatingLink.js +1 -1
  179. package/dist/display/RichText.d.ts +12 -0
  180. package/dist/display/RichText.js +94 -0
  181. package/dist/display/RichText.js.map +1 -0
  182. package/dist/display/RowList.js +1 -1
  183. package/dist/display/index.d.ts +6 -1
  184. package/dist/feedback/Alert.js +1 -1
  185. package/dist/feedback/AsyncState.js +1 -1
  186. package/dist/feedback/DismissButton.d.ts +12 -0
  187. package/dist/feedback/DismissButton.js +20 -0
  188. package/dist/feedback/DismissButton.js.map +1 -0
  189. package/dist/feedback/ErrorNotification.js +2 -0
  190. package/dist/feedback/ErrorNotification.js.map +1 -1
  191. package/dist/feedback/FormResult.d.ts +16 -0
  192. package/dist/feedback/FormResult.js +30 -0
  193. package/dist/feedback/FormResult.js.map +1 -0
  194. package/dist/feedback/LiveRegion.d.ts +7 -0
  195. package/dist/feedback/LiveRegion.js +15 -0
  196. package/dist/feedback/LiveRegion.js.map +1 -0
  197. package/dist/feedback/Loading.d.ts +19 -0
  198. package/dist/feedback/Loading.js +63 -0
  199. package/dist/feedback/Loading.js.map +1 -0
  200. package/dist/feedback/Notifications.d.ts +35 -1
  201. package/dist/feedback/Notifications.js +196 -4
  202. package/dist/feedback/Notifications.js.map +1 -1
  203. package/dist/feedback/Progress.d.ts +15 -0
  204. package/dist/feedback/Progress.js +38 -0
  205. package/dist/feedback/Progress.js.map +1 -0
  206. package/dist/feedback/ProgressStatusRow.js +1 -1
  207. package/dist/feedback/StatusIndicator.d.ts +6 -1
  208. package/dist/feedback/StatusIndicator.js +19 -5
  209. package/dist/feedback/StatusIndicator.js.map +1 -1
  210. package/dist/feedback/index.d.ts +8 -4
  211. package/dist/forms/Checkbox.js +1 -1
  212. package/dist/forms/ColorSwatches.d.ts +21 -0
  213. package/dist/forms/ColorSwatches.js +26 -0
  214. package/dist/forms/ColorSwatches.js.map +1 -0
  215. package/dist/forms/FormSection.d.ts +68 -6
  216. package/dist/forms/FormSection.js +139 -8
  217. package/dist/forms/FormSection.js.map +1 -1
  218. package/dist/forms/HiddenField.d.ts +6 -0
  219. package/dist/forms/HiddenField.js +13 -0
  220. package/dist/forms/HiddenField.js.map +1 -0
  221. package/dist/forms/Input.d.ts +12 -2
  222. package/dist/forms/Input.js +10 -3
  223. package/dist/forms/Input.js.map +1 -1
  224. package/dist/forms/LabelPicker.d.ts +43 -0
  225. package/dist/forms/LabelPicker.js +107 -0
  226. package/dist/forms/LabelPicker.js.map +1 -0
  227. package/dist/forms/MarkdownEditor.d.ts +21 -0
  228. package/dist/forms/MarkdownEditor.js +175 -0
  229. package/dist/forms/MarkdownEditor.js.map +1 -0
  230. package/dist/forms/MarkdownToolbar.js +204 -0
  231. package/dist/forms/MarkdownToolbar.js.map +1 -0
  232. package/dist/forms/OptionSelect.d.ts +30 -9
  233. package/dist/forms/OptionSelect.js +53 -13
  234. package/dist/forms/OptionSelect.js.map +1 -1
  235. package/dist/forms/Select.d.ts +4 -1
  236. package/dist/forms/Select.js +3 -1
  237. package/dist/forms/Select.js.map +1 -1
  238. package/dist/forms/Switch.d.ts +4 -1
  239. package/dist/forms/Switch.js +5 -2
  240. package/dist/forms/Switch.js.map +1 -1
  241. package/dist/forms/TagInput.js +1 -1
  242. package/dist/forms/index.d.ts +7 -3
  243. package/dist/foundations/AmbientMotion.d.ts +2 -0
  244. package/dist/foundations/AmbientMotion.js +39 -0
  245. package/dist/foundations/AmbientMotion.js.map +1 -0
  246. package/dist/foundations/DesignSystemProvider.d.ts +34 -0
  247. package/dist/foundations/DesignSystemProvider.js +26 -1
  248. package/dist/foundations/DesignSystemProvider.js.map +1 -1
  249. package/dist/foundations/index.d.ts +2 -1
  250. package/dist/icons/BrandIcons.d.ts +8 -2
  251. package/dist/icons/BrandIcons.js +14 -3
  252. package/dist/icons/BrandIcons.js.map +1 -1
  253. package/dist/icons/dynamic.d.ts +2 -0
  254. package/dist/icons/dynamic.js +1 -0
  255. package/dist/icons/index.d.ts +2 -2
  256. package/dist/icons/index.js +1 -1
  257. package/dist/icons.d.ts +2 -2
  258. package/dist/icons.js +1 -1
  259. package/dist/index.d.ts +71 -10
  260. package/dist/index.js +78 -21
  261. package/dist/layout/Site.js +1 -1
  262. package/dist/layout/TitleBar.js +1 -1
  263. package/dist/layout/index.d.ts +2 -2
  264. package/dist/layout/index.js +3 -3
  265. package/dist/layout/toolbar/CommandPaletteTrigger.d.ts +17 -2
  266. package/dist/layout/toolbar/CommandPaletteTrigger.js +89 -6
  267. package/dist/layout/toolbar/CommandPaletteTrigger.js.map +1 -1
  268. package/dist/layout/toolbar/TriggerFit.js +56 -0
  269. package/dist/layout/toolbar/TriggerFit.js.map +1 -0
  270. package/dist/navigation/CollectionBrowseSelector.js +1 -1
  271. package/dist/navigation/CollectionViewToggle.d.ts +26 -0
  272. package/dist/navigation/CollectionViewToggle.js +54 -23
  273. package/dist/navigation/CollectionViewToggle.js.map +1 -1
  274. package/dist/navigation/DrilldownBrowseSelector.js +1 -1
  275. package/dist/navigation/FolderSelector.js +2 -2
  276. package/dist/navigation/SortMenu.d.ts +10 -0
  277. package/dist/navigation/SortMenu.js +33 -0
  278. package/dist/navigation/SortMenu.js.map +1 -0
  279. package/dist/navigation/index.d.ts +3 -2
  280. package/dist/overlays/CommandPalette.d.ts +38 -4
  281. package/dist/overlays/CommandPalette.js +140 -54
  282. package/dist/overlays/CommandPalette.js.map +1 -1
  283. package/dist/overlays/Drawer.js +1 -1
  284. package/dist/overlays/DropdownMenu.d.ts +7 -1
  285. package/dist/overlays/DropdownMenu.js +13 -2
  286. package/dist/overlays/DropdownMenu.js.map +1 -1
  287. package/dist/overlays/HelpTip.d.ts +8 -0
  288. package/dist/overlays/HelpTip.js +29 -0
  289. package/dist/overlays/HelpTip.js.map +1 -0
  290. package/dist/overlays/ImageViewer.js +2 -2
  291. package/dist/overlays/Modal.d.ts +5 -0
  292. package/dist/overlays/Modal.js +17 -2
  293. package/dist/overlays/Modal.js.map +1 -1
  294. package/dist/overlays/ModalExpandButton.d.ts +18 -0
  295. package/dist/overlays/ModalExpandButton.js +43 -0
  296. package/dist/overlays/ModalExpandButton.js.map +1 -0
  297. package/dist/overlays/Popover.d.ts +2 -1
  298. package/dist/overlays/Popover.js +1 -0
  299. package/dist/overlays/Popover.js.map +1 -1
  300. package/dist/overlays/index.d.ts +4 -2
  301. package/dist/showcase/Cards.js +1 -1
  302. package/dist/showcase/FeatureRow.js +1 -1
  303. package/dist/showcase/PhotoSearchConcept.js +1 -1
  304. package/dist/showcase/ProductBand.js +1 -1
  305. package/dist/showcase/Status.js +1 -1
  306. package/dist/typography/Code.d.ts +18 -0
  307. package/dist/typography/Code.js +24 -0
  308. package/dist/typography/Code.js.map +1 -0
  309. package/dist/typography/Link.d.ts +7 -2
  310. package/dist/typography/Link.js +15 -5
  311. package/dist/typography/Link.js.map +1 -1
  312. package/dist/typography/Typography.d.ts +19 -1
  313. package/dist/typography/Typography.js +11 -3
  314. package/dist/typography/Typography.js.map +1 -1
  315. package/dist/typography/index.d.ts +3 -3
  316. package/package.json +26 -3
  317. package/src/actions/Button.tsx +78 -11
  318. package/src/actions/ButtonLink.tsx +34 -0
  319. package/src/actions/ButtonRecipes.ts +10 -0
  320. package/src/actions/IconButton.tsx +7 -4
  321. package/src/board/ActivityLine.tsx +176 -0
  322. package/src/board/ActivityTrack.tsx +23 -0
  323. package/src/board/AddItem.tsx +259 -0
  324. package/src/board/Archive.tsx +75 -0
  325. package/src/board/Attention.tsx +135 -0
  326. package/src/board/BoardShell.tsx +30 -0
  327. package/src/board/BoardTitleBar.tsx +167 -0
  328. package/src/board/ButtonKinds.ts +32 -0
  329. package/src/board/Cleanup.tsx +19 -0
  330. package/src/board/Counters.tsx +224 -0
  331. package/src/board/DataAttributes.ts +3 -0
  332. package/src/board/Dependencies.tsx +49 -0
  333. package/src/board/Desk.tsx +155 -0
  334. package/src/board/Dossier.tsx +262 -0
  335. package/src/board/Filters.tsx +85 -0
  336. package/src/board/ItemDetails.tsx +435 -0
  337. package/src/board/ItemDialog.tsx +179 -0
  338. package/src/board/ItemParts.tsx +128 -0
  339. package/src/board/ItemProgress.tsx +164 -0
  340. package/src/board/List.tsx +154 -0
  341. package/src/board/LoadingScreen.tsx +78 -0
  342. package/src/board/NeedsYou.tsx +30 -0
  343. package/src/board/Onboarding.tsx +124 -0
  344. package/src/board/PartsList.tsx +160 -0
  345. package/src/board/ProjectIcon.tsx +172 -0
  346. package/src/board/PullRequests.tsx +106 -0
  347. package/src/board/RowStyles.ts +17 -0
  348. package/src/board/Settings.tsx +124 -0
  349. package/src/board/Slices.tsx +103 -0
  350. package/src/board/SourceIcon.tsx +33 -0
  351. package/src/board/StagePane.tsx +128 -0
  352. package/src/board/StageRow.tsx +320 -0
  353. package/src/board/StageTrack.tsx +61 -0
  354. package/src/board/StartControls.tsx +77 -0
  355. package/src/board/StatusColors.ts +28 -0
  356. package/src/board/StatusGlyph.tsx +70 -0
  357. package/src/board/Threads.tsx +38 -0
  358. package/src/board/TrackerLabels.tsx +75 -0
  359. package/src/board/UpdatePill.tsx +222 -0
  360. package/src/board/Vocabulary.tsx +155 -0
  361. package/src/board/Warnings.tsx +83 -0
  362. package/src/board/WorkMap.tsx +436 -0
  363. package/src/board/base.css +121 -0
  364. package/src/board/button-kinds.css +8 -0
  365. package/src/board/index.ts +224 -0
  366. package/src/board/items.css +75 -0
  367. package/src/board/loading-screen.css +171 -0
  368. package/src/board/rows.css +180 -0
  369. package/src/board/title-bar.css +56 -0
  370. package/src/board/tokens.css +52 -0
  371. package/src/board.css +19 -0
  372. package/src/collections/CollectionState.tsx +20 -7
  373. package/src/display/Avatar.tsx +6 -3
  374. package/src/display/Badge.tsx +25 -3
  375. package/src/display/Comment.tsx +26 -0
  376. package/src/display/CopyButton.tsx +48 -18
  377. package/src/display/Diagram.tsx +59 -0
  378. package/src/display/InsetPanel.tsx +4 -1
  379. package/src/display/LabelChip.tsx +73 -0
  380. package/src/display/LabelTint.ts +72 -0
  381. package/src/display/Person.tsx +11 -0
  382. package/src/display/RadioChoice.tsx +11 -2
  383. package/src/display/RichText.tsx +114 -0
  384. package/src/display/index.ts +5 -0
  385. package/src/feedback/DismissButton.tsx +28 -0
  386. package/src/feedback/ErrorNotification.ts +3 -0
  387. package/src/feedback/FormResult.tsx +50 -0
  388. package/src/feedback/LiveRegion.tsx +10 -0
  389. package/src/feedback/Loading.tsx +75 -0
  390. package/src/feedback/Notifications.tsx +267 -2
  391. package/src/feedback/Progress.tsx +44 -0
  392. package/src/feedback/StatusIndicator.tsx +34 -3
  393. package/src/feedback/index.ts +12 -2
  394. package/src/forms/ColorSwatches.tsx +50 -0
  395. package/src/forms/FormSection.tsx +245 -10
  396. package/src/forms/HiddenField.tsx +4 -0
  397. package/src/forms/Input.tsx +26 -4
  398. package/src/forms/LabelPicker.tsx +140 -0
  399. package/src/forms/MarkdownEditor.tsx +283 -0
  400. package/src/forms/MarkdownToolbar.tsx +267 -0
  401. package/src/forms/OptionSelect.tsx +110 -25
  402. package/src/forms/Select.tsx +20 -13
  403. package/src/forms/Switch.tsx +16 -2
  404. package/src/forms/index.ts +16 -2
  405. package/src/foundations/AmbientMotion.ts +51 -0
  406. package/src/foundations/DesignSystemProvider.tsx +19 -0
  407. package/src/foundations/index.ts +1 -0
  408. package/src/foundations/theme.css +64 -0
  409. package/src/icons/BrandIcons.tsx +12 -3
  410. package/src/icons/dynamic.ts +4 -0
  411. package/src/icons/index.ts +1 -1
  412. package/src/index.ts +2 -1
  413. package/src/layout/index.ts +1 -1
  414. package/src/layout/toolbar/CommandPaletteTrigger.tsx +187 -31
  415. package/src/layout/toolbar/TriggerFit.ts +84 -0
  416. package/src/navigation/CollectionViewToggle.tsx +94 -24
  417. package/src/navigation/SortMenu.tsx +41 -0
  418. package/src/navigation/index.ts +2 -1
  419. package/src/overlays/CommandPalette.tsx +190 -60
  420. package/src/overlays/DropdownMenu.tsx +12 -1
  421. package/src/overlays/HelpTip.tsx +29 -0
  422. package/src/overlays/Modal.tsx +23 -0
  423. package/src/overlays/ModalExpandButton.tsx +48 -0
  424. package/src/overlays/Popover.tsx +3 -1
  425. package/src/overlays/index.ts +9 -1
  426. package/src/showcase.css +6 -0
  427. package/src/styles.css +9 -1
  428. package/src/typography/Code.tsx +24 -0
  429. package/src/typography/Link.tsx +19 -10
  430. package/src/typography/Typography.tsx +25 -2
  431. package/src/typography/index.ts +1 -1
  432. package/dist/feedback/index.js +0 -11
  433. package/dist/typography/index.js +0 -4
@@ -1,14 +1,45 @@
1
+ import { type KeyboardEvent, type ReactNode, type Ref, useRef } from 'react';
2
+ import { flushSync } from 'react-dom';
3
+
1
4
  import { SkeletonLoader } from '../feedback/SkeletonLoader';
2
- import { Select, SelectItem } from './Select';
5
+ import { Select, SelectItem, type SelectProps } from './Select';
3
6
 
4
- interface LoadedOptionSelectProps<Value extends string> {
5
- disabled?: boolean;
7
+ const NONE = '__none';
8
+
9
+ export interface OptionSelectOption<Value extends string = string> {
6
10
  label: string;
11
+ value: Value;
12
+ /** Disabled options stay visible but cannot be chosen. */
13
+ disabled?: boolean;
14
+ icon?: ReactNode;
15
+ /** A lar-brand app hue that colours the icon, such as a kind's. */
16
+ hue?: number;
17
+ }
18
+
19
+ interface LoadedOptionSelectProps<Value extends string> extends Omit<
20
+ SelectProps,
21
+ 'value' | 'defaultValue' | 'onValueChange' | 'onChange' | 'children' | 'className' | 'size' | 'variant'
22
+ > {
23
+ /** The select's accessible name; leave it out when a label names the select by its `id`. */
24
+ label?: string;
7
25
  loading?: false;
8
26
  onChange: (value: Value) => void;
9
- /** Disabled options stay visible but cannot be chosen. */
10
- options: readonly { label: string; value: Value; disabled?: boolean }[];
11
- value: Value;
27
+ options: readonly OptionSelectOption<Value>[];
28
+ /** An empty value shows the placeholder, or `none`. */
29
+ value: Value | '';
30
+ /** The name of the option that empties the value, which `onChange` hears as ''. */
31
+ none?: string;
32
+ /** A form field's name: the select gives its form the value in a hidden field, and fires input on that field once
33
+ * a pick has rendered, as Select is a button over a listbox that fires no input event of its own. */
34
+ name?: string;
35
+ /** A pick writes at once, so a letter key on the closed control doesn't pick: the Select's typeahead only works
36
+ * once its list is open. */
37
+ writesOnPick?: boolean;
38
+ /** Busy rather than disabled while a pick it made saves: it keeps the focus and ignores picks. */
39
+ busy?: boolean;
40
+ /** `setting` is a settings row's 11rem dropdown; a `field` fills its container. */
41
+ presentation?: 'field' | 'setting';
42
+ ref?: Ref<HTMLButtonElement>;
12
43
  }
13
44
 
14
45
  interface LoadingOptionSelectProps {
@@ -18,7 +49,17 @@ interface LoadingOptionSelectProps {
18
49
 
19
50
  type OptionSelectProps<Value extends string> = LoadedOptionSelectProps<Value> | LoadingOptionSelectProps;
20
51
 
52
+ /** Marks a letter key as handled, which the Select's trigger takes as leaving its typeahead out. Space and arrows still
53
+ * open the list. */
54
+ const withoutClosedTypeahead = (event: KeyboardEvent) => {
55
+ if (event.key.length === 1 && event.key !== ' ' && !event.ctrlKey && !event.altKey && !event.metaKey)
56
+ event.preventDefault();
57
+ };
58
+
59
+ /** A Select over plain options, each with an optional icon; while they load, a control-shaped skeleton. */
21
60
  export function OptionSelect<Value extends string>(props: OptionSelectProps<Value>) {
61
+ const field = useRef<HTMLInputElement>(null);
62
+
22
63
  if (props.loading)
23
64
  return (
24
65
  <SkeletonLoader label={props.label}>
@@ -26,24 +67,68 @@ export function OptionSelect<Value extends string>(props: OptionSelectProps<Valu
26
67
  </SkeletonLoader>
27
68
  );
28
69
 
29
- const { disabled, label, onChange, options, value } = props;
30
-
31
- return (
32
- <Select
33
- aria-label={label}
34
- disabled={disabled}
35
- value={value}
36
- onValueChange={(next) => {
37
- const option = options.find((candidate) => candidate.value === next);
38
-
39
- if (option) onChange(option.value);
40
- }}
41
- >
42
- {options.map((option) => (
43
- <SelectItem key={option.value} value={option.value} disabled={option.disabled}>
44
- {option.label}
45
- </SelectItem>
46
- ))}
47
- </Select>
70
+ const {
71
+ label,
72
+ loading: _loading,
73
+ onChange,
74
+ options,
75
+ value,
76
+ none,
77
+ name,
78
+ writesOnPick,
79
+ busy = false,
80
+ presentation = 'field',
81
+ ...select
82
+ } = props;
83
+ const pick = (next: string) => {
84
+ if (busy) return;
85
+
86
+ if (none && next === NONE) {
87
+ change(() => onChange('' as Value));
88
+
89
+ return;
90
+ }
91
+
92
+ const option = options.find((candidate) => candidate.value === next);
93
+
94
+ if (option) change(() => onChange(option.value));
95
+ };
96
+ const change = (write: () => void) => {
97
+ if (!name) return write();
98
+
99
+ flushSync(write);
100
+ field.current?.dispatchEvent(new Event('input', { bubbles: true }));
101
+ };
102
+
103
+ const control = (
104
+ <>
105
+ {name && <input ref={field} type="hidden" name={name} value={value} />}
106
+ <Select
107
+ {...select}
108
+ {...(label !== undefined && { 'aria-label': label })}
109
+ {...(writesOnPick && { onKeyDown: withoutClosedTypeahead })}
110
+ {...(busy && { 'aria-disabled': true })}
111
+ value={value || (none ? NONE : '')}
112
+ onValueChange={pick}
113
+ >
114
+ {none && <SelectItem value={NONE}>{none}</SelectItem>}
115
+ {options.map((option) => (
116
+ <SelectItem
117
+ key={option.value}
118
+ value={option.value}
119
+ disabled={option.disabled}
120
+ {...(option.icon !== undefined && {
121
+ icon: option.icon,
122
+ iconHue: option.hue,
123
+ textValue: option.label,
124
+ })}
125
+ >
126
+ {option.label}
127
+ </SelectItem>
128
+ ))}
129
+ </Select>
130
+ </>
48
131
  );
132
+
133
+ return presentation === 'setting' ? <span className="block w-44 max-w-full">{control}</span> : control;
49
134
  }
@@ -28,19 +28,26 @@ export const Select = forwardRef<HTMLButtonElement, SelectProps>(
28
28
 
29
29
  Select.displayName = 'Select';
30
30
 
31
- export const SelectItem = forwardRef<HTMLDivElement, SelectItemProps>(({ icon, children, ...props }, ref) => (
32
- <NinnaSelectItem ref={ref} {...props}>
33
- {icon ? (
34
- <span className="inline-flex min-w-0 items-center gap-2 align-middle">
35
- <span aria-hidden="true" className="size-4 shrink-0 [&>svg]:size-full">
36
- {icon}
31
+ /** An option of the Select; its `icon` takes `iconHue`, a lar-brand app hue at full strength, when given. */
32
+ export const SelectItem = forwardRef<HTMLDivElement, SelectItemProps & { iconHue?: number | undefined }>(
33
+ ({ icon, iconHue, children, ...props }, ref) => (
34
+ <NinnaSelectItem ref={ref} {...props}>
35
+ {icon ? (
36
+ <span className="inline-flex min-w-0 items-center gap-2 align-middle">
37
+ <span
38
+ aria-hidden="true"
39
+ className="size-4 shrink-0 [&>svg]:size-full"
40
+ style={iconHue === undefined ? undefined : { color: `oklch(0.62 0.15 ${iconHue})` }}
41
+ >
42
+ {icon}
43
+ </span>
44
+ <span className="truncate">{children}</span>
37
45
  </span>
38
- <span className="truncate">{children}</span>
39
- </span>
40
- ) : (
41
- children
42
- )}
43
- </NinnaSelectItem>
44
- ));
46
+ ) : (
47
+ children
48
+ )}
49
+ </NinnaSelectItem>
50
+ ),
51
+ );
45
52
 
46
53
  SelectItem.displayName = 'SelectItem';
@@ -3,8 +3,22 @@ import { forwardRef } from 'react';
3
3
 
4
4
  import { tabbable } from '../foundations/KeyboardFocus';
5
5
 
6
- export const Switch = forwardRef<HTMLButtonElement, SwitchProps>((props, ref) => (
7
- <NinnaSwitch ref={ref} {...tabbable} size="sm" aria-busy={props.loading || undefined} {...props} />
6
+ type Props = SwitchProps & {
7
+ /** Busy rather than disabled while a change it started saves: it keeps the focus and ignores presses. */
8
+ busy?: boolean;
9
+ };
10
+
11
+ export const Switch = forwardRef<HTMLButtonElement, Props>(({ busy = false, onCheckedChange, ...props }, ref) => (
12
+ <NinnaSwitch
13
+ ref={ref}
14
+ {...tabbable}
15
+ size="sm"
16
+ aria-busy={props.loading || undefined}
17
+ {...props}
18
+ {...(busy && { 'aria-disabled': true })}
19
+ className={`aria-disabled:cursor-progress ${props.className ?? ''}`}
20
+ onCheckedChange={(checked) => !busy && onCheckedChange?.(checked)}
21
+ />
8
22
  ));
9
23
 
10
24
  Switch.displayName = 'Switch';
@@ -1,9 +1,23 @@
1
1
  export { Checkbox, type CheckboxProps } from './Checkbox';
2
+ export { type ColorSwatch, ColorSwatches } from './ColorSwatches';
2
3
  export { Field, type FieldProps } from './Field';
3
- export { Disclosure, FormAction, FormContent, FormField, FormRow, FormSection, FormStack } from './FormSection';
4
+ export {
5
+ Disclosure,
6
+ FormAction,
7
+ FormContent,
8
+ FormField,
9
+ FormFieldset,
10
+ FormRow,
11
+ FormSection,
12
+ FormStack,
13
+ FormUnit,
14
+ } from './FormSection';
15
+ export { HiddenField } from './HiddenField';
4
16
  export { InlineFields } from './InlineFields';
5
17
  export { Input, type InputProps } from './Input';
6
- export { OptionSelect } from './OptionSelect';
18
+ export { type LabelChoice, type LabelCreation, LabelPicker } from './LabelPicker';
19
+ export { MarkdownEditor } from './MarkdownEditor';
20
+ export { OptionSelect, type OptionSelectOption } from './OptionSelect';
7
21
  export { RadioGroup, RadioGroupItem, type RadioGroupItemProps, type RadioGroupProps } from './RadioGroup';
8
22
  export { Select, SelectItem, type SelectProps } from './Select';
9
23
  export { Switch } from './Switch';
@@ -0,0 +1,51 @@
1
+ // One observer for a page's repeating indicators (spinners, pulses, sweeps). Each keeps its phase while outside a
2
+ // scroll viewport or while the window is hidden; resuming never changes the status or restarts the animation. Use it
3
+ // as a ref callback: React 19 runs the returned cleanup when the ref detaches, including its StrictMode check.
4
+ // theme.css pauses an element marked data-ambient-motion="paused".
5
+
6
+ const indicators = new Map<Element, boolean>();
7
+ let observer: IntersectionObserver | undefined;
8
+
9
+ function update(element: Element, visible: boolean): void {
10
+ element.setAttribute('data-ambient-motion', visible && !document.hidden ? 'running' : 'paused');
11
+ }
12
+
13
+ function visibilityChanged(): void {
14
+ for (const [element, visible] of indicators) update(element, visible);
15
+ }
16
+
17
+ export function ambientMotion(element: Element | null): (() => void) | undefined {
18
+ if (!element) return;
19
+
20
+ if (!indicators.size) document.addEventListener('visibilitychange', visibilityChanged);
21
+
22
+ // Without IntersectionObserver, visibility changes still pause indicators in a hidden window.
23
+ const visible = typeof IntersectionObserver === 'undefined';
24
+
25
+ indicators.set(element, visible);
26
+ update(element, visible);
27
+
28
+ if (!visible) {
29
+ observer ??= new IntersectionObserver((entries) => {
30
+ for (const { target, isIntersecting } of entries) {
31
+ if (!indicators.has(target)) continue;
32
+
33
+ indicators.set(target, isIntersecting);
34
+ update(target, isIntersecting);
35
+ }
36
+ });
37
+ observer.observe(element);
38
+ }
39
+
40
+ return () => {
41
+ observer?.unobserve(element);
42
+ indicators.delete(element);
43
+ element.removeAttribute('data-ambient-motion');
44
+
45
+ if (!indicators.size) {
46
+ observer?.disconnect();
47
+ observer = undefined;
48
+ document.removeEventListener('visibilitychange', visibilityChanged);
49
+ }
50
+ };
51
+ }
@@ -29,6 +29,23 @@ export const defaultDesignSystemLabels = {
29
29
  light: 'Light',
30
30
  dark: 'Dark',
31
31
  },
32
+ editor: {
33
+ formatting: 'Formatting',
34
+ bold: 'Bold',
35
+ italic: 'Italic',
36
+ heading: 'Heading',
37
+ bulletedList: 'Bulleted list',
38
+ numberedList: 'Numbered list',
39
+ link: 'Link',
40
+ linkUrl: 'Link URL',
41
+ linkPlaceholder: 'https://…',
42
+ apply: 'Apply',
43
+ markdown: 'Markdown',
44
+ },
45
+ dialog: {
46
+ expand: 'Expand',
47
+ restoreSize: 'Restore size',
48
+ },
32
49
  };
33
50
 
34
51
  export type DesignSystemLabels = typeof defaultDesignSystemLabels;
@@ -71,6 +88,8 @@ function mergeLabels(labels: DesignSystemLabelOverrides | undefined): DesignSyst
71
88
  ...labels,
72
89
  folders: { ...defaultDesignSystemLabels.folders, ...labels.folders },
73
90
  theme: { ...defaultDesignSystemLabels.theme, ...labels.theme },
91
+ editor: { ...defaultDesignSystemLabels.editor, ...labels.editor },
92
+ dialog: { ...defaultDesignSystemLabels.dialog, ...labels.dialog },
74
93
  };
75
94
  }
76
95
 
@@ -5,6 +5,7 @@ export {
5
5
  DesignSystemProvider,
6
6
  useDesignSystemLabels,
7
7
  } from './DesignSystemProvider';
8
+ export { ambientMotion } from './AmbientMotion';
8
9
  export { tabbable } from './KeyboardFocus';
9
10
  export { applePlatform, isShortcut } from './KeyboardShortcut';
10
11
  export { createThemeController, isThemePreference, type ThemeController, type ThemePreference } from './Theme';
@@ -334,6 +334,64 @@ body {
334
334
  background: var(--color-base-300);
335
335
  }
336
336
 
337
+ /* Notifications' stack presentation: every notification, oldest above the newest, in the bottom right corner with the
338
+ same gap from the window's bottom and right edges, and from the title bar (h-13) when it's full, above every dialog
339
+ (z-50) and full-screen cover (z-60). Each carries its slice of the stack's edge fade (Notifications.tsx), off while
340
+ one has keyboard focus, as in a Modal's body. Successes and failures are tinted. */
341
+ .notification-stack {
342
+ --notice-edge: calc(var(--spacing) * 4);
343
+ right: var(--notice-edge);
344
+ bottom: var(--notice-edge);
345
+ z-index: 100;
346
+ flex-direction: column;
347
+ width: min(calc(var(--spacing) * 104), calc(100vw - var(--spacing) * 8));
348
+ max-width: none;
349
+ max-height: calc(100dvh - var(--spacing) * 13 - var(--notice-edge) * 2);
350
+ overflow-y: auto;
351
+ overscroll-behavior: contain;
352
+ pointer-events: auto;
353
+ -webkit-app-region: no-drag;
354
+ }
355
+
356
+ .notification-stack:empty {
357
+ pointer-events: none;
358
+ }
359
+
360
+ .notification-stack [data-slot='toast'] {
361
+ flex-shrink: 0;
362
+ overflow-wrap: anywhere;
363
+ }
364
+
365
+ .notification-stack > [data-slot='toast'] {
366
+ mask-image: linear-gradient(
367
+ to bottom,
368
+ transparent var(--fade-from, 0%),
369
+ black var(--fade-top, 0%),
370
+ black var(--fade-bottom, 100%),
371
+ transparent var(--fade-to, 100%)
372
+ );
373
+ }
374
+
375
+ .notification-stack:has(:focus-visible) > [data-slot='toast'] {
376
+ mask-image: none;
377
+ }
378
+
379
+ .notification-stack [data-slot='content'] {
380
+ min-width: 0;
381
+ }
382
+
383
+ .notification-stack [data-slot='toast'][data-toast-color='warning'] {
384
+ @apply bg-warning/10 border-warning/20 text-(--lar-warning-text);
385
+ }
386
+
387
+ .notification-stack [data-slot='toast'][data-toast-color='success'] {
388
+ @apply bg-success/10 border-success/20 text-(--lar-success-text);
389
+ }
390
+
391
+ .notification-stack [data-slot='toast'][data-toast-color='danger'] {
392
+ @apply bg-danger/10 border-danger/20 text-(--lar-danger-text);
393
+ }
394
+
337
395
  [data-slot='tooltip-content'] {
338
396
  @apply glass-menu;
339
397
  max-width: min(var(--radix-tooltip-content-available-width), var(--container-xs));
@@ -398,6 +456,12 @@ body {
398
456
  }
399
457
  }
400
458
 
459
+ /* A repeating indicator that ambientMotion (AmbientMotion.ts) finds out of view or in a hidden window. Dialogs,
460
+ loading entrances and interaction transitions keep their timing, as only repeating indicators opt in. */
461
+ [data-ambient-motion='paused'] {
462
+ animation-play-state: paused;
463
+ }
464
+
401
465
  .lar-progress-indeterminate {
402
466
  width: 35%;
403
467
  animation: lar-progress-travel 1.8s ease-in-out infinite alternate;
@@ -1,8 +1,17 @@
1
- /** Brand marks, which lucide does not draw. */
2
- export function GitHubIcon() {
1
+ /** Brand marks, which lucide does not draw. Each takes a `className` for its size, as a lucide icon does. */
2
+ export function GitHubIcon({ className }: { className?: string }) {
3
3
  return (
4
- <svg viewBox="0 0 16 16" fill="currentColor" aria-hidden="true">
4
+ <svg viewBox="0 0 16 16" fill="currentColor" aria-hidden="true" className={className}>
5
5
  <path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8Z" />
6
6
  </svg>
7
7
  );
8
8
  }
9
+
10
+ /** Azure DevOps' mark. */
11
+ export function AzureDevOpsIcon({ className }: { className?: string }) {
12
+ return (
13
+ <svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" className={className}>
14
+ <path d="M0 8.899l2.247-2.966 8.405-3.416V.045l7.37 5.393L2.966 8.36v8.2L0 15.685zm24-4.45v14.652L18.247 24l-9.303-3.237v3.237l-5.978-7.44 15.056 1.79V5.438z" />
15
+ </svg>
16
+ );
17
+ }
@@ -0,0 +1,4 @@
1
+ // lucide's DynamicIcon, which draws an icon by its kebab-case name, such as one a person chose in another app. Its name
2
+ // map and each icon are lazy chunks, so this has an entry of its own (`@lar-works/design-system/icons/dynamic`), which
3
+ // apps load with a dynamic import where they need it.
4
+ export { DynamicIcon, type IconName } from 'lucide-react/dynamic';
@@ -1,4 +1,4 @@
1
1
  // Every icon comes from lucide (https://lucide.dev/icons), under lucide's `…Icon` names, plus the brand marks
2
2
  // lucide does not draw. Apps import icons from `@lar-works/design-system/icons`, never from lucide-react.
3
- export { GitHubIcon } from './BrandIcons';
3
+ export { AzureDevOpsIcon, GitHubIcon } from './BrandIcons';
4
4
  export * from 'lucide-react';
package/src/index.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  // The design system's public API. Icons have their own entry (`@lar-works/design-system/icons`), and styles are
2
- // imported once by each app (`@import '@lar-works/design-system/styles.css'`).
2
+ // imported once by each app (`@import '@lar-works/design-system/styles.css'`, or showcase.css or board.css).
3
3
  export * from './actions';
4
+ export * from './board';
4
5
  export * from './collections';
5
6
  export * from './display';
6
7
  export * from './feedback';
@@ -7,7 +7,7 @@ export { Section } from './Section';
7
7
  export { SidebarNavigationItem } from './sidebar/SidebarNavigationItem';
8
8
  export { SidebarNavigationGroup, SidebarPane } from './sidebar/SidebarPane';
9
9
  export { TitleBar, TitleBarTrail, type TitleBarTrailItem } from './TitleBar';
10
- export { CommandPaletteTrigger } from './toolbar/CommandPaletteTrigger';
10
+ export { CommandPaletteTrigger, type CommandPaletteTriggerToken } from './toolbar/CommandPaletteTrigger';
11
11
  export { ToolbarStatusGroup } from './toolbar/ToolbarStatusGroup';
12
12
  export { ToolbarStatusItem } from './toolbar/ToolbarStatusItem';
13
13
  export { WorkspaceActionsHeader } from './WorkspaceActionsHeader';