snice 4.28.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 (618) 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 +1 -1
  43. package/dist/cdn/badge/snice-badge.min.js +1 -1
  44. package/dist/cdn/banner/snice-banner.js +1 -1
  45. package/dist/cdn/banner/snice-banner.min.js +1 -1
  46. package/dist/cdn/binpack/README.md +27 -0
  47. package/dist/cdn/binpack/snice-binpack.js +1037 -0
  48. package/dist/cdn/binpack/snice-binpack.js.map +1 -0
  49. package/dist/cdn/binpack/snice-binpack.min.js +13 -0
  50. package/dist/cdn/binpack/snice-binpack.min.js.map +1 -0
  51. package/dist/cdn/book/snice-book.js +1 -1
  52. package/dist/cdn/book/snice-book.min.js +1 -1
  53. package/dist/cdn/booking/snice-booking.js +1 -1
  54. package/dist/cdn/booking/snice-booking.min.js +1 -1
  55. package/dist/cdn/breadcrumbs/snice-breadcrumbs.js +1 -1
  56. package/dist/cdn/breadcrumbs/snice-breadcrumbs.min.js +1 -1
  57. package/dist/cdn/button/README.md +1 -1
  58. package/dist/cdn/button/snice-button.js +2 -2
  59. package/dist/cdn/button/snice-button.js.map +1 -1
  60. package/dist/cdn/button/snice-button.min.js +2 -2
  61. package/dist/cdn/button/snice-button.min.js.map +1 -1
  62. package/dist/cdn/calendar/snice-calendar.js +1 -1
  63. package/dist/cdn/calendar/snice-calendar.min.js +1 -1
  64. package/dist/cdn/camera/snice-camera.js +1 -1
  65. package/dist/cdn/camera/snice-camera.min.js +1 -1
  66. package/dist/cdn/camera-annotate/snice-camera-annotate.js +1 -1
  67. package/dist/cdn/camera-annotate/snice-camera-annotate.min.js +1 -1
  68. package/dist/cdn/candlestick/snice-candlestick.js +1 -1
  69. package/dist/cdn/candlestick/snice-candlestick.min.js +1 -1
  70. package/dist/cdn/card/snice-card.js +1 -1
  71. package/dist/cdn/card/snice-card.min.js +1 -1
  72. package/dist/cdn/carousel/snice-carousel.js +1 -1
  73. package/dist/cdn/carousel/snice-carousel.min.js +1 -1
  74. package/dist/cdn/cart/snice-cart.js +1 -1
  75. package/dist/cdn/cart/snice-cart.min.js +1 -1
  76. package/dist/cdn/chart/snice-chart.js +1 -1
  77. package/dist/cdn/chart/snice-chart.min.js +1 -1
  78. package/dist/cdn/chat/snice-chat.js +1 -1
  79. package/dist/cdn/chat/snice-chat.min.js +1 -1
  80. package/dist/cdn/checkbox/snice-checkbox.js +1 -1
  81. package/dist/cdn/checkbox/snice-checkbox.min.js +1 -1
  82. package/dist/cdn/chip/snice-chip.js +1 -1
  83. package/dist/cdn/chip/snice-chip.min.js +1 -1
  84. package/dist/cdn/code-block/snice-code-block.js +1 -1
  85. package/dist/cdn/code-block/snice-code-block.min.js +1 -1
  86. package/dist/cdn/color-display/snice-color-display.js +1 -1
  87. package/dist/cdn/color-display/snice-color-display.min.js +1 -1
  88. package/dist/cdn/color-picker/snice-color-picker.js +1 -1
  89. package/dist/cdn/color-picker/snice-color-picker.min.js +1 -1
  90. package/dist/cdn/command-palette/snice-command-palette.js +1 -1
  91. package/dist/cdn/command-palette/snice-command-palette.min.js +1 -1
  92. package/dist/cdn/comments/snice-comments.js +1 -1
  93. package/dist/cdn/comments/snice-comments.min.js +1 -1
  94. package/dist/cdn/countdown/snice-countdown.js +1 -1
  95. package/dist/cdn/countdown/snice-countdown.min.js +1 -1
  96. package/dist/cdn/cropper/snice-cropper.js +1 -1
  97. package/dist/cdn/cropper/snice-cropper.min.js +1 -1
  98. package/dist/cdn/data-card/snice-data-card.js +1 -1
  99. package/dist/cdn/data-card/snice-data-card.min.js +1 -1
  100. package/dist/cdn/date-picker/snice-date-picker.js +1 -1
  101. package/dist/cdn/date-picker/snice-date-picker.min.js +1 -1
  102. package/dist/cdn/date-range-picker/snice-date-range-picker.js +1 -1
  103. package/dist/cdn/date-range-picker/snice-date-range-picker.min.js +1 -1
  104. package/dist/cdn/date-time-picker/snice-date-time-picker.js +1 -1
  105. package/dist/cdn/date-time-picker/snice-date-time-picker.min.js +1 -1
  106. package/dist/cdn/diff/snice-diff.js +1 -1
  107. package/dist/cdn/diff/snice-diff.min.js +1 -1
  108. package/dist/cdn/divider/snice-divider.js +1 -1
  109. package/dist/cdn/divider/snice-divider.min.js +1 -1
  110. package/dist/cdn/doc/snice-doc.js +1 -1
  111. package/dist/cdn/doc/snice-doc.min.js +1 -1
  112. package/dist/cdn/draw/snice-draw.js +1 -1
  113. package/dist/cdn/draw/snice-draw.min.js +1 -1
  114. package/dist/cdn/drawer/snice-drawer.js +1 -1
  115. package/dist/cdn/drawer/snice-drawer.min.js +1 -1
  116. package/dist/cdn/empty-state/snice-empty-state.js +1 -1
  117. package/dist/cdn/empty-state/snice-empty-state.min.js +1 -1
  118. package/dist/cdn/estimate/snice-estimate.js +1 -1
  119. package/dist/cdn/estimate/snice-estimate.min.js +1 -1
  120. package/dist/cdn/file-gallery/snice-file-gallery.js +1 -1
  121. package/dist/cdn/file-gallery/snice-file-gallery.min.js +1 -1
  122. package/dist/cdn/file-upload/snice-file-upload.js +1 -1
  123. package/dist/cdn/file-upload/snice-file-upload.min.js +1 -1
  124. package/dist/cdn/flip-card/snice-flip-card.js +1 -1
  125. package/dist/cdn/flip-card/snice-flip-card.min.js +1 -1
  126. package/dist/cdn/flow/snice-flow.js +1 -1
  127. package/dist/cdn/flow/snice-flow.min.js +1 -1
  128. package/dist/cdn/form-layout/snice-form-layout.js +1 -1
  129. package/dist/cdn/form-layout/snice-form-layout.min.js +1 -1
  130. package/dist/cdn/funnel/snice-funnel.js +1 -1
  131. package/dist/cdn/funnel/snice-funnel.min.js +1 -1
  132. package/dist/cdn/gantt/snice-gantt.js +1 -1
  133. package/dist/cdn/gantt/snice-gantt.min.js +1 -1
  134. package/dist/cdn/gauge/snice-gauge.js +1 -1
  135. package/dist/cdn/gauge/snice-gauge.min.js +1 -1
  136. package/dist/cdn/heatmap/snice-heatmap.js +1 -1
  137. package/dist/cdn/heatmap/snice-heatmap.min.js +1 -1
  138. package/dist/cdn/image/snice-image.js +1 -1
  139. package/dist/cdn/image/snice-image.min.js +1 -1
  140. package/dist/cdn/input/snice-input.js +1 -1
  141. package/dist/cdn/input/snice-input.min.js +1 -1
  142. package/dist/cdn/invoice/snice-invoice.js +1 -1
  143. package/dist/cdn/invoice/snice-invoice.min.js +1 -1
  144. package/dist/cdn/kanban/snice-kanban.js +1 -1
  145. package/dist/cdn/kanban/snice-kanban.min.js +1 -1
  146. package/dist/cdn/key-value/snice-key-value.js +1 -1
  147. package/dist/cdn/key-value/snice-key-value.min.js +1 -1
  148. package/dist/cdn/kpi/snice-kpi.js +1 -1
  149. package/dist/cdn/kpi/snice-kpi.min.js +1 -1
  150. package/dist/cdn/layout/snice-layout.js +1 -1
  151. package/dist/cdn/layout/snice-layout.min.js +1 -1
  152. package/dist/cdn/leaderboard/snice-leaderboard.js +1 -1
  153. package/dist/cdn/leaderboard/snice-leaderboard.min.js +1 -1
  154. package/dist/cdn/link/snice-link.js +1 -1
  155. package/dist/cdn/link/snice-link.min.js +1 -1
  156. package/dist/cdn/link-preview/snice-link-preview.js +1 -1
  157. package/dist/cdn/link-preview/snice-link-preview.min.js +1 -1
  158. package/dist/cdn/list/snice-list.js +1 -1
  159. package/dist/cdn/list/snice-list.min.js +1 -1
  160. package/dist/cdn/location/snice-location.js +1 -1
  161. package/dist/cdn/location/snice-location.min.js +1 -1
  162. package/dist/cdn/login/README.md +2 -2
  163. package/dist/cdn/login/snice-login.js +2 -2
  164. package/dist/cdn/login/snice-login.js.map +1 -1
  165. package/dist/cdn/login/snice-login.min.js +2 -2
  166. package/dist/cdn/login/snice-login.min.js.map +1 -1
  167. package/dist/cdn/map/snice-map.js +1 -1
  168. package/dist/cdn/map/snice-map.min.js +1 -1
  169. package/dist/cdn/markdown/snice-markdown.js +1 -1
  170. package/dist/cdn/markdown/snice-markdown.min.js +1 -1
  171. package/dist/cdn/masonry/snice-masonry.js +1 -1
  172. package/dist/cdn/masonry/snice-masonry.min.js +1 -1
  173. package/dist/cdn/menu/snice-menu.js +1 -1
  174. package/dist/cdn/menu/snice-menu.min.js +1 -1
  175. package/dist/cdn/message-strip/snice-message-strip.js +1 -1
  176. package/dist/cdn/message-strip/snice-message-strip.min.js +1 -1
  177. package/dist/cdn/metric-table/snice-metric-table.js +1 -1
  178. package/dist/cdn/metric-table/snice-metric-table.min.js +1 -1
  179. package/dist/cdn/modal/snice-modal.js +1 -1
  180. package/dist/cdn/modal/snice-modal.min.js +1 -1
  181. package/dist/cdn/music-player/snice-music-player.js +1 -1
  182. package/dist/cdn/music-player/snice-music-player.min.js +1 -1
  183. package/dist/cdn/nav/snice-nav.js +1 -1
  184. package/dist/cdn/nav/snice-nav.min.js +1 -1
  185. package/dist/cdn/network-graph/snice-network-graph.js +1 -1
  186. package/dist/cdn/network-graph/snice-network-graph.min.js +1 -1
  187. package/dist/cdn/notification-center/snice-notification-center.js +1 -1
  188. package/dist/cdn/notification-center/snice-notification-center.min.js +1 -1
  189. package/dist/cdn/order-tracker/snice-order-tracker.js +1 -1
  190. package/dist/cdn/order-tracker/snice-order-tracker.min.js +1 -1
  191. package/dist/cdn/org-chart/snice-org-chart.js +1 -1
  192. package/dist/cdn/org-chart/snice-org-chart.min.js +1 -1
  193. package/dist/cdn/pagination/snice-pagination.js +1 -1
  194. package/dist/cdn/pagination/snice-pagination.min.js +1 -1
  195. package/dist/cdn/paint/snice-paint.js +1 -1
  196. package/dist/cdn/paint/snice-paint.min.js +1 -1
  197. package/dist/cdn/pdf-viewer/snice-pdf-viewer.js +1 -1
  198. package/dist/cdn/pdf-viewer/snice-pdf-viewer.min.js +1 -1
  199. package/dist/cdn/permission-matrix/snice-permission-matrix.js +1 -1
  200. package/dist/cdn/permission-matrix/snice-permission-matrix.min.js +1 -1
  201. package/dist/cdn/podcast-player/snice-podcast-player.js +1 -1
  202. package/dist/cdn/podcast-player/snice-podcast-player.min.js +1 -1
  203. package/dist/cdn/pricing-table/snice-pricing-table.js +1 -1
  204. package/dist/cdn/pricing-table/snice-pricing-table.min.js +1 -1
  205. package/dist/cdn/product-card/snice-product-card.js +1 -1
  206. package/dist/cdn/product-card/snice-product-card.min.js +1 -1
  207. package/dist/cdn/progress/snice-progress.js +1 -1
  208. package/dist/cdn/progress/snice-progress.min.js +1 -1
  209. package/dist/cdn/progress-ring/snice-progress-ring.js +1 -1
  210. package/dist/cdn/progress-ring/snice-progress-ring.min.js +1 -1
  211. package/dist/cdn/qr-code/snice-qr-code.js +1 -1
  212. package/dist/cdn/qr-code/snice-qr-code.min.js +1 -1
  213. package/dist/cdn/qr-reader/snice-qr-reader.js +1 -1
  214. package/dist/cdn/qr-reader/snice-qr-reader.min.js +1 -1
  215. package/dist/cdn/radio/snice-radio.js +1 -1
  216. package/dist/cdn/radio/snice-radio.min.js +1 -1
  217. package/dist/cdn/range-slider/snice-range-slider.js +1 -1
  218. package/dist/cdn/range-slider/snice-range-slider.min.js +1 -1
  219. package/dist/cdn/rating/snice-rating.js +1 -1
  220. package/dist/cdn/rating/snice-rating.min.js +1 -1
  221. package/dist/cdn/receipt/snice-receipt.js +1 -1
  222. package/dist/cdn/receipt/snice-receipt.min.js +1 -1
  223. package/dist/cdn/recipe/snice-recipe.js +1 -1
  224. package/dist/cdn/recipe/snice-recipe.min.js +1 -1
  225. package/dist/cdn/runtime/README.md +2 -2
  226. package/dist/cdn/runtime/snice-runtime.esm.js +73 -5
  227. package/dist/cdn/runtime/snice-runtime.esm.js.map +1 -1
  228. package/dist/cdn/runtime/snice-runtime.esm.min.js +8 -8
  229. package/dist/cdn/runtime/snice-runtime.esm.min.js.map +1 -1
  230. package/dist/cdn/runtime/snice-runtime.js +73 -4
  231. package/dist/cdn/runtime/snice-runtime.js.map +1 -1
  232. package/dist/cdn/runtime/snice-runtime.min.js +7 -7
  233. package/dist/cdn/runtime/snice-runtime.min.js.map +1 -1
  234. package/dist/cdn/sankey/snice-sankey.js +1 -1
  235. package/dist/cdn/sankey/snice-sankey.min.js +1 -1
  236. package/dist/cdn/segmented-control/snice-segmented-control.js +1 -1
  237. package/dist/cdn/segmented-control/snice-segmented-control.min.js +1 -1
  238. package/dist/cdn/select/snice-select.js +1 -1
  239. package/dist/cdn/select/snice-select.min.js +1 -1
  240. package/dist/cdn/skeleton/snice-skeleton.js +1 -1
  241. package/dist/cdn/skeleton/snice-skeleton.min.js +1 -1
  242. package/dist/cdn/slider/snice-slider.js +1 -1
  243. package/dist/cdn/slider/snice-slider.min.js +1 -1
  244. package/dist/cdn/sortable/snice-sortable.js +1 -1
  245. package/dist/cdn/sortable/snice-sortable.min.js +1 -1
  246. package/dist/cdn/sparkline/snice-sparkline.js +1 -1
  247. package/dist/cdn/sparkline/snice-sparkline.min.js +1 -1
  248. package/dist/cdn/spinner/snice-spinner.js +1 -1
  249. package/dist/cdn/spinner/snice-spinner.min.js +1 -1
  250. package/dist/cdn/split-button/snice-split-button.js +1 -1
  251. package/dist/cdn/split-button/snice-split-button.min.js +1 -1
  252. package/dist/cdn/split-pane/snice-split-pane.js +1 -1
  253. package/dist/cdn/split-pane/snice-split-pane.min.js +1 -1
  254. package/dist/cdn/spotlight/snice-spotlight.js +1 -1
  255. package/dist/cdn/spotlight/snice-spotlight.min.js +1 -1
  256. package/dist/cdn/spreadsheet/snice-spreadsheet.js +1 -1
  257. package/dist/cdn/spreadsheet/snice-spreadsheet.min.js +1 -1
  258. package/dist/cdn/stat-group/snice-stat-group.js +1 -1
  259. package/dist/cdn/stat-group/snice-stat-group.min.js +1 -1
  260. package/dist/cdn/step-input/snice-step-input.js +1 -1
  261. package/dist/cdn/step-input/snice-step-input.min.js +1 -1
  262. package/dist/cdn/stepper/snice-stepper.js +1 -1
  263. package/dist/cdn/stepper/snice-stepper.min.js +1 -1
  264. package/dist/cdn/switch/snice-switch.js +1 -1
  265. package/dist/cdn/switch/snice-switch.min.js +1 -1
  266. package/dist/cdn/table/README.md +1 -1
  267. package/dist/cdn/table/snice-table.js +2 -2
  268. package/dist/cdn/table/snice-table.js.map +1 -1
  269. package/dist/cdn/table/snice-table.min.js +2 -2
  270. package/dist/cdn/table/snice-table.min.js.map +1 -1
  271. package/dist/cdn/tabs/snice-tabs.js +1 -1
  272. package/dist/cdn/tabs/snice-tabs.min.js +1 -1
  273. package/dist/cdn/tag/snice-tag.js +1 -1
  274. package/dist/cdn/tag/snice-tag.min.js +1 -1
  275. package/dist/cdn/tag-input/snice-tag-input.js +1 -1
  276. package/dist/cdn/tag-input/snice-tag-input.min.js +1 -1
  277. package/dist/cdn/terminal/snice-terminal.js +1 -1
  278. package/dist/cdn/terminal/snice-terminal.min.js +1 -1
  279. package/dist/cdn/testimonial/snice-testimonial.js +1 -1
  280. package/dist/cdn/testimonial/snice-testimonial.min.js +1 -1
  281. package/dist/cdn/textarea/snice-textarea.js +1 -1
  282. package/dist/cdn/textarea/snice-textarea.min.js +1 -1
  283. package/dist/cdn/time-picker/snice-time-picker.js +1 -1
  284. package/dist/cdn/time-picker/snice-time-picker.min.js +1 -1
  285. package/dist/cdn/time-range-picker/snice-time-range-picker.js +1 -1
  286. package/dist/cdn/time-range-picker/snice-time-range-picker.min.js +1 -1
  287. package/dist/cdn/timeline/snice-timeline.js +1 -1
  288. package/dist/cdn/timeline/snice-timeline.min.js +1 -1
  289. package/dist/cdn/timer/snice-timer.js +1 -1
  290. package/dist/cdn/timer/snice-timer.min.js +1 -1
  291. package/dist/cdn/toast/snice-toast.js +1 -1
  292. package/dist/cdn/toast/snice-toast.min.js +1 -1
  293. package/dist/cdn/tooltip/snice-tooltip.js +1 -1
  294. package/dist/cdn/tooltip/snice-tooltip.min.js +1 -1
  295. package/dist/cdn/tree/snice-tree.js +1 -1
  296. package/dist/cdn/tree/snice-tree.min.js +1 -1
  297. package/dist/cdn/treemap/snice-treemap.js +1 -1
  298. package/dist/cdn/treemap/snice-treemap.min.js +1 -1
  299. package/dist/cdn/user-card/snice-user-card.js +1 -1
  300. package/dist/cdn/user-card/snice-user-card.min.js +1 -1
  301. package/dist/cdn/video-player/snice-video-player.js +1 -1
  302. package/dist/cdn/video-player/snice-video-player.min.js +1 -1
  303. package/dist/cdn/virtual-scroller/snice-virtual-scroller.js +1 -1
  304. package/dist/cdn/virtual-scroller/snice-virtual-scroller.min.js +1 -1
  305. package/dist/cdn/waterfall/snice-waterfall.js +1 -1
  306. package/dist/cdn/waterfall/snice-waterfall.min.js +1 -1
  307. package/dist/cdn/weather/snice-weather.js +1 -1
  308. package/dist/cdn/weather/snice-weather.min.js +1 -1
  309. package/dist/cdn/work-order/snice-work-order.js +1 -1
  310. package/dist/cdn/work-order/snice-work-order.min.js +1 -1
  311. package/dist/components/action-bar/snice-action-bar.d.ts +22 -0
  312. package/dist/components/action-bar/snice-action-bar.js +182 -0
  313. package/dist/components/action-bar/snice-action-bar.js.map +1 -0
  314. package/dist/components/action-bar/snice-action-bar.types.d.ts +17 -0
  315. package/dist/components/binpack/snice-binpack.d.ts +82 -0
  316. package/dist/components/binpack/snice-binpack.js +970 -0
  317. package/dist/components/binpack/snice-binpack.js.map +1 -0
  318. package/dist/components/binpack/snice-binpack.types.d.ts +52 -0
  319. package/dist/components/button/snice-button.js +1 -1
  320. package/dist/components/button/snice-button.js.map +1 -1
  321. package/dist/create-request-handler.d.ts +42 -0
  322. package/dist/index.cjs +70 -1
  323. package/dist/index.cjs.map +1 -1
  324. package/dist/index.d.ts +2 -0
  325. package/dist/index.esm.js +70 -2
  326. package/dist/index.esm.js.map +1 -1
  327. package/dist/index.iife.js +70 -1
  328. package/dist/index.iife.js.map +1 -1
  329. package/dist/react/useRequestHandler.d.ts +56 -0
  330. package/dist/react/useRequestHandler.js +103 -0
  331. package/dist/react/useRequestHandler.js.map +1 -0
  332. package/dist/symbols.cjs +1 -1
  333. package/dist/symbols.esm.js +1 -1
  334. package/dist/transitions.cjs +1 -1
  335. package/dist/transitions.esm.js +1 -1
  336. package/docs/ai/DEVELOPMENT.md +1 -1
  337. package/docs/ai/components/accordion.md +46 -80
  338. package/docs/ai/components/action-bar.md +75 -0
  339. package/docs/ai/components/activity-feed.md +7 -7
  340. package/docs/ai/components/alert.md +26 -44
  341. package/docs/ai/components/app-tiles.md +34 -39
  342. package/docs/ai/components/approval-flow.md +1 -1
  343. package/docs/ai/components/audio-recorder.md +35 -67
  344. package/docs/ai/components/availability.md +13 -34
  345. package/docs/ai/components/avatar-group.md +26 -13
  346. package/docs/ai/components/avatar.md +52 -36
  347. package/docs/ai/components/badge.md +21 -32
  348. package/docs/ai/components/banner.md +21 -43
  349. package/docs/ai/components/binpack.md +89 -0
  350. package/docs/ai/components/book.md +25 -23
  351. package/docs/ai/components/booking.md +31 -36
  352. package/docs/ai/components/breadcrumbs.md +36 -11
  353. package/docs/ai/components/button.md +33 -44
  354. package/docs/ai/components/calendar.md +37 -70
  355. package/docs/ai/components/camera-annotate.md +31 -64
  356. package/docs/ai/components/camera.md +38 -120
  357. package/docs/ai/components/candlestick.md +32 -52
  358. package/docs/ai/components/card.md +20 -30
  359. package/docs/ai/components/carousel.md +32 -32
  360. package/docs/ai/components/cart.md +24 -29
  361. package/docs/ai/components/chart.md +29 -114
  362. package/docs/ai/components/chat.md +38 -75
  363. package/docs/ai/components/checkbox.md +22 -41
  364. package/docs/ai/components/chip.md +18 -54
  365. package/docs/ai/components/code-block.md +57 -178
  366. package/docs/ai/components/color-display.md +12 -32
  367. package/docs/ai/components/color-picker.md +17 -39
  368. package/docs/ai/components/command-palette.md +49 -71
  369. package/docs/ai/components/comments.md +55 -36
  370. package/docs/ai/components/countdown.md +28 -30
  371. package/docs/ai/components/cropper.md +33 -33
  372. package/docs/ai/components/data-card.md +20 -14
  373. package/docs/ai/components/date-picker.md +40 -47
  374. package/docs/ai/components/date-range-picker.md +31 -15
  375. package/docs/ai/components/date-time-picker.md +23 -46
  376. package/docs/ai/components/diff.md +30 -31
  377. package/docs/ai/components/divider.md +17 -47
  378. package/docs/ai/components/doc.md +43 -68
  379. package/docs/ai/components/draw.md +35 -87
  380. package/docs/ai/components/drawer.md +48 -77
  381. package/docs/ai/components/empty-state.md +10 -44
  382. package/docs/ai/components/estimate.md +33 -58
  383. package/docs/ai/components/file-gallery.md +48 -100
  384. package/docs/ai/components/file-upload.md +17 -53
  385. package/docs/ai/components/flip-card.md +31 -23
  386. package/docs/ai/components/flow.md +37 -65
  387. package/docs/ai/components/form-builder.md +35 -75
  388. package/docs/ai/components/form-layout.md +10 -20
  389. package/docs/ai/components/funnel.md +33 -48
  390. package/docs/ai/components/gantt.md +27 -23
  391. package/docs/ai/components/gauge.md +16 -17
  392. package/docs/ai/components/heatmap.md +21 -21
  393. package/docs/ai/components/image.md +7 -13
  394. package/docs/ai/components/input.md +38 -70
  395. package/docs/ai/components/invoice.md +35 -36
  396. package/docs/ai/components/kanban.md +32 -61
  397. package/docs/ai/components/key-value.md +32 -16
  398. package/docs/ai/components/kpi.md +38 -73
  399. package/docs/ai/components/layout.md +29 -23
  400. package/docs/ai/components/leaderboard.md +28 -37
  401. package/docs/ai/components/link-preview.md +12 -18
  402. package/docs/ai/components/link.md +10 -7
  403. package/docs/ai/components/list.md +21 -5
  404. package/docs/ai/components/location.md +21 -25
  405. package/docs/ai/components/login.md +14 -9
  406. package/docs/ai/components/map.md +27 -33
  407. package/docs/ai/components/markdown.md +20 -24
  408. package/docs/ai/components/masonry.md +10 -14
  409. package/docs/ai/components/mentions.md +26 -12
  410. package/docs/ai/components/menu.md +54 -52
  411. package/docs/ai/components/message-strip.md +20 -20
  412. package/docs/ai/components/metric-table.md +14 -21
  413. package/docs/ai/components/modal.md +27 -18
  414. package/docs/ai/components/music-player.md +49 -41
  415. package/docs/ai/components/nav.md +34 -31
  416. package/docs/ai/components/network-graph.md +27 -42
  417. package/docs/ai/components/notification-center.md +31 -33
  418. package/docs/ai/components/order-tracker.md +36 -27
  419. package/docs/ai/components/org-chart.md +36 -31
  420. package/docs/ai/components/pagination.md +34 -26
  421. package/docs/ai/components/paint.md +53 -91
  422. package/docs/ai/components/pdf-viewer.md +35 -36
  423. package/docs/ai/components/permission-matrix.md +26 -31
  424. package/docs/ai/components/podcast-player.md +64 -70
  425. package/docs/ai/components/pricing-table.md +37 -48
  426. package/docs/ai/components/product-card.md +58 -41
  427. package/docs/ai/components/progress-ring.md +20 -24
  428. package/docs/ai/components/progress.md +28 -45
  429. package/docs/ai/components/qr-code.md +25 -27
  430. package/docs/ai/components/qr-reader.md +20 -23
  431. package/docs/ai/components/radio.md +17 -15
  432. package/docs/ai/components/range-slider.md +22 -11
  433. package/docs/ai/components/rating.md +29 -33
  434. package/docs/ai/components/receipt.md +50 -127
  435. package/docs/ai/components/recipe.md +44 -42
  436. package/docs/ai/components/sankey.md +21 -30
  437. package/docs/ai/components/scheduler.md +29 -41
  438. package/docs/ai/components/segmented-control.md +11 -15
  439. package/docs/ai/components/select.md +58 -102
  440. package/docs/ai/components/skeleton.md +16 -30
  441. package/docs/ai/components/slider.md +26 -20
  442. package/docs/ai/components/sortable.md +25 -27
  443. package/docs/ai/components/sparkline.md +21 -17
  444. package/docs/ai/components/spinner.md +9 -5
  445. package/docs/ai/components/split-button.md +10 -13
  446. package/docs/ai/components/split-pane.md +19 -14
  447. package/docs/ai/components/spotlight.md +31 -26
  448. package/docs/ai/components/spreadsheet.md +51 -97
  449. package/docs/ai/components/stat-group.md +9 -19
  450. package/docs/ai/components/step-input.md +17 -15
  451. package/docs/ai/components/stepper.md +14 -15
  452. package/docs/ai/components/switch.md +15 -9
  453. package/docs/ai/components/table.md +24 -84
  454. package/docs/ai/components/tabs.md +18 -10
  455. package/docs/ai/components/tag-input.md +18 -29
  456. package/docs/ai/components/tag.md +10 -22
  457. package/docs/ai/components/terminal.md +9 -9
  458. package/docs/ai/components/testimonial.md +9 -19
  459. package/docs/ai/components/textarea.md +15 -16
  460. package/docs/ai/components/theme.md +3 -3
  461. package/docs/ai/components/time-picker.md +30 -49
  462. package/docs/ai/components/time-range-picker.md +16 -15
  463. package/docs/ai/components/timeline.md +5 -4
  464. package/docs/ai/components/timer.md +8 -8
  465. package/docs/ai/components/toast.md +24 -18
  466. package/docs/ai/components/tooltip.md +11 -22
  467. package/docs/ai/components/tree.md +9 -9
  468. package/docs/ai/components/treemap.md +14 -13
  469. package/docs/ai/components/user-card.md +21 -27
  470. package/docs/ai/components/video-player.md +35 -52
  471. package/docs/ai/components/virtual-scroller.md +1 -1
  472. package/docs/ai/components/waterfall.md +17 -16
  473. package/docs/ai/components/weather.md +19 -34
  474. package/docs/ai/components/work-order.md +58 -134
  475. package/docs/ai/patterns.md +63 -0
  476. package/docs/components/accordion.md +72 -151
  477. package/docs/components/action-bar.md +185 -0
  478. package/docs/components/activity-feed.md +9 -14
  479. package/docs/components/alert.md +17 -109
  480. package/docs/components/app-tiles.md +58 -43
  481. package/docs/components/approval-flow.md +8 -14
  482. package/docs/components/audio-recorder.md +45 -51
  483. package/docs/components/availability.md +30 -45
  484. package/docs/components/avatar-group.md +34 -14
  485. package/docs/components/avatar.md +20 -55
  486. package/docs/components/badge.md +53 -470
  487. package/docs/components/banner.md +44 -30
  488. package/docs/components/binpack.md +208 -0
  489. package/docs/components/book.md +78 -57
  490. package/docs/components/booking.md +35 -87
  491. package/docs/components/breadcrumbs.md +74 -448
  492. package/docs/components/button.md +72 -603
  493. package/docs/components/calendar.md +77 -261
  494. package/docs/components/camera-annotate.md +44 -96
  495. package/docs/components/camera.md +94 -333
  496. package/docs/components/candlestick.md +79 -116
  497. package/docs/components/card.md +51 -689
  498. package/docs/components/carousel.md +29 -76
  499. package/docs/components/cart.md +44 -136
  500. package/docs/components/chart.md +95 -438
  501. package/docs/components/chat.md +175 -439
  502. package/docs/components/checkbox.md +52 -609
  503. package/docs/components/chip.md +45 -574
  504. package/docs/components/code-block.md +157 -421
  505. package/docs/components/color-display.md +45 -54
  506. package/docs/components/color-picker.md +103 -36
  507. package/docs/components/command-palette.md +98 -92
  508. package/docs/components/comments.md +16 -10
  509. package/docs/components/countdown.md +15 -20
  510. package/docs/components/cropper.md +14 -16
  511. package/docs/components/data-card.md +16 -15
  512. package/docs/components/date-picker.md +45 -25
  513. package/docs/components/date-range-picker.md +140 -87
  514. package/docs/components/date-time-picker.md +25 -28
  515. package/docs/components/diff.md +22 -17
  516. package/docs/components/divider.md +18 -20
  517. package/docs/components/doc.md +105 -197
  518. package/docs/components/draw.md +117 -223
  519. package/docs/components/drawer.md +113 -478
  520. package/docs/components/empty-state.md +13 -29
  521. package/docs/components/estimate.md +58 -118
  522. package/docs/components/file-gallery.md +123 -495
  523. package/docs/components/file-upload.md +36 -123
  524. package/docs/components/flip-card.md +30 -34
  525. package/docs/components/flow.md +74 -89
  526. package/docs/components/form-builder.md +59 -86
  527. package/docs/components/form-layout.md +21 -31
  528. package/docs/components/funnel.md +21 -22
  529. package/docs/components/gantt.md +5 -5
  530. package/docs/components/gauge.md +5 -23
  531. package/docs/components/heatmap.md +13 -55
  532. package/docs/components/image.md +28 -32
  533. package/docs/components/input.md +25 -14
  534. package/docs/components/invoice.md +34 -33
  535. package/docs/components/kanban.md +99 -394
  536. package/docs/components/key-value.md +22 -12
  537. package/docs/components/kpi.md +41 -112
  538. package/docs/components/layout.md +7 -13
  539. package/docs/components/leaderboard.md +52 -76
  540. package/docs/components/link-preview.md +20 -16
  541. package/docs/components/link.md +22 -19
  542. package/docs/components/list.md +44 -26
  543. package/docs/components/location.md +9 -13
  544. package/docs/components/login.md +42 -36
  545. package/docs/components/map.md +24 -46
  546. package/docs/components/markdown.md +14 -25
  547. package/docs/components/masonry.md +15 -13
  548. package/docs/components/mentions.md +36 -25
  549. package/docs/components/menu.md +39 -46
  550. package/docs/components/message-strip.md +15 -51
  551. package/docs/components/metric-table.md +50 -72
  552. package/docs/components/modal.md +32 -43
  553. package/docs/components/music-player.md +41 -49
  554. package/docs/components/nav.md +23 -13
  555. package/docs/components/network-graph.md +14 -13
  556. package/docs/components/notification-center.md +68 -172
  557. package/docs/components/order-tracker.md +72 -117
  558. package/docs/components/org-chart.md +58 -207
  559. package/docs/components/pagination.md +67 -89
  560. package/docs/components/paint.md +86 -172
  561. package/docs/components/pdf-viewer.md +46 -151
  562. package/docs/components/permission-matrix.md +61 -112
  563. package/docs/components/podcast-player.md +41 -119
  564. package/docs/components/pricing-table.md +104 -147
  565. package/docs/components/product-card.md +94 -197
  566. package/docs/components/progress-ring.md +29 -32
  567. package/docs/components/progress.md +30 -61
  568. package/docs/components/qr-code.md +53 -61
  569. package/docs/components/qr-reader.md +53 -42
  570. package/docs/components/radio.md +42 -40
  571. package/docs/components/range-slider.md +41 -30
  572. package/docs/components/rating.md +50 -84
  573. package/docs/components/receipt.md +91 -129
  574. package/docs/components/recipe.md +107 -216
  575. package/docs/components/sankey.md +47 -83
  576. package/docs/components/scheduler.md +81 -184
  577. package/docs/components/segmented-control.md +48 -40
  578. package/docs/components/select.md +107 -129
  579. package/docs/components/skeleton.md +33 -47
  580. package/docs/components/slider.md +49 -53
  581. package/docs/components/sortable.md +43 -186
  582. package/docs/components/sparkline.md +26 -25
  583. package/docs/components/spinner.md +32 -37
  584. package/docs/components/split-button.md +43 -23
  585. package/docs/components/split-pane.md +41 -58
  586. package/docs/components/spotlight.md +53 -145
  587. package/docs/components/spreadsheet.md +84 -307
  588. package/docs/components/stat-group.md +27 -61
  589. package/docs/components/step-input.md +44 -41
  590. package/docs/components/stepper.md +55 -89
  591. package/docs/components/switch.md +39 -39
  592. package/docs/components/table.md +27 -32
  593. package/docs/components/tabs.md +36 -27
  594. package/docs/components/tag-input.md +50 -176
  595. package/docs/components/tag.md +12 -50
  596. package/docs/components/terminal.md +32 -37
  597. package/docs/components/testimonial.md +24 -81
  598. package/docs/components/textarea.md +9 -14
  599. package/docs/components/theme.md +10 -23
  600. package/docs/components/time-picker.md +48 -72
  601. package/docs/components/time-range-picker.md +22 -41
  602. package/docs/components/timeline.md +7 -14
  603. package/docs/components/timer.md +16 -32
  604. package/docs/components/toast.md +19 -45
  605. package/docs/components/tooltip.md +13 -115
  606. package/docs/components/tree.md +2 -19
  607. package/docs/components/treemap.md +19 -43
  608. package/docs/components/user-card.md +13 -22
  609. package/docs/components/video-player.md +53 -227
  610. package/docs/components/virtual-scroller.md +11 -44
  611. package/docs/components/waterfall.md +58 -137
  612. package/docs/components/weather.md +94 -153
  613. package/docs/components/work-order.md +56 -143
  614. package/docs/plans/2026-03-09-action-bar-design.md +104 -0
  615. package/docs/plans/2026-03-09-action-bar-plan.md +676 -0
  616. package/docs/plans/2026-03-10-react-integration-design.md +166 -0
  617. package/docs/request-response.md +77 -0
  618. package/package.json +1 -1
@@ -0,0 +1,1037 @@
1
+ /*!
2
+ * snice v4.29.0
3
+ * A decorator-driven web component library with differential rendering, routing, controllers, and 130+ ready-made UI components. Use as much or as little as you want. Zero dependencies, works anywhere.
4
+ * (c) 2024
5
+ * Released under the MIT License.
6
+ */
7
+ if(typeof globalThis.Snice==="undefined"){console.warn("[snice] snice-runtime.min.js must be loaded before snice-binpack.min.js");}
8
+ var SniceBinpack = (function (exports, snice) {
9
+ 'use strict';
10
+
11
+ /******************************************************************************
12
+ Copyright (c) Microsoft Corporation.
13
+
14
+ Permission to use, copy, modify, and/or distribute this software for any
15
+ purpose with or without fee is hereby granted.
16
+
17
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
18
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
19
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
20
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
21
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
22
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
23
+ PERFORMANCE OF THIS SOFTWARE.
24
+ ***************************************************************************** */
25
+ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
26
+
27
+
28
+ function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
29
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
30
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
31
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
32
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
33
+ var _, done = false;
34
+ for (var i = decorators.length - 1; i >= 0; i--) {
35
+ var context = {};
36
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
37
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
38
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
39
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
40
+ if (kind === "accessor") {
41
+ if (result === void 0) continue;
42
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
43
+ if (_ = accept(result.get)) descriptor.get = _;
44
+ if (_ = accept(result.set)) descriptor.set = _;
45
+ if (_ = accept(result.init)) initializers.unshift(_);
46
+ }
47
+ else if (_ = accept(result)) {
48
+ if (kind === "field") initializers.unshift(_);
49
+ else descriptor[key] = _;
50
+ }
51
+ }
52
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
53
+ done = true;
54
+ }
55
+ function __runInitializers(thisArg, initializers, value) {
56
+ var useValue = arguments.length > 2;
57
+ for (var i = 0; i < initializers.length; i++) {
58
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
59
+ }
60
+ return useValue ? value : void 0;
61
+ }
62
+ typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
63
+ var e = new Error(message);
64
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
65
+ };
66
+
67
+ var cssContent = ":host{display:block;position:relative;width:100%;font-family:var(--snice-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif);contain:layout style;--binpack-gap:1rem;--binpack-transition-duration:0.4s}.binpack{position:relative;width:100%;min-height:1rem}::slotted(*){position:absolute;top:0;left:0;box-sizing:border-box}::slotted([hidden]){display:none!important}:host([ready]) ::slotted(*){transition:transform var(--binpack-transition-duration) ease}::slotted(.binpack-dragging){z-index:100;opacity:.9;transition:none!important;cursor:grabbing!important;user-select:none}::slotted(.binpack-positioning){z-index:99}:host([draggable]) ::slotted(*){cursor:grab}.binpack-drop-placeholder{position:absolute;top:0;left:0;outline:rgba(128,128,128,.5) dashed 3px;outline-offset:-6px;border-radius:4px;transition:transform .2s;pointer-events:none;display:none}.binpack-drop-placeholder.visible{display:block}";
68
+
69
+ // ---------------------------------------------------------------------------
70
+ // Rect helpers
71
+ // ---------------------------------------------------------------------------
72
+ function rectContains(outer, inner) {
73
+ return (inner.x >= outer.x &&
74
+ inner.y >= outer.y &&
75
+ inner.x + inner.width <= outer.x + outer.width &&
76
+ inner.y + inner.height <= outer.y + outer.height);
77
+ }
78
+ function rectOverlaps(a, b) {
79
+ return (a.x < b.x + b.width &&
80
+ a.x + a.width > b.x &&
81
+ a.y < b.y + b.height &&
82
+ a.y + a.height > b.y);
83
+ }
84
+ function canFit(space, item) {
85
+ // 1px tolerance for sub-pixel rounding errors
86
+ return space.width >= item.width - 1 && space.height >= item.height - 1;
87
+ }
88
+ /**
89
+ * After placing `placed` inside `space`, return up to 4 remaining sub-rects
90
+ * (top, right, bottom, left strips).
91
+ */
92
+ function getMaximalFreeRects(space, placed) {
93
+ const rects = [];
94
+ // Top strip
95
+ if (placed.y > space.y) {
96
+ rects.push({ x: space.x, y: space.y, width: space.width, height: placed.y - space.y });
97
+ }
98
+ // Bottom strip
99
+ const placedBottom = placed.y + placed.height;
100
+ const spaceBottom = space.y + space.height;
101
+ if (placedBottom < spaceBottom) {
102
+ rects.push({ x: space.x, y: placedBottom, width: space.width, height: spaceBottom - placedBottom });
103
+ }
104
+ // Left strip
105
+ if (placed.x > space.x) {
106
+ rects.push({ x: space.x, y: space.y, width: placed.x - space.x, height: space.height });
107
+ }
108
+ // Right strip
109
+ const placedRight = placed.x + placed.width;
110
+ const spaceRight = space.x + space.width;
111
+ if (placedRight < spaceRight) {
112
+ rects.push({ x: placedRight, y: space.y, width: spaceRight - placedRight, height: space.height });
113
+ }
114
+ return rects;
115
+ }
116
+ // ---------------------------------------------------------------------------
117
+ // Packer
118
+ // ---------------------------------------------------------------------------
119
+ class Packer {
120
+ constructor(width, height, horizontal) {
121
+ this.width = width;
122
+ this.height = height;
123
+ this.horizontal = horizontal;
124
+ this.spaces = [{ x: 0, y: 0, width, height }];
125
+ }
126
+ /**
127
+ * Snap item dimensions to the nearest grid multiple.
128
+ * If gridSize is set, round UP to the next (gridSize + gutter) multiple.
129
+ */
130
+ applyGrid(measurement, gridSize, gutter) {
131
+ if (!gridSize)
132
+ return measurement;
133
+ const gridWithGutter = gridSize + gutter;
134
+ const remainder = measurement % gridWithGutter;
135
+ const method = remainder && remainder < 1 ? 'round' : 'ceil';
136
+ return Math[method](measurement / gridWithGutter) * gridWithGutter;
137
+ }
138
+ /**
139
+ * Find first fitting space and return the placement position.
140
+ * If columnWidth/rowHeight are provided, snap item SIZE to grid.
141
+ */
142
+ pack(itemWidth, itemHeight, columnWidth, rowHeight, gutter) {
143
+ // Snap item size to grid multiples
144
+ const w = this.applyGrid(itemWidth, columnWidth, gutter);
145
+ const h = this.applyGrid(itemHeight, rowHeight, gutter);
146
+ // Clamp to packer bounds
147
+ const item = {
148
+ x: 0, y: 0,
149
+ width: Math.min(w, this.width),
150
+ height: Math.min(h, this.height),
151
+ };
152
+ for (const space of this.spaces) {
153
+ if (canFit(space, item)) {
154
+ item.x = space.x;
155
+ item.y = space.y;
156
+ this.placed(item);
157
+ return { x: space.x, y: space.y };
158
+ }
159
+ }
160
+ return null;
161
+ }
162
+ /**
163
+ * Update free spaces after an item has been placed.
164
+ */
165
+ placed(placed) {
166
+ const newSpaces = [];
167
+ for (const space of this.spaces) {
168
+ if (rectOverlaps(space, placed)) {
169
+ const subs = getMaximalFreeRects(space, placed);
170
+ newSpaces.push(...subs);
171
+ }
172
+ else {
173
+ newSpaces.push(space);
174
+ }
175
+ }
176
+ this.spaces = newSpaces;
177
+ this.mergeSortSpaces();
178
+ }
179
+ /**
180
+ * Remove spaces fully contained within larger ones, then sort.
181
+ */
182
+ mergeSortSpaces() {
183
+ // Remove contained spaces
184
+ this.spaces = this.spaces.filter((space, i, arr) => {
185
+ for (let j = 0; j < arr.length; j++) {
186
+ if (i !== j && rectContains(arr[j], space)) {
187
+ return false;
188
+ }
189
+ }
190
+ return true;
191
+ });
192
+ // Sort: vertical = downward-left-to-right, horizontal = rightward-top-to-bottom
193
+ if (this.horizontal) {
194
+ this.spaces.sort((a, b) => a.x - b.x || a.y - b.y);
195
+ }
196
+ else {
197
+ this.spaces.sort((a, b) => a.y - b.y || a.x - b.x);
198
+ }
199
+ }
200
+ }
201
+ // ---------------------------------------------------------------------------
202
+ // Component
203
+ // ---------------------------------------------------------------------------
204
+ let SniceBinpack = (() => {
205
+ let _classDecorators = [snice.element('snice-binpack')];
206
+ let _classDescriptor;
207
+ let _classExtraInitializers = [];
208
+ let _classThis;
209
+ let _classSuper = HTMLElement;
210
+ let _instanceExtraInitializers = [];
211
+ let _gap_decorators;
212
+ let _gap_initializers = [];
213
+ let _gap_extraInitializers = [];
214
+ let _columnWidth_decorators;
215
+ let _columnWidth_initializers = [];
216
+ let _columnWidth_extraInitializers = [];
217
+ let _rowHeight_decorators;
218
+ let _rowHeight_initializers = [];
219
+ let _rowHeight_extraInitializers = [];
220
+ let _horizontal_decorators;
221
+ let _horizontal_initializers = [];
222
+ let _horizontal_extraInitializers = [];
223
+ let _originLeft_decorators;
224
+ let _originLeft_initializers = [];
225
+ let _originLeft_extraInitializers = [];
226
+ let _originTop_decorators;
227
+ let _originTop_initializers = [];
228
+ let _originTop_extraInitializers = [];
229
+ let _transitionDuration_decorators;
230
+ let _transitionDuration_initializers = [];
231
+ let _transitionDuration_extraInitializers = [];
232
+ let _stagger_decorators;
233
+ let _stagger_initializers = [];
234
+ let _stagger_extraInitializers = [];
235
+ let _resize_decorators;
236
+ let _resize_initializers = [];
237
+ let _resize_extraInitializers = [];
238
+ let _draggable_decorators;
239
+ let _draggable_initializers = [];
240
+ let _draggable_extraInitializers = [];
241
+ let _dragThrottle_decorators;
242
+ let _dragThrottle_initializers = [];
243
+ let _dragThrottle_extraInitializers = [];
244
+ let _container_decorators;
245
+ let _container_initializers = [];
246
+ let _container_extraInitializers = [];
247
+ let _slotElement_decorators;
248
+ let _slotElement_initializers = [];
249
+ let _slotElement_extraInitializers = [];
250
+ let _dropPlaceholder_decorators;
251
+ let _dropPlaceholder_initializers = [];
252
+ let _dropPlaceholder_extraInitializers = [];
253
+ let _onReady_decorators;
254
+ let _onDispose_decorators;
255
+ let _onGapChange_decorators;
256
+ let _onTransitionDurationChange_decorators;
257
+ let _onColumnWidthChange_decorators;
258
+ let _onRowHeightChange_decorators;
259
+ let _onHorizontalChange_decorators;
260
+ let _onOriginLeftChange_decorators;
261
+ let _onOriginTopChange_decorators;
262
+ let _onResizeChange_decorators;
263
+ let _onDraggableChange_decorators;
264
+ let _emitLayoutComplete_decorators;
265
+ let _emitFitComplete_decorators;
266
+ let _emitDragItemPositioned_decorators;
267
+ let _template_decorators;
268
+ let _componentStyles_decorators;
269
+ (class extends _classSuper {
270
+ static { _classThis = this; }
271
+ constructor() {
272
+ super(...arguments);
273
+ this.gap = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _gap_initializers, '1rem'));
274
+ this.columnWidth = (__runInitializers(this, _gap_extraInitializers), __runInitializers(this, _columnWidth_initializers, 0));
275
+ this.rowHeight = (__runInitializers(this, _columnWidth_extraInitializers), __runInitializers(this, _rowHeight_initializers, 0));
276
+ this.horizontal = (__runInitializers(this, _rowHeight_extraInitializers), __runInitializers(this, _horizontal_initializers, false));
277
+ this.originLeft = (__runInitializers(this, _horizontal_extraInitializers), __runInitializers(this, _originLeft_initializers, true));
278
+ this.originTop = (__runInitializers(this, _originLeft_extraInitializers), __runInitializers(this, _originTop_initializers, true));
279
+ this.transitionDuration = (__runInitializers(this, _originTop_extraInitializers), __runInitializers(this, _transitionDuration_initializers, '0.4s'));
280
+ this.stagger = (__runInitializers(this, _transitionDuration_extraInitializers), __runInitializers(this, _stagger_initializers, 0));
281
+ this.resize = (__runInitializers(this, _stagger_extraInitializers), __runInitializers(this, _resize_initializers, true));
282
+ this.draggable = (__runInitializers(this, _resize_extraInitializers), __runInitializers(this, _draggable_initializers, false));
283
+ this.dragThrottle = (__runInitializers(this, _draggable_extraInitializers), __runInitializers(this, _dragThrottle_initializers, 120));
284
+ this.container = (__runInitializers(this, _dragThrottle_extraInitializers), __runInitializers(this, _container_initializers, void 0));
285
+ this.slotElement = (__runInitializers(this, _container_extraInitializers), __runInitializers(this, _slotElement_initializers, void 0));
286
+ this.dropPlaceholder = (__runInitializers(this, _slotElement_extraInitializers), __runInitializers(this, _dropPlaceholder_initializers, void 0));
287
+ this.items = (__runInitializers(this, _dropPlaceholder_extraInitializers), []);
288
+ this.stampedElements = new Set();
289
+ this.resizeObserver = null;
290
+ this.itemResizeObserver = null;
291
+ this.layoutScheduled = false;
292
+ // Drag state
293
+ this.dragItemCount = 0;
294
+ this.shiftTargets = [];
295
+ this.shiftTargetKeys = [];
296
+ this.dragItem = null;
297
+ this.dragItemRect = { x: 0, y: 0, width: 0, height: 0 };
298
+ this.dragStartX = 0;
299
+ this.dragStartY = 0;
300
+ this.dragOffsetX = 0;
301
+ this.dragOffsetY = 0;
302
+ this.dragTime = 0;
303
+ this.dragTimeoutId = null;
304
+ this.boundPointerMove = null;
305
+ this.boundPointerUp = null;
306
+ this.pendingLayout = null;
307
+ this.onPointerDown = (e) => {
308
+ if (!this.draggable)
309
+ return;
310
+ // Only handle primary button
311
+ if (e.button !== 0)
312
+ return;
313
+ // Find the direct child item that was clicked
314
+ const target = e.target;
315
+ const item = this.items.find(el => el === target || el.contains(target));
316
+ if (!item || this.stampedElements.has(item))
317
+ return;
318
+ e.preventDefault();
319
+ this.dragItemStart(item, e);
320
+ };
321
+ }
322
+ static {
323
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
324
+ _gap_decorators = [snice.property()];
325
+ _columnWidth_decorators = [snice.property({ type: Number, attribute: 'column-width' })];
326
+ _rowHeight_decorators = [snice.property({ type: Number, attribute: 'row-height' })];
327
+ _horizontal_decorators = [snice.property({ type: Boolean })];
328
+ _originLeft_decorators = [snice.property({ type: Boolean, attribute: 'origin-left' })];
329
+ _originTop_decorators = [snice.property({ type: Boolean, attribute: 'origin-top' })];
330
+ _transitionDuration_decorators = [snice.property({ attribute: 'transition-duration' })];
331
+ _stagger_decorators = [snice.property({ type: Number })];
332
+ _resize_decorators = [snice.property({ type: Boolean })];
333
+ _draggable_decorators = [snice.property({ type: Boolean })];
334
+ _dragThrottle_decorators = [snice.property({ type: Number, attribute: 'drag-throttle' })];
335
+ _container_decorators = [snice.query('.binpack')];
336
+ _slotElement_decorators = [snice.query('slot')];
337
+ _dropPlaceholder_decorators = [snice.query('.binpack-drop-placeholder')];
338
+ _onReady_decorators = [snice.ready()];
339
+ _onDispose_decorators = [snice.dispose()];
340
+ _onGapChange_decorators = [snice.watch('gap')];
341
+ _onTransitionDurationChange_decorators = [snice.watch('transitionDuration')];
342
+ _onColumnWidthChange_decorators = [snice.watch('columnWidth')];
343
+ _onRowHeightChange_decorators = [snice.watch('rowHeight')];
344
+ _onHorizontalChange_decorators = [snice.watch('horizontal')];
345
+ _onOriginLeftChange_decorators = [snice.watch('originLeft')];
346
+ _onOriginTopChange_decorators = [snice.watch('originTop')];
347
+ _onResizeChange_decorators = [snice.watch('resize')];
348
+ _onDraggableChange_decorators = [snice.watch('draggable')];
349
+ _emitLayoutComplete_decorators = [snice.dispatch('binpack-layout-complete', { bubbles: true, composed: true })];
350
+ _emitFitComplete_decorators = [snice.dispatch('binpack-fit-complete', { bubbles: true, composed: true })];
351
+ _emitDragItemPositioned_decorators = [snice.dispatch('binpack-drag-item-positioned', { bubbles: true, composed: true })];
352
+ _template_decorators = [snice.render()];
353
+ _componentStyles_decorators = [snice.styles()];
354
+ __esDecorate(this, null, _onReady_decorators, { kind: "method", name: "onReady", static: false, private: false, access: { has: obj => "onReady" in obj, get: obj => obj.onReady }, metadata: _metadata }, null, _instanceExtraInitializers);
355
+ __esDecorate(this, null, _onDispose_decorators, { kind: "method", name: "onDispose", static: false, private: false, access: { has: obj => "onDispose" in obj, get: obj => obj.onDispose }, metadata: _metadata }, null, _instanceExtraInitializers);
356
+ __esDecorate(this, null, _onGapChange_decorators, { kind: "method", name: "onGapChange", static: false, private: false, access: { has: obj => "onGapChange" in obj, get: obj => obj.onGapChange }, metadata: _metadata }, null, _instanceExtraInitializers);
357
+ __esDecorate(this, null, _onTransitionDurationChange_decorators, { kind: "method", name: "onTransitionDurationChange", static: false, private: false, access: { has: obj => "onTransitionDurationChange" in obj, get: obj => obj.onTransitionDurationChange }, metadata: _metadata }, null, _instanceExtraInitializers);
358
+ __esDecorate(this, null, _onColumnWidthChange_decorators, { kind: "method", name: "onColumnWidthChange", static: false, private: false, access: { has: obj => "onColumnWidthChange" in obj, get: obj => obj.onColumnWidthChange }, metadata: _metadata }, null, _instanceExtraInitializers);
359
+ __esDecorate(this, null, _onRowHeightChange_decorators, { kind: "method", name: "onRowHeightChange", static: false, private: false, access: { has: obj => "onRowHeightChange" in obj, get: obj => obj.onRowHeightChange }, metadata: _metadata }, null, _instanceExtraInitializers);
360
+ __esDecorate(this, null, _onHorizontalChange_decorators, { kind: "method", name: "onHorizontalChange", static: false, private: false, access: { has: obj => "onHorizontalChange" in obj, get: obj => obj.onHorizontalChange }, metadata: _metadata }, null, _instanceExtraInitializers);
361
+ __esDecorate(this, null, _onOriginLeftChange_decorators, { kind: "method", name: "onOriginLeftChange", static: false, private: false, access: { has: obj => "onOriginLeftChange" in obj, get: obj => obj.onOriginLeftChange }, metadata: _metadata }, null, _instanceExtraInitializers);
362
+ __esDecorate(this, null, _onOriginTopChange_decorators, { kind: "method", name: "onOriginTopChange", static: false, private: false, access: { has: obj => "onOriginTopChange" in obj, get: obj => obj.onOriginTopChange }, metadata: _metadata }, null, _instanceExtraInitializers);
363
+ __esDecorate(this, null, _onResizeChange_decorators, { kind: "method", name: "onResizeChange", static: false, private: false, access: { has: obj => "onResizeChange" in obj, get: obj => obj.onResizeChange }, metadata: _metadata }, null, _instanceExtraInitializers);
364
+ __esDecorate(this, null, _onDraggableChange_decorators, { kind: "method", name: "onDraggableChange", static: false, private: false, access: { has: obj => "onDraggableChange" in obj, get: obj => obj.onDraggableChange }, metadata: _metadata }, null, _instanceExtraInitializers);
365
+ __esDecorate(this, null, _emitLayoutComplete_decorators, { kind: "method", name: "emitLayoutComplete", static: false, private: false, access: { has: obj => "emitLayoutComplete" in obj, get: obj => obj.emitLayoutComplete }, metadata: _metadata }, null, _instanceExtraInitializers);
366
+ __esDecorate(this, null, _emitFitComplete_decorators, { kind: "method", name: "emitFitComplete", static: false, private: false, access: { has: obj => "emitFitComplete" in obj, get: obj => obj.emitFitComplete }, metadata: _metadata }, null, _instanceExtraInitializers);
367
+ __esDecorate(this, null, _emitDragItemPositioned_decorators, { kind: "method", name: "emitDragItemPositioned", static: false, private: false, access: { has: obj => "emitDragItemPositioned" in obj, get: obj => obj.emitDragItemPositioned }, metadata: _metadata }, null, _instanceExtraInitializers);
368
+ __esDecorate(this, null, _template_decorators, { kind: "method", name: "template", static: false, private: false, access: { has: obj => "template" in obj, get: obj => obj.template }, metadata: _metadata }, null, _instanceExtraInitializers);
369
+ __esDecorate(this, null, _componentStyles_decorators, { kind: "method", name: "componentStyles", static: false, private: false, access: { has: obj => "componentStyles" in obj, get: obj => obj.componentStyles }, metadata: _metadata }, null, _instanceExtraInitializers);
370
+ __esDecorate(null, null, _gap_decorators, { kind: "field", name: "gap", static: false, private: false, access: { has: obj => "gap" in obj, get: obj => obj.gap, set: (obj, value) => { obj.gap = value; } }, metadata: _metadata }, _gap_initializers, _gap_extraInitializers);
371
+ __esDecorate(null, null, _columnWidth_decorators, { kind: "field", name: "columnWidth", static: false, private: false, access: { has: obj => "columnWidth" in obj, get: obj => obj.columnWidth, set: (obj, value) => { obj.columnWidth = value; } }, metadata: _metadata }, _columnWidth_initializers, _columnWidth_extraInitializers);
372
+ __esDecorate(null, null, _rowHeight_decorators, { kind: "field", name: "rowHeight", static: false, private: false, access: { has: obj => "rowHeight" in obj, get: obj => obj.rowHeight, set: (obj, value) => { obj.rowHeight = value; } }, metadata: _metadata }, _rowHeight_initializers, _rowHeight_extraInitializers);
373
+ __esDecorate(null, null, _horizontal_decorators, { kind: "field", name: "horizontal", static: false, private: false, access: { has: obj => "horizontal" in obj, get: obj => obj.horizontal, set: (obj, value) => { obj.horizontal = value; } }, metadata: _metadata }, _horizontal_initializers, _horizontal_extraInitializers);
374
+ __esDecorate(null, null, _originLeft_decorators, { kind: "field", name: "originLeft", static: false, private: false, access: { has: obj => "originLeft" in obj, get: obj => obj.originLeft, set: (obj, value) => { obj.originLeft = value; } }, metadata: _metadata }, _originLeft_initializers, _originLeft_extraInitializers);
375
+ __esDecorate(null, null, _originTop_decorators, { kind: "field", name: "originTop", static: false, private: false, access: { has: obj => "originTop" in obj, get: obj => obj.originTop, set: (obj, value) => { obj.originTop = value; } }, metadata: _metadata }, _originTop_initializers, _originTop_extraInitializers);
376
+ __esDecorate(null, null, _transitionDuration_decorators, { kind: "field", name: "transitionDuration", static: false, private: false, access: { has: obj => "transitionDuration" in obj, get: obj => obj.transitionDuration, set: (obj, value) => { obj.transitionDuration = value; } }, metadata: _metadata }, _transitionDuration_initializers, _transitionDuration_extraInitializers);
377
+ __esDecorate(null, null, _stagger_decorators, { kind: "field", name: "stagger", static: false, private: false, access: { has: obj => "stagger" in obj, get: obj => obj.stagger, set: (obj, value) => { obj.stagger = value; } }, metadata: _metadata }, _stagger_initializers, _stagger_extraInitializers);
378
+ __esDecorate(null, null, _resize_decorators, { kind: "field", name: "resize", static: false, private: false, access: { has: obj => "resize" in obj, get: obj => obj.resize, set: (obj, value) => { obj.resize = value; } }, metadata: _metadata }, _resize_initializers, _resize_extraInitializers);
379
+ __esDecorate(null, null, _draggable_decorators, { kind: "field", name: "draggable", static: false, private: false, access: { has: obj => "draggable" in obj, get: obj => obj.draggable, set: (obj, value) => { obj.draggable = value; } }, metadata: _metadata }, _draggable_initializers, _draggable_extraInitializers);
380
+ __esDecorate(null, null, _dragThrottle_decorators, { kind: "field", name: "dragThrottle", static: false, private: false, access: { has: obj => "dragThrottle" in obj, get: obj => obj.dragThrottle, set: (obj, value) => { obj.dragThrottle = value; } }, metadata: _metadata }, _dragThrottle_initializers, _dragThrottle_extraInitializers);
381
+ __esDecorate(null, null, _container_decorators, { kind: "field", name: "container", static: false, private: false, access: { has: obj => "container" in obj, get: obj => obj.container, set: (obj, value) => { obj.container = value; } }, metadata: _metadata }, _container_initializers, _container_extraInitializers);
382
+ __esDecorate(null, null, _slotElement_decorators, { kind: "field", name: "slotElement", static: false, private: false, access: { has: obj => "slotElement" in obj, get: obj => obj.slotElement, set: (obj, value) => { obj.slotElement = value; } }, metadata: _metadata }, _slotElement_initializers, _slotElement_extraInitializers);
383
+ __esDecorate(null, null, _dropPlaceholder_decorators, { kind: "field", name: "dropPlaceholder", static: false, private: false, access: { has: obj => "dropPlaceholder" in obj, get: obj => obj.dropPlaceholder, set: (obj, value) => { obj.dropPlaceholder = value; } }, metadata: _metadata }, _dropPlaceholder_initializers, _dropPlaceholder_extraInitializers);
384
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
385
+ _classThis = _classDescriptor.value;
386
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
387
+ __runInitializers(_classThis, _classExtraInitializers);
388
+ }
389
+ onReady() {
390
+ this.collectItems();
391
+ this.setupResizeObserver();
392
+ if (this.draggable) {
393
+ this.setAttribute('draggable', '');
394
+ this.setupDragListeners();
395
+ }
396
+ this.layout();
397
+ setTimeout(() => this.setAttribute('ready', ''), 10);
398
+ }
399
+ onDispose() {
400
+ this.resizeObserver?.disconnect();
401
+ this.resizeObserver = null;
402
+ this.itemResizeObserver?.disconnect();
403
+ this.itemResizeObserver = null;
404
+ this.teardownDragListeners();
405
+ }
406
+ // -- Property watchers ----------------------------------------------------
407
+ onGapChange() {
408
+ this.style.setProperty('--binpack-gap', this.gap);
409
+ this.scheduleLayout();
410
+ }
411
+ onTransitionDurationChange() {
412
+ this.style.setProperty('--binpack-transition-duration', this.transitionDuration);
413
+ }
414
+ onColumnWidthChange() {
415
+ this.scheduleLayout();
416
+ }
417
+ onRowHeightChange() {
418
+ this.scheduleLayout();
419
+ }
420
+ onHorizontalChange() {
421
+ this.scheduleLayout();
422
+ }
423
+ onOriginLeftChange() {
424
+ this.scheduleLayout();
425
+ }
426
+ onOriginTopChange() {
427
+ this.scheduleLayout();
428
+ }
429
+ onResizeChange() {
430
+ if (this.resize) {
431
+ this.setupResizeObserver();
432
+ }
433
+ else {
434
+ this.resizeObserver?.disconnect();
435
+ this.resizeObserver = null;
436
+ }
437
+ }
438
+ onDraggableChange() {
439
+ if (this.draggable) {
440
+ this.setAttribute('draggable', '');
441
+ this.setupDragListeners();
442
+ }
443
+ else {
444
+ this.removeAttribute('draggable');
445
+ this.teardownDragListeners();
446
+ }
447
+ }
448
+ // -- Events ---------------------------------------------------------------
449
+ emitLayoutComplete() {
450
+ return { items: [...this.items] };
451
+ }
452
+ emitFitComplete(item, x, y) {
453
+ return { item, x, y };
454
+ }
455
+ emitDragItemPositioned(item, x, y) {
456
+ return { item, x, y };
457
+ }
458
+ // -- Public API -----------------------------------------------------------
459
+ layout() {
460
+ this.performLayout();
461
+ }
462
+ fit(element, x, y) {
463
+ if (!this.items.includes(element))
464
+ return;
465
+ if (x !== undefined && y !== undefined) {
466
+ this.positionItem(element, x, y, 0);
467
+ }
468
+ // Re-layout remaining items around the fitted one
469
+ this.performLayout(element);
470
+ const rect = element.getBoundingClientRect();
471
+ const containerRect = this.getBoundingClientRect();
472
+ const finalX = rect.left - containerRect.left;
473
+ const finalY = rect.top - containerRect.top;
474
+ this.emitFitComplete(element, finalX, finalY);
475
+ }
476
+ reloadItems() {
477
+ this.collectItems();
478
+ this.observeItems();
479
+ this.scheduleLayout();
480
+ }
481
+ stamp(elements) {
482
+ const els = Array.isArray(elements) ? elements : [elements];
483
+ els.forEach(el => this.stampedElements.add(el));
484
+ this.scheduleLayout();
485
+ }
486
+ unstamp(elements) {
487
+ const els = Array.isArray(elements) ? elements : [elements];
488
+ els.forEach(el => this.stampedElements.delete(el));
489
+ this.scheduleLayout();
490
+ }
491
+ getItemElements() {
492
+ return [...this.items];
493
+ }
494
+ getLayout() {
495
+ const layout = {};
496
+ const gapPx = this.getGapPixels();
497
+ const hasGrid = this.columnWidth > 0 || this.rowHeight > 0;
498
+ let order = 0;
499
+ for (const item of this.items) {
500
+ const name = item.getAttribute('name');
501
+ if (!name)
502
+ continue;
503
+ const entry = { order: order++ };
504
+ if (item.hasAttribute('hidden')) {
505
+ entry.hidden = true;
506
+ }
507
+ if (hasGrid && !entry.hidden) {
508
+ const match = item.style.transform.match(/translate\(([^,]+)px,\s*([^)]+)px\)/);
509
+ if (match) {
510
+ const x = parseFloat(match[1]);
511
+ const y = parseFloat(match[2]);
512
+ if (this.columnWidth > 0) {
513
+ entry.col = Math.round(x / (this.columnWidth + gapPx));
514
+ }
515
+ if (this.rowHeight > 0) {
516
+ entry.row = Math.round(y / (this.rowHeight + gapPx));
517
+ }
518
+ }
519
+ }
520
+ layout[name] = entry;
521
+ }
522
+ return layout;
523
+ }
524
+ setLayout(layout) {
525
+ // Store for late-arriving items
526
+ this.pendingLayout = layout;
527
+ this.applyPendingLayout();
528
+ this.performLayout();
529
+ }
530
+ applyPendingLayout() {
531
+ if (!this.pendingLayout)
532
+ return;
533
+ const layout = this.pendingLayout;
534
+ const entries = Object.entries(layout).sort((a, b) => a[1].order - b[1].order);
535
+ const namedItems = new Map();
536
+ const unnamed = [];
537
+ for (const item of this.items) {
538
+ const name = item.getAttribute('name');
539
+ if (name) {
540
+ namedItems.set(name, item);
541
+ }
542
+ else {
543
+ unnamed.push(item);
544
+ }
545
+ }
546
+ // Reorder items: layout-ordered named items first, then unnamed in original order
547
+ const reordered = [];
548
+ for (const [name, entry] of entries) {
549
+ const item = namedItems.get(name);
550
+ if (!item)
551
+ continue;
552
+ namedItems.delete(name);
553
+ // Apply hidden state
554
+ if (entry.hidden) {
555
+ item.setAttribute('hidden', '');
556
+ }
557
+ else {
558
+ item.removeAttribute('hidden');
559
+ }
560
+ reordered.push(item);
561
+ }
562
+ // Remaining named items not in layout (new items added after save)
563
+ for (const item of namedItems.values()) {
564
+ item.removeAttribute('hidden');
565
+ reordered.push(item);
566
+ }
567
+ // Unnamed items at the end
568
+ reordered.push(...unnamed);
569
+ // Reorder DOM to match
570
+ for (const item of reordered) {
571
+ this.appendChild(item);
572
+ }
573
+ this.items = reordered;
574
+ }
575
+ // -- Template & Styles ----------------------------------------------------
576
+ template() {
577
+ return snice.html `
578
+ <div class="binpack" part="base" role="list">
579
+ <slot @slotchange="${() => this.handleSlotChange()}"></slot>
580
+ <div class="binpack-drop-placeholder"></div>
581
+ </div>
582
+ `;
583
+ }
584
+ componentStyles() {
585
+ return snice.css `${cssContent}`;
586
+ }
587
+ // -- Private helpers ------------------------------------------------------
588
+ handleSlotChange() {
589
+ this.collectItems();
590
+ this.observeItems();
591
+ // If a layout was explicitly set, apply ordering to any new items
592
+ if (this.pendingLayout) {
593
+ this.applyPendingLayout();
594
+ }
595
+ this.scheduleLayout();
596
+ }
597
+ collectItems() {
598
+ if (!this.slotElement)
599
+ return;
600
+ this.items = this.slotElement.assignedElements({ flatten: true })
601
+ .filter(el => el instanceof HTMLElement);
602
+ }
603
+ setupResizeObserver() {
604
+ if (!this.resize)
605
+ return;
606
+ if (this.resizeObserver)
607
+ return;
608
+ this.resizeObserver = new ResizeObserver(() => {
609
+ this.scheduleLayout();
610
+ });
611
+ this.resizeObserver.observe(this);
612
+ this.observeItems();
613
+ }
614
+ observeItems() {
615
+ this.itemResizeObserver?.disconnect();
616
+ this.itemResizeObserver = new ResizeObserver(() => {
617
+ this.scheduleLayout();
618
+ });
619
+ for (const item of this.items) {
620
+ this.itemResizeObserver.observe(item);
621
+ }
622
+ }
623
+ scheduleLayout() {
624
+ if (this.layoutScheduled)
625
+ return;
626
+ this.layoutScheduled = true;
627
+ requestAnimationFrame(() => {
628
+ this.layoutScheduled = false;
629
+ this.performLayout();
630
+ });
631
+ }
632
+ getGapPixels() {
633
+ // Parse gap string to pixels
634
+ const gap = this.gap;
635
+ // Fast path for common values
636
+ if (gap.endsWith('px')) {
637
+ const val = parseFloat(gap);
638
+ if (!isNaN(val))
639
+ return val;
640
+ }
641
+ if (gap.endsWith('rem')) {
642
+ const val = parseFloat(gap);
643
+ if (!isNaN(val)) {
644
+ const fontSize = parseFloat(getComputedStyle(document.documentElement).fontSize) || 16;
645
+ return val * fontSize;
646
+ }
647
+ }
648
+ // Fallback: measure via DOM
649
+ const temp = document.createElement('div');
650
+ temp.style.position = 'absolute';
651
+ temp.style.visibility = 'hidden';
652
+ temp.style.width = gap;
653
+ document.body.appendChild(temp);
654
+ const px = temp.getBoundingClientRect().width;
655
+ temp.remove();
656
+ return px;
657
+ }
658
+ performLayout(fittedElement) {
659
+ const containerWidth = this.clientWidth;
660
+ const containerHeight = this.clientHeight;
661
+ const gapPx = this.getGapPixels();
662
+ // Packer dimensions include one extra gutter so edge items fit.
663
+ // Vertical: constrained by container width, infinite height.
664
+ // Horizontal: constrained by container height, infinite width.
665
+ const packWidth = this.horizontal ? 100000 : containerWidth + gapPx;
666
+ const packHeight = this.horizontal ? containerHeight + gapPx : 100000;
667
+ const packer = new Packer(packWidth, packHeight, this.horizontal);
668
+ // Mark stamped elements as occupied in the packer
669
+ for (const stamped of this.stampedElements) {
670
+ let stampRect;
671
+ if (stamped === this.dragItem) {
672
+ // Use the computed drop position, not the cursor position
673
+ stampRect = {
674
+ x: this.dragItemRect.x,
675
+ y: this.dragItemRect.y,
676
+ width: this.dragItemRect.width + gapPx,
677
+ height: this.dragItemRect.height + gapPx,
678
+ };
679
+ }
680
+ else {
681
+ const rect = stamped.getBoundingClientRect();
682
+ const containerRect = this.getBoundingClientRect();
683
+ stampRect = {
684
+ x: rect.left - containerRect.left,
685
+ y: rect.top - containerRect.top,
686
+ width: rect.width + gapPx,
687
+ height: rect.height + gapPx,
688
+ };
689
+ }
690
+ packer.placed(stampRect);
691
+ }
692
+ // If a fitted element is specified, mark it as placed first
693
+ if (fittedElement) {
694
+ const rect = fittedElement.getBoundingClientRect();
695
+ const containerRect = this.getBoundingClientRect();
696
+ const fitRect = {
697
+ x: rect.left - containerRect.left,
698
+ y: rect.top - containerRect.top,
699
+ width: rect.width + gapPx,
700
+ height: rect.height + gapPx,
701
+ };
702
+ packer.placed(fitRect);
703
+ }
704
+ let maxExtent = 0;
705
+ let staggerIndex = 0;
706
+ for (const item of this.items) {
707
+ if (this.stampedElements.has(item))
708
+ continue;
709
+ if (item === fittedElement)
710
+ continue;
711
+ if (item.hasAttribute('hidden'))
712
+ continue;
713
+ const itemWidth = item.offsetWidth + gapPx;
714
+ const itemHeight = item.offsetHeight + gapPx;
715
+ const position = packer.pack(itemWidth, itemHeight, this.columnWidth, this.rowHeight, gapPx);
716
+ if (position) {
717
+ let x = position.x;
718
+ let y = position.y;
719
+ // Handle origin direction
720
+ if (!this.originLeft) {
721
+ x = containerWidth - x - item.offsetWidth;
722
+ }
723
+ if (!this.originTop) {
724
+ y = containerHeight - y - item.offsetHeight;
725
+ }
726
+ this.positionItem(item, x, y, this.stagger > 0 ? staggerIndex * this.stagger : 0);
727
+ const extent = this.horizontal
728
+ ? position.x + itemWidth
729
+ : position.y + itemHeight;
730
+ if (extent > maxExtent)
731
+ maxExtent = extent;
732
+ staggerIndex++;
733
+ }
734
+ }
735
+ // Set container size, subtracting trailing gutter
736
+ const containerSize = Math.max(0, maxExtent - gapPx);
737
+ if (this.container) {
738
+ if (this.horizontal) {
739
+ this.container.style.width = `${containerSize}px`;
740
+ this.container.style.height = '';
741
+ }
742
+ else {
743
+ this.container.style.height = `${containerSize}px`;
744
+ this.container.style.width = '';
745
+ }
746
+ }
747
+ this.emitLayoutComplete();
748
+ }
749
+ positionItem(item, x, y, delay) {
750
+ if (delay > 0) {
751
+ item.style.transitionDelay = `${delay}ms`;
752
+ }
753
+ else {
754
+ item.style.transitionDelay = '';
755
+ }
756
+ item.style.transform = `translate(${x}px, ${y}px)`;
757
+ }
758
+ // -- Drag implementation --------------------------------------------------
759
+ setupDragListeners() {
760
+ this.addEventListener('pointerdown', this.onPointerDown);
761
+ }
762
+ teardownDragListeners() {
763
+ this.removeEventListener('pointerdown', this.onPointerDown);
764
+ if (this.boundPointerMove) {
765
+ document.removeEventListener('pointermove', this.boundPointerMove);
766
+ this.boundPointerMove = null;
767
+ }
768
+ if (this.boundPointerUp) {
769
+ document.removeEventListener('pointerup', this.boundPointerUp);
770
+ this.boundPointerUp = null;
771
+ }
772
+ }
773
+ dragItemStart(item, e) {
774
+ const containerRect = this.getBoundingClientRect();
775
+ // Get the item's current position from its transform
776
+ const itemRect = item.getBoundingClientRect();
777
+ const currentX = itemRect.left - containerRect.left;
778
+ const currentY = itemRect.top - containerRect.top;
779
+ this.dragItem = item;
780
+ this.dragItemRect = {
781
+ x: currentX,
782
+ y: currentY,
783
+ width: item.offsetWidth,
784
+ height: item.offsetHeight,
785
+ };
786
+ this.dragStartX = currentX;
787
+ this.dragStartY = currentY;
788
+ this.dragOffsetX = e.clientX - itemRect.left;
789
+ this.dragOffsetY = e.clientY - itemRect.top;
790
+ // Stamp the dragged item so layout flows around it
791
+ this.stamp(item);
792
+ this.dragItemCount++;
793
+ // Add dragging class
794
+ item.classList.add('binpack-dragging');
795
+ item.style.transition = 'none';
796
+ // Show placeholder
797
+ this.showPlaceholder(item);
798
+ // Compute shift targets
799
+ this.updateShiftTargets();
800
+ // Bind move/up to document
801
+ this.boundPointerMove = (ev) => this.onPointerMove(ev);
802
+ this.boundPointerUp = (ev) => this.onPointerUp(ev);
803
+ document.addEventListener('pointermove', this.boundPointerMove);
804
+ document.addEventListener('pointerup', this.boundPointerUp);
805
+ // Capture pointer for reliable tracking
806
+ try {
807
+ item.setPointerCapture(e.pointerId);
808
+ }
809
+ catch (_) { /* synthetic events */ }
810
+ }
811
+ onPointerMove(e) {
812
+ if (!this.dragItem)
813
+ return;
814
+ const containerRect = this.getBoundingClientRect();
815
+ const x = e.clientX - containerRect.left - this.dragOffsetX;
816
+ const y = e.clientY - containerRect.top - this.dragOffsetY;
817
+ // Move the dragged item directly (no transition)
818
+ this.dragItem.style.transform = `translate(${x}px, ${y}px)`;
819
+ // Throttled layout update
820
+ const now = Date.now();
821
+ const isThrottled = this.dragTime && (now - this.dragTime) < this.dragThrottle;
822
+ const doShift = () => {
823
+ this.shiftToNearest(x, y);
824
+ this.positionPlaceholder();
825
+ this.performLayout();
826
+ };
827
+ if (isThrottled) {
828
+ if (this.dragTimeoutId !== null)
829
+ clearTimeout(this.dragTimeoutId);
830
+ this.dragTimeoutId = setTimeout(doShift, this.dragThrottle);
831
+ }
832
+ else {
833
+ doShift();
834
+ this.dragTime = now;
835
+ }
836
+ }
837
+ onPointerUp(e) {
838
+ if (!this.dragItem)
839
+ return;
840
+ const item = this.dragItem;
841
+ // Clean up listeners
842
+ if (this.boundPointerMove) {
843
+ document.removeEventListener('pointermove', this.boundPointerMove);
844
+ this.boundPointerMove = null;
845
+ }
846
+ if (this.boundPointerUp) {
847
+ document.removeEventListener('pointerup', this.boundPointerUp);
848
+ this.boundPointerUp = null;
849
+ }
850
+ if (this.dragTimeoutId !== null) {
851
+ clearTimeout(this.dragTimeoutId);
852
+ this.dragTimeoutId = null;
853
+ }
854
+ // Add positioning class, remove dragging
855
+ item.classList.remove('binpack-dragging');
856
+ item.classList.add('binpack-positioning');
857
+ item.style.transition = '';
858
+ // Animate to final position
859
+ const finalX = this.dragItemRect.x;
860
+ const finalY = this.dragItemRect.y;
861
+ const onTransitionEnd = () => {
862
+ item.removeEventListener('transitionend', onTransitionEnd);
863
+ item.classList.remove('binpack-positioning');
864
+ this.hidePlaceholder();
865
+ this.emitDragItemPositioned(item, finalX, finalY);
866
+ };
867
+ item.addEventListener('transitionend', onTransitionEnd);
868
+ // Move to final position (will animate because we removed transition: none)
869
+ item.style.transform = `translate(${finalX}px, ${finalY}px)`;
870
+ // Final layout
871
+ this.dragItemCount = Math.max(0, this.dragItemCount - 1);
872
+ this.unstamp(item);
873
+ this.dragItem = null;
874
+ // Sort items by visual position
875
+ this.sortItemsByPosition();
876
+ this.performLayout();
877
+ // Safety: if no transition fires (same position), clean up after timeout
878
+ setTimeout(() => {
879
+ if (item.classList.contains('binpack-positioning')) {
880
+ item.classList.remove('binpack-positioning');
881
+ this.hidePlaceholder();
882
+ }
883
+ }, parseFloat(this.transitionDuration) * 1000 + 100);
884
+ }
885
+ updateShiftTargets() {
886
+ if (!this.dragItem)
887
+ return;
888
+ const gapPx = this.getGapPixels();
889
+ const containerWidth = this.clientWidth;
890
+ const containerHeight = this.clientHeight;
891
+ const packWidth = this.horizontal ? 100000 : containerWidth + gapPx;
892
+ const packHeight = this.horizontal ? containerHeight + gapPx : 100000;
893
+ const shiftPacker = new Packer(packWidth, packHeight, this.horizontal);
894
+ // Pack stamped elements (except the dragged item, which is stamped but should be excluded)
895
+ for (const stamped of this.stampedElements) {
896
+ if (stamped === this.dragItem)
897
+ continue;
898
+ const rect = stamped.getBoundingClientRect();
899
+ const containerRect = this.getBoundingClientRect();
900
+ const stampRect = {
901
+ x: rect.left - containerRect.left,
902
+ y: rect.top - containerRect.top,
903
+ width: rect.width + gapPx,
904
+ height: rect.height + gapPx,
905
+ };
906
+ shiftPacker.placed(stampRect);
907
+ }
908
+ this.shiftTargetKeys = [];
909
+ this.shiftTargets = [];
910
+ const isHoriz = this.horizontal;
911
+ const measure = isHoriz ? 'height' : 'width';
912
+ const segment = isHoriz
913
+ ? (this.rowHeight ? this.rowHeight + gapPx : 0)
914
+ : (this.columnWidth ? this.columnWidth + gapPx : 0);
915
+ const dropItemMeasure = isHoriz ? this.dragItemRect.height + gapPx : this.dragItemRect.width + gapPx;
916
+ let boundsSize;
917
+ if (segment) {
918
+ const segmentSpan = Math.ceil(dropItemMeasure / segment);
919
+ const segs = Math.floor((shiftPacker[measure] + gapPx) / segment);
920
+ boundsSize = (segs - segmentSpan) * segment;
921
+ for (let i = 0; i < segs; i++) {
922
+ const ix = isHoriz ? 0 : i * segment;
923
+ const iy = isHoriz ? i * segment : 0;
924
+ this.addShiftTarget(ix, iy, boundsSize, isHoriz);
925
+ }
926
+ }
927
+ else {
928
+ boundsSize = (shiftPacker[measure] + gapPx) - dropItemMeasure;
929
+ this.addShiftTarget(0, 0, boundsSize, isHoriz);
930
+ }
931
+ // Pack each non-dragged, non-stamped, non-hidden item and add targets at corners
932
+ for (const item of this.items) {
933
+ if (this.stampedElements.has(item))
934
+ continue;
935
+ if (item === this.dragItem)
936
+ continue;
937
+ if (item.hasAttribute('hidden'))
938
+ continue;
939
+ const itemW = item.offsetWidth + gapPx;
940
+ const itemH = item.offsetHeight + gapPx;
941
+ const pos = shiftPacker.pack(itemW, itemH, this.columnWidth, this.rowHeight, gapPx);
942
+ if (pos) {
943
+ // Top-left corner
944
+ this.addShiftTarget(pos.x, pos.y, boundsSize, isHoriz);
945
+ // Bottom-left (vertical) or top-right (horizontal)
946
+ const cx = isHoriz ? pos.x + itemW : pos.x;
947
+ const cy = isHoriz ? pos.y : pos.y + itemH;
948
+ this.addShiftTarget(cx, cy, boundsSize, isHoriz);
949
+ if (segment) {
950
+ const itemMeasure = isHoriz ? itemH : itemW;
951
+ const segSpan = Math.round(itemMeasure / segment);
952
+ for (let i = 1; i < segSpan; i++) {
953
+ const sx = isHoriz ? cx : pos.x + segment * i;
954
+ const sy = isHoriz ? pos.y + segment * i : cy;
955
+ this.addShiftTarget(sx, sy, boundsSize, isHoriz);
956
+ }
957
+ }
958
+ }
959
+ }
960
+ }
961
+ addShiftTarget(x, y, boundsSize, isHoriz) {
962
+ const check = isHoriz ? y : x;
963
+ if (check !== 0 && check > boundsSize)
964
+ return;
965
+ const key = `${x},${y}`;
966
+ if (this.shiftTargetKeys.includes(key))
967
+ return;
968
+ this.shiftTargetKeys.push(key);
969
+ this.shiftTargets.push({ x, y });
970
+ }
971
+ shiftToNearest(x, y) {
972
+ let minDist = Infinity;
973
+ let nearest = this.shiftTargets[0];
974
+ for (const target of this.shiftTargets) {
975
+ const dx = target.x - x;
976
+ const dy = target.y - y;
977
+ const dist = dx * dx + dy * dy; // skip sqrt, just compare
978
+ if (dist < minDist) {
979
+ minDist = dist;
980
+ nearest = target;
981
+ }
982
+ }
983
+ if (nearest) {
984
+ this.dragItemRect.x = nearest.x;
985
+ this.dragItemRect.y = nearest.y;
986
+ }
987
+ }
988
+ showPlaceholder(item) {
989
+ if (!this.dropPlaceholder)
990
+ return;
991
+ this.dropPlaceholder.style.width = `${item.offsetWidth}px`;
992
+ this.dropPlaceholder.style.height = `${item.offsetHeight}px`;
993
+ this.dropPlaceholder.classList.add('visible');
994
+ this.positionPlaceholder();
995
+ }
996
+ positionPlaceholder() {
997
+ if (!this.dropPlaceholder)
998
+ return;
999
+ this.dropPlaceholder.style.transform = `translate(${this.dragItemRect.x}px, ${this.dragItemRect.y}px)`;
1000
+ }
1001
+ hidePlaceholder() {
1002
+ if (!this.dropPlaceholder)
1003
+ return;
1004
+ this.dropPlaceholder.classList.remove('visible');
1005
+ }
1006
+ sortItemsByPosition() {
1007
+ const getPos = (el) => {
1008
+ const match = el.style.transform.match(/translate\(([^,]+)px,\s*([^)]+)px\)/);
1009
+ if (!match)
1010
+ return { x: 0, y: 0 };
1011
+ return { x: parseFloat(match[1]), y: parseFloat(match[2]) };
1012
+ };
1013
+ if (this.horizontal) {
1014
+ this.items.sort((a, b) => {
1015
+ const pa = getPos(a);
1016
+ const pb = getPos(b);
1017
+ return pa.x - pb.x || pa.y - pb.y;
1018
+ });
1019
+ }
1020
+ else {
1021
+ this.items.sort((a, b) => {
1022
+ const pa = getPos(a);
1023
+ const pb = getPos(b);
1024
+ return pa.y - pb.y || pa.x - pb.x;
1025
+ });
1026
+ }
1027
+ }
1028
+ });
1029
+ return _classThis;
1030
+ })();
1031
+
1032
+ exports.SniceBinpack = SniceBinpack;
1033
+
1034
+ return exports;
1035
+
1036
+ })({}, Snice);
1037
+ //# sourceMappingURL=snice-binpack.js.map