@lar-works/design-system 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/README.md +5 -1
  2. package/dist/actions/Button.d.ts +39 -1
  3. package/dist/actions/Button.js +39 -9
  4. package/dist/actions/Button.js.map +1 -1
  5. package/dist/actions/ButtonLink.d.ts +5 -1
  6. package/dist/actions/ButtonLink.js +28 -2
  7. package/dist/actions/ButtonLink.js.map +1 -1
  8. package/dist/actions/ButtonRecipes.js +7 -0
  9. package/dist/actions/ButtonRecipes.js.map +1 -0
  10. package/dist/actions/IconButton.d.ts +2 -2
  11. package/dist/actions/IconButton.js +1 -1
  12. package/dist/actions/IconButton.js.map +1 -1
  13. package/dist/actions/ThemeSwitch.js +1 -1
  14. package/dist/board/ActivityLine.d.ts +36 -0
  15. package/dist/board/ActivityLine.js +144 -0
  16. package/dist/board/ActivityLine.js.map +1 -0
  17. package/dist/board/ActivityTrack.d.ts +11 -0
  18. package/dist/board/ActivityTrack.js +25 -0
  19. package/dist/board/ActivityTrack.js.map +1 -0
  20. package/dist/board/AddItem.d.ts +82 -0
  21. package/dist/board/AddItem.js +185 -0
  22. package/dist/board/AddItem.js.map +1 -0
  23. package/dist/board/Archive.d.ts +21 -0
  24. package/dist/board/Archive.js +63 -0
  25. package/dist/board/Archive.js.map +1 -0
  26. package/dist/board/Attention.d.ts +66 -0
  27. package/dist/board/Attention.js +122 -0
  28. package/dist/board/Attention.js.map +1 -0
  29. package/dist/board/BoardShell.d.ts +16 -0
  30. package/dist/board/BoardShell.js +35 -0
  31. package/dist/board/BoardShell.js.map +1 -0
  32. package/dist/board/BoardTitleBar.d.ts +50 -0
  33. package/dist/board/BoardTitleBar.js +125 -0
  34. package/dist/board/BoardTitleBar.js.map +1 -0
  35. package/dist/board/ButtonKinds.d.ts +24 -0
  36. package/dist/board/ButtonKinds.js +19 -0
  37. package/dist/board/ButtonKinds.js.map +1 -0
  38. package/dist/board/Cleanup.d.ts +8 -0
  39. package/dist/board/Cleanup.js +15 -0
  40. package/dist/board/Cleanup.js.map +1 -0
  41. package/dist/board/Counters.d.ts +101 -0
  42. package/dist/board/Counters.js +202 -0
  43. package/dist/board/Counters.js.map +1 -0
  44. package/dist/board/DataAttributes.d.ts +6 -0
  45. package/dist/board/Dependencies.d.ts +17 -0
  46. package/dist/board/Dependencies.js +44 -0
  47. package/dist/board/Dependencies.js.map +1 -0
  48. package/dist/board/Desk.d.ts +52 -0
  49. package/dist/board/Desk.js +130 -0
  50. package/dist/board/Desk.js.map +1 -0
  51. package/dist/board/Dossier.d.ts +100 -0
  52. package/dist/board/Dossier.js +194 -0
  53. package/dist/board/Dossier.js.map +1 -0
  54. package/dist/board/Filters.d.ts +33 -0
  55. package/dist/board/Filters.js +64 -0
  56. package/dist/board/Filters.js.map +1 -0
  57. package/dist/board/ItemDetails.d.ts +167 -0
  58. package/dist/board/ItemDetails.js +339 -0
  59. package/dist/board/ItemDetails.js.map +1 -0
  60. package/dist/board/ItemDialog.d.ts +73 -0
  61. package/dist/board/ItemDialog.js +140 -0
  62. package/dist/board/ItemDialog.js.map +1 -0
  63. package/dist/board/ItemParts.d.ts +42 -0
  64. package/dist/board/ItemParts.js +82 -0
  65. package/dist/board/ItemParts.js.map +1 -0
  66. package/dist/board/ItemProgress.d.ts +56 -0
  67. package/dist/board/ItemProgress.js +138 -0
  68. package/dist/board/ItemProgress.js.map +1 -0
  69. package/dist/board/List.d.ts +65 -0
  70. package/dist/board/List.js +118 -0
  71. package/dist/board/List.js.map +1 -0
  72. package/dist/board/LoadingScreen.d.ts +38 -0
  73. package/dist/board/LoadingScreen.js +74 -0
  74. package/dist/board/LoadingScreen.js.map +1 -0
  75. package/dist/board/NeedsYou.d.ts +13 -0
  76. package/dist/board/NeedsYou.js +31 -0
  77. package/dist/board/NeedsYou.js.map +1 -0
  78. package/dist/board/Onboarding.d.ts +53 -0
  79. package/dist/board/Onboarding.js +122 -0
  80. package/dist/board/Onboarding.js.map +1 -0
  81. package/dist/board/PartsList.d.ts +60 -0
  82. package/dist/board/PartsList.js +115 -0
  83. package/dist/board/PartsList.js.map +1 -0
  84. package/dist/board/ProjectIcon.d.ts +51 -0
  85. package/dist/board/ProjectIcon.js +120 -0
  86. package/dist/board/ProjectIcon.js.map +1 -0
  87. package/dist/board/PullRequests.d.ts +43 -0
  88. package/dist/board/PullRequests.js +83 -0
  89. package/dist/board/PullRequests.js.map +1 -0
  90. package/dist/board/RowStyles.js +14 -0
  91. package/dist/board/RowStyles.js.map +1 -0
  92. package/dist/board/Settings.d.ts +54 -0
  93. package/dist/board/Settings.js +112 -0
  94. package/dist/board/Settings.js.map +1 -0
  95. package/dist/board/Slices.d.ts +32 -0
  96. package/dist/board/Slices.js +88 -0
  97. package/dist/board/Slices.js.map +1 -0
  98. package/dist/board/SourceIcon.d.ts +12 -0
  99. package/dist/board/SourceIcon.js +24 -0
  100. package/dist/board/SourceIcon.js.map +1 -0
  101. package/dist/board/StagePane.d.ts +43 -0
  102. package/dist/board/StagePane.js +97 -0
  103. package/dist/board/StagePane.js.map +1 -0
  104. package/dist/board/StageRow.d.ts +141 -0
  105. package/dist/board/StageRow.js +287 -0
  106. package/dist/board/StageRow.js.map +1 -0
  107. package/dist/board/StageTrack.d.ts +18 -0
  108. package/dist/board/StageTrack.js +38 -0
  109. package/dist/board/StageTrack.js.map +1 -0
  110. package/dist/board/StartControls.d.ts +30 -0
  111. package/dist/board/StartControls.js +51 -0
  112. package/dist/board/StartControls.js.map +1 -0
  113. package/dist/board/StatusColors.d.ts +5 -0
  114. package/dist/board/StatusColors.js +17 -0
  115. package/dist/board/StatusColors.js.map +1 -0
  116. package/dist/board/StatusGlyph.d.ts +18 -0
  117. package/dist/board/StatusGlyph.js +51 -0
  118. package/dist/board/StatusGlyph.js.map +1 -0
  119. package/dist/board/Threads.d.ts +13 -0
  120. package/dist/board/Threads.js +35 -0
  121. package/dist/board/Threads.js.map +1 -0
  122. package/dist/board/TrackerLabels.d.ts +27 -0
  123. package/dist/board/TrackerLabels.js +56 -0
  124. package/dist/board/TrackerLabels.js.map +1 -0
  125. package/dist/board/UpdatePill.d.ts +52 -0
  126. package/dist/board/UpdatePill.js +188 -0
  127. package/dist/board/UpdatePill.js.map +1 -0
  128. package/dist/board/Vocabulary.d.ts +56 -0
  129. package/dist/board/Vocabulary.js +104 -0
  130. package/dist/board/Vocabulary.js.map +1 -0
  131. package/dist/board/Warnings.d.ts +35 -0
  132. package/dist/board/Warnings.js +85 -0
  133. package/dist/board/Warnings.js.map +1 -0
  134. package/dist/board/WorkMap.d.ts +136 -0
  135. package/dist/board/WorkMap.js +274 -0
  136. package/dist/board/WorkMap.js.map +1 -0
  137. package/dist/board/index.d.ts +42 -0
  138. package/dist/collections/CollectionState.d.ts +10 -1
  139. package/dist/collections/CollectionState.js +12 -5
  140. package/dist/collections/CollectionState.js.map +1 -1
  141. package/dist/collections/ResultList.js +1 -1
  142. package/dist/collections/ScrollRow.js +1 -1
  143. package/dist/collections/VirtualList.js +1 -1
  144. package/dist/display/Avatar.d.ts +5 -2
  145. package/dist/display/Avatar.js +2 -2
  146. package/dist/display/Avatar.js.map +1 -1
  147. package/dist/display/Badge.d.ts +6 -1
  148. package/dist/display/Badge.js +9 -4
  149. package/dist/display/Badge.js.map +1 -1
  150. package/dist/display/CheckList.js +1 -1
  151. package/dist/display/Comment.d.ts +12 -0
  152. package/dist/display/Comment.js +39 -0
  153. package/dist/display/Comment.js.map +1 -0
  154. package/dist/display/CopyButton.d.ts +10 -2
  155. package/dist/display/CopyButton.js +29 -16
  156. package/dist/display/CopyButton.js.map +1 -1
  157. package/dist/display/Diagram.d.ts +17 -0
  158. package/dist/display/Diagram.js +49 -0
  159. package/dist/display/Diagram.js.map +1 -0
  160. package/dist/display/ImagePicker.js +1 -1
  161. package/dist/display/InfoBox.js +2 -2
  162. package/dist/display/InsetPanel.d.ts +3 -1
  163. package/dist/display/InsetPanel.js +7 -4
  164. package/dist/display/InsetPanel.js.map +1 -1
  165. package/dist/display/ItemAction.js +2 -2
  166. package/dist/display/LabelChip.d.ts +26 -0
  167. package/dist/display/LabelChip.js +41 -0
  168. package/dist/display/LabelChip.js.map +1 -0
  169. package/dist/display/LabelTint.js +60 -0
  170. package/dist/display/LabelTint.js.map +1 -0
  171. package/dist/display/Person.d.ts +5 -0
  172. package/dist/display/Person.js +19 -0
  173. package/dist/display/Person.js.map +1 -0
  174. package/dist/display/PropertySheet.js +1 -1
  175. package/dist/display/RadioChoice.d.ts +9 -2
  176. package/dist/display/RadioChoice.js +5 -1
  177. package/dist/display/RadioChoice.js.map +1 -1
  178. package/dist/display/RatingLink.js +1 -1
  179. package/dist/display/RichText.d.ts +12 -0
  180. package/dist/display/RichText.js +94 -0
  181. package/dist/display/RichText.js.map +1 -0
  182. package/dist/display/RowList.js +1 -1
  183. package/dist/display/index.d.ts +6 -1
  184. package/dist/feedback/Alert.js +1 -1
  185. package/dist/feedback/AsyncState.js +1 -1
  186. package/dist/feedback/DismissButton.d.ts +12 -0
  187. package/dist/feedback/DismissButton.js +20 -0
  188. package/dist/feedback/DismissButton.js.map +1 -0
  189. package/dist/feedback/ErrorNotification.js +2 -0
  190. package/dist/feedback/ErrorNotification.js.map +1 -1
  191. package/dist/feedback/FormResult.d.ts +16 -0
  192. package/dist/feedback/FormResult.js +30 -0
  193. package/dist/feedback/FormResult.js.map +1 -0
  194. package/dist/feedback/LiveRegion.d.ts +7 -0
  195. package/dist/feedback/LiveRegion.js +15 -0
  196. package/dist/feedback/LiveRegion.js.map +1 -0
  197. package/dist/feedback/Loading.d.ts +19 -0
  198. package/dist/feedback/Loading.js +63 -0
  199. package/dist/feedback/Loading.js.map +1 -0
  200. package/dist/feedback/Notifications.d.ts +35 -1
  201. package/dist/feedback/Notifications.js +196 -4
  202. package/dist/feedback/Notifications.js.map +1 -1
  203. package/dist/feedback/Progress.d.ts +15 -0
  204. package/dist/feedback/Progress.js +38 -0
  205. package/dist/feedback/Progress.js.map +1 -0
  206. package/dist/feedback/ProgressStatusRow.js +1 -1
  207. package/dist/feedback/StatusIndicator.d.ts +6 -1
  208. package/dist/feedback/StatusIndicator.js +19 -5
  209. package/dist/feedback/StatusIndicator.js.map +1 -1
  210. package/dist/feedback/index.d.ts +8 -4
  211. package/dist/forms/Checkbox.js +1 -1
  212. package/dist/forms/ColorSwatches.d.ts +21 -0
  213. package/dist/forms/ColorSwatches.js +26 -0
  214. package/dist/forms/ColorSwatches.js.map +1 -0
  215. package/dist/forms/FormSection.d.ts +68 -6
  216. package/dist/forms/FormSection.js +139 -8
  217. package/dist/forms/FormSection.js.map +1 -1
  218. package/dist/forms/HiddenField.d.ts +6 -0
  219. package/dist/forms/HiddenField.js +13 -0
  220. package/dist/forms/HiddenField.js.map +1 -0
  221. package/dist/forms/Input.d.ts +12 -2
  222. package/dist/forms/Input.js +10 -3
  223. package/dist/forms/Input.js.map +1 -1
  224. package/dist/forms/LabelPicker.d.ts +43 -0
  225. package/dist/forms/LabelPicker.js +107 -0
  226. package/dist/forms/LabelPicker.js.map +1 -0
  227. package/dist/forms/MarkdownEditor.d.ts +21 -0
  228. package/dist/forms/MarkdownEditor.js +175 -0
  229. package/dist/forms/MarkdownEditor.js.map +1 -0
  230. package/dist/forms/MarkdownToolbar.js +204 -0
  231. package/dist/forms/MarkdownToolbar.js.map +1 -0
  232. package/dist/forms/OptionSelect.d.ts +30 -9
  233. package/dist/forms/OptionSelect.js +53 -13
  234. package/dist/forms/OptionSelect.js.map +1 -1
  235. package/dist/forms/Select.d.ts +4 -1
  236. package/dist/forms/Select.js +3 -1
  237. package/dist/forms/Select.js.map +1 -1
  238. package/dist/forms/Switch.d.ts +4 -1
  239. package/dist/forms/Switch.js +5 -2
  240. package/dist/forms/Switch.js.map +1 -1
  241. package/dist/forms/TagInput.js +1 -1
  242. package/dist/forms/index.d.ts +7 -3
  243. package/dist/foundations/AmbientMotion.d.ts +2 -0
  244. package/dist/foundations/AmbientMotion.js +39 -0
  245. package/dist/foundations/AmbientMotion.js.map +1 -0
  246. package/dist/foundations/DesignSystemProvider.d.ts +34 -0
  247. package/dist/foundations/DesignSystemProvider.js +26 -1
  248. package/dist/foundations/DesignSystemProvider.js.map +1 -1
  249. package/dist/foundations/index.d.ts +2 -1
  250. package/dist/icons/BrandIcons.d.ts +8 -2
  251. package/dist/icons/BrandIcons.js +14 -3
  252. package/dist/icons/BrandIcons.js.map +1 -1
  253. package/dist/icons/dynamic.d.ts +2 -0
  254. package/dist/icons/dynamic.js +1 -0
  255. package/dist/icons/index.d.ts +2 -2
  256. package/dist/icons/index.js +1 -1
  257. package/dist/icons.d.ts +2 -2
  258. package/dist/icons.js +1 -1
  259. package/dist/index.d.ts +71 -10
  260. package/dist/index.js +78 -21
  261. package/dist/layout/Site.js +1 -1
  262. package/dist/layout/TitleBar.js +1 -1
  263. package/dist/layout/index.d.ts +2 -2
  264. package/dist/layout/index.js +3 -3
  265. package/dist/layout/toolbar/CommandPaletteTrigger.d.ts +17 -2
  266. package/dist/layout/toolbar/CommandPaletteTrigger.js +89 -6
  267. package/dist/layout/toolbar/CommandPaletteTrigger.js.map +1 -1
  268. package/dist/layout/toolbar/TriggerFit.js +56 -0
  269. package/dist/layout/toolbar/TriggerFit.js.map +1 -0
  270. package/dist/navigation/CollectionBrowseSelector.js +1 -1
  271. package/dist/navigation/CollectionViewToggle.d.ts +26 -0
  272. package/dist/navigation/CollectionViewToggle.js +54 -23
  273. package/dist/navigation/CollectionViewToggle.js.map +1 -1
  274. package/dist/navigation/DrilldownBrowseSelector.js +1 -1
  275. package/dist/navigation/FolderSelector.js +2 -2
  276. package/dist/navigation/SortMenu.d.ts +10 -0
  277. package/dist/navigation/SortMenu.js +33 -0
  278. package/dist/navigation/SortMenu.js.map +1 -0
  279. package/dist/navigation/index.d.ts +3 -2
  280. package/dist/overlays/CommandPalette.d.ts +38 -4
  281. package/dist/overlays/CommandPalette.js +140 -54
  282. package/dist/overlays/CommandPalette.js.map +1 -1
  283. package/dist/overlays/Drawer.js +1 -1
  284. package/dist/overlays/DropdownMenu.d.ts +7 -1
  285. package/dist/overlays/DropdownMenu.js +13 -2
  286. package/dist/overlays/DropdownMenu.js.map +1 -1
  287. package/dist/overlays/HelpTip.d.ts +8 -0
  288. package/dist/overlays/HelpTip.js +29 -0
  289. package/dist/overlays/HelpTip.js.map +1 -0
  290. package/dist/overlays/ImageViewer.js +2 -2
  291. package/dist/overlays/Modal.d.ts +5 -0
  292. package/dist/overlays/Modal.js +17 -2
  293. package/dist/overlays/Modal.js.map +1 -1
  294. package/dist/overlays/ModalExpandButton.d.ts +18 -0
  295. package/dist/overlays/ModalExpandButton.js +43 -0
  296. package/dist/overlays/ModalExpandButton.js.map +1 -0
  297. package/dist/overlays/Popover.d.ts +2 -1
  298. package/dist/overlays/Popover.js +1 -0
  299. package/dist/overlays/Popover.js.map +1 -1
  300. package/dist/overlays/index.d.ts +4 -2
  301. package/dist/showcase/Cards.js +1 -1
  302. package/dist/showcase/FeatureRow.js +1 -1
  303. package/dist/showcase/PhotoSearchConcept.js +1 -1
  304. package/dist/showcase/ProductBand.js +1 -1
  305. package/dist/showcase/Status.js +1 -1
  306. package/dist/typography/Code.d.ts +18 -0
  307. package/dist/typography/Code.js +24 -0
  308. package/dist/typography/Code.js.map +1 -0
  309. package/dist/typography/Link.d.ts +7 -2
  310. package/dist/typography/Link.js +15 -5
  311. package/dist/typography/Link.js.map +1 -1
  312. package/dist/typography/Typography.d.ts +19 -1
  313. package/dist/typography/Typography.js +11 -3
  314. package/dist/typography/Typography.js.map +1 -1
  315. package/dist/typography/index.d.ts +3 -3
  316. package/package.json +26 -3
  317. package/src/actions/Button.tsx +78 -11
  318. package/src/actions/ButtonLink.tsx +34 -0
  319. package/src/actions/ButtonRecipes.ts +10 -0
  320. package/src/actions/IconButton.tsx +7 -4
  321. package/src/board/ActivityLine.tsx +176 -0
  322. package/src/board/ActivityTrack.tsx +23 -0
  323. package/src/board/AddItem.tsx +259 -0
  324. package/src/board/Archive.tsx +75 -0
  325. package/src/board/Attention.tsx +135 -0
  326. package/src/board/BoardShell.tsx +30 -0
  327. package/src/board/BoardTitleBar.tsx +167 -0
  328. package/src/board/ButtonKinds.ts +32 -0
  329. package/src/board/Cleanup.tsx +19 -0
  330. package/src/board/Counters.tsx +224 -0
  331. package/src/board/DataAttributes.ts +3 -0
  332. package/src/board/Dependencies.tsx +49 -0
  333. package/src/board/Desk.tsx +155 -0
  334. package/src/board/Dossier.tsx +262 -0
  335. package/src/board/Filters.tsx +85 -0
  336. package/src/board/ItemDetails.tsx +435 -0
  337. package/src/board/ItemDialog.tsx +179 -0
  338. package/src/board/ItemParts.tsx +128 -0
  339. package/src/board/ItemProgress.tsx +164 -0
  340. package/src/board/List.tsx +154 -0
  341. package/src/board/LoadingScreen.tsx +78 -0
  342. package/src/board/NeedsYou.tsx +30 -0
  343. package/src/board/Onboarding.tsx +124 -0
  344. package/src/board/PartsList.tsx +160 -0
  345. package/src/board/ProjectIcon.tsx +172 -0
  346. package/src/board/PullRequests.tsx +106 -0
  347. package/src/board/RowStyles.ts +17 -0
  348. package/src/board/Settings.tsx +124 -0
  349. package/src/board/Slices.tsx +103 -0
  350. package/src/board/SourceIcon.tsx +33 -0
  351. package/src/board/StagePane.tsx +128 -0
  352. package/src/board/StageRow.tsx +320 -0
  353. package/src/board/StageTrack.tsx +61 -0
  354. package/src/board/StartControls.tsx +77 -0
  355. package/src/board/StatusColors.ts +28 -0
  356. package/src/board/StatusGlyph.tsx +70 -0
  357. package/src/board/Threads.tsx +38 -0
  358. package/src/board/TrackerLabels.tsx +75 -0
  359. package/src/board/UpdatePill.tsx +222 -0
  360. package/src/board/Vocabulary.tsx +155 -0
  361. package/src/board/Warnings.tsx +83 -0
  362. package/src/board/WorkMap.tsx +436 -0
  363. package/src/board/base.css +121 -0
  364. package/src/board/button-kinds.css +8 -0
  365. package/src/board/index.ts +224 -0
  366. package/src/board/items.css +75 -0
  367. package/src/board/loading-screen.css +171 -0
  368. package/src/board/rows.css +180 -0
  369. package/src/board/title-bar.css +56 -0
  370. package/src/board/tokens.css +52 -0
  371. package/src/board.css +19 -0
  372. package/src/collections/CollectionState.tsx +20 -7
  373. package/src/display/Avatar.tsx +6 -3
  374. package/src/display/Badge.tsx +25 -3
  375. package/src/display/Comment.tsx +26 -0
  376. package/src/display/CopyButton.tsx +48 -18
  377. package/src/display/Diagram.tsx +59 -0
  378. package/src/display/InsetPanel.tsx +4 -1
  379. package/src/display/LabelChip.tsx +73 -0
  380. package/src/display/LabelTint.ts +72 -0
  381. package/src/display/Person.tsx +11 -0
  382. package/src/display/RadioChoice.tsx +11 -2
  383. package/src/display/RichText.tsx +114 -0
  384. package/src/display/index.ts +5 -0
  385. package/src/feedback/DismissButton.tsx +28 -0
  386. package/src/feedback/ErrorNotification.ts +3 -0
  387. package/src/feedback/FormResult.tsx +50 -0
  388. package/src/feedback/LiveRegion.tsx +10 -0
  389. package/src/feedback/Loading.tsx +75 -0
  390. package/src/feedback/Notifications.tsx +267 -2
  391. package/src/feedback/Progress.tsx +44 -0
  392. package/src/feedback/StatusIndicator.tsx +34 -3
  393. package/src/feedback/index.ts +12 -2
  394. package/src/forms/ColorSwatches.tsx +50 -0
  395. package/src/forms/FormSection.tsx +245 -10
  396. package/src/forms/HiddenField.tsx +4 -0
  397. package/src/forms/Input.tsx +26 -4
  398. package/src/forms/LabelPicker.tsx +140 -0
  399. package/src/forms/MarkdownEditor.tsx +283 -0
  400. package/src/forms/MarkdownToolbar.tsx +267 -0
  401. package/src/forms/OptionSelect.tsx +110 -25
  402. package/src/forms/Select.tsx +20 -13
  403. package/src/forms/Switch.tsx +16 -2
  404. package/src/forms/index.ts +16 -2
  405. package/src/foundations/AmbientMotion.ts +51 -0
  406. package/src/foundations/DesignSystemProvider.tsx +19 -0
  407. package/src/foundations/index.ts +1 -0
  408. package/src/foundations/theme.css +64 -0
  409. package/src/icons/BrandIcons.tsx +12 -3
  410. package/src/icons/dynamic.ts +4 -0
  411. package/src/icons/index.ts +1 -1
  412. package/src/index.ts +2 -1
  413. package/src/layout/index.ts +1 -1
  414. package/src/layout/toolbar/CommandPaletteTrigger.tsx +187 -31
  415. package/src/layout/toolbar/TriggerFit.ts +84 -0
  416. package/src/navigation/CollectionViewToggle.tsx +94 -24
  417. package/src/navigation/SortMenu.tsx +41 -0
  418. package/src/navigation/index.ts +2 -1
  419. package/src/overlays/CommandPalette.tsx +190 -60
  420. package/src/overlays/DropdownMenu.tsx +12 -1
  421. package/src/overlays/HelpTip.tsx +29 -0
  422. package/src/overlays/Modal.tsx +23 -0
  423. package/src/overlays/ModalExpandButton.tsx +48 -0
  424. package/src/overlays/Popover.tsx +3 -1
  425. package/src/overlays/index.ts +9 -1
  426. package/src/showcase.css +6 -0
  427. package/src/styles.css +9 -1
  428. package/src/typography/Code.tsx +24 -0
  429. package/src/typography/Link.tsx +19 -10
  430. package/src/typography/Typography.tsx +25 -2
  431. package/src/typography/index.ts +1 -1
  432. package/dist/feedback/index.js +0 -11
  433. package/dist/typography/index.js +0 -4
@@ -1,12 +1,14 @@
1
1
  import { Button } from "../actions/Button.js";
2
+ import { Badge } from "../display/Badge.js";
2
3
  import { InsetPanel } from "../display/InsetPanel.js";
3
4
  import { SkeletonLoader } from "../feedback/SkeletonLoader.js";
4
5
  import { Stack } from "../layout/Flow.js";
6
+ import { HelpTip } from "../overlays/HelpTip.js";
5
7
  import { Heading, Text } from "../typography/Typography.js";
6
8
  import { Field } from "./Field.js";
7
9
  import { useId, useState } from "react";
8
- import { jsx, jsxs } from "react/jsx-runtime";
9
10
  import { ChevronDownIcon } from "lucide-react";
11
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
10
12
  // src/forms/FormSection.tsx
11
13
  const contentSpacing = "px-4 py-3.5 sm:px-5";
12
14
  const rowClasses = `grid min-w-0 gap-x-6 gap-y-3 sm:items-center ${contentSpacing}`;
@@ -23,7 +25,31 @@ function FormStack({ children }) {
23
25
  children
24
26
  });
25
27
  }
26
- function FormSection({ action, badges, children, description, loading = false, loadingLabel, title }) {
28
+ function FormSection(props) {
29
+ if (props.presentation === "dense") return /* @__PURE__ */ jsx(DenseFormSection, { ...props });
30
+ return /* @__PURE__ */ jsx(PanelFormSection, { ...props });
31
+ }
32
+ function DenseFormSection({ presentation: _presentation, title, help, helpLabel, description, "aria-label": label, children, ...data }) {
33
+ const titleId = useId();
34
+ return /* @__PURE__ */ jsxs("section", {
35
+ ...data,
36
+ "aria-label": label,
37
+ "aria-labelledby": label || !title ? void 0 : titleId,
38
+ className: "grid min-w-0 gap-3",
39
+ children: [(title || description) && /* @__PURE__ */ jsxs("div", { children: [title && /* @__PURE__ */ jsxs("h3", {
40
+ id: titleId,
41
+ className: "m-0 flex items-center gap-1.5 text-[13px] font-semibold",
42
+ children: [title, help && /* @__PURE__ */ jsx(HelpTip, {
43
+ label: helpLabel ?? (typeof title === "string" ? title : ""),
44
+ children: help
45
+ })]
46
+ }), description && /* @__PURE__ */ jsx("p", {
47
+ className: "text-base-700 m-0 mt-0.5 text-xs",
48
+ children: description
49
+ })] }), children]
50
+ });
51
+ }
52
+ function PanelFormSection({ action, badges, children, description, loading = false, loadingLabel, title }) {
27
53
  const titleId = useId();
28
54
  const content = /* @__PURE__ */ jsxs("section", {
29
55
  "aria-labelledby": titleId,
@@ -56,7 +82,9 @@ function FormSection({ action, badges, children, description, loading = false, l
56
82
  children: content
57
83
  }) : content;
58
84
  }
59
- function FormRow({ badges, children, description, id, label }) {
85
+ function FormRow(props) {
86
+ if (props.layout === "flow") return /* @__PURE__ */ jsx(FormRowFlow, { ...props });
87
+ const { badges, children, description, id, label } = props;
60
88
  return /* @__PURE__ */ jsxs("div", {
61
89
  id,
62
90
  tabIndex: id ? -1 : void 0,
@@ -82,6 +110,48 @@ function FormRow({ badges, children, description, id, label }) {
82
110
  })]
83
111
  });
84
112
  }
113
+ function FormRowFlow({ layout: _layout, label, help, helpLabel, description, children, below, error, errorId, ...data }) {
114
+ const fallbackErrorId = useId();
115
+ return /* @__PURE__ */ jsxs("div", {
116
+ ...data,
117
+ className: "settings-row grid min-w-0 gap-2 px-4 py-3",
118
+ children: [
119
+ /* @__PURE__ */ jsxs("div", {
120
+ className: "flex min-w-0 flex-wrap items-center gap-x-6 gap-y-2",
121
+ children: [/* @__PURE__ */ jsxs("div", {
122
+ className: "min-w-32 flex-1",
123
+ children: [/* @__PURE__ */ jsxs("div", {
124
+ className: "settings-row-title flex min-w-0 items-center gap-1.5 text-[13px] font-medium wrap-anywhere",
125
+ children: [label, help && /* @__PURE__ */ jsx(HelpTip, {
126
+ label: helpLabel ?? (typeof label === "string" ? label : ""),
127
+ children: help
128
+ })]
129
+ }), description && /* @__PURE__ */ jsx("div", {
130
+ className: "text-base-700 text-xs wrap-anywhere",
131
+ children: description
132
+ })]
133
+ }), children && /* @__PURE__ */ jsx("div", {
134
+ className: "settings-row-control flex max-w-full min-w-0 flex-wrap items-center gap-2 sm:max-w-[60%] [&_button]:max-w-full [&>span]:max-w-full",
135
+ children
136
+ })]
137
+ }),
138
+ below,
139
+ error && /* @__PURE__ */ jsx("p", {
140
+ id: errorId ?? fallbackErrorId,
141
+ role: "alert",
142
+ className: "m-0 text-xs text-(--lar-danger-text)",
143
+ children: error
144
+ })
145
+ ]
146
+ });
147
+ }
148
+ /** A value and its unit beside it in a row's controls, such as a number field and "days". */
149
+ function FormUnit({ children, unit }) {
150
+ return /* @__PURE__ */ jsxs("span", {
151
+ className: "flex items-center gap-2 text-sm [&_input]:w-20",
152
+ children: [children, unit]
153
+ });
154
+ }
85
155
  function FormField({ action, children, loading = false, loadingLabel, ...props }) {
86
156
  if (loading) return /* @__PURE__ */ jsx(SkeletonLoader, {
87
157
  label: loadingLabel ?? "",
@@ -119,11 +189,58 @@ function FormAction(props) {
119
189
  variant: "subtle"
120
190
  });
121
191
  }
122
- function Disclosure({ children, label, lazy = false }) {
123
- const [open, setOpen] = useState(false);
192
+ function Disclosure({ children, label, lazy = false, presentation = "note", defaultOpen = false, badge, onOpenChange, ...data }) {
193
+ const [open, setOpen] = useState(defaultOpen);
194
+ const shown = !lazy || open ? children : null;
195
+ const toggle = (event) => {
196
+ setOpen(event.currentTarget.open);
197
+ onOpenChange?.(event.currentTarget.open);
198
+ };
199
+ if (presentation === "group") return /* @__PURE__ */ jsxs("details", {
200
+ ...data,
201
+ open,
202
+ onToggle: toggle,
203
+ className: "min-w-0",
204
+ children: [/* @__PURE__ */ jsxs("summary", {
205
+ className: "cursor-pointer text-[13px] font-semibold",
206
+ children: [label, badge && /* @__PURE__ */ jsxs(Fragment$1, { children: [" ", /* @__PURE__ */ jsx(Badge, {
207
+ className: "ms-1",
208
+ children: badge
209
+ })] })]
210
+ }), shown && /* @__PURE__ */ jsx("div", {
211
+ className: "mt-3 grid min-w-0 gap-3",
212
+ children: shown
213
+ })]
214
+ });
215
+ if (presentation === "framed") return /* @__PURE__ */ jsxs("details", {
216
+ ...data,
217
+ open,
218
+ onToggle: toggle,
219
+ className: "min-w-0 rounded-lg border px-3 py-2",
220
+ children: [/* @__PURE__ */ jsx("summary", {
221
+ className: "cursor-pointer text-sm font-medium",
222
+ children: label
223
+ }), /* @__PURE__ */ jsx("div", {
224
+ className: "mt-2",
225
+ children: shown
226
+ })]
227
+ });
228
+ if (presentation === "section") return /* @__PURE__ */ jsxs("details", {
229
+ ...data,
230
+ className: "grid min-w-0 gap-2",
231
+ onToggle: toggle,
232
+ children: [/* @__PURE__ */ jsx("summary", {
233
+ className: "text-base-700 cursor-pointer text-sm",
234
+ children: label
235
+ }), /* @__PURE__ */ jsx("div", {
236
+ className: "pt-2",
237
+ children: shown
238
+ })]
239
+ });
124
240
  return /* @__PURE__ */ jsxs("details", {
241
+ ...data,
125
242
  className: "group px-1",
126
- onToggle: (event) => setOpen(event.currentTarget.open),
243
+ onToggle: toggle,
127
244
  children: [/* @__PURE__ */ jsxs("summary", {
128
245
  className: "text-base-700 hover:text-base-content focus-visible:outline-primary flex w-fit cursor-pointer list-none items-center gap-1.5 rounded py-1 text-xs focus-visible:outline-2 focus-visible:outline-offset-2 [&::-webkit-details-marker]:hidden",
129
246
  children: [/* @__PURE__ */ jsx("span", {
@@ -133,10 +250,24 @@ function Disclosure({ children, label, lazy = false }) {
133
250
  }), label]
134
251
  }), /* @__PURE__ */ jsx("div", {
135
252
  className: "text-base-700 mt-2 space-y-2 text-xs leading-relaxed",
136
- children: !lazy || open ? children : null
253
+ children: shown
137
254
  })]
138
255
  });
139
256
  }
140
- export { Disclosure, FormAction, FormContent, FormField, FormRow, FormSection, FormStack };
257
+ /** The form section's fieldset: a bordered group of controls under a legend, on the native fieldset, which also
258
+ * disables every control inside it. As a `group`, it only groups and disables its fields. */
259
+ function FormFieldset({ legend, hiddenLegend = false, presentation = "bordered", className = "", children, ...props }) {
260
+ return /* @__PURE__ */ jsxs("fieldset", {
261
+ className: `m-0 min-w-0 ${presentation === "group" ? "border-0 p-0" : "border-base-300 mb-3 rounded-lg border px-3 pt-2 pb-0 [&>legend]:mb-2 [&>legend]:font-semibold"} ${className}`,
262
+ "data-slot": "fieldset",
263
+ ...props,
264
+ children: [legend ? /* @__PURE__ */ jsx("legend", {
265
+ className: hiddenLegend ? "sr-only" : "text-base-content p-0 text-sm leading-5 font-medium",
266
+ "data-slot": "fieldset-legend",
267
+ children: legend
268
+ }) : null, children]
269
+ });
270
+ }
271
+ export { Disclosure, FormAction, FormContent, FormField, FormFieldset, FormRow, FormSection, FormStack, FormUnit };
141
272
 
142
273
  //# sourceMappingURL=FormSection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FormSection.js","names":[],"sources":["../../src/forms/FormSection.tsx"],"sourcesContent":["import { ChevronDownIcon } from 'lucide-react';\nimport { type ReactNode, useId, useState } from 'react';\n\nimport { Button, type ButtonProps } from '../actions/Button';\nimport { InsetPanel } from '../display/InsetPanel';\nimport { SkeletonLoader } from '../feedback/SkeletonLoader';\nimport { Stack } from '../layout/Flow';\nimport { Heading, Text } from '../typography/Typography';\nimport { Field, type FieldProps } from './Field';\n\nconst contentSpacing = 'px-4 py-3.5 sm:px-5';\nconst rowClasses = `grid min-w-0 gap-x-6 gap-y-3 sm:items-center ${contentSpacing}`;\n\nexport function FormContent({ children }: { children: ReactNode }) {\n return (\n <Stack space=\"group\" className={contentSpacing}>\n {children}\n </Stack>\n );\n}\n\nexport function FormStack({ children }: { children: ReactNode }) {\n return <Stack space=\"page\">{children}</Stack>;\n}\n\ninterface FormSectionProps {\n action?: ReactNode;\n badges?: ReactNode;\n children: ReactNode;\n description?: string;\n loading?: boolean;\n loadingLabel?: string;\n title: ReactNode;\n}\n\nexport function FormSection({\n action,\n badges,\n children,\n description,\n loading = false,\n loadingLabel,\n title,\n}: FormSectionProps) {\n const titleId = useId();\n const content = (\n <section aria-labelledby={titleId}>\n <div className=\"flex min-h-5 items-center justify-between gap-3\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <Heading id={titleId} as=\"h3\" className=\"text-base-700\" variant=\"label\">\n {title}\n </Heading>\n {badges}\n </div>\n {action}\n </div>\n <div className=\"mt-3\">\n <InsetPanel presentation=\"settings\">\n {description ? (\n <FormContent>\n <Text variant=\"caption\" tone=\"muted\">\n {description}\n </Text>\n </FormContent>\n ) : null}\n {children}\n </InsetPanel>\n </div>\n </section>\n );\n\n return loading ? (\n <SkeletonLoader label={loadingLabel ?? (typeof title === 'string' ? title : '')}>{content}</SkeletonLoader>\n ) : (\n content\n );\n}\n\ninterface FormRowProps {\n badges?: ReactNode;\n children: ReactNode;\n description: string;\n /** The row's element id, for linking or scrolling to it; a row with one can take focus when it is opened. */\n id?: string;\n label: ReactNode;\n}\n\nexport function FormRow({ badges, children, description, id, label }: FormRowProps) {\n return (\n <div\n id={id}\n tabIndex={id ? -1 : undefined}\n className={`${rowClasses} sm:grid-cols-[minmax(0,1fr)_13rem] sm:has-[[role=switch]]:grid-cols-[minmax(0,1fr)_auto]`}\n >\n <Stack space=\"tight\" className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-x-2 gap-y-1.5\">\n <Text as=\"span\" variant=\"label\">\n {label}\n </Text>\n {badges}\n </div>\n <Text variant=\"caption\" tone=\"muted\">\n {description}\n </Text>\n </Stack>\n <div className=\"min-w-0 sm:flex sm:justify-end [&>[role=status]]:w-full\">{children}</div>\n </div>\n );\n}\n\ntype FormFieldProps = Omit<FieldProps, 'children' | 'className'> & { action?: ReactNode } & (\n | { children: ReactNode; loading?: false; loadingLabel?: never }\n | { children?: never; loading: true; loadingLabel: string }\n );\n\nexport function FormField({ action, children, loading = false, loadingLabel, ...props }: FormFieldProps) {\n if (loading)\n return (\n <SkeletonLoader label={loadingLabel ?? ''}>\n <div className={`${rowClasses} sm:grid-cols-[9rem_minmax(0,1fr)]`}>\n <Text variant=\"label\" className=\"w-3/4\" loading />\n <SkeletonLoader.Shape presentation=\"control\" />\n </div>\n </SkeletonLoader>\n );\n\n const content = children;\n\n if (action) {\n return (\n <div className={`${rowClasses} grid-cols-[minmax(0,1fr)_auto] sm:grid-cols-[9rem_minmax(0,1fr)_auto]`}>\n <Field\n {...props}\n className=\"contents [&>div]:min-w-0 [&>div:first-child]:col-span-2 [&>div:first-child]:mb-0 sm:[&>div:first-child]:col-span-1 [&>p]:col-span-2 [&>p]:mt-0 sm:[&>p]:col-start-2\"\n >\n {content}\n </Field>\n <div className=\"col-start-2 row-start-2 flex items-center gap-2 sm:col-start-3 sm:row-start-1\">\n {action}\n </div>\n </div>\n );\n }\n\n return (\n <Field\n {...props}\n className={`${rowClasses} sm:grid-cols-[9rem_minmax(0,1fr)] [&>div]:min-w-0 [&>div:first-child]:mb-0 [&>p]:mt-0 sm:[&>p]:col-start-2`}\n >\n {content}\n </Field>\n );\n}\n\nexport function FormAction(props: Omit<ButtonProps, 'type' | 'size' | 'variant' | 'color'>) {\n return <Button {...props} type=\"button\" variant=\"subtle\" />;\n}\n\nexport function Disclosure({ children, label, lazy = false }: { children: ReactNode; label: string; lazy?: boolean }) {\n const [open, setOpen] = useState(false);\n\n return (\n <details className=\"group px-1\" onToggle={(event) => setOpen(event.currentTarget.open)}>\n <summary className=\"text-base-700 hover:text-base-content focus-visible:outline-primary flex w-fit cursor-pointer list-none items-center gap-1.5 rounded py-1 text-xs focus-visible:outline-2 focus-visible:outline-offset-2 [&::-webkit-details-marker]:hidden\">\n <span aria-hidden=\"true\" className=\"-rotate-90 transition-transform group-open:rotate-0 [&>svg]:size-3\">\n <ChevronDownIcon />\n </span>\n {label}\n </summary>\n <div className=\"text-base-700 mt-2 space-y-2 text-xs leading-relaxed\">\n {!lazy || open ? children : null}\n </div>\n </details>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"FormSection.js","names":[],"sources":["../../src/forms/FormSection.tsx"],"sourcesContent":["import { ChevronDownIcon } from 'lucide-react';\nimport { type ComponentProps, type ReactNode, type SyntheticEvent, useId, useState } from 'react';\n\nimport { Button, type ButtonProps } from '../actions/Button';\nimport { Badge } from '../display/Badge';\nimport { InsetPanel } from '../display/InsetPanel';\nimport { SkeletonLoader } from '../feedback/SkeletonLoader';\nimport { Stack } from '../layout/Flow';\nimport { HelpTip } from '../overlays/HelpTip';\nimport { Heading, Text } from '../typography/Typography';\nimport { Field, type FieldProps } from './Field';\n\ntype DataAttributes = { [key: `data-${string}`]: string | undefined };\n\nconst contentSpacing = 'px-4 py-3.5 sm:px-5';\nconst rowClasses = `grid min-w-0 gap-x-6 gap-y-3 sm:items-center ${contentSpacing}`;\n\nexport function FormContent({ children }: { children: ReactNode }) {\n return (\n <Stack space=\"group\" className={contentSpacing}>\n {children}\n </Stack>\n );\n}\n\nexport function FormStack({ children }: { children: ReactNode }) {\n return <Stack space=\"page\">{children}</Stack>;\n}\n\ninterface FormSectionProps {\n action?: ReactNode;\n badges?: ReactNode;\n children: ReactNode;\n description?: string;\n loading?: boolean;\n loadingLabel?: string;\n presentation?: 'default';\n title: ReactNode;\n}\n\n/** A dense tool's settings group: its title (with an optional help popover) and description over the content as\n * given, such as one or more settings panels and their notes. */\ninterface DenseFormSectionProps extends DataAttributes {\n presentation: 'dense';\n title?: ReactNode;\n /** Explains the group in a popover from a help button after the title; `helpLabel` names that button. */\n help?: ReactNode;\n helpLabel?: string;\n description?: ReactNode;\n /** Names the group when its title doesn't, or when it has none. */\n 'aria-label'?: string;\n children?: ReactNode;\n}\n\nexport function FormSection(props: FormSectionProps | DenseFormSectionProps) {\n if (props.presentation === 'dense') return <DenseFormSection {...props} />;\n\n return <PanelFormSection {...props} />;\n}\n\nfunction DenseFormSection({\n presentation: _presentation,\n title,\n help,\n helpLabel,\n description,\n 'aria-label': label,\n children,\n ...data\n}: DenseFormSectionProps) {\n const titleId = useId();\n\n return (\n <section\n {...data}\n aria-label={label}\n aria-labelledby={label || !title ? undefined : titleId}\n className=\"grid min-w-0 gap-3\"\n >\n {(title || description) && (\n <div>\n {title && (\n <h3 id={titleId} className=\"m-0 flex items-center gap-1.5 text-[13px] font-semibold\">\n {title}\n {help && (\n <HelpTip label={helpLabel ?? (typeof title === 'string' ? title : '')}>{help}</HelpTip>\n )}\n </h3>\n )}\n {description && <p className=\"text-base-700 m-0 mt-0.5 text-xs\">{description}</p>}\n </div>\n )}\n {children}\n </section>\n );\n}\n\nfunction PanelFormSection({\n action,\n badges,\n children,\n description,\n loading = false,\n loadingLabel,\n title,\n}: FormSectionProps) {\n const titleId = useId();\n const content = (\n <section aria-labelledby={titleId}>\n <div className=\"flex min-h-5 items-center justify-between gap-3\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <Heading id={titleId} as=\"h3\" className=\"text-base-700\" variant=\"label\">\n {title}\n </Heading>\n {badges}\n </div>\n {action}\n </div>\n <div className=\"mt-3\">\n <InsetPanel presentation=\"settings\">\n {description ? (\n <FormContent>\n <Text variant=\"caption\" tone=\"muted\">\n {description}\n </Text>\n </FormContent>\n ) : null}\n {children}\n </InsetPanel>\n </div>\n </section>\n );\n\n return loading ? (\n <SkeletonLoader label={loadingLabel ?? (typeof title === 'string' ? title : '')}>{content}</SkeletonLoader>\n ) : (\n content\n );\n}\n\ninterface FormRowColumnsProps {\n badges?: ReactNode;\n children: ReactNode;\n description: string;\n /** The row's element id, for linking or scrolling to it; a row with one can take focus when it is opened. */\n id?: string;\n label: ReactNode;\n layout?: 'columns';\n}\n\n/** A dense tool's settings row: the label (with an optional help popover) and description, then its controls flowing\n * beside them and wrapping under them when they don't fit, then content below and an error. */\ninterface FormRowFlowProps extends DataAttributes {\n layout: 'flow';\n label: ReactNode;\n /** Explains the setting in a popover from a help button after the label; `helpLabel` names that button. */\n help?: ReactNode;\n helpLabel?: string;\n description?: ReactNode;\n children?: ReactNode;\n /** Full-width content under the label and controls, such as a list the setting governs. */\n below?: ReactNode;\n error?: string | undefined;\n /** The error's element id, for a control's aria-describedby. */\n errorId?: string;\n}\n\ntype FormRowProps = FormRowColumnsProps | FormRowFlowProps;\n\nexport function FormRow(props: FormRowProps) {\n if (props.layout === 'flow') return <FormRowFlow {...props} />;\n\n const { badges, children, description, id, label } = props;\n\n return (\n <div\n id={id}\n tabIndex={id ? -1 : undefined}\n className={`${rowClasses} sm:grid-cols-[minmax(0,1fr)_13rem] sm:has-[[role=switch]]:grid-cols-[minmax(0,1fr)_auto]`}\n >\n <Stack space=\"tight\" className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-x-2 gap-y-1.5\">\n <Text as=\"span\" variant=\"label\">\n {label}\n </Text>\n {badges}\n </div>\n <Text variant=\"caption\" tone=\"muted\">\n {description}\n </Text>\n </Stack>\n <div className=\"min-w-0 sm:flex sm:justify-end [&>[role=status]]:w-full\">{children}</div>\n </div>\n );\n}\n\nfunction FormRowFlow({\n layout: _layout,\n label,\n help,\n helpLabel,\n description,\n children,\n below,\n error,\n errorId,\n ...data\n}: FormRowFlowProps) {\n const fallbackErrorId = useId();\n\n return (\n <div {...data} className=\"settings-row grid min-w-0 gap-2 px-4 py-3\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-x-6 gap-y-2\">\n <div className=\"min-w-32 flex-1\">\n <div className=\"settings-row-title flex min-w-0 items-center gap-1.5 text-[13px] font-medium wrap-anywhere\">\n {label}\n {help && (\n <HelpTip label={helpLabel ?? (typeof label === 'string' ? label : '')}>{help}</HelpTip>\n )}\n </div>\n {description && <div className=\"text-base-700 text-xs wrap-anywhere\">{description}</div>}\n </div>\n {children && (\n <div className=\"settings-row-control flex max-w-full min-w-0 flex-wrap items-center gap-2 sm:max-w-[60%] [&_button]:max-w-full [&>span]:max-w-full\">\n {children}\n </div>\n )}\n </div>\n {below}\n {error && (\n <p id={errorId ?? fallbackErrorId} role=\"alert\" className=\"m-0 text-xs text-(--lar-danger-text)\">\n {error}\n </p>\n )}\n </div>\n );\n}\n\n/** A value and its unit beside it in a row's controls, such as a number field and \"days\". */\nexport function FormUnit({ children, unit }: { children: ReactNode; unit: ReactNode }) {\n return (\n <span className=\"flex items-center gap-2 text-sm [&_input]:w-20\">\n {children}\n {unit}\n </span>\n );\n}\n\ntype FormFieldProps = Omit<FieldProps, 'children' | 'className'> & { action?: ReactNode } & (\n | { children: ReactNode; loading?: false; loadingLabel?: never }\n | { children?: never; loading: true; loadingLabel: string }\n );\n\nexport function FormField({ action, children, loading = false, loadingLabel, ...props }: FormFieldProps) {\n if (loading)\n return (\n <SkeletonLoader label={loadingLabel ?? ''}>\n <div className={`${rowClasses} sm:grid-cols-[9rem_minmax(0,1fr)]`}>\n <Text variant=\"label\" className=\"w-3/4\" loading />\n <SkeletonLoader.Shape presentation=\"control\" />\n </div>\n </SkeletonLoader>\n );\n\n const content = children;\n\n if (action) {\n return (\n <div className={`${rowClasses} grid-cols-[minmax(0,1fr)_auto] sm:grid-cols-[9rem_minmax(0,1fr)_auto]`}>\n <Field\n {...props}\n className=\"contents [&>div]:min-w-0 [&>div:first-child]:col-span-2 [&>div:first-child]:mb-0 sm:[&>div:first-child]:col-span-1 [&>p]:col-span-2 [&>p]:mt-0 sm:[&>p]:col-start-2\"\n >\n {content}\n </Field>\n <div className=\"col-start-2 row-start-2 flex items-center gap-2 sm:col-start-3 sm:row-start-1\">\n {action}\n </div>\n </div>\n );\n }\n\n return (\n <Field\n {...props}\n className={`${rowClasses} sm:grid-cols-[9rem_minmax(0,1fr)] [&>div]:min-w-0 [&>div:first-child]:mb-0 [&>p]:mt-0 sm:[&>p]:col-start-2`}\n >\n {content}\n </Field>\n );\n}\n\nexport function FormAction(props: Omit<ButtonProps, 'type' | 'size' | 'variant' | 'color'>) {\n return <Button {...props} type=\"button\" variant=\"subtle\" />;\n}\n\nexport function Disclosure({\n children,\n label,\n lazy = false,\n presentation = 'note',\n defaultOpen = false,\n badge,\n onOpenChange,\n ...data\n}: {\n children: ReactNode;\n label: string;\n lazy?: boolean;\n /** `note` folds small muted text behind a chevron; `section` folds a section's own content, such as an earlier\n * version of a text, behind a muted label in the body size; `group` folds a form's optional group behind its\n * heading, such as optional settings; `framed` folds a short list in a frame, such as entries that can't be\n * picked. */\n presentation?: 'note' | 'section' | 'group' | 'framed';\n /** Starts open, such as a group whose kept answers may need a look. */\n defaultOpen?: boolean;\n /** A `group`'s badge after its heading, such as \"Optional\". */\n badge?: string | undefined;\n /** Hears each time it opens or closes, such as to read what it shows once it opens. */\n onOpenChange?: (open: boolean) => void;\n} & DataAttributes) {\n const [open, setOpen] = useState(defaultOpen);\n const shown = !lazy || open ? children : null;\n const toggle = (event: SyntheticEvent<HTMLDetailsElement>) => {\n setOpen(event.currentTarget.open);\n onOpenChange?.(event.currentTarget.open);\n };\n\n if (presentation === 'group')\n return (\n <details {...data} open={open} onToggle={toggle} className=\"min-w-0\">\n <summary className=\"cursor-pointer text-[13px] font-semibold\">\n {label}\n {badge && (\n <>\n {' '}\n <Badge className=\"ms-1\">{badge}</Badge>\n </>\n )}\n </summary>\n {shown && <div className=\"mt-3 grid min-w-0 gap-3\">{shown}</div>}\n </details>\n );\n\n if (presentation === 'framed')\n return (\n <details {...data} open={open} onToggle={toggle} className=\"min-w-0 rounded-lg border px-3 py-2\">\n <summary className=\"cursor-pointer text-sm font-medium\">{label}</summary>\n <div className=\"mt-2\">{shown}</div>\n </details>\n );\n\n if (presentation === 'section')\n return (\n <details {...data} className=\"grid min-w-0 gap-2\" onToggle={toggle}>\n <summary className=\"text-base-700 cursor-pointer text-sm\">{label}</summary>\n <div className=\"pt-2\">{shown}</div>\n </details>\n );\n\n return (\n <details {...data} className=\"group px-1\" onToggle={toggle}>\n <summary className=\"text-base-700 hover:text-base-content focus-visible:outline-primary flex w-fit cursor-pointer list-none items-center gap-1.5 rounded py-1 text-xs focus-visible:outline-2 focus-visible:outline-offset-2 [&::-webkit-details-marker]:hidden\">\n <span aria-hidden=\"true\" className=\"-rotate-90 transition-transform group-open:rotate-0 [&>svg]:size-3\">\n <ChevronDownIcon />\n </span>\n {label}\n </summary>\n <div className=\"text-base-700 mt-2 space-y-2 text-xs leading-relaxed\">{shown}</div>\n </details>\n );\n}\n\ntype FormFieldsetProps = Omit<ComponentProps<'fieldset'>, 'style'> & {\n /** The legend over the group. */\n legend?: ReactNode;\n /** Names the group for assistive technology only, where what's around it already says what it is. */\n hiddenLegend?: boolean;\n /** `group` only groups and disables its fields, with no frame. */\n presentation?: 'bordered' | 'group';\n};\n\n/** The form section's fieldset: a bordered group of controls under a legend, on the native fieldset, which also\n * disables every control inside it. As a `group`, it only groups and disables its fields. */\nexport function FormFieldset({\n legend,\n hiddenLegend = false,\n presentation = 'bordered',\n className = '',\n children,\n ...props\n}: FormFieldsetProps) {\n return (\n <fieldset\n className={`m-0 min-w-0 ${presentation === 'group' ? 'border-0 p-0' : 'border-base-300 mb-3 rounded-lg border px-3 pt-2 pb-0 [&>legend]:mb-2 [&>legend]:font-semibold'} ${className}`}\n data-slot=\"fieldset\"\n {...props}\n >\n {legend ? (\n <legend\n className={hiddenLegend ? 'sr-only' : 'text-base-content p-0 text-sm leading-5 font-medium'}\n data-slot=\"fieldset-legend\"\n >\n {legend}\n </legend>\n ) : null}\n {children}\n </fieldset>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /** A value a form submits that nobody edits in place, such as a pick made in a popover: a hidden field. */
2
+ export declare function HiddenField({ name, value }: {
3
+ name: string;
4
+ value: string;
5
+ }): import("react").JSX.Element;
6
+ //# sourceMappingURL=HiddenField.d.ts.map
@@ -0,0 +1,13 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ // src/forms/HiddenField.tsx
3
+ /** A value a form submits that nobody edits in place, such as a pick made in a popover: a hidden field. */
4
+ function HiddenField({ name, value }) {
5
+ return /* @__PURE__ */ jsx("input", {
6
+ type: "hidden",
7
+ name,
8
+ value
9
+ });
10
+ }
11
+ export { HiddenField };
12
+
13
+ //# sourceMappingURL=HiddenField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HiddenField.js","names":[],"sources":["../../src/forms/HiddenField.tsx"],"sourcesContent":["/** A value a form submits that nobody edits in place, such as a pick made in a popover: a hidden field. */\nexport function HiddenField({ name, value }: { name: string; value: string }) {\n return <input type=\"hidden\" name={name} value={value} />;\n}\n"],"mappings":";;;AACA,SAAgB,YAAY,EAAE,MAAM,SAA0C;CAC1E,OAAO,oBAAC,SAAD;EAAO,MAAK;EAAe;EAAa;CAAQ,CAAA;AAC3D"}
@@ -1,5 +1,15 @@
1
1
  import { InputProps } from "@ninna-ui/forms";
2
- type InputProps$1 = Omit<InputProps, 'fullWidth'>;
3
- declare const Input$1: import("react").ForwardRefExoticComponent<InputProps$1 & import("react").RefAttributes<HTMLInputElement>>;
2
+ type InputProps$1 = Omit<InputProps, 'fullWidth'> & {
3
+ /** A `field` fills its container; `setting` is a settings row's 16rem text field, narrower where the row is; `short`
4
+ * holds a few characters, such as a hex colour; `count` a small whole number; `title` is a document's title typed
5
+ * in place, borderless in large semibold type, such as a new item's. */
6
+ presentation?: 'field' | 'setting' | 'short' | 'count' | 'title';
7
+ };
8
+ declare const Input$1: import("react").ForwardRefExoticComponent<Omit<InputProps, "fullWidth"> & {
9
+ /** A `field` fills its container; `setting` is a settings row's 16rem text field, narrower where the row is; `short`
10
+ * holds a few characters, such as a hex colour; `count` a small whole number; `title` is a document's title typed
11
+ * in place, borderless in large semibold type, such as a new item's. */
12
+ presentation?: 'field' | 'setting' | 'short' | 'count' | 'title';
13
+ } & import("react").RefAttributes<HTMLInputElement>>;
4
14
  export { Input$1 as Input, InputProps$1 as InputProps };
5
15
  //# sourceMappingURL=Input.d.ts.map
@@ -3,14 +3,21 @@ import { forwardRef } from "react";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  import { Input } from "@ninna-ui/forms";
5
5
  // src/forms/Input.tsx
6
- const Input$1 = forwardRef(({ size = formControlDefaults.size, variant = formControlDefaults.variant, className, ...props }, ref) => /* @__PURE__ */ jsx(Input, {
6
+ const presentations = {
7
+ field: "",
8
+ setting: "w-64 max-w-full",
9
+ short: "w-24",
10
+ count: "w-20",
11
+ title: "text-base-content w-full shrink-0 border-0 bg-transparent p-0 text-xl font-semibold tracking-tight outline-none placeholder:font-medium placeholder:text-(--muted-foreground)"
12
+ };
13
+ const Input$1 = forwardRef(({ size = formControlDefaults.size, variant = formControlDefaults.variant, presentation = "field", className, ...props }, ref) => /* @__PURE__ */ jsx(Input, {
7
14
  ref,
8
15
  color: formControlDefaults.color,
9
16
  ...props,
10
17
  fullWidth: true,
11
18
  size,
12
- variant,
13
- className: `${variant === "filled" ? formControlClasses : ""} ${className ?? ""}`
19
+ variant: presentation === "title" ? "unstyled" : variant,
20
+ className: `${variant === "filled" && presentation !== "title" ? formControlClasses : ""} ${presentations[presentation]} ${className ?? ""}`
14
21
  }));
15
22
  Input$1.displayName = "Input";
16
23
  export { Input$1 as Input };
@@ -1 +1 @@
1
- {"version":3,"file":"Input.js","names":["Input","NinnaInput"],"sources":["../../src/forms/Input.tsx"],"sourcesContent":["import { Input as NinnaInput, type InputProps as NinnaInputProps } from '@ninna-ui/forms';\nimport { forwardRef } from 'react';\n\nimport { formControlClasses, formControlDefaults } from './FormControlStyles';\n\nexport type InputProps = Omit<NinnaInputProps, 'fullWidth'>;\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n ({ size = formControlDefaults.size, variant = formControlDefaults.variant, className, ...props }, ref) => (\n <NinnaInput\n ref={ref}\n color={formControlDefaults.color}\n {...props}\n fullWidth\n size={size}\n variant={variant}\n className={`${variant === 'filled' ? formControlClasses : ''} ${className ?? ''}`}\n />\n ),\n);\n\nInput.displayName = 'Input';\n"],"mappings":";;;;;AAOA,MAAaA,UAAQ,YAChB,EAAE,OAAO,oBAAoB,MAAM,UAAU,oBAAoB,SAAS,WAAW,GAAG,SAAS,QAC9F,oBAACC,OAAD;CACS;CACL,OAAO,oBAAoB;CAC3B,GAAI;CACJ,WAAA;CACM;CACG;CACT,WAAW,GAAG,YAAY,WAAW,qBAAqB,GAAG,GAAG,aAAa;AAChF,CAAA,CAET;AAEA,QAAM,cAAc"}
1
+ {"version":3,"file":"Input.js","names":["Input","NinnaInput"],"sources":["../../src/forms/Input.tsx"],"sourcesContent":["import { Input as NinnaInput, type InputProps as NinnaInputProps } from '@ninna-ui/forms';\nimport { forwardRef } from 'react';\n\nimport { formControlClasses, formControlDefaults } from './FormControlStyles';\n\nexport type InputProps = Omit<NinnaInputProps, 'fullWidth'> & {\n /** A `field` fills its container; `setting` is a settings row's 16rem text field, narrower where the row is; `short`\n * holds a few characters, such as a hex colour; `count` a small whole number; `title` is a document's title typed\n * in place, borderless in large semibold type, such as a new item's. */\n presentation?: 'field' | 'setting' | 'short' | 'count' | 'title';\n};\n\nconst presentations = {\n field: '',\n setting: 'w-64 max-w-full',\n short: 'w-24',\n count: 'w-20',\n title: 'text-base-content w-full shrink-0 border-0 bg-transparent p-0 text-xl font-semibold tracking-tight outline-none placeholder:font-medium placeholder:text-(--muted-foreground)',\n} as const;\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n size = formControlDefaults.size,\n variant = formControlDefaults.variant,\n presentation = 'field',\n className,\n ...props\n },\n ref,\n ) => (\n <NinnaInput\n ref={ref}\n color={formControlDefaults.color}\n {...props}\n fullWidth\n size={size}\n variant={presentation === 'title' ? 'unstyled' : variant}\n className={`${variant === 'filled' && presentation !== 'title' ? formControlClasses : ''} ${presentations[presentation]} ${className ?? ''}`}\n />\n ),\n);\n\nInput.displayName = 'Input';\n"],"mappings":";;;;;AAYA,MAAM,gBAAgB;CAClB,OAAO;CACP,SAAS;CACT,OAAO;CACP,OAAO;CACP,OAAO;AACX;AAEA,MAAaA,UAAQ,YAEb,EACI,OAAO,oBAAoB,MAC3B,UAAU,oBAAoB,SAC9B,eAAe,SACf,WACA,GAAG,SAEP,QAEA,oBAACC,OAAD;CACS;CACL,OAAO,oBAAoB;CAC3B,GAAI;CACJ,WAAA;CACM;CACN,SAAS,iBAAiB,UAAU,aAAa;CACjD,WAAW,GAAG,YAAY,YAAY,iBAAiB,UAAU,qBAAqB,GAAG,GAAG,cAAc,cAAc,GAAG,aAAa;AAC3I,CAAA,CAET;AAEA,QAAM,cAAc"}
@@ -0,0 +1,43 @@
1
+ export interface LabelChoice {
2
+ name: string;
3
+ /** A CSS colour; a tracker with no label colours gives none. */
4
+ color?: string | undefined;
5
+ description?: string | undefined;
6
+ }
7
+ /** Lets a typed name no choice has become a new label. */
8
+ export interface LabelCreation {
9
+ /** Why this person can't add new labels at all, or null when they can. */
10
+ refused: string | null;
11
+ /** Why this name can't be a label, or null when it can. */
12
+ problem: (name: string) => string | null;
13
+ /** What adding one does, under the list. */
14
+ note: string;
15
+ /** The button that adds `name`, such as `Create "name"`. */
16
+ createLabel: (name: string) => string;
17
+ onCreate: (name: string) => void;
18
+ }
19
+ interface LabelPickerProps {
20
+ choices: readonly LabelChoice[];
21
+ picked: readonly string[];
22
+ onToggle: (name: string) => void;
23
+ /** The filter field's accessible name and its placeholder. */
24
+ filterLabel: string;
25
+ placeholder: string;
26
+ /** Shown when the filter matches nothing. */
27
+ noMatchLabel: string;
28
+ /** Choices shown ticked or not but not changeable here, each marked with `lockedNote`. */
29
+ locked?: readonly string[];
30
+ lockedNote?: string;
31
+ busy?: boolean;
32
+ create?: LabelCreation;
33
+ /** Whether two names are the same label; trackers compare them ignoring case. */
34
+ same?: (a: string, b: string) => boolean;
35
+ }
36
+ /**
37
+ * A searchable checklist of labels, with each label's colour and description. It holds only its search text: the
38
+ * caller gives the choices, what is picked and what a toggle does, so it reads and writes whichever way its surface
39
+ * needs. With `create`, Enter or the create button lets a typed name no choice has in.
40
+ */
41
+ export declare function LabelPicker({ choices, picked, onToggle, filterLabel, placeholder, noMatchLabel, locked, lockedNote, busy, create, same }: LabelPickerProps): import("react").JSX.Element;
42
+ export {};
43
+ //# sourceMappingURL=LabelPicker.d.ts.map
@@ -0,0 +1,107 @@
1
+ import { Button } from "../actions/Button.js";
2
+ import { StatusIndicator } from "../feedback/StatusIndicator.js";
3
+ import { Checkbox } from "./Checkbox.js";
4
+ import { Input } from "./Input.js";
5
+ import { useState } from "react";
6
+ import { PlusIcon } from "lucide-react";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ // src/forms/LabelPicker.tsx
9
+ const ignoringCase = (a, b) => a.toLowerCase() === b.toLowerCase();
10
+ /**
11
+ * A searchable checklist of labels, with each label's colour and description. It holds only its search text: the
12
+ * caller gives the choices, what is picked and what a toggle does, so it reads and writes whichever way its surface
13
+ * needs. With `create`, Enter or the create button lets a typed name no choice has in.
14
+ */
15
+ function LabelPicker({ choices, picked, onToggle, filterLabel, placeholder, noMatchLabel, locked = [], lockedNote, busy = false, create, same = ignoringCase }) {
16
+ const [query, setQuery] = useState("");
17
+ const typed = query.trim();
18
+ const hits = choices.filter(({ name }) => name.toLowerCase().includes(typed.toLowerCase()));
19
+ const fresh = !!create && !!typed && !choices.some(({ name }) => same(name, typed));
20
+ const refusal = fresh ? create.refused ?? create.problem(typed) : null;
21
+ const add = () => {
22
+ create?.onCreate(typed);
23
+ setQuery("");
24
+ };
25
+ return /* @__PURE__ */ jsxs("div", {
26
+ className: "grid w-72 gap-2",
27
+ "data-label-picker": true,
28
+ "aria-busy": busy,
29
+ children: [
30
+ /* @__PURE__ */ jsx(Input, {
31
+ autoFocus: true,
32
+ placeholder,
33
+ "aria-label": filterLabel,
34
+ value: query,
35
+ onChange: (e) => setQuery(e.target.value),
36
+ onKeyDown: (e) => {
37
+ if (e.key !== "Enter") return;
38
+ e.preventDefault();
39
+ if (fresh && !refusal) add();
40
+ }
41
+ }),
42
+ /* @__PURE__ */ jsxs("div", {
43
+ className: "grid max-h-56 gap-0.5 overflow-y-auto",
44
+ children: [hits.map(({ name, color, description }) => {
45
+ const fixed = locked.some((label) => same(label, name));
46
+ return /* @__PURE__ */ jsxs("label", {
47
+ "data-label-choice": true,
48
+ className: "hover:bg-base-200 flex cursor-pointer items-start gap-2 rounded-md px-1.5 py-1 text-xs",
49
+ children: [
50
+ /* @__PURE__ */ jsx(Checkbox, {
51
+ checked: picked.some((label) => same(label, name)),
52
+ disabled: fixed,
53
+ onChange: () => onToggle(name)
54
+ }),
55
+ color && /* @__PURE__ */ jsx("span", {
56
+ "data-label-dot": true,
57
+ className: "mt-1 flex",
58
+ children: /* @__PURE__ */ jsx(StatusIndicator, {
59
+ tone: "neutral",
60
+ labelColor: color
61
+ })
62
+ }),
63
+ /* @__PURE__ */ jsxs("span", {
64
+ className: "min-w-0 flex-1",
65
+ children: [/* @__PURE__ */ jsxs("span", {
66
+ className: "block wrap-anywhere",
67
+ children: [name, fixed && lockedNote && /* @__PURE__ */ jsxs("span", {
68
+ className: "text-base-700",
69
+ children: [" · ", lockedNote]
70
+ })]
71
+ }), description && /* @__PURE__ */ jsx("span", {
72
+ className: "text-base-700 block text-[11px]",
73
+ children: description
74
+ })]
75
+ })
76
+ ]
77
+ }, name);
78
+ }), !hits.length && !fresh && /* @__PURE__ */ jsx("p", {
79
+ className: "text-base-700 m-0 p-1.5 text-[11px]",
80
+ children: noMatchLabel
81
+ })]
82
+ }),
83
+ fresh && !refusal && /* @__PURE__ */ jsx("span", {
84
+ className: "justify-self-start",
85
+ children: /* @__PURE__ */ jsx(Button, {
86
+ variant: "secondary",
87
+ compact: true,
88
+ leftIcon: /* @__PURE__ */ jsx(PlusIcon, {}),
89
+ onClick: add,
90
+ children: create.createLabel(typed)
91
+ })
92
+ }),
93
+ refusal && /* @__PURE__ */ jsx("p", {
94
+ role: "alert",
95
+ className: "text-base-700 m-0 text-[11px]",
96
+ children: refusal
97
+ }),
98
+ create && !create.refused && /* @__PURE__ */ jsx("p", {
99
+ className: "text-base-700 m-0 text-[11px]",
100
+ children: create.note
101
+ })
102
+ ]
103
+ });
104
+ }
105
+ export { LabelPicker };
106
+
107
+ //# sourceMappingURL=LabelPicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LabelPicker.js","names":[],"sources":["../../src/forms/LabelPicker.tsx"],"sourcesContent":["import { PlusIcon } from 'lucide-react';\nimport { useState } from 'react';\n\nimport { Button } from '../actions/Button';\nimport { StatusIndicator } from '../feedback/StatusIndicator';\nimport { Checkbox } from './Checkbox';\nimport { Input } from './Input';\n\nexport interface LabelChoice {\n name: string;\n /** A CSS colour; a tracker with no label colours gives none. */\n color?: string | undefined;\n description?: string | undefined;\n}\n\n/** Lets a typed name no choice has become a new label. */\nexport interface LabelCreation {\n /** Why this person can't add new labels at all, or null when they can. */\n refused: string | null;\n /** Why this name can't be a label, or null when it can. */\n problem: (name: string) => string | null;\n /** What adding one does, under the list. */\n note: string;\n /** The button that adds `name`, such as `Create \"name\"`. */\n createLabel: (name: string) => string;\n onCreate: (name: string) => void;\n}\n\ninterface LabelPickerProps {\n choices: readonly LabelChoice[];\n picked: readonly string[];\n onToggle: (name: string) => void;\n /** The filter field's accessible name and its placeholder. */\n filterLabel: string;\n placeholder: string;\n /** Shown when the filter matches nothing. */\n noMatchLabel: string;\n /** Choices shown ticked or not but not changeable here, each marked with `lockedNote`. */\n locked?: readonly string[];\n lockedNote?: string;\n busy?: boolean;\n create?: LabelCreation;\n /** Whether two names are the same label; trackers compare them ignoring case. */\n same?: (a: string, b: string) => boolean;\n}\n\nconst ignoringCase = (a: string, b: string) => a.toLowerCase() === b.toLowerCase();\n\n/**\n * A searchable checklist of labels, with each label's colour and description. It holds only its search text: the\n * caller gives the choices, what is picked and what a toggle does, so it reads and writes whichever way its surface\n * needs. With `create`, Enter or the create button lets a typed name no choice has in.\n */\nexport function LabelPicker({\n choices,\n picked,\n onToggle,\n filterLabel,\n placeholder,\n noMatchLabel,\n locked = [],\n lockedNote,\n busy = false,\n create,\n same = ignoringCase,\n}: LabelPickerProps) {\n const [query, setQuery] = useState('');\n const typed = query.trim();\n const hits = choices.filter(({ name }) => name.toLowerCase().includes(typed.toLowerCase()));\n const fresh = !!create && !!typed && !choices.some(({ name }) => same(name, typed));\n const refusal = fresh ? (create.refused ?? create.problem(typed)) : null;\n const add = () => {\n create?.onCreate(typed);\n setQuery('');\n };\n\n return (\n <div className=\"grid w-72 gap-2\" data-label-picker aria-busy={busy}>\n <Input\n autoFocus\n placeholder={placeholder}\n aria-label={filterLabel}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={(e) => {\n if (e.key !== 'Enter') return;\n\n e.preventDefault();\n\n if (fresh && !refusal) add();\n }}\n />\n <div className=\"grid max-h-56 gap-0.5 overflow-y-auto\">\n {hits.map(({ name, color, description }) => {\n const fixed = locked.some((label) => same(label, name));\n\n return (\n <label\n key={name}\n data-label-choice\n className=\"hover:bg-base-200 flex cursor-pointer items-start gap-2 rounded-md px-1.5 py-1 text-xs\"\n >\n <Checkbox\n checked={picked.some((label) => same(label, name))}\n disabled={fixed}\n onChange={() => onToggle(name)}\n />\n {color && (\n <span data-label-dot className=\"mt-1 flex\">\n <StatusIndicator tone=\"neutral\" labelColor={color} />\n </span>\n )}\n <span className=\"min-w-0 flex-1\">\n <span className=\"block wrap-anywhere\">\n {name}\n {fixed && lockedNote && <span className=\"text-base-700\"> · {lockedNote}</span>}\n </span>\n {description && <span className=\"text-base-700 block text-[11px]\">{description}</span>}\n </span>\n </label>\n );\n })}\n {!hits.length && !fresh && <p className=\"text-base-700 m-0 p-1.5 text-[11px]\">{noMatchLabel}</p>}\n </div>\n {fresh && !refusal && (\n <span className=\"justify-self-start\">\n <Button variant=\"secondary\" compact leftIcon={<PlusIcon />} onClick={add}>\n {create.createLabel(typed)}\n </Button>\n </span>\n )}\n {refusal && (\n <p role=\"alert\" className=\"text-base-700 m-0 text-[11px]\">\n {refusal}\n </p>\n )}\n {create && !create.refused && <p className=\"text-base-700 m-0 text-[11px]\">{create.note}</p>}\n </div>\n );\n}\n"],"mappings":";;;;;;;;AA8CA,MAAM,gBAAgB,GAAW,MAAc,EAAE,YAAY,MAAM,EAAE,YAAY;;;;;;AAOjF,SAAgB,YAAY,EACxB,SACA,QACA,UACA,aACA,aACA,cACA,SAAS,CAAC,GACV,YACA,OAAO,OACP,QACA,OAAO,gBACU;CACjB,MAAM,CAAC,OAAO,YAAY,SAAS,EAAE;CACrC,MAAM,QAAQ,MAAM,KAAK;CACzB,MAAM,OAAO,QAAQ,QAAQ,EAAE,WAAW,KAAK,YAAY,CAAC,CAAC,SAAS,MAAM,YAAY,CAAC,CAAC;CAC1F,MAAM,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,QAAQ,MAAM,EAAE,WAAW,KAAK,MAAM,KAAK,CAAC;CAClF,MAAM,UAAU,QAAS,OAAO,WAAW,OAAO,QAAQ,KAAK,IAAK;CACpE,MAAM,YAAY;EACd,QAAQ,SAAS,KAAK;EACtB,SAAS,EAAE;CACf;CAEA,OACI,qBAAC,OAAD;EAAK,WAAU;EAAkB,qBAAA;EAAkB,aAAW;EAA9D,UAAA;GACI,oBAAC,OAAD;IACI,WAAA;IACa;IACb,cAAY;IACZ,OAAO;IACP,WAAW,MAAM,SAAS,EAAE,OAAO,KAAK;IACxC,YAAY,MAAM;KACd,IAAI,EAAE,QAAQ,SAAS;KAEvB,EAAE,eAAe;KAEjB,IAAI,SAAS,CAAC,SAAS,IAAI;IAC/B;GACH,CAAA;GACD,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACK,KAAK,KAAK,EAAE,MAAM,OAAO,kBAAkB;KACxC,MAAM,QAAQ,OAAO,MAAM,UAAU,KAAK,OAAO,IAAI,CAAC;KAEtD,OACI,qBAAC,SAAD;MAEI,qBAAA;MACA,WAAU;MAHd,UAAA;OAKI,oBAAC,UAAD;QACI,SAAS,OAAO,MAAM,UAAU,KAAK,OAAO,IAAI,CAAC;QACjD,UAAU;QACV,gBAAgB,SAAS,IAAI;OAChC,CAAA;OACA,SACG,oBAAC,QAAD;QAAM,kBAAA;QAAe,WAAU;QAC3B,UAAA,oBAAC,iBAAD;SAAiB,MAAK;SAAU,YAAY;QAAQ,CAAA;OAClD,CAAA;OAEV,qBAAC,QAAD;QAAM,WAAU;QAAhB,UAAA,CACI,qBAAC,QAAD;SAAM,WAAU;SAAhB,UAAA,CACK,MACA,SAAS,cAAc,qBAAC,QAAD;UAAM,WAAU;UAAhB,UAAA,CAAgC,OAAI,UAAiB;SAC3E,CAAA,CAAA;QACL,CAAA,GAAA,eAAe,oBAAC,QAAD;SAAM,WAAU;SAAmC,UAAA;QAAkB,CAAA,CACnF;;MACH;KArBE,GAAA,IAqBF;IAEf,CAAC,GACA,CAAC,KAAK,UAAU,CAAC,SAAS,oBAAC,KAAD;KAAG,WAAU;KAAuC,UAAA;IAAgB,CAAA,CAC9F;;GACJ,SAAS,CAAC,WACP,oBAAC,QAAD;IAAM,WAAU;IACZ,UAAA,oBAAC,QAAD;KAAQ,SAAQ;KAAY,SAAA;KAAQ,UAAU,oBAAC,UAAD,CAAW,CAAA;KAAG,SAAS;KAChE,UAAA,OAAO,YAAY,KAAK;IACrB,CAAA;GACN,CAAA;GAET,WACG,oBAAC,KAAD;IAAG,MAAK;IAAQ,WAAU;IACrB,UAAA;GACF,CAAA;GAEN,UAAU,CAAC,OAAO,WAAW,oBAAC,KAAD;IAAG,WAAU;IAAiC,UAAA,OAAO;GAAQ,CAAA;EAC1F;;AAEb"}
@@ -0,0 +1,21 @@
1
+ import { RichTextFormat } from "../display/RichText.js";
2
+ interface MarkdownEditorProps {
3
+ /** The Markdown it starts from; later changes to it are ignored. */
4
+ value: string;
5
+ /** How `value` is written; the editor reports Markdown either way. */
6
+ format?: RichTextFormat;
7
+ onChange: (markdown: string) => void;
8
+ label: string;
9
+ placeholder: string;
10
+ /** Grows the editor into its parent's height, or, when 'wide', only while its container is 40rem wide or more and
11
+ * otherwise with its text, uncapped, as its parent scrolls. Without it, it grows with its text up to a cap. */
12
+ fill?: boolean | 'wide';
13
+ disabled?: boolean;
14
+ autoFocus?: boolean;
15
+ /** Called with the Markdown the editor makes of `value`, before any edit. */
16
+ onBaseline?: (markdown: string) => void;
17
+ }
18
+ /** A rich text field that reads and reports Markdown, such as a ticket's description, with a formatting toolbar. */
19
+ export declare function MarkdownEditor({ value, format, onChange, label, placeholder, fill, disabled, autoFocus, onBaseline }: MarkdownEditorProps): import("react").JSX.Element;
20
+ export {};
21
+ //# sourceMappingURL=MarkdownEditor.d.ts.map