snice 4.27.0 → 4.29.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 (624) hide show
  1. package/adapters/react/action-bar.d.ts +30 -0
  2. package/adapters/react/action-bar.d.ts.map +1 -0
  3. package/adapters/react/action-bar.js +24 -0
  4. package/adapters/react/action-bar.js.map +1 -0
  5. package/adapters/react/action-bar.tsx +38 -0
  6. package/adapters/react/binpack.d.ts +35 -0
  7. package/adapters/react/binpack.d.ts.map +1 -0
  8. package/adapters/react/binpack.js +24 -0
  9. package/adapters/react/binpack.js.map +1 -0
  10. package/adapters/react/binpack.tsx +43 -0
  11. package/adapters/react/components.d.ts +4 -0
  12. package/adapters/react/components.d.ts.map +1 -1
  13. package/adapters/react/components.js +2 -0
  14. package/adapters/react/components.js.map +1 -1
  15. package/adapters/react/components.ts +4 -0
  16. package/adapters/react/useRequestHandler.d.ts +56 -0
  17. package/adapters/react/useRequestHandler.js +103 -0
  18. package/adapters/react/useRequestHandler.js.map +1 -0
  19. package/dist/cdn/accordion/snice-accordion.js +1 -1
  20. package/dist/cdn/accordion/snice-accordion.min.js +1 -1
  21. package/dist/cdn/action-bar/README.md +27 -0
  22. package/dist/cdn/action-bar/snice-action-bar.js +249 -0
  23. package/dist/cdn/action-bar/snice-action-bar.js.map +1 -0
  24. package/dist/cdn/action-bar/snice-action-bar.min.js +12 -0
  25. package/dist/cdn/action-bar/snice-action-bar.min.js.map +1 -0
  26. package/dist/cdn/activity-feed/snice-activity-feed.js +1 -1
  27. package/dist/cdn/activity-feed/snice-activity-feed.min.js +1 -1
  28. package/dist/cdn/alert/snice-alert.js +1 -1
  29. package/dist/cdn/alert/snice-alert.min.js +1 -1
  30. package/dist/cdn/app-tiles/snice-app-tiles.js +1 -1
  31. package/dist/cdn/app-tiles/snice-app-tiles.min.js +1 -1
  32. package/dist/cdn/approval-flow/snice-approval-flow.js +1 -1
  33. package/dist/cdn/approval-flow/snice-approval-flow.min.js +1 -1
  34. package/dist/cdn/audio-recorder/snice-audio-recorder.js +1 -1
  35. package/dist/cdn/audio-recorder/snice-audio-recorder.min.js +1 -1
  36. package/dist/cdn/availability/snice-availability.js +1 -1
  37. package/dist/cdn/availability/snice-availability.min.js +1 -1
  38. package/dist/cdn/avatar/snice-avatar.js +1 -1
  39. package/dist/cdn/avatar/snice-avatar.min.js +1 -1
  40. package/dist/cdn/avatar-group/snice-avatar-group.js +1 -1
  41. package/dist/cdn/avatar-group/snice-avatar-group.min.js +1 -1
  42. package/dist/cdn/badge/snice-badge.js +2 -2
  43. package/dist/cdn/badge/snice-badge.js.map +1 -1
  44. package/dist/cdn/badge/snice-badge.min.js +2 -2
  45. package/dist/cdn/badge/snice-badge.min.js.map +1 -1
  46. package/dist/cdn/banner/snice-banner.js +1 -1
  47. package/dist/cdn/banner/snice-banner.min.js +1 -1
  48. package/dist/cdn/binpack/README.md +27 -0
  49. package/dist/cdn/binpack/snice-binpack.js +1037 -0
  50. package/dist/cdn/binpack/snice-binpack.js.map +1 -0
  51. package/dist/cdn/binpack/snice-binpack.min.js +13 -0
  52. package/dist/cdn/binpack/snice-binpack.min.js.map +1 -0
  53. package/dist/cdn/book/snice-book.js +1 -1
  54. package/dist/cdn/book/snice-book.min.js +1 -1
  55. package/dist/cdn/booking/snice-booking.js +1 -1
  56. package/dist/cdn/booking/snice-booking.min.js +1 -1
  57. package/dist/cdn/breadcrumbs/snice-breadcrumbs.js +1 -1
  58. package/dist/cdn/breadcrumbs/snice-breadcrumbs.min.js +1 -1
  59. package/dist/cdn/button/README.md +1 -1
  60. package/dist/cdn/button/snice-button.js +11 -10
  61. package/dist/cdn/button/snice-button.js.map +1 -1
  62. package/dist/cdn/button/snice-button.min.js +3 -3
  63. package/dist/cdn/button/snice-button.min.js.map +1 -1
  64. package/dist/cdn/calendar/snice-calendar.js +1 -1
  65. package/dist/cdn/calendar/snice-calendar.min.js +1 -1
  66. package/dist/cdn/camera/snice-camera.js +1 -1
  67. package/dist/cdn/camera/snice-camera.min.js +1 -1
  68. package/dist/cdn/camera-annotate/snice-camera-annotate.js +1 -1
  69. package/dist/cdn/camera-annotate/snice-camera-annotate.min.js +1 -1
  70. package/dist/cdn/candlestick/snice-candlestick.js +1 -1
  71. package/dist/cdn/candlestick/snice-candlestick.min.js +1 -1
  72. package/dist/cdn/card/snice-card.js +1 -1
  73. package/dist/cdn/card/snice-card.min.js +1 -1
  74. package/dist/cdn/carousel/snice-carousel.js +1 -1
  75. package/dist/cdn/carousel/snice-carousel.min.js +1 -1
  76. package/dist/cdn/cart/snice-cart.js +1 -1
  77. package/dist/cdn/cart/snice-cart.min.js +1 -1
  78. package/dist/cdn/chart/snice-chart.js +1 -1
  79. package/dist/cdn/chart/snice-chart.min.js +1 -1
  80. package/dist/cdn/chat/snice-chat.js +1 -1
  81. package/dist/cdn/chat/snice-chat.min.js +1 -1
  82. package/dist/cdn/checkbox/snice-checkbox.js +1 -1
  83. package/dist/cdn/checkbox/snice-checkbox.min.js +1 -1
  84. package/dist/cdn/chip/snice-chip.js +1 -1
  85. package/dist/cdn/chip/snice-chip.min.js +1 -1
  86. package/dist/cdn/code-block/snice-code-block.js +1 -1
  87. package/dist/cdn/code-block/snice-code-block.min.js +1 -1
  88. package/dist/cdn/color-display/snice-color-display.js +1 -1
  89. package/dist/cdn/color-display/snice-color-display.min.js +1 -1
  90. package/dist/cdn/color-picker/snice-color-picker.js +1 -1
  91. package/dist/cdn/color-picker/snice-color-picker.min.js +1 -1
  92. package/dist/cdn/command-palette/snice-command-palette.js +1 -1
  93. package/dist/cdn/command-palette/snice-command-palette.min.js +1 -1
  94. package/dist/cdn/comments/snice-comments.js +1 -1
  95. package/dist/cdn/comments/snice-comments.min.js +1 -1
  96. package/dist/cdn/countdown/snice-countdown.js +1 -1
  97. package/dist/cdn/countdown/snice-countdown.min.js +1 -1
  98. package/dist/cdn/cropper/snice-cropper.js +1 -1
  99. package/dist/cdn/cropper/snice-cropper.min.js +1 -1
  100. package/dist/cdn/data-card/snice-data-card.js +1 -1
  101. package/dist/cdn/data-card/snice-data-card.min.js +1 -1
  102. package/dist/cdn/date-picker/snice-date-picker.js +1 -1
  103. package/dist/cdn/date-picker/snice-date-picker.min.js +1 -1
  104. package/dist/cdn/date-range-picker/snice-date-range-picker.js +1 -1
  105. package/dist/cdn/date-range-picker/snice-date-range-picker.min.js +1 -1
  106. package/dist/cdn/date-time-picker/snice-date-time-picker.js +1 -1
  107. package/dist/cdn/date-time-picker/snice-date-time-picker.min.js +1 -1
  108. package/dist/cdn/diff/snice-diff.js +1 -1
  109. package/dist/cdn/diff/snice-diff.min.js +1 -1
  110. package/dist/cdn/divider/snice-divider.js +1 -1
  111. package/dist/cdn/divider/snice-divider.min.js +1 -1
  112. package/dist/cdn/doc/snice-doc.js +1 -1
  113. package/dist/cdn/doc/snice-doc.min.js +1 -1
  114. package/dist/cdn/draw/snice-draw.js +1 -1
  115. package/dist/cdn/draw/snice-draw.min.js +1 -1
  116. package/dist/cdn/drawer/snice-drawer.js +1 -1
  117. package/dist/cdn/drawer/snice-drawer.min.js +1 -1
  118. package/dist/cdn/empty-state/snice-empty-state.js +1 -1
  119. package/dist/cdn/empty-state/snice-empty-state.min.js +1 -1
  120. package/dist/cdn/estimate/snice-estimate.js +1 -1
  121. package/dist/cdn/estimate/snice-estimate.min.js +1 -1
  122. package/dist/cdn/file-gallery/snice-file-gallery.js +1 -1
  123. package/dist/cdn/file-gallery/snice-file-gallery.min.js +1 -1
  124. package/dist/cdn/file-upload/snice-file-upload.js +1 -1
  125. package/dist/cdn/file-upload/snice-file-upload.min.js +1 -1
  126. package/dist/cdn/flip-card/snice-flip-card.js +1 -1
  127. package/dist/cdn/flip-card/snice-flip-card.min.js +1 -1
  128. package/dist/cdn/flow/snice-flow.js +1 -1
  129. package/dist/cdn/flow/snice-flow.min.js +1 -1
  130. package/dist/cdn/form-layout/snice-form-layout.js +1 -1
  131. package/dist/cdn/form-layout/snice-form-layout.min.js +1 -1
  132. package/dist/cdn/funnel/snice-funnel.js +1 -1
  133. package/dist/cdn/funnel/snice-funnel.min.js +1 -1
  134. package/dist/cdn/gantt/snice-gantt.js +1 -1
  135. package/dist/cdn/gantt/snice-gantt.min.js +1 -1
  136. package/dist/cdn/gauge/snice-gauge.js +1 -1
  137. package/dist/cdn/gauge/snice-gauge.min.js +1 -1
  138. package/dist/cdn/heatmap/snice-heatmap.js +1 -1
  139. package/dist/cdn/heatmap/snice-heatmap.min.js +1 -1
  140. package/dist/cdn/image/snice-image.js +1 -1
  141. package/dist/cdn/image/snice-image.min.js +1 -1
  142. package/dist/cdn/input/snice-input.js +1 -1
  143. package/dist/cdn/input/snice-input.min.js +1 -1
  144. package/dist/cdn/invoice/snice-invoice.js +1 -1
  145. package/dist/cdn/invoice/snice-invoice.min.js +1 -1
  146. package/dist/cdn/kanban/snice-kanban.js +1 -1
  147. package/dist/cdn/kanban/snice-kanban.min.js +1 -1
  148. package/dist/cdn/key-value/snice-key-value.js +1 -1
  149. package/dist/cdn/key-value/snice-key-value.min.js +1 -1
  150. package/dist/cdn/kpi/snice-kpi.js +1 -1
  151. package/dist/cdn/kpi/snice-kpi.min.js +1 -1
  152. package/dist/cdn/layout/snice-layout.js +1 -1
  153. package/dist/cdn/layout/snice-layout.min.js +1 -1
  154. package/dist/cdn/leaderboard/snice-leaderboard.js +1 -1
  155. package/dist/cdn/leaderboard/snice-leaderboard.min.js +1 -1
  156. package/dist/cdn/link/snice-link.js +1 -1
  157. package/dist/cdn/link/snice-link.min.js +1 -1
  158. package/dist/cdn/link-preview/snice-link-preview.js +1 -1
  159. package/dist/cdn/link-preview/snice-link-preview.min.js +1 -1
  160. package/dist/cdn/list/snice-list.js +1 -1
  161. package/dist/cdn/list/snice-list.min.js +1 -1
  162. package/dist/cdn/location/snice-location.js +1 -1
  163. package/dist/cdn/location/snice-location.min.js +1 -1
  164. package/dist/cdn/login/README.md +2 -2
  165. package/dist/cdn/login/snice-login.js +11 -10
  166. package/dist/cdn/login/snice-login.js.map +1 -1
  167. package/dist/cdn/login/snice-login.min.js +5 -5
  168. package/dist/cdn/login/snice-login.min.js.map +1 -1
  169. package/dist/cdn/map/snice-map.js +1 -1
  170. package/dist/cdn/map/snice-map.min.js +1 -1
  171. package/dist/cdn/markdown/snice-markdown.js +1 -1
  172. package/dist/cdn/markdown/snice-markdown.min.js +1 -1
  173. package/dist/cdn/masonry/snice-masonry.js +1 -1
  174. package/dist/cdn/masonry/snice-masonry.min.js +1 -1
  175. package/dist/cdn/menu/snice-menu.js +1 -1
  176. package/dist/cdn/menu/snice-menu.min.js +1 -1
  177. package/dist/cdn/message-strip/snice-message-strip.js +1 -1
  178. package/dist/cdn/message-strip/snice-message-strip.min.js +1 -1
  179. package/dist/cdn/metric-table/snice-metric-table.js +1 -1
  180. package/dist/cdn/metric-table/snice-metric-table.min.js +1 -1
  181. package/dist/cdn/modal/snice-modal.js +1 -1
  182. package/dist/cdn/modal/snice-modal.min.js +1 -1
  183. package/dist/cdn/music-player/snice-music-player.js +1 -1
  184. package/dist/cdn/music-player/snice-music-player.min.js +1 -1
  185. package/dist/cdn/nav/snice-nav.js +1 -1
  186. package/dist/cdn/nav/snice-nav.min.js +1 -1
  187. package/dist/cdn/network-graph/snice-network-graph.js +1 -1
  188. package/dist/cdn/network-graph/snice-network-graph.min.js +1 -1
  189. package/dist/cdn/notification-center/snice-notification-center.js +1 -1
  190. package/dist/cdn/notification-center/snice-notification-center.min.js +1 -1
  191. package/dist/cdn/order-tracker/snice-order-tracker.js +1 -1
  192. package/dist/cdn/order-tracker/snice-order-tracker.min.js +1 -1
  193. package/dist/cdn/org-chart/snice-org-chart.js +1 -1
  194. package/dist/cdn/org-chart/snice-org-chart.min.js +1 -1
  195. package/dist/cdn/pagination/snice-pagination.js +1 -1
  196. package/dist/cdn/pagination/snice-pagination.min.js +1 -1
  197. package/dist/cdn/paint/snice-paint.js +1 -1
  198. package/dist/cdn/paint/snice-paint.min.js +1 -1
  199. package/dist/cdn/pdf-viewer/snice-pdf-viewer.js +1 -1
  200. package/dist/cdn/pdf-viewer/snice-pdf-viewer.min.js +1 -1
  201. package/dist/cdn/permission-matrix/snice-permission-matrix.js +1 -1
  202. package/dist/cdn/permission-matrix/snice-permission-matrix.min.js +1 -1
  203. package/dist/cdn/podcast-player/snice-podcast-player.js +1 -1
  204. package/dist/cdn/podcast-player/snice-podcast-player.min.js +1 -1
  205. package/dist/cdn/pricing-table/snice-pricing-table.js +1 -1
  206. package/dist/cdn/pricing-table/snice-pricing-table.min.js +1 -1
  207. package/dist/cdn/product-card/snice-product-card.js +1 -1
  208. package/dist/cdn/product-card/snice-product-card.min.js +1 -1
  209. package/dist/cdn/progress/snice-progress.js +1 -1
  210. package/dist/cdn/progress/snice-progress.min.js +1 -1
  211. package/dist/cdn/progress-ring/snice-progress-ring.js +1 -1
  212. package/dist/cdn/progress-ring/snice-progress-ring.min.js +1 -1
  213. package/dist/cdn/qr-code/snice-qr-code.js +1 -1
  214. package/dist/cdn/qr-code/snice-qr-code.min.js +1 -1
  215. package/dist/cdn/qr-reader/snice-qr-reader.js +1 -1
  216. package/dist/cdn/qr-reader/snice-qr-reader.min.js +1 -1
  217. package/dist/cdn/radio/snice-radio.js +1 -1
  218. package/dist/cdn/radio/snice-radio.min.js +1 -1
  219. package/dist/cdn/range-slider/snice-range-slider.js +1 -1
  220. package/dist/cdn/range-slider/snice-range-slider.min.js +1 -1
  221. package/dist/cdn/rating/snice-rating.js +1 -1
  222. package/dist/cdn/rating/snice-rating.min.js +1 -1
  223. package/dist/cdn/receipt/snice-receipt.js +1 -1
  224. package/dist/cdn/receipt/snice-receipt.min.js +1 -1
  225. package/dist/cdn/recipe/snice-recipe.js +1 -1
  226. package/dist/cdn/recipe/snice-recipe.min.js +1 -1
  227. package/dist/cdn/runtime/README.md +2 -2
  228. package/dist/cdn/runtime/snice-runtime.esm.js +152 -62
  229. package/dist/cdn/runtime/snice-runtime.esm.js.map +1 -1
  230. package/dist/cdn/runtime/snice-runtime.esm.min.js +8 -8
  231. package/dist/cdn/runtime/snice-runtime.esm.min.js.map +1 -1
  232. package/dist/cdn/runtime/snice-runtime.js +152 -61
  233. package/dist/cdn/runtime/snice-runtime.js.map +1 -1
  234. package/dist/cdn/runtime/snice-runtime.min.js +8 -8
  235. package/dist/cdn/runtime/snice-runtime.min.js.map +1 -1
  236. package/dist/cdn/sankey/snice-sankey.js +1 -1
  237. package/dist/cdn/sankey/snice-sankey.min.js +1 -1
  238. package/dist/cdn/segmented-control/snice-segmented-control.js +1 -1
  239. package/dist/cdn/segmented-control/snice-segmented-control.min.js +1 -1
  240. package/dist/cdn/select/snice-select.js +1 -1
  241. package/dist/cdn/select/snice-select.min.js +1 -1
  242. package/dist/cdn/skeleton/snice-skeleton.js +1 -1
  243. package/dist/cdn/skeleton/snice-skeleton.min.js +1 -1
  244. package/dist/cdn/slider/snice-slider.js +1 -1
  245. package/dist/cdn/slider/snice-slider.min.js +1 -1
  246. package/dist/cdn/sortable/snice-sortable.js +1 -1
  247. package/dist/cdn/sortable/snice-sortable.min.js +1 -1
  248. package/dist/cdn/sparkline/snice-sparkline.js +1 -1
  249. package/dist/cdn/sparkline/snice-sparkline.min.js +1 -1
  250. package/dist/cdn/spinner/snice-spinner.js +1 -1
  251. package/dist/cdn/spinner/snice-spinner.min.js +1 -1
  252. package/dist/cdn/split-button/snice-split-button.js +1 -1
  253. package/dist/cdn/split-button/snice-split-button.min.js +1 -1
  254. package/dist/cdn/split-pane/snice-split-pane.js +1 -1
  255. package/dist/cdn/split-pane/snice-split-pane.min.js +1 -1
  256. package/dist/cdn/spotlight/snice-spotlight.js +1 -1
  257. package/dist/cdn/spotlight/snice-spotlight.min.js +1 -1
  258. package/dist/cdn/spreadsheet/snice-spreadsheet.js +1 -1
  259. package/dist/cdn/spreadsheet/snice-spreadsheet.min.js +1 -1
  260. package/dist/cdn/stat-group/snice-stat-group.js +1 -1
  261. package/dist/cdn/stat-group/snice-stat-group.min.js +1 -1
  262. package/dist/cdn/step-input/snice-step-input.js +1 -1
  263. package/dist/cdn/step-input/snice-step-input.min.js +1 -1
  264. package/dist/cdn/stepper/snice-stepper.js +1 -1
  265. package/dist/cdn/stepper/snice-stepper.min.js +1 -1
  266. package/dist/cdn/switch/snice-switch.js +1 -1
  267. package/dist/cdn/switch/snice-switch.min.js +1 -1
  268. package/dist/cdn/table/README.md +1 -1
  269. package/dist/cdn/table/snice-table.js +11 -10
  270. package/dist/cdn/table/snice-table.js.map +1 -1
  271. package/dist/cdn/table/snice-table.min.js +73 -73
  272. package/dist/cdn/table/snice-table.min.js.map +1 -1
  273. package/dist/cdn/tabs/snice-tabs.js +1 -1
  274. package/dist/cdn/tabs/snice-tabs.min.js +1 -1
  275. package/dist/cdn/tag/snice-tag.js +1 -1
  276. package/dist/cdn/tag/snice-tag.min.js +1 -1
  277. package/dist/cdn/tag-input/snice-tag-input.js +1 -1
  278. package/dist/cdn/tag-input/snice-tag-input.min.js +1 -1
  279. package/dist/cdn/terminal/snice-terminal.js +1 -1
  280. package/dist/cdn/terminal/snice-terminal.min.js +1 -1
  281. package/dist/cdn/testimonial/snice-testimonial.js +1 -1
  282. package/dist/cdn/testimonial/snice-testimonial.min.js +1 -1
  283. package/dist/cdn/textarea/snice-textarea.js +1 -1
  284. package/dist/cdn/textarea/snice-textarea.min.js +1 -1
  285. package/dist/cdn/time-picker/snice-time-picker.js +1 -1
  286. package/dist/cdn/time-picker/snice-time-picker.min.js +1 -1
  287. package/dist/cdn/time-range-picker/snice-time-range-picker.js +1 -1
  288. package/dist/cdn/time-range-picker/snice-time-range-picker.min.js +1 -1
  289. package/dist/cdn/timeline/snice-timeline.js +1 -1
  290. package/dist/cdn/timeline/snice-timeline.min.js +1 -1
  291. package/dist/cdn/timer/snice-timer.js +1 -1
  292. package/dist/cdn/timer/snice-timer.min.js +1 -1
  293. package/dist/cdn/toast/snice-toast.js +1 -1
  294. package/dist/cdn/toast/snice-toast.min.js +1 -1
  295. package/dist/cdn/tooltip/snice-tooltip.js +1 -1
  296. package/dist/cdn/tooltip/snice-tooltip.min.js +1 -1
  297. package/dist/cdn/tree/snice-tree.js +1 -1
  298. package/dist/cdn/tree/snice-tree.min.js +1 -1
  299. package/dist/cdn/treemap/snice-treemap.js +1 -1
  300. package/dist/cdn/treemap/snice-treemap.min.js +1 -1
  301. package/dist/cdn/user-card/snice-user-card.js +1 -1
  302. package/dist/cdn/user-card/snice-user-card.min.js +1 -1
  303. package/dist/cdn/video-player/snice-video-player.js +1 -1
  304. package/dist/cdn/video-player/snice-video-player.min.js +1 -1
  305. package/dist/cdn/virtual-scroller/snice-virtual-scroller.js +1 -1
  306. package/dist/cdn/virtual-scroller/snice-virtual-scroller.min.js +1 -1
  307. package/dist/cdn/waterfall/snice-waterfall.js +1 -1
  308. package/dist/cdn/waterfall/snice-waterfall.min.js +1 -1
  309. package/dist/cdn/weather/snice-weather.js +1 -1
  310. package/dist/cdn/weather/snice-weather.min.js +1 -1
  311. package/dist/cdn/work-order/snice-work-order.js +1 -1
  312. package/dist/cdn/work-order/snice-work-order.min.js +1 -1
  313. package/dist/components/action-bar/snice-action-bar.d.ts +22 -0
  314. package/dist/components/action-bar/snice-action-bar.js +182 -0
  315. package/dist/components/action-bar/snice-action-bar.js.map +1 -0
  316. package/dist/components/action-bar/snice-action-bar.types.d.ts +17 -0
  317. package/dist/components/badge/snice-badge.js +1 -1
  318. package/dist/components/badge/snice-badge.js.map +1 -1
  319. package/dist/components/binpack/snice-binpack.d.ts +82 -0
  320. package/dist/components/binpack/snice-binpack.js +970 -0
  321. package/dist/components/binpack/snice-binpack.js.map +1 -0
  322. package/dist/components/binpack/snice-binpack.types.d.ts +52 -0
  323. package/dist/components/button/snice-button.d.ts +2 -2
  324. package/dist/components/button/snice-button.js +11 -10
  325. package/dist/components/button/snice-button.js.map +1 -1
  326. package/dist/create-request-handler.d.ts +42 -0
  327. package/dist/index.cjs +149 -58
  328. package/dist/index.cjs.map +1 -1
  329. package/dist/index.d.ts +2 -0
  330. package/dist/index.esm.js +149 -59
  331. package/dist/index.esm.js.map +1 -1
  332. package/dist/index.iife.js +149 -58
  333. package/dist/index.iife.js.map +1 -1
  334. package/dist/parts.d.ts +9 -7
  335. package/dist/react/useRequestHandler.d.ts +56 -0
  336. package/dist/react/useRequestHandler.js +103 -0
  337. package/dist/react/useRequestHandler.js.map +1 -0
  338. package/dist/symbols.cjs +1 -1
  339. package/dist/symbols.esm.js +1 -1
  340. package/dist/transitions.cjs +1 -1
  341. package/dist/transitions.esm.js +1 -1
  342. package/docs/ai/DEVELOPMENT.md +1 -1
  343. package/docs/ai/components/accordion.md +46 -80
  344. package/docs/ai/components/action-bar.md +75 -0
  345. package/docs/ai/components/activity-feed.md +7 -7
  346. package/docs/ai/components/alert.md +26 -44
  347. package/docs/ai/components/app-tiles.md +34 -39
  348. package/docs/ai/components/approval-flow.md +1 -1
  349. package/docs/ai/components/audio-recorder.md +35 -67
  350. package/docs/ai/components/availability.md +13 -34
  351. package/docs/ai/components/avatar-group.md +26 -13
  352. package/docs/ai/components/avatar.md +52 -36
  353. package/docs/ai/components/badge.md +21 -32
  354. package/docs/ai/components/banner.md +21 -43
  355. package/docs/ai/components/binpack.md +89 -0
  356. package/docs/ai/components/book.md +25 -23
  357. package/docs/ai/components/booking.md +31 -36
  358. package/docs/ai/components/breadcrumbs.md +36 -11
  359. package/docs/ai/components/button.md +33 -44
  360. package/docs/ai/components/calendar.md +37 -70
  361. package/docs/ai/components/camera-annotate.md +31 -64
  362. package/docs/ai/components/camera.md +38 -120
  363. package/docs/ai/components/candlestick.md +32 -52
  364. package/docs/ai/components/card.md +20 -30
  365. package/docs/ai/components/carousel.md +32 -32
  366. package/docs/ai/components/cart.md +24 -29
  367. package/docs/ai/components/chart.md +29 -114
  368. package/docs/ai/components/chat.md +38 -75
  369. package/docs/ai/components/checkbox.md +22 -41
  370. package/docs/ai/components/chip.md +18 -54
  371. package/docs/ai/components/code-block.md +57 -178
  372. package/docs/ai/components/color-display.md +12 -32
  373. package/docs/ai/components/color-picker.md +17 -39
  374. package/docs/ai/components/command-palette.md +49 -71
  375. package/docs/ai/components/comments.md +55 -36
  376. package/docs/ai/components/countdown.md +28 -30
  377. package/docs/ai/components/cropper.md +33 -33
  378. package/docs/ai/components/data-card.md +20 -14
  379. package/docs/ai/components/date-picker.md +40 -47
  380. package/docs/ai/components/date-range-picker.md +31 -15
  381. package/docs/ai/components/date-time-picker.md +23 -46
  382. package/docs/ai/components/diff.md +30 -31
  383. package/docs/ai/components/divider.md +17 -47
  384. package/docs/ai/components/doc.md +43 -68
  385. package/docs/ai/components/draw.md +35 -87
  386. package/docs/ai/components/drawer.md +48 -77
  387. package/docs/ai/components/empty-state.md +10 -44
  388. package/docs/ai/components/estimate.md +33 -58
  389. package/docs/ai/components/file-gallery.md +48 -100
  390. package/docs/ai/components/file-upload.md +17 -53
  391. package/docs/ai/components/flip-card.md +31 -23
  392. package/docs/ai/components/flow.md +37 -65
  393. package/docs/ai/components/form-builder.md +35 -75
  394. package/docs/ai/components/form-layout.md +10 -20
  395. package/docs/ai/components/funnel.md +33 -48
  396. package/docs/ai/components/gantt.md +27 -23
  397. package/docs/ai/components/gauge.md +16 -17
  398. package/docs/ai/components/heatmap.md +21 -21
  399. package/docs/ai/components/image.md +7 -13
  400. package/docs/ai/components/input.md +38 -70
  401. package/docs/ai/components/invoice.md +35 -36
  402. package/docs/ai/components/kanban.md +32 -61
  403. package/docs/ai/components/key-value.md +32 -16
  404. package/docs/ai/components/kpi.md +38 -73
  405. package/docs/ai/components/layout.md +29 -23
  406. package/docs/ai/components/leaderboard.md +28 -37
  407. package/docs/ai/components/link-preview.md +12 -18
  408. package/docs/ai/components/link.md +10 -7
  409. package/docs/ai/components/list.md +21 -5
  410. package/docs/ai/components/location.md +21 -25
  411. package/docs/ai/components/login.md +14 -9
  412. package/docs/ai/components/map.md +27 -33
  413. package/docs/ai/components/markdown.md +20 -24
  414. package/docs/ai/components/masonry.md +10 -14
  415. package/docs/ai/components/mentions.md +26 -12
  416. package/docs/ai/components/menu.md +54 -52
  417. package/docs/ai/components/message-strip.md +20 -20
  418. package/docs/ai/components/metric-table.md +14 -21
  419. package/docs/ai/components/modal.md +27 -18
  420. package/docs/ai/components/music-player.md +49 -41
  421. package/docs/ai/components/nav.md +34 -31
  422. package/docs/ai/components/network-graph.md +27 -42
  423. package/docs/ai/components/notification-center.md +31 -33
  424. package/docs/ai/components/order-tracker.md +36 -27
  425. package/docs/ai/components/org-chart.md +36 -31
  426. package/docs/ai/components/pagination.md +34 -26
  427. package/docs/ai/components/paint.md +53 -91
  428. package/docs/ai/components/pdf-viewer.md +35 -36
  429. package/docs/ai/components/permission-matrix.md +26 -31
  430. package/docs/ai/components/podcast-player.md +64 -70
  431. package/docs/ai/components/pricing-table.md +37 -48
  432. package/docs/ai/components/product-card.md +58 -41
  433. package/docs/ai/components/progress-ring.md +20 -24
  434. package/docs/ai/components/progress.md +28 -45
  435. package/docs/ai/components/qr-code.md +25 -27
  436. package/docs/ai/components/qr-reader.md +20 -23
  437. package/docs/ai/components/radio.md +17 -15
  438. package/docs/ai/components/range-slider.md +22 -11
  439. package/docs/ai/components/rating.md +29 -33
  440. package/docs/ai/components/receipt.md +50 -127
  441. package/docs/ai/components/recipe.md +44 -42
  442. package/docs/ai/components/sankey.md +21 -30
  443. package/docs/ai/components/scheduler.md +29 -41
  444. package/docs/ai/components/segmented-control.md +11 -15
  445. package/docs/ai/components/select.md +58 -102
  446. package/docs/ai/components/skeleton.md +16 -30
  447. package/docs/ai/components/slider.md +26 -20
  448. package/docs/ai/components/sortable.md +25 -27
  449. package/docs/ai/components/sparkline.md +21 -17
  450. package/docs/ai/components/spinner.md +9 -5
  451. package/docs/ai/components/split-button.md +10 -13
  452. package/docs/ai/components/split-pane.md +19 -14
  453. package/docs/ai/components/spotlight.md +31 -26
  454. package/docs/ai/components/spreadsheet.md +51 -97
  455. package/docs/ai/components/stat-group.md +9 -19
  456. package/docs/ai/components/step-input.md +17 -15
  457. package/docs/ai/components/stepper.md +14 -15
  458. package/docs/ai/components/switch.md +15 -9
  459. package/docs/ai/components/table.md +24 -84
  460. package/docs/ai/components/tabs.md +18 -10
  461. package/docs/ai/components/tag-input.md +18 -29
  462. package/docs/ai/components/tag.md +10 -22
  463. package/docs/ai/components/terminal.md +9 -9
  464. package/docs/ai/components/testimonial.md +9 -19
  465. package/docs/ai/components/textarea.md +15 -16
  466. package/docs/ai/components/theme.md +3 -3
  467. package/docs/ai/components/time-picker.md +30 -49
  468. package/docs/ai/components/time-range-picker.md +16 -15
  469. package/docs/ai/components/timeline.md +5 -4
  470. package/docs/ai/components/timer.md +8 -8
  471. package/docs/ai/components/toast.md +24 -18
  472. package/docs/ai/components/tooltip.md +11 -22
  473. package/docs/ai/components/tree.md +9 -9
  474. package/docs/ai/components/treemap.md +14 -13
  475. package/docs/ai/components/user-card.md +21 -27
  476. package/docs/ai/components/video-player.md +35 -52
  477. package/docs/ai/components/virtual-scroller.md +1 -1
  478. package/docs/ai/components/waterfall.md +17 -16
  479. package/docs/ai/components/weather.md +19 -34
  480. package/docs/ai/components/work-order.md +58 -134
  481. package/docs/ai/patterns.md +63 -0
  482. package/docs/components/accordion.md +72 -151
  483. package/docs/components/action-bar.md +185 -0
  484. package/docs/components/activity-feed.md +9 -14
  485. package/docs/components/alert.md +17 -109
  486. package/docs/components/app-tiles.md +58 -43
  487. package/docs/components/approval-flow.md +8 -14
  488. package/docs/components/audio-recorder.md +45 -51
  489. package/docs/components/availability.md +30 -45
  490. package/docs/components/avatar-group.md +34 -14
  491. package/docs/components/avatar.md +20 -55
  492. package/docs/components/badge.md +53 -470
  493. package/docs/components/banner.md +44 -30
  494. package/docs/components/binpack.md +208 -0
  495. package/docs/components/book.md +78 -57
  496. package/docs/components/booking.md +35 -87
  497. package/docs/components/breadcrumbs.md +74 -448
  498. package/docs/components/button.md +72 -603
  499. package/docs/components/calendar.md +77 -261
  500. package/docs/components/camera-annotate.md +44 -96
  501. package/docs/components/camera.md +94 -333
  502. package/docs/components/candlestick.md +79 -116
  503. package/docs/components/card.md +51 -689
  504. package/docs/components/carousel.md +29 -76
  505. package/docs/components/cart.md +44 -136
  506. package/docs/components/chart.md +95 -438
  507. package/docs/components/chat.md +175 -439
  508. package/docs/components/checkbox.md +52 -609
  509. package/docs/components/chip.md +45 -574
  510. package/docs/components/code-block.md +157 -421
  511. package/docs/components/color-display.md +45 -54
  512. package/docs/components/color-picker.md +103 -36
  513. package/docs/components/command-palette.md +98 -92
  514. package/docs/components/comments.md +16 -10
  515. package/docs/components/countdown.md +15 -20
  516. package/docs/components/cropper.md +14 -16
  517. package/docs/components/data-card.md +16 -15
  518. package/docs/components/date-picker.md +45 -25
  519. package/docs/components/date-range-picker.md +140 -87
  520. package/docs/components/date-time-picker.md +25 -28
  521. package/docs/components/diff.md +22 -17
  522. package/docs/components/divider.md +18 -20
  523. package/docs/components/doc.md +105 -197
  524. package/docs/components/draw.md +117 -223
  525. package/docs/components/drawer.md +113 -478
  526. package/docs/components/empty-state.md +13 -29
  527. package/docs/components/estimate.md +58 -118
  528. package/docs/components/file-gallery.md +123 -495
  529. package/docs/components/file-upload.md +36 -123
  530. package/docs/components/flip-card.md +30 -34
  531. package/docs/components/flow.md +74 -89
  532. package/docs/components/form-builder.md +59 -86
  533. package/docs/components/form-layout.md +21 -31
  534. package/docs/components/funnel.md +21 -22
  535. package/docs/components/gantt.md +5 -5
  536. package/docs/components/gauge.md +5 -23
  537. package/docs/components/heatmap.md +13 -55
  538. package/docs/components/image.md +28 -32
  539. package/docs/components/input.md +25 -14
  540. package/docs/components/invoice.md +34 -33
  541. package/docs/components/kanban.md +99 -394
  542. package/docs/components/key-value.md +22 -12
  543. package/docs/components/kpi.md +41 -112
  544. package/docs/components/layout.md +7 -13
  545. package/docs/components/leaderboard.md +52 -76
  546. package/docs/components/link-preview.md +20 -16
  547. package/docs/components/link.md +22 -19
  548. package/docs/components/list.md +44 -26
  549. package/docs/components/location.md +9 -13
  550. package/docs/components/login.md +42 -36
  551. package/docs/components/map.md +24 -46
  552. package/docs/components/markdown.md +14 -25
  553. package/docs/components/masonry.md +15 -13
  554. package/docs/components/mentions.md +36 -25
  555. package/docs/components/menu.md +39 -46
  556. package/docs/components/message-strip.md +15 -51
  557. package/docs/components/metric-table.md +50 -72
  558. package/docs/components/modal.md +32 -43
  559. package/docs/components/music-player.md +41 -49
  560. package/docs/components/nav.md +23 -13
  561. package/docs/components/network-graph.md +14 -13
  562. package/docs/components/notification-center.md +68 -172
  563. package/docs/components/order-tracker.md +72 -117
  564. package/docs/components/org-chart.md +58 -207
  565. package/docs/components/pagination.md +67 -89
  566. package/docs/components/paint.md +86 -172
  567. package/docs/components/pdf-viewer.md +46 -151
  568. package/docs/components/permission-matrix.md +61 -112
  569. package/docs/components/podcast-player.md +41 -119
  570. package/docs/components/pricing-table.md +104 -147
  571. package/docs/components/product-card.md +94 -197
  572. package/docs/components/progress-ring.md +29 -32
  573. package/docs/components/progress.md +30 -61
  574. package/docs/components/qr-code.md +53 -61
  575. package/docs/components/qr-reader.md +53 -42
  576. package/docs/components/radio.md +42 -40
  577. package/docs/components/range-slider.md +41 -30
  578. package/docs/components/rating.md +50 -84
  579. package/docs/components/receipt.md +91 -129
  580. package/docs/components/recipe.md +107 -216
  581. package/docs/components/sankey.md +47 -83
  582. package/docs/components/scheduler.md +81 -184
  583. package/docs/components/segmented-control.md +48 -40
  584. package/docs/components/select.md +107 -129
  585. package/docs/components/skeleton.md +33 -47
  586. package/docs/components/slider.md +49 -53
  587. package/docs/components/sortable.md +43 -186
  588. package/docs/components/sparkline.md +26 -25
  589. package/docs/components/spinner.md +32 -37
  590. package/docs/components/split-button.md +43 -23
  591. package/docs/components/split-pane.md +41 -58
  592. package/docs/components/spotlight.md +53 -145
  593. package/docs/components/spreadsheet.md +84 -307
  594. package/docs/components/stat-group.md +27 -61
  595. package/docs/components/step-input.md +44 -41
  596. package/docs/components/stepper.md +55 -89
  597. package/docs/components/switch.md +39 -39
  598. package/docs/components/table.md +27 -32
  599. package/docs/components/tabs.md +36 -27
  600. package/docs/components/tag-input.md +50 -176
  601. package/docs/components/tag.md +12 -50
  602. package/docs/components/terminal.md +32 -37
  603. package/docs/components/testimonial.md +24 -81
  604. package/docs/components/textarea.md +9 -14
  605. package/docs/components/theme.md +10 -23
  606. package/docs/components/time-picker.md +48 -72
  607. package/docs/components/time-range-picker.md +22 -41
  608. package/docs/components/timeline.md +7 -14
  609. package/docs/components/timer.md +16 -32
  610. package/docs/components/toast.md +19 -45
  611. package/docs/components/tooltip.md +13 -115
  612. package/docs/components/tree.md +2 -19
  613. package/docs/components/treemap.md +19 -43
  614. package/docs/components/user-card.md +13 -22
  615. package/docs/components/video-player.md +53 -227
  616. package/docs/components/virtual-scroller.md +11 -44
  617. package/docs/components/waterfall.md +58 -137
  618. package/docs/components/weather.md +94 -153
  619. package/docs/components/work-order.md +56 -143
  620. package/docs/plans/2026-03-09-action-bar-design.md +104 -0
  621. package/docs/plans/2026-03-09-action-bar-plan.md +676 -0
  622. package/docs/plans/2026-03-10-react-integration-design.md +166 -0
  623. package/docs/request-response.md +77 -0
  624. package/package.json +20 -10
@@ -1,6 +1,6 @@
1
- <!-- AI: For a low-token version of this doc, use docs/ai/components/file-gallery.md instead -->
1
+ <!-- AI: For the AI-optimized version of this doc, see docs/ai/components/file-gallery.md -->
2
2
 
3
- # File Gallery Component
3
+ # File Gallery
4
4
 
5
5
  The `<snice-file-gallery>` component provides a file upload gallery with drag-and-drop support, image previews, pausable/resumable uploads, and progress tracking.
6
6
 
@@ -10,9 +10,7 @@ The `<snice-file-gallery>` component provides a file upload gallery with drag-an
10
10
  - [Events](#events)
11
11
  - [CSS Parts](#css-parts)
12
12
  - [Basic Usage](#basic-usage)
13
- - [Upload Handler](#upload-handler)
14
13
  - [Examples](#examples)
15
- - [Features](#features)
16
14
 
17
15
  ## Properties
18
16
 
@@ -21,363 +19,102 @@ The `<snice-file-gallery>` component provides a file upload gallery with drag-an
21
19
  | `accept` | `string` | `''` | Allowed file types (same as input accept) |
22
20
  | `multiple` | `boolean` | `true` | Allow multiple file selection |
23
21
  | `disabled` | `boolean` | `false` | Whether gallery is disabled |
24
- | `maxSize` | `number` | `-1` | Maximum file size in bytes (-1 = no limit) |
25
- | `maxFiles` | `number` | `-1` | Maximum number of files (-1 = no limit) |
22
+ | `maxSize` (attr: `max-size`) | `number` | `-1` | Maximum file size in bytes (-1 = no limit) |
23
+ | `maxFiles` (attr: `max-files`) | `number` | `-1` | Maximum number of files (-1 = no limit) |
26
24
  | `view` | `'grid' \| 'list'` | `'grid'` | Display layout mode |
27
- | `showProgress` | `boolean` | `true` | Show upload progress |
28
- | `allowPause` | `boolean` | `true` | Allow pause/resume of uploads |
29
- | `allowDelete` | `boolean` | `true` | Allow file deletion |
30
- | `autoUpload` | `boolean` | `true` | Start upload immediately on file add |
31
- | `showDropzone` | `boolean` | `true` | Show drop zone for drag & drop uploads |
32
- | `showAddButton` | `boolean` | `false` | Show add button tile in gallery |
25
+ | `showProgress` (attr: `show-progress`) | `boolean` | `true` | Show upload progress |
26
+ | `allowPause` (attr: `allow-pause`) | `boolean` | `true` | Allow pause/resume of uploads |
27
+ | `allowDelete` (attr: `allow-delete`) | `boolean` | `true` | Allow file deletion |
28
+ | `autoUpload` (attr: `auto-upload`) | `boolean` | `true` | Start upload immediately on file add |
29
+ | `showDropzone` (attr: `show-dropzone`) | `boolean` | `true` | Show drop zone for drag & drop uploads |
30
+ | `showAddButton` (attr: `show-add-button`) | `boolean` | `false` | Show add button tile in gallery |
33
31
  | `showHeader` (attr: `show-header`) | `boolean` | `true` | Show gallery header section |
34
- | `files` | `GalleryFile[]` | `[]` | Current files (read-only) |
32
+ | `files` | `GalleryFile[]` | `[]` | Current files (read-only getter) |
35
33
 
36
34
  ## Methods
37
35
 
38
36
  ### Getters
39
37
 
40
- #### `files: GalleryFile[]`
41
- Get all files in the gallery (read-only).
42
-
43
- ```typescript
44
- const allFiles = gallery.files;
45
- ```
46
-
47
- #### `customActions: CustomAction[]`
48
- Get all custom action buttons (read-only).
49
-
50
- ```typescript
51
- const actions = gallery.customActions;
52
- ```
53
-
54
- #### `getFile(fileId: string): GalleryFile | undefined`
55
- Get a specific file by ID.
56
-
57
- ```typescript
58
- const file = gallery.getFile('file-id-123');
59
- ```
60
-
61
- #### `getCustomAction(actionId: string): CustomAction | undefined`
62
- Get a specific custom action by ID.
63
-
64
- ```typescript
65
- const action = gallery.getCustomAction('action-id-456');
66
- ```
67
-
68
- #### `isPending(fileId: string): boolean`
69
- Check if a file upload is pending.
70
-
71
- ```typescript
72
- if (gallery.isPending('file-id-123')) {
73
- console.log('File is waiting to upload');
74
- }
75
- ```
76
-
77
- #### `isUploading(fileId: string): boolean`
78
- Check if a file is currently uploading.
79
-
80
- #### `isPaused(fileId: string): boolean`
81
- Check if a file upload is paused.
82
-
83
- #### `isCompleted(fileId: string): boolean`
84
- Check if a file upload is completed.
85
-
86
- #### `hasError(fileId: string): boolean`
87
- Check if a file upload has an error.
88
-
89
- #### `canAddFiles(): boolean`
90
- Check if more files can be added (respects maxFiles limit).
91
-
92
- ```typescript
93
- if (gallery.canAddFiles()) {
94
- gallery.openFilePicker();
95
- }
96
- ```
38
+ | Method | Returns | Description |
39
+ |--------|---------|-------------|
40
+ | `files` | `GalleryFile[]` | Get all files (read-only) |
41
+ | `customActions` | `CustomAction[]` | Get all custom action buttons (read-only) |
42
+ | `getFile(fileId)` | `GalleryFile \| undefined` | Get a specific file by ID |
43
+ | `getCustomAction(actionId)` | `CustomAction \| undefined` | Get a specific custom action by ID |
44
+ | `isPending(fileId)` | `boolean` | Check if a file upload is pending |
45
+ | `isUploading(fileId)` | `boolean` | Check if a file is currently uploading |
46
+ | `isPaused(fileId)` | `boolean` | Check if a file upload is paused |
47
+ | `isCompleted(fileId)` | `boolean` | Check if a file upload is completed |
48
+ | `hasError(fileId)` | `boolean` | Check if a file upload has an error |
49
+ | `canAddFiles()` | `boolean` | Check if more files can be added (respects maxFiles) |
97
50
 
98
51
  ### File Management
99
52
 
100
- #### `addFiles(files: FileList | File[]): void`
101
- Add files to the gallery.
102
-
103
- ```typescript
104
- gallery.addFiles(fileInput.files);
105
- ```
106
-
107
- #### `addFileWithPreview(file: File, previewDataUrl: string): void`
108
- Add a file with a custom preview (e.g., from camera/canvas).
109
-
110
- ```typescript
111
- const canvas = document.createElement('canvas');
112
- // ... draw on canvas
113
- canvas.toBlob((blob) => {
114
- const file = new File([blob], 'photo.png', { type: 'image/png' });
115
- const preview = canvas.toDataURL('image/png');
116
- gallery.addFileWithPreview(file, preview);
117
- });
118
- ```
119
-
120
- #### `removeFile(fileId: string): void`
121
- Remove a file from the gallery.
122
-
123
- ```typescript
124
- gallery.removeFile('file-id-123');
125
- ```
126
-
127
- #### `clear(): void`
128
- Remove all files from the gallery.
129
-
130
- ```typescript
131
- gallery.clear();
132
- ```
133
-
134
- #### `clearCompleted(): void`
135
- Remove all completed files from the gallery.
136
-
137
- ```typescript
138
- gallery.clearCompleted();
139
- ```
140
-
141
- #### `clearErrors(): void`
142
- Remove all files with errors from the gallery.
143
-
144
- ```typescript
145
- gallery.clearErrors();
146
- ```
53
+ | Method | Description |
54
+ |--------|-------------|
55
+ | `addFiles(files: FileList \| File[])` | Add files to the gallery |
56
+ | `addFileWithPreview(file: File, previewDataUrl: string)` | Add a file with a custom preview |
57
+ | `removeFile(fileId: string)` | Remove a file from the gallery |
58
+ | `clear()` | Remove all files |
59
+ | `clearCompleted()` | Remove all completed files |
60
+ | `clearErrors()` | Remove all files with errors |
147
61
 
148
62
  ### Upload Control
149
63
 
150
- #### `pauseUpload(fileId: string): void`
151
- Pause an ongoing upload.
152
-
153
- ```typescript
154
- gallery.pauseUpload('file-id-123');
155
- ```
156
-
157
- #### `resumeUpload(fileId: string): Promise<void>`
158
- Resume a paused upload.
159
-
160
- ```typescript
161
- await gallery.resumeUpload('file-id-123');
162
- ```
163
-
164
- #### `retryUpload(fileId: string): Promise<void>`
165
- Retry a failed upload.
166
-
167
- ```typescript
168
- await gallery.retryUpload('file-id-123');
169
- ```
170
-
171
- #### `cancelUpload(fileId: string): void`
172
- Cancel an upload and remove the file.
173
-
174
- ```typescript
175
- gallery.cancelUpload('file-id-123');
176
- ```
177
-
178
- #### `pauseAll(): void`
179
- Pause all currently uploading files.
180
-
181
- ```typescript
182
- gallery.pauseAll();
183
- ```
184
-
185
- #### `resumeAll(): void`
186
- Resume all paused uploads.
187
-
188
- ```typescript
189
- gallery.resumeAll();
190
- ```
191
-
192
- #### `retryAll(): void`
193
- Retry all failed uploads.
194
-
195
- ```typescript
196
- gallery.retryAll();
197
- ```
198
-
199
- #### `cancelAll(): void`
200
- Cancel all active uploads and remove them.
201
-
202
- ```typescript
203
- gallery.cancelAll();
204
- ```
64
+ | Method | Description |
65
+ |--------|-------------|
66
+ | `pauseUpload(fileId: string)` | Pause an ongoing upload |
67
+ | `resumeUpload(fileId: string)` | Resume a paused upload |
68
+ | `retryUpload(fileId: string)` | Retry a failed upload |
69
+ | `cancelUpload(fileId: string)` | Cancel an upload and remove the file |
70
+ | `pauseAll()` | Pause all currently uploading files |
71
+ | `resumeAll()` | Resume all paused uploads |
72
+ | `retryAll()` | Retry all failed uploads |
73
+ | `cancelAll()` | Cancel all active uploads and remove them |
205
74
 
206
75
  ### Custom Actions
207
76
 
208
- #### `addCustomAction(icon: string, text: string): string`
209
- Add a custom action button to the gallery. Returns the action ID.
210
-
211
- ```typescript
212
- const cameraIcon = '<svg viewBox="0 0 24 24">...</svg>';
213
- const actionId = gallery.addCustomAction(cameraIcon, 'Camera');
214
- ```
215
-
216
- #### `removeCustomAction(actionId: string): void`
217
- Remove a custom action button.
218
-
219
- ```typescript
220
- gallery.removeCustomAction(actionId);
221
- ```
222
-
223
- #### `clearCustomActions(): void`
224
- Remove all custom action buttons.
225
-
226
- ```typescript
227
- gallery.clearCustomActions();
228
- ```
77
+ | Method | Returns | Description |
78
+ |--------|---------|-------------|
79
+ | `addCustomAction(icon: string, text: string)` | `string` | Add a custom action button; returns the action ID |
80
+ | `removeCustomAction(actionId: string)` | `void` | Remove a custom action button |
81
+ | `clearCustomActions()` | `void` | Remove all custom action buttons |
229
82
 
230
83
  ### Utility
231
84
 
232
- #### `openFilePicker(): void`
233
- Programmatically open the file picker dialog.
234
-
235
- ```typescript
236
- gallery.openFilePicker();
237
- ```
238
-
239
- #### `setFileBadge(fileId: string, badge: string, position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'): void`
240
- Add a custom badge overlay to a file's preview thumbnail. Supports HTML content for avatars, icons, or custom elements.
241
-
242
- ```typescript
243
- // Add user avatar badge
244
- const avatarHTML = `<div style="
245
- width: 40px;
246
- height: 40px;
247
- border-radius: 50%;
248
- background: #3b82f6;
249
- color: white;
250
- display: flex;
251
- align-items: center;
252
- justify-content: center;
253
- font-weight: bold;
254
- border: 2px solid white;
255
- box-shadow: 0 2px 4px rgba(0,0,0,0.2);
256
- ">JD</div>`;
257
-
258
- gallery.setFileBadge('file-id-123', avatarHTML, 'top-right');
259
- ```
260
-
261
- #### `removeFileBadge(fileId: string): void`
262
- Remove a badge from a file.
263
-
264
- ```typescript
265
- gallery.removeFileBadge('file-id-123');
266
- ```
85
+ | Method | Description |
86
+ |--------|-------------|
87
+ | `openFilePicker()` | Programmatically open the file picker dialog |
88
+ | `setFileBadge(fileId, badge, position?)` | Add a custom badge overlay to a file's preview |
89
+ | `removeFileBadge(fileId)` | Remove a badge from a file |
267
90
 
268
91
  ## Events
269
92
 
270
- ### `files-change`
271
- Fired when files are added or removed.
272
-
273
- **Detail**: `{ files: GalleryFile[] }`
274
-
275
- ```typescript
276
- gallery.addEventListener('files-change', (e) => {
277
- console.log('Files:', e.detail.files);
278
- });
279
- ```
280
-
281
- ### `upload-progress`
282
- Fired during upload progress.
283
-
284
- **Detail**: `{ file: GalleryFile, progress: number }`
285
-
286
- ```typescript
287
- gallery.addEventListener('upload-progress', (e) => {
288
- console.log(`${e.detail.file.file.name}: ${e.detail.progress}%`);
289
- });
290
- ```
291
-
292
- ### `upload-complete`
293
- Fired when an upload completes successfully.
294
-
295
- **Detail**: `{ file: GalleryFile, response: UploadResponse, component: SniceFileGalleryElement }`
296
-
297
- ```typescript
298
- gallery.addEventListener('upload-complete', (e) => {
299
- console.log('Upload complete:', e.detail.response);
300
- });
301
- ```
302
-
303
- ### `upload-pause`
304
- Fired when an upload is paused.
305
-
306
- **Detail**: `{ file: GalleryFile, component: SniceFileGalleryElement }`
307
-
308
- ```typescript
309
- gallery.addEventListener('upload-pause', (e) => {
310
- console.log('Upload paused:', e.detail.file.file.name);
311
- });
312
- ```
313
-
314
- ### `file-remove`
315
- Fired when a file is removed from the gallery.
316
-
317
- **Detail**: `{ file: GalleryFile, component: SniceFileGalleryElement }`
318
-
319
- ```typescript
320
- gallery.addEventListener('file-remove', (e) => {
321
- console.log('File removed:', e.detail.file.file.name);
322
- });
323
- ```
324
-
325
- ### `upload-error`
326
- Fired when an upload fails.
327
-
328
- **Detail**: `{ file: GalleryFile, error: string, component: SniceFileGalleryElement }`
329
-
330
- ```typescript
331
- gallery.addEventListener('upload-error', (e) => {
332
- console.error('Upload error:', e.detail.error);
333
- });
334
- ```
335
-
336
- ### `custom-action-click`
337
- Fired when a custom action button is clicked.
338
-
339
- **Detail**: `{ actionId: string }`
340
-
341
- ```typescript
342
- gallery.addEventListener('custom-action-click', (e) => {
343
- console.log('Custom action clicked:', e.detail.actionId);
344
- });
345
- ```
346
-
347
- ### `gallery-error`
348
- Fired when a validation or general error occurs.
349
-
350
- **Detail**: `{ message: string }`
351
-
352
- ```typescript
353
- gallery.addEventListener('gallery-error', (e) => {
354
- console.error('Error:', e.detail.message);
355
- });
356
- ```
93
+ | Event | Detail | Description |
94
+ |-------|--------|-------------|
95
+ | `files-change` | `{ files, component }` | Files added or removed |
96
+ | `upload-progress` | `{ file, progress, component }` | Upload progress update |
97
+ | `upload-complete` | `{ file, response, component }` | Upload completed successfully |
98
+ | `upload-error` | `{ file, error, component }` | Upload failed |
99
+ | `upload-pause` | `{ file, component }` | Upload paused |
100
+ | `file-remove` | `{ file, component }` | File removed from gallery |
101
+ | `custom-action-click` | `{ actionId, component }` | Custom action button clicked |
102
+ | `gallery-error` | `{ message, component }` | Validation or general error |
357
103
 
358
104
  ## CSS Parts
359
105
 
360
- Style internal elements from outside the shadow DOM using `::part()`.
106
+ | Part | Description |
107
+ |------|-------------|
108
+ | `base` | Outer gallery container |
109
+ | `dropzone` | Drag-and-drop upload zone |
110
+ | `gallery` | File thumbnails grid/list area |
361
111
 
362
- | Part | Element | Description |
363
- |------|---------|-------------|
364
- | `base` | `<div>` | Outer gallery container |
365
- | `dropzone` | `<div>` | Drag-and-drop upload zone |
366
- | `gallery` | `<div>` | File thumbnails grid/list area |
367
-
368
- ```css
369
- snice-file-gallery::part(dropzone) {
370
- border-style: dashed;
371
- border-color: #3b82f6;
372
- }
112
+ ## Basic Usage
373
113
 
374
- snice-file-gallery::part(gallery) {
375
- gap: 1rem;
376
- }
114
+ ```typescript
115
+ import 'snice/components/file-gallery/snice-file-gallery';
377
116
  ```
378
117
 
379
- ## Basic Usage
380
-
381
118
  ```html
382
119
  <snice-file-gallery controller="upload-handler"></snice-file-gallery>
383
120
  ```
@@ -408,72 +145,8 @@ class UploadHandler implements IController {
408
145
  }
409
146
  ```
410
147
 
411
- ## Upload Handler
412
-
413
- The file gallery uses the `@request/@respond` pattern for uploads. Attach a controller with `@respond('file-gallery-upload')`:
414
-
415
- ```typescript
416
- import { controller, respond, IController } from 'snice';
417
-
418
- @controller('upload-handler')
419
- class UploadHandler implements IController {
420
- element: HTMLElement | null = null;
421
-
422
- async attach(element: HTMLElement) {
423
- this.element = element;
424
- }
425
-
426
- async detach() {}
427
-
428
- @respond('file-gallery-upload')
429
- async handleUpload(request) {
430
- const { file, fileId, onProgress, signal } = request;
431
-
432
- const formData = new FormData();
433
- formData.append('file', file);
434
-
435
- return new Promise((resolve, reject) => {
436
- const xhr = new XMLHttpRequest();
437
-
438
- xhr.upload.addEventListener('progress', (e) => {
439
- if (e.lengthComputable && onProgress) {
440
- onProgress(e.loaded / e.total);
441
- }
442
- });
443
-
444
- xhr.addEventListener('load', () => {
445
- if (xhr.status === 200) {
446
- const response = JSON.parse(xhr.responseText);
447
- resolve({ success: true, fileId, url: response.url });
448
- } else {
449
- reject(new Error('Upload failed'));
450
- }
451
- });
452
-
453
- xhr.addEventListener('error', () => reject(new Error('Network error')));
454
-
455
- if (signal) {
456
- signal.addEventListener('abort', () => {
457
- xhr.abort();
458
- reject(new Error('Upload cancelled'));
459
- });
460
- }
461
-
462
- xhr.open('POST', '/api/upload');
463
- xhr.send(formData);
464
- });
465
- }
466
- }
467
- ```
468
-
469
148
  ## Examples
470
149
 
471
- ### Basic Gallery
472
-
473
- ```html
474
- <snice-file-gallery></snice-file-gallery>
475
- ```
476
-
477
150
  ### Image Gallery
478
151
 
479
152
  ```html
@@ -486,16 +159,6 @@ class UploadHandler implements IController {
486
159
  <snice-file-gallery auto-upload="false" controller="upload-handler"></snice-file-gallery>
487
160
  ```
488
161
 
489
- ```typescript
490
- // Upload files manually
491
- const files = gallery.files;
492
- for (const file of files) {
493
- if (file.uploadStatus === 'pending') {
494
- await gallery.resumeUpload(file.id);
495
- }
496
- }
497
- ```
498
-
499
162
  ### File Limits
500
163
 
501
164
  ```html
@@ -511,19 +174,9 @@ for (const file of files) {
511
174
  <snice-file-gallery view="list"></snice-file-gallery>
512
175
  ```
513
176
 
514
- ### Custom File Types
515
-
516
- ```html
517
- <snice-file-gallery
518
- accept=".pdf,.doc,.docx,.txt"
519
- allow-pause="false"
520
- ></snice-file-gallery>
521
- ```
522
-
523
177
  ### Add Button Mode
524
178
 
525
179
  ```html
526
- <!-- Hide drop zone and show plus tile in gallery instead -->
527
180
  <snice-file-gallery
528
181
  show-dropzone="false"
529
182
  show-add-button="true"
@@ -531,43 +184,24 @@ for (const file of files) {
531
184
  ></snice-file-gallery>
532
185
  ```
533
186
 
534
- ### Tracking Upload Events
187
+ ### Custom Action Buttons
535
188
 
536
189
  ```typescript
537
- gallery.addEventListener('files-change', (e) => {
538
- console.log('Files changed:', e.detail.files);
539
- });
540
-
541
- gallery.addEventListener('upload-progress', (e) => {
542
- console.log(`${e.detail.file.file.name}: ${e.detail.progress}%`);
543
- });
190
+ const cameraIcon = `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor">
191
+ <path d="M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z" stroke-width="2"/>
192
+ <circle cx="12" cy="13" r="4" stroke-width="2"/>
193
+ </svg>`;
544
194
 
545
- gallery.addEventListener('upload-complete', (e) => {
546
- console.log('Upload complete:', e.detail.file.file.name);
547
- });
195
+ const cameraActionId = gallery.addCustomAction(cameraIcon, 'Camera');
548
196
 
549
- gallery.addEventListener('upload-error', (e) => {
550
- console.error('Upload failed:', e.detail.error);
197
+ gallery.addEventListener('custom-action-click', (e) => {
198
+ if (e.detail.actionId === cameraActionId) {
199
+ // Open camera, capture image, etc.
200
+ }
551
201
  });
552
202
  ```
553
203
 
554
- ### Programmatic File Management
555
-
556
- ```typescript
557
- gallery.pauseAll();
558
- gallery.resumeAll();
559
- gallery.retryAll();
560
- gallery.clearCompleted();
561
- gallery.clear();
562
- ```
563
-
564
- ### Custom Badges for Collaboration
565
-
566
- Use badges to show user avatars on files in collaborative scenarios:
567
-
568
- ```html
569
- <snice-file-gallery show-dropzone="false" show-add-button="true" controller="upload-handler"></snice-file-gallery>
570
- ```
204
+ ### Custom Badges
571
205
 
572
206
  ```typescript
573
207
  const avatarHTML = `<div style="
@@ -575,40 +209,38 @@ const avatarHTML = `<div style="
575
209
  background: #3b82f6; color: white;
576
210
  display: flex; align-items: center; justify-content: center;
577
211
  font-weight: bold; border: 2px solid white;
578
- box-shadow: 0 2px 4px rgba(0,0,0,0.2);
579
212
  ">JD</div>`;
580
213
 
581
214
  gallery.setFileBadge('file-id-123', avatarHTML, 'top-right');
582
215
  ```
583
216
 
584
- ### Custom Action Buttons
217
+ ### Tracking Upload Events
585
218
 
586
219
  ```typescript
587
- const cameraIcon = `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor">
588
- <path d="M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z" stroke-width="2"/>
589
- <circle cx="12" cy="13" r="4" stroke-width="2"/>
590
- </svg>`;
220
+ gallery.addEventListener('files-change', (e) => {
221
+ console.log('Files changed:', e.detail.files);
222
+ });
591
223
 
592
- const cameraActionId = gallery.addCustomAction(cameraIcon, 'Camera');
224
+ gallery.addEventListener('upload-progress', (e) => {
225
+ console.log(`${e.detail.file.file.name}: ${e.detail.progress}%`);
226
+ });
593
227
 
594
- gallery.addEventListener('custom-action-click', (e) => {
595
- if (e.detail.actionId === cameraActionId) {
596
- openCamera().then((imageBlob) => {
597
- const file = new File([imageBlob], `photo-${Date.now()}.jpg`, { type: 'image/jpeg' });
598
- const preview = URL.createObjectURL(imageBlob);
599
- gallery.addFileWithPreview(file, preview);
600
- });
601
- }
228
+ gallery.addEventListener('upload-complete', (e) => {
229
+ console.log('Upload complete:', e.detail.file.file.name);
230
+ });
231
+
232
+ gallery.addEventListener('upload-error', (e) => {
233
+ console.error('Upload failed:', e.detail.error);
602
234
  });
603
235
  ```
604
236
 
605
- ### Advanced Upload Handler with Retry
237
+ ### Upload Handler with XHR Progress
606
238
 
607
239
  ```typescript
608
240
  import { controller, respond, IController } from 'snice';
609
241
 
610
- @controller('upload-with-retry')
611
- class UploadWithRetry implements IController {
242
+ @controller('upload-handler')
243
+ class UploadHandler implements IController {
612
244
  element: HTMLElement | null = null;
613
245
  async attach(element: HTMLElement) { this.element = element; }
614
246
  async detach() {}
@@ -617,43 +249,39 @@ class UploadWithRetry implements IController {
617
249
  async handleUpload(request) {
618
250
  const { file, fileId, onProgress, signal } = request;
619
251
 
620
- const uploadToServer = async (retries = 3) => {
621
- try {
622
- const formData = new FormData();
623
- formData.append('file', file);
252
+ const formData = new FormData();
253
+ formData.append('file', file);
624
254
 
625
- const response = await fetch('/api/upload', {
626
- method: 'POST',
627
- body: formData,
628
- signal,
629
- });
255
+ return new Promise((resolve, reject) => {
256
+ const xhr = new XMLHttpRequest();
630
257
 
631
- if (!response.ok) throw new Error(`Upload failed: ${response.status}`);
258
+ xhr.upload.addEventListener('progress', (e) => {
259
+ if (e.lengthComputable && onProgress) {
260
+ onProgress(e.loaded / e.total);
261
+ }
262
+ });
632
263
 
633
- const data = await response.json();
634
- return { success: true, fileId, url: data.url };
635
- } catch (error) {
636
- if (retries > 0 && error.name !== 'AbortError') {
637
- await new Promise(resolve => setTimeout(resolve, 1000));
638
- return uploadToServer(retries - 1);
264
+ xhr.addEventListener('load', () => {
265
+ if (xhr.status === 200) {
266
+ const response = JSON.parse(xhr.responseText);
267
+ resolve({ success: true, fileId, url: response.url });
268
+ } else {
269
+ reject(new Error('Upload failed'));
639
270
  }
640
- throw error;
271
+ });
272
+
273
+ xhr.addEventListener('error', () => reject(new Error('Network error')));
274
+
275
+ if (signal) {
276
+ signal.addEventListener('abort', () => {
277
+ xhr.abort();
278
+ reject(new Error('Upload cancelled'));
279
+ });
641
280
  }
642
- };
643
281
 
644
- return uploadToServer();
282
+ xhr.open('POST', '/api/upload');
283
+ xhr.send(formData);
284
+ });
645
285
  }
646
286
  }
647
287
  ```
648
-
649
- ## Features
650
-
651
- - **Drag and Drop**: Native drag-and-drop support with visual feedback
652
- - **Image Preview**: Automatic thumbnail generation for image files
653
- - **Pausable Uploads**: Pause and resume uploads using AbortController
654
- - **Progress Tracking**: Real-time upload progress for each file
655
- - **File Management**: Add, remove, pause, resume, and retry uploads
656
- - **View Modes**: Toggle between grid and list layouts
657
- - **Validation**: File size and type validation with error messaging
658
- - **Auto Upload**: Optional automatic upload on file add
659
- - **Accessibility**: Full keyboard support and ARIA attributes