@unofficialbox/box-open-elements 0.1.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 (351) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +125 -0
  3. package/dist/components/actions/button-group.d.ts +22 -0
  4. package/dist/components/actions/button-group.js +255 -0
  5. package/dist/components/actions/button.d.ts +16 -0
  6. package/dist/components/actions/button.js +190 -0
  7. package/dist/components/actions/icon-button.d.ts +20 -0
  8. package/dist/components/actions/icon-button.js +187 -0
  9. package/dist/components/actions/link-button.d.ts +14 -0
  10. package/dist/components/actions/link-button.js +137 -0
  11. package/dist/components/actions/menu-item.d.ts +17 -0
  12. package/dist/components/actions/menu-item.js +137 -0
  13. package/dist/components/actions/menu.d.ts +22 -0
  14. package/dist/components/actions/menu.js +178 -0
  15. package/dist/components/actions/segmented-control.d.ts +27 -0
  16. package/dist/components/actions/segmented-control.js +273 -0
  17. package/dist/components/collections/card.d.ts +13 -0
  18. package/dist/components/collections/card.js +110 -0
  19. package/dist/components/collections/carousel.d.ts +40 -0
  20. package/dist/components/collections/carousel.js +406 -0
  21. package/dist/components/collections/datalist-item.d.ts +32 -0
  22. package/dist/components/collections/datalist-item.js +196 -0
  23. package/dist/components/collections/draggable-list.d.ts +33 -0
  24. package/dist/components/collections/draggable-list.js +306 -0
  25. package/dist/components/collections/grid-view.d.ts +38 -0
  26. package/dist/components/collections/grid-view.js +321 -0
  27. package/dist/components/collections/pagination.d.ts +19 -0
  28. package/dist/components/collections/pagination.js +147 -0
  29. package/dist/components/collections/tree-grid.d.ts +47 -0
  30. package/dist/components/collections/tree-grid.js +593 -0
  31. package/dist/components/collections/tree.d.ts +37 -0
  32. package/dist/components/collections/tree.js +526 -0
  33. package/dist/components/feedback/alert.d.ts +27 -0
  34. package/dist/components/feedback/alert.js +263 -0
  35. package/dist/components/feedback/badge.d.ts +12 -0
  36. package/dist/components/feedback/badge.js +99 -0
  37. package/dist/components/feedback/chip.d.ts +33 -0
  38. package/dist/components/feedback/chip.js +261 -0
  39. package/dist/components/feedback/empty-state.d.ts +19 -0
  40. package/dist/components/feedback/empty-state.js +137 -0
  41. package/dist/components/feedback/error-mask.d.ts +25 -0
  42. package/dist/components/feedback/error-mask.js +199 -0
  43. package/dist/components/feedback/help-text.d.ts +22 -0
  44. package/dist/components/feedback/help-text.js +176 -0
  45. package/dist/components/feedback/nudge.d.ts +32 -0
  46. package/dist/components/feedback/nudge.js +299 -0
  47. package/dist/components/feedback/progress-bar.d.ts +18 -0
  48. package/dist/components/feedback/progress-bar.js +128 -0
  49. package/dist/components/feedback/progress-ring.d.ts +21 -0
  50. package/dist/components/feedback/progress-ring.js +155 -0
  51. package/dist/components/feedback/progress-steps.d.ts +25 -0
  52. package/dist/components/feedback/progress-steps.js +276 -0
  53. package/dist/components/feedback/skeleton.d.ts +14 -0
  54. package/dist/components/feedback/skeleton.js +95 -0
  55. package/dist/components/feedback/spinner.d.ts +10 -0
  56. package/dist/components/feedback/spinner.js +80 -0
  57. package/dist/components/feedback/toast.d.ts +26 -0
  58. package/dist/components/feedback/toast.js +205 -0
  59. package/dist/components/files/drop-zone.d.ts +19 -0
  60. package/dist/components/files/drop-zone.js +169 -0
  61. package/dist/components/forms/calendar.d.ts +47 -0
  62. package/dist/components/forms/calendar.js +499 -0
  63. package/dist/components/forms/category-selector.d.ts +35 -0
  64. package/dist/components/forms/category-selector.js +269 -0
  65. package/dist/components/forms/checkbox-group.d.ts +31 -0
  66. package/dist/components/forms/checkbox-group.js +267 -0
  67. package/dist/components/forms/checkbox.d.ts +28 -0
  68. package/dist/components/forms/checkbox.js +250 -0
  69. package/dist/components/forms/color-picker.d.ts +34 -0
  70. package/dist/components/forms/color-picker.js +314 -0
  71. package/dist/components/forms/combobox.d.ts +37 -0
  72. package/dist/components/forms/combobox.js +234 -0
  73. package/dist/components/forms/date-field.d.ts +27 -0
  74. package/dist/components/forms/date-field.js +187 -0
  75. package/dist/components/forms/dropdown.d.ts +38 -0
  76. package/dist/components/forms/dropdown.js +405 -0
  77. package/dist/components/forms/dual-listbox.d.ts +44 -0
  78. package/dist/components/forms/dual-listbox.js +484 -0
  79. package/dist/components/forms/fieldset.d.ts +32 -0
  80. package/dist/components/forms/fieldset.js +168 -0
  81. package/dist/components/forms/multi-select.d.ts +30 -0
  82. package/dist/components/forms/multi-select.js +264 -0
  83. package/dist/components/forms/number-input.d.ts +32 -0
  84. package/dist/components/forms/number-input.js +245 -0
  85. package/dist/components/forms/pill-cloud.d.ts +35 -0
  86. package/dist/components/forms/pill-cloud.js +230 -0
  87. package/dist/components/forms/pill-selector-dropdown.d.ts +55 -0
  88. package/dist/components/forms/pill-selector-dropdown.js +499 -0
  89. package/dist/components/forms/radio-group.d.ts +32 -0
  90. package/dist/components/forms/radio-group.js +285 -0
  91. package/dist/components/forms/range-slider.d.ts +36 -0
  92. package/dist/components/forms/range-slider.js +294 -0
  93. package/dist/components/forms/rating.d.ts +31 -0
  94. package/dist/components/forms/rating.js +302 -0
  95. package/dist/components/forms/rich-text-input.d.ts +32 -0
  96. package/dist/components/forms/rich-text-input.js +403 -0
  97. package/dist/components/forms/search-field.d.ts +27 -0
  98. package/dist/components/forms/search-field.js +293 -0
  99. package/dist/components/forms/select.d.ts +30 -0
  100. package/dist/components/forms/select.js +198 -0
  101. package/dist/components/forms/slider.d.ts +31 -0
  102. package/dist/components/forms/slider.js +221 -0
  103. package/dist/components/forms/spin-button.d.ts +33 -0
  104. package/dist/components/forms/spin-button.js +352 -0
  105. package/dist/components/forms/switch.d.ts +32 -0
  106. package/dist/components/forms/switch.js +302 -0
  107. package/dist/components/forms/tag-input.d.ts +46 -0
  108. package/dist/components/forms/tag-input.js +420 -0
  109. package/dist/components/forms/text-area.d.ts +26 -0
  110. package/dist/components/forms/text-area.js +188 -0
  111. package/dist/components/forms/text-field.d.ts +24 -0
  112. package/dist/components/forms/text-field.js +151 -0
  113. package/dist/components/forms/time-field.d.ts +29 -0
  114. package/dist/components/forms/time-field.js +203 -0
  115. package/dist/components/identity/avatar.d.ts +21 -0
  116. package/dist/components/identity/avatar.js +191 -0
  117. package/dist/components/identity/contact-datalist-item.d.ts +31 -0
  118. package/dist/components/identity/contact-datalist-item.js +235 -0
  119. package/dist/components/identity/persona.d.ts +28 -0
  120. package/dist/components/identity/persona.js +272 -0
  121. package/dist/components/layout/app-shell.d.ts +26 -0
  122. package/dist/components/layout/app-shell.js +258 -0
  123. package/dist/components/layout/divider.d.ts +12 -0
  124. package/dist/components/layout/divider.js +119 -0
  125. package/dist/components/layout/nav-sidebar.d.ts +23 -0
  126. package/dist/components/layout/nav-sidebar.js +167 -0
  127. package/dist/components/layout/section.d.ts +20 -0
  128. package/dist/components/layout/section.js +143 -0
  129. package/dist/components/layout/sidebar-toggle-button.d.ts +26 -0
  130. package/dist/components/layout/sidebar-toggle-button.js +137 -0
  131. package/dist/components/layout/split-view.d.ts +19 -0
  132. package/dist/components/layout/split-view.js +157 -0
  133. package/dist/components/navigation/accordion.d.ts +25 -0
  134. package/dist/components/navigation/accordion.js +253 -0
  135. package/dist/components/navigation/tabs.d.ts +27 -0
  136. package/dist/components/navigation/tabs.js +289 -0
  137. package/dist/components/overlays/dialog.d.ts +26 -0
  138. package/dist/components/overlays/dialog.js +267 -0
  139. package/dist/components/overlays/drawer.d.ts +32 -0
  140. package/dist/components/overlays/drawer.js +323 -0
  141. package/dist/components/overlays/popover.d.ts +35 -0
  142. package/dist/components/overlays/popover.js +317 -0
  143. package/dist/components/overlays/tooltip.d.ts +26 -0
  144. package/dist/components/overlays/tooltip.js +204 -0
  145. package/dist/components/visuals/illustration.d.ts +26 -0
  146. package/dist/components/visuals/illustration.js +319 -0
  147. package/dist/core/controller.d.ts +11 -0
  148. package/dist/core/controller.js +23 -0
  149. package/dist/core/element.d.ts +22 -0
  150. package/dist/core/element.js +28 -0
  151. package/dist/core/event-emitter.d.ts +9 -0
  152. package/dist/core/event-emitter.js +33 -0
  153. package/dist/core/form-associated.d.ts +63 -0
  154. package/dist/core/form-associated.js +218 -0
  155. package/dist/core/index.d.ts +6 -0
  156. package/dist/core/index.js +4 -0
  157. package/dist/core/json-schema.d.ts +1 -0
  158. package/dist/core/json-schema.js +1 -0
  159. package/dist/foundations/a11y/focus.d.ts +17 -0
  160. package/dist/foundations/a11y/focus.js +94 -0
  161. package/dist/foundations/a11y/heading.d.ts +26 -0
  162. package/dist/foundations/a11y/heading.js +40 -0
  163. package/dist/foundations/a11y/index.d.ts +5 -0
  164. package/dist/foundations/a11y/index.js +3 -0
  165. package/dist/foundations/a11y/keyboard.d.ts +28 -0
  166. package/dist/foundations/a11y/keyboard.js +77 -0
  167. package/dist/foundations/geometry/index.d.ts +1 -0
  168. package/dist/foundations/geometry/index.js +1 -0
  169. package/dist/foundations/geometry/tokens.d.ts +123 -0
  170. package/dist/foundations/geometry/tokens.js +154 -0
  171. package/dist/foundations/icons/box-iconography.d.ts +479 -0
  172. package/dist/foundations/icons/box-iconography.generated.d.ts +2370 -0
  173. package/dist/foundations/icons/box-iconography.generated.js +4010 -0
  174. package/dist/foundations/icons/box-iconography.js +39 -0
  175. package/dist/foundations/icons/index.d.ts +1 -0
  176. package/dist/foundations/icons/index.js +1 -0
  177. package/dist/foundations/motion/index.d.ts +2 -0
  178. package/dist/foundations/motion/index.js +1 -0
  179. package/dist/foundations/motion/tokens.d.ts +39 -0
  180. package/dist/foundations/motion/tokens.js +43 -0
  181. package/dist/foundations/tokens/box-dark.d.ts +11 -0
  182. package/dist/foundations/tokens/box-dark.js +46 -0
  183. package/dist/foundations/tokens/box-defaults.d.ts +5 -0
  184. package/dist/foundations/tokens/box-defaults.js +52 -0
  185. package/dist/foundations/tokens/index.d.ts +5 -0
  186. package/dist/foundations/tokens/index.js +4 -0
  187. package/dist/foundations/tokens/interaction.d.ts +28 -0
  188. package/dist/foundations/tokens/interaction.js +72 -0
  189. package/dist/foundations/tokens/registry.d.ts +14 -0
  190. package/dist/foundations/tokens/registry.js +92 -0
  191. package/dist/foundations/tokens/types.d.ts +16 -0
  192. package/dist/foundations/tokens/types.js +1 -0
  193. package/dist/foundations/typography/index.d.ts +2 -0
  194. package/dist/foundations/typography/index.js +1 -0
  195. package/dist/foundations/typography/tokens.d.ts +76 -0
  196. package/dist/foundations/typography/tokens.js +27 -0
  197. package/dist/index.d.ts +87 -0
  198. package/dist/index.js +98 -0
  199. package/dist/patterns/content-explorer/actions/controller.d.ts +12 -0
  200. package/dist/patterns/content-explorer/actions/controller.js +36 -0
  201. package/dist/patterns/content-explorer/actions/index.d.ts +2 -0
  202. package/dist/patterns/content-explorer/actions/index.js +1 -0
  203. package/dist/patterns/content-explorer/actions/types.d.ts +13 -0
  204. package/dist/patterns/content-explorer/actions/types.js +1 -0
  205. package/dist/patterns/content-explorer/adapters/action-menu.d.ts +24 -0
  206. package/dist/patterns/content-explorer/adapters/action-menu.js +312 -0
  207. package/dist/patterns/content-explorer/adapters/breadcrumbs.d.ts +15 -0
  208. package/dist/patterns/content-explorer/adapters/breadcrumbs.js +161 -0
  209. package/dist/patterns/content-explorer/adapters/item-summary.d.ts +11 -0
  210. package/dist/patterns/content-explorer/adapters/item-summary.js +72 -0
  211. package/dist/patterns/content-explorer/adapters/items.d.ts +4 -0
  212. package/dist/patterns/content-explorer/adapters/items.js +12 -0
  213. package/dist/patterns/content-explorer/adapters/list.d.ts +28 -0
  214. package/dist/patterns/content-explorer/adapters/list.js +527 -0
  215. package/dist/patterns/content-explorer/adapters/table.d.ts +23 -0
  216. package/dist/patterns/content-explorer/adapters/table.js +467 -0
  217. package/dist/patterns/content-explorer/adapters/toolbar.d.ts +19 -0
  218. package/dist/patterns/content-explorer/adapters/toolbar.js +234 -0
  219. package/dist/patterns/content-explorer/box-transport.d.ts +44 -0
  220. package/dist/patterns/content-explorer/box-transport.js +229 -0
  221. package/dist/patterns/content-explorer/collection/controller.d.ts +17 -0
  222. package/dist/patterns/content-explorer/collection/controller.js +67 -0
  223. package/dist/patterns/content-explorer/collection/index.d.ts +2 -0
  224. package/dist/patterns/content-explorer/collection/index.js +1 -0
  225. package/dist/patterns/content-explorer/collection/types.d.ts +20 -0
  226. package/dist/patterns/content-explorer/collection/types.js +1 -0
  227. package/dist/patterns/content-explorer/content-explorer.d.ts +85 -0
  228. package/dist/patterns/content-explorer/content-explorer.js +745 -0
  229. package/dist/patterns/content-explorer/contracts.d.ts +32 -0
  230. package/dist/patterns/content-explorer/contracts.js +114 -0
  231. package/dist/patterns/content-explorer/controller.d.ts +34 -0
  232. package/dist/patterns/content-explorer/controller.js +399 -0
  233. package/dist/patterns/content-explorer/host-bindings.d.ts +50 -0
  234. package/dist/patterns/content-explorer/host-bindings.js +76 -0
  235. package/dist/patterns/content-explorer/index.d.ts +18 -0
  236. package/dist/patterns/content-explorer/index.js +24 -0
  237. package/dist/patterns/content-explorer/navigation/controller.d.ts +10 -0
  238. package/dist/patterns/content-explorer/navigation/controller.js +48 -0
  239. package/dist/patterns/content-explorer/navigation/index.d.ts +2 -0
  240. package/dist/patterns/content-explorer/navigation/index.js +1 -0
  241. package/dist/patterns/content-explorer/navigation/types.d.ts +20 -0
  242. package/dist/patterns/content-explorer/navigation/types.js +1 -0
  243. package/dist/patterns/content-explorer/schemas.d.ts +6 -0
  244. package/dist/patterns/content-explorer/schemas.js +120 -0
  245. package/dist/patterns/content-explorer/selection/controller.d.ts +12 -0
  246. package/dist/patterns/content-explorer/selection/controller.js +54 -0
  247. package/dist/patterns/content-explorer/selection/index.d.ts +2 -0
  248. package/dist/patterns/content-explorer/selection/index.js +1 -0
  249. package/dist/patterns/content-explorer/selection/types.d.ts +14 -0
  250. package/dist/patterns/content-explorer/selection/types.js +1 -0
  251. package/dist/patterns/content-explorer/types.d.ts +209 -0
  252. package/dist/patterns/content-explorer/types.js +10 -0
  253. package/dist/patterns/file-request/file-request-builder.d.ts +36 -0
  254. package/dist/patterns/file-request/file-request-builder.js +344 -0
  255. package/dist/patterns/file-request/index.d.ts +1 -0
  256. package/dist/patterns/file-request/index.js +1 -0
  257. package/dist/patterns/governance/governance-panel.d.ts +40 -0
  258. package/dist/patterns/governance/governance-panel.js +351 -0
  259. package/dist/patterns/governance/index.d.ts +1 -0
  260. package/dist/patterns/governance/index.js +1 -0
  261. package/dist/patterns/insights/bar-chart.d.ts +43 -0
  262. package/dist/patterns/insights/bar-chart.js +462 -0
  263. package/dist/patterns/insights/chart-panel.d.ts +43 -0
  264. package/dist/patterns/insights/chart-panel.js +436 -0
  265. package/dist/patterns/insights/donut-chart.d.ts +43 -0
  266. package/dist/patterns/insights/donut-chart.js +535 -0
  267. package/dist/patterns/insights/index.d.ts +5 -0
  268. package/dist/patterns/insights/index.js +5 -0
  269. package/dist/patterns/insights/line-chart.d.ts +46 -0
  270. package/dist/patterns/insights/line-chart.js +511 -0
  271. package/dist/patterns/insights/metric-card.d.ts +36 -0
  272. package/dist/patterns/insights/metric-card.js +278 -0
  273. package/dist/patterns/item/bulk-action-bar.d.ts +35 -0
  274. package/dist/patterns/item/bulk-action-bar.js +325 -0
  275. package/dist/patterns/item/index.d.ts +4 -0
  276. package/dist/patterns/item/index.js +4 -0
  277. package/dist/patterns/item/item-details-panel.d.ts +61 -0
  278. package/dist/patterns/item/item-details-panel.js +429 -0
  279. package/dist/patterns/item/item-form.d.ts +54 -0
  280. package/dist/patterns/item/item-form.js +485 -0
  281. package/dist/patterns/item/preview-header.d.ts +46 -0
  282. package/dist/patterns/item/preview-header.js +323 -0
  283. package/dist/patterns/metadata/contracts.d.ts +75 -0
  284. package/dist/patterns/metadata/contracts.js +91 -0
  285. package/dist/patterns/metadata/index.d.ts +4 -0
  286. package/dist/patterns/metadata/index.js +4 -0
  287. package/dist/patterns/metadata/metadata-filter-builder.d.ts +43 -0
  288. package/dist/patterns/metadata/metadata-filter-builder.js +362 -0
  289. package/dist/patterns/metadata/metadata-inspector.d.ts +31 -0
  290. package/dist/patterns/metadata/metadata-inspector.js +245 -0
  291. package/dist/patterns/metadata/schemas.d.ts +5 -0
  292. package/dist/patterns/metadata/schemas.js +66 -0
  293. package/dist/patterns/preview/annotation-inspector.d.ts +44 -0
  294. package/dist/patterns/preview/annotation-inspector.js +380 -0
  295. package/dist/patterns/preview/annotation-thread.d.ts +37 -0
  296. package/dist/patterns/preview/annotation-thread.js +338 -0
  297. package/dist/patterns/preview/annotation-toolbar.d.ts +42 -0
  298. package/dist/patterns/preview/annotation-toolbar.js +393 -0
  299. package/dist/patterns/preview/content-preview-adapter.d.ts +13 -0
  300. package/dist/patterns/preview/content-preview-adapter.js +30 -0
  301. package/dist/patterns/preview/index.d.ts +6 -0
  302. package/dist/patterns/preview/index.js +6 -0
  303. package/dist/patterns/preview/preview-element.d.ts +41 -0
  304. package/dist/patterns/preview/preview-element.js +429 -0
  305. package/dist/patterns/preview/provider-adapter.d.ts +36 -0
  306. package/dist/patterns/preview/provider-adapter.js +29 -0
  307. package/dist/patterns/search/filter-bar.d.ts +50 -0
  308. package/dist/patterns/search/filter-bar.js +379 -0
  309. package/dist/patterns/search/index.d.ts +3 -0
  310. package/dist/patterns/search/index.js +3 -0
  311. package/dist/patterns/search/saved-view-picker.d.ts +25 -0
  312. package/dist/patterns/search/saved-view-picker.js +239 -0
  313. package/dist/patterns/search/search-results-header.d.ts +34 -0
  314. package/dist/patterns/search/search-results-header.js +288 -0
  315. package/dist/patterns/share/access-stats.d.ts +19 -0
  316. package/dist/patterns/share/access-stats.js +204 -0
  317. package/dist/patterns/share/collaborator-avatars.d.ts +22 -0
  318. package/dist/patterns/share/collaborator-avatars.js +214 -0
  319. package/dist/patterns/share/contracts.d.ts +65 -0
  320. package/dist/patterns/share/contracts.js +75 -0
  321. package/dist/patterns/share/index.d.ts +14 -0
  322. package/dist/patterns/share/index.js +14 -0
  323. package/dist/patterns/share/invite-collaborators-contracts.d.ts +38 -0
  324. package/dist/patterns/share/invite-collaborators-contracts.js +1 -0
  325. package/dist/patterns/share/invite-collaborators-controller.d.ts +40 -0
  326. package/dist/patterns/share/invite-collaborators-controller.js +86 -0
  327. package/dist/patterns/share/invite-collaborators-modal.d.ts +46 -0
  328. package/dist/patterns/share/invite-collaborators-modal.js +465 -0
  329. package/dist/patterns/share/permission-matrix.d.ts +37 -0
  330. package/dist/patterns/share/permission-matrix.js +360 -0
  331. package/dist/patterns/share/presence-contracts.d.ts +26 -0
  332. package/dist/patterns/share/presence-contracts.js +1 -0
  333. package/dist/patterns/share/presence-controller.d.ts +31 -0
  334. package/dist/patterns/share/presence-controller.js +47 -0
  335. package/dist/patterns/share/presence.d.ts +32 -0
  336. package/dist/patterns/share/presence.js +255 -0
  337. package/dist/patterns/share/schemas.d.ts +4 -0
  338. package/dist/patterns/share/schemas.js +41 -0
  339. package/dist/patterns/share/share-panel.d.ts +75 -0
  340. package/dist/patterns/share/share-panel.js +565 -0
  341. package/dist/patterns/share/unified-share-controller.d.ts +52 -0
  342. package/dist/patterns/share/unified-share-controller.js +97 -0
  343. package/dist/patterns/share/unified-share-modal.d.ts +50 -0
  344. package/dist/patterns/share/unified-share-modal.js +646 -0
  345. package/dist/patterns/task/index.d.ts +2 -0
  346. package/dist/patterns/task/index.js +2 -0
  347. package/dist/patterns/task/review-queue-item.d.ts +45 -0
  348. package/dist/patterns/task/review-queue-item.js +403 -0
  349. package/dist/patterns/task/task-assignment-panel.d.ts +50 -0
  350. package/dist/patterns/task/task-assignment-panel.js +450 -0
  351. package/package.json +151 -0
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Host-level wiring between search chrome (filter bar / saved views) and an
3
+ * explorer surface that exposes search / clearSearch. Keeps transport and
4
+ * recents out of these helpers — hosts own presets and presentation mode.
5
+ */
6
+ const readFilterBarDetail = (event) => {
7
+ const detail = event.detail;
8
+ const value = detail?.value;
9
+ if (!value || typeof value !== "object") {
10
+ return null;
11
+ }
12
+ return {
13
+ filters: Array.isArray(value.filters) ? value.filters : [],
14
+ query: typeof value.query === "string" ? value.query : "",
15
+ sort: typeof value.sort === "string" ? value.sort : "",
16
+ view: typeof value.view === "string" ? value.view : "",
17
+ };
18
+ };
19
+ const runExplorerSearch = (explorer, query, onError) => {
20
+ const result = query ? explorer.search(query) : explorer.clearSearch();
21
+ void Promise.resolve(result).catch(error => {
22
+ onError?.(error);
23
+ });
24
+ };
25
+ /**
26
+ * Wire `box-filter-bar` search → explorer search/clearSearch.
27
+ * Returns an unsubscribe function.
28
+ */
29
+ export const bindFilterBarToExplorer = (filterBar, explorer, options = {}) => {
30
+ let lastView;
31
+ const onSearch = (event) => {
32
+ // filter-bar emits `search` with `detail.value` = FilterBarState
33
+ const detail = event.detail;
34
+ const fromState = detail?.value?.query;
35
+ const query = (typeof fromState === "string" ? fromState : detail?.query ?? filterBar.query ?? "").trim();
36
+ runExplorerSearch(explorer, query, options.onError);
37
+ };
38
+ const onValueChanged = (event) => {
39
+ const state = readFilterBarDetail(event);
40
+ if (!state) {
41
+ return;
42
+ }
43
+ options.onValueChange?.(state);
44
+ if (state.view !== lastView) {
45
+ lastView = state.view;
46
+ options.onViewChange?.(state.view, state);
47
+ }
48
+ };
49
+ filterBar.addEventListener("search", onSearch);
50
+ filterBar.addEventListener("value-changed", onValueChanged);
51
+ return () => {
52
+ filterBar.removeEventListener("search", onSearch);
53
+ filterBar.removeEventListener("value-changed", onValueChanged);
54
+ };
55
+ };
56
+ /**
57
+ * Wire `box-saved-view-picker` → explorer search using host-owned presets.
58
+ */
59
+ export const bindSavedViewPickerToExplorer = (picker, explorer, options) => {
60
+ const onValueChanged = (event) => {
61
+ const viewId = event.detail?.value;
62
+ if (!viewId) {
63
+ return;
64
+ }
65
+ const preset = options.resolvePreset(viewId);
66
+ if (!preset) {
67
+ return;
68
+ }
69
+ const query = (preset.query ?? "").trim();
70
+ runExplorerSearch(explorer, query, options.onError);
71
+ };
72
+ picker.addEventListener("value-changed", onValueChanged);
73
+ return () => {
74
+ picker.removeEventListener("value-changed", onValueChanged);
75
+ };
76
+ };
@@ -0,0 +1,18 @@
1
+ export * from "./types.js";
2
+ export * from "./collection/index.js";
3
+ export * from "./navigation/index.js";
4
+ export * from "./actions/index.js";
5
+ export * from "./selection/index.js";
6
+ export * from "./controller.js";
7
+ export * from "./contracts.js";
8
+ export * from "./box-transport.js";
9
+ export * from "./schemas.js";
10
+ export * from "./adapters/action-menu.js";
11
+ export * from "./adapters/toolbar.js";
12
+ export * from "./adapters/list.js";
13
+ export * from "./adapters/table.js";
14
+ export * from "./adapters/items.js";
15
+ export * from "./adapters/breadcrumbs.js";
16
+ export * from "./adapters/item-summary.js";
17
+ export * from "./content-explorer.js";
18
+ export * from "./host-bindings.js";
@@ -0,0 +1,24 @@
1
+ // Shared explorer contracts and state types
2
+ export * from "./types.js";
3
+ // Headless blocks
4
+ export * from "./collection/index.js";
5
+ export * from "./navigation/index.js";
6
+ export * from "./actions/index.js";
7
+ export * from "./selection/index.js";
8
+ // Composition root, data-source contracts, Box transport, wire schemas
9
+ export * from "./controller.js";
10
+ export * from "./contracts.js";
11
+ export * from "./box-transport.js";
12
+ export * from "./schemas.js";
13
+ // Presentation adapters
14
+ export * from "./adapters/action-menu.js";
15
+ export * from "./adapters/toolbar.js";
16
+ export * from "./adapters/list.js";
17
+ export * from "./adapters/table.js";
18
+ export * from "./adapters/items.js";
19
+ export * from "./adapters/breadcrumbs.js";
20
+ export * from "./adapters/item-summary.js";
21
+ // Composed workflow surface
22
+ export * from "./content-explorer.js";
23
+ // Host-level chrome bindings (filter-bar / saved-view → search)
24
+ export * from "./host-bindings.js";
@@ -0,0 +1,10 @@
1
+ import { Controller } from "../../../core/controller.js";
2
+ import type { ExplorerFolder, ExplorerTransportResult } from "../types.js";
3
+ import type { ExplorerNavigationControllerOptions, ExplorerNavigationEvents, ExplorerNavigationState } from "./types.js";
4
+ export declare class ExplorerNavigationController extends Controller<ExplorerNavigationState, ExplorerNavigationEvents> {
5
+ private readonly options;
6
+ constructor(options: ExplorerNavigationControllerOptions);
7
+ reset(): void;
8
+ navigateTo(folderId: string): ExplorerFolder | null;
9
+ applyLoadedFolder(result: ExplorerTransportResult): void;
10
+ }
@@ -0,0 +1,48 @@
1
+ import { Controller } from "../../../core/controller.js";
2
+ const createInitialState = (options) => ({
3
+ breadcrumbs: [],
4
+ currentFolder: null,
5
+ currentFolderId: options.rootFolderId,
6
+ });
7
+ export class ExplorerNavigationController extends Controller {
8
+ options;
9
+ constructor(options) {
10
+ super(createInitialState(options));
11
+ this.options = options;
12
+ }
13
+ reset() {
14
+ this.setState(createInitialState(this.options));
15
+ this.emit("breadcrumbsChanged", { breadcrumbs: this.state.breadcrumbs });
16
+ }
17
+ navigateTo(folderId) {
18
+ if (folderId === this.state.currentFolderId) {
19
+ return null;
20
+ }
21
+ const nextFolder = {
22
+ id: folderId,
23
+ name: folderId,
24
+ type: "folder",
25
+ };
26
+ const nextBreadcrumbs = [
27
+ ...this.state.breadcrumbs.filter(crumb => crumb.id !== folderId),
28
+ nextFolder,
29
+ ];
30
+ this.setState({
31
+ breadcrumbs: nextBreadcrumbs,
32
+ currentFolder: nextFolder,
33
+ currentFolderId: folderId,
34
+ });
35
+ this.emit("breadcrumbsChanged", { breadcrumbs: nextBreadcrumbs });
36
+ this.emit("folderChanged", { folder: nextFolder });
37
+ return nextFolder;
38
+ }
39
+ applyLoadedFolder(result) {
40
+ this.setState({
41
+ breadcrumbs: result.breadcrumbs,
42
+ currentFolder: result.folder,
43
+ currentFolderId: result.folderId,
44
+ });
45
+ this.emit("breadcrumbsChanged", { breadcrumbs: result.breadcrumbs });
46
+ this.emit("folderLoaded", { folder: result.folder });
47
+ }
48
+ }
@@ -0,0 +1,2 @@
1
+ export { ExplorerNavigationController } from "./controller.js";
2
+ export type { ExplorerNavigationControllerOptions, ExplorerNavigationEvents, ExplorerNavigationState, } from "./types.js";
@@ -0,0 +1 @@
1
+ export { ExplorerNavigationController } from "./controller.js";
@@ -0,0 +1,20 @@
1
+ import type { ExplorerBreadcrumb, ExplorerFolder } from "../types.js";
2
+ export interface ExplorerNavigationControllerOptions {
3
+ rootFolderId: string;
4
+ }
5
+ export interface ExplorerNavigationState {
6
+ breadcrumbs: ExplorerBreadcrumb[];
7
+ currentFolder: ExplorerFolder | null;
8
+ currentFolderId: string;
9
+ }
10
+ export interface ExplorerNavigationEvents {
11
+ breadcrumbsChanged: {
12
+ breadcrumbs: ExplorerBreadcrumb[];
13
+ };
14
+ folderChanged: {
15
+ folder: ExplorerFolder;
16
+ };
17
+ folderLoaded: {
18
+ folder: ExplorerFolder;
19
+ };
20
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,6 @@
1
+ import type { JsonSchema } from "../../core/json-schema.js";
2
+ export declare const explorerItemSchema: JsonSchema;
3
+ export declare const explorerFolderSchema: JsonSchema;
4
+ export declare const explorerPaginationSchema: JsonSchema;
5
+ export declare const explorerTransportResultSchema: JsonSchema;
6
+ export declare const explorerSearchResultSchema: JsonSchema;
@@ -0,0 +1,120 @@
1
+ export const explorerItemSchema = {
2
+ type: "object",
3
+ additionalProperties: false,
4
+ required: ["id", "name", "type"],
5
+ properties: {
6
+ id: { type: "string" },
7
+ name: { type: "string" },
8
+ type: { enum: ["file", "folder", "web_link"] },
9
+ size: { type: ["number", "null"] },
10
+ modifiedAt: { type: ["string", "null"] },
11
+ createdAt: { type: ["string", "null"] },
12
+ extension: { type: ["string", "null"] },
13
+ owner: {
14
+ type: ["object", "null"],
15
+ additionalProperties: false,
16
+ required: ["id", "name"],
17
+ properties: {
18
+ id: { type: "string" },
19
+ name: { type: "string" },
20
+ type: { enum: ["user", "group"] },
21
+ },
22
+ },
23
+ permissions: {
24
+ type: "object",
25
+ additionalProperties: false,
26
+ properties: {
27
+ canDownload: { type: "boolean" },
28
+ canPreview: { type: "boolean" },
29
+ canShare: { type: "boolean" },
30
+ canDelete: { type: "boolean" },
31
+ canRename: { type: "boolean" },
32
+ canUpload: { type: "boolean" },
33
+ },
34
+ },
35
+ sharedLink: {
36
+ type: ["object", "null"],
37
+ additionalProperties: false,
38
+ required: ["isShared"],
39
+ properties: {
40
+ isShared: { type: "boolean" },
41
+ access: { enum: ["open", "company", "collaborators"] },
42
+ url: { type: "string" },
43
+ },
44
+ },
45
+ preview: {
46
+ type: "object",
47
+ additionalProperties: false,
48
+ properties: {
49
+ canPreview: { type: "boolean" },
50
+ extension: { type: ["string", "null"] },
51
+ mimeType: { type: ["string", "null"] },
52
+ },
53
+ },
54
+ parent: {
55
+ type: ["object", "null"],
56
+ additionalProperties: false,
57
+ required: ["id"],
58
+ properties: {
59
+ id: { type: "string" },
60
+ name: { type: "string" },
61
+ },
62
+ },
63
+ },
64
+ };
65
+ export const explorerFolderSchema = {
66
+ type: "object",
67
+ additionalProperties: false,
68
+ required: ["id", "name", "type"],
69
+ properties: {
70
+ id: { type: "string" },
71
+ name: { type: "string" },
72
+ type: { const: "folder" },
73
+ },
74
+ };
75
+ export const explorerPaginationSchema = {
76
+ type: "object",
77
+ additionalProperties: false,
78
+ required: ["hasMoreItems", "limit", "offset", "totalCount"],
79
+ properties: {
80
+ hasMoreItems: { type: "boolean" },
81
+ limit: { type: "number" },
82
+ offset: { type: "number" },
83
+ totalCount: { type: ["number", "null"] },
84
+ nextOffset: { type: "number" },
85
+ },
86
+ };
87
+ export const explorerTransportResultSchema = {
88
+ $id: "box-open-elements/patterns/content-explorer/ExplorerTransportResult",
89
+ type: "object",
90
+ additionalProperties: false,
91
+ required: ["breadcrumbs", "folder", "folderId", "items", "pagination"],
92
+ properties: {
93
+ breadcrumbs: {
94
+ type: "array",
95
+ items: explorerFolderSchema,
96
+ },
97
+ folder: explorerFolderSchema,
98
+ folderId: { type: "string" },
99
+ items: {
100
+ type: "array",
101
+ items: explorerItemSchema,
102
+ },
103
+ pagination: explorerPaginationSchema,
104
+ },
105
+ };
106
+ export const explorerSearchResultSchema = {
107
+ $id: "box-open-elements/patterns/content-explorer/ExplorerSearchResult",
108
+ type: "object",
109
+ additionalProperties: false,
110
+ required: ["query", "items", "pagination"],
111
+ properties: {
112
+ query: { type: "string" },
113
+ ancestorFolderId: { type: "string" },
114
+ items: {
115
+ type: "array",
116
+ items: explorerItemSchema,
117
+ },
118
+ pagination: explorerPaginationSchema,
119
+ },
120
+ };
@@ -0,0 +1,12 @@
1
+ import { Controller } from "../../../core/controller.js";
2
+ import type { ExplorerSelectableItem, ExplorerSelectionControllerOptions, ExplorerSelectionEvents, ExplorerSelectionState } from "./types.js";
3
+ export declare class ExplorerSelectionController extends Controller<ExplorerSelectionState, ExplorerSelectionEvents> {
4
+ private availableItemIds;
5
+ constructor(options?: ExplorerSelectionControllerOptions);
6
+ setItems(items: ExplorerSelectableItem[]): void;
7
+ select(itemIds: string[]): void;
8
+ toggleSelection(itemId: string): void;
9
+ clearSelection(): void;
10
+ private filterValidIds;
11
+ private applySelectionMode;
12
+ }
@@ -0,0 +1,54 @@
1
+ import { Controller } from "../../../core/controller.js";
2
+ const createInitialState = (options) => ({
3
+ selectedItemIds: [],
4
+ selectionMode: options.selectionMode ?? "multiple",
5
+ });
6
+ export class ExplorerSelectionController extends Controller {
7
+ availableItemIds = new Set();
8
+ constructor(options = {}) {
9
+ super(createInitialState(options));
10
+ }
11
+ setItems(items) {
12
+ this.availableItemIds = new Set(items.map(item => item.id));
13
+ const selectedItemIds = this.filterValidIds(this.state.selectedItemIds);
14
+ this.setState({
15
+ ...this.state,
16
+ selectedItemIds,
17
+ });
18
+ this.emit("selectionChanged", { selectedItemIds });
19
+ }
20
+ select(itemIds) {
21
+ const selectedItemIds = this.applySelectionMode(this.filterValidIds(itemIds));
22
+ this.setState({
23
+ ...this.state,
24
+ selectedItemIds,
25
+ });
26
+ this.emit("selectionChanged", { selectedItemIds });
27
+ }
28
+ toggleSelection(itemId) {
29
+ if (!this.availableItemIds.has(itemId)) {
30
+ return;
31
+ }
32
+ const existing = new Set(this.state.selectedItemIds);
33
+ if (existing.has(itemId)) {
34
+ existing.delete(itemId);
35
+ }
36
+ else if (this.state.selectionMode === "single") {
37
+ existing.clear();
38
+ existing.add(itemId);
39
+ }
40
+ else {
41
+ existing.add(itemId);
42
+ }
43
+ this.select([...existing]);
44
+ }
45
+ clearSelection() {
46
+ this.select([]);
47
+ }
48
+ filterValidIds(itemIds) {
49
+ return itemIds.filter(itemId => this.availableItemIds.has(itemId));
50
+ }
51
+ applySelectionMode(itemIds) {
52
+ return this.state.selectionMode === "single" ? itemIds.slice(0, 1) : itemIds;
53
+ }
54
+ }
@@ -0,0 +1,2 @@
1
+ export { ExplorerSelectionController } from "./controller.js";
2
+ export type { ExplorerSelectableItem, ExplorerSelectionControllerOptions, ExplorerSelectionEvents, ExplorerSelectionState, } from "./types.js";
@@ -0,0 +1 @@
1
+ export { ExplorerSelectionController } from "./controller.js";
@@ -0,0 +1,14 @@
1
+ import type { ExplorerItem, ExplorerSelectionMode } from "../types.js";
2
+ export interface ExplorerSelectionControllerOptions {
3
+ selectionMode?: ExplorerSelectionMode;
4
+ }
5
+ export interface ExplorerSelectionState {
6
+ selectedItemIds: string[];
7
+ selectionMode: ExplorerSelectionMode;
8
+ }
9
+ export interface ExplorerSelectionEvents {
10
+ selectionChanged: {
11
+ selectedItemIds: string[];
12
+ };
13
+ }
14
+ export type ExplorerSelectableItem = Pick<ExplorerItem, "id">;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,209 @@
1
+ export interface ExplorerItemPermissions {
2
+ canDownload?: boolean;
3
+ canPreview?: boolean;
4
+ canShare?: boolean;
5
+ canDelete?: boolean;
6
+ canRename?: boolean;
7
+ canUpload?: boolean;
8
+ }
9
+ export interface ExplorerItemOwner {
10
+ id: string;
11
+ name: string;
12
+ type?: "user" | "group";
13
+ }
14
+ /** Lightweight list-row signal; full share state stays in patterns/share. */
15
+ export interface ExplorerItemSharedLinkSummary {
16
+ isShared: boolean;
17
+ access?: "open" | "company" | "collaborators";
18
+ url?: string;
19
+ }
20
+ export interface ExplorerItemPreviewAffordance {
21
+ canPreview?: boolean;
22
+ extension?: string | null;
23
+ mimeType?: string | null;
24
+ }
25
+ export interface ExplorerItem {
26
+ id: string;
27
+ name: string;
28
+ type: "file" | "folder" | "web_link";
29
+ size?: number | null;
30
+ modifiedAt?: string | null;
31
+ createdAt?: string | null;
32
+ extension?: string | null;
33
+ owner?: ExplorerItemOwner | null;
34
+ permissions?: ExplorerItemPermissions;
35
+ sharedLink?: ExplorerItemSharedLinkSummary | null;
36
+ preview?: ExplorerItemPreviewAffordance;
37
+ /** Useful in search results; omit in folder listing when redundant. */
38
+ parent?: {
39
+ id: string;
40
+ name?: string;
41
+ } | null;
42
+ }
43
+ export type ExplorerSelectionMode = "multiple" | "single";
44
+ /**
45
+ * Presentation gesture mapping for explorer item rows:
46
+ * - `split` (default): click/Space select; Enter/dblclick activate
47
+ * - `legacy`: click/Enter/Space both select and activate
48
+ */
49
+ export type ExplorerItemGesture = "split" | "legacy";
50
+ export declare const resolveExplorerItemGesture: (value: string | null | undefined) => ExplorerItemGesture;
51
+ /** Legacy click/Space also activates; split mode selects only. */
52
+ export declare const shouldActivateOnClick: (gesture: ExplorerItemGesture) => boolean;
53
+ /** Legacy Enter also toggles selection before activate; split mode activates only. */
54
+ export declare const shouldToggleOnEnter: (gesture: ExplorerItemGesture) => boolean;
55
+ export type ExplorerViewMode = "folder" | "search";
56
+ export interface ExplorerViewState {
57
+ mode: ExplorerViewMode;
58
+ /** Non-null when mode === "search". */
59
+ searchQuery: string | null;
60
+ /** Folder scope for search; defaults to current folder when entering search. */
61
+ searchAncestorFolderId: string | null;
62
+ }
63
+ export declare const createInitialExplorerViewState: () => ExplorerViewState;
64
+ export interface ExplorerItemAction {
65
+ id: string;
66
+ itemTypes?: ExplorerItem["type"][];
67
+ label: string;
68
+ }
69
+ export interface ExplorerFolder {
70
+ id: string;
71
+ name: string;
72
+ type: "folder";
73
+ }
74
+ export interface ExplorerBreadcrumb {
75
+ id: string;
76
+ name: string;
77
+ type: "folder";
78
+ }
79
+ export interface ExplorerItemCollection {
80
+ entries: ExplorerItem[];
81
+ }
82
+ export interface ExplorerTransportRequest {
83
+ folderId: string;
84
+ limit?: number;
85
+ offset?: number;
86
+ token: string;
87
+ language?: string;
88
+ signal?: AbortSignal;
89
+ }
90
+ export interface ExplorerSearchRequest {
91
+ query: string;
92
+ ancestorFolderId?: string;
93
+ limit?: number;
94
+ offset?: number;
95
+ token: string;
96
+ language?: string;
97
+ signal?: AbortSignal;
98
+ }
99
+ export interface ExplorerPaginationState {
100
+ hasMoreItems: boolean;
101
+ limit: number;
102
+ offset: number;
103
+ totalCount: number | null;
104
+ /**
105
+ * Upstream cursor for the next page when client-side filtering shrinks `items`
106
+ * (e.g. unsupported Box entry types). Controllers should prefer this over
107
+ * `items.length` when requesting the next page.
108
+ */
109
+ nextOffset?: number;
110
+ }
111
+ export interface ExplorerTransportResult {
112
+ breadcrumbs: ExplorerBreadcrumb[];
113
+ folder: ExplorerFolder;
114
+ folderId: string;
115
+ items: ExplorerItem[];
116
+ pagination: ExplorerPaginationState;
117
+ }
118
+ export interface ExplorerSearchResult {
119
+ query: string;
120
+ ancestorFolderId?: string;
121
+ items: ExplorerItem[];
122
+ pagination: ExplorerPaginationState;
123
+ }
124
+ export interface ExplorerTransport {
125
+ loadFolderItems(request: ExplorerTransportRequest): Promise<ExplorerTransportResult>;
126
+ searchItems?(request: ExplorerSearchRequest): Promise<ExplorerSearchResult>;
127
+ }
128
+ export interface ExplorerFetchLike {
129
+ (input: string | URL | Request, init?: RequestInit): Promise<Response>;
130
+ }
131
+ export interface ExplorerSessionConfig {
132
+ container?: Element | null;
133
+ itemActions?: ExplorerItemAction[];
134
+ rootFolderId: string;
135
+ selectionMode?: ExplorerSelectionMode;
136
+ token: string;
137
+ language?: string;
138
+ pageSize?: number;
139
+ transport: ExplorerTransport;
140
+ }
141
+ export interface ExplorerErrorState {
142
+ code: "load_failed";
143
+ message: string;
144
+ }
145
+ export interface ExplorerState {
146
+ availableActionsByItemId: Record<string, ExplorerItemAction[]>;
147
+ breadcrumbs: ExplorerBreadcrumb[];
148
+ connected: boolean;
149
+ currentFolder: ExplorerFolder | null;
150
+ currentFolderId: string;
151
+ error: ExplorerErrorState | null;
152
+ items: ExplorerItem[];
153
+ loading: boolean;
154
+ pagination: ExplorerPaginationState;
155
+ selectedItemIds: string[];
156
+ view: ExplorerViewState;
157
+ }
158
+ export interface ExplorerEvents {
159
+ breadcrumbsChanged: {
160
+ breadcrumbs: ExplorerBreadcrumb[];
161
+ };
162
+ connected: {
163
+ folderId: string;
164
+ };
165
+ disconnected: undefined;
166
+ folderChanged: {
167
+ folder: ExplorerFolder;
168
+ };
169
+ loadFailed: {
170
+ folderId: string;
171
+ message: string;
172
+ };
173
+ loadSucceeded: {
174
+ folder: ExplorerFolder;
175
+ folderId: string;
176
+ items: ExplorerItem[];
177
+ pagination: ExplorerPaginationState;
178
+ };
179
+ loadingChanged: {
180
+ loading: boolean;
181
+ };
182
+ folderLoaded: {
183
+ folder: ExplorerFolder;
184
+ };
185
+ itemActivated: {
186
+ item: ExplorerItem;
187
+ };
188
+ itemsChanged: {
189
+ items: ExplorerItem[];
190
+ };
191
+ itemActionInvoked: {
192
+ action: ExplorerItemAction;
193
+ item: ExplorerItem;
194
+ };
195
+ paginationChanged: {
196
+ pagination: ExplorerPaginationState;
197
+ };
198
+ selectionChanged: {
199
+ selectedItemIds: string[];
200
+ };
201
+ viewChanged: {
202
+ view: ExplorerViewState;
203
+ };
204
+ searchSucceeded: {
205
+ query: string;
206
+ items: ExplorerItem[];
207
+ pagination: ExplorerPaginationState;
208
+ };
209
+ }
@@ -0,0 +1,10 @@
1
+ export const resolveExplorerItemGesture = (value) => value === "legacy" ? "legacy" : "split";
2
+ /** Legacy click/Space also activates; split mode selects only. */
3
+ export const shouldActivateOnClick = (gesture) => gesture === "legacy";
4
+ /** Legacy Enter also toggles selection before activate; split mode activates only. */
5
+ export const shouldToggleOnEnter = (gesture) => gesture === "legacy";
6
+ export const createInitialExplorerViewState = () => ({
7
+ mode: "folder",
8
+ searchQuery: null,
9
+ searchAncestorFolderId: null,
10
+ });