@cratis/components 4.23.1 → 4.25.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 (346) hide show
  1. package/compat-manifest.json +11 -11
  2. package/dist/esm/Common/CratisComponentsProvider.d.ts +2 -0
  3. package/dist/esm/Common/CratisComponentsProvider.d.ts.map +1 -1
  4. package/dist/esm/Common/CratisComponentsProvider.js.map +1 -1
  5. package/dist/esm/ConfigurationEditor/ConfigurationDestination.d.ts +13 -0
  6. package/dist/esm/ConfigurationEditor/ConfigurationDestination.d.ts.map +1 -0
  7. package/dist/esm/ConfigurationEditor/ConfigurationDestination.js +4 -0
  8. package/dist/esm/ConfigurationEditor/ConfigurationDestination.js.map +1 -0
  9. package/dist/esm/ConfigurationEditor/ConfigurationEditor.d.ts +27 -0
  10. package/dist/esm/ConfigurationEditor/ConfigurationEditor.d.ts.map +1 -0
  11. package/dist/esm/ConfigurationEditor/ConfigurationEditor.js +13 -0
  12. package/dist/esm/ConfigurationEditor/ConfigurationEditor.js.map +1 -0
  13. package/dist/esm/ConfigurationEditor/ConfigurationEditorPartAttributes.d.ts +6 -0
  14. package/dist/esm/ConfigurationEditor/ConfigurationEditorPartAttributes.d.ts.map +1 -0
  15. package/dist/esm/ConfigurationEditor/ConfigurationEditorPartAttributes.js +4 -0
  16. package/dist/esm/ConfigurationEditor/ConfigurationEditorPartAttributes.js.map +1 -0
  17. package/dist/esm/ConfigurationEditor/ConfigurationEditorProvider.d.ts +28 -0
  18. package/dist/esm/ConfigurationEditor/ConfigurationEditorProvider.d.ts.map +1 -0
  19. package/dist/esm/ConfigurationEditor/ConfigurationEditorProvider.js +16 -0
  20. package/dist/esm/ConfigurationEditor/ConfigurationEditorProvider.js.map +1 -0
  21. package/dist/esm/ConfigurationEditor/ConfigurationEditorRenderProps.d.ts +20 -0
  22. package/dist/esm/ConfigurationEditor/ConfigurationEditorRenderProps.d.ts.map +1 -0
  23. package/dist/esm/ConfigurationEditor/ConfigurationEditorRenderProps.js +4 -0
  24. package/dist/esm/ConfigurationEditor/ConfigurationEditorRenderProps.js.map +1 -0
  25. package/dist/esm/ConfigurationEditor/ConfigurationEditorRenderer.d.ts +5 -0
  26. package/dist/esm/ConfigurationEditor/ConfigurationEditorRenderer.d.ts.map +1 -0
  27. package/dist/esm/ConfigurationEditor/ConfigurationEditorRenderer.js +4 -0
  28. package/dist/esm/ConfigurationEditor/ConfigurationEditorRenderer.js.map +1 -0
  29. package/dist/esm/ConfigurationEditor/ConfigurationIconReference.d.ts +17 -0
  30. package/dist/esm/ConfigurationEditor/ConfigurationIconReference.d.ts.map +1 -0
  31. package/dist/esm/ConfigurationEditor/ConfigurationIconReference.js +4 -0
  32. package/dist/esm/ConfigurationEditor/ConfigurationIconReference.js.map +1 -0
  33. package/dist/esm/ConfigurationEditor/OrderedItem.d.ts +16 -0
  34. package/dist/esm/ConfigurationEditor/OrderedItem.d.ts.map +1 -0
  35. package/dist/esm/ConfigurationEditor/OrderedItem.js +4 -0
  36. package/dist/esm/ConfigurationEditor/OrderedItem.js.map +1 -0
  37. package/dist/esm/ConfigurationEditor/OrderedItemCapabilities.d.ts +23 -0
  38. package/dist/esm/ConfigurationEditor/OrderedItemCapabilities.d.ts.map +1 -0
  39. package/dist/esm/ConfigurationEditor/OrderedItemCapabilities.js +4 -0
  40. package/dist/esm/ConfigurationEditor/OrderedItemCapabilities.js.map +1 -0
  41. package/dist/esm/ConfigurationEditor/OrderedItemDestinationField.d.ts +22 -0
  42. package/dist/esm/ConfigurationEditor/OrderedItemDestinationField.d.ts.map +1 -0
  43. package/dist/esm/ConfigurationEditor/OrderedItemDestinationField.js +23 -0
  44. package/dist/esm/ConfigurationEditor/OrderedItemDestinationField.js.map +1 -0
  45. package/dist/esm/ConfigurationEditor/OrderedItemEditor.d.ts +74 -0
  46. package/dist/esm/ConfigurationEditor/OrderedItemEditor.d.ts.map +1 -0
  47. package/dist/esm/ConfigurationEditor/OrderedItemEditor.js +188 -0
  48. package/dist/esm/ConfigurationEditor/OrderedItemEditor.js.map +1 -0
  49. package/dist/esm/ConfigurationEditor/OrderedItemEditorParts.d.ts +43 -0
  50. package/dist/esm/ConfigurationEditor/OrderedItemEditorParts.d.ts.map +1 -0
  51. package/dist/esm/ConfigurationEditor/OrderedItemEditorParts.js +4 -0
  52. package/dist/esm/ConfigurationEditor/OrderedItemEditorParts.js.map +1 -0
  53. package/dist/esm/ConfigurationEditor/OrderedItemField.d.ts +3 -0
  54. package/dist/esm/ConfigurationEditor/OrderedItemField.d.ts.map +1 -0
  55. package/dist/esm/ConfigurationEditor/OrderedItemField.js +4 -0
  56. package/dist/esm/ConfigurationEditor/OrderedItemField.js.map +1 -0
  57. package/dist/esm/ConfigurationEditor/OrderedItemFieldAccess.d.ts +9 -0
  58. package/dist/esm/ConfigurationEditor/OrderedItemFieldAccess.d.ts.map +1 -0
  59. package/dist/esm/ConfigurationEditor/OrderedItemFieldAccess.js +4 -0
  60. package/dist/esm/ConfigurationEditor/OrderedItemFieldAccess.js.map +1 -0
  61. package/dist/esm/ConfigurationEditor/OrderedItemIconField.d.ts +32 -0
  62. package/dist/esm/ConfigurationEditor/OrderedItemIconField.d.ts.map +1 -0
  63. package/dist/esm/ConfigurationEditor/OrderedItemIconField.js +26 -0
  64. package/dist/esm/ConfigurationEditor/OrderedItemIconField.js.map +1 -0
  65. package/dist/esm/ConfigurationEditor/OrderedItemIconFieldProps.d.ts +26 -0
  66. package/dist/esm/ConfigurationEditor/OrderedItemIconFieldProps.d.ts.map +1 -0
  67. package/dist/esm/ConfigurationEditor/OrderedItemIconFieldProps.js +4 -0
  68. package/dist/esm/ConfigurationEditor/OrderedItemIconFieldProps.js.map +1 -0
  69. package/dist/esm/ConfigurationEditor/OrderedItemLabels.d.ts +47 -0
  70. package/dist/esm/ConfigurationEditor/OrderedItemLabels.d.ts.map +1 -0
  71. package/dist/esm/ConfigurationEditor/OrderedItemLabels.js +4 -0
  72. package/dist/esm/ConfigurationEditor/OrderedItemLabels.js.map +1 -0
  73. package/dist/esm/ConfigurationEditor/OrderedItemOperation.d.ts +3 -0
  74. package/dist/esm/ConfigurationEditor/OrderedItemOperation.d.ts.map +1 -0
  75. package/dist/esm/ConfigurationEditor/OrderedItemOperation.js +4 -0
  76. package/dist/esm/ConfigurationEditor/OrderedItemOperation.js.map +1 -0
  77. package/dist/esm/ConfigurationEditor/OrderedItemProposal.d.ts +45 -0
  78. package/dist/esm/ConfigurationEditor/OrderedItemProposal.d.ts.map +1 -0
  79. package/dist/esm/ConfigurationEditor/OrderedItemProposal.js +4 -0
  80. package/dist/esm/ConfigurationEditor/OrderedItemProposal.js.map +1 -0
  81. package/dist/esm/ConfigurationEditor/OrderedItemRow.d.ts +5 -0
  82. package/dist/esm/ConfigurationEditor/OrderedItemRow.d.ts.map +1 -0
  83. package/dist/esm/ConfigurationEditor/OrderedItemRow.js +59 -0
  84. package/dist/esm/ConfigurationEditor/OrderedItemRow.js.map +1 -0
  85. package/dist/esm/ConfigurationEditor/OrderedItemRowProps.d.ts +43 -0
  86. package/dist/esm/ConfigurationEditor/OrderedItemRowProps.d.ts.map +1 -0
  87. package/dist/esm/ConfigurationEditor/OrderedItemRowProps.js +4 -0
  88. package/dist/esm/ConfigurationEditor/OrderedItemRowProps.js.map +1 -0
  89. package/dist/esm/ConfigurationEditor/OrderedItemValidation.d.ts +7 -0
  90. package/dist/esm/ConfigurationEditor/OrderedItemValidation.d.ts.map +1 -0
  91. package/dist/esm/ConfigurationEditor/OrderedItemValidation.js +4 -0
  92. package/dist/esm/ConfigurationEditor/OrderedItemValidation.js.map +1 -0
  93. package/dist/esm/ConfigurationEditor/PropertyChangeProposal.d.ts +15 -0
  94. package/dist/esm/ConfigurationEditor/PropertyChangeProposal.d.ts.map +1 -0
  95. package/dist/esm/ConfigurationEditor/PropertyChangeProposal.js +4 -0
  96. package/dist/esm/ConfigurationEditor/PropertyChangeProposal.js.map +1 -0
  97. package/dist/esm/ConfigurationEditor/PropertyChoice.d.ts +8 -0
  98. package/dist/esm/ConfigurationEditor/PropertyChoice.d.ts.map +1 -0
  99. package/dist/esm/ConfigurationEditor/PropertyChoice.js +4 -0
  100. package/dist/esm/ConfigurationEditor/PropertyChoice.js.map +1 -0
  101. package/dist/esm/ConfigurationEditor/PropertyControl.d.ts +17 -0
  102. package/dist/esm/ConfigurationEditor/PropertyControl.d.ts.map +1 -0
  103. package/dist/esm/ConfigurationEditor/PropertyControl.js +88 -0
  104. package/dist/esm/ConfigurationEditor/PropertyControl.js.map +1 -0
  105. package/dist/esm/ConfigurationEditor/PropertyControls.d.ts +40 -0
  106. package/dist/esm/ConfigurationEditor/PropertyControls.d.ts.map +1 -0
  107. package/dist/esm/ConfigurationEditor/PropertyControls.js +41 -0
  108. package/dist/esm/ConfigurationEditor/PropertyControls.js.map +1 -0
  109. package/dist/esm/ConfigurationEditor/PropertyControlsLabels.d.ts +18 -0
  110. package/dist/esm/ConfigurationEditor/PropertyControlsLabels.d.ts.map +1 -0
  111. package/dist/esm/ConfigurationEditor/PropertyControlsLabels.js +4 -0
  112. package/dist/esm/ConfigurationEditor/PropertyControlsLabels.js.map +1 -0
  113. package/dist/esm/ConfigurationEditor/PropertyControlsParts.d.ts +31 -0
  114. package/dist/esm/ConfigurationEditor/PropertyControlsParts.d.ts.map +1 -0
  115. package/dist/esm/ConfigurationEditor/PropertyControlsParts.js +4 -0
  116. package/dist/esm/ConfigurationEditor/PropertyControlsParts.js.map +1 -0
  117. package/dist/esm/ConfigurationEditor/PropertyDescriptor.d.ts +55 -0
  118. package/dist/esm/ConfigurationEditor/PropertyDescriptor.d.ts.map +1 -0
  119. package/dist/esm/ConfigurationEditor/PropertyDescriptor.js +4 -0
  120. package/dist/esm/ConfigurationEditor/PropertyDescriptor.js.map +1 -0
  121. package/dist/esm/ConfigurationEditor/PropertyGroup.d.ts +16 -0
  122. package/dist/esm/ConfigurationEditor/PropertyGroup.d.ts.map +1 -0
  123. package/dist/esm/ConfigurationEditor/PropertyGroup.js +4 -0
  124. package/dist/esm/ConfigurationEditor/PropertyGroup.js.map +1 -0
  125. package/dist/esm/ConfigurationEditor/defaultOrderedItemLabels.d.ts +4 -0
  126. package/dist/esm/ConfigurationEditor/defaultOrderedItemLabels.d.ts.map +1 -0
  127. package/dist/esm/ConfigurationEditor/defaultOrderedItemLabels.js +25 -0
  128. package/dist/esm/ConfigurationEditor/defaultOrderedItemLabels.js.map +1 -0
  129. package/dist/esm/ConfigurationEditor/defaultPropertyControlsLabels.d.ts +4 -0
  130. package/dist/esm/ConfigurationEditor/defaultPropertyControlsLabels.d.ts.map +1 -0
  131. package/dist/esm/ConfigurationEditor/defaultPropertyControlsLabels.js +12 -0
  132. package/dist/esm/ConfigurationEditor/defaultPropertyControlsLabels.js.map +1 -0
  133. package/dist/esm/ConfigurationEditor/index.d.ts +32 -0
  134. package/dist/esm/ConfigurationEditor/index.d.ts.map +1 -0
  135. package/dist/esm/ConfigurationEditor/index.js +7 -0
  136. package/dist/esm/ConfigurationEditor/index.js.map +1 -0
  137. package/dist/esm/ConfigurationEditor/moveOrderedItem.d.ts +5 -0
  138. package/dist/esm/ConfigurationEditor/moveOrderedItem.d.ts.map +1 -0
  139. package/dist/esm/ConfigurationEditor/moveOrderedItem.js +9 -0
  140. package/dist/esm/ConfigurationEditor/moveOrderedItem.js.map +1 -0
  141. package/dist/esm/ConfigurationEditor/resolveOrderedItemDropIndex.d.ts +10 -0
  142. package/dist/esm/ConfigurationEditor/resolveOrderedItemDropIndex.d.ts.map +1 -0
  143. package/dist/esm/ConfigurationEditor/resolveOrderedItemDropIndex.js +7 -0
  144. package/dist/esm/ConfigurationEditor/resolveOrderedItemDropIndex.js.map +1 -0
  145. package/dist/esm/ConfigurationEditor/resolveOrderedItemFieldAccess.d.ts +6 -0
  146. package/dist/esm/ConfigurationEditor/resolveOrderedItemFieldAccess.d.ts.map +1 -0
  147. package/dist/esm/ConfigurationEditor/resolveOrderedItemFieldAccess.js +4 -0
  148. package/dist/esm/ConfigurationEditor/resolveOrderedItemFieldAccess.js.map +1 -0
  149. package/dist/esm/ConfigurationEditor/resolveOrderedItemLabels.d.ts +4 -0
  150. package/dist/esm/ConfigurationEditor/resolveOrderedItemLabels.d.ts.map +1 -0
  151. package/dist/esm/ConfigurationEditor/resolveOrderedItemLabels.js +13 -0
  152. package/dist/esm/ConfigurationEditor/resolveOrderedItemLabels.js.map +1 -0
  153. package/dist/esm/ConfigurationEditor/validateOrderedItem.d.ts +18 -0
  154. package/dist/esm/ConfigurationEditor/validateOrderedItem.d.ts.map +1 -0
  155. package/dist/esm/ConfigurationEditor/validateOrderedItem.js +21 -0
  156. package/dist/esm/ConfigurationEditor/validateOrderedItem.js.map +1 -0
  157. package/dist/esm/IconPicker/IconPicker.d.ts +57 -0
  158. package/dist/esm/IconPicker/IconPicker.d.ts.map +1 -0
  159. package/dist/esm/IconPicker/IconPicker.js +59 -0
  160. package/dist/esm/IconPicker/IconPicker.js.map +1 -0
  161. package/dist/esm/IconPicker/IconPickerAllowed.d.ts +8 -0
  162. package/dist/esm/IconPicker/IconPickerAllowed.d.ts.map +1 -0
  163. package/dist/esm/IconPicker/IconPickerAllowed.js +4 -0
  164. package/dist/esm/IconPicker/IconPickerAllowed.js.map +1 -0
  165. package/dist/esm/IconPicker/IconPickerBrowser.d.ts +32 -0
  166. package/dist/esm/IconPicker/IconPickerBrowser.d.ts.map +1 -0
  167. package/dist/esm/IconPicker/IconPickerBrowser.js +4 -0
  168. package/dist/esm/IconPicker/IconPickerBrowser.js.map +1 -0
  169. package/dist/esm/IconPicker/IconPickerBrowserGroup.d.ts +9 -0
  170. package/dist/esm/IconPicker/IconPickerBrowserGroup.d.ts.map +1 -0
  171. package/dist/esm/IconPicker/IconPickerBrowserGroup.js +4 -0
  172. package/dist/esm/IconPicker/IconPickerBrowserGroup.js.map +1 -0
  173. package/dist/esm/IconPicker/IconPickerCatalog.d.ts +19 -0
  174. package/dist/esm/IconPicker/IconPickerCatalog.d.ts.map +1 -0
  175. package/dist/esm/IconPicker/IconPickerCatalog.js +4 -0
  176. package/dist/esm/IconPicker/IconPickerCatalog.js.map +1 -0
  177. package/dist/esm/IconPicker/IconPickerCatalogStatus.d.ts +3 -0
  178. package/dist/esm/IconPicker/IconPickerCatalogStatus.d.ts.map +1 -0
  179. package/dist/esm/IconPicker/IconPickerCatalogStatus.js +4 -0
  180. package/dist/esm/IconPicker/IconPickerCatalogStatus.js.map +1 -0
  181. package/dist/esm/IconPicker/IconPickerCategoryFilter.d.ts +25 -0
  182. package/dist/esm/IconPicker/IconPickerCategoryFilter.d.ts.map +1 -0
  183. package/dist/esm/IconPicker/IconPickerCategoryFilter.js +23 -0
  184. package/dist/esm/IconPicker/IconPickerCategoryFilter.js.map +1 -0
  185. package/dist/esm/IconPicker/IconPickerEntry.d.ts +25 -0
  186. package/dist/esm/IconPicker/IconPickerEntry.d.ts.map +1 -0
  187. package/dist/esm/IconPicker/IconPickerEntry.js +4 -0
  188. package/dist/esm/IconPicker/IconPickerEntry.js.map +1 -0
  189. package/dist/esm/IconPicker/IconPickerGrid.d.ts +29 -0
  190. package/dist/esm/IconPicker/IconPickerGrid.d.ts.map +1 -0
  191. package/dist/esm/IconPicker/IconPickerGrid.js +24 -0
  192. package/dist/esm/IconPicker/IconPickerGrid.js.map +1 -0
  193. package/dist/esm/IconPicker/IconPickerIndexEntry.d.ts +11 -0
  194. package/dist/esm/IconPicker/IconPickerIndexEntry.d.ts.map +1 -0
  195. package/dist/esm/IconPicker/IconPickerIndexEntry.js +4 -0
  196. package/dist/esm/IconPicker/IconPickerIndexEntry.js.map +1 -0
  197. package/dist/esm/IconPicker/IconPickerLabels.d.ts +76 -0
  198. package/dist/esm/IconPicker/IconPickerLabels.d.ts.map +1 -0
  199. package/dist/esm/IconPicker/IconPickerLabels.js +4 -0
  200. package/dist/esm/IconPicker/IconPickerLabels.js.map +1 -0
  201. package/dist/esm/IconPicker/IconPickerLibrary.d.ts +12 -0
  202. package/dist/esm/IconPicker/IconPickerLibrary.d.ts.map +1 -0
  203. package/dist/esm/IconPicker/IconPickerLibrary.js +4 -0
  204. package/dist/esm/IconPicker/IconPickerLibrary.js.map +1 -0
  205. package/dist/esm/IconPicker/IconPickerLibraryFilter.d.ts +20 -0
  206. package/dist/esm/IconPicker/IconPickerLibraryFilter.d.ts.map +1 -0
  207. package/dist/esm/IconPicker/IconPickerLibraryFilter.js +7 -0
  208. package/dist/esm/IconPicker/IconPickerLibraryFilter.js.map +1 -0
  209. package/dist/esm/IconPicker/IconPickerParts.d.ts +65 -0
  210. package/dist/esm/IconPicker/IconPickerParts.d.ts.map +1 -0
  211. package/dist/esm/IconPicker/IconPickerParts.js +4 -0
  212. package/dist/esm/IconPicker/IconPickerParts.js.map +1 -0
  213. package/dist/esm/IconPicker/IconPickerPlacement.d.ts +3 -0
  214. package/dist/esm/IconPicker/IconPickerPlacement.d.ts.map +1 -0
  215. package/dist/esm/IconPicker/IconPickerPlacement.js +4 -0
  216. package/dist/esm/IconPicker/IconPickerPlacement.js.map +1 -0
  217. package/dist/esm/IconPicker/IconPickerPopout.d.ts +32 -0
  218. package/dist/esm/IconPicker/IconPickerPopout.d.ts.map +1 -0
  219. package/dist/esm/IconPicker/IconPickerPopout.js +41 -0
  220. package/dist/esm/IconPicker/IconPickerPopout.js.map +1 -0
  221. package/dist/esm/IconPicker/IconPickerResults.d.ts +31 -0
  222. package/dist/esm/IconPicker/IconPickerResults.d.ts.map +1 -0
  223. package/dist/esm/IconPicker/IconPickerResults.js +21 -0
  224. package/dist/esm/IconPicker/IconPickerResults.js.map +1 -0
  225. package/dist/esm/IconPicker/IconPickerSearch.d.ts +21 -0
  226. package/dist/esm/IconPicker/IconPickerSearch.d.ts.map +1 -0
  227. package/dist/esm/IconPicker/IconPickerSearch.js +21 -0
  228. package/dist/esm/IconPicker/IconPickerSearch.js.map +1 -0
  229. package/dist/esm/IconPicker/IconPickerSummary.d.ts +12 -0
  230. package/dist/esm/IconPicker/IconPickerSummary.d.ts.map +1 -0
  231. package/dist/esm/IconPicker/IconPickerSummary.js +4 -0
  232. package/dist/esm/IconPicker/IconPickerSummary.js.map +1 -0
  233. package/dist/esm/IconPicker/IconPickerTile.d.ts +36 -0
  234. package/dist/esm/IconPicker/IconPickerTile.d.ts.map +1 -0
  235. package/dist/esm/IconPicker/IconPickerTile.js +22 -0
  236. package/dist/esm/IconPicker/IconPickerTile.js.map +1 -0
  237. package/dist/esm/IconPicker/IconPickerTrigger.d.ts +39 -0
  238. package/dist/esm/IconPicker/IconPickerTrigger.d.ts.map +1 -0
  239. package/dist/esm/IconPicker/IconPickerTrigger.js +13 -0
  240. package/dist/esm/IconPicker/IconPickerTrigger.js.map +1 -0
  241. package/dist/esm/IconPicker/IconPickerValue.d.ts +16 -0
  242. package/dist/esm/IconPicker/IconPickerValue.d.ts.map +1 -0
  243. package/dist/esm/IconPicker/IconPickerValue.js +4 -0
  244. package/dist/esm/IconPicker/IconPickerValue.js.map +1 -0
  245. package/dist/esm/IconPicker/createIconPickerIndex.d.ts +10 -0
  246. package/dist/esm/IconPicker/createIconPickerIndex.d.ts.map +1 -0
  247. package/dist/esm/IconPicker/createIconPickerIndex.js +21 -0
  248. package/dist/esm/IconPicker/createIconPickerIndex.js.map +1 -0
  249. package/dist/esm/IconPicker/defaultIconPickerLabels.d.ts +4 -0
  250. package/dist/esm/IconPicker/defaultIconPickerLabels.d.ts.map +1 -0
  251. package/dist/esm/IconPicker/defaultIconPickerLabels.js +35 -0
  252. package/dist/esm/IconPicker/defaultIconPickerLabels.js.map +1 -0
  253. package/dist/esm/IconPicker/formatIconPickerIdentity.d.ts +8 -0
  254. package/dist/esm/IconPicker/formatIconPickerIdentity.d.ts.map +1 -0
  255. package/dist/esm/IconPicker/formatIconPickerIdentity.js +4 -0
  256. package/dist/esm/IconPicker/formatIconPickerIdentity.js.map +1 -0
  257. package/dist/esm/IconPicker/groupIconPickerByCategory.d.ts +10 -0
  258. package/dist/esm/IconPicker/groupIconPickerByCategory.d.ts.map +1 -0
  259. package/dist/esm/IconPicker/groupIconPickerByCategory.js +17 -0
  260. package/dist/esm/IconPicker/groupIconPickerByCategory.js.map +1 -0
  261. package/dist/esm/IconPicker/iconPickerIdentity.d.ts +8 -0
  262. package/dist/esm/IconPicker/iconPickerIdentity.d.ts.map +1 -0
  263. package/dist/esm/IconPicker/iconPickerIdentity.js +4 -0
  264. package/dist/esm/IconPicker/iconPickerIdentity.js.map +1 -0
  265. package/dist/esm/IconPicker/index.d.ts +19 -0
  266. package/dist/esm/IconPicker/index.d.ts.map +1 -0
  267. package/dist/esm/IconPicker/index.js +8 -0
  268. package/dist/esm/IconPicker/index.js.map +1 -0
  269. package/dist/esm/IconPicker/isIconPickerAllowed.d.ts +10 -0
  270. package/dist/esm/IconPicker/isIconPickerAllowed.d.ts.map +1 -0
  271. package/dist/esm/IconPicker/isIconPickerAllowed.js +12 -0
  272. package/dist/esm/IconPicker/isIconPickerAllowed.js.map +1 -0
  273. package/dist/esm/IconPicker/isSameIconPickerValue.d.ts +10 -0
  274. package/dist/esm/IconPicker/isSameIconPickerValue.d.ts.map +1 -0
  275. package/dist/esm/IconPicker/isSameIconPickerValue.js +4 -0
  276. package/dist/esm/IconPicker/isSameIconPickerValue.js.map +1 -0
  277. package/dist/esm/IconPicker/searchIconPickerIndex.d.ts +9 -0
  278. package/dist/esm/IconPicker/searchIconPickerIndex.d.ts.map +1 -0
  279. package/dist/esm/IconPicker/searchIconPickerIndex.js +9 -0
  280. package/dist/esm/IconPicker/searchIconPickerIndex.js.map +1 -0
  281. package/dist/esm/IconPicker/toIconPickerValue.d.ts +9 -0
  282. package/dist/esm/IconPicker/toIconPickerValue.d.ts.map +1 -0
  283. package/dist/esm/IconPicker/toIconPickerValue.js +6 -0
  284. package/dist/esm/IconPicker/toIconPickerValue.js.map +1 -0
  285. package/dist/esm/IconPicker/useGridColumns.d.ts +12 -0
  286. package/dist/esm/IconPicker/useGridColumns.d.ts.map +1 -0
  287. package/dist/esm/IconPicker/useGridColumns.js +26 -0
  288. package/dist/esm/IconPicker/useGridColumns.js.map +1 -0
  289. package/dist/esm/IconPicker/useIconPickerBrowser.d.ts +10 -0
  290. package/dist/esm/IconPicker/useIconPickerBrowser.d.ts.map +1 -0
  291. package/dist/esm/IconPicker/useIconPickerBrowser.js +45 -0
  292. package/dist/esm/IconPicker/useIconPickerBrowser.js.map +1 -0
  293. package/dist/esm/IconPicker/useIsVisible.d.ts +12 -0
  294. package/dist/esm/IconPicker/useIsVisible.d.ts.map +1 -0
  295. package/dist/esm/IconPicker/useIsVisible.js +23 -0
  296. package/dist/esm/IconPicker/useIsVisible.js.map +1 -0
  297. package/dist/esm/IconPicker/useNarrowViewport.d.ts +9 -0
  298. package/dist/esm/IconPicker/useNarrowViewport.d.ts.map +1 -0
  299. package/dist/esm/IconPicker/useNarrowViewport.js +15 -0
  300. package/dist/esm/IconPicker/useNarrowViewport.js.map +1 -0
  301. package/dist/esm/IconPicker/useRovingFocus.d.ts +29 -0
  302. package/dist/esm/IconPicker/useRovingFocus.d.ts.map +1 -0
  303. package/dist/esm/IconPicker/useRovingFocus.js +70 -0
  304. package/dist/esm/IconPicker/useRovingFocus.js.map +1 -0
  305. package/dist/esm/Toolbar/ToolbarButton.d.ts +4 -1
  306. package/dist/esm/Toolbar/ToolbarButton.d.ts.map +1 -1
  307. package/dist/esm/Toolbar/ToolbarButton.js +12 -2
  308. package/dist/esm/Toolbar/ToolbarButton.js.map +1 -1
  309. package/dist/esm/Toolbar/ToolbarDrawerContext.d.ts +13 -0
  310. package/dist/esm/Toolbar/ToolbarDrawerContext.d.ts.map +1 -0
  311. package/dist/esm/Toolbar/ToolbarDrawerContext.js +7 -0
  312. package/dist/esm/Toolbar/ToolbarDrawerContext.js.map +1 -0
  313. package/dist/esm/Toolbar/ToolbarDrawerItem.d.ts +23 -0
  314. package/dist/esm/Toolbar/ToolbarDrawerItem.d.ts.map +1 -0
  315. package/dist/esm/Toolbar/ToolbarDrawerItem.js +4 -0
  316. package/dist/esm/Toolbar/ToolbarDrawerItem.js.map +1 -0
  317. package/dist/esm/Toolbar/ToolbarDrawerPlacement.d.ts +57 -0
  318. package/dist/esm/Toolbar/ToolbarDrawerPlacement.d.ts.map +1 -0
  319. package/dist/esm/Toolbar/ToolbarDrawerPlacement.js +51 -0
  320. package/dist/esm/Toolbar/ToolbarDrawerPlacement.js.map +1 -0
  321. package/dist/esm/Toolbar/ToolbarDrawerTile.d.ts +43 -0
  322. package/dist/esm/Toolbar/ToolbarDrawerTile.d.ts.map +1 -0
  323. package/dist/esm/Toolbar/ToolbarDrawerTile.js +31 -0
  324. package/dist/esm/Toolbar/ToolbarDrawerTile.js.map +1 -0
  325. package/dist/esm/Toolbar/ToolbarFolder.d.ts +51 -5
  326. package/dist/esm/Toolbar/ToolbarFolder.d.ts.map +1 -1
  327. package/dist/esm/Toolbar/ToolbarFolder.js +109 -10
  328. package/dist/esm/Toolbar/ToolbarFolder.js.map +1 -1
  329. package/dist/esm/Toolbar/ToolbarFolderPresentation.d.ts +8 -0
  330. package/dist/esm/Toolbar/ToolbarFolderPresentation.d.ts.map +1 -0
  331. package/dist/esm/Toolbar/ToolbarFolderPresentation.js +4 -0
  332. package/dist/esm/Toolbar/ToolbarFolderPresentation.js.map +1 -0
  333. package/dist/esm/Toolbar/index.d.ts +2 -0
  334. package/dist/esm/Toolbar/index.d.ts.map +1 -1
  335. package/dist/esm/configuration/CratisComponentsDefaults.d.ts.map +1 -1
  336. package/dist/esm/configuration/CratisComponentsDefaults.js +1 -0
  337. package/dist/esm/configuration/CratisComponentsDefaults.js.map +1 -1
  338. package/dist/esm/styles.ConfigurationEditor.css +710 -0
  339. package/dist/esm/styles.IconPicker.css +464 -0
  340. package/dist/esm/styles.Toolbar.css +174 -0
  341. package/dist/esm/styles.css +971 -90
  342. package/dist/esm/types/parts.d.ts +69 -1
  343. package/dist/esm/types/parts.d.ts.map +1 -1
  344. package/dist/esm/types/parts.js +69 -1
  345. package/dist/esm/types/parts.js.map +1 -1
  346. package/package.json +11 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGridColumns.js","sources":["../../../IconPicker/useGridColumns.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useEffect, useState, type RefObject } from 'react';\n\n/** How many columns a grid is assumed to have until it has been measured. */\nexport const defaultGridColumns = 4;\n\n/**\n * Counts the columns a CSS grid currently lays out, so Up and Down can move a whole row. The browser\n * resolves `repeat(auto-fill, …)` into real tracks, so the count is read back from the grid's computed\n * style whenever it resizes. Environments that cannot lay out - or measure - a grid keep the default.\n * @param grid The grid element.\n * @returns The grid's column count.\n */\nexport const useGridColumns = (grid: RefObject<HTMLElement | null>): number => {\n const [columns, setColumns] = useState(defaultGridColumns);\n\n useEffect(() => {\n const element = grid.current;\n if (!element || typeof ResizeObserver === 'undefined') return;\n const measure = () => {\n const tracks = getComputedStyle(element)\n .gridTemplateColumns.split(' ')\n .filter(track => track.endsWith('px')).length;\n if (tracks > 0) setColumns(tracks);\n };\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(element);\n return () => observer.disconnect();\n }, [grid]);\n\n return columns;\n};\n"],"names":[],"mappings":";;AAMO,MAAM,kBAAkB,GAAG;AAS3B,MAAM,cAAc,GAAG,CAAC,IAAmC,KAAY;IAC1E,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,kBAAkB,CAAC;IAE1D,SAAS,CAAC,MAAK;AACX,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO;AAC5B,QAAA,IAAI,CAAC,OAAO,IAAI,OAAO,cAAc,KAAK,WAAW;YAAE;QACvD,MAAM,OAAO,GAAG,MAAK;AACjB,YAAA,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO;AAClC,iBAAA,mBAAmB,CAAC,KAAK,CAAC,GAAG;AAC7B,iBAAA,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;YACjD,IAAI,MAAM,GAAG,CAAC;gBAAE,UAAU,CAAC,MAAM,CAAC;AACtC,QAAA,CAAC;AACD,QAAA,OAAO,EAAE;AACT,QAAA,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,OAAO,CAAC;AAC5C,QAAA,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC;AACzB,QAAA,OAAO,MAAM,QAAQ,CAAC,UAAU,EAAE;AACtC,IAAA,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;AAEV,IAAA,OAAO,OAAO;AAClB;;"}
@@ -0,0 +1,10 @@
1
+ import type { IconPickerBrowser } from './IconPickerBrowser.js';
2
+ import type { IconPickerEntry } from './IconPickerEntry.js';
3
+ /**
4
+ * Holds the popout's search and filters and derives what they show. The search index is built once
5
+ * per catalog; typing only filters it, so a large library stays responsive.
6
+ * @param icons The catalog's icons.
7
+ * @returns What to show, and the controls that change it.
8
+ */
9
+ export declare const useIconPickerBrowser: (icons: readonly IconPickerEntry[]) => IconPickerBrowser;
10
+ //# sourceMappingURL=useIconPickerBrowser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useIconPickerBrowser.d.ts","sourceRoot":"","sources":["../../../IconPicker/useIconPickerBrowser.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAmB,CAAC;AAKzD;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,UAAW,SAAS,eAAe,EAAE,KAAG,iBAyCxE,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { useState, useMemo } from 'react';
2
+ import { createIconPickerIndex } from './createIconPickerIndex.js';
3
+ import { groupIconPickerByCategory } from './groupIconPickerByCategory.js';
4
+ import { searchIconPickerIndex } from './searchIconPickerIndex.js';
5
+
6
+ const useIconPickerBrowser = (icons) => {
7
+ const [query, setQuery] = useState('');
8
+ const [category, setCategory] = useState();
9
+ const [library, setLibrary] = useState();
10
+ const index = useMemo(() => createIconPickerIndex(icons), [icons]);
11
+ return useMemo(() => {
12
+ const inLibrary = library === undefined ? index : index.filter(candidate => candidate.entry.library === library);
13
+ const searched = searchIconPickerIndex(inLibrary, query.trim());
14
+ const categories = groupIconPickerByCategory(searched);
15
+ const matchesCategory = category === undefined
16
+ ? searched
17
+ : searched.filter(candidate => category === ''
18
+ ? candidate.entry.categories.length === 0
19
+ : candidate.entry.categories.includes(category));
20
+ const matches = matchesCategory.map(candidate => candidate.entry);
21
+ const isFiltered = query.trim() !== '' || category !== undefined || library !== undefined;
22
+ return {
23
+ query,
24
+ setQuery,
25
+ category,
26
+ setCategory,
27
+ library,
28
+ setLibrary,
29
+ reset: () => {
30
+ setQuery('');
31
+ setCategory(undefined);
32
+ setLibrary(undefined);
33
+ },
34
+ isFiltered,
35
+ categories,
36
+ matchCount: matches.length,
37
+ matches,
38
+ groups: categories,
39
+ isGrouped: query.trim() === '' && category === undefined,
40
+ };
41
+ }, [index, query, category, library]);
42
+ };
43
+
44
+ export { useIconPickerBrowser };
45
+ //# sourceMappingURL=useIconPickerBrowser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useIconPickerBrowser.js","sources":["../../../IconPicker/useIconPickerBrowser.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useMemo, useState } from 'react';\nimport type { IconPickerBrowser } from './IconPickerBrowser';\nimport type { IconPickerEntry } from './IconPickerEntry';\nimport { createIconPickerIndex } from './createIconPickerIndex';\nimport { groupIconPickerByCategory } from './groupIconPickerByCategory';\nimport { searchIconPickerIndex } from './searchIconPickerIndex';\n\n/**\n * Holds the popout's search and filters and derives what they show. The search index is built once\n * per catalog; typing only filters it, so a large library stays responsive.\n * @param icons The catalog's icons.\n * @returns What to show, and the controls that change it.\n */\nexport const useIconPickerBrowser = (icons: readonly IconPickerEntry[]): IconPickerBrowser => {\n const [query, setQuery] = useState('');\n const [category, setCategory] = useState<string | undefined>();\n const [library, setLibrary] = useState<string | undefined>();\n const index = useMemo(() => createIconPickerIndex(icons), [icons]);\n\n return useMemo(() => {\n const inLibrary = library === undefined ? index : index.filter(candidate => candidate.entry.library === library);\n const searched = searchIconPickerIndex(inLibrary, query.trim());\n const categories = groupIconPickerByCategory(searched);\n const matchesCategory =\n category === undefined\n ? searched\n : searched.filter(candidate =>\n category === ''\n ? candidate.entry.categories.length === 0\n : candidate.entry.categories.includes(category),\n );\n const matches = matchesCategory.map(candidate => candidate.entry);\n const isFiltered = query.trim() !== '' || category !== undefined || library !== undefined;\n\n return {\n query,\n setQuery,\n category,\n setCategory,\n library,\n setLibrary,\n reset: () => {\n setQuery('');\n setCategory(undefined);\n setLibrary(undefined);\n },\n isFiltered,\n categories,\n matchCount: matches.length,\n matches,\n groups: categories,\n isGrouped: query.trim() === '' && category === undefined,\n };\n }, [index, query, category, library]);\n};\n"],"names":[],"mappings":";;;;;AAgBO,MAAM,oBAAoB,GAAG,CAAC,KAAiC,KAAuB;IACzF,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC;IACtC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,EAAsB;IAC9D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,EAAsB;AAC5D,IAAA,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IAElE,OAAO,OAAO,CAAC,MAAK;AAChB,QAAA,MAAM,SAAS,GAAG,OAAO,KAAK,SAAS,GAAG,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,IAAI,SAAS,CAAC,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC;QAChH,MAAM,QAAQ,GAAG,qBAAqB,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;AAC/D,QAAA,MAAM,UAAU,GAAG,yBAAyB,CAAC,QAAQ,CAAC;AACtD,QAAA,MAAM,eAAe,GACjB,QAAQ,KAAK;AACT,cAAE;cACA,QAAQ,CAAC,MAAM,CAAC,SAAS,IACrB,QAAQ,KAAK;kBACP,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,KAAK;AACxC,kBAAE,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CACtD;AACX,QAAA,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,SAAS,IAAI,SAAS,CAAC,KAAK,CAAC;AACjE,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,QAAQ,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS;QAEzF,OAAO;YACH,KAAK;YACL,QAAQ;YACR,QAAQ;YACR,WAAW;YACX,OAAO;YACP,UAAU;YACV,KAAK,EAAE,MAAK;gBACR,QAAQ,CAAC,EAAE,CAAC;gBACZ,WAAW,CAAC,SAAS,CAAC;gBACtB,UAAU,CAAC,SAAS,CAAC;YACzB,CAAC;YACD,UAAU;YACV,UAAU;YACV,UAAU,EAAE,OAAO,CAAC,MAAM;YAC1B,OAAO;AACP,YAAA,MAAM,EAAE,UAAU;YAClB,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,QAAQ,KAAK,SAAS;SAC3D;IACL,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AACzC;;"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Reports whether an element has come near the viewport, and stays true once it has - a preview that
3
+ * has been drawn is kept rather than torn down when scrolled away. Environments without
4
+ * `IntersectionObserver` treat everything as visible.
5
+ * @param margin How far outside the viewport counts as near, as a CSS margin.
6
+ * @returns A ref to put on the element, and whether it has been near the viewport.
7
+ */
8
+ export declare const useIsVisible: (margin?: string) => {
9
+ ref: (element: HTMLElement | null) => void;
10
+ isVisible: boolean;
11
+ };
12
+ //# sourceMappingURL=useIsVisible.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useIsVisible.d.ts","sourceRoot":"","sources":["../../../IconPicker/useIsVisible.ts"],"names":[],"mappings":"AAKA;;;;;;GAMG;AACH,eAAO,MAAM,YAAY;mBAOP,WAAW,GAAG,IAAI;;CAkBnC,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { useState, useRef, useEffect, useCallback } from 'react';
2
+
3
+ const useIsVisible = (margin = '160px') => {
4
+ const [isVisible, setIsVisible] = useState(typeof IntersectionObserver === 'undefined');
5
+ const observer = useRef(undefined);
6
+ useEffect(() => () => observer.current?.disconnect(), []);
7
+ const ref = useCallback((element) => {
8
+ observer.current?.disconnect();
9
+ if (!element || isVisible || typeof IntersectionObserver === 'undefined')
10
+ return;
11
+ observer.current = new IntersectionObserver(entries => {
12
+ if (entries.some(entry => entry.isIntersecting)) {
13
+ setIsVisible(true);
14
+ observer.current?.disconnect();
15
+ }
16
+ }, { rootMargin: margin });
17
+ observer.current.observe(element);
18
+ }, [isVisible, margin]);
19
+ return { ref, isVisible };
20
+ };
21
+
22
+ export { useIsVisible };
23
+ //# sourceMappingURL=useIsVisible.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useIsVisible.js","sources":["../../../IconPicker/useIsVisible.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\n/**\n * Reports whether an element has come near the viewport, and stays true once it has - a preview that\n * has been drawn is kept rather than torn down when scrolled away. Environments without\n * `IntersectionObserver` treat everything as visible.\n * @param margin How far outside the viewport counts as near, as a CSS margin.\n * @returns A ref to put on the element, and whether it has been near the viewport.\n */\nexport const useIsVisible = (margin = '160px') => {\n const [isVisible, setIsVisible] = useState(typeof IntersectionObserver === 'undefined');\n const observer = useRef<IntersectionObserver | undefined>(undefined);\n\n useEffect(() => () => observer.current?.disconnect(), []);\n\n const ref = useCallback(\n (element: HTMLElement | null) => {\n observer.current?.disconnect();\n if (!element || isVisible || typeof IntersectionObserver === 'undefined') return;\n observer.current = new IntersectionObserver(\n entries => {\n if (entries.some(entry => entry.isIntersecting)) {\n setIsVisible(true);\n observer.current?.disconnect();\n }\n },\n { rootMargin: margin },\n );\n observer.current.observe(element);\n },\n [isVisible, margin],\n );\n\n return { ref, isVisible };\n};\n"],"names":[],"mappings":";;MAYa,YAAY,GAAG,CAAC,MAAM,GAAG,OAAO,KAAI;AAC7C,IAAA,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,OAAO,oBAAoB,KAAK,WAAW,CAAC;AACvF,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAmC,SAAS,CAAC;AAEpE,IAAA,SAAS,CAAC,MAAM,MAAM,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;AAEzD,IAAA,MAAM,GAAG,GAAG,WAAW,CACnB,CAAC,OAA2B,KAAI;AAC5B,QAAA,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE;QAC9B,IAAI,CAAC,OAAO,IAAI,SAAS,IAAI,OAAO,oBAAoB,KAAK,WAAW;YAAE;QAC1E,QAAQ,CAAC,OAAO,GAAG,IAAI,oBAAoB,CACvC,OAAO,IAAG;AACN,YAAA,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,cAAc,CAAC,EAAE;gBAC7C,YAAY,CAAC,IAAI,CAAC;AAClB,gBAAA,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE;YAClC;AACJ,QAAA,CAAC,EACD,EAAE,UAAU,EAAE,MAAM,EAAE,CACzB;AACD,QAAA,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;AACrC,IAAA,CAAC,EACD,CAAC,SAAS,EAAE,MAAM,CAAC,CACtB;AAED,IAAA,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE;AAC7B;;"}
@@ -0,0 +1,9 @@
1
+ /** Viewports at most this wide show the popout as a contained sheet rather than anchored to the trigger. */
2
+ export declare const narrowViewportQuery = "(max-width: 30rem)";
3
+ /**
4
+ * Whether the viewport is narrow enough that the popout should be a sheet. Server rendering and
5
+ * environments without `matchMedia` are never narrow.
6
+ * @returns True on a narrow viewport.
7
+ */
8
+ export declare const useNarrowViewport: () => boolean;
9
+ //# sourceMappingURL=useNarrowViewport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useNarrowViewport.d.ts","sourceRoot":"","sources":["../../../IconPicker/useNarrowViewport.ts"],"names":[],"mappings":"AAKA,4GAA4G;AAC5G,eAAO,MAAM,mBAAmB,uBAAuB,CAAC;AAYxD;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,QAAO,OAA6D,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { useSyncExternalStore } from 'react';
2
+
3
+ const narrowViewportQuery = '(max-width: 30rem)';
4
+ const subscribe = (notify) => {
5
+ if (typeof window === 'undefined' || typeof window.matchMedia !== 'function')
6
+ return () => undefined;
7
+ const query = window.matchMedia(narrowViewportQuery);
8
+ query.addEventListener('change', notify);
9
+ return () => query.removeEventListener('change', notify);
10
+ };
11
+ const read = () => typeof window !== 'undefined' && typeof window.matchMedia === 'function' && window.matchMedia(narrowViewportQuery).matches;
12
+ const useNarrowViewport = () => useSyncExternalStore(subscribe, read, () => false);
13
+
14
+ export { narrowViewportQuery, useNarrowViewport };
15
+ //# sourceMappingURL=useNarrowViewport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useNarrowViewport.js","sources":["../../../IconPicker/useNarrowViewport.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useSyncExternalStore } from 'react';\n\n/** Viewports at most this wide show the popout as a contained sheet rather than anchored to the trigger. */\nexport const narrowViewportQuery = '(max-width: 30rem)';\n\nconst subscribe = (notify: () => void) => {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return () => undefined;\n const query = window.matchMedia(narrowViewportQuery);\n query.addEventListener('change', notify);\n return () => query.removeEventListener('change', notify);\n};\n\nconst read = () =>\n typeof window !== 'undefined' && typeof window.matchMedia === 'function' && window.matchMedia(narrowViewportQuery).matches;\n\n/**\n * Whether the viewport is narrow enough that the popout should be a sheet. Server rendering and\n * environments without `matchMedia` are never narrow.\n * @returns True on a narrow viewport.\n */\nexport const useNarrowViewport = (): boolean => useSyncExternalStore(subscribe, read, () => false);\n"],"names":[],"mappings":";;AAMO,MAAM,mBAAmB,GAAG;AAEnC,MAAM,SAAS,GAAG,CAAC,MAAkB,KAAI;IACrC,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU;AAAE,QAAA,OAAO,MAAM,SAAS;IACpG,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,mBAAmB,CAAC;AACpD,IAAA,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC;IACxC,OAAO,MAAM,KAAK,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC;AAC5D,CAAC;AAED,MAAM,IAAI,GAAG,MACT,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC,OAAO;AAOvH,MAAM,iBAAiB,GAAG,MAAe,oBAAoB,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,KAAK;;"}
@@ -0,0 +1,29 @@
1
+ import { type KeyboardEvent, type RefObject } from 'react';
2
+ /** What {@link useRovingFocus} hands to the container and each item. */
3
+ export interface RovingFocus {
4
+ /** The container the items live in. */
5
+ containerRef: RefObject<HTMLDivElement | null>;
6
+ /** Moves focus between items; put on the container. */
7
+ onKeyDown: (event: KeyboardEvent<HTMLElement>) => void;
8
+ /**
9
+ * The props of the item at an index: its tab stop, its index marker, and the focus handler that
10
+ * keeps the tab stop where focus last was.
11
+ * @param index The item's index.
12
+ */
13
+ itemProps: (index: number) => {
14
+ tabIndex: number;
15
+ onFocus: () => void;
16
+ [attribute: `data-${string}`]: number;
17
+ };
18
+ }
19
+ /**
20
+ * A roving tab stop over a row or grid of items: one item is reachable with Tab, and the arrow keys,
21
+ * Home and End move focus among the rest. Items are located through their `data-roving-index`
22
+ * attribute, so they can be any element.
23
+ * @param count How many items there are.
24
+ * @param columns How many items make a row. Zero for a single row, where only Left/Right move focus.
25
+ * @param preferredIndex The item to make the tab stop when focus has not moved yet, such as the selection.
26
+ * @returns What to put on the container and on each item.
27
+ */
28
+ export declare const useRovingFocus: (count: number, columns: number, preferredIndex?: number) => RovingFocus;
29
+ //# sourceMappingURL=useRovingFocus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRovingFocus.d.ts","sourceRoot":"","sources":["../../../IconPicker/useRovingFocus.ts"],"names":[],"mappings":"AAGA,OAAO,EAA+B,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAQxF,wEAAwE;AACxE,MAAM,WAAW,WAAW;IACxB,uCAAuC;IACvC,YAAY,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAE/C,uDAAuD;IACvD,SAAS,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IAEvD;;;;OAIG;IACH,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK;QAC1B,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,IAAI,CAAC;QACpB,CAAC,SAAS,EAAE,QAAQ,MAAM,EAAE,GAAG,MAAM,CAAC;KACzC,CAAC;CACL;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,UAAW,MAAM,WAAW,MAAM,8BAAuB,WA6DnF,CAAC"}
@@ -0,0 +1,70 @@
1
+ import { useRef, useState, useEffect } from 'react';
2
+
3
+ const itemAttribute = 'data-roving-index';
4
+ const isRightToLeft = (element) => getComputedStyle(element).direction === 'rtl' || element.closest('[dir="rtl"]') !== null;
5
+ const useRovingFocus = (count, columns, preferredIndex = 0) => {
6
+ const containerRef = useRef(null);
7
+ const [focusedIndex, setFocusedIndex] = useState();
8
+ const tabStop = focusedIndex !== undefined && focusedIndex < count ? focusedIndex : Math.min(Math.max(preferredIndex, 0), Math.max(count - 1, 0));
9
+ useEffect(() => {
10
+ if (focusedIndex !== undefined && focusedIndex >= count)
11
+ setFocusedIndex(undefined);
12
+ }, [count, focusedIndex]);
13
+ const focusItem = (index) => {
14
+ const target = containerRef.current?.querySelector(`[${itemAttribute}="${index}"]`);
15
+ if (!target)
16
+ return;
17
+ setFocusedIndex(index);
18
+ target.focus();
19
+ };
20
+ const onKeyDown = (event) => {
21
+ if (event.altKey || event.ctrlKey || event.metaKey)
22
+ return;
23
+ const current = event.target.closest(`[${itemAttribute}]`);
24
+ if (!current || !containerRef.current?.contains(current))
25
+ return;
26
+ const index = Number(current.getAttribute(itemAttribute));
27
+ const step = columns > 0 ? columns : 0;
28
+ const forward = isRightToLeft(containerRef.current) ? 'ArrowLeft' : 'ArrowRight';
29
+ let next;
30
+ switch (event.key) {
31
+ case 'ArrowRight':
32
+ case 'ArrowLeft':
33
+ next = event.key === forward ? index + 1 : index - 1;
34
+ break;
35
+ case 'ArrowDown':
36
+ if (step > 0)
37
+ next = index + step;
38
+ break;
39
+ case 'ArrowUp':
40
+ if (step > 0)
41
+ next = index - step;
42
+ break;
43
+ case 'Home':
44
+ next = 0;
45
+ break;
46
+ case 'End':
47
+ next = count - 1;
48
+ break;
49
+ default:
50
+ return;
51
+ }
52
+ if (next === undefined)
53
+ return;
54
+ event.preventDefault();
55
+ if (next >= 0 && next < count)
56
+ focusItem(next);
57
+ };
58
+ return {
59
+ containerRef,
60
+ onKeyDown,
61
+ itemProps: index => ({
62
+ tabIndex: index === tabStop ? 0 : -1,
63
+ onFocus: () => setFocusedIndex(index),
64
+ [itemAttribute]: index,
65
+ }),
66
+ };
67
+ };
68
+
69
+ export { useRovingFocus };
70
+ //# sourceMappingURL=useRovingFocus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRovingFocus.js","sources":["../../../IconPicker/useRovingFocus.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useEffect, useRef, useState, type KeyboardEvent, type RefObject } from 'react';\n\n/** The attribute every roving item carries, holding its index. */\nconst itemAttribute = 'data-roving-index';\n\nconst isRightToLeft = (element: HTMLElement) =>\n getComputedStyle(element).direction === 'rtl' || element.closest('[dir=\"rtl\"]') !== null;\n\n/** What {@link useRovingFocus} hands to the container and each item. */\nexport interface RovingFocus {\n /** The container the items live in. */\n containerRef: RefObject<HTMLDivElement | null>;\n\n /** Moves focus between items; put on the container. */\n onKeyDown: (event: KeyboardEvent<HTMLElement>) => void;\n\n /**\n * The props of the item at an index: its tab stop, its index marker, and the focus handler that\n * keeps the tab stop where focus last was.\n * @param index The item's index.\n */\n itemProps: (index: number) => {\n tabIndex: number;\n onFocus: () => void;\n [attribute: `data-${string}`]: number;\n };\n}\n\n/**\n * A roving tab stop over a row or grid of items: one item is reachable with Tab, and the arrow keys,\n * Home and End move focus among the rest. Items are located through their `data-roving-index`\n * attribute, so they can be any element.\n * @param count How many items there are.\n * @param columns How many items make a row. Zero for a single row, where only Left/Right move focus.\n * @param preferredIndex The item to make the tab stop when focus has not moved yet, such as the selection.\n * @returns What to put on the container and on each item.\n */\nexport const useRovingFocus = (count: number, columns: number, preferredIndex = 0): RovingFocus => {\n const containerRef = useRef<HTMLDivElement | null>(null);\n const [focusedIndex, setFocusedIndex] = useState<number | undefined>();\n\n // The tab stop falls back to the preferred item when the focused one is no longer in the list.\n const tabStop = focusedIndex !== undefined && focusedIndex < count ? focusedIndex : Math.min(Math.max(preferredIndex, 0), Math.max(count - 1, 0));\n\n useEffect(() => {\n if (focusedIndex !== undefined && focusedIndex >= count) setFocusedIndex(undefined);\n }, [count, focusedIndex]);\n\n const focusItem = (index: number) => {\n const target = containerRef.current?.querySelector<HTMLElement>(`[${itemAttribute}=\"${index}\"]`);\n if (!target) return;\n setFocusedIndex(index);\n target.focus();\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLElement>) => {\n if (event.altKey || event.ctrlKey || event.metaKey) return;\n const current = (event.target as HTMLElement).closest<HTMLElement>(`[${itemAttribute}]`);\n if (!current || !containerRef.current?.contains(current)) return;\n const index = Number(current.getAttribute(itemAttribute));\n const step = columns > 0 ? columns : 0;\n // Right and Left name visual directions, so they swap places in a right-to-left layout.\n const forward = isRightToLeft(containerRef.current) ? 'ArrowLeft' : 'ArrowRight';\n let next: number | undefined;\n switch (event.key) {\n case 'ArrowRight':\n case 'ArrowLeft':\n next = event.key === forward ? index + 1 : index - 1;\n break;\n case 'ArrowDown':\n if (step > 0) next = index + step;\n break;\n case 'ArrowUp':\n if (step > 0) next = index - step;\n break;\n case 'Home':\n next = 0;\n break;\n case 'End':\n next = count - 1;\n break;\n default:\n return;\n }\n if (next === undefined) return;\n event.preventDefault();\n if (next >= 0 && next < count) focusItem(next);\n };\n\n return {\n containerRef,\n onKeyDown,\n itemProps: index => ({\n tabIndex: index === tabStop ? 0 : -1,\n onFocus: () => setFocusedIndex(index),\n [itemAttribute]: index,\n }),\n };\n};\n"],"names":[],"mappings":"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"}
@@ -48,6 +48,9 @@ export interface ToolbarButtonProps {
48
48
  /**
49
49
  * An icon button with a tooltip, intended to be placed inside a {@link Toolbar}.
50
50
  * Uses the shared {@link Tooltip} component for consistent hover labels.
51
+ *
52
+ * Inside a drawer {@link ToolbarFolder} the button renders as a labeled tile instead, with its
53
+ * `title` always visible, so a drawer can be composed from children as well as from `items`.
51
54
  */
52
- export declare const ToolbarButton: ({ icon, text, title, active, onClick, tooltipPosition, draggable, data, onDragStart, className, pt, }: ToolbarButtonProps) => import("react").JSX.Element;
55
+ export declare const ToolbarButton: (props: ToolbarButtonProps) => import("react").JSX.Element;
53
56
  //# sourceMappingURL=ToolbarButton.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToolbarButton.d.ts","sourceRoot":"","sources":["../../../Toolbar/ToolbarButton.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACR,oBAAoB,EACpB,cAAc,EACjB,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAmB,CAAC;AAMzD,wDAAwD;AACxD,MAAM,WAAW,kBAAkB;IAC/B,0BAA0B;IAC1B,IAAI,CAAC,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;IAC/C,oBAAoB;IACpB,IAAI,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC;IACvC,gCAAgC;IAChC,KAAK,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC;CAC3C;AAED,qDAAqD;AACrD,MAAM,WAAW,kBAAkB;IAC/B,2FAA2F;IAC3F,IAAI,CAAC,EAAE,IAAI,CAAC;IAEZ,2GAA2G;IAC3G,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IAEd,oEAAoE;IACpE,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB,yEAAyE;IACzE,eAAe,CAAC,EAAE,eAAe,CAAC;IAElC,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,qCAAqC;IACrC,EAAE,CAAC,EAAE,kBAAkB,CAAC;IAExB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;CACpF;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,0GAYvB,kBAAkB,gCAuGpB,CAAC"}
1
+ {"version":3,"file":"ToolbarButton.d.ts","sourceRoot":"","sources":["../../../Toolbar/ToolbarButton.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACR,oBAAoB,EACpB,cAAc,EACjB,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAmB,CAAC;AAQzD,wDAAwD;AACxD,MAAM,WAAW,kBAAkB;IAC/B,0BAA0B;IAC1B,IAAI,CAAC,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;IAC/C,oBAAoB;IACpB,IAAI,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC;IACvC,gCAAgC;IAChC,KAAK,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC;CAC3C;AAED,qDAAqD;AACrD,MAAM,WAAW,kBAAkB;IAC/B,2FAA2F;IAC3F,IAAI,CAAC,EAAE,IAAI,CAAC;IAEZ,2GAA2G;IAC3G,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IAEd,oEAAoE;IACpE,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB,yEAAyE;IACzE,eAAe,CAAC,EAAE,eAAe,CAAC;IAElC,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,qCAAqC;IACrC,EAAE,CAAC,EAAE,kBAAkB,CAAC;IAExB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;CACpF;AAuHD;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,UAAW,kBAAkB,gCAuBtD,CAAC"}
@@ -1,12 +1,14 @@
1
- import { jsxs, jsx } from 'react/jsx-runtime';
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { IconDisplay } from '../Common/Icon.js';
3
3
  import { Tooltip } from '../Common/Tooltip.js';
4
4
  import { useToolbarDragContext } from './ToolbarDragContext.js';
5
+ import { useToolbarDrawer } from './ToolbarDrawerContext.js';
6
+ import { ToolbarDrawerTile } from './ToolbarDrawerTile.js';
5
7
  import { useToolbarFolderMode } from './ToolbarFolderContext.js';
6
8
  import { useToolbarItemVisibility } from './ToolbarItemVisibilityContext.js';
7
9
  import { useRovingTool } from '../Common/ToolbarRovingContext.js';
8
10
 
9
- const ToolbarButton = ({ icon, text, title, active, onClick, tooltipPosition = 'right', draggable, data, onDragStart, className, pt, }) => {
11
+ const ToolbarButtonContent = ({ icon, text, title, active, onClick, tooltipPosition = 'right', draggable, data, onDragStart, className, pt, }) => {
10
12
  const dragContext = useToolbarDragContext();
11
13
  const folderMode = useToolbarFolderMode();
12
14
  const isToolbarItemVisible = useToolbarItemVisibility();
@@ -30,6 +32,14 @@ const ToolbarButton = ({ icon, text, title, active, onClick, tooltipPosition = '
30
32
  const buttonContent = hasText ? (jsx("span", { ...pt?.label, className: `toolbar-button__text ${pt?.label?.className ?? ''}`, "data-cratis-part": 'label', children: text })) : resolvedIcon === null ? null : (jsx("span", { ...pt?.icon, className: pt?.icon?.className, "data-cratis-part": 'icon', children: jsx(IconDisplay, { icon: resolvedIcon, className: 'cratis:text-lg' }) }));
31
33
  return (jsx(Tooltip, { content: title, position: tooltipPosition, disabled: !isToolbarItemVisible, children: jsx("button", { "aria-pressed": active, ...pt?.root, ...rovingTool, type: 'button', "aria-label": title, onClick: onClick, draggable: isDraggable, onDragStart: isDraggable ? handleDragStart : undefined, className: `toolbar-button ${buttonSizeClass} cratis:flex cratis:items-center cratis:justify-center cratis:rounded-lg cratis:cursor-pointer ${activeClass} ${draggableClass} ${pt?.root?.className ?? ''} ${className ?? ''}`, "data-cratis-part": 'button', "data-active": active || undefined, "data-selected": active || undefined, children: buttonContent }) }));
32
34
  };
35
+ const ToolbarButton = (props) => {
36
+ const drawer = useToolbarDrawer();
37
+ const dragContext = useToolbarDragContext();
38
+ if (drawer === null) {
39
+ return jsx(ToolbarButtonContent, { ...props });
40
+ }
41
+ return (jsx(ToolbarDrawerTile, { title: props.title, icon: props.icon, active: props.active, draggable: props.draggable ?? dragContext.draggable, data: props.data, onClick: props.onClick, onDragStart: props.onDragStart, className: props.className, root: props.pt?.root, iconPart: props.pt?.icon, label: props.pt?.label }));
42
+ };
33
43
 
34
44
  export { ToolbarButton };
35
45
  //# sourceMappingURL=ToolbarButton.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToolbarButton.js","sources":["../../../Toolbar/ToolbarButton.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type {\n ButtonHTMLAttributes,\n HTMLAttributes,\n} from 'react';\nimport { IconDisplay } from '../Common/Icon';\nimport type { Icon } from '../Common/Icon';\nimport { Tooltip } from '../Common/Tooltip';\nimport type { TooltipPosition } from '../Common/Tooltip';\nimport { useToolbarDragContext } from './ToolbarDragContext';\nimport { useToolbarFolderMode } from './ToolbarFolderContext';\nimport { useToolbarItemVisibility } from './ToolbarItemVisibilityContext';\nimport { useRovingTool } from '../Common/ToolbarRovingContext';\n\n/** Stable part attributes for {@link ToolbarButton}. */\nexport interface ToolbarButtonParts {\n /** Native button root. */\n root?: ButtonHTMLAttributes<HTMLButtonElement>;\n /** Icon wrapper. */\n icon?: HTMLAttributes<HTMLSpanElement>;\n /** Text/title label wrapper. */\n label?: HTMLAttributes<HTMLSpanElement>;\n}\n\n/** Props for the {@link ToolbarButton} component. */\nexport interface ToolbarButtonProps {\n /** React icon node or consumer-owned icon-font class. Components installs no icon font. */\n icon?: Icon;\n\n /** Optional text-first content (for example `120%`); when non-empty it renders instead of {@link icon}. */\n text?: string;\n\n /** Title text shown when the user hovers over the button. */\n title: string;\n\n /** Whether the button is currently in the active/selected state. */\n active?: boolean;\n\n /** Callback invoked when the button is clicked. */\n onClick?: () => void;\n\n /** Position of the tooltip relative to the button (default: 'right'). */\n tooltipPosition?: TooltipPosition;\n\n /** Extra class name for the native button. */\n className?: string;\n\n /** Stable button part attributes. */\n pt?: ToolbarButtonParts;\n\n /**\n * Whether this button can be dragged onto a surface.\n * When omitted the value is inherited from the parent {@link Toolbar}'s `draggable` prop.\n */\n draggable?: boolean;\n\n /**\n * Optional data associated with this button for identification during drag &amp; drop.\n * The value is passed to {@link onDragStart} and serialised onto the HTML5\n * `DataTransfer` object as `application/json` so drop targets can read it.\n */\n data?: unknown;\n\n /**\n * Callback invoked when a drag operation starts on this button.\n * Receives the button's {@link data} and the originating drag event.\n */\n onDragStart?: (data: unknown, event: React.DragEvent<HTMLButtonElement>) => void;\n}\n\n/**\n * An icon button with a tooltip, intended to be placed inside a {@link Toolbar}.\n * Uses the shared {@link Tooltip} component for consistent hover labels.\n */\nexport const ToolbarButton = ({\n icon,\n text,\n title,\n active,\n onClick,\n tooltipPosition = 'right',\n draggable,\n data,\n onDragStart,\n className,\n pt,\n}: ToolbarButtonProps) => {\n const dragContext = useToolbarDragContext();\n const folderMode = useToolbarFolderMode();\n const isToolbarItemVisible = useToolbarItemVisibility();\n const rovingTool = useRovingTool<HTMLButtonElement>(pt?.root?.tabIndex, pt?.root?.onFocus);\n const isListMode = folderMode === 'list';\n const isDraggable = draggable ?? dragContext.draggable;\n\n const handleDragStart = (event: React.DragEvent<HTMLButtonElement>) => {\n event.dataTransfer.setData('application/json', JSON.stringify(data ?? null));\n event.dataTransfer.effectAllowed = 'copy';\n onDragStart?.(data, event);\n dragContext.onItemDragStart?.(data, event);\n };\n\n const activeClass = active ? 'toolbar-button--active' : '';\n const draggableClass = isDraggable ? 'toolbar-button--draggable' : '';\n const hasText = typeof text === 'string' && text.length > 0;\n const resolvedIcon = icon !== undefined && icon !== null && (typeof icon !== 'string' || icon.length > 0) ? icon : null;\n\n // List mode: icon + title label rendered side by side (no floating tooltip needed).\n if (isListMode) {\n return (\n <button\n aria-pressed={active}\n {...pt?.root}\n {...rovingTool}\n type='button'\n aria-label={title}\n onClick={onClick}\n draggable={isDraggable}\n onDragStart={isDraggable ? handleDragStart : undefined}\n className={`toolbar-button toolbar-button--list cratis:h-10 cratis:px-3 cratis:w-full cratis:flex cratis:items-center cratis:justify-start cratis:gap-2 cratis:rounded-lg cratis:cursor-pointer ${activeClass} ${draggableClass} ${pt?.root?.className ?? ''} ${className ?? ''}`}\n data-cratis-part='button'\n data-active={active || undefined}\n data-selected={active || undefined}\n >\n {resolvedIcon !== null && (\n <span\n {...pt?.icon}\n className={pt?.icon?.className}\n data-cratis-part='icon'\n >\n <IconDisplay\n icon={resolvedIcon}\n className='cratis:text-lg cratis:flex-shrink-0'\n />\n </span>\n )}\n <span\n {...pt?.label}\n className={`toolbar-button__label ${pt?.label?.className ?? ''}`}\n data-cratis-part='label'\n >\n {title}\n </span>\n </button>\n );\n }\n\n const buttonSizeClass = hasText ? 'cratis:h-10 cratis:px-3 cratis:min-w-[4rem]' : 'cratis:w-10 cratis:h-10';\n const buttonContent = hasText ? (\n <span\n {...pt?.label}\n className={`toolbar-button__text ${pt?.label?.className ?? ''}`}\n data-cratis-part='label'\n >\n {text}\n </span>\n ) : resolvedIcon === null ? null : (\n <span\n {...pt?.icon}\n className={pt?.icon?.className}\n data-cratis-part='icon'\n >\n <IconDisplay icon={resolvedIcon} className='cratis:text-lg' />\n </span>\n );\n\n return (\n <Tooltip\n content={title}\n position={tooltipPosition}\n disabled={!isToolbarItemVisible}\n >\n <button\n aria-pressed={active}\n {...pt?.root}\n {...rovingTool}\n type='button'\n aria-label={title}\n onClick={onClick}\n draggable={isDraggable}\n onDragStart={isDraggable ? handleDragStart : undefined}\n className={`toolbar-button ${buttonSizeClass} cratis:flex cratis:items-center cratis:justify-center cratis:rounded-lg cratis:cursor-pointer ${activeClass} ${draggableClass} ${pt?.root?.className ?? ''} ${className ?? ''}`}\n data-cratis-part='button'\n data-active={active || undefined}\n data-selected={active || undefined}\n >\n {buttonContent}\n </button>\n </Tooltip>\n );\n};\n"],"names":["_jsxs","_jsx"],"mappings":";;;;;;;;AA4EO,MAAM,aAAa,GAAG,CAAC,EAC1B,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,MAAM,EACN,OAAO,EACP,eAAe,GAAG,OAAO,EACzB,SAAS,EACT,IAAI,EACJ,WAAW,EACX,SAAS,EACT,EAAE,GACe,KAAI;AACrB,IAAA,MAAM,WAAW,GAAG,qBAAqB,EAAE;AAC3C,IAAA,MAAM,UAAU,GAAG,oBAAoB,EAAE;AACzC,IAAA,MAAM,oBAAoB,GAAG,wBAAwB,EAAE;AACvD,IAAA,MAAM,UAAU,GAAG,aAAa,CAAoB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC;AAC1F,IAAA,MAAM,UAAU,GAAG,UAAU,KAAK,MAAM;AACxC,IAAA,MAAM,WAAW,GAAG,SAAS,IAAI,WAAW,CAAC,SAAS;AAEtD,IAAA,MAAM,eAAe,GAAG,CAAC,KAAyC,KAAI;AAClE,QAAA,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;AAC5E,QAAA,KAAK,CAAC,YAAY,CAAC,aAAa,GAAG,MAAM;AACzC,QAAA,WAAW,GAAG,IAAI,EAAE,KAAK,CAAC;QAC1B,WAAW,CAAC,eAAe,GAAG,IAAI,EAAE,KAAK,CAAC;AAC9C,IAAA,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,GAAG,wBAAwB,GAAG,EAAE;IAC1D,MAAM,cAAc,GAAG,WAAW,GAAG,2BAA2B,GAAG,EAAE;AACrE,IAAA,MAAM,OAAO,GAAG,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;AAC3D,IAAA,MAAM,YAAY,GAAG,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,KAAK,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI;IAGvH,IAAI,UAAU,EAAE;QACZ,QACIA,IAAA,CAAA,QAAA,EAAA,EAAA,cAAA,EACkB,MAAM,EAAA,GAChB,EAAE,EAAE,IAAI,EAAA,GACR,UAAU,EACd,IAAI,EAAC,QAAQ,EAAA,YAAA,EACD,KAAK,EACjB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,WAAW,EACtB,WAAW,EAAE,WAAW,GAAG,eAAe,GAAG,SAAS,EACtD,SAAS,EAAE,CAAA,oLAAA,EAAuL,WAAW,CAAA,CAAA,EAAI,cAAc,CAAA,CAAA,EAAI,EAAE,EAAE,IAAI,EAAE,SAAS,IAAI,EAAE,CAAA,CAAA,EAAI,SAAS,IAAI,EAAE,CAAA,CAAE,EAAA,kBAAA,EAChQ,QAAQ,EAAA,aAAA,EACZ,MAAM,IAAI,SAAS,EAAA,eAAA,EACjB,MAAM,IAAI,SAAS,EAAA,QAAA,EAAA,CAEjC,YAAY,KAAK,IAAI,KAClBC,GAAA,CAAA,MAAA,EAAA,EAAA,GACQ,EAAE,EAAE,IAAI,EACZ,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAA,kBAAA,EACb,MAAM,EAAA,QAAA,EAEvBA,GAAA,CAAC,WAAW,EAAA,EACR,IAAI,EAAE,YAAY,EAClB,SAAS,EAAC,qCAAqC,EAAA,CACjD,EAAA,CACC,CACV,EACDA,GAAA,CAAA,MAAA,EAAA,EAAA,GACQ,EAAE,EAAE,KAAK,EACb,SAAS,EAAE,CAAA,sBAAA,EAAyB,EAAE,EAAE,KAAK,EAAE,SAAS,IAAI,EAAE,CAAA,CAAE,EAAA,kBAAA,EAC/C,OAAO,EAAA,QAAA,EAEvB,KAAK,EAAA,CACH,CAAA,EAAA,CACF;IAEjB;IAEA,MAAM,eAAe,GAAG,OAAO,GAAG,6CAA6C,GAAG,yBAAyB;AAC3G,IAAA,MAAM,aAAa,GAAG,OAAO,IACzBA,GAAA,CAAA,MAAA,EAAA,EAAA,GACQ,EAAE,EAAE,KAAK,EACb,SAAS,EAAE,CAAA,qBAAA,EAAwB,EAAE,EAAE,KAAK,EAAE,SAAS,IAAI,EAAE,EAAE,EAAA,kBAAA,EAC9C,OAAO,EAAA,QAAA,EAEvB,IAAI,GACF,IACP,YAAY,KAAK,IAAI,GAAG,IAAI,IAC5BA,GAAA,CAAA,MAAA,EAAA,EAAA,GACQ,EAAE,EAAE,IAAI,EACZ,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAA,kBAAA,EACb,MAAM,EAAA,QAAA,EAEvBA,GAAA,CAAC,WAAW,IAAC,IAAI,EAAE,YAAY,EAAE,SAAS,EAAC,gBAAgB,EAAA,CAAG,EAAA,CAC3D,CACV;AAED,IAAA,QACIA,GAAA,CAAC,OAAO,IACJ,OAAO,EAAE,KAAK,EACd,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,CAAC,oBAAoB,EAAA,QAAA,EAE/BA,GAAA,CAAA,QAAA,EAAA,EAAA,cAAA,EACkB,MAAM,EAAA,GAChB,EAAE,EAAE,IAAI,KACR,UAAU,EACd,IAAI,EAAC,QAAQ,gBACD,KAAK,EACjB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,WAAW,EACtB,WAAW,EAAE,WAAW,GAAG,eAAe,GAAG,SAAS,EACtD,SAAS,EAAE,CAAA,eAAA,EAAkB,eAAe,CAAA,+FAAA,EAAkG,WAAW,IAAI,cAAc,CAAA,CAAA,EAAI,EAAE,EAAE,IAAI,EAAE,SAAS,IAAI,EAAE,CAAA,CAAA,EAAI,SAAS,IAAI,EAAE,EAAE,EAAA,kBAAA,EAC5M,QAAQ,iBACZ,MAAM,IAAI,SAAS,EAAA,eAAA,EACjB,MAAM,IAAI,SAAS,EAAA,QAAA,EAEjC,aAAa,EAAA,CACT,EAAA,CACH;AAElB;;"}
1
+ {"version":3,"file":"ToolbarButton.js","sources":["../../../Toolbar/ToolbarButton.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type {\n ButtonHTMLAttributes,\n HTMLAttributes,\n} from 'react';\nimport { IconDisplay } from '../Common/Icon';\nimport type { Icon } from '../Common/Icon';\nimport { Tooltip } from '../Common/Tooltip';\nimport type { TooltipPosition } from '../Common/Tooltip';\nimport { useToolbarDragContext } from './ToolbarDragContext';\nimport { useToolbarDrawer } from './ToolbarDrawerContext';\nimport { ToolbarDrawerTile } from './ToolbarDrawerTile';\nimport { useToolbarFolderMode } from './ToolbarFolderContext';\nimport { useToolbarItemVisibility } from './ToolbarItemVisibilityContext';\nimport { useRovingTool } from '../Common/ToolbarRovingContext';\n\n/** Stable part attributes for {@link ToolbarButton}. */\nexport interface ToolbarButtonParts {\n /** Native button root. */\n root?: ButtonHTMLAttributes<HTMLButtonElement>;\n /** Icon wrapper. */\n icon?: HTMLAttributes<HTMLSpanElement>;\n /** Text/title label wrapper. */\n label?: HTMLAttributes<HTMLSpanElement>;\n}\n\n/** Props for the {@link ToolbarButton} component. */\nexport interface ToolbarButtonProps {\n /** React icon node or consumer-owned icon-font class. Components installs no icon font. */\n icon?: Icon;\n\n /** Optional text-first content (for example `120%`); when non-empty it renders instead of {@link icon}. */\n text?: string;\n\n /** Title text shown when the user hovers over the button. */\n title: string;\n\n /** Whether the button is currently in the active/selected state. */\n active?: boolean;\n\n /** Callback invoked when the button is clicked. */\n onClick?: () => void;\n\n /** Position of the tooltip relative to the button (default: 'right'). */\n tooltipPosition?: TooltipPosition;\n\n /** Extra class name for the native button. */\n className?: string;\n\n /** Stable button part attributes. */\n pt?: ToolbarButtonParts;\n\n /**\n * Whether this button can be dragged onto a surface.\n * When omitted the value is inherited from the parent {@link Toolbar}'s `draggable` prop.\n */\n draggable?: boolean;\n\n /**\n * Optional data associated with this button for identification during drag &amp; drop.\n * The value is passed to {@link onDragStart} and serialised onto the HTML5\n * `DataTransfer` object as `application/json` so drop targets can read it.\n */\n data?: unknown;\n\n /**\n * Callback invoked when a drag operation starts on this button.\n * Receives the button's {@link data} and the originating drag event.\n */\n onDragStart?: (data: unknown, event: React.DragEvent<HTMLButtonElement>) => void;\n}\n\nconst ToolbarButtonContent = ({\n icon,\n text,\n title,\n active,\n onClick,\n tooltipPosition = 'right',\n draggable,\n data,\n onDragStart,\n className,\n pt,\n}: ToolbarButtonProps) => {\n const dragContext = useToolbarDragContext();\n const folderMode = useToolbarFolderMode();\n const isToolbarItemVisible = useToolbarItemVisibility();\n const rovingTool = useRovingTool<HTMLButtonElement>(pt?.root?.tabIndex, pt?.root?.onFocus);\n const isListMode = folderMode === 'list';\n const isDraggable = draggable ?? dragContext.draggable;\n\n const handleDragStart = (event: React.DragEvent<HTMLButtonElement>) => {\n event.dataTransfer.setData('application/json', JSON.stringify(data ?? null));\n event.dataTransfer.effectAllowed = 'copy';\n onDragStart?.(data, event);\n dragContext.onItemDragStart?.(data, event);\n };\n\n const activeClass = active ? 'toolbar-button--active' : '';\n const draggableClass = isDraggable ? 'toolbar-button--draggable' : '';\n const hasText = typeof text === 'string' && text.length > 0;\n const resolvedIcon = icon !== undefined && icon !== null && (typeof icon !== 'string' || icon.length > 0) ? icon : null;\n\n // List mode: icon + title label rendered side by side (no floating tooltip needed).\n if (isListMode) {\n return (\n <button\n aria-pressed={active}\n {...pt?.root}\n {...rovingTool}\n type='button'\n aria-label={title}\n onClick={onClick}\n draggable={isDraggable}\n onDragStart={isDraggable ? handleDragStart : undefined}\n className={`toolbar-button toolbar-button--list cratis:h-10 cratis:px-3 cratis:w-full cratis:flex cratis:items-center cratis:justify-start cratis:gap-2 cratis:rounded-lg cratis:cursor-pointer ${activeClass} ${draggableClass} ${pt?.root?.className ?? ''} ${className ?? ''}`}\n data-cratis-part='button'\n data-active={active || undefined}\n data-selected={active || undefined}\n >\n {resolvedIcon !== null && (\n <span\n {...pt?.icon}\n className={pt?.icon?.className}\n data-cratis-part='icon'\n >\n <IconDisplay\n icon={resolvedIcon}\n className='cratis:text-lg cratis:flex-shrink-0'\n />\n </span>\n )}\n <span\n {...pt?.label}\n className={`toolbar-button__label ${pt?.label?.className ?? ''}`}\n data-cratis-part='label'\n >\n {title}\n </span>\n </button>\n );\n }\n\n const buttonSizeClass = hasText ? 'cratis:h-10 cratis:px-3 cratis:min-w-[4rem]' : 'cratis:w-10 cratis:h-10';\n const buttonContent = hasText ? (\n <span\n {...pt?.label}\n className={`toolbar-button__text ${pt?.label?.className ?? ''}`}\n data-cratis-part='label'\n >\n {text}\n </span>\n ) : resolvedIcon === null ? null : (\n <span\n {...pt?.icon}\n className={pt?.icon?.className}\n data-cratis-part='icon'\n >\n <IconDisplay icon={resolvedIcon} className='cratis:text-lg' />\n </span>\n );\n\n return (\n <Tooltip\n content={title}\n position={tooltipPosition}\n disabled={!isToolbarItemVisible}\n >\n <button\n aria-pressed={active}\n {...pt?.root}\n {...rovingTool}\n type='button'\n aria-label={title}\n onClick={onClick}\n draggable={isDraggable}\n onDragStart={isDraggable ? handleDragStart : undefined}\n className={`toolbar-button ${buttonSizeClass} cratis:flex cratis:items-center cratis:justify-center cratis:rounded-lg cratis:cursor-pointer ${activeClass} ${draggableClass} ${pt?.root?.className ?? ''} ${className ?? ''}`}\n data-cratis-part='button'\n data-active={active || undefined}\n data-selected={active || undefined}\n >\n {buttonContent}\n </button>\n </Tooltip>\n );\n};\n\n/**\n * An icon button with a tooltip, intended to be placed inside a {@link Toolbar}.\n * Uses the shared {@link Tooltip} component for consistent hover labels.\n *\n * Inside a drawer {@link ToolbarFolder} the button renders as a labeled tile instead, with its\n * `title` always visible, so a drawer can be composed from children as well as from `items`.\n */\nexport const ToolbarButton = (props: ToolbarButtonProps) => {\n const drawer = useToolbarDrawer();\n const dragContext = useToolbarDragContext();\n\n if (drawer === null) {\n return <ToolbarButtonContent {...props} />;\n }\n\n return (\n <ToolbarDrawerTile\n title={props.title}\n icon={props.icon}\n active={props.active}\n draggable={props.draggable ?? dragContext.draggable}\n data={props.data}\n onClick={props.onClick}\n onDragStart={props.onDragStart}\n className={props.className}\n root={props.pt?.root}\n iconPart={props.pt?.icon}\n label={props.pt?.label}\n />\n );\n};\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Internal context a drawer {@link ToolbarFolder} provides to the tiles inside it. Its presence is
3
+ * what makes a {@link ToolbarButton} render as a labeled tile instead of an icon-only cell.
4
+ */
5
+ export interface ToolbarDrawerContextValue {
6
+ /** Reports that a tile drag started or ended, so the drawer can reflect the drag lifecycle. */
7
+ setDragging: (dragging: boolean) => void;
8
+ }
9
+ /** Context provided by a drawer {@link ToolbarFolder}; `null` everywhere else. */
10
+ export declare const ToolbarDrawerContext: import("react").Context<ToolbarDrawerContextValue | null>;
11
+ /** Returns the enclosing drawer, or `null` when the caller is not inside a drawer folder. */
12
+ export declare const useToolbarDrawer: () => ToolbarDrawerContextValue | null;
13
+ //# sourceMappingURL=ToolbarDrawerContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolbarDrawerContext.d.ts","sourceRoot":"","sources":["../../../Toolbar/ToolbarDrawerContext.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,MAAM,WAAW,yBAAyB;IACtC,+FAA+F;IAC/F,WAAW,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5C;AAED,kFAAkF;AAClF,eAAO,MAAM,oBAAoB,2DAAwD,CAAC;AAE1F,6FAA6F;AAC7F,eAAO,MAAM,gBAAgB,QAAO,yBAAyB,GAAG,IAAwC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { createContext, useContext } from 'react';
2
+
3
+ const ToolbarDrawerContext = createContext(null);
4
+ const useToolbarDrawer = () => useContext(ToolbarDrawerContext);
5
+
6
+ export { ToolbarDrawerContext, useToolbarDrawer };
7
+ //# sourceMappingURL=ToolbarDrawerContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolbarDrawerContext.js","sources":["../../../Toolbar/ToolbarDrawerContext.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { createContext, useContext } from 'react';\n\n/**\n * Internal context a drawer {@link ToolbarFolder} provides to the tiles inside it. Its presence is\n * what makes a {@link ToolbarButton} render as a labeled tile instead of an icon-only cell.\n */\nexport interface ToolbarDrawerContextValue {\n /** Reports that a tile drag started or ended, so the drawer can reflect the drag lifecycle. */\n setDragging: (dragging: boolean) => void;\n}\n\n/** Context provided by a drawer {@link ToolbarFolder}; `null` everywhere else. */\nexport const ToolbarDrawerContext = createContext<ToolbarDrawerContextValue | null>(null);\n\n/** Returns the enclosing drawer, or `null` when the caller is not inside a drawer folder. */\nexport const useToolbarDrawer = (): ToolbarDrawerContextValue | null => useContext(ToolbarDrawerContext);\n"],"names":[],"mappings":";;MAea,oBAAoB,GAAG,aAAa,CAAmC,IAAI;AAGjF,MAAM,gBAAgB,GAAG,MAAwC,UAAU,CAAC,oBAAoB;;"}
@@ -0,0 +1,23 @@
1
+ import type { Icon } from '../Common/Icon.js';
2
+ /**
3
+ * One entry of a catalogue shown as a labeled tile inside a drawer {@link ToolbarFolder}.
4
+ *
5
+ * The drawer never interprets {@link payload}: the exact value supplied here is delivered unchanged
6
+ * to the consumer when the tile is activated and when it is dragged, so the consumer decides what
7
+ * the item means and where it is inserted.
8
+ */
9
+ export interface ToolbarDrawerItem {
10
+ /** Stable identity of the item. Used as the React key and never derived from {@link title}. */
11
+ id: string;
12
+ /** Always-visible, localizable tile label. Also the tile's accessible name. */
13
+ title: string;
14
+ /** Icon shown above the label. */
15
+ icon: Icon;
16
+ /** Consumer-owned data delivered unchanged on activation and on drag. */
17
+ payload: unknown;
18
+ /** Whether the item is unavailable. A disabled tile stays focusable so its reason can be read. */
19
+ disabled?: boolean;
20
+ /** Explanation shown as the tile description when {@link disabled}. */
21
+ disabledReason?: string;
22
+ }
23
+ //# sourceMappingURL=ToolbarDrawerItem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolbarDrawerItem.d.ts","sourceRoot":"","sources":["../../../Toolbar/ToolbarDrawerItem.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAgB,CAAC;AAE3C;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAC9B,+FAA+F;IAC/F,EAAE,EAAE,MAAM,CAAC;IAEX,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAC;IAEd,kCAAkC;IAClC,IAAI,EAAE,IAAI,CAAC;IAEX,yEAAyE;IACzE,OAAO,EAAE,OAAO,CAAC;IAEjB,kGAAkG;IAClG,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,uEAAuE;IACvE,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B"}
@@ -0,0 +1,4 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+ export {};
4
+ //# sourceMappingURL=ToolbarDrawerItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolbarDrawerItem.js","sourceRoot":"","sources":["../../../Toolbar/ToolbarDrawerItem.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,qGAAqG","sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { Icon } from '../Common/Icon';\n\n/**\n * One entry of a catalogue shown as a labeled tile inside a drawer {@link ToolbarFolder}.\n *\n * The drawer never interprets {@link payload}: the exact value supplied here is delivered unchanged\n * to the consumer when the tile is activated and when it is dragged, so the consumer decides what\n * the item means and where it is inserted.\n */\nexport interface ToolbarDrawerItem {\n /** Stable identity of the item. Used as the React key and never derived from {@link title}. */\n id: string;\n\n /** Always-visible, localizable tile label. Also the tile's accessible name. */\n title: string;\n\n /** Icon shown above the label. */\n icon: Icon;\n\n /** Consumer-owned data delivered unchanged on activation and on drag. */\n payload: unknown;\n\n /** Whether the item is unavailable. A disabled tile stays focusable so its reason can be read. */\n disabled?: boolean;\n\n /** Explanation shown as the tile description when {@link disabled}. */\n disabledReason?: string;\n}\n"]}
@@ -0,0 +1,57 @@
1
+ /** Edges of an element, in viewport coordinates. */
2
+ export interface ToolbarDrawerRectangle {
3
+ left: number;
4
+ top: number;
5
+ right: number;
6
+ bottom: number;
7
+ }
8
+ /** Inputs for {@link resolveToolbarDrawerPlacement}. */
9
+ export interface ToolbarDrawerPlacementRequest {
10
+ /** The folder trigger the drawer is anchored to. */
11
+ trigger: ToolbarDrawerRectangle;
12
+ /** Natural (unconstrained) size of the drawer. */
13
+ panel: {
14
+ width: number;
15
+ height: number;
16
+ };
17
+ /** Size of the viewport the drawer has to stay inside. */
18
+ viewport: {
19
+ width: number;
20
+ height: number;
21
+ };
22
+ /** Orientation of the owning toolbar. */
23
+ orientation: 'vertical' | 'horizontal';
24
+ /** Preferred side for a vertical toolbar. A horizontal toolbar prefers `'bottom'`. */
25
+ preferredHorizontalSide: 'right' | 'left';
26
+ /** Space kept between the drawer and the trigger. */
27
+ gap: number;
28
+ /** Space kept between the drawer and the viewport edge. */
29
+ margin: number;
30
+ }
31
+ /** Where a drawer ends up relative to its trigger. */
32
+ export interface ToolbarDrawerPlacement {
33
+ /** The side of the trigger the drawer opens towards. */
34
+ side: 'right' | 'left' | 'top' | 'bottom';
35
+ /** Offset along the cross axis that keeps the drawer inside the viewport. */
36
+ shift: number;
37
+ /**
38
+ * Offset along the opening axis, towards the trigger. Non-zero only when the drawer fits on
39
+ * neither side, so it overlaps the toolbar rather than leaving the viewport.
40
+ */
41
+ mainShift: number;
42
+ /** Largest height the drawer may take before it scrolls. */
43
+ maxHeight: number;
44
+ /** Largest width the drawer may take. */
45
+ maxWidth: number;
46
+ }
47
+ /**
48
+ * Decides which side of its trigger a drawer opens towards and how far it has to move along the
49
+ * cross axis to stay inside the viewport.
50
+ *
51
+ * A drawer first tries its preferred side, flips to the opposite side when it does not fit there
52
+ * and the opposite side offers more room, and finally slides along the cross axis. When it fits on
53
+ * neither side it moves back over the toolbar instead of leaving the viewport. When the drawer is
54
+ * larger than the viewport allows, `maxHeight` and `maxWidth` bound it so its content scrolls.
55
+ */
56
+ export declare const resolveToolbarDrawerPlacement: (request: ToolbarDrawerPlacementRequest) => ToolbarDrawerPlacement;
57
+ //# sourceMappingURL=ToolbarDrawerPlacement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolbarDrawerPlacement.d.ts","sourceRoot":"","sources":["../../../Toolbar/ToolbarDrawerPlacement.ts"],"names":[],"mappings":"AAGA,oDAAoD;AACpD,MAAM,WAAW,sBAAsB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,wDAAwD;AACxD,MAAM,WAAW,6BAA6B;IAC1C,oDAAoD;IACpD,OAAO,EAAE,sBAAsB,CAAC;IAChC,kDAAkD;IAClD,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,0DAA0D;IAC1D,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,yCAAyC;IACzC,WAAW,EAAE,UAAU,GAAG,YAAY,CAAC;IACvC,sFAAsF;IACtF,uBAAuB,EAAE,OAAO,GAAG,MAAM,CAAC;IAC1C,qDAAqD;IACrD,GAAG,EAAE,MAAM,CAAC;IACZ,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,sDAAsD;AACtD,MAAM,WAAW,sBAAsB;IACnC,wDAAwD;IACxD,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;IAC1C,6EAA6E;IAC7E,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAC;CACpB;AASD;;;;;;;;GAQG;AACH,eAAO,MAAM,6BAA6B,YAAa,6BAA6B,KAAG,sBA2CtF,CAAC"}
@@ -0,0 +1,51 @@
1
+ const clampShift = (start, size, limit, margin) => {
2
+ const minimumStart = margin;
3
+ const maximumStart = Math.max(minimumStart, limit - margin - size);
4
+ const clamped = Math.min(Math.max(start, minimumStart), maximumStart);
5
+ return clamped - start;
6
+ };
7
+ const resolveToolbarDrawerPlacement = (request) => {
8
+ const { trigger, panel, viewport, orientation, preferredHorizontalSide, gap, margin } = request;
9
+ const maxHeight = Math.max(0, viewport.height - margin * 2);
10
+ const maxWidth = Math.max(0, viewport.width - margin * 2);
11
+ const panelWidth = Math.min(panel.width, maxWidth);
12
+ const panelHeight = Math.min(panel.height, maxHeight);
13
+ if (orientation === 'horizontal') {
14
+ const roomBelow = viewport.height - margin - trigger.bottom - gap;
15
+ const roomAbove = trigger.top - margin - gap;
16
+ const fitsBelow = roomBelow >= panelHeight;
17
+ const fitsAbove = roomAbove >= panelHeight;
18
+ const side = fitsBelow || (!fitsAbove && roomBelow >= roomAbove) ? 'bottom' : 'top';
19
+ const centered = (trigger.left + trigger.right) / 2 - panelWidth / 2;
20
+ const overflow = Math.max(0, panelHeight - (side === 'bottom' ? roomBelow : roomAbove));
21
+ return {
22
+ side,
23
+ shift: clampShift(centered, panelWidth, viewport.width, margin),
24
+ mainShift: side === 'bottom' ? -overflow : overflow,
25
+ maxHeight,
26
+ maxWidth,
27
+ };
28
+ }
29
+ const roomRight = viewport.width - margin - trigger.right - gap;
30
+ const roomLeft = trigger.left - margin - gap;
31
+ const preferredRoom = preferredHorizontalSide === 'right' ? roomRight : roomLeft;
32
+ const oppositeRoom = preferredHorizontalSide === 'right' ? roomLeft : roomRight;
33
+ const fitsPreferred = preferredRoom >= panelWidth;
34
+ const fitsOpposite = oppositeRoom >= panelWidth;
35
+ const flip = !fitsPreferred && (fitsOpposite || oppositeRoom > preferredRoom);
36
+ const side = flip
37
+ ? (preferredHorizontalSide === 'right' ? 'left' : 'right')
38
+ : preferredHorizontalSide;
39
+ const centered = (trigger.top + trigger.bottom) / 2 - panelHeight / 2;
40
+ const overflow = Math.max(0, panelWidth - (side === 'right' ? roomRight : roomLeft));
41
+ return {
42
+ side,
43
+ shift: clampShift(centered, panelHeight, viewport.height, margin),
44
+ mainShift: side === 'right' ? -overflow : overflow,
45
+ maxHeight,
46
+ maxWidth,
47
+ };
48
+ };
49
+
50
+ export { resolveToolbarDrawerPlacement };
51
+ //# sourceMappingURL=ToolbarDrawerPlacement.js.map