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
@@ -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