@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,115 @@
1
+ import { ROW_OPENS, pickedRow } from "./RowStyles.js";
2
+ import { BookOpenIcon, HammerIcon, ListChecksIcon, MessagesSquareIcon, ShapesIcon } from "lucide-react";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ // src/board/PartsList.tsx
5
+ const KIND_ICON = {
6
+ grill: MessagesSquareIcon,
7
+ prototype: ShapesIcon,
8
+ research: BookOpenIcon,
9
+ task: ListChecksIcon,
10
+ decision: MessagesSquareIcon,
11
+ build: HammerIcon
12
+ };
13
+ /** A part's method or kind with its icon, in the one place and style every dossier surface shows it. */
14
+ function PartKindLabel({ kind, children }) {
15
+ const Icon = KIND_ICON[kind];
16
+ return /* @__PURE__ */ jsxs("span", {
17
+ className: "inline-flex shrink-0 items-center gap-1.5 text-[11px] text-(--muted-foreground)",
18
+ "data-part-kind": true,
19
+ children: [/* @__PURE__ */ jsx(Icon, { className: "size-3.5 shrink-0" }), children]
20
+ });
21
+ }
22
+ /** The parts, in two columns where there's room, then `showDone`, the button that unfolds the done ones. */
23
+ function PartsList({ showDone, children }) {
24
+ return /* @__PURE__ */ jsxs("div", {
25
+ className: "grid gap-1",
26
+ children: [/* @__PURE__ */ jsx("ol", {
27
+ className: "m-0 grid list-none gap-x-4 gap-y-1 p-0 @4xl:grid-cols-2",
28
+ "data-parts-list": true,
29
+ children
30
+ }), showDone]
31
+ });
32
+ }
33
+ /** The button under the parts that shows or hides the done ones. */
34
+ function ShowDoneToggle({ open, onToggle, children }) {
35
+ return /* @__PURE__ */ jsx("button", {
36
+ type: "button",
37
+ "aria-expanded": open,
38
+ onClick: onToggle,
39
+ className: "justify-self-start rounded px-2 py-1 text-[11px] text-(--muted-foreground) hover:bg-(--accent)",
40
+ children
41
+ });
42
+ }
43
+ /**
44
+ * A part: one button opens its item from its `name` and `meta` (kind, repository, track, status), what it asks next
45
+ * (`action`) sits beside that button, then its `second` line (a RowSecondLine) and any `foot`, its start's message or
46
+ * error, under that.
47
+ */
48
+ function PartRow({ id, picked, title, onOpen, name, meta, action, second, foot }) {
49
+ return /* @__PURE__ */ jsxs("li", {
50
+ "data-part": id,
51
+ className: `@container rounded-md px-3 py-2 hover:bg-(--accent) ${pickedRow(picked)}`,
52
+ children: [
53
+ /* @__PURE__ */ jsxs("div", {
54
+ className: "flex items-start gap-x-3",
55
+ children: [/* @__PURE__ */ jsxs("button", {
56
+ type: "button",
57
+ "data-row-open": true,
58
+ onClick: onOpen,
59
+ title,
60
+ className: `grid min-w-0 flex-1 gap-y-1 rounded text-left ${ROW_OPENS}`,
61
+ children: [name, /* @__PURE__ */ jsx("span", {
62
+ className: "flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1 pl-5 text-xs text-(--muted-foreground)",
63
+ "data-part-meta": true,
64
+ children: meta
65
+ })]
66
+ }), /* @__PURE__ */ jsx("span", {
67
+ "data-part-action": true,
68
+ className: "flex min-h-7 shrink-0 items-center justify-end gap-2 text-xs text-(--muted-foreground)",
69
+ children: action
70
+ })]
71
+ }),
72
+ second,
73
+ foot && /* @__PURE__ */ jsx("span", {
74
+ className: "block pt-1 pl-5 empty:hidden",
75
+ children: foot
76
+ })
77
+ ]
78
+ });
79
+ }
80
+ /** A part's stage track in its meta line, at a fixed width so the tracks line up. */
81
+ function PartTrack({ children }) {
82
+ return /* @__PURE__ */ jsx("span", {
83
+ className: "w-28 shrink-0",
84
+ children
85
+ });
86
+ }
87
+ /** What a part waits on, beside its action, truncating. */
88
+ function PartWaits({ children }) {
89
+ return /* @__PURE__ */ jsx("span", {
90
+ className: "max-w-48 truncate",
91
+ title: children,
92
+ children
93
+ });
94
+ }
95
+ /** A part's thread in its second line: its glyph, `name` and `state`; `title` names it in full. */
96
+ function ThreadLine({ glyph, name, state, title }) {
97
+ return /* @__PURE__ */ jsxs("span", {
98
+ className: "flex min-w-0 items-center gap-1.5",
99
+ title,
100
+ children: [
101
+ glyph,
102
+ /* @__PURE__ */ jsx("span", {
103
+ className: "truncate",
104
+ children: name
105
+ }),
106
+ /* @__PURE__ */ jsxs("span", {
107
+ className: "shrink-0",
108
+ children: ["· ", state]
109
+ })
110
+ ]
111
+ });
112
+ }
113
+ export { PartKindLabel, PartRow, PartTrack, PartWaits, PartsList, ShowDoneToggle, ThreadLine };
114
+
115
+ //# sourceMappingURL=PartsList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PartsList.js","names":[],"sources":["../../src/board/PartsList.tsx"],"sourcesContent":["// An expanded dossier's parts list: each part with what it asks next, its stage track, figures, thread and slices, the\n// done parts folded away; and a part's kind as every surface of the dossier names it.\n\nimport { BookOpenIcon, HammerIcon, ListChecksIcon, MessagesSquareIcon, ShapesIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\nimport { pickedRow, ROW_OPENS } from './RowStyles';\n\nconst KIND_ICON = {\n grill: MessagesSquareIcon,\n prototype: ShapesIcon,\n research: BookOpenIcon,\n task: ListChecksIcon,\n decision: MessagesSquareIcon,\n build: HammerIcon,\n} as const;\n\n/** What a dossier's part is: a decision's method, or a build. */\nexport type PartKind = keyof typeof KIND_ICON;\n\n/** A part's method or kind with its icon, in the one place and style every dossier surface shows it. */\nexport function PartKindLabel({ kind, children }: { kind: PartKind; children: ReactNode }) {\n const Icon = KIND_ICON[kind];\n\n return (\n <span\n className=\"inline-flex shrink-0 items-center gap-1.5 text-[11px] text-(--muted-foreground)\"\n data-part-kind\n >\n <Icon className=\"size-3.5 shrink-0\" />\n {children}\n </span>\n );\n}\n\n/** The parts, in two columns where there's room, then `showDone`, the button that unfolds the done ones. */\nexport function PartsList({ showDone, children }: { showDone?: ReactNode; children: ReactNode }) {\n return (\n <div className=\"grid gap-1\">\n <ol className=\"m-0 grid list-none gap-x-4 gap-y-1 p-0 @4xl:grid-cols-2\" data-parts-list>\n {children}\n </ol>\n {showDone}\n </div>\n );\n}\n\n/** The button under the parts that shows or hides the done ones. */\nexport function ShowDoneToggle({\n open,\n onToggle,\n children,\n}: {\n open: boolean;\n onToggle: () => void;\n children: string;\n}) {\n return (\n <button\n type=\"button\"\n aria-expanded={open}\n onClick={onToggle}\n className=\"justify-self-start rounded px-2 py-1 text-[11px] text-(--muted-foreground) hover:bg-(--accent)\"\n >\n {children}\n </button>\n );\n}\n\n/**\n * A part: one button opens its item from its `name` and `meta` (kind, repository, track, status), what it asks next\n * (`action`) sits beside that button, then its `second` line (a RowSecondLine) and any `foot`, its start's message or\n * error, under that.\n */\nexport function PartRow({\n id,\n picked,\n title,\n onOpen,\n name,\n meta,\n action,\n second,\n foot,\n}: {\n id: string;\n picked: boolean;\n title: string;\n onOpen: () => void;\n name: ReactNode;\n meta: ReactNode;\n action: ReactNode;\n second?: ReactNode;\n foot?: ReactNode;\n}) {\n return (\n <li data-part={id} className={`@container rounded-md px-3 py-2 hover:bg-(--accent) ${pickedRow(picked)}`}>\n <div className=\"flex items-start gap-x-3\">\n <button\n type=\"button\"\n data-row-open\n onClick={onOpen}\n title={title}\n className={`grid min-w-0 flex-1 gap-y-1 rounded text-left ${ROW_OPENS}`}\n >\n {name}\n <span\n className=\"flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1 pl-5 text-xs text-(--muted-foreground)\"\n data-part-meta\n >\n {meta}\n </span>\n </button>\n <span\n data-part-action\n className=\"flex min-h-7 shrink-0 items-center justify-end gap-2 text-xs text-(--muted-foreground)\"\n >\n {action}\n </span>\n </div>\n {second}\n {foot && <span className=\"block pt-1 pl-5 empty:hidden\">{foot}</span>}\n </li>\n );\n}\n\n/** A part's stage track in its meta line, at a fixed width so the tracks line up. */\nexport function PartTrack({ children }: { children: ReactNode }) {\n return <span className=\"w-28 shrink-0\">{children}</span>;\n}\n\n/** What a part waits on, beside its action, truncating. */\nexport function PartWaits({ children }: { children: string }) {\n return (\n <span className=\"max-w-48 truncate\" title={children}>\n {children}\n </span>\n );\n}\n\n/** A part's thread in its second line: its glyph, `name` and `state`; `title` names it in full. */\nexport function ThreadLine({\n glyph,\n name,\n state,\n title,\n}: {\n glyph: ReactNode;\n name: string;\n state: string;\n title?: string | undefined;\n}) {\n return (\n <span className=\"flex min-w-0 items-center gap-1.5\" title={title}>\n {glyph}\n <span className=\"truncate\">{name}</span>\n <span className=\"shrink-0\">· {state}</span>\n </span>\n );\n}\n"],"mappings":";;;;AAQA,MAAM,YAAY;CACd,OAAO;CACP,WAAW;CACX,UAAU;CACV,MAAM;CACN,UAAU;CACV,OAAO;AACX;;AAMA,SAAgB,cAAc,EAAE,MAAM,YAAqD;CACvF,MAAM,OAAO,UAAU;CAEvB,OACI,qBAAC,QAAD;EACI,WAAU;EACV,kBAAA;EAFJ,UAAA,CAII,oBAAC,MAAD,EAAM,WAAU,oBAAqB,CAAA,GACpC,QACC;;AAEd;;AAGA,SAAgB,UAAU,EAAE,UAAU,YAA2D;CAC7F,OACI,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACI,oBAAC,MAAD;GAAI,WAAU;GAA0D,mBAAA;GACnE;EACD,CAAA,GACH,QACA;;AAEb;;AAGA,SAAgB,eAAe,EAC3B,MACA,UACA,YAKD;CACC,OACI,oBAAC,UAAD;EACI,MAAK;EACL,iBAAe;EACf,SAAS;EACT,WAAU;EAET;CACG,CAAA;AAEhB;;;;;;AAOA,SAAgB,QAAQ,EACpB,IACA,QACA,OACA,QACA,MACA,MACA,QACA,QACA,QAWD;CACC,OACI,qBAAC,MAAD;EAAI,aAAW;EAAI,WAAW,uDAAuD,UAAU,MAAM;EAArG,UAAA;GACI,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACI,qBAAC,UAAD;KACI,MAAK;KACL,iBAAA;KACA,SAAS;KACF;KACP,WAAW,iDAAiD;KALhE,UAAA,CAOK,MACD,oBAAC,QAAD;MACI,WAAU;MACV,kBAAA;MAEC,UAAA;KACC,CAAA,CACF;IACR,CAAA,GAAA,oBAAC,QAAD;KACI,oBAAA;KACA,WAAU;KAET,UAAA;IACC,CAAA,CACL;;GACJ;GACA,QAAQ,oBAAC,QAAD;IAAM,WAAU;IAAgC,UAAA;GAAW,CAAA;EACpE;;AAEZ;;AAGA,SAAgB,UAAU,EAAE,YAAqC;CAC7D,OAAO,oBAAC,QAAD;EAAM,WAAU;EAAiB;CAAe,CAAA;AAC3D;;AAGA,SAAgB,UAAU,EAAE,YAAkC;CAC1D,OACI,oBAAC,QAAD;EAAM,WAAU;EAAoB,OAAO;EACtC;CACC,CAAA;AAEd;;AAGA,SAAgB,WAAW,EACvB,OACA,MACA,OACA,SAMD;CACC,OACI,qBAAC,QAAD;EAAM,WAAU;EAA2C;EAA3D,UAAA;GACK;GACD,oBAAC,QAAD;IAAM,WAAU;IAAY,UAAA;GAAW,CAAA;GACvC,qBAAC,QAAD;IAAM,WAAU;IAAhB,UAAA,CAA2B,MAAG,KAAY;;EACxC;;AAEd"}
@@ -0,0 +1,51 @@
1
+ import { DataAttributes } from "./DataAttributes.js";
2
+ /** T3's project icon colours, which tint a lucide icon or a monogram. */
3
+ export type ProjectIconColor = 'gray' | 'red' | 'orange' | 'amber' | 'yellow' | 'lime' | 'green' | 'emerald' | 'teal' | 'cyan' | 'sky' | 'blue' | 'indigo' | 'violet' | 'purple' | 'fuchsia' | 'pink' | 'rose';
4
+ /** What a project's square shows over its initial: a lucide icon by name, an emoji, up to two characters of a
5
+ * monogram, or a favicon at `src`. */
6
+ export type ProjectIconSource = {
7
+ kind: 'lucide';
8
+ name: string;
9
+ color: ProjectIconColor;
10
+ } | {
11
+ kind: 'emoji';
12
+ emoji: string;
13
+ } | {
14
+ kind: 'monogram';
15
+ text: string;
16
+ color: ProjectIconColor;
17
+ } | {
18
+ kind: 'favicon';
19
+ src: string;
20
+ };
21
+ declare const SIZES: {
22
+ small: {
23
+ square: string;
24
+ emoji: string;
25
+ monogram: string;
26
+ };
27
+ row: {
28
+ square: string;
29
+ emoji: string;
30
+ monogram: string;
31
+ };
32
+ medium: {
33
+ square: string;
34
+ emoji: string;
35
+ monogram: string;
36
+ };
37
+ };
38
+ export type ProjectIconSize = keyof typeof SIZES;
39
+ /**
40
+ * A project's icon in a square of its `size`: `icon`, or its `name`'s initial on the colour of its `place` among the
41
+ * board's repositories (muted for a project the board doesn't list), with a favicon or lucide icon laid over the
42
+ * initial once it has loaded.
43
+ */
44
+ export declare function ProjectIcon({ icon, name, place, size, ...data }: {
45
+ icon?: ProjectIconSource | null | undefined;
46
+ name: string;
47
+ place?: number | undefined;
48
+ size: ProjectIconSize;
49
+ } & DataAttributes): import("react").JSX.Element;
50
+ export {};
51
+ //# sourceMappingURL=ProjectIcon.d.ts.map
@@ -0,0 +1,120 @@
1
+ import { Suspense, lazy, useState } from "react";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ // src/board/ProjectIcon.tsx
4
+ /** The board's palette of repository colours, which the repositories take in their list order. */
5
+ const REPO_TONES = 8;
6
+ const SIZES = {
7
+ small: {
8
+ square: "size-3.5 text-[8px]",
9
+ emoji: "text-[10px]",
10
+ monogram: "text-[7px]"
11
+ },
12
+ row: {
13
+ square: "size-4 text-[9px]",
14
+ emoji: "text-xs",
15
+ monogram: "text-[8px]"
16
+ },
17
+ medium: {
18
+ square: "size-5 text-[10px]",
19
+ emoji: "text-sm",
20
+ monogram: "text-[10px]"
21
+ }
22
+ };
23
+ /** Whole class names, as Tailwind only finds those. */
24
+ const COLORS = {
25
+ gray: "text-gray-500",
26
+ red: "text-red-500",
27
+ orange: "text-orange-500",
28
+ amber: "text-amber-500",
29
+ yellow: "text-yellow-500",
30
+ lime: "text-lime-500",
31
+ green: "text-green-500",
32
+ emerald: "text-emerald-500",
33
+ teal: "text-teal-500",
34
+ cyan: "text-cyan-500",
35
+ sky: "text-sky-500",
36
+ blue: "text-blue-500",
37
+ indigo: "text-indigo-500",
38
+ violet: "text-violet-500",
39
+ purple: "text-purple-500",
40
+ fuchsia: "text-fuchsia-500",
41
+ pink: "text-pink-500",
42
+ rose: "text-rose-500"
43
+ };
44
+ const OVERLAY = "absolute inset-0 size-full bg-base-100";
45
+ /** lucide's name map and its icons are lazy chunks, loaded when first shown. DynamicIcon draws nothing for a name
46
+ * lucide lacks or an icon that won't load, and a name map that won't load draws nothing here. */
47
+ const LucideIcon = lazy(() => import("../icons/dynamic.js").then((lucide) => ({ default: lucide.DynamicIcon }), () => ({ default: () => null })));
48
+ function Favicon({ src }) {
49
+ const [loaded, setLoaded] = useState(false);
50
+ const [failed, setFailed] = useState(false);
51
+ if (failed) return null;
52
+ return /* @__PURE__ */ jsx("img", {
53
+ src,
54
+ alt: "",
55
+ hidden: !loaded,
56
+ onLoad: () => setLoaded(true),
57
+ onError: () => setFailed(true),
58
+ className: `${OVERLAY} object-contain`
59
+ });
60
+ }
61
+ const graphemes = new Intl.Segmenter();
62
+ const firstGraphemes = (text, count) => {
63
+ let shown = "";
64
+ let length = 0;
65
+ for (const { segment } of graphemes.segment(text)) {
66
+ shown += segment;
67
+ if (++length === count) break;
68
+ }
69
+ return shown;
70
+ };
71
+ /**
72
+ * A project's icon in a square of its `size`: `icon`, or its `name`'s initial on the colour of its `place` among the
73
+ * board's repositories (muted for a project the board doesn't list), with a favicon or lucide icon laid over the
74
+ * initial once it has loaded.
75
+ */
76
+ function ProjectIcon({ icon, name, place, size, ...data }) {
77
+ const { square, emoji, monogram } = SIZES[size];
78
+ const shared = `${square} relative grid shrink-0 place-items-center overflow-hidden rounded-md font-bold`;
79
+ if (icon?.kind === "emoji") return /* @__PURE__ */ jsx("span", {
80
+ ...data,
81
+ "data-project-icon": true,
82
+ className: shared,
83
+ "aria-hidden": "true",
84
+ children: /* @__PURE__ */ jsx("span", {
85
+ className: emoji,
86
+ children: icon.emoji
87
+ })
88
+ });
89
+ if (icon?.kind === "monogram") return /* @__PURE__ */ jsx("span", {
90
+ ...data,
91
+ "data-project-icon": true,
92
+ className: `${shared} ${COLORS[icon.color]}`,
93
+ "aria-hidden": "true",
94
+ children: /* @__PURE__ */ jsx("span", {
95
+ className: `${monogram} leading-none whitespace-nowrap`,
96
+ children: firstGraphemes(icon.text, 2)
97
+ })
98
+ });
99
+ const tone = place === void 0 ? "repo-tone-none" : `repo-tone-${place % REPO_TONES}`;
100
+ return /* @__PURE__ */ jsxs("span", {
101
+ ...data,
102
+ "data-project-icon": true,
103
+ className: `${tone} ${shared} bg-[var(--k,var(--color-base-600))] text-white`,
104
+ "aria-hidden": "true",
105
+ children: [
106
+ firstGraphemes(name, 1).toUpperCase(),
107
+ icon?.kind === "favicon" && /* @__PURE__ */ jsx(Favicon, { src: icon.src }, icon.src),
108
+ icon?.kind === "lucide" && /* @__PURE__ */ jsx(Suspense, {
109
+ fallback: null,
110
+ children: /* @__PURE__ */ jsx(LucideIcon, {
111
+ name: icon.name,
112
+ className: `${OVERLAY} ${COLORS[icon.color]}`
113
+ }, icon.name)
114
+ })
115
+ ]
116
+ });
117
+ }
118
+ export { ProjectIcon };
119
+
120
+ //# sourceMappingURL=ProjectIcon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectIcon.js","names":[],"sources":["../../src/board/ProjectIcon.tsx"],"sourcesContent":["// A project's icon, in a fixed square. An emoji or monogram chosen in T3 takes the square. Otherwise it holds the\n// toned initial, with the favicon or lucide icon laid over it once that has loaded, so the square keeps its size either\n// way and a missing or broken one leaves the initial. Decorative, as a name sits beside it. An SVG favicon only ever\n// renders through this <img>, which runs none of its scripts.\n\nimport { lazy, Suspense, useState, type ComponentProps, type ComponentType } from 'react';\n\nimport type { DynamicIcon } from '../icons/dynamic';\nimport type { DataAttributes } from './DataAttributes';\n\n/** T3's project icon colours, which tint a lucide icon or a monogram. */\nexport type ProjectIconColor =\n | 'gray'\n | 'red'\n | 'orange'\n | 'amber'\n | 'yellow'\n | 'lime'\n | 'green'\n | 'emerald'\n | 'teal'\n | 'cyan'\n | 'sky'\n | 'blue'\n | 'indigo'\n | 'violet'\n | 'purple'\n | 'fuchsia'\n | 'pink'\n | 'rose';\n\n/** What a project's square shows over its initial: a lucide icon by name, an emoji, up to two characters of a\n * monogram, or a favicon at `src`. */\nexport type ProjectIconSource =\n | { kind: 'lucide'; name: string; color: ProjectIconColor }\n | { kind: 'emoji'; emoji: string }\n | { kind: 'monogram'; text: string; color: ProjectIconColor }\n | { kind: 'favicon'; src: string };\n\n/** The board's palette of repository colours, which the repositories take in their list order. */\nconst REPO_TONES = 8;\n\nconst SIZES = {\n small: { square: 'size-3.5 text-[8px]', emoji: 'text-[10px]', monogram: 'text-[7px]' },\n row: { square: 'size-4 text-[9px]', emoji: 'text-xs', monogram: 'text-[8px]' },\n medium: { square: 'size-5 text-[10px]', emoji: 'text-sm', monogram: 'text-[10px]' },\n};\n\nexport type ProjectIconSize = keyof typeof SIZES;\n\n/** Whole class names, as Tailwind only finds those. */\nconst COLORS: Record<ProjectIconColor, string> = {\n gray: 'text-gray-500',\n red: 'text-red-500',\n orange: 'text-orange-500',\n amber: 'text-amber-500',\n yellow: 'text-yellow-500',\n lime: 'text-lime-500',\n green: 'text-green-500',\n emerald: 'text-emerald-500',\n teal: 'text-teal-500',\n cyan: 'text-cyan-500',\n sky: 'text-sky-500',\n blue: 'text-blue-500',\n indigo: 'text-indigo-500',\n violet: 'text-violet-500',\n purple: 'text-purple-500',\n fuchsia: 'text-fuchsia-500',\n pink: 'text-pink-500',\n rose: 'text-rose-500',\n};\n\nconst OVERLAY = 'absolute inset-0 size-full bg-base-100';\n\n/** lucide's name map and its icons are lazy chunks, loaded when first shown. DynamicIcon draws nothing for a name\n * lucide lacks or an icon that won't load, and a name map that won't load draws nothing here. */\nconst LucideIcon = lazy<ComponentType<ComponentProps<typeof DynamicIcon>>>(() =>\n import('../icons/dynamic').then(\n (lucide) => ({ default: lucide.DynamicIcon }),\n () => ({ default: () => null }),\n ),\n);\n\nfunction Favicon({ src }: { src: string }) {\n const [loaded, setLoaded] = useState(false);\n const [failed, setFailed] = useState(false);\n\n if (failed) return null;\n\n return (\n <img\n src={src}\n alt=\"\"\n hidden={!loaded}\n onLoad={() => setLoaded(true)}\n onError={() => setFailed(true)}\n className={`${OVERLAY} object-contain`}\n />\n );\n}\n\nconst graphemes = new Intl.Segmenter();\nconst firstGraphemes = (text: string, count: number) => {\n let shown = '';\n let length = 0;\n\n for (const { segment } of graphemes.segment(text)) {\n shown += segment;\n\n if (++length === count) break;\n }\n\n return shown;\n};\n\n/**\n * A project's icon in a square of its `size`: `icon`, or its `name`'s initial on the colour of its `place` among the\n * board's repositories (muted for a project the board doesn't list), with a favicon or lucide icon laid over the\n * initial once it has loaded.\n */\nexport function ProjectIcon({\n icon,\n name,\n place,\n size,\n ...data\n}: {\n icon?: ProjectIconSource | null | undefined;\n name: string;\n place?: number | undefined;\n size: ProjectIconSize;\n} & DataAttributes) {\n const { square, emoji, monogram } = SIZES[size];\n const shared = `${square} relative grid shrink-0 place-items-center overflow-hidden rounded-md font-bold`;\n\n if (icon?.kind === 'emoji')\n return (\n <span {...data} data-project-icon className={shared} aria-hidden=\"true\">\n <span className={emoji}>{icon.emoji}</span>\n </span>\n );\n\n if (icon?.kind === 'monogram')\n return (\n <span {...data} data-project-icon className={`${shared} ${COLORS[icon.color]}`} aria-hidden=\"true\">\n <span className={`${monogram} leading-none whitespace-nowrap`}>{firstGraphemes(icon.text, 2)}</span>\n </span>\n );\n\n const tone = place === undefined ? 'repo-tone-none' : `repo-tone-${place % REPO_TONES}`;\n\n return (\n <span\n {...data}\n data-project-icon\n className={`${tone} ${shared} bg-[var(--k,var(--color-base-600))] text-white`}\n aria-hidden=\"true\"\n >\n {firstGraphemes(name, 1).toUpperCase()}\n {icon?.kind === 'favicon' && <Favicon key={icon.src} src={icon.src} />}\n {icon?.kind === 'lucide' && (\n <Suspense fallback={null}>\n <LucideIcon\n key={icon.name}\n name={icon.name as ComponentProps<typeof DynamicIcon>['name']}\n className={`${OVERLAY} ${COLORS[icon.color]}`}\n />\n </Suspense>\n )}\n </span>\n );\n}\n"],"mappings":";;;;AAwCA,MAAM,aAAa;AAEnB,MAAM,QAAQ;CACV,OAAO;EAAE,QAAQ;EAAuB,OAAO;EAAe,UAAU;CAAa;CACrF,KAAK;EAAE,QAAQ;EAAqB,OAAO;EAAW,UAAU;CAAa;CAC7E,QAAQ;EAAE,QAAQ;EAAsB,OAAO;EAAW,UAAU;CAAc;AACtF;;AAKA,MAAM,SAA2C;CAC7C,MAAM;CACN,KAAK;CACL,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,MAAM;CACN,OAAO;CACP,SAAS;CACT,MAAM;CACN,MAAM;CACN,KAAK;CACL,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,MAAM;CACN,MAAM;AACV;AAEA,MAAM,UAAU;;;AAIhB,MAAM,aAAa,WACf,OAAO,sBAAmB,CAAC,MACtB,YAAY,EAAE,SAAS,OAAO,YAAY,WACpC,EAAE,eAAe,KAAK,EACjC,CACJ;AAEA,SAAS,QAAQ,EAAE,OAAwB;CACvC,MAAM,CAAC,QAAQ,aAAa,SAAS,KAAK;CAC1C,MAAM,CAAC,QAAQ,aAAa,SAAS,KAAK;CAE1C,IAAI,QAAQ,OAAO;CAEnB,OACI,oBAAC,OAAD;EACS;EACL,KAAI;EACJ,QAAQ,CAAC;EACT,cAAc,UAAU,IAAI;EAC5B,eAAe,UAAU,IAAI;EAC7B,WAAW,GAAG,QAAQ;CACzB,CAAA;AAET;AAEA,MAAM,YAAY,IAAI,KAAK,UAAU;AACrC,MAAM,kBAAkB,MAAc,UAAkB;CACpD,IAAI,QAAQ;CACZ,IAAI,SAAS;CAEb,KAAK,MAAM,EAAE,aAAa,UAAU,QAAQ,IAAI,GAAG;EAC/C,SAAS;EAET,IAAI,EAAE,WAAW,OAAO;CAC5B;CAEA,OAAO;AACX;;;;;;AAOA,SAAgB,YAAY,EACxB,MACA,MACA,OACA,MACA,GAAG,QAMa;CAChB,MAAM,EAAE,QAAQ,OAAO,aAAa,MAAM;CAC1C,MAAM,SAAS,GAAG,OAAO;CAEzB,IAAI,MAAM,SAAS,SACf,OACI,oBAAC,QAAD;EAAM,GAAI;EAAM,qBAAA;EAAkB,WAAW;EAAQ,eAAY;EAC7D,UAAA,oBAAC,QAAD;GAAM,WAAW;GAAQ,UAAA,KAAK;EAAY,CAAA;CACxC,CAAA;CAGd,IAAI,MAAM,SAAS,YACf,OACI,oBAAC,QAAD;EAAM,GAAI;EAAM,qBAAA;EAAkB,WAAW,GAAG,OAAO,GAAG,OAAO,KAAK;EAAU,eAAY;EACxF,UAAA,oBAAC,QAAD;GAAM,WAAW,GAAG,SAAS;GAAmC,UAAA,eAAe,KAAK,MAAM,CAAC;EAAQ,CAAA;CACjG,CAAA;CAGd,MAAM,OAAO,UAAU,KAAA,IAAY,mBAAmB,aAAa,QAAQ;CAE3E,OACI,qBAAC,QAAD;EACI,GAAI;EACJ,qBAAA;EACA,WAAW,GAAG,KAAK,GAAG,OAAO;EAC7B,eAAY;EAJhB,UAAA;GAMK,eAAe,MAAM,CAAC,CAAC,CAAC,YAAY;GACpC,MAAM,SAAS,aAAa,oBAAC,SAAD,EAAwB,KAAK,KAAK,IAAM,GAA1B,KAAK,GAAqB;GACpE,MAAM,SAAS,YACZ,oBAAC,UAAD;IAAU,UAAU;IAChB,UAAA,oBAAC,YAAD;KAEI,MAAM,KAAK;KACX,WAAW,GAAG,QAAQ,GAAG,OAAO,KAAK;IACxC,GAHQ,KAAK,IAGb;GACK,CAAA;EAEZ;;AAEd"}
@@ -0,0 +1,43 @@
1
+ import { ReactNode } from "react";
2
+ /** The pull requests in a list, one PullRequestRow each. */
3
+ export declare function PullRequestList({ children }: {
4
+ children: ReactNode;
5
+ }): import("react").JSX.Element;
6
+ /** A pull request: its icon and label linking to it in a new tab, then its `checks` and `readiness`. */
7
+ export declare function PullRequestRow({ href, label, checks, readiness }: {
8
+ href: string;
9
+ label: string;
10
+ checks?: ReactNode;
11
+ readiness?: ReactNode;
12
+ }): import("react").JSX.Element;
13
+ declare const CHECKS_COLOR: {
14
+ readonly failed: 'var(--error)';
15
+ readonly running: 'var(--warning)';
16
+ readonly passed: 'var(--st-done)';
17
+ };
18
+ /** A pull request's checks as a coloured dot and their state, then any `counts`. */
19
+ export declare function ChecksState({ state, counts }: {
20
+ state: keyof typeof CHECKS_COLOR;
21
+ counts?: string;
22
+ }): import("react").JSX.Element;
23
+ /** A pull request as a row names it: its icon and short label, `title` naming it in full. */
24
+ export declare function PullRequestRef({ label, title }: {
25
+ label: string;
26
+ title?: string;
27
+ }): import("react").JSX.Element;
28
+ /** A pull request's readiness under its row: the `toggle` that shows it, then the `details` while shown. */
29
+ export declare function PullRequestReadiness({ toggle, details }: {
30
+ toggle: ReactNode;
31
+ details?: ReactNode;
32
+ }): import("react").JSX.Element;
33
+ /** What a readiness read says: its `status`, when it was `observed` and what blocks it, a `note`, and `refresh`. */
34
+ export declare function ReadinessDetails({ id, status, observed, blockers, note, refresh }: {
35
+ id: string;
36
+ status: ReactNode;
37
+ observed?: ReactNode;
38
+ blockers?: string[];
39
+ note: ReactNode;
40
+ refresh: ReactNode;
41
+ }): import("react").JSX.Element;
42
+ export {};
43
+ //# sourceMappingURL=PullRequests.d.ts.map
@@ -0,0 +1,83 @@
1
+ import { GitPullRequestIcon } from "lucide-react";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ // src/board/PullRequests.tsx
4
+ /** The pull requests in a list, one PullRequestRow each. */
5
+ function PullRequestList({ children }) {
6
+ return /* @__PURE__ */ jsx("ul", {
7
+ className: "m-0 grid list-none grid-cols-[minmax(0,1fr)] gap-1 p-0",
8
+ children
9
+ });
10
+ }
11
+ /** A pull request: its icon and label linking to it in a new tab, then its `checks` and `readiness`. */
12
+ function PullRequestRow({ href, label, checks, readiness }) {
13
+ return /* @__PURE__ */ jsxs("li", {
14
+ className: "flex flex-wrap items-center gap-x-2 gap-y-1 rounded-lg border border-(--border) bg-(--card) px-3 py-2",
15
+ children: [
16
+ /* @__PURE__ */ jsx(GitPullRequestIcon, { className: "size-4 shrink-0 text-(--st-done)" }),
17
+ /* @__PURE__ */ jsx("a", {
18
+ href,
19
+ target: "_blank",
20
+ rel: "noopener",
21
+ className: "min-w-0 flex-1 basis-24 font-medium wrap-anywhere hover:underline",
22
+ children: label
23
+ }),
24
+ checks,
25
+ readiness
26
+ ]
27
+ });
28
+ }
29
+ const CHECKS_COLOR = {
30
+ failed: "var(--error)",
31
+ running: "var(--warning)",
32
+ passed: "var(--st-done)"
33
+ };
34
+ /** A pull request's checks as a coloured dot and their state, then any `counts`. */
35
+ function ChecksState({ state, counts }) {
36
+ return /* @__PURE__ */ jsxs("span", {
37
+ className: "inline-flex shrink-0 items-center gap-1.5 text-xs text-(--muted-foreground)",
38
+ children: [
39
+ /* @__PURE__ */ jsx("span", {
40
+ className: "size-2 rounded-full",
41
+ style: { background: CHECKS_COLOR[state] }
42
+ }),
43
+ "checks ",
44
+ state,
45
+ counts && /* @__PURE__ */ jsxs("span", {
46
+ className: "tabular-nums",
47
+ children: ["· ", counts]
48
+ })
49
+ ]
50
+ });
51
+ }
52
+ /** A pull request as a row names it: its icon and short label, `title` naming it in full. */
53
+ function PullRequestRef({ label, title }) {
54
+ return /* @__PURE__ */ jsxs("span", {
55
+ title,
56
+ className: "inline-flex shrink-0 items-center gap-1",
57
+ children: [/* @__PURE__ */ jsx(GitPullRequestIcon, { className: "size-3 shrink-0 text-(--st-done)" }), label]
58
+ });
59
+ }
60
+ /** A pull request's readiness under its row: the `toggle` that shows it, then the `details` while shown. */
61
+ function PullRequestReadiness({ toggle, details }) {
62
+ return /* @__PURE__ */ jsxs("div", {
63
+ className: "basis-full text-xs text-(--muted-foreground)",
64
+ children: [toggle, details]
65
+ });
66
+ }
67
+ /** What a readiness read says: its `status`, when it was `observed` and what blocks it, a `note`, and `refresh`. */
68
+ function ReadinessDetails({ id, status, observed, blockers = [], note, refresh }) {
69
+ return /* @__PURE__ */ jsxs("div", {
70
+ id,
71
+ role: "status",
72
+ "aria-live": "polite",
73
+ children: [
74
+ /* @__PURE__ */ jsx("p", { children: status }),
75
+ observed && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("p", { children: observed }), /* @__PURE__ */ jsx("ul", { children: blockers.map((b) => /* @__PURE__ */ jsx("li", { children: b }, b)) })] }),
76
+ /* @__PURE__ */ jsx("p", { children: note }),
77
+ refresh
78
+ ]
79
+ });
80
+ }
81
+ export { ChecksState, PullRequestList, PullRequestReadiness, PullRequestRef, PullRequestRow, ReadinessDetails };
82
+
83
+ //# sourceMappingURL=PullRequests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PullRequests.js","names":[],"sources":["../../src/board/PullRequests.tsx"],"sourcesContent":["// A piece of work's pull requests: a list with each one's checks and readiness, and the short reference rows show.\n\nimport { GitPullRequestIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\n\n/** The pull requests in a list, one PullRequestRow each. */\nexport function PullRequestList({ children }: { children: ReactNode }) {\n return <ul className=\"m-0 grid list-none grid-cols-[minmax(0,1fr)] gap-1 p-0\">{children}</ul>;\n}\n\n/** A pull request: its icon and label linking to it in a new tab, then its `checks` and `readiness`. */\nexport function PullRequestRow({\n href,\n label,\n checks,\n readiness,\n}: {\n href: string;\n label: string;\n checks?: ReactNode;\n readiness?: ReactNode;\n}) {\n return (\n <li className=\"flex flex-wrap items-center gap-x-2 gap-y-1 rounded-lg border border-(--border) bg-(--card) px-3 py-2\">\n <GitPullRequestIcon className=\"size-4 shrink-0 text-(--st-done)\" />\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener\"\n className=\"min-w-0 flex-1 basis-24 font-medium wrap-anywhere hover:underline\"\n >\n {label}\n </a>\n {checks}\n {readiness}\n </li>\n );\n}\n\nconst CHECKS_COLOR = { failed: 'var(--error)', running: 'var(--warning)', passed: 'var(--st-done)' } as const;\n\n/** A pull request's checks as a coloured dot and their state, then any `counts`. */\nexport function ChecksState({ state, counts }: { state: keyof typeof CHECKS_COLOR; counts?: string }) {\n return (\n <span className=\"inline-flex shrink-0 items-center gap-1.5 text-xs text-(--muted-foreground)\">\n <span className=\"size-2 rounded-full\" style={{ background: CHECKS_COLOR[state] }} />\n checks {state}\n {counts && <span className=\"tabular-nums\">· {counts}</span>}\n </span>\n );\n}\n\n/** A pull request as a row names it: its icon and short label, `title` naming it in full. */\nexport function PullRequestRef({ label, title }: { label: string; title?: string }) {\n return (\n <span title={title} className=\"inline-flex shrink-0 items-center gap-1\">\n <GitPullRequestIcon className=\"size-3 shrink-0 text-(--st-done)\" />\n {label}\n </span>\n );\n}\n\n/** A pull request's readiness under its row: the `toggle` that shows it, then the `details` while shown. */\nexport function PullRequestReadiness({ toggle, details }: { toggle: ReactNode; details?: ReactNode }) {\n return (\n <div className=\"basis-full text-xs text-(--muted-foreground)\">\n {toggle}\n {details}\n </div>\n );\n}\n\n/** What a readiness read says: its `status`, when it was `observed` and what blocks it, a `note`, and `refresh`. */\nexport function ReadinessDetails({\n id,\n status,\n observed,\n blockers = [],\n note,\n refresh,\n}: {\n id: string;\n status: ReactNode;\n observed?: ReactNode;\n blockers?: string[];\n note: ReactNode;\n refresh: ReactNode;\n}) {\n return (\n <div id={id} role=\"status\" aria-live=\"polite\">\n <p>{status}</p>\n {observed && (\n <>\n <p>{observed}</p>\n <ul>\n {blockers.map((b) => (\n <li key={b}>{b}</li>\n ))}\n </ul>\n </>\n )}\n <p>{note}</p>\n {refresh}\n </div>\n );\n}\n"],"mappings":";;;;AAMA,SAAgB,gBAAgB,EAAE,YAAqC;CACnE,OAAO,oBAAC,MAAD;EAAI,WAAU;EAA0D;CAAa,CAAA;AAChG;;AAGA,SAAgB,eAAe,EAC3B,MACA,OACA,QACA,aAMD;CACC,OACI,qBAAC,MAAD;EAAI,WAAU;EAAd,UAAA;GACI,oBAAC,oBAAD,EAAoB,WAAU,mCAAoC,CAAA;GAClE,oBAAC,KAAD;IACU;IACN,QAAO;IACP,KAAI;IACJ,WAAU;IAET,UAAA;GACF,CAAA;GACF;GACA;EACD;;AAEZ;AAEA,MAAM,eAAe;CAAE,QAAQ;CAAgB,SAAS;CAAkB,QAAQ;AAAiB;;AAGnG,SAAgB,YAAY,EAAE,OAAO,UAAiE;CAClG,OACI,qBAAC,QAAD;EAAM,WAAU;EAAhB,UAAA;GACI,oBAAC,QAAD;IAAM,WAAU;IAAsB,OAAO,EAAE,YAAY,aAAa,OAAO;GAAI,CAAA;GAAC;GAC5E;GACP,UAAU,qBAAC,QAAD;IAAM,WAAU;IAAhB,UAAA,CAA+B,MAAG,MAAa;;EACxD;;AAEd;;AAGA,SAAgB,eAAe,EAAE,OAAO,SAA4C;CAChF,OACI,qBAAC,QAAD;EAAa;EAAO,WAAU;EAA9B,UAAA,CACI,oBAAC,oBAAD,EAAoB,WAAU,mCAAoC,CAAA,GACjE,KACC;;AAEd;;AAGA,SAAgB,qBAAqB,EAAE,QAAQ,WAAuD;CAClG,OACI,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACK,QACA,OACA;;AAEb;;AAGA,SAAgB,iBAAiB,EAC7B,IACA,QACA,UACA,WAAW,CAAC,GACZ,MACA,WAQD;CACC,OACI,qBAAC,OAAD;EAAS;EAAI,MAAK;EAAS,aAAU;EAArC,UAAA;GACI,oBAAC,KAAD,EAAA,UAAI,OAAU,CAAA;GACb,YACG,qBAAA,UAAA,EAAA,UAAA,CACI,oBAAC,KAAD,EAAA,UAAI,SAAY,CAAA,GAChB,oBAAC,MAAD,EAAA,UACK,SAAS,KAAK,MACX,oBAAC,MAAD,EAAA,UAAa,EAAM,GAAV,CAAU,CACtB,EACD,CAAA,CACN,EAAA,CAAA;GAEN,oBAAC,KAAD,EAAA,UAAI,KAAQ,CAAA;GACX;EACA;;AAEb"}
@@ -0,0 +1,14 @@
1
+ // src/board/RowStyles.ts
2
+ /** The rule under a row, which takes no height, so every row of a type measures the same. */
3
+ const ROW_RULE = "shadow-[inset_0_-1px_var(--border)] last:shadow-none";
4
+ /** A row's own buttons draw their focus ring inside the pane that clips them. */
5
+ const ROW_OPENS = "focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-(--primary)";
6
+ /** What a row's action slot holds, centred and against its right edge. */
7
+ const ROW_ACTION = "flex min-w-0 flex-wrap items-center justify-end gap-x-2 gap-y-1 text-right text-xs text-(--muted-foreground)";
8
+ /** A row the item dialog shows now: tinted and ringed. */
9
+ const pickedRow = (picked) => picked ? "bg-(--accent) ring-2 ring-inset ring-(--primary)" : "";
10
+ /** The panel a warning about a piece of work sits in, such as why it needs you or is paused. */
11
+ const WARNING_PANEL = "rounded-xl border border-[color-mix(in_srgb,var(--warning)_35%,transparent)] bg-(--warning-surface) px-3 py-2.5";
12
+ export { ROW_ACTION, ROW_OPENS, ROW_RULE, WARNING_PANEL, pickedRow };
13
+
14
+ //# sourceMappingURL=RowStyles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RowStyles.js","names":[],"sources":["../../src/board/RowStyles.ts"],"sourcesContent":["// What the board's rows share: the rule under a row, the focus ring of a row's own buttons, the action slot, and how\n// the row the item dialog shows is marked; and the warning panel its notes share.\n\n/** The rule under a row, which takes no height, so every row of a type measures the same. */\nexport const ROW_RULE = 'shadow-[inset_0_-1px_var(--border)] last:shadow-none';\n/** A row's own buttons draw their focus ring inside the pane that clips them. */\nexport const ROW_OPENS = 'focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-(--primary)';\n/** What a row's action slot holds, centred and against its right edge. */\nexport const ROW_ACTION =\n 'flex min-w-0 flex-wrap items-center justify-end gap-x-2 gap-y-1 text-right text-xs text-(--muted-foreground)';\n\n/** A row the item dialog shows now: tinted and ringed. */\nexport const pickedRow = (picked: boolean) => (picked ? 'bg-(--accent) ring-2 ring-inset ring-(--primary)' : '');\n\n/** The panel a warning about a piece of work sits in, such as why it needs you or is paused. */\nexport const WARNING_PANEL =\n 'rounded-xl border border-[color-mix(in_srgb,var(--warning)_35%,transparent)] bg-(--warning-surface) px-3 py-2.5';\n"],"mappings":";;AAIA,MAAa,WAAW;;AAExB,MAAa,YAAY;;AAEzB,MAAa,aACT;;AAGJ,MAAa,aAAa,WAAqB,SAAS,qDAAqD;;AAG7G,MAAa,gBACT"}
@@ -0,0 +1,54 @@
1
+ import { DataAttributes } from "./DataAttributes.js";
2
+ import { ReactNode } from "react";
3
+ /** The title bar's last button, which opens Settings: an icon-only App control named by its `label`, its 20px icon in
4
+ * the text colour rather than the muted one, so it holds its own beside the labelled controls. */
5
+ export declare function OpenSettingsButton({ label, onOpen }: {
6
+ label: string;
7
+ onOpen: () => void;
8
+ }): import("react").JSX.Element;
9
+ /**
10
+ * Settings' sidebar: the `search` field over the sections' groups (SidebarNavigationGroup), and `empty`, announced,
11
+ * when a search leaves none. `label` names the navigation.
12
+ */
13
+ export declare function SettingsNav({ label, search, empty, children, ...data }: {
14
+ label: string;
15
+ search: ReactNode;
16
+ empty?: string | undefined;
17
+ children: ReactNode;
18
+ } & DataAttributes): import("react").JSX.Element;
19
+ /**
20
+ * Why a setting can't be changed, in a short muted line that wraps: the `reason`, a help popover with the whole
21
+ * `explanation` (`helpLabel` names its button), then the `action` that checks again, such as an InlineLink with `onClick`.
22
+ */
23
+ export declare function ReasonNote({ reason, explanation, helpLabel, action }: {
24
+ reason: string;
25
+ explanation: ReactNode;
26
+ helpLabel: string;
27
+ action?: ReactNode;
28
+ }): import("react").JSX.Element;
29
+ /** A settings group's note under its panel, such as what the group's last call did: small lines, stacked. `busy` marks
30
+ * it as still loading for assistive technology. */
31
+ export declare function SettingsNote({ busy, children, ...data }: {
32
+ busy?: boolean;
33
+ children: ReactNode;
34
+ } & DataAttributes): import("react").JSX.Element;
35
+ /** What a setting row shows under its control, such as an install's progress, in small stacked lines; `breaks` lets a
36
+ * long path break anywhere. */
37
+ export declare function SettingDetails({ breaks, children }: {
38
+ breaks?: boolean;
39
+ children: ReactNode;
40
+ }): import("react").JSX.Element;
41
+ /** A setting's control with its error under it, at most 20rem wide. */
42
+ export declare function SettingControl({ children }: {
43
+ children: ReactNode;
44
+ }): import("react").JSX.Element;
45
+ /** A small list of each Project's value for a setting, the Project left and its value muted right, wrapping. */
46
+ export declare function ProjectValueList({ label, rows }: {
47
+ label: string;
48
+ rows: readonly {
49
+ key: string;
50
+ name: string;
51
+ value: string;
52
+ }[];
53
+ }): import("react").JSX.Element;
54
+ //# sourceMappingURL=Settings.d.ts.map
@@ -0,0 +1,112 @@
1
+ import { Button } from "../actions/Button.js";
2
+ import { SidebarPane } from "../layout/sidebar/SidebarPane.js";
3
+ import { HelpTip } from "../overlays/HelpTip.js";
4
+ import { buttonKind } from "./ButtonKinds.js";
5
+ import { SettingsIcon } from "lucide-react";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ // src/board/Settings.tsx
8
+ /** The title bar's last button, which opens Settings: an icon-only App control named by its `label`, its 20px icon in
9
+ * the text colour rather than the muted one, so it holds its own beside the labelled controls. */
10
+ function OpenSettingsButton({ label, onOpen }) {
11
+ return /* @__PURE__ */ jsx(Button, {
12
+ ...buttonKind("control"),
13
+ iconOnly: true,
14
+ className: "open-settings text-base-content [&_svg]:size-5",
15
+ "aria-label": label,
16
+ title: label,
17
+ onClick: onOpen,
18
+ children: /* @__PURE__ */ jsx(SettingsIcon, {})
19
+ });
20
+ }
21
+ /**
22
+ * Settings' sidebar: the `search` field over the sections' groups (SidebarNavigationGroup), and `empty`, announced,
23
+ * when a search leaves none. `label` names the navigation.
24
+ */
25
+ function SettingsNav({ label, search, empty, children, ...data }) {
26
+ return /* @__PURE__ */ jsx("div", {
27
+ ...data,
28
+ className: "contents",
29
+ children: /* @__PURE__ */ jsxs(SidebarPane, {
30
+ label,
31
+ children: [
32
+ /* @__PURE__ */ jsx("div", {
33
+ className: "w-44 shrink-0 md:mb-3 md:w-auto",
34
+ children: search
35
+ }),
36
+ empty && /* @__PURE__ */ jsx("p", {
37
+ role: "status",
38
+ "data-no-match": true,
39
+ className: "text-base-700 m-0 px-2 py-1 text-xs",
40
+ children: empty
41
+ }),
42
+ children
43
+ ]
44
+ })
45
+ });
46
+ }
47
+ /**
48
+ * Why a setting can't be changed, in a short muted line that wraps: the `reason`, a help popover with the whole
49
+ * `explanation` (`helpLabel` names its button), then the `action` that checks again, such as an InlineLink with `onClick`.
50
+ */
51
+ function ReasonNote({ reason, explanation, helpLabel, action }) {
52
+ return /* @__PURE__ */ jsxs("span", {
53
+ className: "inline-flex min-w-0 flex-wrap items-center gap-1 text-xs text-(--muted-foreground)",
54
+ children: [
55
+ /* @__PURE__ */ jsx("span", { children: reason }),
56
+ /* @__PURE__ */ jsx(HelpTip, {
57
+ label: helpLabel,
58
+ children: explanation
59
+ }),
60
+ action
61
+ ]
62
+ });
63
+ }
64
+ /** A settings group's note under its panel, such as what the group's last call did: small lines, stacked. `busy` marks
65
+ * it as still loading for assistive technology. */
66
+ function SettingsNote({ busy, children, ...data }) {
67
+ return /* @__PURE__ */ jsx("div", {
68
+ ...data,
69
+ className: "grid gap-2 px-1",
70
+ "aria-busy": busy,
71
+ children
72
+ });
73
+ }
74
+ /** What a setting row shows under its control, such as an install's progress, in small stacked lines; `breaks` lets a
75
+ * long path break anywhere. */
76
+ function SettingDetails({ breaks = false, children }) {
77
+ return /* @__PURE__ */ jsx("div", {
78
+ className: `grid gap-2 text-xs${breaks ? " [overflow-wrap:anywhere]" : ""}`,
79
+ children
80
+ });
81
+ }
82
+ /** A setting's control with its error under it, at most 20rem wide. */
83
+ function SettingControl({ children }) {
84
+ return /* @__PURE__ */ jsx("div", {
85
+ className: "grid max-w-80 gap-2",
86
+ children
87
+ });
88
+ }
89
+ /** A small list of each Project's value for a setting, the Project left and its value muted right, wrapping. */
90
+ function ProjectValueList({ label, rows }) {
91
+ return /* @__PURE__ */ jsx("ul", {
92
+ className: "m-0 grid list-none gap-1 p-0 text-xs",
93
+ "aria-label": label,
94
+ children: rows.map(({ key, name, value }) => /* @__PURE__ */ jsxs("li", {
95
+ className: "flex flex-wrap justify-between gap-x-3",
96
+ children: [
97
+ /* @__PURE__ */ jsx("span", {
98
+ className: "[overflow-wrap:anywhere]",
99
+ children: name
100
+ }),
101
+ " ",
102
+ /* @__PURE__ */ jsx("span", {
103
+ className: "[overflow-wrap:anywhere] text-(--muted-foreground)",
104
+ children: value
105
+ })
106
+ ]
107
+ }, key))
108
+ });
109
+ }
110
+ export { OpenSettingsButton, ProjectValueList, ReasonNote, SettingControl, SettingDetails, SettingsNav, SettingsNote };
111
+
112
+ //# sourceMappingURL=Settings.js.map