@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,50 @@
1
+ import { ReactNode } from "react";
2
+ interface BoardTitleBarProps {
3
+ /** The lockup on the left, such as BoardBrand. */
4
+ brand: ReactNode;
5
+ /** The page's heading, for screen readers only, as the brand is hidden from them. A closing dialog whose opener
6
+ * went away can put the focus on it. */
7
+ heading?: string;
8
+ /** How the board is doing, in the status strip: the Refreshed time, then the counters after a divider. */
9
+ refreshed?: ReactNode;
10
+ counters?: ReactNode;
11
+ /** The search field, up to 26rem wide beside the actions. */
12
+ search?: ReactNode;
13
+ actions: ReactNode;
14
+ /** In the Mac app, where macOS draws the traffic lights; in a browser, grey stand-ins hold their place. */
15
+ nativeWindow: boolean;
16
+ /** Starts the bar past the traffic lights; off while full screen hides them. */
17
+ pastLights: boolean;
18
+ }
19
+ /**
20
+ * Lar Factory's title bar, laid out as lar-server's on the design system's TitleBar: the brand and how the board is
21
+ * doing on the left, the search field and what you can do on the right. The bar drags the window, except on its
22
+ * controls, and folds by its own width: below 48rem the actions take their own row and the status strip goes.
23
+ */
24
+ export declare function BoardTitleBar({ brand, heading, refreshed, counters, search, actions, nativeWindow, pastLights }: BoardTitleBarProps): import("react").JSX.Element;
25
+ /** The product's lockup in the title bar: the Lar mark, "ar" and the product's name. Screen readers skip it: the
26
+ * page's heading names the page. */
27
+ export declare function BoardBrand({ product }: {
28
+ product: string;
29
+ }): import("react").JSX.Element;
30
+ /** A divider between groups of the title bar's actions. */
31
+ export declare function TitleBarDivider(): import("react").JSX.Element;
32
+ export type RefreshHealth = 'waiting' | 'live' | 'stale' | 'disconnected';
33
+ interface RefreshIndicatorProps {
34
+ health: RefreshHealth;
35
+ /** What the time says, such as "12s" or "Stale · 2m"; hidden on a narrow bar, where the dot speaks alone. */
36
+ label: ReactNode;
37
+ /** A count of reads landed while this page was open: each new one pings the dot once, while live. */
38
+ landed: number;
39
+ /** The tooltip's two lines: when the board last read, then how it reads or what went wrong. */
40
+ detail: string;
41
+ secondaryDetail: string;
42
+ }
43
+ /**
44
+ * How fresh the board is, in the title bar's status strip: a dot in the health's colour (amber when stale, red while
45
+ * the page has lost the board server) and the time since the last read, with more in a tooltip. A tab stop, so
46
+ * keyboard users reach its tooltip.
47
+ */
48
+ export declare function RefreshIndicator({ health, label, landed, detail, secondaryDetail }: RefreshIndicatorProps): import("react").JSX.Element;
49
+ export {};
50
+ //# sourceMappingURL=BoardTitleBar.d.ts.map
@@ -0,0 +1,125 @@
1
+ import { BrandMark } from "../display/BrandMark.js";
2
+ import { TitleBar } from "../layout/TitleBar.js";
3
+ import { Tooltip, TooltipPopup, TooltipTrigger } from "../overlays/Tooltip.js";
4
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
+ // src/board/BoardTitleBar.tsx
6
+ /** The window drags from the bar, but never from a control in it. */
7
+ const drag = "[-webkit-app-region:drag] [&_:is(button,a,[tabindex])]:[-webkit-app-region:no-drag]";
8
+ /**
9
+ * Lar Factory's title bar, laid out as lar-server's on the design system's TitleBar: the brand and how the board is
10
+ * doing on the left, the search field and what you can do on the right. The bar drags the window, except on its
11
+ * controls, and folds by its own width: below 48rem the actions take their own row and the status strip goes.
12
+ */
13
+ function BoardTitleBar({ brand, heading, refreshed, counters, search, actions, nativeWindow, pastLights }) {
14
+ const status = refreshed || counters;
15
+ return /* @__PURE__ */ jsxs("div", {
16
+ "data-native-window": nativeWindow || void 0,
17
+ className: `title-bar border-base-300 shrink-0 border-b select-none ${pastLights ? "pl-[74px]" : ""} ${drag}`,
18
+ children: [
19
+ nativeWindow ? null : /* @__PURE__ */ jsx(TrafficLights, {}),
20
+ heading ? /* @__PURE__ */ jsx("h1", {
21
+ className: "sr-only",
22
+ tabIndex: -1,
23
+ children: heading
24
+ }) : null,
25
+ /* @__PURE__ */ jsx(TitleBar, {
26
+ brand,
27
+ title: status || search ? /* @__PURE__ */ jsxs(Fragment, { children: [status ? /* @__PURE__ */ jsxs("div", {
28
+ className: "status-strip border-base-300 bg-base-200/60 flex shrink-0 items-center gap-0.5 rounded-lg border pr-0.5 pl-1.5",
29
+ children: [
30
+ refreshed,
31
+ refreshed && counters ? /* @__PURE__ */ jsx("span", {
32
+ "aria-hidden": "true",
33
+ className: "bg-base-300 mx-0.5 h-4 w-px @max-[40rem]:hidden"
34
+ }) : null,
35
+ counters
36
+ ]
37
+ }) : null, search] }) : null,
38
+ actions
39
+ })
40
+ ]
41
+ });
42
+ }
43
+ /** In a browser, the traffic lights' grey stand-ins, 16 px in and centred in the 52 px bar, where macOS draws them. */
44
+ function TrafficLights() {
45
+ return /* @__PURE__ */ jsx("div", {
46
+ className: "browser-window-controls pointer-events-none fixed top-0 left-0 z-50 flex h-13 items-center",
47
+ children: /* @__PURE__ */ jsx("span", {
48
+ className: "traffic-lights absolute left-4 flex gap-2",
49
+ "aria-hidden": "true",
50
+ children: [
51
+ "close",
52
+ "minimize",
53
+ "zoom"
54
+ ].map((light) => /* @__PURE__ */ jsx("span", { className: "size-3 rounded-full bg-(--traffic-stand-in)" }, light))
55
+ })
56
+ });
57
+ }
58
+ /** The product's lockup in the title bar: the Lar mark, "ar" and the product's name. Screen readers skip it: the
59
+ * page's heading names the page. */
60
+ function BoardBrand({ product }) {
61
+ return /* @__PURE__ */ jsx("span", {
62
+ className: "brand inline-flex shrink-0",
63
+ "aria-hidden": "true",
64
+ children: /* @__PURE__ */ jsx(BrandMark, {
65
+ label: `Lar ${product}`,
66
+ product
67
+ })
68
+ });
69
+ }
70
+ /** A divider between groups of the title bar's actions. */
71
+ function TitleBarDivider() {
72
+ return /* @__PURE__ */ jsx("span", {
73
+ "aria-hidden": "true",
74
+ className: "app-divider bg-base-300 mx-1 h-5 w-px shrink-0"
75
+ });
76
+ }
77
+ const dots = {
78
+ waiting: "bg-base-500",
79
+ live: "bg-success",
80
+ stale: "bg-amber-500",
81
+ disconnected: "bg-danger"
82
+ };
83
+ /**
84
+ * How fresh the board is, in the title bar's status strip: a dot in the health's colour (amber when stale, red while
85
+ * the page has lost the board server) and the time since the last read, with more in a tooltip. A tab stop, so
86
+ * keyboard users reach its tooltip.
87
+ */
88
+ function RefreshIndicator({ health, label, landed, detail, secondaryDetail }) {
89
+ return /* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, {
90
+ asChild: true,
91
+ children: /* @__PURE__ */ jsxs("span", {
92
+ tabIndex: 0,
93
+ className: "refreshed text-base-700 focus-visible:ring-primary inline-flex h-6 shrink-0 items-center gap-1.5 rounded-sm px-1 text-xs whitespace-nowrap tabular-nums outline-none focus-visible:ring-2 @max-[40rem]:hidden @min-[48rem]:min-w-30",
94
+ children: [/* @__PURE__ */ jsxs("span", {
95
+ className: "relative grid size-2 place-items-center",
96
+ children: [landed > 0 && health === "live" && /* @__PURE__ */ jsx("span", {
97
+ "data-ping": true,
98
+ className: "bg-success absolute size-1.5 rounded-full motion-safe:animate-[refreshed-ping_1.2s_ease-out_forwards]"
99
+ }, landed), /* @__PURE__ */ jsx("span", {
100
+ "data-dot": true,
101
+ className: `size-1.5 rounded-full ${dots[health]}`
102
+ })]
103
+ }), /* @__PURE__ */ jsx("span", {
104
+ className: "@max-[48rem]:sr-only",
105
+ children: label
106
+ })]
107
+ })
108
+ }), /* @__PURE__ */ jsx(TooltipPopup, {
109
+ side: "bottom",
110
+ children: /* @__PURE__ */ jsxs("span", {
111
+ className: "flex flex-col gap-0.5",
112
+ children: [/* @__PURE__ */ jsx("span", {
113
+ "data-line": true,
114
+ children: detail
115
+ }), /* @__PURE__ */ jsx("span", {
116
+ "data-line": true,
117
+ className: "text-base-700",
118
+ children: secondaryDetail
119
+ })]
120
+ })
121
+ })] });
122
+ }
123
+ export { BoardBrand, BoardTitleBar, RefreshIndicator, TitleBarDivider };
124
+
125
+ //# sourceMappingURL=BoardTitleBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BoardTitleBar.js","names":[],"sources":["../../src/board/BoardTitleBar.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { BrandMark } from '../display/BrandMark';\nimport { TitleBar } from '../layout/TitleBar';\nimport { Tooltip, TooltipPopup, TooltipTrigger } from '../overlays/Tooltip';\n\n/** The window drags from the bar, but never from a control in it. */\nconst drag = '[-webkit-app-region:drag] [&_:is(button,a,[tabindex])]:[-webkit-app-region:no-drag]';\n\ninterface BoardTitleBarProps {\n /** The lockup on the left, such as BoardBrand. */\n brand: ReactNode;\n /** The page's heading, for screen readers only, as the brand is hidden from them. A closing dialog whose opener\n * went away can put the focus on it. */\n heading?: string;\n /** How the board is doing, in the status strip: the Refreshed time, then the counters after a divider. */\n refreshed?: ReactNode;\n counters?: ReactNode;\n /** The search field, up to 26rem wide beside the actions. */\n search?: ReactNode;\n actions: ReactNode;\n /** In the Mac app, where macOS draws the traffic lights; in a browser, grey stand-ins hold their place. */\n nativeWindow: boolean;\n /** Starts the bar past the traffic lights; off while full screen hides them. */\n pastLights: boolean;\n}\n\n/**\n * Lar Factory's title bar, laid out as lar-server's on the design system's TitleBar: the brand and how the board is\n * doing on the left, the search field and what you can do on the right. The bar drags the window, except on its\n * controls, and folds by its own width: below 48rem the actions take their own row and the status strip goes.\n */\nexport function BoardTitleBar({\n brand,\n heading,\n refreshed,\n counters,\n search,\n actions,\n nativeWindow,\n pastLights,\n}: BoardTitleBarProps) {\n const status = refreshed || counters;\n\n return (\n <div\n data-native-window={nativeWindow || undefined}\n className={`title-bar border-base-300 shrink-0 border-b select-none ${pastLights ? 'pl-[74px]' : ''} ${drag}`}\n >\n {nativeWindow ? null : <TrafficLights />}\n {heading ? (\n <h1 className=\"sr-only\" tabIndex={-1}>\n {heading}\n </h1>\n ) : null}\n <TitleBar\n brand={brand}\n title={\n status || search ? (\n <>\n {status ? (\n <div className=\"status-strip border-base-300 bg-base-200/60 flex shrink-0 items-center gap-0.5 rounded-lg border pr-0.5 pl-1.5\">\n {refreshed}\n {refreshed && counters ? (\n <span\n aria-hidden=\"true\"\n className=\"bg-base-300 mx-0.5 h-4 w-px @max-[40rem]:hidden\"\n />\n ) : null}\n {counters}\n </div>\n ) : null}\n {search}\n </>\n ) : null\n }\n actions={actions}\n />\n </div>\n );\n}\n\n/** In a browser, the traffic lights' grey stand-ins, 16 px in and centred in the 52 px bar, where macOS draws them. */\nfunction TrafficLights() {\n return (\n <div className=\"browser-window-controls pointer-events-none fixed top-0 left-0 z-50 flex h-13 items-center\">\n <span className=\"traffic-lights absolute left-4 flex gap-2\" aria-hidden=\"true\">\n {['close', 'minimize', 'zoom'].map((light) => (\n <span key={light} className=\"size-3 rounded-full bg-(--traffic-stand-in)\" />\n ))}\n </span>\n </div>\n );\n}\n\n/** The product's lockup in the title bar: the Lar mark, \"ar\" and the product's name. Screen readers skip it: the\n * page's heading names the page. */\nexport function BoardBrand({ product }: { product: string }) {\n return (\n <span className=\"brand inline-flex shrink-0\" aria-hidden=\"true\">\n <BrandMark label={`Lar ${product}`} product={product} />\n </span>\n );\n}\n\n/** A divider between groups of the title bar's actions. */\nexport function TitleBarDivider() {\n return <span aria-hidden=\"true\" className=\"app-divider bg-base-300 mx-1 h-5 w-px shrink-0\" />;\n}\n\nexport type RefreshHealth = 'waiting' | 'live' | 'stale' | 'disconnected';\n\nconst dots: Record<RefreshHealth, string> = {\n waiting: 'bg-base-500',\n live: 'bg-success',\n stale: 'bg-amber-500',\n disconnected: 'bg-danger',\n};\n\ninterface RefreshIndicatorProps {\n health: RefreshHealth;\n /** What the time says, such as \"12s\" or \"Stale · 2m\"; hidden on a narrow bar, where the dot speaks alone. */\n label: ReactNode;\n /** A count of reads landed while this page was open: each new one pings the dot once, while live. */\n landed: number;\n /** The tooltip's two lines: when the board last read, then how it reads or what went wrong. */\n detail: string;\n secondaryDetail: string;\n}\n\n/**\n * How fresh the board is, in the title bar's status strip: a dot in the health's colour (amber when stale, red while\n * the page has lost the board server) and the time since the last read, with more in a tooltip. A tab stop, so\n * keyboard users reach its tooltip.\n */\nexport function RefreshIndicator({ health, label, landed, detail, secondaryDetail }: RefreshIndicatorProps) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n tabIndex={0}\n className=\"refreshed text-base-700 focus-visible:ring-primary inline-flex h-6 shrink-0 items-center gap-1.5 rounded-sm px-1 text-xs whitespace-nowrap tabular-nums outline-none focus-visible:ring-2 @max-[40rem]:hidden @min-[48rem]:min-w-30\"\n >\n <span className=\"relative grid size-2 place-items-center\">\n {landed > 0 && health === 'live' && (\n <span\n key={landed}\n data-ping\n className=\"bg-success absolute size-1.5 rounded-full motion-safe:animate-[refreshed-ping_1.2s_ease-out_forwards]\"\n />\n )}\n <span data-dot className={`size-1.5 rounded-full ${dots[health]}`} />\n </span>\n <span className=\"@max-[48rem]:sr-only\">{label}</span>\n </span>\n </TooltipTrigger>\n <TooltipPopup side=\"bottom\">\n <span className=\"flex flex-col gap-0.5\">\n <span data-line>{detail}</span>\n <span data-line className=\"text-base-700\">\n {secondaryDetail}\n </span>\n </span>\n </TooltipPopup>\n </Tooltip>\n );\n}\n"],"mappings":";;;;;;AAOA,MAAM,OAAO;;;;;;AAyBb,SAAgB,cAAc,EAC1B,OACA,SACA,WACA,UACA,QACA,SACA,cACA,cACmB;CACnB,MAAM,SAAS,aAAa;CAE5B,OACI,qBAAC,OAAD;EACI,sBAAoB,gBAAgB,KAAA;EACpC,WAAW,2DAA2D,aAAa,cAAc,GAAG,GAAG;EAF3G,UAAA;GAIK,eAAe,OAAO,oBAAC,eAAD,CAAgB,CAAA;GACtC,UACG,oBAAC,MAAD;IAAI,WAAU;IAAU,UAAU;IAC7B,UAAA;GACD,CAAA,IACJ;GACJ,oBAAC,UAAD;IACW;IACP,OACI,UAAU,SACN,qBAAA,UAAA,EAAA,UAAA,CACK,SACG,qBAAC,OAAD;KAAK,WAAU;KAAf,UAAA;MACK;MACA,aAAa,WACV,oBAAC,QAAD;OACI,eAAY;OACZ,WAAU;MACb,CAAA,IACD;MACH;KACA;IACL,CAAA,IAAA,MACH,MACH,EAAA,CAAA,IACF;IAEC;GACZ,CAAA;EACA;;AAEb;;AAGA,SAAS,gBAAgB;CACrB,OACI,oBAAC,OAAD;EAAK,WAAU;EACX,UAAA,oBAAC,QAAD;GAAM,WAAU;GAA4C,eAAY;GACnE,UAAA;IAAC;IAAS;IAAY;GAAM,CAAC,CAAC,KAAK,UAChC,oBAAC,QAAD,EAAkB,WAAU,8CAA+C,GAAhE,KAAgE,CAC9E;EACC,CAAA;CACL,CAAA;AAEb;;;AAIA,SAAgB,WAAW,EAAE,WAAgC;CACzD,OACI,oBAAC,QAAD;EAAM,WAAU;EAA6B,eAAY;EACrD,UAAA,oBAAC,WAAD;GAAW,OAAO,OAAO;GAAoB;EAAU,CAAA;CACrD,CAAA;AAEd;;AAGA,SAAgB,kBAAkB;CAC9B,OAAO,oBAAC,QAAD;EAAM,eAAY;EAAO,WAAU;CAAkD,CAAA;AAChG;AAIA,MAAM,OAAsC;CACxC,SAAS;CACT,MAAM;CACN,OAAO;CACP,cAAc;AAClB;;;;;;AAkBA,SAAgB,iBAAiB,EAAE,QAAQ,OAAO,QAAQ,QAAQ,mBAA0C;CACxG,OACI,qBAAC,SAAD,EAAA,UAAA,CACI,oBAAC,gBAAD;EAAgB,SAAA;EACZ,UAAA,qBAAC,QAAD;GACI,UAAU;GACV,WAAU;GAFd,UAAA,CAII,qBAAC,QAAD;IAAM,WAAU;IAAhB,UAAA,CACK,SAAS,KAAK,WAAW,UACtB,oBAAC,QAAD;KAEI,aAAA;KACA,WAAU;IACb,GAHQ,MAGR,GAEL,oBAAC,QAAD;KAAM,YAAA;KAAS,WAAW,yBAAyB,KAAK;IAAY,CAAA,CAClE;GACN,CAAA,GAAA,oBAAC,QAAD;IAAM,WAAU;IAAwB,UAAA;GAAY,CAAA,CAClD;;CACM,CAAA,GAChB,oBAAC,cAAD;EAAc,MAAK;EACf,UAAA,qBAAC,QAAD;GAAM,WAAU;GAAhB,UAAA,CACI,oBAAC,QAAD;IAAM,aAAA;IAAW,UAAA;GAAa,CAAA,GAC9B,oBAAC,QAAD;IAAM,aAAA;IAAU,WAAU;IACrB,UAAA;GACC,CAAA,CACJ;;CACI,CAAA,CACT,EAAA,CAAA;AAEjB"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Lar Factory's five kinds of button. A Main action, at most one per area, is filled; a Start is tinted, with the play
3
+ * icon; an Open is outlined, with the thread or pull request icon; an App control has no border and an icon; any Other
4
+ * button is outlined, with no icon. A dialog or a form is an area of its own, so its submit is its Main action. Every
5
+ * kind is the compact 28px Button and keeps its look while disabled.
6
+ */
7
+ export type ButtonKind = 'main' | 'start' | 'open' | 'control' | 'other';
8
+ declare const recipe: {
9
+ readonly main: 'primary';
10
+ readonly start: 'tinted';
11
+ readonly open: 'secondary';
12
+ readonly control: 'quiet';
13
+ readonly other: 'secondary';
14
+ };
15
+ /** Props to spread on the design system's Button for a kind: its recipe, the compact size, and `data-kind`, which
16
+ * names the kind for tests and the board's sheets. A destructive confirm, such as Reset or Abandon, is its
17
+ * area's Main action filled in the danger colour. */
18
+ export declare const buttonKind: <K extends ButtonKind, T extends (K extends 'main' ? 'danger' : never) | undefined = undefined>(kind: K, tone?: T) => {
19
+ variant: T extends 'danger' ? 'destructive' : (typeof recipe)[K];
20
+ compact: boolean;
21
+ 'data-kind': K;
22
+ };
23
+ export {};
24
+ //# sourceMappingURL=ButtonKinds.d.ts.map
@@ -0,0 +1,19 @@
1
+ // src/board/ButtonKinds.ts
2
+ const recipe = {
3
+ main: "primary",
4
+ start: "tinted",
5
+ open: "secondary",
6
+ control: "quiet",
7
+ other: "secondary"
8
+ };
9
+ /** Props to spread on the design system's Button for a kind: its recipe, the compact size, and `data-kind`, which
10
+ * names the kind for tests and the board's sheets. A destructive confirm, such as Reset or Abandon, is its
11
+ * area's Main action filled in the danger colour. */
12
+ const buttonKind = (kind, tone) => ({
13
+ variant: tone ? "destructive" : recipe[kind],
14
+ compact: true,
15
+ "data-kind": kind
16
+ });
17
+ export { buttonKind };
18
+
19
+ //# sourceMappingURL=ButtonKinds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ButtonKinds.js","names":[],"sources":["../../src/board/ButtonKinds.ts"],"sourcesContent":["import type { ButtonProps } from '../actions/Button';\n\n/**\n * Lar Factory's five kinds of button. A Main action, at most one per area, is filled; a Start is tinted, with the play\n * icon; an Open is outlined, with the thread or pull request icon; an App control has no border and an icon; any Other\n * button is outlined, with no icon. A dialog or a form is an area of its own, so its submit is its Main action. Every\n * kind is the compact 28px Button and keeps its look while disabled.\n */\nexport type ButtonKind = 'main' | 'start' | 'open' | 'control' | 'other';\n\nconst recipe = {\n main: 'primary',\n start: 'tinted',\n open: 'secondary',\n control: 'quiet',\n other: 'secondary',\n} as const satisfies Record<ButtonKind, ButtonProps['variant']>;\n\n/** Props to spread on the design system's Button for a kind: its recipe, the compact size, and `data-kind`, which\n * names the kind for tests and the board's sheets. A destructive confirm, such as Reset or Abandon, is its\n * area's Main action filled in the danger colour. */\nexport const buttonKind = <\n K extends ButtonKind,\n T extends (K extends 'main' ? 'danger' : never) | undefined = undefined,\n>(\n kind: K,\n tone?: T,\n) => ({\n variant: (tone ? 'destructive' : recipe[kind]) as T extends 'danger' ? 'destructive' : (typeof recipe)[K],\n compact: true,\n 'data-kind': kind,\n});\n"],"mappings":";AAUA,MAAM,SAAS;CACX,MAAM;CACN,OAAO;CACP,MAAM;CACN,SAAS;CACT,OAAO;AACX;;;;AAKA,MAAa,cAIT,MACA,UACE;CACF,SAAU,OAAO,gBAAgB,OAAO;CACxC,SAAS;CACT,aAAa;AACjB"}
@@ -0,0 +1,8 @@
1
+ /** Each branch with the files and commits deleting it would lose, as a nested bulleted list. */
2
+ export declare function LossList({ branches }: {
3
+ branches: {
4
+ name: string;
5
+ losses: string[];
6
+ }[];
7
+ }): import("react").JSX.Element;
8
+ //# sourceMappingURL=Cleanup.d.ts.map
@@ -0,0 +1,15 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ // src/board/Cleanup.tsx
3
+ /** Each branch with the files and commits deleting it would lose, as a nested bulleted list. */
4
+ function LossList({ branches }) {
5
+ return /* @__PURE__ */ jsx("ul", {
6
+ className: "m-0 list-disc ps-5 wrap-anywhere",
7
+ children: branches.map((branch) => /* @__PURE__ */ jsxs("li", { children: [/* @__PURE__ */ jsx("span", { children: branch.name }), /* @__PURE__ */ jsx("ul", {
8
+ className: "m-0 list-disc ps-5",
9
+ children: branch.losses.map((loss) => /* @__PURE__ */ jsx("li", { children: loss }, loss))
10
+ })] }, branch.name))
11
+ });
12
+ }
13
+ export { LossList };
14
+
15
+ //# sourceMappingURL=Cleanup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Cleanup.js","names":[],"sources":["../../src/board/Cleanup.tsx"],"sourcesContent":["// What removing work's old branches and worktrees would lose, in a confirmation.\n\n/** Each branch with the files and commits deleting it would lose, as a nested bulleted list. */\nexport function LossList({ branches }: { branches: { name: string; losses: string[] }[] }) {\n return (\n <ul className=\"m-0 list-disc ps-5 wrap-anywhere\">\n {branches.map((branch) => (\n <li key={branch.name}>\n <span>{branch.name}</span>\n <ul className=\"m-0 list-disc ps-5\">\n {branch.losses.map((loss) => (\n <li key={loss}>{loss}</li>\n ))}\n </ul>\n </li>\n ))}\n </ul>\n );\n}\n"],"mappings":";;;AAGA,SAAgB,SAAS,EAAE,YAAgE;CACvF,OACI,oBAAC,MAAD;EAAI,WAAU;EACT,UAAA,SAAS,KAAK,WACX,qBAAC,MAAD,EAAA,UAAA,CACI,oBAAC,QAAD,EAAA,UAAO,OAAO,KAAW,CAAA,GACzB,oBAAC,MAAD;GAAI,WAAU;GACT,UAAA,OAAO,OAAO,KAAK,SAChB,oBAAC,MAAD,EAAA,UAAgB,KAAS,GAAhB,IAAgB,CAC5B;EACD,CAAA,CACJ,EAAA,GAPK,OAAO,IAOZ,CACP;CACD,CAAA;AAEZ"}
@@ -0,0 +1,101 @@
1
+ import { ReactNode } from "react";
2
+ /** The title bar's counters, in its status strip after the Refreshed time. */
3
+ export declare function BoardCounters({ children }: {
4
+ children: ReactNode;
5
+ }): import("react").JSX.Element;
6
+ /** How wide a counter's value stays from dash or loader to number: a count, a count over a limit, or a spend under
7
+ * $1,000 with its plus. */
8
+ declare const valueWidths: {
9
+ count: string;
10
+ limit: string;
11
+ spend: string;
12
+ };
13
+ /** Which counters the title bar's width folds away: Shaping and Shipped below 54rem, then Spend below 66rem. */
14
+ declare const folds: {
15
+ never: string;
16
+ medium: string;
17
+ wide: string;
18
+ };
19
+ interface BoardCounterProps {
20
+ /** The status's glyph, in its own colour. */
21
+ icon: ReactNode;
22
+ value: ReactNode;
23
+ width?: keyof typeof valueWidths;
24
+ /** Names the counter for screen readers, with `hint`: "need you: 2 items waiting on your answer". */
25
+ label: string;
26
+ /** What the number means, in the tooltip. */
27
+ hint: string;
28
+ fold?: keyof typeof folds;
29
+ /** The panel's head: its title and, at its right, a figure such as the count. */
30
+ title: string;
31
+ sub?: ReactNode;
32
+ /** A note under the panel's list. */
33
+ foot?: ReactNode;
34
+ /** The panel's list, which scrolls. */
35
+ children: ReactNode;
36
+ }
37
+ /** One counter: an App control with a glyph and a tabular value, its tooltip, and the panel it opens, padded as a
38
+ * menu, of everything behind the number. */
39
+ export declare function BoardCounter({ icon, value, width, label, hint, fold, title, sub, foot, children }: BoardCounterProps): import("react").JSX.Element;
40
+ /** The divider before the spend counter, which folds with it. */
41
+ export declare function CounterDivider(): import("react").JSX.Element;
42
+ /** A panel's list split by status, each part under its name and count. */
43
+ export declare function CounterGroups({ children }: {
44
+ children: ReactNode;
45
+ }): import("react").JSX.Element;
46
+ export declare function CounterGroup({ title, count, children }: {
47
+ title: string;
48
+ count: number;
49
+ children: ReactNode;
50
+ }): import("react").JSX.Element;
51
+ /** What a panel says when its list is empty, or what is still loading. */
52
+ export declare function CounterEmpty({ children }: {
53
+ children: ReactNode;
54
+ }): import("react").JSX.Element;
55
+ export declare function CounterList({ children }: {
56
+ children: ReactNode;
57
+ }): import("react").JSX.Element;
58
+ interface CounterItemProps {
59
+ /** The item's id, as `data-item`. */
60
+ item: string;
61
+ /** The row's accessible name, the item's name. */
62
+ label: string;
63
+ /** The item's status glyph and source icon. */
64
+ leading: ReactNode;
65
+ title: ReactNode;
66
+ /** At the right: CounterAge, or a figure such as its spend. */
67
+ trailing: ReactNode;
68
+ onOpen: () => void;
69
+ }
70
+ /** One item in a panel, as a menu's row; picking it closes the panel and opens the item. */
71
+ export declare function CounterItem({ item, label, leading, title, trailing, onOpen }: CounterItemProps): import("react").JSX.Element;
72
+ /** A row's repository icon and age. */
73
+ export declare function CounterAge({ icon, age }: {
74
+ icon: ReactNode;
75
+ age: string;
76
+ }): import("react").JSX.Element;
77
+ /** A row's figure, such as its spend. */
78
+ export declare function CounterFigure({ children }: {
79
+ children: ReactNode;
80
+ }): import("react").JSX.Element;
81
+ /** A value not known yet, as nothing has been read. */
82
+ export declare function CounterDash(): import("react").JSX.Element;
83
+ /** A count over a limit, such as builds at work over the build limit: "2/3". */
84
+ export declare function CounterOfLimit({ count, limit }: {
85
+ count: ReactNode;
86
+ limit: number;
87
+ }): import("react").JSX.Element;
88
+ /** A figure that covers only part of what it sums, marked with a plus: amber while some of it is unavailable, muted
89
+ * while some is still loading. */
90
+ export declare function CounterPartial({ figure, unavailable }: {
91
+ figure: string;
92
+ unavailable: boolean;
93
+ }): import("react").JSX.Element;
94
+ /** The build limit as bars, then the count over it: one bar per build it allows, filled for each build at work, and
95
+ * extra builds past it after a gap. */
96
+ export declare function LimitBars({ used, limit }: {
97
+ used: number;
98
+ limit: number;
99
+ }): import("react").JSX.Element;
100
+ export {};
101
+ //# sourceMappingURL=Counters.d.ts.map
@@ -0,0 +1,202 @@
1
+ import { Button } from "../actions/Button.js";
2
+ import { Popover } from "../overlays/Popover.js";
3
+ import { Tooltip, TooltipPopup, TooltipTrigger } from "../overlays/Tooltip.js";
4
+ import { buttonKind } from "./ButtonKinds.js";
5
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
+ // src/board/Counters.tsx
7
+ /** The title bar's counters, in its status strip after the Refreshed time. */
8
+ function BoardCounters({ children }) {
9
+ return /* @__PURE__ */ jsx("div", {
10
+ className: "counters flex shrink-0 items-center gap-0.5 whitespace-nowrap",
11
+ children
12
+ });
13
+ }
14
+ /** How wide a counter's value stays from dash or loader to number: a count, a count over a limit, or a spend under
15
+ * $1,000 with its plus. */
16
+ const valueWidths = {
17
+ count: "min-w-[2ch]",
18
+ limit: "min-w-[4ch]",
19
+ spend: "min-w-[8ch]"
20
+ };
21
+ /** Which counters the title bar's width folds away: Shaping and Shipped below 54rem, then Spend below 66rem. */
22
+ const folds = {
23
+ never: "",
24
+ medium: "hidden @min-[54rem]:inline-flex",
25
+ wide: "hidden @min-[66rem]:inline-flex"
26
+ };
27
+ /** One counter: an App control with a glyph and a tabular value, its tooltip, and the panel it opens, padded as a
28
+ * menu, of everything behind the number. */
29
+ function BoardCounter({ icon, value, width = "count", label, hint, fold = "never", title, sub, foot, children }) {
30
+ return /* @__PURE__ */ jsxs(Popover, { children: [/* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, {
31
+ asChild: true,
32
+ children: /* @__PURE__ */ jsx(Popover.Trigger, {
33
+ asChild: true,
34
+ children: /* @__PURE__ */ jsxs(Button, {
35
+ ...buttonKind("control"),
36
+ "aria-label": `${label}: ${hint}`,
37
+ className: `text-base-700 hover:text-base-content data-[state=open]:bg-base-300/60 data-[state=open]:text-base-content min-w-0 gap-1.5 ${folds[fold]}`,
38
+ children: [/* @__PURE__ */ jsx("span", {
39
+ className: "counter-icon grid size-4 shrink-0 place-items-center [&_svg]:size-4",
40
+ children: icon
41
+ }), /* @__PURE__ */ jsx("span", {
42
+ className: `counter-value text-base-content inline-flex items-center leading-4 font-medium tabular-nums [&_[data-loader]]:w-full [&_[data-loader]]:justify-center [&_svg]:size-3 ${valueWidths[width]}`,
43
+ children: value
44
+ })]
45
+ })
46
+ })
47
+ }), /* @__PURE__ */ jsx(TooltipPopup, {
48
+ side: "bottom",
49
+ children: hint
50
+ })] }), /* @__PURE__ */ jsx(Popover.Content, {
51
+ side: "bottom",
52
+ align: "end",
53
+ layout: "fill",
54
+ presentation: "menu",
55
+ children: /* @__PURE__ */ jsxs("div", {
56
+ className: "counter-popup flex max-h-112 min-h-0 w-96 max-w-full flex-col",
57
+ children: [
58
+ /* @__PURE__ */ jsxs("div", {
59
+ className: "counter-head text-base-700 flex h-7 shrink-0 items-center gap-2 px-2 text-xs font-medium",
60
+ children: [/* @__PURE__ */ jsx("span", {
61
+ className: "min-w-0 flex-1 truncate",
62
+ children: title
63
+ }), sub !== void 0 && /* @__PURE__ */ jsx("span", {
64
+ className: "shrink-0 font-normal tabular-nums",
65
+ children: sub
66
+ })]
67
+ }),
68
+ /* @__PURE__ */ jsx("div", {
69
+ className: "min-h-0 flex-1 overflow-y-auto overscroll-contain",
70
+ children
71
+ }),
72
+ foot !== void 0 && /* @__PURE__ */ jsx("div", {
73
+ className: "mt-1 shrink-0 border-t border-(--border) px-2 pt-1.5 pb-1 text-xs text-(--muted-foreground)",
74
+ children: foot
75
+ })
76
+ ]
77
+ })
78
+ })] });
79
+ }
80
+ /** The divider before the spend counter, which folds with it. */
81
+ function CounterDivider() {
82
+ return /* @__PURE__ */ jsx("span", {
83
+ "aria-hidden": "true",
84
+ className: "mx-1 hidden h-4 w-px shrink-0 bg-(--border) @min-[66rem]:block"
85
+ });
86
+ }
87
+ /** A panel's list split by status, each part under its name and count. */
88
+ function CounterGroups({ children }) {
89
+ return /* @__PURE__ */ jsx("div", {
90
+ className: "grid gap-1",
91
+ children
92
+ });
93
+ }
94
+ function CounterGroup({ title, count, children }) {
95
+ return /* @__PURE__ */ jsxs("section", { children: [/* @__PURE__ */ jsxs("h3", {
96
+ className: "m-0 flex h-7 items-center gap-1 px-2 text-xs font-medium text-(--muted-foreground)",
97
+ children: [
98
+ title,
99
+ " ",
100
+ /* @__PURE__ */ jsx("span", {
101
+ className: "tabular-nums",
102
+ children: count
103
+ })
104
+ ]
105
+ }), children] });
106
+ }
107
+ /** What a panel says when its list is empty, or what is still loading. */
108
+ function CounterEmpty({ children }) {
109
+ return /* @__PURE__ */ jsx("p", {
110
+ className: "m-0 flex min-h-20 items-center justify-center px-2 py-4 text-center text-xs text-(--muted-foreground)",
111
+ children
112
+ });
113
+ }
114
+ function CounterList({ children }) {
115
+ return /* @__PURE__ */ jsx("ul", {
116
+ className: "m-0 grid list-none grid-cols-[minmax(0,1fr)] gap-px p-0",
117
+ children
118
+ });
119
+ }
120
+ /** One item in a panel, as a menu's row; picking it closes the panel and opens the item. */
121
+ function CounterItem({ item, label, leading, title, trailing, onOpen }) {
122
+ return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(Popover.Close, {
123
+ asChild: true,
124
+ "aria-label": label,
125
+ children: /* @__PURE__ */ jsxs("button", {
126
+ type: "button",
127
+ onClick: onOpen,
128
+ "data-item": item,
129
+ className: "text-base-content hover:bg-base-200 focus-visible:bg-base-200 flex min-h-7 w-full cursor-default items-center gap-2 rounded-[0.375rem] px-2 py-1 text-left text-sm outline-none max-lg:min-h-11 pointer-coarse:min-h-11",
130
+ children: [
131
+ leading,
132
+ /* @__PURE__ */ jsx("span", {
133
+ className: "min-w-0 flex-1 truncate",
134
+ children: title
135
+ }),
136
+ /* @__PURE__ */ jsx("span", {
137
+ className: "flex shrink-0 items-center gap-1.5 text-[11px] text-(--muted-foreground) tabular-nums",
138
+ children: trailing
139
+ })
140
+ ]
141
+ })
142
+ }) });
143
+ }
144
+ /** A row's repository icon and age. */
145
+ function CounterAge({ icon, age }) {
146
+ return /* @__PURE__ */ jsxs(Fragment, { children: [icon, /* @__PURE__ */ jsx("span", {
147
+ className: "min-w-7 text-right whitespace-nowrap",
148
+ children: age
149
+ })] });
150
+ }
151
+ /** A row's figure, such as its spend. */
152
+ function CounterFigure({ children }) {
153
+ return /* @__PURE__ */ jsx("span", {
154
+ className: "font-medium text-(--foreground)",
155
+ children
156
+ });
157
+ }
158
+ /** A value not known yet, as nothing has been read. */
159
+ function CounterDash() {
160
+ return /* @__PURE__ */ jsx("span", {
161
+ className: "font-normal text-(--muted-foreground)",
162
+ children: "–"
163
+ });
164
+ }
165
+ /** A count over a limit, such as builds at work over the build limit: "2/3". */
166
+ function CounterOfLimit({ count, limit }) {
167
+ return /* @__PURE__ */ jsxs(Fragment, { children: [count, /* @__PURE__ */ jsxs("span", {
168
+ className: "font-normal text-(--muted-foreground)",
169
+ children: ["/", limit]
170
+ })] });
171
+ }
172
+ /** A figure that covers only part of what it sums, marked with a plus: amber while some of it is unavailable, muted
173
+ * while some is still loading. */
174
+ function CounterPartial({ figure, unavailable }) {
175
+ return /* @__PURE__ */ jsxs(Fragment, { children: [figure, /* @__PURE__ */ jsx("span", {
176
+ className: `font-normal ${unavailable ? "text-(--you)" : "text-(--muted-foreground)"}`,
177
+ children: "+"
178
+ })] });
179
+ }
180
+ /** The build limit as bars, then the count over it: one bar per build it allows, filled for each build at work, and
181
+ * extra builds past it after a gap. */
182
+ function LimitBars({ used, limit }) {
183
+ const bar = (n, on) => /* @__PURE__ */ jsx("span", { className: `h-1.5 w-3 rounded-full ${on ? "bg-(--thread)" : "bg-(--border)"}` }, n);
184
+ return /* @__PURE__ */ jsxs("span", {
185
+ className: "inline-flex items-center gap-2",
186
+ children: [
187
+ /* @__PURE__ */ jsxs("span", {
188
+ className: "inline-flex items-center gap-[3px]",
189
+ children: [Array.from({ length: limit }, (_, n) => bar(n, n < used)), used > limit && /* @__PURE__ */ jsx("span", {
190
+ className: "ml-1 inline-flex gap-[3px]",
191
+ children: Array.from({ length: used - limit }, (_, n) => bar(limit + n, true))
192
+ })]
193
+ }),
194
+ used,
195
+ "/",
196
+ limit
197
+ ]
198
+ });
199
+ }
200
+ export { BoardCounter, BoardCounters, CounterAge, CounterDash, CounterDivider, CounterEmpty, CounterFigure, CounterGroup, CounterGroups, CounterItem, CounterList, CounterOfLimit, CounterPartial, LimitBars };
201
+
202
+ //# sourceMappingURL=Counters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Counters.js","names":[],"sources":["../../src/board/Counters.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { Button } from '../actions/Button';\nimport { Popover } from '../overlays/Popover';\nimport { Tooltip, TooltipPopup, TooltipTrigger } from '../overlays/Tooltip';\nimport { buttonKind } from './ButtonKinds';\n\n/** The title bar's counters, in its status strip after the Refreshed time. */\nexport function BoardCounters({ children }: { children: ReactNode }) {\n return <div className=\"counters flex shrink-0 items-center gap-0.5 whitespace-nowrap\">{children}</div>;\n}\n\n/** How wide a counter's value stays from dash or loader to number: a count, a count over a limit, or a spend under\n * $1,000 with its plus. */\nconst valueWidths = { count: 'min-w-[2ch]', limit: 'min-w-[4ch]', spend: 'min-w-[8ch]' };\n\n/** Which counters the title bar's width folds away: Shaping and Shipped below 54rem, then Spend below 66rem. */\nconst folds = { never: '', medium: 'hidden @min-[54rem]:inline-flex', wide: 'hidden @min-[66rem]:inline-flex' };\n\ninterface BoardCounterProps {\n /** The status's glyph, in its own colour. */\n icon: ReactNode;\n value: ReactNode;\n width?: keyof typeof valueWidths;\n /** Names the counter for screen readers, with `hint`: \"need you: 2 items waiting on your answer\". */\n label: string;\n /** What the number means, in the tooltip. */\n hint: string;\n fold?: keyof typeof folds;\n /** The panel's head: its title and, at its right, a figure such as the count. */\n title: string;\n sub?: ReactNode;\n /** A note under the panel's list. */\n foot?: ReactNode;\n /** The panel's list, which scrolls. */\n children: ReactNode;\n}\n\n/** One counter: an App control with a glyph and a tabular value, its tooltip, and the panel it opens, padded as a\n * menu, of everything behind the number. */\nexport function BoardCounter({\n icon,\n value,\n width = 'count',\n label,\n hint,\n fold = 'never',\n title,\n sub,\n foot,\n children,\n}: BoardCounterProps) {\n return (\n <Popover>\n <Tooltip>\n <TooltipTrigger asChild>\n <Popover.Trigger asChild>\n <Button\n {...buttonKind('control')}\n aria-label={`${label}: ${hint}`}\n className={`text-base-700 hover:text-base-content data-[state=open]:bg-base-300/60 data-[state=open]:text-base-content min-w-0 gap-1.5 ${folds[fold]}`}\n >\n <span className=\"counter-icon grid size-4 shrink-0 place-items-center [&_svg]:size-4\">\n {icon}\n </span>\n <span\n className={`counter-value text-base-content inline-flex items-center leading-4 font-medium tabular-nums [&_[data-loader]]:w-full [&_[data-loader]]:justify-center [&_svg]:size-3 ${valueWidths[width]}`}\n >\n {value}\n </span>\n </Button>\n </Popover.Trigger>\n </TooltipTrigger>\n <TooltipPopup side=\"bottom\">{hint}</TooltipPopup>\n </Tooltip>\n <Popover.Content side=\"bottom\" align=\"end\" layout=\"fill\" presentation=\"menu\">\n <div className=\"counter-popup flex max-h-112 min-h-0 w-96 max-w-full flex-col\">\n <div className=\"counter-head text-base-700 flex h-7 shrink-0 items-center gap-2 px-2 text-xs font-medium\">\n <span className=\"min-w-0 flex-1 truncate\">{title}</span>\n {sub !== undefined && <span className=\"shrink-0 font-normal tabular-nums\">{sub}</span>}\n </div>\n <div className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain\">{children}</div>\n {foot !== undefined && (\n <div className=\"mt-1 shrink-0 border-t border-(--border) px-2 pt-1.5 pb-1 text-xs text-(--muted-foreground)\">\n {foot}\n </div>\n )}\n </div>\n </Popover.Content>\n </Popover>\n );\n}\n\n/** The divider before the spend counter, which folds with it. */\nexport function CounterDivider() {\n return <span aria-hidden=\"true\" className=\"mx-1 hidden h-4 w-px shrink-0 bg-(--border) @min-[66rem]:block\" />;\n}\n\n/** A panel's list split by status, each part under its name and count. */\nexport function CounterGroups({ children }: { children: ReactNode }) {\n return <div className=\"grid gap-1\">{children}</div>;\n}\n\nexport function CounterGroup({ title, count, children }: { title: string; count: number; children: ReactNode }) {\n return (\n <section>\n <h3 className=\"m-0 flex h-7 items-center gap-1 px-2 text-xs font-medium text-(--muted-foreground)\">\n {title} <span className=\"tabular-nums\">{count}</span>\n </h3>\n {children}\n </section>\n );\n}\n\n/** What a panel says when its list is empty, or what is still loading. */\nexport function CounterEmpty({ children }: { children: ReactNode }) {\n return (\n <p className=\"m-0 flex min-h-20 items-center justify-center px-2 py-4 text-center text-xs text-(--muted-foreground)\">\n {children}\n </p>\n );\n}\n\nexport function CounterList({ children }: { children: ReactNode }) {\n return <ul className=\"m-0 grid list-none grid-cols-[minmax(0,1fr)] gap-px p-0\">{children}</ul>;\n}\n\ninterface CounterItemProps {\n /** The item's id, as `data-item`. */\n item: string;\n /** The row's accessible name, the item's name. */\n label: string;\n /** The item's status glyph and source icon. */\n leading: ReactNode;\n title: ReactNode;\n /** At the right: CounterAge, or a figure such as its spend. */\n trailing: ReactNode;\n onOpen: () => void;\n}\n\n/** One item in a panel, as a menu's row; picking it closes the panel and opens the item. */\nexport function CounterItem({ item, label, leading, title, trailing, onOpen }: CounterItemProps) {\n return (\n <li>\n <Popover.Close asChild aria-label={label}>\n <button\n type=\"button\"\n onClick={onOpen}\n data-item={item}\n className=\"text-base-content hover:bg-base-200 focus-visible:bg-base-200 flex min-h-7 w-full cursor-default items-center gap-2 rounded-[0.375rem] px-2 py-1 text-left text-sm outline-none max-lg:min-h-11 pointer-coarse:min-h-11\"\n >\n {leading}\n <span className=\"min-w-0 flex-1 truncate\">{title}</span>\n <span className=\"flex shrink-0 items-center gap-1.5 text-[11px] text-(--muted-foreground) tabular-nums\">\n {trailing}\n </span>\n </button>\n </Popover.Close>\n </li>\n );\n}\n\n/** A row's repository icon and age. */\nexport function CounterAge({ icon, age }: { icon: ReactNode; age: string }) {\n return (\n <>\n {icon}\n <span className=\"min-w-7 text-right whitespace-nowrap\">{age}</span>\n </>\n );\n}\n\n/** A row's figure, such as its spend. */\nexport function CounterFigure({ children }: { children: ReactNode }) {\n return <span className=\"font-medium text-(--foreground)\">{children}</span>;\n}\n\n/** A value not known yet, as nothing has been read. */\nexport function CounterDash() {\n return <span className=\"font-normal text-(--muted-foreground)\">–</span>;\n}\n\n/** A count over a limit, such as builds at work over the build limit: \"2/3\". */\nexport function CounterOfLimit({ count, limit }: { count: ReactNode; limit: number }) {\n return (\n <>\n {count}\n <span className=\"font-normal text-(--muted-foreground)\">/{limit}</span>\n </>\n );\n}\n\n/** A figure that covers only part of what it sums, marked with a plus: amber while some of it is unavailable, muted\n * while some is still loading. */\nexport function CounterPartial({ figure, unavailable }: { figure: string; unavailable: boolean }) {\n return (\n <>\n {figure}\n <span className={`font-normal ${unavailable ? 'text-(--you)' : 'text-(--muted-foreground)'}`}>+</span>\n </>\n );\n}\n\n/** The build limit as bars, then the count over it: one bar per build it allows, filled for each build at work, and\n * extra builds past it after a gap. */\nexport function LimitBars({ used, limit }: { used: number; limit: number }) {\n const bar = (n: number, on: boolean) => (\n <span key={n} className={`h-1.5 w-3 rounded-full ${on ? 'bg-(--thread)' : 'bg-(--border)'}`} />\n );\n\n return (\n <span className=\"inline-flex items-center gap-2\">\n <span className=\"inline-flex items-center gap-[3px]\">\n {Array.from({ length: limit }, (_, n) => bar(n, n < used))}\n {used > limit && (\n <span className=\"ml-1 inline-flex gap-[3px]\">\n {Array.from({ length: used - limit }, (_, n) => bar(limit + n, true))}\n </span>\n )}\n </span>\n {used}/{limit}\n </span>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /** The `data-*` attributes a board composition passes on to its root element, which name what it shows for the
2
+ * board's tests and keyboard focus (such as `data-item` or `data-stage`). */
3
+ export type DataAttributes = {
4
+ [name: `data-${string}`]: string | number | boolean | undefined;
5
+ };
6
+ //# sourceMappingURL=DataAttributes.d.ts.map
@@ -0,0 +1,17 @@
1
+ import { ReactNode } from "react";
2
+ /** The Dependencies, one DependencyItem each. */
3
+ export declare function DependencyList({ children }: {
4
+ children: ReactNode;
5
+ }): import("react").JSX.Element;
6
+ /** A Dependency: who owns it and whether it's met, its need, its latest read and evidence, what the board asks about it,
7
+ * and its `action`. */
8
+ export declare function DependencyItem({ id, owner, need, read, evidence, notice, action }: {
9
+ id: string;
10
+ owner: ReactNode;
11
+ need: ReactNode;
12
+ read: ReactNode;
13
+ evidence: ReactNode;
14
+ notice?: ReactNode;
15
+ action: ReactNode;
16
+ }): import("react").JSX.Element;
17
+ //# sourceMappingURL=Dependencies.d.ts.map