@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
@@ -0,0 +1,82 @@
1
+ import { ReactNode, Ref } from "react";
2
+ /** The title bar's Add item button, a Main action named by its `label`, which folds away, for screen readers only, on a
3
+ * title bar under 70rem; `title` gives it whole with its shortcut, which `keyShortcuts` names. */
4
+ export declare function AddItemButton({ label, title, keyShortcuts, onOpen }: {
5
+ label: string;
6
+ title: string;
7
+ keyShortcuts?: string;
8
+ onOpen: () => void;
9
+ }): import("react").JSX.Element;
10
+ /**
11
+ * A draft's fields as one group, which `disabled` locks: the `main` column (its title, editor and notes) beside the
12
+ * `details` panel, which `detailsLabel` names. Narrower than 40rem the panel stacks under the main column, which then
13
+ * grows with its text, and the two scroll as one; each row sizes to its content, so a long text pushes the panel down
14
+ * rather than running under it.
15
+ */
16
+ export declare function DraftFields({ id, disabled, detailsLabel, main, details }: {
17
+ id: string;
18
+ disabled: boolean;
19
+ detailsLabel: string;
20
+ main: ReactNode;
21
+ details: ReactNode;
22
+ }): import("react").JSX.Element;
23
+ /**
24
+ * A field of a details panel under its small uppercase `heading`, which labels the field `htmlFor` names; without
25
+ * `htmlFor`, the field is a group of controls that the heading names, such as a ticket's labels (`id` and `ref` reach
26
+ * the group).
27
+ */
28
+ export declare function PanelField({ heading, htmlFor, id, ref, children }: {
29
+ heading: string;
30
+ htmlFor?: string;
31
+ id?: string;
32
+ ref?: Ref<HTMLDivElement>;
33
+ children: ReactNode;
34
+ }): import("react").JSX.Element;
35
+ /** The details panel's ticket part, ruled off from the fields above it: a ticket's own fields, or what a draft without
36
+ * one keeps. */
37
+ export declare function DraftTicketPart({ children }: {
38
+ children: ReactNode;
39
+ }): import("react").JSX.Element;
40
+ /** Create issue in the footer: its `checkbox`, then the `reason` it can't be ticked, kept to a readable width, and any
41
+ * `error`. */
42
+ export declare function CreateIssueChoice({ checkbox, reason, error }: {
43
+ checkbox: ReactNode;
44
+ reason?: ReactNode;
45
+ error?: ReactNode;
46
+ }): import("react").JSX.Element;
47
+ /** The Find a ticket pane, ruled off from the header: its notes and fields, one under the other, scrolling above the
48
+ * footer when a long result list needs it. */
49
+ export declare function TicketSearchPane({ id, children }: {
50
+ id: string;
51
+ children: ReactNode;
52
+ }): import("react").JSX.Element;
53
+ /** A ticket a search found: its number, its title and a short `note`, such as that it is on the board already. */
54
+ export interface TicketSearchMatch {
55
+ number: number;
56
+ title: string;
57
+ note?: string | undefined;
58
+ }
59
+ /**
60
+ * A search of a tracker's open tickets: the field (`fieldLabel` names it) with its Search button, which Enter also
61
+ * runs, the matches, each a button that picks it, and the search's `result`, announced. `id` prefixes the field's,
62
+ * the button's and the result's ids. `busy` stops a pick while a search or a pick runs, and `picking` marks the list
63
+ * as busy.
64
+ */
65
+ export declare function TicketSearch({ id, query, onQueryChange, onSearch, fieldLabel, placeholder, searchLabel, disabled, searchDisabled, tickets, listLabel, busy, picking, onPick, result }: {
66
+ id: string;
67
+ query: string;
68
+ onQueryChange: (query: string) => void;
69
+ onSearch: () => void;
70
+ fieldLabel: string;
71
+ placeholder: string;
72
+ searchLabel: string;
73
+ disabled?: boolean | undefined;
74
+ searchDisabled?: boolean;
75
+ tickets: readonly TicketSearchMatch[];
76
+ listLabel: string;
77
+ busy?: boolean;
78
+ picking?: boolean;
79
+ onPick: (number: number) => void;
80
+ result: string;
81
+ }): import("react").JSX.Element;
82
+ //# sourceMappingURL=AddItem.d.ts.map
@@ -0,0 +1,185 @@
1
+ import { Button } from "../actions/Button.js";
2
+ import { FormResult } from "../feedback/FormResult.js";
3
+ import { FormFieldset } from "../forms/FormSection.js";
4
+ import { Input } from "../forms/Input.js";
5
+ import { tabbable } from "../foundations/KeyboardFocus.js";
6
+ import { buttonKind } from "./ButtonKinds.js";
7
+ import { DetailsHeading } from "./ItemDetails.js";
8
+ import { SquarePenIcon } from "lucide-react";
9
+ import { jsx, jsxs } from "react/jsx-runtime";
10
+ // src/board/AddItem.tsx
11
+ /** The title bar's Add item button, a Main action named by its `label`, which folds away, for screen readers only, on a
12
+ * title bar under 70rem; `title` gives it whole with its shortcut, which `keyShortcuts` names. */
13
+ function AddItemButton({ label, title, keyShortcuts, onOpen }) {
14
+ return /* @__PURE__ */ jsx(Button, {
15
+ ...buttonKind("main"),
16
+ className: "add-item px-2",
17
+ leftIcon: /* @__PURE__ */ jsx(SquarePenIcon, {}),
18
+ title,
19
+ "aria-keyshortcuts": keyShortcuts,
20
+ onClick: onOpen,
21
+ children: /* @__PURE__ */ jsx("span", {
22
+ className: "@max-[70rem]:sr-only",
23
+ children: label
24
+ })
25
+ });
26
+ }
27
+ /**
28
+ * A draft's fields as one group, which `disabled` locks: the `main` column (its title, editor and notes) beside the
29
+ * `details` panel, which `detailsLabel` names. Narrower than 40rem the panel stacks under the main column, which then
30
+ * grows with its text, and the two scroll as one; each row sizes to its content, so a long text pushes the panel down
31
+ * rather than running under it.
32
+ */
33
+ function DraftFields({ id, disabled, detailsLabel, main, details }) {
34
+ return /* @__PURE__ */ jsx("div", {
35
+ className: "@container flex min-h-0 flex-1 flex-col",
36
+ children: /* @__PURE__ */ jsxs(FormFieldset, {
37
+ id,
38
+ presentation: "group",
39
+ disabled,
40
+ className: "border-base-300 grid min-h-0 flex-1 grid-cols-[minmax(0,1fr)_16rem] border-t @max-[40rem]:auto-rows-max @max-[40rem]:grid-cols-[minmax(0,1fr)] @max-[40rem]:content-start @max-[40rem]:overflow-y-auto",
41
+ children: [/* @__PURE__ */ jsx("div", {
42
+ className: "flex min-h-0 flex-col gap-3 overflow-y-auto px-5 pt-4 pb-5 sm:px-6 @max-[40rem]:min-h-80 @max-[40rem]:overflow-visible",
43
+ children: main
44
+ }), /* @__PURE__ */ jsx("aside", {
45
+ "aria-label": detailsLabel,
46
+ className: "border-base-300 bg-base-50/60 grid content-start gap-5 overflow-y-auto border-l px-4 py-4 @max-[40rem]:overflow-visible @max-[40rem]:border-t @max-[40rem]:border-l-0",
47
+ children: details
48
+ })]
49
+ })
50
+ });
51
+ }
52
+ /**
53
+ * A field of a details panel under its small uppercase `heading`, which labels the field `htmlFor` names; without
54
+ * `htmlFor`, the field is a group of controls that the heading names, such as a ticket's labels (`id` and `ref` reach
55
+ * the group).
56
+ */
57
+ function PanelField({ heading, htmlFor, id, ref, children }) {
58
+ if (htmlFor) return /* @__PURE__ */ jsxs("div", {
59
+ className: "grid gap-1.5",
60
+ children: [/* @__PURE__ */ jsx(DetailsHeading, {
61
+ presentation: "label",
62
+ as: "label",
63
+ htmlFor,
64
+ children: heading
65
+ }), children]
66
+ });
67
+ return /* @__PURE__ */ jsxs("div", {
68
+ ref,
69
+ id,
70
+ role: "group",
71
+ "aria-label": heading,
72
+ className: "grid gap-1.5",
73
+ children: [/* @__PURE__ */ jsx(DetailsHeading, {
74
+ presentation: "label",
75
+ as: "span",
76
+ children: heading
77
+ }), children]
78
+ });
79
+ }
80
+ /** The details panel's ticket part, ruled off from the fields above it: a ticket's own fields, or what a draft without
81
+ * one keeps. */
82
+ function DraftTicketPart({ children }) {
83
+ return /* @__PURE__ */ jsx("div", {
84
+ className: "border-base-300 grid gap-3 border-t pt-4",
85
+ children
86
+ });
87
+ }
88
+ /** Create issue in the footer: its `checkbox`, then the `reason` it can't be ticked, kept to a readable width, and any
89
+ * `error`. */
90
+ function CreateIssueChoice({ checkbox, reason, error }) {
91
+ return /* @__PURE__ */ jsxs("div", {
92
+ className: "grid gap-1",
93
+ children: [
94
+ checkbox,
95
+ reason && /* @__PURE__ */ jsx("div", {
96
+ className: "max-w-md",
97
+ children: reason
98
+ }),
99
+ error
100
+ ]
101
+ });
102
+ }
103
+ /** The Find a ticket pane, ruled off from the header: its notes and fields, one under the other, scrolling above the
104
+ * footer when a long result list needs it. */
105
+ function TicketSearchPane({ id, children }) {
106
+ return /* @__PURE__ */ jsx("div", {
107
+ id,
108
+ className: "border-base-300 grid min-h-0 content-start gap-4 overflow-y-auto border-t px-5 pt-4 pb-5 sm:px-6",
109
+ children
110
+ });
111
+ }
112
+ /**
113
+ * A search of a tracker's open tickets: the field (`fieldLabel` names it) with its Search button, which Enter also
114
+ * runs, the matches, each a button that picks it, and the search's `result`, announced. `id` prefixes the field's,
115
+ * the button's and the result's ids. `busy` stops a pick while a search or a pick runs, and `picking` marks the list
116
+ * as busy.
117
+ */
118
+ function TicketSearch({ id, query, onQueryChange, onSearch, fieldLabel, placeholder, searchLabel, disabled = false, searchDisabled = false, tickets, listLabel, busy = false, picking = false, onPick, result }) {
119
+ const onKey = (event) => {
120
+ if (event.key !== "Enter") return;
121
+ event.preventDefault();
122
+ onSearch();
123
+ };
124
+ return /* @__PURE__ */ jsxs("div", {
125
+ className: "grid gap-2",
126
+ "data-ticket-picker": true,
127
+ children: [
128
+ /* @__PURE__ */ jsxs("div", {
129
+ className: "flex gap-2",
130
+ children: [/* @__PURE__ */ jsx(Input, {
131
+ id: `${id}-query`,
132
+ type: "search",
133
+ value: query,
134
+ onChange: (event) => onQueryChange(event.currentTarget.value),
135
+ onKeyDown: onKey,
136
+ disabled,
137
+ autoComplete: "off",
138
+ "aria-label": fieldLabel,
139
+ placeholder,
140
+ className: "min-w-0 flex-1"
141
+ }), /* @__PURE__ */ jsx(Button, {
142
+ ...buttonKind("other"),
143
+ id: `${id}-search`,
144
+ disabled: searchDisabled,
145
+ onClick: onSearch,
146
+ children: searchLabel
147
+ })]
148
+ }),
149
+ tickets.length > 0 && /* @__PURE__ */ jsx("ul", {
150
+ className: "m-0 grid list-none gap-0.5 p-0",
151
+ "aria-label": listLabel,
152
+ "aria-busy": picking,
153
+ children: tickets.map((ticket) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs("button", {
154
+ ...tabbable,
155
+ type: "button",
156
+ "data-ticket": ticket.number,
157
+ disabled: busy,
158
+ onClick: () => onPick(ticket.number),
159
+ className: "hover:bg-base-200/70 focus-visible:outline-primary flex w-full min-w-0 items-baseline gap-2 rounded-md px-2 py-1.5 text-left text-sm focus-visible:outline-2 disabled:opacity-60",
160
+ children: [
161
+ /* @__PURE__ */ jsxs("span", {
162
+ className: "shrink-0 text-(--muted-foreground) tabular-nums",
163
+ children: ["#", ticket.number]
164
+ }),
165
+ /* @__PURE__ */ jsx("span", {
166
+ className: "min-w-0 flex-1 truncate",
167
+ children: ticket.title
168
+ }),
169
+ ticket.note && /* @__PURE__ */ jsx("span", {
170
+ className: "shrink-0 text-xs text-(--muted-foreground)",
171
+ children: ticket.note
172
+ })
173
+ ]
174
+ }) }, ticket.number))
175
+ }),
176
+ /* @__PURE__ */ jsx(FormResult, {
177
+ id: `${id}-result`,
178
+ text: result
179
+ })
180
+ ]
181
+ });
182
+ }
183
+ export { AddItemButton, CreateIssueChoice, DraftFields, DraftTicketPart, PanelField, TicketSearch, TicketSearchPane };
184
+
185
+ //# sourceMappingURL=AddItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AddItem.js","names":[],"sources":["../../src/board/AddItem.tsx"],"sourcesContent":["// Lar Factory's Add item: the title bar's button that opens it, the New work pane's fields beside their details panel,\n// the panel's labelled fields and ticket part, the Create issue choice, and the Find a ticket pane with its search.\n\nimport { SquarePenIcon } from 'lucide-react';\nimport type { KeyboardEvent, ReactNode, Ref } from 'react';\n\nimport { Button } from '../actions/Button';\nimport { FormResult } from '../feedback/FormResult';\nimport { FormFieldset } from '../forms/FormSection';\nimport { Input } from '../forms/Input';\nimport { tabbable } from '../foundations/KeyboardFocus';\nimport { buttonKind } from './ButtonKinds';\nimport { DetailsHeading } from './ItemDetails';\n\n/** The title bar's Add item button, a Main action named by its `label`, which folds away, for screen readers only, on a\n * title bar under 70rem; `title` gives it whole with its shortcut, which `keyShortcuts` names. */\nexport function AddItemButton({\n label,\n title,\n keyShortcuts,\n onOpen,\n}: {\n label: string;\n title: string;\n keyShortcuts?: string;\n onOpen: () => void;\n}) {\n return (\n <Button\n {...buttonKind('main')}\n className=\"add-item px-2\"\n leftIcon={<SquarePenIcon />}\n title={title}\n aria-keyshortcuts={keyShortcuts}\n onClick={onOpen}\n >\n <span className=\"@max-[70rem]:sr-only\">{label}</span>\n </Button>\n );\n}\n\n/**\n * A draft's fields as one group, which `disabled` locks: the `main` column (its title, editor and notes) beside the\n * `details` panel, which `detailsLabel` names. Narrower than 40rem the panel stacks under the main column, which then\n * grows with its text, and the two scroll as one; each row sizes to its content, so a long text pushes the panel down\n * rather than running under it.\n */\nexport function DraftFields({\n id,\n disabled,\n detailsLabel,\n main,\n details,\n}: {\n id: string;\n disabled: boolean;\n detailsLabel: string;\n main: ReactNode;\n details: ReactNode;\n}) {\n return (\n <div className=\"@container flex min-h-0 flex-1 flex-col\">\n <FormFieldset\n id={id}\n presentation=\"group\"\n disabled={disabled}\n className=\"border-base-300 grid min-h-0 flex-1 grid-cols-[minmax(0,1fr)_16rem] border-t @max-[40rem]:auto-rows-max @max-[40rem]:grid-cols-[minmax(0,1fr)] @max-[40rem]:content-start @max-[40rem]:overflow-y-auto\"\n >\n <div className=\"flex min-h-0 flex-col gap-3 overflow-y-auto px-5 pt-4 pb-5 sm:px-6 @max-[40rem]:min-h-80 @max-[40rem]:overflow-visible\">\n {main}\n </div>\n <aside\n aria-label={detailsLabel}\n className=\"border-base-300 bg-base-50/60 grid content-start gap-5 overflow-y-auto border-l px-4 py-4 @max-[40rem]:overflow-visible @max-[40rem]:border-t @max-[40rem]:border-l-0\"\n >\n {details}\n </aside>\n </FormFieldset>\n </div>\n );\n}\n\n/**\n * A field of a details panel under its small uppercase `heading`, which labels the field `htmlFor` names; without\n * `htmlFor`, the field is a group of controls that the heading names, such as a ticket's labels (`id` and `ref` reach\n * the group).\n */\nexport function PanelField({\n heading,\n htmlFor,\n id,\n ref,\n children,\n}: {\n heading: string;\n htmlFor?: string;\n id?: string;\n ref?: Ref<HTMLDivElement>;\n children: ReactNode;\n}) {\n if (htmlFor)\n return (\n <div className=\"grid gap-1.5\">\n <DetailsHeading presentation=\"label\" as=\"label\" htmlFor={htmlFor}>\n {heading}\n </DetailsHeading>\n {children}\n </div>\n );\n\n return (\n <div ref={ref} id={id} role=\"group\" aria-label={heading} className=\"grid gap-1.5\">\n <DetailsHeading presentation=\"label\" as=\"span\">\n {heading}\n </DetailsHeading>\n {children}\n </div>\n );\n}\n\n/** The details panel's ticket part, ruled off from the fields above it: a ticket's own fields, or what a draft without\n * one keeps. */\nexport function DraftTicketPart({ children }: { children: ReactNode }) {\n return <div className=\"border-base-300 grid gap-3 border-t pt-4\">{children}</div>;\n}\n\n/** Create issue in the footer: its `checkbox`, then the `reason` it can't be ticked, kept to a readable width, and any\n * `error`. */\nexport function CreateIssueChoice({\n checkbox,\n reason,\n error,\n}: {\n checkbox: ReactNode;\n reason?: ReactNode;\n error?: ReactNode;\n}) {\n return (\n <div className=\"grid gap-1\">\n {checkbox}\n {reason && <div className=\"max-w-md\">{reason}</div>}\n {error}\n </div>\n );\n}\n\n/** The Find a ticket pane, ruled off from the header: its notes and fields, one under the other, scrolling above the\n * footer when a long result list needs it. */\nexport function TicketSearchPane({ id, children }: { id: string; children: ReactNode }) {\n return (\n <div\n id={id}\n className=\"border-base-300 grid min-h-0 content-start gap-4 overflow-y-auto border-t px-5 pt-4 pb-5 sm:px-6\"\n >\n {children}\n </div>\n );\n}\n\n/** A ticket a search found: its number, its title and a short `note`, such as that it is on the board already. */\nexport interface TicketSearchMatch {\n number: number;\n title: string;\n note?: string | undefined;\n}\n\n/**\n * A search of a tracker's open tickets: the field (`fieldLabel` names it) with its Search button, which Enter also\n * runs, the matches, each a button that picks it, and the search's `result`, announced. `id` prefixes the field's,\n * the button's and the result's ids. `busy` stops a pick while a search or a pick runs, and `picking` marks the list\n * as busy.\n */\nexport function TicketSearch({\n id,\n query,\n onQueryChange,\n onSearch,\n fieldLabel,\n placeholder,\n searchLabel,\n disabled = false,\n searchDisabled = false,\n tickets,\n listLabel,\n busy = false,\n picking = false,\n onPick,\n result,\n}: {\n id: string;\n query: string;\n onQueryChange: (query: string) => void;\n onSearch: () => void;\n fieldLabel: string;\n placeholder: string;\n searchLabel: string;\n disabled?: boolean | undefined;\n searchDisabled?: boolean;\n tickets: readonly TicketSearchMatch[];\n listLabel: string;\n busy?: boolean;\n picking?: boolean;\n onPick: (number: number) => void;\n result: string;\n}) {\n const onKey = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key !== 'Enter') return;\n\n event.preventDefault();\n onSearch();\n };\n\n return (\n <div className=\"grid gap-2\" data-ticket-picker>\n <div className=\"flex gap-2\">\n <Input\n id={`${id}-query`}\n type=\"search\"\n value={query}\n onChange={(event) => onQueryChange(event.currentTarget.value)}\n onKeyDown={onKey}\n disabled={disabled}\n autoComplete=\"off\"\n aria-label={fieldLabel}\n placeholder={placeholder}\n className=\"min-w-0 flex-1\"\n />\n <Button {...buttonKind('other')} id={`${id}-search`} disabled={searchDisabled} onClick={onSearch}>\n {searchLabel}\n </Button>\n </div>\n {tickets.length > 0 && (\n <ul className=\"m-0 grid list-none gap-0.5 p-0\" aria-label={listLabel} aria-busy={picking}>\n {tickets.map((ticket) => (\n <li key={ticket.number}>\n <button\n {...tabbable}\n type=\"button\"\n data-ticket={ticket.number}\n disabled={busy}\n onClick={() => onPick(ticket.number)}\n className=\"hover:bg-base-200/70 focus-visible:outline-primary flex w-full min-w-0 items-baseline gap-2 rounded-md px-2 py-1.5 text-left text-sm focus-visible:outline-2 disabled:opacity-60\"\n >\n <span className=\"shrink-0 text-(--muted-foreground) tabular-nums\">\n #{ticket.number}\n </span>\n <span className=\"min-w-0 flex-1 truncate\">{ticket.title}</span>\n {ticket.note && (\n <span className=\"shrink-0 text-xs text-(--muted-foreground)\">{ticket.note}</span>\n )}\n </button>\n </li>\n ))}\n </ul>\n )}\n <FormResult id={`${id}-result`} text={result} />\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAgBA,SAAgB,cAAc,EAC1B,OACA,OACA,cACA,UAMD;CACC,OACI,oBAAC,QAAD;EACI,GAAI,WAAW,MAAM;EACrB,WAAU;EACV,UAAU,oBAAC,eAAD,CAAgB,CAAA;EACnB;EACP,qBAAmB;EACnB,SAAS;EAET,UAAA,oBAAC,QAAD;GAAM,WAAU;GAAwB,UAAA;EAAY,CAAA;CAChD,CAAA;AAEhB;;;;;;;AAQA,SAAgB,YAAY,EACxB,IACA,UACA,cACA,MACA,WAOD;CACC,OACI,oBAAC,OAAD;EAAK,WAAU;EACX,UAAA,qBAAC,cAAD;GACQ;GACJ,cAAa;GACH;GACV,WAAU;GAJd,UAAA,CAMI,oBAAC,OAAD;IAAK,WAAU;IACV,UAAA;GACA,CAAA,GACL,oBAAC,SAAD;IACI,cAAY;IACZ,WAAU;IAET,UAAA;GACE,CAAA,CACG;;CACb,CAAA;AAEb;;;;;;AAOA,SAAgB,WAAW,EACvB,SACA,SACA,IACA,KACA,YAOD;CACC,IAAI,SACA,OACI,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACI,oBAAC,gBAAD;GAAgB,cAAa;GAAQ,IAAG;GAAiB;GACpD,UAAA;EACW,CAAA,GACf,QACA;;CAGb,OACI,qBAAC,OAAD;EAAU;EAAS;EAAI,MAAK;EAAQ,cAAY;EAAS,WAAU;EAAnE,UAAA,CACI,oBAAC,gBAAD;GAAgB,cAAa;GAAQ,IAAG;GACnC,UAAA;EACW,CAAA,GACf,QACA;;AAEb;;;AAIA,SAAgB,gBAAgB,EAAE,YAAqC;CACnE,OAAO,oBAAC,OAAD;EAAK,WAAU;EAA4C;CAAc,CAAA;AACpF;;;AAIA,SAAgB,kBAAkB,EAC9B,UACA,QACA,SAKD;CACC,OACI,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACK;GACA,UAAU,oBAAC,OAAD;IAAK,WAAU;IAAY,UAAA;GAAY,CAAA;GACjD;EACA;;AAEb;;;AAIA,SAAgB,iBAAiB,EAAE,IAAI,YAAiD;CACpF,OACI,oBAAC,OAAD;EACQ;EACJ,WAAU;EAET;CACA,CAAA;AAEb;;;;;;;AAeA,SAAgB,aAAa,EACzB,IACA,OACA,eACA,UACA,YACA,aACA,aACA,WAAW,OACX,iBAAiB,OACjB,SACA,WACA,OAAO,OACP,UAAU,OACV,QACA,UAiBD;CACC,MAAM,SAAS,UAA2C;EACtD,IAAI,MAAM,QAAQ,SAAS;EAE3B,MAAM,eAAe;EACrB,SAAS;CACb;CAEA,OACI,qBAAC,OAAD;EAAK,WAAU;EAAa,sBAAA;EAA5B,UAAA;GACI,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACI,oBAAC,OAAD;KACI,IAAI,GAAG,GAAG;KACV,MAAK;KACL,OAAO;KACP,WAAW,UAAU,cAAc,MAAM,cAAc,KAAK;KAC5D,WAAW;KACD;KACV,cAAa;KACb,cAAY;KACC;KACb,WAAU;IACb,CAAA,GACD,oBAAC,QAAD;KAAQ,GAAI,WAAW,OAAO;KAAG,IAAI,GAAG,GAAG;KAAU,UAAU;KAAgB,SAAS;KACnF,UAAA;IACG,CAAA,CACP;;GACJ,QAAQ,SAAS,KACd,oBAAC,MAAD;IAAI,WAAU;IAAiC,cAAY;IAAW,aAAW;IAC5E,UAAA,QAAQ,KAAK,WACV,oBAAC,MAAD,EAAA,UACI,qBAAC,UAAD;KACI,GAAI;KACJ,MAAK;KACL,eAAa,OAAO;KACpB,UAAU;KACV,eAAe,OAAO,OAAO,MAAM;KACnC,WAAU;KANd,UAAA;MAQI,qBAAC,QAAD;OAAM,WAAU;OAAhB,UAAA,CAAkE,KAC5D,OAAO,MACP;;MACN,oBAAC,QAAD;OAAM,WAAU;OAA2B,UAAA,OAAO;MAAY,CAAA;MAC7D,OAAO,QACJ,oBAAC,QAAD;OAAM,WAAU;OAA8C,UAAA,OAAO;MAAW,CAAA;KAEhF;IACR,CAAA,EAAA,GAjBK,OAAO,MAiBZ,CACP;GACD,CAAA;GAER,oBAAC,YAAD;IAAY,IAAI,GAAG,GAAG;IAAU,MAAM;GAAS,CAAA;EAC9C;;AAEb"}
@@ -0,0 +1,21 @@
1
+ import { ReactNode } from "react";
2
+ /** A row's actions at its right, with what they last did and an error under them. */
3
+ export declare function ActionStack({ children, below, error }: {
4
+ children: ReactNode;
5
+ below?: ReactNode;
6
+ error?: string | null;
7
+ }): import("react").JSX.Element;
8
+ /** A setting's confirmation, inline under it, before it saves: what it would do now, the work it names, and the
9
+ * buttons that cancel or go ahead. */
10
+ export declare function SettingConfirm({ label, message, items, actions }: {
11
+ label: string;
12
+ message: string;
13
+ items: readonly string[];
14
+ actions: ReactNode;
15
+ }): import("react").JSX.Element;
16
+ /** What a setting's last run did, and each thing it kept with why. */
17
+ export declare function SettingLastRun({ summary, kept }: {
18
+ summary: string;
19
+ kept: readonly string[];
20
+ }): import("react").JSX.Element;
21
+ //# sourceMappingURL=Archive.d.ts.map
@@ -0,0 +1,63 @@
1
+ import { Text } from "../typography/Typography.js";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ // src/board/Archive.tsx
4
+ /** A row's actions at its right, with what they last did and an error under them. */
5
+ function ActionStack({ children, below, error }) {
6
+ return /* @__PURE__ */ jsxs("span", {
7
+ className: "flex flex-col items-end gap-1",
8
+ children: [
9
+ /* @__PURE__ */ jsx("span", {
10
+ className: "flex flex-wrap items-center gap-2",
11
+ children
12
+ }),
13
+ below,
14
+ error && /* @__PURE__ */ jsx(Text, {
15
+ variant: "caption",
16
+ tone: "danger",
17
+ role: "alert",
18
+ children: error
19
+ })
20
+ ]
21
+ });
22
+ }
23
+ /** A setting's confirmation, inline under it, before it saves: what it would do now, the work it names, and the
24
+ * buttons that cancel or go ahead. */
25
+ function SettingConfirm({ label, message, items, actions }) {
26
+ return /* @__PURE__ */ jsxs("div", {
27
+ className: "grid gap-2 rounded-lg border border-(--border) p-3 text-sm",
28
+ role: "alertdialog",
29
+ "aria-label": label,
30
+ "data-delete-confirm": true,
31
+ children: [
32
+ /* @__PURE__ */ jsx("p", {
33
+ className: "m-0",
34
+ children: message
35
+ }),
36
+ items.length > 0 && /* @__PURE__ */ jsx("ul", {
37
+ className: "m-0 grid gap-0.5 pl-4",
38
+ children: items.map((item, index) => /* @__PURE__ */ jsx("li", { children: item }, index))
39
+ }),
40
+ /* @__PURE__ */ jsx("span", {
41
+ className: "flex gap-2",
42
+ children: actions
43
+ })
44
+ ]
45
+ });
46
+ }
47
+ /** What a setting's last run did, and each thing it kept with why. */
48
+ function SettingLastRun({ summary, kept }) {
49
+ return /* @__PURE__ */ jsxs("div", {
50
+ className: "grid gap-1 text-xs text-(--muted-foreground)",
51
+ "data-last-delete": true,
52
+ children: [/* @__PURE__ */ jsx("p", {
53
+ className: "m-0",
54
+ children: summary
55
+ }), kept.length > 0 && /* @__PURE__ */ jsx("ul", {
56
+ className: "m-0 grid gap-0.5 pl-4",
57
+ children: kept.map((line, index) => /* @__PURE__ */ jsx("li", { children: line }, index))
58
+ })]
59
+ });
60
+ }
61
+ export { ActionStack, SettingConfirm, SettingLastRun };
62
+
63
+ //# sourceMappingURL=Archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Archive.js","names":[],"sources":["../../src/board/Archive.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { Text } from '../typography/Typography';\n\n/** A row's actions at its right, with what they last did and an error under them. */\nexport function ActionStack({\n children,\n below,\n error,\n}: {\n children: ReactNode;\n below?: ReactNode;\n error?: string | null;\n}) {\n return (\n <span className=\"flex flex-col items-end gap-1\">\n <span className=\"flex flex-wrap items-center gap-2\">{children}</span>\n {below}\n {error && (\n <Text variant=\"caption\" tone=\"danger\" role=\"alert\">\n {error}\n </Text>\n )}\n </span>\n );\n}\n\n/** A setting's confirmation, inline under it, before it saves: what it would do now, the work it names, and the\n * buttons that cancel or go ahead. */\nexport function SettingConfirm({\n label,\n message,\n items,\n actions,\n}: {\n label: string;\n message: string;\n items: readonly string[];\n actions: ReactNode;\n}) {\n return (\n <div\n className=\"grid gap-2 rounded-lg border border-(--border) p-3 text-sm\"\n role=\"alertdialog\"\n aria-label={label}\n data-delete-confirm\n >\n <p className=\"m-0\">{message}</p>\n {items.length > 0 && (\n <ul className=\"m-0 grid gap-0.5 pl-4\">\n {items.map((item, index) => (\n <li key={index}>{item}</li>\n ))}\n </ul>\n )}\n <span className=\"flex gap-2\">{actions}</span>\n </div>\n );\n}\n\n/** What a setting's last run did, and each thing it kept with why. */\nexport function SettingLastRun({ summary, kept }: { summary: string; kept: readonly string[] }) {\n return (\n <div className=\"grid gap-1 text-xs text-(--muted-foreground)\" data-last-delete>\n <p className=\"m-0\">{summary}</p>\n {kept.length > 0 && (\n <ul className=\"m-0 grid gap-0.5 pl-4\">\n {kept.map((line, index) => (\n <li key={index}>{line}</li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n"],"mappings":";;;;AAKA,SAAgB,YAAY,EACxB,UACA,OACA,SAKD;CACC,OACI,qBAAC,QAAD;EAAM,WAAU;EAAhB,UAAA;GACI,oBAAC,QAAD;IAAM,WAAU;IAAqC;GAAe,CAAA;GACnE;GACA,SACG,oBAAC,MAAD;IAAM,SAAQ;IAAU,MAAK;IAAS,MAAK;IACtC,UAAA;GACC,CAAA;EAER;;AAEd;;;AAIA,SAAgB,eAAe,EAC3B,OACA,SACA,OACA,WAMD;CACC,OACI,qBAAC,OAAD;EACI,WAAU;EACV,MAAK;EACL,cAAY;EACZ,uBAAA;EAJJ,UAAA;GAMI,oBAAC,KAAD;IAAG,WAAU;IAAO,UAAA;GAAW,CAAA;GAC9B,MAAM,SAAS,KACZ,oBAAC,MAAD;IAAI,WAAU;IACT,UAAA,MAAM,KAAK,MAAM,UACd,oBAAC,MAAD,EAAA,UAAiB,KAAS,GAAjB,KAAiB,CAC7B;GACD,CAAA;GAER,oBAAC,QAAD;IAAM,WAAU;IAAc,UAAA;GAAc,CAAA;EAC3C;;AAEb;;AAGA,SAAgB,eAAe,EAAE,SAAS,QAAsD;CAC5F,OACI,qBAAC,OAAD;EAAK,WAAU;EAA+C,oBAAA;EAA9D,UAAA,CACI,oBAAC,KAAD;GAAG,WAAU;GAAO,UAAA;EAAW,CAAA,GAC9B,KAAK,SAAS,KACX,oBAAC,MAAD;GAAI,WAAU;GACT,UAAA,KAAK,KAAK,MAAM,UACb,oBAAC,MAAD,EAAA,UAAiB,KAAS,GAAjB,KAAiB,CAC7B;EACD,CAAA,CAEP;;AAEb"}
@@ -0,0 +1,66 @@
1
+ import { DataAttributes } from "./DataAttributes.js";
2
+ import { ReactNode } from "react";
3
+ declare const TONE: {
4
+ readonly yours: 'text-(--warning-foreground)';
5
+ readonly decision: 'text-(--primary)';
6
+ readonly blocked: 'text-(--st-review)';
7
+ readonly waiting: 'text-(--muted-foreground)';
8
+ readonly ready: 'text-(--st-now)';
9
+ readonly fog: 'text-(--st-amber)';
10
+ };
11
+ /** An attention row's tone, which colours its label. */
12
+ export type AttentionTone = keyof typeof TONE;
13
+ /** The attention rows, each a label in its tone with how many entries it has, then its entries. */
14
+ export declare function AttentionList({ rows }: {
15
+ rows: {
16
+ key: string;
17
+ label: string;
18
+ tone: AttentionTone;
19
+ entries: ReactNode[];
20
+ }[];
21
+ }): import("react").JSX.Element;
22
+ /** What the attention list says when nothing holds the work up. */
23
+ export declare function AttentionNone({ children }: {
24
+ children: ReactNode;
25
+ }): import("react").JSX.Element;
26
+ /** One entry of an attention row, with what it waits on or its next action at the right. */
27
+ export declare function AttentionEntry({ main, side }: {
28
+ main: ReactNode;
29
+ side?: ReactNode;
30
+ }): import("react").JSX.Element;
31
+ /** An entry's text as a plain button that opens what it names. */
32
+ export declare function EntryButton({ onOpen, children }: {
33
+ onOpen: () => void;
34
+ children: ReactNode;
35
+ }): import("react").JSX.Element;
36
+ /** A reference to an item, such as `#12`, as a button that opens it; `title` names it. */
37
+ export declare function RefButton({ title, onOpen, children }: {
38
+ title: string;
39
+ onOpen: () => void;
40
+ children: ReactNode;
41
+ }): import("react").JSX.Element;
42
+ declare const MARKS: {
43
+ readonly blocked: import("react").JSX.Element;
44
+ readonly met: import("react").JSX.Element;
45
+ readonly fog: import("react").JSX.Element;
46
+ };
47
+ /** An entry's text after a mark: blocked, met, or an open question (fog). `clamp` keeps it to two lines. */
48
+ export declare function AttentionMark({ mark, clamp, children, ...data }: {
49
+ mark: keyof typeof MARKS;
50
+ clamp?: boolean;
51
+ children: ReactNode;
52
+ } & DataAttributes): import("react").JSX.Element;
53
+ /** A part's source, status glyph and title, up to two lines. */
54
+ export declare function PartName({ source, glyph, children }: {
55
+ source: ReactNode;
56
+ glyph: ReactNode;
57
+ children: ReactNode;
58
+ }): import("react").JSX.Element;
59
+ /** A part's PartName as a button that opens it; `title` names it. */
60
+ export declare function PartLink({ title, onOpen, children }: {
61
+ title: string;
62
+ onOpen: () => void;
63
+ children: ReactNode;
64
+ }): import("react").JSX.Element;
65
+ export {};
66
+ //# sourceMappingURL=Attention.d.ts.map
@@ -0,0 +1,122 @@
1
+ import { ROW_OPENS } from "./RowStyles.js";
2
+ import { BanIcon, CheckIcon, CircleHelpIcon } from "lucide-react";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ // src/board/Attention.tsx
5
+ const TONE = {
6
+ yours: "text-(--warning-foreground)",
7
+ decision: "text-(--primary)",
8
+ blocked: "text-(--st-review)",
9
+ waiting: "text-(--muted-foreground)",
10
+ ready: "text-(--st-now)",
11
+ fog: "text-(--st-amber)"
12
+ };
13
+ /** The attention rows, each a label in its tone with how many entries it has, then its entries. */
14
+ function AttentionList({ rows }) {
15
+ return /* @__PURE__ */ jsx("dl", {
16
+ className: "m-0 grid grid-cols-[minmax(7.5rem,max-content)_minmax(0,1fr)] gap-x-4 gap-y-2",
17
+ "data-attention": true,
18
+ children: rows.map((r) => /* @__PURE__ */ jsxs("div", {
19
+ className: "contents",
20
+ "data-attention-row": r.key,
21
+ children: [/* @__PURE__ */ jsxs("dt", {
22
+ className: `pt-2 text-[11px] font-medium tracking-wide whitespace-nowrap uppercase ${TONE[r.tone]}`,
23
+ children: [
24
+ r.label,
25
+ " ",
26
+ /* @__PURE__ */ jsx("span", {
27
+ className: "tabular-nums",
28
+ children: r.entries.length
29
+ })
30
+ ]
31
+ }), /* @__PURE__ */ jsx("dd", {
32
+ className: "m-0 grid gap-1",
33
+ children: r.entries
34
+ })]
35
+ }, r.key))
36
+ });
37
+ }
38
+ /** What the attention list says when nothing holds the work up. */
39
+ function AttentionNone({ children }) {
40
+ return /* @__PURE__ */ jsx("p", {
41
+ className: "m-0 text-[13px] text-(--muted-foreground)",
42
+ "data-attention-none": true,
43
+ children
44
+ });
45
+ }
46
+ /** One entry of an attention row, with what it waits on or its next action at the right. */
47
+ function AttentionEntry({ main, side }) {
48
+ return /* @__PURE__ */ jsxs("div", {
49
+ className: "flex min-h-9 min-w-0 flex-wrap items-center justify-between gap-x-3 gap-y-1 rounded-md px-2 py-1.5 hover:bg-(--soft)",
50
+ children: [/* @__PURE__ */ jsx("span", {
51
+ className: "min-w-0 flex-1 basis-64",
52
+ children: main
53
+ }), side && /* @__PURE__ */ jsx("span", {
54
+ className: "ml-auto shrink-0 text-xs text-(--muted-foreground)",
55
+ children: side
56
+ })]
57
+ });
58
+ }
59
+ /** An entry's text as a plain button that opens what it names. */
60
+ function EntryButton({ onOpen, children }) {
61
+ return /* @__PURE__ */ jsx("button", {
62
+ type: "button",
63
+ onClick: onOpen,
64
+ children
65
+ });
66
+ }
67
+ /** A reference to an item, such as `#12`, as a button that opens it; `title` names it. */
68
+ function RefButton({ title, onOpen, children }) {
69
+ return /* @__PURE__ */ jsx("button", {
70
+ type: "button",
71
+ onClick: onOpen,
72
+ title,
73
+ className: "rounded px-0.5 font-medium text-(--primary) tabular-nums hover:bg-(--accent)",
74
+ children
75
+ });
76
+ }
77
+ const MARKS = {
78
+ blocked: /* @__PURE__ */ jsx(BanIcon, { className: "mt-0.5 size-3.5 shrink-0 text-(--st-review)" }),
79
+ met: /* @__PURE__ */ jsx(CheckIcon, { className: "mt-0.5 size-3.5 shrink-0 text-(--st-done)" }),
80
+ fog: /* @__PURE__ */ jsx(CircleHelpIcon, { className: "mt-0.5 size-3.5 shrink-0 text-(--st-amber)" })
81
+ };
82
+ /** An entry's text after a mark: blocked, met, or an open question (fog). `clamp` keeps it to two lines. */
83
+ function AttentionMark({ mark, clamp = false, children, ...data }) {
84
+ return /* @__PURE__ */ jsxs("span", {
85
+ ...data,
86
+ className: `flex ${clamp ? "min-w-0 " : ""}items-start gap-1.5 text-[13px]`,
87
+ children: [MARKS[mark], /* @__PURE__ */ jsx("span", {
88
+ className: clamp ? "line-clamp-2" : void 0,
89
+ children
90
+ })]
91
+ });
92
+ }
93
+ /** A part's source, status glyph and title, up to two lines. */
94
+ function PartName({ source, glyph, children }) {
95
+ return /* @__PURE__ */ jsxs("span", {
96
+ className: "flex min-w-0 items-start gap-1.5 text-sm",
97
+ children: [
98
+ source,
99
+ /* @__PURE__ */ jsx("span", {
100
+ className: "mt-0.5 inline-flex",
101
+ children: glyph
102
+ }),
103
+ /* @__PURE__ */ jsx("span", {
104
+ className: "line-clamp-2",
105
+ children
106
+ })
107
+ ]
108
+ });
109
+ }
110
+ /** A part's PartName as a button that opens it; `title` names it. */
111
+ function PartLink({ title, onOpen, children }) {
112
+ return /* @__PURE__ */ jsx("button", {
113
+ type: "button",
114
+ onClick: onOpen,
115
+ title,
116
+ className: `min-w-0 rounded text-left hover:underline ${ROW_OPENS}`,
117
+ children
118
+ });
119
+ }
120
+ export { AttentionEntry, AttentionList, AttentionMark, AttentionNone, EntryButton, PartLink, PartName, RefButton };
121
+
122
+ //# sourceMappingURL=Attention.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Attention.js","names":[],"sources":["../../src/board/Attention.tsx"],"sourcesContent":["// An expanded dossier's attention list: what keeps its work moving, as labelled rows of entries, and the parts and\n// references its entries name.\n\nimport { BanIcon, CheckIcon, CircleHelpIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nimport type { DataAttributes } from './DataAttributes';\nimport { ROW_OPENS } from './RowStyles';\n\nconst TONE = {\n yours: 'text-(--warning-foreground)',\n decision: 'text-(--primary)',\n blocked: 'text-(--st-review)',\n waiting: 'text-(--muted-foreground)',\n ready: 'text-(--st-now)',\n fog: 'text-(--st-amber)',\n} as const;\n\n/** An attention row's tone, which colours its label. */\nexport type AttentionTone = keyof typeof TONE;\n\n/** The attention rows, each a label in its tone with how many entries it has, then its entries. */\nexport function AttentionList({\n rows,\n}: {\n rows: { key: string; label: string; tone: AttentionTone; entries: ReactNode[] }[];\n}) {\n return (\n // The labels' column is 7.5rem, or as wide as the longest label so none wraps (\"To verify or merge\" needs more).\n <dl className=\"m-0 grid grid-cols-[minmax(7.5rem,max-content)_minmax(0,1fr)] gap-x-4 gap-y-2\" data-attention>\n {rows.map((r) => (\n <div key={r.key} className=\"contents\" data-attention-row={r.key}>\n <dt\n className={`pt-2 text-[11px] font-medium tracking-wide whitespace-nowrap uppercase ${TONE[r.tone]}`}\n >\n {r.label} <span className=\"tabular-nums\">{r.entries.length}</span>\n </dt>\n <dd className=\"m-0 grid gap-1\">{r.entries}</dd>\n </div>\n ))}\n </dl>\n );\n}\n\n/** What the attention list says when nothing holds the work up. */\nexport function AttentionNone({ children }: { children: ReactNode }) {\n return (\n <p className=\"m-0 text-[13px] text-(--muted-foreground)\" data-attention-none>\n {children}\n </p>\n );\n}\n\n/** One entry of an attention row, with what it waits on or its next action at the right. */\nexport function AttentionEntry({ main, side }: { main: ReactNode; side?: ReactNode }) {\n return (\n <div className=\"flex min-h-9 min-w-0 flex-wrap items-center justify-between gap-x-3 gap-y-1 rounded-md px-2 py-1.5 hover:bg-(--soft)\">\n <span className=\"min-w-0 flex-1 basis-64\">{main}</span>\n {side && <span className=\"ml-auto shrink-0 text-xs text-(--muted-foreground)\">{side}</span>}\n </div>\n );\n}\n\n/** An entry's text as a plain button that opens what it names. */\nexport function EntryButton({ onOpen, children }: { onOpen: () => void; children: ReactNode }) {\n return (\n <button type=\"button\" onClick={onOpen}>\n {children}\n </button>\n );\n}\n\n/** A reference to an item, such as `#12`, as a button that opens it; `title` names it. */\nexport function RefButton({ title, onOpen, children }: { title: string; onOpen: () => void; children: ReactNode }) {\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n title={title}\n className=\"rounded px-0.5 font-medium text-(--primary) tabular-nums hover:bg-(--accent)\"\n >\n {children}\n </button>\n );\n}\n\nconst MARKS = {\n blocked: <BanIcon className=\"mt-0.5 size-3.5 shrink-0 text-(--st-review)\" />,\n met: <CheckIcon className=\"mt-0.5 size-3.5 shrink-0 text-(--st-done)\" />,\n fog: <CircleHelpIcon className=\"mt-0.5 size-3.5 shrink-0 text-(--st-amber)\" />,\n} as const;\n\n/** An entry's text after a mark: blocked, met, or an open question (fog). `clamp` keeps it to two lines. */\nexport function AttentionMark({\n mark,\n clamp = false,\n children,\n ...data\n}: {\n mark: keyof typeof MARKS;\n clamp?: boolean;\n children: ReactNode;\n} & DataAttributes) {\n return (\n <span {...data} className={`flex ${clamp ? 'min-w-0 ' : ''}items-start gap-1.5 text-[13px]`}>\n {MARKS[mark]}\n <span className={clamp ? 'line-clamp-2' : undefined}>{children}</span>\n </span>\n );\n}\n\n/** A part's source, status glyph and title, up to two lines. */\nexport function PartName({ source, glyph, children }: { source: ReactNode; glyph: ReactNode; children: ReactNode }) {\n return (\n <span className=\"flex min-w-0 items-start gap-1.5 text-sm\">\n {source}\n <span className=\"mt-0.5 inline-flex\">{glyph}</span>\n <span className=\"line-clamp-2\">{children}</span>\n </span>\n );\n}\n\n/** A part's PartName as a button that opens it; `title` names it. */\nexport function PartLink({ title, onOpen, children }: { title: string; onOpen: () => void; children: ReactNode }) {\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n title={title}\n className={`min-w-0 rounded text-left hover:underline ${ROW_OPENS}`}\n >\n {children}\n </button>\n );\n}\n"],"mappings":";;;;AASA,MAAM,OAAO;CACT,OAAO;CACP,UAAU;CACV,SAAS;CACT,SAAS;CACT,OAAO;CACP,KAAK;AACT;;AAMA,SAAgB,cAAc,EAC1B,QAGD;CACC,OAEI,oBAAC,MAAD;EAAI,WAAU;EAAgF,kBAAA;EACzF,UAAA,KAAK,KAAK,MACP,qBAAC,OAAD;GAAiB,WAAU;GAAW,sBAAoB,EAAE;GAA5D,UAAA,CACI,qBAAC,MAAD;IACI,WAAW,0EAA0E,KAAK,EAAE;IADhG,UAAA;KAGK,EAAE;KAAM;KAAC,oBAAC,QAAD;MAAM,WAAU;MAAgB,UAAA,EAAE,QAAQ;KAAa,CAAA;IACjE;GACJ,CAAA,GAAA,oBAAC,MAAD;IAAI,WAAU;IAAkB,UAAA,EAAE;GAAY,CAAA,CAC7C;EAPK,GAAA,EAAE,GAOP,CACR;CACD,CAAA;AAEZ;;AAGA,SAAgB,cAAc,EAAE,YAAqC;CACjE,OACI,oBAAC,KAAD;EAAG,WAAU;EAA4C,uBAAA;EACpD;CACF,CAAA;AAEX;;AAGA,SAAgB,eAAe,EAAE,MAAM,QAA+C;CAClF,OACI,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACI,oBAAC,QAAD;GAAM,WAAU;GAA2B,UAAA;EAAW,CAAA,GACrD,QAAQ,oBAAC,QAAD;GAAM,WAAU;GAAsD,UAAA;EAAW,CAAA,CACzF;;AAEb;;AAGA,SAAgB,YAAY,EAAE,QAAQ,YAAyD;CAC3F,OACI,oBAAC,UAAD;EAAQ,MAAK;EAAS,SAAS;EAC1B;CACG,CAAA;AAEhB;;AAGA,SAAgB,UAAU,EAAE,OAAO,QAAQ,YAAwE;CAC/G,OACI,oBAAC,UAAD;EACI,MAAK;EACL,SAAS;EACF;EACP,WAAU;EAET;CACG,CAAA;AAEhB;AAEA,MAAM,QAAQ;CACV,SAAS,oBAAC,SAAD,EAAS,WAAU,8CAA+C,CAAA;CAC3E,KAAK,oBAAC,WAAD,EAAW,WAAU,4CAA6C,CAAA;CACvE,KAAK,oBAAC,gBAAD,EAAgB,WAAU,6CAA8C,CAAA;AACjF;;AAGA,SAAgB,cAAc,EAC1B,MACA,QAAQ,OACR,UACA,GAAG,QAKa;CAChB,OACI,qBAAC,QAAD;EAAM,GAAI;EAAM,WAAW,QAAQ,QAAQ,aAAa,GAAG;EAA3D,UAAA,CACK,MAAM,OACP,oBAAC,QAAD;GAAM,WAAW,QAAQ,iBAAiB,KAAA;GAAY;EAAe,CAAA,CACnE;;AAEd;;AAGA,SAAgB,SAAS,EAAE,QAAQ,OAAO,YAA0E;CAChH,OACI,qBAAC,QAAD;EAAM,WAAU;EAAhB,UAAA;GACK;GACD,oBAAC,QAAD;IAAM,WAAU;IAAsB,UAAA;GAAY,CAAA;GAClD,oBAAC,QAAD;IAAM,WAAU;IAAgB;GAAe,CAAA;EAC7C;;AAEd;;AAGA,SAAgB,SAAS,EAAE,OAAO,QAAQ,YAAwE;CAC9G,OACI,oBAAC,UAAD;EACI,MAAK;EACL,SAAS;EACF;EACP,WAAW,6CAA6C;EAEvD;CACG,CAAA;AAEhB"}
@@ -0,0 +1,16 @@
1
+ import { ReactNode } from "react";
2
+ /** Lar Factory's window: the board's main area filling the window, and beside it, outside `main`, what sits over the
3
+ * board (its dialogs, live regions and notifications), so their announcements sit apart from the page. */
4
+ export declare function BoardShell({ children, overlays }: {
5
+ children: ReactNode;
6
+ overlays?: ReactNode;
7
+ }): import("react").JSX.Element;
8
+ /** Everything under the title bar, which scrolls as one page; nothing in it shrinks to fit. */
9
+ export declare function BoardContent({ children }: {
10
+ children: ReactNode;
11
+ }): import("react").JSX.Element;
12
+ /** A line that stands in for content the board is still reading, centred in its area. */
13
+ export declare function ReadingLine({ label }: {
14
+ label: string;
15
+ }): import("react").JSX.Element;
16
+ //# sourceMappingURL=BoardShell.d.ts.map
@@ -0,0 +1,35 @@
1
+ import { Loading } from "../feedback/Loading.js";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ // src/board/BoardShell.tsx
4
+ /** Lar Factory's window: the board's main area filling the window, and beside it, outside `main`, what sits over the
5
+ * board (its dialogs, live regions and notifications), so their announcements sit apart from the page. */
6
+ function BoardShell({ children, overlays }) {
7
+ return /* @__PURE__ */ jsxs("div", {
8
+ className: "fixed inset-0 flex flex-col bg-(--background) text-(--foreground)",
9
+ children: [/* @__PURE__ */ jsx("main", {
10
+ className: "flex min-h-0 min-w-0 flex-1 flex-col",
11
+ children
12
+ }), overlays]
13
+ });
14
+ }
15
+ /** Everything under the title bar, which scrolls as one page; nothing in it shrinks to fit. */
16
+ function BoardContent({ children }) {
17
+ return /* @__PURE__ */ jsx("div", {
18
+ className: "flex min-h-0 flex-1 flex-col gap-3 overflow-y-auto px-6 pt-3 pb-4 *:shrink-0",
19
+ children
20
+ });
21
+ }
22
+ /** A line that stands in for content the board is still reading, centred in its area. */
23
+ function ReadingLine({ label }) {
24
+ return /* @__PURE__ */ jsx("p", {
25
+ className: "text-base-700 m-0 flex items-center justify-center gap-2 p-6 text-sm",
26
+ "data-reading": true,
27
+ children: /* @__PURE__ */ jsx(Loading, {
28
+ label,
29
+ presentation: "line"
30
+ })
31
+ });
32
+ }
33
+ export { BoardContent, BoardShell, ReadingLine };
34
+
35
+ //# sourceMappingURL=BoardShell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BoardShell.js","names":[],"sources":["../../src/board/BoardShell.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { Loading } from '../feedback/Loading';\n\n/** Lar Factory's window: the board's main area filling the window, and beside it, outside `main`, what sits over the\n * board (its dialogs, live regions and notifications), so their announcements sit apart from the page. */\nexport function BoardShell({ children, overlays }: { children: ReactNode; overlays?: ReactNode }) {\n return (\n <div className=\"fixed inset-0 flex flex-col bg-(--background) text-(--foreground)\">\n <main className=\"flex min-h-0 min-w-0 flex-1 flex-col\">{children}</main>\n {overlays}\n </div>\n );\n}\n\n/** Everything under the title bar, which scrolls as one page; nothing in it shrinks to fit. */\nexport function BoardContent({ children }: { children: ReactNode }) {\n return (\n <div className=\"flex min-h-0 flex-1 flex-col gap-3 overflow-y-auto px-6 pt-3 pb-4 *:shrink-0\">{children}</div>\n );\n}\n\n/** A line that stands in for content the board is still reading, centred in its area. */\nexport function ReadingLine({ label }: { label: string }) {\n return (\n <p className=\"text-base-700 m-0 flex items-center justify-center gap-2 p-6 text-sm\" data-reading>\n <Loading label={label} presentation=\"line\" />\n </p>\n );\n}\n"],"mappings":";;;;;AAMA,SAAgB,WAAW,EAAE,UAAU,YAA2D;CAC9F,OACI,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACI,oBAAC,QAAD;GAAM,WAAU;GAAwC;EAAe,CAAA,GACtE,QACA;;AAEb;;AAGA,SAAgB,aAAa,EAAE,YAAqC;CAChE,OACI,oBAAC,OAAD;EAAK,WAAU;EAAgF;CAAc,CAAA;AAErH;;AAGA,SAAgB,YAAY,EAAE,SAA4B;CACtD,OACI,oBAAC,KAAD;EAAG,WAAU;EAAuE,gBAAA;EAChF,UAAA,oBAAC,SAAD;GAAgB;GAAO,cAAa;EAAQ,CAAA;CAC7C,CAAA;AAEX"}