@archytechtor/ui 0.0.0-stage → 0.2.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 (479) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +105 -2
  3. package/dist/components/accordion/accordion.d.ts +25 -0
  4. package/dist/components/accordion/accordion.js +88 -0
  5. package/dist/components/accordion/index.d.ts +3 -0
  6. package/dist/components/accordion/index.js +1 -0
  7. package/dist/components/accordion/types.d.ts +39 -0
  8. package/dist/components/alert/alert.d.ts +25 -0
  9. package/dist/components/alert/alert.js +59 -0
  10. package/dist/components/alert/index.d.ts +3 -0
  11. package/dist/components/alert/index.js +3 -0
  12. package/dist/components/alert/types.d.ts +32 -0
  13. package/dist/components/alert/types.js +19 -0
  14. package/dist/components/alert-dialog/alert-dialog.d.ts +73 -0
  15. package/dist/components/alert-dialog/alert-dialog.js +170 -0
  16. package/dist/components/alert-dialog/index.d.ts +3 -0
  17. package/dist/components/alert-dialog/index.js +1 -0
  18. package/dist/components/alert-dialog/types.d.ts +80 -0
  19. package/dist/components/aspect-ratio/aspect-ratio.d.ts +8 -0
  20. package/dist/components/aspect-ratio/aspect-ratio.js +20 -0
  21. package/dist/components/aspect-ratio/index.d.ts +3 -0
  22. package/dist/components/aspect-ratio/index.js +1 -0
  23. package/dist/components/aspect-ratio/types.d.ts +8 -0
  24. package/dist/components/attachment/attachment.d.ts +57 -0
  25. package/dist/components/attachment/attachment.js +139 -0
  26. package/dist/components/attachment/index.d.ts +3 -0
  27. package/dist/components/attachment/index.js +3 -0
  28. package/dist/components/attachment/types.d.ts +79 -0
  29. package/dist/components/attachment/types.js +43 -0
  30. package/dist/components/avatar/avatar.d.ts +39 -0
  31. package/dist/components/avatar/avatar.js +88 -0
  32. package/dist/components/avatar/index.d.ts +3 -0
  33. package/dist/components/avatar/index.js +3 -0
  34. package/dist/components/avatar/types.d.ts +54 -0
  35. package/dist/components/avatar/types.js +21 -0
  36. package/dist/components/badge/badge.d.ts +7 -0
  37. package/dist/components/badge/badge.js +23 -0
  38. package/dist/components/badge/index.d.ts +3 -0
  39. package/dist/components/badge/index.js +3 -0
  40. package/dist/components/badge/types.d.ts +21 -0
  41. package/dist/components/badge/types.js +26 -0
  42. package/dist/components/bottom-nav/bottom-nav.d.ts +19 -0
  43. package/dist/components/bottom-nav/bottom-nav.js +59 -0
  44. package/dist/components/bottom-nav/index.d.ts +3 -0
  45. package/dist/components/bottom-nav/index.js +3 -0
  46. package/dist/components/bottom-nav/types.d.ts +45 -0
  47. package/dist/components/bottom-nav/types.js +44 -0
  48. package/dist/components/box/box.d.ts +7 -0
  49. package/dist/components/box/box.js +26 -0
  50. package/dist/components/box/index.d.ts +3 -0
  51. package/dist/components/box/index.js +3 -0
  52. package/dist/components/box/types.d.ts +23 -0
  53. package/dist/components/box/types.js +27 -0
  54. package/dist/components/breadcrumb/breadcrumb.d.ts +43 -0
  55. package/dist/components/breadcrumb/breadcrumb.js +115 -0
  56. package/dist/components/breadcrumb/index.d.ts +3 -0
  57. package/dist/components/breadcrumb/index.js +1 -0
  58. package/dist/components/breadcrumb/types.d.ts +36 -0
  59. package/dist/components/bubble/bubble.d.ts +25 -0
  60. package/dist/components/bubble/bubble.js +69 -0
  61. package/dist/components/bubble/index.d.ts +3 -0
  62. package/dist/components/bubble/index.js +3 -0
  63. package/dist/components/bubble/types.d.ts +51 -0
  64. package/dist/components/bubble/types.js +60 -0
  65. package/dist/components/button/button.d.ts +7 -0
  66. package/dist/components/button/button.js +155 -0
  67. package/dist/components/button/index.d.ts +4 -0
  68. package/dist/components/button/index.js +4 -0
  69. package/dist/components/button/types.d.ts +80 -0
  70. package/dist/components/button/types.js +99 -0
  71. package/dist/components/button/use-hold-to-confirm.d.ts +25 -0
  72. package/dist/components/button/use-hold-to-confirm.js +161 -0
  73. package/dist/components/button-group/button-group.d.ts +20 -0
  74. package/dist/components/button-group/button-group.js +62 -0
  75. package/dist/components/button-group/index.d.ts +3 -0
  76. package/dist/components/button-group/index.js +3 -0
  77. package/dist/components/button-group/types.d.ts +30 -0
  78. package/dist/components/button-group/types.js +19 -0
  79. package/dist/components/calendar/calendar.d.ts +15 -0
  80. package/dist/components/calendar/calendar.js +157 -0
  81. package/dist/components/calendar/index.d.ts +3 -0
  82. package/dist/components/calendar/index.js +1 -0
  83. package/dist/components/calendar/types.d.ts +21 -0
  84. package/dist/components/card/card.d.ts +43 -0
  85. package/dist/components/card/card.js +97 -0
  86. package/dist/components/card/index.d.ts +3 -0
  87. package/dist/components/card/index.js +3 -0
  88. package/dist/components/card/types.d.ts +44 -0
  89. package/dist/components/card/types.js +19 -0
  90. package/dist/components/carousel/carousel.d.ts +36 -0
  91. package/dist/components/carousel/carousel.js +190 -0
  92. package/dist/components/carousel/index.d.ts +3 -0
  93. package/dist/components/carousel/index.js +1 -0
  94. package/dist/components/carousel/types.d.ts +79 -0
  95. package/dist/components/chart/chart.d.ts +35 -0
  96. package/dist/components/chart/chart.js +212 -0
  97. package/dist/components/chart/index.d.ts +3 -0
  98. package/dist/components/chart/index.js +1 -0
  99. package/dist/components/chart/types.d.ts +89 -0
  100. package/dist/components/chart/types.js +7 -0
  101. package/dist/components/checkbox/checkbox.d.ts +7 -0
  102. package/dist/components/checkbox/checkbox.js +31 -0
  103. package/dist/components/checkbox/index.d.ts +3 -0
  104. package/dist/components/checkbox/index.js +1 -0
  105. package/dist/components/checkbox/types.d.ts +25 -0
  106. package/dist/components/code-block/code-block.d.ts +49 -0
  107. package/dist/components/code-block/code-block.js +188 -0
  108. package/dist/components/code-block/highlighter.d.ts +15 -0
  109. package/dist/components/code-block/highlighter.js +123 -0
  110. package/dist/components/code-block/index.d.ts +5 -0
  111. package/dist/components/code-block/index.js +5 -0
  112. package/dist/components/code-block/types.d.ts +94 -0
  113. package/dist/components/code-block/types.js +38 -0
  114. package/dist/components/code-block/use-highlighted-code.d.ts +9 -0
  115. package/dist/components/code-block/use-highlighted-code.js +67 -0
  116. package/dist/components/collapsible/collapsible.d.ts +19 -0
  117. package/dist/components/collapsible/collapsible.js +44 -0
  118. package/dist/components/collapsible/index.d.ts +3 -0
  119. package/dist/components/collapsible/index.js +1 -0
  120. package/dist/components/collapsible/types.d.ts +26 -0
  121. package/dist/components/combobox/combobox.d.ts +104 -0
  122. package/dist/components/combobox/combobox.js +365 -0
  123. package/dist/components/combobox/index.d.ts +3 -0
  124. package/dist/components/combobox/index.js +1 -0
  125. package/dist/components/combobox/types.d.ts +229 -0
  126. package/dist/components/command/command.d.ts +55 -0
  127. package/dist/components/command/command.js +179 -0
  128. package/dist/components/command/index.d.ts +3 -0
  129. package/dist/components/command/index.js +1 -0
  130. package/dist/components/command/types.d.ts +69 -0
  131. package/dist/components/context-menu/context-menu.d.ts +92 -0
  132. package/dist/components/context-menu/context-menu.js +270 -0
  133. package/dist/components/context-menu/index.d.ts +3 -0
  134. package/dist/components/context-menu/index.js +1 -0
  135. package/dist/components/context-menu/types.d.ts +138 -0
  136. package/dist/components/data-table/data-table-features.d.ts +21 -0
  137. package/dist/components/data-table/data-table-features.js +22 -0
  138. package/dist/components/data-table/data-table.d.ts +69 -0
  139. package/dist/components/data-table/data-table.js +283 -0
  140. package/dist/components/data-table/index.d.ts +4 -0
  141. package/dist/components/data-table/index.js +3 -0
  142. package/dist/components/data-table/types.d.ts +63 -0
  143. package/dist/components/date-input/date-input.d.ts +7 -0
  144. package/dist/components/date-input/date-input.js +147 -0
  145. package/dist/components/date-input/index.d.ts +3 -0
  146. package/dist/components/date-input/index.js +1 -0
  147. package/dist/components/date-input/types.d.ts +27 -0
  148. package/dist/components/date-picker/date-picker.d.ts +7 -0
  149. package/dist/components/date-picker/date-picker.js +74 -0
  150. package/dist/components/date-picker/index.d.ts +3 -0
  151. package/dist/components/date-picker/index.js +1 -0
  152. package/dist/components/date-picker/types.d.ts +38 -0
  153. package/dist/components/date-range-picker/date-range-picker.d.ts +7 -0
  154. package/dist/components/date-range-picker/date-range-picker.js +89 -0
  155. package/dist/components/date-range-picker/index.d.ts +3 -0
  156. package/dist/components/date-range-picker/index.js +1 -0
  157. package/dist/components/date-range-picker/types.d.ts +43 -0
  158. package/dist/components/dialog/dialog.d.ts +61 -0
  159. package/dist/components/dialog/dialog.js +160 -0
  160. package/dist/components/dialog/index.d.ts +3 -0
  161. package/dist/components/dialog/index.js +1 -0
  162. package/dist/components/dialog/types.d.ts +68 -0
  163. package/dist/components/drawer/drawer.d.ts +69 -0
  164. package/dist/components/drawer/drawer.js +245 -0
  165. package/dist/components/drawer/index.d.ts +3 -0
  166. package/dist/components/drawer/index.js +1 -0
  167. package/dist/components/drawer/types.d.ts +93 -0
  168. package/dist/components/dropdown-menu/dropdown-menu.d.ts +92 -0
  169. package/dist/components/dropdown-menu/dropdown-menu.js +268 -0
  170. package/dist/components/dropdown-menu/index.d.ts +3 -0
  171. package/dist/components/dropdown-menu/index.js +1 -0
  172. package/dist/components/dropdown-menu/types.d.ts +143 -0
  173. package/dist/components/empty/empty.d.ts +37 -0
  174. package/dist/components/empty/empty.js +84 -0
  175. package/dist/components/empty/index.d.ts +3 -0
  176. package/dist/components/empty/index.js +3 -0
  177. package/dist/components/empty/types.d.ts +39 -0
  178. package/dist/components/empty/types.js +13 -0
  179. package/dist/components/expanded-card/expanded-card.d.ts +43 -0
  180. package/dist/components/expanded-card/expanded-card.js +352 -0
  181. package/dist/components/expanded-card/index.d.ts +3 -0
  182. package/dist/components/expanded-card/index.js +1 -0
  183. package/dist/components/expanded-card/types.d.ts +52 -0
  184. package/dist/components/field/field.d.ts +62 -0
  185. package/dist/components/field/field.js +173 -0
  186. package/dist/components/field/index.d.ts +3 -0
  187. package/dist/components/field/index.js +3 -0
  188. package/dist/components/field/types.d.ts +81 -0
  189. package/dist/components/field/types.js +21 -0
  190. package/dist/components/form/form.d.ts +49 -0
  191. package/dist/components/form/form.js +136 -0
  192. package/dist/components/form/index.d.ts +3 -0
  193. package/dist/components/form/index.js +1 -0
  194. package/dist/components/form/types.d.ts +59 -0
  195. package/dist/components/grid/grid.d.ts +7 -0
  196. package/dist/components/grid/grid.js +36 -0
  197. package/dist/components/grid/index.d.ts +3 -0
  198. package/dist/components/grid/index.js +3 -0
  199. package/dist/components/grid/types.d.ts +35 -0
  200. package/dist/components/grid/types.js +102 -0
  201. package/dist/components/hover-card/hover-card.d.ts +19 -0
  202. package/dist/components/hover-card/hover-card.js +63 -0
  203. package/dist/components/hover-card/index.d.ts +3 -0
  204. package/dist/components/hover-card/index.js +1 -0
  205. package/dist/components/hover-card/types.d.ts +27 -0
  206. package/dist/components/image-gallery/image-gallery.d.ts +8 -0
  207. package/dist/components/image-gallery/image-gallery.js +294 -0
  208. package/dist/components/image-gallery/index.d.ts +4 -0
  209. package/dist/components/image-gallery/index.js +3 -0
  210. package/dist/components/image-gallery/masonry.d.ts +11 -0
  211. package/dist/components/image-gallery/masonry.js +62 -0
  212. package/dist/components/image-gallery/types.d.ts +80 -0
  213. package/dist/components/input/index.d.ts +3 -0
  214. package/dist/components/input/index.js +1 -0
  215. package/dist/components/input/input.d.ts +7 -0
  216. package/dist/components/input/input.js +18 -0
  217. package/dist/components/input/types.d.ts +28 -0
  218. package/dist/components/input-group/index.d.ts +3 -0
  219. package/dist/components/input-group/index.js +3 -0
  220. package/dist/components/input-group/input-group.d.ts +37 -0
  221. package/dist/components/input-group/input-group.js +103 -0
  222. package/dist/components/input-group/types.d.ts +64 -0
  223. package/dist/components/input-group/types.js +31 -0
  224. package/dist/components/input-otp/index.d.ts +3 -0
  225. package/dist/components/input-otp/index.js +1 -0
  226. package/dist/components/input-otp/input-otp.d.ts +25 -0
  227. package/dist/components/input-otp/input-otp.js +76 -0
  228. package/dist/components/input-otp/types.d.ts +43 -0
  229. package/dist/components/item/index.d.ts +3 -0
  230. package/dist/components/item/index.js +3 -0
  231. package/dist/components/item/item.d.ts +61 -0
  232. package/dist/components/item/item.js +149 -0
  233. package/dist/components/item/types.d.ts +75 -0
  234. package/dist/components/item/types.js +48 -0
  235. package/dist/components/kbd/index.d.ts +3 -0
  236. package/dist/components/kbd/index.js +1 -0
  237. package/dist/components/kbd/kbd.d.ts +13 -0
  238. package/dist/components/kbd/kbd.js +30 -0
  239. package/dist/components/kbd/types.d.ts +9 -0
  240. package/dist/components/label/index.d.ts +3 -0
  241. package/dist/components/label/index.js +1 -0
  242. package/dist/components/label/label.d.ts +7 -0
  243. package/dist/components/label/label.js +17 -0
  244. package/dist/components/label/types.d.ts +8 -0
  245. package/dist/components/loader/index.d.ts +3 -0
  246. package/dist/components/loader/index.js +3 -0
  247. package/dist/components/loader/loader.d.ts +8 -0
  248. package/dist/components/loader/loader.js +386 -0
  249. package/dist/components/loader/types.d.ts +27 -0
  250. package/dist/components/loader/types.js +58 -0
  251. package/dist/components/marker/index.d.ts +3 -0
  252. package/dist/components/marker/index.js +3 -0
  253. package/dist/components/marker/marker.d.ts +19 -0
  254. package/dist/components/marker/marker.js +51 -0
  255. package/dist/components/marker/types.d.ts +30 -0
  256. package/dist/components/marker/types.js +16 -0
  257. package/dist/components/menubar/index.d.ts +3 -0
  258. package/dist/components/menubar/index.js +1 -0
  259. package/dist/components/menubar/menubar.d.ts +98 -0
  260. package/dist/components/menubar/menubar.js +284 -0
  261. package/dist/components/menubar/types.d.ts +146 -0
  262. package/dist/components/message/index.d.ts +3 -0
  263. package/dist/components/message/index.js +1 -0
  264. package/dist/components/message/message.d.ts +37 -0
  265. package/dist/components/message/message.js +83 -0
  266. package/dist/components/message/types.d.ts +32 -0
  267. package/dist/components/message-scroller/index.d.ts +4 -0
  268. package/dist/components/message-scroller/index.js +3 -0
  269. package/dist/components/message-scroller/message-scroller-primitive.d.ts +21 -0
  270. package/dist/components/message-scroller/message-scroller-primitive.js +1349 -0
  271. package/dist/components/message-scroller/message-scroller.d.ts +39 -0
  272. package/dist/components/message-scroller/message-scroller.js +103 -0
  273. package/dist/components/message-scroller/types.d.ts +107 -0
  274. package/dist/components/money-input/index.d.ts +3 -0
  275. package/dist/components/money-input/index.js +1 -0
  276. package/dist/components/money-input/money-input.d.ts +7 -0
  277. package/dist/components/money-input/money-input.js +143 -0
  278. package/dist/components/money-input/types.d.ts +20 -0
  279. package/dist/components/morph-image/index.d.ts +3 -0
  280. package/dist/components/morph-image/index.js +3 -0
  281. package/dist/components/morph-image/morph-image.d.ts +8 -0
  282. package/dist/components/morph-image/morph-image.js +155 -0
  283. package/dist/components/morph-image/types.d.ts +38 -0
  284. package/dist/components/morph-image/types.js +18 -0
  285. package/dist/components/native-select/index.d.ts +3 -0
  286. package/dist/components/native-select/index.js +3 -0
  287. package/dist/components/native-select/native-select.d.ts +20 -0
  288. package/dist/components/native-select/native-select.js +57 -0
  289. package/dist/components/native-select/types.d.ts +52 -0
  290. package/dist/components/native-select/types.js +23 -0
  291. package/dist/components/navigation-menu/index.d.ts +3 -0
  292. package/dist/components/navigation-menu/index.js +3 -0
  293. package/dist/components/navigation-menu/navigation-menu.d.ts +50 -0
  294. package/dist/components/navigation-menu/navigation-menu.js +145 -0
  295. package/dist/components/navigation-menu/types.d.ts +79 -0
  296. package/dist/components/navigation-menu/types.js +15 -0
  297. package/dist/components/number-stepper/index.d.ts +3 -0
  298. package/dist/components/number-stepper/index.js +3 -0
  299. package/dist/components/number-stepper/number-stepper.d.ts +9 -0
  300. package/dist/components/number-stepper/number-stepper.js +223 -0
  301. package/dist/components/number-stepper/types.d.ts +47 -0
  302. package/dist/components/number-stepper/types.js +174 -0
  303. package/dist/components/pagination/index.d.ts +3 -0
  304. package/dist/components/pagination/index.js +1 -0
  305. package/dist/components/pagination/pagination.d.ts +43 -0
  306. package/dist/components/pagination/pagination.js +121 -0
  307. package/dist/components/pagination/types.d.ts +37 -0
  308. package/dist/components/phone-input/index.d.ts +3 -0
  309. package/dist/components/phone-input/index.js +1 -0
  310. package/dist/components/phone-input/phone-input.d.ts +7 -0
  311. package/dist/components/phone-input/phone-input.js +54 -0
  312. package/dist/components/phone-input/types.d.ts +12 -0
  313. package/dist/components/popover/index.d.ts +3 -0
  314. package/dist/components/popover/index.js +1 -0
  315. package/dist/components/popover/popover.d.ts +37 -0
  316. package/dist/components/popover/popover.js +100 -0
  317. package/dist/components/popover/types.d.ts +51 -0
  318. package/dist/components/progress/index.d.ts +3 -0
  319. package/dist/components/progress/index.js +1 -0
  320. package/dist/components/progress/progress.d.ts +32 -0
  321. package/dist/components/progress/progress.js +100 -0
  322. package/dist/components/progress/types.d.ts +31 -0
  323. package/dist/components/questionnaire/index.d.ts +3 -0
  324. package/dist/components/questionnaire/index.js +1 -0
  325. package/dist/components/questionnaire/questionnaire-primitive.js +1563 -0
  326. package/dist/components/questionnaire/questionnaire.d.ts +91 -0
  327. package/dist/components/questionnaire/questionnaire.js +315 -0
  328. package/dist/components/questionnaire/types.d.ts +203 -0
  329. package/dist/components/radio-group/index.d.ts +3 -0
  330. package/dist/components/radio-group/index.js +1 -0
  331. package/dist/components/radio-group/radio-group.d.ts +13 -0
  332. package/dist/components/radio-group/radio-group.js +44 -0
  333. package/dist/components/radio-group/types.d.ts +33 -0
  334. package/dist/components/reorder-list/index.d.ts +3 -0
  335. package/dist/components/reorder-list/index.js +1 -0
  336. package/dist/components/reorder-list/reorder-list.d.ts +19 -0
  337. package/dist/components/reorder-list/reorder-list.js +279 -0
  338. package/dist/components/reorder-list/types.d.ts +65 -0
  339. package/dist/components/resizable/index.d.ts +3 -0
  340. package/dist/components/resizable/index.js +1 -0
  341. package/dist/components/resizable/resizable.d.ts +19 -0
  342. package/dist/components/resizable/resizable.js +44 -0
  343. package/dist/components/resizable/types.d.ts +89 -0
  344. package/dist/components/scroll-area/index.d.ts +3 -0
  345. package/dist/components/scroll-area/index.js +1 -0
  346. package/dist/components/scroll-area/scroll-area.d.ts +13 -0
  347. package/dist/components/scroll-area/scroll-area.js +47 -0
  348. package/dist/components/scroll-area/types.d.ts +19 -0
  349. package/dist/components/select/index.d.ts +3 -0
  350. package/dist/components/select/index.js +1 -0
  351. package/dist/components/select/select.d.ts +61 -0
  352. package/dist/components/select/select.js +183 -0
  353. package/dist/components/select/types.d.ts +100 -0
  354. package/dist/components/separator/index.d.ts +3 -0
  355. package/dist/components/separator/index.js +1 -0
  356. package/dist/components/separator/separator.d.ts +7 -0
  357. package/dist/components/separator/separator.js +20 -0
  358. package/dist/components/separator/types.d.ts +9 -0
  359. package/dist/components/sheet/index.d.ts +3 -0
  360. package/dist/components/sheet/index.js +1 -0
  361. package/dist/components/sheet/sheet.d.ts +61 -0
  362. package/dist/components/sheet/sheet.js +155 -0
  363. package/dist/components/sheet/types.d.ts +69 -0
  364. package/dist/components/sidebar/index.d.ts +3 -0
  365. package/dist/components/sidebar/index.js +3 -0
  366. package/dist/components/sidebar/sidebar.d.ts +145 -0
  367. package/dist/components/sidebar/sidebar.js +550 -0
  368. package/dist/components/sidebar/types.d.ts +186 -0
  369. package/dist/components/sidebar/types.js +42 -0
  370. package/dist/components/sidebar/use-mobile.js +21 -0
  371. package/dist/components/skeleton/index.d.ts +3 -0
  372. package/dist/components/skeleton/index.js +1 -0
  373. package/dist/components/skeleton/skeleton.d.ts +8 -0
  374. package/dist/components/skeleton/skeleton.js +18 -0
  375. package/dist/components/skeleton/types.d.ts +5 -0
  376. package/dist/components/slider/index.d.ts +3 -0
  377. package/dist/components/slider/index.js +1 -0
  378. package/dist/components/slider/slider.d.ts +7 -0
  379. package/dist/components/slider/slider.js +106 -0
  380. package/dist/components/slider/types.d.ts +39 -0
  381. package/dist/components/spinner/index.d.ts +3 -0
  382. package/dist/components/spinner/index.js +1 -0
  383. package/dist/components/spinner/spinner.d.ts +7 -0
  384. package/dist/components/spinner/spinner.js +21 -0
  385. package/dist/components/spinner/types.d.ts +8 -0
  386. package/dist/components/stack/index.d.ts +3 -0
  387. package/dist/components/stack/index.js +3 -0
  388. package/dist/components/stack/stack.d.ts +7 -0
  389. package/dist/components/stack/stack.js +29 -0
  390. package/dist/components/stack/types.d.ts +56 -0
  391. package/dist/components/stack/types.js +62 -0
  392. package/dist/components/statistics/index.d.ts +3 -0
  393. package/dist/components/statistics/index.js +3 -0
  394. package/dist/components/statistics/statistics.d.ts +31 -0
  395. package/dist/components/statistics/statistics.js +141 -0
  396. package/dist/components/statistics/types.d.ts +84 -0
  397. package/dist/components/statistics/types.js +27 -0
  398. package/dist/components/switch/index.d.ts +3 -0
  399. package/dist/components/switch/index.js +3 -0
  400. package/dist/components/switch/switch.d.ts +7 -0
  401. package/dist/components/switch/switch.js +32 -0
  402. package/dist/components/switch/types.d.ts +37 -0
  403. package/dist/components/switch/types.js +23 -0
  404. package/dist/components/table/index.d.ts +3 -0
  405. package/dist/components/table/index.js +1 -0
  406. package/dist/components/table/table.d.ts +49 -0
  407. package/dist/components/table/table.js +112 -0
  408. package/dist/components/table/types.d.ts +33 -0
  409. package/dist/components/tabs/index.d.ts +3 -0
  410. package/dist/components/tabs/index.js +3 -0
  411. package/dist/components/tabs/tabs.d.ts +25 -0
  412. package/dist/components/tabs/tabs.js +81 -0
  413. package/dist/components/tabs/types.d.ts +61 -0
  414. package/dist/components/tabs/types.js +18 -0
  415. package/dist/components/textarea/index.d.ts +3 -0
  416. package/dist/components/textarea/index.js +1 -0
  417. package/dist/components/textarea/textarea.d.ts +7 -0
  418. package/dist/components/textarea/textarea.js +17 -0
  419. package/dist/components/textarea/types.d.ts +26 -0
  420. package/dist/components/toast/index.d.ts +3 -0
  421. package/dist/components/toast/index.js +1 -0
  422. package/dist/components/toast/toast.d.ts +63 -0
  423. package/dist/components/toast/toast.js +321 -0
  424. package/dist/components/toast/types.d.ts +120 -0
  425. package/dist/components/toggle/index.d.ts +3 -0
  426. package/dist/components/toggle/index.js +3 -0
  427. package/dist/components/toggle/toggle.d.ts +7 -0
  428. package/dist/components/toggle/toggle.js +32 -0
  429. package/dist/components/toggle/types.d.ts +35 -0
  430. package/dist/components/toggle/types.js +37 -0
  431. package/dist/components/toggle-group/index.d.ts +3 -0
  432. package/dist/components/toggle-group/index.js +1 -0
  433. package/dist/components/toggle-group/toggle-group.d.ts +13 -0
  434. package/dist/components/toggle-group/toggle-group.js +88 -0
  435. package/dist/components/toggle-group/types.d.ts +52 -0
  436. package/dist/components/tooltip/index.d.ts +3 -0
  437. package/dist/components/tooltip/index.js +1 -0
  438. package/dist/components/tooltip/tooltip.d.ts +25 -0
  439. package/dist/components/tooltip/tooltip.js +79 -0
  440. package/dist/components/tooltip/types.d.ts +48 -0
  441. package/dist/components/trace/index.d.ts +3 -0
  442. package/dist/components/trace/index.js +1 -0
  443. package/dist/components/trace/trace.d.ts +52 -0
  444. package/dist/components/trace/trace.js +132 -0
  445. package/dist/components/trace/types.d.ts +54 -0
  446. package/dist/components/typography/index.d.ts +3 -0
  447. package/dist/components/typography/index.js +3 -0
  448. package/dist/components/typography/types.d.ts +29 -0
  449. package/dist/components/typography/types.js +25 -0
  450. package/dist/components/typography/typography.d.ts +7 -0
  451. package/dist/components/typography/typography.js +40 -0
  452. package/dist/components/video-player/index.d.ts +6 -0
  453. package/dist/components/video-player/index.js +5 -0
  454. package/dist/components/video-player/types.d.ts +143 -0
  455. package/dist/components/video-player/use-video-player.js +319 -0
  456. package/dist/components/video-player/video-player-context.d.ts +45 -0
  457. package/dist/components/video-player/video-player-context.js +15 -0
  458. package/dist/components/video-player/video-player-controls.d.ts +38 -0
  459. package/dist/components/video-player/video-player-controls.js +226 -0
  460. package/dist/components/video-player/video-player-overlay.d.ts +13 -0
  461. package/dist/components/video-player/video-player-overlay.js +113 -0
  462. package/dist/components/video-player/video-player.d.ts +8 -0
  463. package/dist/components/video-player/video-player.js +139 -0
  464. package/dist/index.d.ts +259 -0
  465. package/dist/index.js +124 -0
  466. package/dist/lib/floating.d.ts +44 -0
  467. package/dist/lib/focus-source.js +51 -0
  468. package/dist/lib/format.d.ts +67 -0
  469. package/dist/lib/format.js +130 -0
  470. package/dist/lib/locale.d.ts +104 -0
  471. package/dist/lib/locale.js +103 -0
  472. package/dist/lib/part-props.d.ts +15 -0
  473. package/dist/lib/use-controllable-state.js +22 -0
  474. package/dist/lib/utils.d.ts +9 -0
  475. package/dist/lib/utils.js +16 -0
  476. package/dist/styles/index.css +128 -0
  477. package/dist/styles/theme.css +84 -0
  478. package/dist/styles/utilities.css +553 -0
  479. package/package.json +89 -3
@@ -0,0 +1,102 @@
1
+ import { gapClasses } from "../stack/types.js";
2
+ import { cva } from "class-variance-authority";
3
+ // src/components/grid/types.ts
4
+ /**
5
+ * Классы колонок по брейкпоинтам.
6
+ * Перечислены целиком, чтобы Tailwind потребителя их увидел.
7
+ */
8
+ const gridColumnsClasses = {
9
+ "base": {
10
+ 1: "grid-cols-1",
11
+ 2: "grid-cols-2",
12
+ 3: "grid-cols-3",
13
+ 4: "grid-cols-4",
14
+ 5: "grid-cols-5",
15
+ 6: "grid-cols-6",
16
+ 7: "grid-cols-7",
17
+ 8: "grid-cols-8",
18
+ 9: "grid-cols-9",
19
+ 10: "grid-cols-10",
20
+ 11: "grid-cols-11",
21
+ 12: "grid-cols-12"
22
+ },
23
+ "sm": {
24
+ 1: "sm:grid-cols-1",
25
+ 2: "sm:grid-cols-2",
26
+ 3: "sm:grid-cols-3",
27
+ 4: "sm:grid-cols-4",
28
+ 5: "sm:grid-cols-5",
29
+ 6: "sm:grid-cols-6",
30
+ 7: "sm:grid-cols-7",
31
+ 8: "sm:grid-cols-8",
32
+ 9: "sm:grid-cols-9",
33
+ 10: "sm:grid-cols-10",
34
+ 11: "sm:grid-cols-11",
35
+ 12: "sm:grid-cols-12"
36
+ },
37
+ "md": {
38
+ 1: "md:grid-cols-1",
39
+ 2: "md:grid-cols-2",
40
+ 3: "md:grid-cols-3",
41
+ 4: "md:grid-cols-4",
42
+ 5: "md:grid-cols-5",
43
+ 6: "md:grid-cols-6",
44
+ 7: "md:grid-cols-7",
45
+ 8: "md:grid-cols-8",
46
+ 9: "md:grid-cols-9",
47
+ 10: "md:grid-cols-10",
48
+ 11: "md:grid-cols-11",
49
+ 12: "md:grid-cols-12"
50
+ },
51
+ "lg": {
52
+ 1: "lg:grid-cols-1",
53
+ 2: "lg:grid-cols-2",
54
+ 3: "lg:grid-cols-3",
55
+ 4: "lg:grid-cols-4",
56
+ 5: "lg:grid-cols-5",
57
+ 6: "lg:grid-cols-6",
58
+ 7: "lg:grid-cols-7",
59
+ 8: "lg:grid-cols-8",
60
+ 9: "lg:grid-cols-9",
61
+ 10: "lg:grid-cols-10",
62
+ 11: "lg:grid-cols-11",
63
+ 12: "lg:grid-cols-12"
64
+ },
65
+ "xl": {
66
+ 1: "xl:grid-cols-1",
67
+ 2: "xl:grid-cols-2",
68
+ 3: "xl:grid-cols-3",
69
+ 4: "xl:grid-cols-4",
70
+ 5: "xl:grid-cols-5",
71
+ 6: "xl:grid-cols-6",
72
+ 7: "xl:grid-cols-7",
73
+ 8: "xl:grid-cols-8",
74
+ 9: "xl:grid-cols-9",
75
+ 10: "xl:grid-cols-10",
76
+ 11: "xl:grid-cols-11",
77
+ 12: "xl:grid-cols-12"
78
+ },
79
+ "2xl": {
80
+ 1: "2xl:grid-cols-1",
81
+ 2: "2xl:grid-cols-2",
82
+ 3: "2xl:grid-cols-3",
83
+ 4: "2xl:grid-cols-4",
84
+ 5: "2xl:grid-cols-5",
85
+ 6: "2xl:grid-cols-6",
86
+ 7: "2xl:grid-cols-7",
87
+ 8: "2xl:grid-cols-8",
88
+ 9: "2xl:grid-cols-9",
89
+ 10: "2xl:grid-cols-10",
90
+ 11: "2xl:grid-cols-11",
91
+ 12: "2xl:grid-cols-12"
92
+ }
93
+ };
94
+ /**
95
+ * Стили сетки: отступ между ячейками. Колонки — gridColumnsClasses.
96
+ * Экспортируются, чтобы разложить сеткой другой элемент: gridVariants({ gap: 4 }).
97
+ */
98
+ const gridVariants = cva("grid", {
99
+ variants: { gap: gapClasses },
100
+ defaultVariants: { gap: 4 }
101
+ });
102
+ export { gridColumnsClasses, gridVariants };
@@ -0,0 +1,19 @@
1
+ import { HoverCardContentPropsT, HoverCardPropsT, HoverCardTriggerPropsT } from "./types.js";
2
+ /**
3
+ * Карточка при наведении: превью содержимого за ссылкой. Только для зрячих пользователей мыши
4
+ * @param props - пропсы карточки
5
+ * @returns корень без своей разметки
6
+ */
7
+ export declare function HoverCard({ onOpenChange, ...props }: HoverCardPropsT): import("react").JSX.Element;
8
+ /**
9
+ * Ссылка с карточкой: при наведении показывает её. Свой элемент — через render={<Button />}
10
+ * @param props - пропсы ссылки
11
+ * @returns a
12
+ */
13
+ export declare function HoverCardTrigger(props: HoverCardTriggerPropsT): import("react").JSX.Element;
14
+ /**
15
+ * Содержимое карточки: рендерится в портале рядом со ссылкой
16
+ * @param props - пропсы содержимого; по умолчанию align="center", sideOffset={4}
17
+ * @returns портал с карточкой
18
+ */
19
+ export declare function HoverCardContent({ className, side, sideOffset, align, alignOffset, collisionPadding, arrowPadding, sticky, ...props }: HoverCardContentPropsT): import("react").JSX.Element;
@@ -0,0 +1,63 @@
1
+ "use client";
2
+ import { cn } from "../../lib/utils.js";
3
+ import { jsx } from "react/jsx-runtime";
4
+ import { PreviewCard } from "@base-ui/react/preview-card";
5
+ // src/components/hover-card/hover-card.tsx
6
+ /**
7
+ * Карточка при наведении: превью содержимого за ссылкой. Только для зрячих пользователей мыши
8
+ * @param props - пропсы карточки
9
+ * @returns корень без своей разметки
10
+ */
11
+ function HoverCard({ onOpenChange, ...props }) {
12
+ /**
13
+ * Карточку показали или скрыли: наружу только флаг
14
+ * @param open - открыта ли
15
+ */
16
+ const handleOpenChange = (open) => onOpenChange?.(open);
17
+ return /* @__PURE__ */ jsx(PreviewCard.Root, {
18
+ "data-slot": "hover-card",
19
+ onOpenChange: handleOpenChange,
20
+ ...props
21
+ });
22
+ }
23
+ /**
24
+ * Ссылка с карточкой: при наведении показывает её. Свой элемент — через render={<Button />}
25
+ * @param props - пропсы ссылки
26
+ * @returns a
27
+ */
28
+ function HoverCardTrigger(props) {
29
+ return /* @__PURE__ */ jsx(PreviewCard.Trigger, {
30
+ "data-slot": "hover-card-trigger",
31
+ ...props
32
+ });
33
+ }
34
+ /**
35
+ * Содержимое карточки: рендерится в портале рядом со ссылкой
36
+ * @param props - пропсы содержимого; по умолчанию align="center", sideOffset={4}
37
+ * @returns портал с карточкой
38
+ */
39
+ function HoverCardContent({ className, side = "bottom", sideOffset = 4, align = "center", alignOffset = 0, collisionPadding, arrowPadding, sticky, ...props }) {
40
+ const classes = cn("z-50", "w-64", "origin-(--transform-origin)", "rounded-lg", "bg-popover", "p-2.5", "text-sm", "text-popover-foreground", "shadow-md", "ring-1", "ring-foreground/10", "outline-hidden", "duration-100", "data-open:animate-in", "data-open:fade-in-0", "data-open:zoom-in-95", "data-closed:animate-out", "data-closed:fade-out-0", "data-closed:zoom-out-95", "data-[side=bottom]:slide-in-from-top-2", "data-[side=left]:slide-in-from-right-2", "data-[side=right]:slide-in-from-left-2", "data-[side=top]:slide-in-from-bottom-2", className);
41
+ const positionerProps = {
42
+ side,
43
+ sideOffset,
44
+ align,
45
+ alignOffset,
46
+ collisionPadding,
47
+ arrowPadding,
48
+ sticky
49
+ };
50
+ return /* @__PURE__ */ jsx(PreviewCard.Portal, {
51
+ "data-slot": "hover-card-portal",
52
+ children: /* @__PURE__ */ jsx(PreviewCard.Positioner, {
53
+ className: "isolate z-50",
54
+ ...positionerProps,
55
+ children: /* @__PURE__ */ jsx(PreviewCard.Popup, {
56
+ "data-slot": "hover-card-content",
57
+ className: classes,
58
+ ...props
59
+ })
60
+ })
61
+ });
62
+ }
63
+ export { HoverCard, HoverCardContent, HoverCardTrigger };
@@ -0,0 +1,3 @@
1
+ import { HoverCardContentPropsT, HoverCardPropsT, HoverCardTriggerPropsT } from "./types.js";
2
+ import { HoverCard, HoverCardContent, HoverCardTrigger } from "./hover-card.js";
3
+ export { HoverCard, HoverCardContent, type HoverCardContentPropsT, type HoverCardPropsT, HoverCardTrigger, type HoverCardTriggerPropsT };
@@ -0,0 +1 @@
1
+ export { HoverCard, HoverCardContent, HoverCardTrigger } from "./hover-card.js";
@@ -0,0 +1,27 @@
1
+ import { PartPropsT } from "../../lib/part-props.js";
2
+ import { FloatingPropsT } from "../../lib/floating.js";
3
+ import { PreviewCard } from "@base-ui/react/preview-card";
4
+ /**
5
+ * Пропсы карточки при наведении
6
+ */
7
+ export type HoverCardPropsT = Omit<PreviewCard.Root.Props, 'onOpenChange'> & {
8
+ /** Карточка открыта — контролируемый режим, вместе с onOpenChange */
9
+ open?: boolean;
10
+ /** Карточка открыта при первом рендере — неконтролируемый режим */
11
+ defaultOpen?: boolean;
12
+ /** Карточку показали или скрыли: новое состояние */
13
+ onOpenChange?: (open: boolean) => void;
14
+ };
15
+ /**
16
+ * Пропсы ссылки с карточкой
17
+ */
18
+ export type HoverCardTriggerPropsT = PartPropsT<PreviewCard.Trigger.Props> & {
19
+ /** Задержка перед показом в мс. По умолчанию 600 */
20
+ delay?: number;
21
+ /** Задержка перед скрытием в мс. По умолчанию 300 */
22
+ closeDelay?: number;
23
+ };
24
+ /**
25
+ * Пропсы содержимого карточки
26
+ */
27
+ export type HoverCardContentPropsT = PartPropsT<PreviewCard.Popup.Props> & FloatingPropsT;
@@ -0,0 +1,8 @@
1
+ import { ImageGalleryPropsT } from "./types.js";
2
+ /**
3
+ * Галерея изображений: сетка «кирпичной кладки» с ленивой загрузкой.
4
+ * Нажатие на изображение плавно увеличивает его поверх страницы
5
+ * @param props - пропсы галереи
6
+ * @returns контейнер с плитками и просмотром изображения
7
+ */
8
+ export declare function ImageGallery({ images, gap, columns, lazyLoading, filterImages, sortImages, onImageClick, openLabel, closeLabel, itemClassName, viewerClassName, backdropClassName, className, style, ref, ...props }: ImageGalleryPropsT): import("react").JSX.Element;
@@ -0,0 +1,294 @@
1
+ "use client";
2
+ import { cn } from "../../lib/utils.js";
3
+ import { texts } from "../../lib/locale.js";
4
+ import { getMasonryLayout } from "./masonry.js";
5
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
+ import { useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from "react";
7
+ import { AnimatePresence, motion } from "motion/react";
8
+ import { createPortal } from "react-dom";
9
+ // src/components/image-gallery/image-gallery.tsx
10
+ const DEFAULT_OPEN_LABEL = "Открыть изображение";
11
+ const LAZY_MARGIN = 500;
12
+ const MOBILE_WIDTH = 480;
13
+ const TABLET_WIDTH = 768;
14
+ const FALLBACK_RATIOS = [
15
+ .75,
16
+ 1,
17
+ 1.5,
18
+ 2
19
+ ];
20
+ const morphTransition = {
21
+ type: "spring",
22
+ stiffness: 120,
23
+ damping: 15
24
+ };
25
+ /**
26
+ * Изображению без размеров подставляет размеры по номеру, чтобы раскладка была стабильной
27
+ * @param image - изображение
28
+ * @param index - номер в списке
29
+ * @returns изображение с размерами
30
+ */
31
+ function withDimensions(image, index) {
32
+ if (image.width && image.height) return image;
33
+ const ratio = FALLBACK_RATIOS[index % FALLBACK_RATIOS.length] ?? 1;
34
+ return {
35
+ ...image,
36
+ width: 800,
37
+ height: Math.round(800 / ratio)
38
+ };
39
+ }
40
+ /**
41
+ * Скругление элемента в px из его классов. motion сохраняет скругление при анимации
42
+ * размера, только если оно задано числом в style, иначе углы сжимаются вместе с картинкой
43
+ * @param ref - элемент, у которого берётся скругление
44
+ * @returns скругление в px или undefined до измерения
45
+ */
46
+ function useBorderRadius(ref) {
47
+ const [radius, setRadius] = useState();
48
+ useLayoutEffect(() => {
49
+ if (ref.current) setRadius(parseFloat(getComputedStyle(ref.current).borderTopLeftRadius));
50
+ }, [ref]);
51
+ return radius;
52
+ }
53
+ /**
54
+ * Число колонок по ширине галереи
55
+ * @param width - ширина контейнера, px
56
+ * @param columns - число колонок для разной ширины
57
+ * @returns число колонок
58
+ */
59
+ function getColumnCount(width, columns = {}) {
60
+ if (width < MOBILE_WIDTH) return columns.mobile ?? 1;
61
+ if (width < TABLET_WIDTH) return columns.tablet ?? 2;
62
+ return columns.desktop ?? 3;
63
+ }
64
+ /**
65
+ * Галерея изображений: сетка «кирпичной кладки» с ленивой загрузкой.
66
+ * Нажатие на изображение плавно увеличивает его поверх страницы
67
+ * @param props - пропсы галереи
68
+ * @returns контейнер с плитками и просмотром изображения
69
+ */
70
+ function ImageGallery({ images, gap = 16, columns, lazyLoading = true, filterImages, sortImages, onImageClick, openLabel = DEFAULT_OPEN_LABEL, closeLabel = texts.close, itemClassName, viewerClassName, backdropClassName, className, style, ref, ...props }) {
71
+ const galleryId = useId();
72
+ const containerRef = useRef(null);
73
+ const [containerWidth, setContainerWidth] = useState(0);
74
+ const [activeIndex, setActiveIndex] = useState(null);
75
+ const visibleImages = useMemo(() => {
76
+ let result = images.map(withDimensions);
77
+ if (filterImages) result = result.filter(filterImages);
78
+ if (sortImages) result = result.sort(sortImages);
79
+ return result;
80
+ }, [
81
+ images,
82
+ filterImages,
83
+ sortImages
84
+ ]);
85
+ const columnCount = getColumnCount(containerWidth, columns);
86
+ const layout = useMemo(() => getMasonryLayout(visibleImages, containerWidth, columnCount, gap), [
87
+ visibleImages,
88
+ containerWidth,
89
+ columnCount,
90
+ gap
91
+ ]);
92
+ const activeImage = activeIndex === null ? void 0 : visibleImages[activeIndex];
93
+ useEffect(() => {
94
+ const container = containerRef.current;
95
+ if (!container) return;
96
+ const observer = new ResizeObserver(() => setContainerWidth(container.clientWidth));
97
+ setContainerWidth(container.clientWidth);
98
+ observer.observe(container);
99
+ return () => observer.disconnect();
100
+ }, []);
101
+ /**
102
+ * Элемент галереи: для измерения ширины и наружу
103
+ * @param node - элемент или null при размонтировании
104
+ */
105
+ const setRef = (node) => {
106
+ containerRef.current = node;
107
+ if (typeof ref === "function") {
108
+ ref(node);
109
+ return;
110
+ }
111
+ if (ref) ref.current = node;
112
+ };
113
+ /**
114
+ * Нажатие на плитку: открыть изображение и сообщить наружу
115
+ * @param item - плитка
116
+ */
117
+ const handleItemClick = (item) => {
118
+ setActiveIndex(item.index);
119
+ onImageClick?.(item.image, item.index);
120
+ };
121
+ const closeViewer = () => setActiveIndex(null);
122
+ const rootStyle = {
123
+ height: layout.height,
124
+ ...style
125
+ };
126
+ const classes = cn("relative", "w-full", className);
127
+ return /* @__PURE__ */ jsxs("div", {
128
+ "data-slot": "image-gallery",
129
+ ref: setRef,
130
+ className: classes,
131
+ style: rootStyle,
132
+ ...props,
133
+ children: [layout.items.map((item) => /* @__PURE__ */ jsx(ImageGalleryItem, {
134
+ item,
135
+ layoutId: `${galleryId}-${item.index}`,
136
+ lazyLoading,
137
+ openLabel,
138
+ className: itemClassName,
139
+ onOpen: handleItemClick
140
+ }, `${item.image.src}-${item.index}`)), /* @__PURE__ */ jsx(ImageGalleryViewer, {
141
+ image: activeImage,
142
+ layoutId: `${galleryId}-${activeIndex}`,
143
+ closeLabel,
144
+ className: viewerClassName,
145
+ backdropClassName,
146
+ onClose: closeViewer
147
+ })]
148
+ });
149
+ }
150
+ /**
151
+ * Плитка галереи: кнопка с изображением, пока изображение не загружено — заглушка
152
+ * @param props - пропсы плитки
153
+ * @returns кнопка открытия изображения
154
+ */
155
+ function ImageGalleryItem({ item, layoutId, lazyLoading, openLabel, className, onOpen }) {
156
+ const buttonRef = useRef(null);
157
+ const [isNear, setIsNear] = useState(false);
158
+ const isLoaded = !lazyLoading || isNear;
159
+ const radius = useBorderRadius(buttonRef);
160
+ useEffect(() => {
161
+ const button = buttonRef.current;
162
+ if (!lazyLoading || !button) return;
163
+ const observer = new IntersectionObserver((entries) => {
164
+ if (entries.some((entry) => entry.isIntersecting)) {
165
+ setIsNear(true);
166
+ observer.disconnect();
167
+ }
168
+ }, { rootMargin: `${LAZY_MARGIN}px` });
169
+ observer.observe(button);
170
+ return () => observer.disconnect();
171
+ }, [lazyLoading]);
172
+ const classes = cn("group/image-gallery-item", "absolute", "block", "cursor-zoom-in", "rounded-lg", "outline-none", "focus-visible:border-ring", "focus-visible:ring-3", "focus-visible:ring-ring/50", !isLoaded && ["animate-pulse", "bg-muted"], className);
173
+ const buttonStyle = {
174
+ left: item.x,
175
+ top: item.y,
176
+ width: item.width,
177
+ height: item.height
178
+ };
179
+ return /* @__PURE__ */ jsx("button", {
180
+ "data-slot": "image-gallery-item",
181
+ ref: buttonRef,
182
+ type: "button",
183
+ "aria-label": `${openLabel}: ${item.image.alt}`,
184
+ className: classes,
185
+ style: buttonStyle,
186
+ onClick: () => onOpen(item),
187
+ children: isLoaded && /* @__PURE__ */ jsx(motion.img, {
188
+ "data-slot": "image-gallery-image",
189
+ layoutId,
190
+ src: item.image.src,
191
+ alt: "",
192
+ draggable: false,
193
+ transition: morphTransition,
194
+ className: "size-full rounded-[inherit] object-cover object-center",
195
+ style: { borderRadius: radius }
196
+ })
197
+ });
198
+ }
199
+ /**
200
+ * Просмотр: затемнение и увеличенное изображение поверх страницы. Закрывается
201
+ * нажатием, клавишей Escape; прокрутка страницы блокируется
202
+ * @param props - пропсы просмотра
203
+ * @returns портал с затемнением и изображением
204
+ */
205
+ function ImageGalleryViewer({ image, layoutId, closeLabel, className, backdropClassName, onClose }) {
206
+ const [isMounted, setIsMounted] = useState(false);
207
+ const isOpen = image !== void 0;
208
+ useEffect(() => {
209
+ setIsMounted(true);
210
+ }, []);
211
+ useEffect(() => {
212
+ if (!isOpen) return;
213
+ const handleKeyDown = (event) => {
214
+ if (event.key === "Escape") onClose();
215
+ };
216
+ const previousOverflow = document.body.style.overflow;
217
+ const previousFocus = document.activeElement;
218
+ const blockedElements = [];
219
+ for (const element of document.body.children) {
220
+ const slot = element.getAttribute("data-slot");
221
+ if (slot === "image-gallery-backdrop" || slot === "image-gallery-viewer") continue;
222
+ if (!element.hasAttribute("inert")) {
223
+ element.setAttribute("inert", "");
224
+ blockedElements.push(element);
225
+ }
226
+ }
227
+ document.body.style.overflow = "hidden";
228
+ document.addEventListener("keydown", handleKeyDown);
229
+ document.querySelector("[data-slot=\"image-gallery-viewer\"]")?.focus({ preventScroll: true });
230
+ return () => {
231
+ for (const element of blockedElements) element.removeAttribute("inert");
232
+ document.body.style.overflow = previousOverflow;
233
+ document.removeEventListener("keydown", handleKeyDown);
234
+ if (previousFocus instanceof HTMLElement) previousFocus.focus({ preventScroll: true });
235
+ };
236
+ }, [isOpen, onClose]);
237
+ if (!isMounted) return null;
238
+ const backdropClasses = cn("fixed", "inset-0", "z-50", "cursor-zoom-out", "bg-black/80", backdropClassName);
239
+ const imageClasses = cn("pointer-events-auto", "max-h-[90vh]", "max-w-[90vw]", "cursor-zoom-out", "rounded-lg", "object-cover", "object-center", className);
240
+ return createPortal(/* @__PURE__ */ jsx(AnimatePresence, { children: image && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(motion.button, {
241
+ "data-slot": "image-gallery-backdrop",
242
+ type: "button",
243
+ "aria-label": closeLabel,
244
+ tabIndex: -1,
245
+ className: backdropClasses,
246
+ initial: { opacity: 0 },
247
+ animate: {
248
+ opacity: 1,
249
+ pointerEvents: "auto"
250
+ },
251
+ exit: {
252
+ opacity: 0,
253
+ pointerEvents: "none"
254
+ },
255
+ transition: { duration: .3 },
256
+ onClick: onClose
257
+ }, "backdrop"), /* @__PURE__ */ jsx("div", {
258
+ "data-slot": "image-gallery-viewer",
259
+ role: "dialog",
260
+ "aria-modal": true,
261
+ "aria-label": image.alt,
262
+ tabIndex: -1,
263
+ className: "pointer-events-none fixed inset-0 z-50 flex items-center justify-center outline-none",
264
+ children: /* @__PURE__ */ jsx(ImageGalleryViewerImage, {
265
+ image,
266
+ layoutId,
267
+ className: imageClasses,
268
+ onClose
269
+ })
270
+ }, layoutId)] }) }), document.body);
271
+ }
272
+ /**
273
+ * Увеличенное изображение: прилетает из плитки и улетает обратно, сохраняя скругление
274
+ * @param props - пропсы изображения
275
+ * @returns изображение
276
+ */
277
+ function ImageGalleryViewerImage({ image, layoutId, className, onClose }) {
278
+ const imageRef = useRef(null);
279
+ const radius = useBorderRadius(imageRef);
280
+ return /* @__PURE__ */ jsx(motion.img, {
281
+ "data-slot": "image-gallery-viewer-image",
282
+ ref: imageRef,
283
+ layoutId,
284
+ src: image.src,
285
+ alt: image.alt,
286
+ animate: { pointerEvents: "auto" },
287
+ exit: { pointerEvents: "none" },
288
+ transition: morphTransition,
289
+ className,
290
+ style: { borderRadius: radius },
291
+ onClick: onClose
292
+ });
293
+ }
294
+ export { ImageGallery };
@@ -0,0 +1,4 @@
1
+ import { ImageGalleryColumnsI, ImageGalleryImageI, ImageGalleryPropsT, MasonryItemI, MasonryLayoutI } from "./types.js";
2
+ import { ImageGallery } from "./image-gallery.js";
3
+ import { getMasonryLayout } from "./masonry.js";
4
+ export { ImageGallery, type ImageGalleryColumnsI, type ImageGalleryImageI, type ImageGalleryPropsT, type MasonryItemI, type MasonryLayoutI, getMasonryLayout };
@@ -0,0 +1,3 @@
1
+ import { getMasonryLayout } from "./masonry.js";
2
+ import { ImageGallery } from "./image-gallery.js";
3
+ export { ImageGallery, getMasonryLayout };
@@ -0,0 +1,11 @@
1
+ import { ImageGalleryImageI, MasonryLayoutI } from "./types.js";
2
+ /**
3
+ * Раскладка «кирпичной кладки»: каждое изображение идёт в самую низкую колонку,
4
+ * затем плитки колонки растягиваются так, чтобы все колонки закончились на одной высоте
5
+ * @param images - изображения
6
+ * @param containerWidth - ширина контейнера, px
7
+ * @param columnCount - число колонок
8
+ * @param gap - промежуток между плитками, px
9
+ * @returns плитки с позициями и общая высота
10
+ */
11
+ export declare function getMasonryLayout(images: ImageGalleryImageI[], containerWidth: number, columnCount: number, gap: number): MasonryLayoutI;
@@ -0,0 +1,62 @@
1
+ // src/components/image-gallery/masonry.ts
2
+ /**
3
+ * Пропорции изображения: ширина к высоте, квадрат, если размеры не заданы
4
+ * @param image - изображение
5
+ * @returns отношение ширины к высоте
6
+ */
7
+ function getAspectRatio(image) {
8
+ if (image.width && image.height) return image.width / image.height;
9
+ return 1;
10
+ }
11
+ /**
12
+ * Раскладка «кирпичной кладки»: каждое изображение идёт в самую низкую колонку,
13
+ * затем плитки колонки растягиваются так, чтобы все колонки закончились на одной высоте
14
+ * @param images - изображения
15
+ * @param containerWidth - ширина контейнера, px
16
+ * @param columnCount - число колонок
17
+ * @param gap - промежуток между плитками, px
18
+ * @returns плитки с позициями и общая высота
19
+ */
20
+ function getMasonryLayout(images, containerWidth, columnCount, gap) {
21
+ if (containerWidth <= 0 || images.length === 0 || columnCount < 1) return {
22
+ items: [],
23
+ height: 0
24
+ };
25
+ const columnWidth = (containerWidth - gap * (columnCount - 1)) / columnCount;
26
+ const columnHeights = Array.from({ length: columnCount }, () => 0);
27
+ const columns = Array.from({ length: columnCount }, () => []);
28
+ images.forEach((image, index) => {
29
+ const columnIndex = columnHeights.indexOf(Math.min(...columnHeights));
30
+ columnHeights[columnIndex] = (columnHeights[columnIndex] ?? 0) + columnWidth / getAspectRatio(image) + gap;
31
+ columns[columnIndex]?.push({
32
+ image,
33
+ index
34
+ });
35
+ });
36
+ const totalHeight = Math.max(...columnHeights) - gap;
37
+ const items = [];
38
+ columns.forEach((column, columnIndex) => {
39
+ if (column.length === 0) return;
40
+ let imagesHeight = 0;
41
+ for (const { image } of column) imagesHeight += columnWidth / getAspectRatio(image);
42
+ const scale = (totalHeight - gap * (column.length - 1)) / imagesHeight;
43
+ let offsetY = 0;
44
+ for (const { image, index } of column) {
45
+ const height = columnWidth / getAspectRatio(image) * scale;
46
+ items.push({
47
+ image,
48
+ index,
49
+ x: columnIndex * (columnWidth + gap),
50
+ y: offsetY,
51
+ width: columnWidth,
52
+ height
53
+ });
54
+ offsetY += height + gap;
55
+ }
56
+ });
57
+ return {
58
+ items,
59
+ height: totalHeight
60
+ };
61
+ }
62
+ export { getMasonryLayout };