@smitch/breeze 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (473) hide show
  1. package/.npmignore +14 -0
  2. package/README.md +485 -0
  3. package/index.d.ts +1 -0
  4. package/index.js +1 -0
  5. package/lib/@hooks/useWindowWidth.js +17 -0
  6. package/lib/@hooks/useWindowWidth.js.map +1 -0
  7. package/lib/@utils/merge.js +35 -0
  8. package/lib/@utils/merge.js.map +1 -0
  9. package/lib/accordion/Accordion.js +28 -0
  10. package/lib/accordion/Accordion.js.map +1 -0
  11. package/lib/accordion/atoms/AccordionCard.js +9 -0
  12. package/lib/accordion/atoms/AccordionCard.js.map +1 -0
  13. package/lib/accordion/atoms/AccordionHead.js +23 -0
  14. package/lib/accordion/atoms/AccordionHead.js.map +1 -0
  15. package/lib/accordion/atoms/AccordionItem.js +10 -0
  16. package/lib/accordion/atoms/AccordionItem.js.map +1 -0
  17. package/lib/accordion/atoms/AccordionSection.js +8 -0
  18. package/lib/accordion/atoms/AccordionSection.js.map +1 -0
  19. package/lib/accordion/atoms/index.js +5 -0
  20. package/lib/accordion/atoms/index.js.map +1 -0
  21. package/lib/accordion/index.js +3 -0
  22. package/lib/accordion/index.js.map +1 -0
  23. package/lib/accordion/types/index.js +2 -0
  24. package/lib/accordion/types/index.js.map +1 -0
  25. package/lib/alert/Alert.js +42 -0
  26. package/lib/alert/Alert.js.map +1 -0
  27. package/lib/alert/index.js +2 -0
  28. package/lib/alert/index.js.map +1 -0
  29. package/lib/alert/types/index.js +2 -0
  30. package/lib/alert/types/index.js.map +1 -0
  31. package/lib/autocomplete/Autocomplete.js +9 -0
  32. package/lib/autocomplete/Autocomplete.js.map +1 -0
  33. package/lib/autocomplete/index.js +2 -0
  34. package/lib/autocomplete/index.js.map +1 -0
  35. package/lib/autocomplete/types/index.js +2 -0
  36. package/lib/autocomplete/types/index.js.map +1 -0
  37. package/lib/badge/Badge.js +57 -0
  38. package/lib/badge/Badge.js.map +1 -0
  39. package/lib/badge/index.js +2 -0
  40. package/lib/badge/index.js.map +1 -0
  41. package/lib/badge/types/index.js +2 -0
  42. package/lib/badge/types/index.js.map +1 -0
  43. package/lib/blockquote/Blockquote.js +22 -0
  44. package/lib/blockquote/Blockquote.js.map +1 -0
  45. package/lib/blockquote/index.js +2 -0
  46. package/lib/blockquote/index.js.map +1 -0
  47. package/lib/blockquote/types/index.js +2 -0
  48. package/lib/blockquote/types/index.js.map +1 -0
  49. package/lib/breadcrumbs/Breadcrumbs.js +47 -0
  50. package/lib/breadcrumbs/Breadcrumbs.js.map +1 -0
  51. package/lib/breadcrumbs/index.js +2 -0
  52. package/lib/breadcrumbs/index.js.map +1 -0
  53. package/lib/breadcrumbs/types/index.js +2 -0
  54. package/lib/breadcrumbs/types/index.js.map +1 -0
  55. package/lib/button/Button.js +76 -0
  56. package/lib/button/Button.js.map +1 -0
  57. package/lib/button/index.js +3 -0
  58. package/lib/button/index.js.map +1 -0
  59. package/lib/button/types/index.js +2 -0
  60. package/lib/button/types/index.js.map +1 -0
  61. package/lib/button/variants/CloseButton.js +18 -0
  62. package/lib/button/variants/CloseButton.js.map +1 -0
  63. package/lib/button/variants/index.js +2 -0
  64. package/lib/button/variants/index.js.map +1 -0
  65. package/lib/button/variants/types/index.js +2 -0
  66. package/lib/button/variants/types/index.js.map +1 -0
  67. package/lib/buttongroup/ButtonGroup.js +35 -0
  68. package/lib/buttongroup/ButtonGroup.js.map +1 -0
  69. package/lib/buttongroup/index.js +2 -0
  70. package/lib/buttongroup/index.js.map +1 -0
  71. package/lib/buttongroup/types/index.js +2 -0
  72. package/lib/buttongroup/types/index.js.map +1 -0
  73. package/lib/card/Card.js +32 -0
  74. package/lib/card/Card.js.map +1 -0
  75. package/lib/card/atoms/CardBody.js +8 -0
  76. package/lib/card/atoms/CardBody.js.map +1 -0
  77. package/lib/card/atoms/CardFooter.js +9 -0
  78. package/lib/card/atoms/CardFooter.js.map +1 -0
  79. package/lib/card/atoms/CardHeader.js +8 -0
  80. package/lib/card/atoms/CardHeader.js.map +1 -0
  81. package/lib/card/atoms/CardImage.js +16 -0
  82. package/lib/card/atoms/CardImage.js.map +1 -0
  83. package/lib/card/index.js +6 -0
  84. package/lib/card/index.js.map +1 -0
  85. package/lib/card/types/index.js +2 -0
  86. package/lib/card/types/index.js.map +1 -0
  87. package/lib/carousel/Carousel.js +147 -0
  88. package/lib/carousel/Carousel.js.map +1 -0
  89. package/lib/carousel/index.js +2 -0
  90. package/lib/carousel/index.js.map +1 -0
  91. package/lib/carousel/types/index.js +2 -0
  92. package/lib/carousel/types/index.js.map +1 -0
  93. package/lib/charts/BarChart.js +24 -0
  94. package/lib/charts/BarChart.js.map +1 -0
  95. package/lib/charts/BubbleChart.js +24 -0
  96. package/lib/charts/BubbleChart.js.map +1 -0
  97. package/lib/charts/ChartWrap.js +69 -0
  98. package/lib/charts/ChartWrap.js.map +1 -0
  99. package/lib/charts/DoughnutChart.js +20 -0
  100. package/lib/charts/DoughnutChart.js.map +1 -0
  101. package/lib/charts/LineChart.js +24 -0
  102. package/lib/charts/LineChart.js.map +1 -0
  103. package/lib/charts/MixedChart.js +24 -0
  104. package/lib/charts/MixedChart.js.map +1 -0
  105. package/lib/charts/PieChart.js +20 -0
  106. package/lib/charts/PieChart.js.map +1 -0
  107. package/lib/charts/PolarAreaChart.js +23 -0
  108. package/lib/charts/PolarAreaChart.js.map +1 -0
  109. package/lib/charts/RadarChart.js +23 -0
  110. package/lib/charts/RadarChart.js.map +1 -0
  111. package/lib/charts/ScatterChart.js +24 -0
  112. package/lib/charts/ScatterChart.js.map +1 -0
  113. package/lib/charts/index.js +10 -0
  114. package/lib/charts/index.js.map +1 -0
  115. package/lib/charts/types/index.js +2 -0
  116. package/lib/charts/types/index.js.map +1 -0
  117. package/lib/checkbox/Checkbox.js +9 -0
  118. package/lib/checkbox/Checkbox.js.map +1 -0
  119. package/lib/checkbox/index.js +2 -0
  120. package/lib/checkbox/index.js.map +1 -0
  121. package/lib/checkbox/types/index.js +2 -0
  122. package/lib/checkbox/types/index.js.map +1 -0
  123. package/lib/clock/Clock.js +99 -0
  124. package/lib/clock/Clock.js.map +1 -0
  125. package/lib/clock/index.js +2 -0
  126. package/lib/clock/index.js.map +1 -0
  127. package/lib/clock/types/index.js +2 -0
  128. package/lib/clock/types/index.js.map +1 -0
  129. package/lib/codeblock/Codeblock.js +21 -0
  130. package/lib/codeblock/Codeblock.js.map +1 -0
  131. package/lib/codeblock/index.js +2 -0
  132. package/lib/codeblock/index.js.map +1 -0
  133. package/lib/codeblock/types/index.js +2 -0
  134. package/lib/codeblock/types/index.js.map +1 -0
  135. package/lib/counter/Counter.js +39 -0
  136. package/lib/counter/Counter.js.map +1 -0
  137. package/lib/counter/index.js +2 -0
  138. package/lib/counter/index.js.map +1 -0
  139. package/lib/counter/types/index.js +2 -0
  140. package/lib/counter/types/index.js.map +1 -0
  141. package/lib/datatable/DataTable.js +44 -0
  142. package/lib/datatable/DataTable.js.map +1 -0
  143. package/lib/datatable/index.js +2 -0
  144. package/lib/datatable/index.js.map +1 -0
  145. package/lib/datatable/types/index.js +2 -0
  146. package/lib/datatable/types/index.js.map +1 -0
  147. package/lib/dialog/Dialog.js +45 -0
  148. package/lib/dialog/Dialog.js.map +1 -0
  149. package/lib/dialog/hooks/useDisableBack.js +16 -0
  150. package/lib/dialog/hooks/useDisableBack.js.map +1 -0
  151. package/lib/dialog/index.js +2 -0
  152. package/lib/dialog/index.js.map +1 -0
  153. package/lib/dialog/types/index.js +2 -0
  154. package/lib/dialog/types/index.js.map +1 -0
  155. package/lib/drawer/Drawer.js +39 -0
  156. package/lib/drawer/Drawer.js.map +1 -0
  157. package/lib/drawer/index.js +2 -0
  158. package/lib/drawer/index.js.map +1 -0
  159. package/lib/drawer/types/index.js +2 -0
  160. package/lib/drawer/types/index.js.map +1 -0
  161. package/lib/dropdown/Dropdown.js +40 -0
  162. package/lib/dropdown/Dropdown.js.map +1 -0
  163. package/lib/dropdown/index.js +2 -0
  164. package/lib/dropdown/index.js.map +1 -0
  165. package/lib/dropdown/types/index.js +2 -0
  166. package/lib/dropdown/types/index.js.map +1 -0
  167. package/lib/figure/Figure.js +42 -0
  168. package/lib/figure/Figure.js.map +1 -0
  169. package/lib/figure/index.js +2 -0
  170. package/lib/figure/index.js.map +1 -0
  171. package/lib/figure/types/index.js +2 -0
  172. package/lib/figure/types/index.js.map +1 -0
  173. package/lib/fileupload/FileUpload.js +52 -0
  174. package/lib/fileupload/FileUpload.js.map +1 -0
  175. package/lib/fileupload/Files.js +22 -0
  176. package/lib/fileupload/Files.js.map +1 -0
  177. package/lib/fileupload/index.js +2 -0
  178. package/lib/fileupload/index.js.map +1 -0
  179. package/lib/fileupload/types/index.js +25 -0
  180. package/lib/fileupload/types/index.js.map +1 -0
  181. package/lib/form/Fieldset.js +9 -0
  182. package/lib/form/Fieldset.js.map +1 -0
  183. package/lib/form/Form.js +64 -0
  184. package/lib/form/Form.js.map +1 -0
  185. package/lib/form/Legend.js +21 -0
  186. package/lib/form/Legend.js.map +1 -0
  187. package/lib/form/RegisterForm.js +19 -0
  188. package/lib/form/RegisterForm.js.map +1 -0
  189. package/lib/form/index.js +5 -0
  190. package/lib/form/index.js.map +1 -0
  191. package/lib/form/types/index.js +2 -0
  192. package/lib/form/types/index.js.map +1 -0
  193. package/lib/gallery/Gallery.js +12 -0
  194. package/lib/gallery/Gallery.js.map +1 -0
  195. package/lib/gallery/index.js +2 -0
  196. package/lib/gallery/index.js.map +1 -0
  197. package/lib/gallery/types/index.js +2 -0
  198. package/lib/gallery/types/index.js.map +1 -0
  199. package/lib/heading/Heading.js +38 -0
  200. package/lib/heading/Heading.js.map +1 -0
  201. package/lib/heading/index.js +2 -0
  202. package/lib/heading/index.js.map +1 -0
  203. package/lib/heading/types/index.js +2 -0
  204. package/lib/heading/types/index.js.map +1 -0
  205. package/lib/hero/Hero.js +72 -0
  206. package/lib/hero/Hero.js.map +1 -0
  207. package/lib/hero/index.js +2 -0
  208. package/lib/hero/index.js.map +1 -0
  209. package/lib/hero/types/index.js +2 -0
  210. package/lib/hero/types/index.js.map +1 -0
  211. package/lib/icon/Icon.js +37 -0
  212. package/lib/icon/Icon.js.map +1 -0
  213. package/lib/icon/index.js +2 -0
  214. package/lib/icon/index.js.map +1 -0
  215. package/lib/icon/types/index.js +2 -0
  216. package/lib/icon/types/index.js.map +1 -0
  217. package/lib/index.js +52 -0
  218. package/lib/index.js.map +1 -0
  219. package/lib/input/Input.js +37 -0
  220. package/lib/input/Input.js.map +1 -0
  221. package/lib/input/index.js +2 -0
  222. package/lib/input/index.js.map +1 -0
  223. package/lib/input/types/index.js +2 -0
  224. package/lib/input/types/index.js.map +1 -0
  225. package/lib/label/Label.js +36 -0
  226. package/lib/label/Label.js.map +1 -0
  227. package/lib/label/index.js +2 -0
  228. package/lib/label/index.js.map +1 -0
  229. package/lib/label/types/index.js +2 -0
  230. package/lib/label/types/index.js.map +1 -0
  231. package/lib/loading/Loading.js +71 -0
  232. package/lib/loading/Loading.js.map +1 -0
  233. package/lib/loading/index.js +3 -0
  234. package/lib/loading/index.js.map +1 -0
  235. package/lib/loading/spinners/Bars.js +7 -0
  236. package/lib/loading/spinners/Bars.js.map +1 -0
  237. package/lib/loading/spinners/Clock.js +7 -0
  238. package/lib/loading/spinners/Clock.js.map +1 -0
  239. package/lib/loading/spinners/Dots.js +7 -0
  240. package/lib/loading/spinners/Dots.js.map +1 -0
  241. package/lib/loading/spinners/Pulse.js +7 -0
  242. package/lib/loading/spinners/Pulse.js.map +1 -0
  243. package/lib/loading/spinners/Spindots.js +7 -0
  244. package/lib/loading/spinners/Spindots.js.map +1 -0
  245. package/lib/loading/spinners/Spinner.js +7 -0
  246. package/lib/loading/spinners/Spinner.js.map +1 -0
  247. package/lib/loading/spinners/Wifi.js +7 -0
  248. package/lib/loading/spinners/Wifi.js.map +1 -0
  249. package/lib/loading/spinners/index.js +8 -0
  250. package/lib/loading/spinners/index.js.map +1 -0
  251. package/lib/loading/types/index.js +2 -0
  252. package/lib/loading/types/index.js.map +1 -0
  253. package/lib/map/LazyMap.js +146 -0
  254. package/lib/map/LazyMap.js.map +1 -0
  255. package/lib/map/LazyMapCircle.js +14 -0
  256. package/lib/map/LazyMapCircle.js.map +1 -0
  257. package/lib/map/LazyMapLine.js +13 -0
  258. package/lib/map/LazyMapLine.js.map +1 -0
  259. package/lib/map/LazyMapMarker.js +72 -0
  260. package/lib/map/LazyMapMarker.js.map +1 -0
  261. package/lib/map/LazyMapPolygon.js +9 -0
  262. package/lib/map/LazyMapPolygon.js.map +1 -0
  263. package/lib/map/LazyMapRectangle.js +12 -0
  264. package/lib/map/LazyMapRectangle.js.map +1 -0
  265. package/lib/map/Map.js +34 -0
  266. package/lib/map/Map.js.map +1 -0
  267. package/lib/map/MapCircle.js +34 -0
  268. package/lib/map/MapCircle.js.map +1 -0
  269. package/lib/map/MapLine.js +34 -0
  270. package/lib/map/MapLine.js.map +1 -0
  271. package/lib/map/MapMarker.js +34 -0
  272. package/lib/map/MapMarker.js.map +1 -0
  273. package/lib/map/MapPolygon.js +34 -0
  274. package/lib/map/MapPolygon.js.map +1 -0
  275. package/lib/map/MapRectangle.js +34 -0
  276. package/lib/map/MapRectangle.js.map +1 -0
  277. package/lib/map/index.js +7 -0
  278. package/lib/map/index.js.map +1 -0
  279. package/lib/map/tileOptions.js +33 -0
  280. package/lib/map/tileOptions.js.map +1 -0
  281. package/lib/map/types/index.js +2 -0
  282. package/lib/map/types/index.js.map +1 -0
  283. package/lib/modal/Modal.js +33 -0
  284. package/lib/modal/Modal.js.map +1 -0
  285. package/lib/modal/hooks/useDisableBack.js +14 -0
  286. package/lib/modal/hooks/useDisableBack.js.map +1 -0
  287. package/lib/modal/index.js +2 -0
  288. package/lib/modal/index.js.map +1 -0
  289. package/lib/modal/types/index.js +2 -0
  290. package/lib/modal/types/index.js.map +1 -0
  291. package/lib/navbar/NavBar.js +17 -0
  292. package/lib/navbar/NavBar.js.map +1 -0
  293. package/lib/navbar/NavBrand.js +9 -0
  294. package/lib/navbar/NavBrand.js.map +1 -0
  295. package/lib/navbar/NavLinks.js +27 -0
  296. package/lib/navbar/NavLinks.js.map +1 -0
  297. package/lib/navbar/index.js +2 -0
  298. package/lib/navbar/index.js.map +1 -0
  299. package/lib/navbar/types/index.js +2 -0
  300. package/lib/navbar/types/index.js.map +1 -0
  301. package/lib/pagination/Pagination.js +42 -0
  302. package/lib/pagination/Pagination.js.map +1 -0
  303. package/lib/pagination/index.js +2 -0
  304. package/lib/pagination/index.js.map +1 -0
  305. package/lib/pagination/types/index.js +2 -0
  306. package/lib/pagination/types/index.js.map +1 -0
  307. package/lib/passwordinput/PasswordInput.js +22 -0
  308. package/lib/passwordinput/PasswordInput.js.map +1 -0
  309. package/lib/passwordinput/index.js +2 -0
  310. package/lib/passwordinput/index.js.map +1 -0
  311. package/lib/passwordinput/types/index.js +2 -0
  312. package/lib/passwordinput/types/index.js.map +1 -0
  313. package/lib/pictogram/Pictogram.js +21 -0
  314. package/lib/pictogram/Pictogram.js.map +1 -0
  315. package/lib/pictogram/index.js +2 -0
  316. package/lib/pictogram/index.js.map +1 -0
  317. package/lib/pictogram/types/index.js +2 -0
  318. package/lib/pictogram/types/index.js.map +1 -0
  319. package/lib/placeholder/PlaceHolder.js +28 -0
  320. package/lib/placeholder/PlaceHolder.js.map +1 -0
  321. package/lib/placeholder/index.js +2 -0
  322. package/lib/placeholder/index.js.map +1 -0
  323. package/lib/placeholder/types/index.js +2 -0
  324. package/lib/placeholder/types/index.js.map +1 -0
  325. package/lib/progress/Progress.js +26 -0
  326. package/lib/progress/Progress.js.map +1 -0
  327. package/lib/progress/index.js +2 -0
  328. package/lib/progress/index.js.map +1 -0
  329. package/lib/progress/types/index.js +2 -0
  330. package/lib/progress/types/index.js.map +1 -0
  331. package/lib/radiogroup/RadioGroup.js +28 -0
  332. package/lib/radiogroup/RadioGroup.js.map +1 -0
  333. package/lib/radiogroup/index.js +2 -0
  334. package/lib/radiogroup/index.js.map +1 -0
  335. package/lib/radiogroup/types/index.js +2 -0
  336. package/lib/radiogroup/types/index.js.map +1 -0
  337. package/lib/rangeinput/RangeInput.js +45 -0
  338. package/lib/rangeinput/RangeInput.js.map +1 -0
  339. package/lib/rangeinput/index.js +2 -0
  340. package/lib/rangeinput/index.js.map +1 -0
  341. package/lib/rangeinput/types/index.js +2 -0
  342. package/lib/rangeinput/types/index.js.map +1 -0
  343. package/lib/ratings/Ratings.js +25 -0
  344. package/lib/ratings/Ratings.js.map +1 -0
  345. package/lib/ratings/index.js +2 -0
  346. package/lib/ratings/index.js.map +1 -0
  347. package/lib/ratings/types/index.js +2 -0
  348. package/lib/ratings/types/index.js.map +1 -0
  349. package/lib/searchinput/SearchInput.js +22 -0
  350. package/lib/searchinput/SearchInput.js.map +1 -0
  351. package/lib/searchinput/index.js +2 -0
  352. package/lib/searchinput/index.js.map +1 -0
  353. package/lib/searchinput/types/index.js +2 -0
  354. package/lib/searchinput/types/index.js.map +1 -0
  355. package/lib/select/Select.js +34 -0
  356. package/lib/select/Select.js.map +1 -0
  357. package/lib/select/index.js +2 -0
  358. package/lib/select/index.js.map +1 -0
  359. package/lib/select/types/index.js +2 -0
  360. package/lib/select/types/index.js.map +1 -0
  361. package/lib/sidebar/Sidebar.js +56 -0
  362. package/lib/sidebar/Sidebar.js.map +1 -0
  363. package/lib/sidebar/index.js +2 -0
  364. package/lib/sidebar/index.js.map +1 -0
  365. package/lib/sidebar/types/index.js +2 -0
  366. package/lib/sidebar/types/index.js.map +1 -0
  367. package/lib/socialshare/SocialShare.js +64 -0
  368. package/lib/socialshare/SocialShare.js.map +1 -0
  369. package/lib/socialshare/buttons/BlueskyButton.js +18 -0
  370. package/lib/socialshare/buttons/BlueskyButton.js.map +1 -0
  371. package/lib/socialshare/buttons/EmailButton.js +16 -0
  372. package/lib/socialshare/buttons/EmailButton.js.map +1 -0
  373. package/lib/socialshare/buttons/FacebookButton.js +16 -0
  374. package/lib/socialshare/buttons/FacebookButton.js.map +1 -0
  375. package/lib/socialshare/buttons/LinkedinButton.js +16 -0
  376. package/lib/socialshare/buttons/LinkedinButton.js.map +1 -0
  377. package/lib/socialshare/buttons/PinterestButton.js +19 -0
  378. package/lib/socialshare/buttons/PinterestButton.js.map +1 -0
  379. package/lib/socialshare/buttons/RedditButton.js +19 -0
  380. package/lib/socialshare/buttons/RedditButton.js.map +1 -0
  381. package/lib/socialshare/buttons/SlackButton.js +17 -0
  382. package/lib/socialshare/buttons/SlackButton.js.map +1 -0
  383. package/lib/socialshare/buttons/TelegramButton.js +19 -0
  384. package/lib/socialshare/buttons/TelegramButton.js.map +1 -0
  385. package/lib/socialshare/buttons/WhatsappButton.js +16 -0
  386. package/lib/socialshare/buttons/WhatsappButton.js.map +1 -0
  387. package/lib/socialshare/buttons/XButton.js +19 -0
  388. package/lib/socialshare/buttons/XButton.js.map +1 -0
  389. package/lib/socialshare/index.js +12 -0
  390. package/lib/socialshare/index.js.map +1 -0
  391. package/lib/socialshare/types/index.js +2 -0
  392. package/lib/socialshare/types/index.js.map +1 -0
  393. package/lib/statbar/StatBar.js +15 -0
  394. package/lib/statbar/StatBar.js.map +1 -0
  395. package/lib/statbar/index.js +2 -0
  396. package/lib/statbar/index.js.map +1 -0
  397. package/lib/statbar/types/index.js +2 -0
  398. package/lib/statbar/types/index.js.map +1 -0
  399. package/lib/switch/Switch.js +55 -0
  400. package/lib/switch/Switch.js.map +1 -0
  401. package/lib/switch/index.js +2 -0
  402. package/lib/switch/index.js.map +1 -0
  403. package/lib/switch/types/index.js +2 -0
  404. package/lib/switch/types/index.js.map +1 -0
  405. package/lib/tabs/Tab.js +6 -0
  406. package/lib/tabs/Tab.js.map +1 -0
  407. package/lib/tabs/TabBar.js +18 -0
  408. package/lib/tabs/TabBar.js.map +1 -0
  409. package/lib/tabs/Tabs.js +59 -0
  410. package/lib/tabs/Tabs.js.map +1 -0
  411. package/lib/tabs/index.js +2 -0
  412. package/lib/tabs/index.js.map +1 -0
  413. package/lib/tabs/types/index.js +2 -0
  414. package/lib/tabs/types/index.js.map +1 -0
  415. package/lib/textarea/TextArea.js +17 -0
  416. package/lib/textarea/TextArea.js.map +1 -0
  417. package/lib/textarea/index.js +2 -0
  418. package/lib/textarea/index.js.map +1 -0
  419. package/lib/textarea/types/index.js +2 -0
  420. package/lib/textarea/types/index.js.map +1 -0
  421. package/lib/textinput/TextInput.js +18 -0
  422. package/lib/textinput/TextInput.js.map +1 -0
  423. package/lib/textinput/index.js +2 -0
  424. package/lib/textinput/index.js.map +1 -0
  425. package/lib/textinput/types/index.js +2 -0
  426. package/lib/textinput/types/index.js.map +1 -0
  427. package/lib/ticker/Ticker.js +21 -0
  428. package/lib/ticker/Ticker.js.map +1 -0
  429. package/lib/ticker/index.js +2 -0
  430. package/lib/ticker/index.js.map +1 -0
  431. package/lib/ticker/types/index.js +2 -0
  432. package/lib/ticker/types/index.js.map +1 -0
  433. package/lib/toast/Toast.js +76 -0
  434. package/lib/toast/Toast.js.map +1 -0
  435. package/lib/toast/index.js +2 -0
  436. package/lib/toast/index.js.map +1 -0
  437. package/lib/toast/types/index.js +2 -0
  438. package/lib/toast/types/index.js.map +1 -0
  439. package/lib/twitterembed/TwitterEmbed.js +123 -0
  440. package/lib/twitterembed/TwitterEmbed.js.map +1 -0
  441. package/lib/twitterembed/index.js +2 -0
  442. package/lib/twitterembed/index.js.map +1 -0
  443. package/lib/twitterembed/types/index.js +2 -0
  444. package/lib/twitterembed/types/index.js.map +1 -0
  445. package/lib/videoplayer/Video.js +130 -0
  446. package/lib/videoplayer/Video.js.map +1 -0
  447. package/lib/videoplayer/VideoControls.js +63 -0
  448. package/lib/videoplayer/VideoControls.js.map +1 -0
  449. package/lib/videoplayer/VideoPlayer.js +66 -0
  450. package/lib/videoplayer/VideoPlayer.js.map +1 -0
  451. package/lib/videoplayer/VideoTracks.js +9 -0
  452. package/lib/videoplayer/VideoTracks.js.map +1 -0
  453. package/lib/videoplayer/controls/CaptionsControl.js +15 -0
  454. package/lib/videoplayer/controls/CaptionsControl.js.map +1 -0
  455. package/lib/videoplayer/controls/FullscreenControl.js +8 -0
  456. package/lib/videoplayer/controls/FullscreenControl.js.map +1 -0
  457. package/lib/videoplayer/controls/PipControl.js +8 -0
  458. package/lib/videoplayer/controls/PipControl.js.map +1 -0
  459. package/lib/videoplayer/controls/SoundControl.js +8 -0
  460. package/lib/videoplayer/controls/SoundControl.js.map +1 -0
  461. package/lib/videoplayer/controls/index.js +5 -0
  462. package/lib/videoplayer/controls/index.js.map +1 -0
  463. package/lib/videoplayer/index.js +3 -0
  464. package/lib/videoplayer/index.js.map +1 -0
  465. package/lib/videoplayer/types/index.js +2 -0
  466. package/lib/videoplayer/types/index.js.map +1 -0
  467. package/lib/youtubeembed/YoutubeEmbed.js +33 -0
  468. package/lib/youtubeembed/YoutubeEmbed.js.map +1 -0
  469. package/lib/youtubeembed/index.js +2 -0
  470. package/lib/youtubeembed/index.js.map +1 -0
  471. package/lib/youtubeembed/types/index.js +2 -0
  472. package/lib/youtubeembed/types/index.js.map +1 -0
  473. package/package.json +39 -0
@@ -0,0 +1,130 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useRef, useEffect, useCallback, useMemo, useState } from "react";
4
+ import VideoTracks from "./VideoTracks";
5
+ import { twMerge } from "tailwind-merge";
6
+ import { Loading, Alert } from "..";
7
+ var posterSrc = "/poster.png";
8
+ var loadingClasses = "[&&::-webkit-media-controls-panel]:!hidden [&&::-webkit-media-controls-enclosure]:!hidden [&&::-webkit-media-controls]:!hidden";
9
+ var grayscaleClasses = {
10
+ none: "",
11
+ grayscale: "grayscale",
12
+ sepia: "sepia",
13
+ };
14
+ var aspects = {
15
+ square: "aspect-square",
16
+ phone: "aspect-[9/16]",
17
+ video: "aspect-video",
18
+ television: "aspect-[4/3]",
19
+ cinema: "aspect-[21/9]",
20
+ ultrawide: "aspect-[12/5]",
21
+ };
22
+ var Video = function (_a) {
23
+ var src = _a.src, _b = _a.poster, poster = _b === void 0 ? posterSrc : _b, tracks = _a.tracks, srcLangs = _a.srcLangs, trackIndex = _a.trackIndex, _c = _a.controls, controls = _c === void 0 ? true : _c, _d = _a.aspect, aspect = _d === void 0 ? "video" : _d, _e = _a.videoWidth, videoWidth = _e === void 0 ? "100%" : _e, _f = _a.videoHeight, videoHeight = _f === void 0 ? "auto" : _f, _g = _a.loop, loop = _g === void 0 ? false : _g, muted = _a.muted, autoplay = _a.autoplay, setDuration = _a.setDuration, setTime = _a.setTime, play = _a.play, togglePlay = _a.togglePlay, _h = _a.preload, preload = _h === void 0 ? "metadata" : _h, _j = _a.fallback, fallback = _j === void 0 ? "Your browser does not support the video tag." : _j, currentTime = _a.currentTime, playEnded = _a.playEnded, _k = _a.volume, volume = _k === void 0 ? 5 : _k, _l = _a.formats, formats = _l === void 0 ? ["mp4"] : _l, _m = _a.pictureInPicture, pictureInPicture = _m === void 0 ? false : _m, _o = _a.defaultError, defaultError = _o === void 0 ? "Video cannot be loaded." : _o, _p = _a.grayscale, grayscale = _p === void 0 ? "none" : _p, _q = _a.blur, blur = _q === void 0 ? false : _q, _r = _a.className, className = _r === void 0 ? "" : _r;
24
+ var videoRef = useRef(null);
25
+ var _s = useState(false), loading = _s[0], setLoading = _s[1];
26
+ var _t = useState(""), error = _t[0], setError = _t[1];
27
+ var aspectRatioClasses = useMemo(function () { return aspects[aspect]; }, [aspect]);
28
+ useEffect(function () {
29
+ var node = videoRef.current;
30
+ if (node) {
31
+ if (play)
32
+ node.play();
33
+ else
34
+ node.pause();
35
+ }
36
+ }, [play]);
37
+ useEffect(function () {
38
+ var node = videoRef.current;
39
+ if (node && trackIndex) {
40
+ var textTracks = node.textTracks;
41
+ for (var i = 0; i < textTracks.length; i++) {
42
+ if (i === Number(trackIndex))
43
+ textTracks[i].mode = "showing";
44
+ else
45
+ textTracks[i].mode = "disabled";
46
+ }
47
+ }
48
+ }, [trackIndex]);
49
+ useEffect(function () {
50
+ var node = videoRef.current;
51
+ if (node && typeof document !== null && node.duration) {
52
+ if (document.pictureInPictureElement) {
53
+ document.exitPictureInPicture();
54
+ }
55
+ else if (document.pictureInPictureEnabled) {
56
+ node.requestPictureInPicture();
57
+ }
58
+ }
59
+ }, [pictureInPicture]);
60
+ useEffect(function () {
61
+ var node = videoRef.current;
62
+ if (node && currentTime) {
63
+ node.currentTime = currentTime;
64
+ }
65
+ }, [currentTime]);
66
+ useEffect(function () {
67
+ var node = videoRef.current;
68
+ if (node)
69
+ node.volume = volume / 10;
70
+ }, [volume]);
71
+ var handleLoadedmetadata = useCallback(function () {
72
+ if (videoRef.current && setDuration)
73
+ setDuration(videoRef.current.duration);
74
+ }, [setDuration]);
75
+ var handleTogglePlay = function () {
76
+ if (togglePlay)
77
+ togglePlay();
78
+ };
79
+ var handleEnd = useCallback(function () {
80
+ var node = videoRef.current;
81
+ if (node && !loop) {
82
+ node.currentTime = 0;
83
+ }
84
+ if (playEnded)
85
+ playEnded();
86
+ }, [playEnded, loop]);
87
+ var handleTime = useCallback(function () {
88
+ if (videoRef.current && setTime)
89
+ setTime(videoRef.current.currentTime);
90
+ }, [setTime]);
91
+ var handleError = useCallback(function () {
92
+ var _a;
93
+ var node = videoRef.current;
94
+ if (node) {
95
+ var error_1 = ((_a = node.error) === null || _a === void 0 ? void 0 : _a.message) || defaultError;
96
+ setError(error_1);
97
+ setLoading(false);
98
+ }
99
+ }, [setError, defaultError]);
100
+ var handleWaiting = useCallback(function () {
101
+ setLoading(true);
102
+ }, [setLoading]);
103
+ var handleCanPlay = useCallback(function () {
104
+ setLoading(false);
105
+ }, [setLoading]);
106
+ var setVideoRef = useCallback(function (node) {
107
+ if (node) {
108
+ videoRef.current = node;
109
+ node.addEventListener("waiting", handleWaiting);
110
+ node.addEventListener("canplay", handleCanPlay);
111
+ node.addEventListener("loadedmetadata", handleLoadedmetadata, true);
112
+ node.addEventListener("ended", handleEnd, true);
113
+ node.addEventListener("timeupdate", handleTime, true);
114
+ node.addEventListener("error", handleError, true);
115
+ }
116
+ return function () {
117
+ if (node) {
118
+ node.removeEventListener("waiting", handleWaiting);
119
+ node.removeEventListener("canplay", handleCanPlay);
120
+ node.removeEventListener("loadedmetadata", handleLoadedmetadata, true);
121
+ node.removeEventListener("ended", handleEnd, true);
122
+ node.removeEventListener("timeupdate", handleTime, true);
123
+ node.removeEventListener("error", handleError, true);
124
+ }
125
+ };
126
+ }, [handleEnd, handleError, handleLoadedmetadata, handleTime, handleWaiting, handleCanPlay]);
127
+ return (_jsxs("figure", { className: twMerge("video-figure group overflow-hidden flex items-center relative ".concat(aspectRatioClasses), className), children: [_jsxs("video", { poster: poster, width: videoWidth, height: videoHeight, controls: controls, loop: loop, ref: setVideoRef, className: "video bg-black ".concat(grayscaleClasses[grayscale], " ").concat(blur ? "blur" : "", " ").concat(videoHeight === "100%" ? "object-cover h-full" : "", " ").concat(loading ? loadingClasses : ""), muted: muted, autoPlay: autoplay, preload: preload, onClick: handleTogglePlay, children: [formats.map(function (format, index) { return (_jsx("source", { src: "".concat(src.slice(0, src.lastIndexOf(".")), ".").concat(format), type: "video/".concat(format) }, index)); }), tracks ? _jsx(VideoTracks, { tracks: tracks, srcLangs: srcLangs }) : null, _jsx("p", { children: fallback })] }), error && (_jsx(Alert, { title: "Error", message: error, status: "error", layout: "solid", className: "!absolute inset-0" })), loading && _jsx(Loading, { className: "absolute w-full", size: "lg" })] }));
128
+ };
129
+ export default Video;
130
+ //# sourceMappingURL=Video.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Video.js","sourceRoot":"","sources":["../../../src/ui/videoplayer/Video.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\nimport React, { useRef, useEffect, useCallback, useMemo, useState } from \"react\";\nimport VideoTracks from \"./VideoTracks\";\nimport { twMerge } from \"tailwind-merge\";\nimport { Loading, Alert } from \"..\";\n\nimport { VideoProps } from \"./types\";\n\nconst posterSrc = \"/poster.png\";\n\nconst loadingClasses =\n \"[&&::-webkit-media-controls-panel]:!hidden [&&::-webkit-media-controls-enclosure]:!hidden [&&::-webkit-media-controls]:!hidden\";\n\nconst grayscaleClasses = {\n none: \"\",\n grayscale: \"grayscale\",\n sepia: \"sepia\",\n};\n\nconst aspects = {\n square: \"aspect-square\",\n phone: \"aspect-[9/16]\",\n video: \"aspect-video\",\n television: \"aspect-[4/3]\",\n cinema: \"aspect-[21/9]\",\n ultrawide: \"aspect-[12/5]\",\n};\n\nconst Video = ({\n src,\n poster = posterSrc,\n tracks,\n srcLangs,\n trackIndex,\n controls = true,\n aspect = \"video\",\n videoWidth = \"100%\",\n videoHeight = \"auto\",\n loop = false,\n muted,\n autoplay,\n setDuration,\n setTime,\n play,\n togglePlay,\n preload = \"metadata\",\n fallback = \"Your browser does not support the video tag.\",\n currentTime,\n playEnded,\n volume = 5,\n formats = [\"mp4\"],\n pictureInPicture = false,\n defaultError = \"Video cannot be loaded.\",\n grayscale = \"none\",\n blur = false,\n className = \"\",\n}: VideoProps) => {\n const videoRef = useRef<HTMLVideoElement | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(\"\");\n\n const aspectRatioClasses = useMemo(() => aspects[aspect], [aspect]);\n\n useEffect(() => {\n const node = videoRef.current;\n if (node) {\n if (play) node.play();\n else node.pause();\n }\n }, [play]);\n\n useEffect(() => {\n const node = videoRef.current;\n if (node && trackIndex) {\n const textTracks = node.textTracks;\n for (let i = 0; i < textTracks.length; i++) {\n if (i === Number(trackIndex)) textTracks[i].mode = \"showing\";\n else textTracks[i].mode = \"disabled\";\n }\n }\n }, [trackIndex]);\n\n useEffect(() => {\n const node = videoRef.current;\n if (node && typeof document !== null && node.duration) {\n if (document.pictureInPictureElement) {\n document.exitPictureInPicture();\n } else if (document.pictureInPictureEnabled) {\n node.requestPictureInPicture();\n }\n }\n }, [pictureInPicture]);\n\n useEffect(() => {\n const node = videoRef.current;\n if (node && currentTime) {\n node.currentTime = currentTime;\n }\n }, [currentTime]);\n\n useEffect(() => {\n const node = videoRef.current;\n if (node) node.volume = volume / 10;\n }, [volume]);\n\n const handleLoadedmetadata = useCallback(() => {\n if (videoRef.current && setDuration) setDuration(videoRef.current.duration);\n }, [setDuration]);\n\n const handleTogglePlay = () => {\n if (togglePlay) togglePlay();\n };\n\n const handleEnd = useCallback(() => {\n const node = videoRef.current;\n if (node && !loop) {\n node.currentTime = 0;\n }\n if (playEnded) playEnded();\n }, [playEnded, loop]);\n\n const handleTime = useCallback(() => {\n if (videoRef.current && setTime) setTime(videoRef.current.currentTime);\n }, [setTime]);\n\n const handleError = useCallback(() => {\n const node = videoRef.current;\n if (node) {\n const error = node.error?.message || defaultError;\n setError(error);\n setLoading(false);\n }\n }, [setError, defaultError]);\n\n const handleWaiting = useCallback(() => {\n setLoading(true);\n }, [setLoading]);\n\n const handleCanPlay = useCallback(() => {\n setLoading(false);\n }, [setLoading]);\n\n const setVideoRef = useCallback(\n (node: HTMLVideoElement) => {\n if (node) {\n videoRef.current = node;\n node.addEventListener(\"waiting\", handleWaiting);\n node.addEventListener(\"canplay\", handleCanPlay);\n node.addEventListener(\"loadedmetadata\", handleLoadedmetadata, true);\n node.addEventListener(\"ended\", handleEnd, true);\n node.addEventListener(\"timeupdate\", handleTime, true);\n node.addEventListener(\"error\", handleError, true);\n }\n return () => {\n if (node) {\n node.removeEventListener(\"waiting\", handleWaiting);\n node.removeEventListener(\"canplay\", handleCanPlay);\n node.removeEventListener(\"loadedmetadata\", handleLoadedmetadata, true);\n node.removeEventListener(\"ended\", handleEnd, true);\n node.removeEventListener(\"timeupdate\", handleTime, true);\n node.removeEventListener(\"error\", handleError, true);\n }\n };\n },\n [handleEnd, handleError, handleLoadedmetadata, handleTime, handleWaiting, handleCanPlay]\n );\n\n return (\n <figure\n className={twMerge(\n `video-figure group overflow-hidden flex items-center relative ${aspectRatioClasses}`,\n className\n )}\n >\n <video\n poster={poster}\n width={videoWidth}\n height={videoHeight}\n controls={controls}\n loop={loop}\n ref={setVideoRef}\n className={`video bg-black ${grayscaleClasses[grayscale]} ${blur ? \"blur\" : \"\"} ${\n videoHeight === \"100%\" ? \"object-cover h-full\" : \"\"\n } ${loading ? loadingClasses : \"\"}`}\n muted={muted}\n autoPlay={autoplay}\n preload={preload}\n onClick={handleTogglePlay}\n >\n {formats.map((format, index) => (\n <source\n src={`${src.slice(0, src.lastIndexOf(\".\"))}.${format}`}\n key={index}\n type={`video/${format}`}\n />\n ))}\n {tracks ? <VideoTracks tracks={tracks} srcLangs={srcLangs} /> : null}\n <p>{fallback}</p>\n </video>\n {error && (\n <Alert\n title=\"Error\"\n message={error}\n status=\"error\"\n layout=\"solid\"\n className=\"!absolute inset-0\"\n />\n )}\n {loading && <Loading className=\"absolute w-full\" size=\"lg\" />}\n </figure>\n );\n};\n\nexport default Video;\n"]}
@@ -0,0 +1,63 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useEffect } from "react";
3
+ import { CaptionsControl, FullscreenControl, SoundControl, PipControl } from "./controls/";
4
+ import { FaPlay, FaPause } from "react-icons/fa";
5
+ import { Button } from "..";
6
+ var toHHMMSS = function (secs) {
7
+ var s = secs || 0;
8
+ var sec_num = parseInt(String(s), 10);
9
+ var hours = Math.floor(sec_num / 3600);
10
+ var minutes = Math.floor(sec_num / 60) % 60;
11
+ var seconds = sec_num % 60;
12
+ return [hours, minutes, seconds]
13
+ .map(function (v) { return (v < 10 ? "0" + v : String(v)); })
14
+ .filter(function (v, i) { return v !== "00" || i > 0; })
15
+ .join(":");
16
+ };
17
+ var VideoControls = function (_a) {
18
+ var duration = _a.duration, _b = _a.time, time = _b === void 0 ? 0 : _b, togglePlay = _a.togglePlay, _c = _a.play, play = _c === void 0 ? false : _c, fullscreen = _a.fullscreen, onFullscreen = _a.onFullscreen, muted = _a.muted, onMute = _a.onMute, onScrubChange = _a.onScrubChange, onVolume = _a.onVolume, onPIP = _a.onPIP, onCaption = _a.onCaption, controlOptions = _a.controlOptions, progressBg = _a.progressBg, progressColor = _a.progressColor, tracks = _a.tracks, srcLangs = _a.srcLangs;
19
+ var _d = useState(0), scrubRange = _d[0], setScrubRange = _d[1];
20
+ var _e = useState(5), volumeLevel = _e[0], setVolumeLevel = _e[1];
21
+ useEffect(function () {
22
+ if (time)
23
+ setScrubRange((time / duration) * 100);
24
+ else
25
+ setScrubRange(0);
26
+ }, [time, duration]);
27
+ var scrubStyle = {
28
+ backgroundImage: "linear-gradient(to right, ".concat(progressColor, " 0%, ").concat(progressColor, " ").concat(scrubRange, "%, ").concat(progressBg, " ").concat(scrubRange, "%, ").concat(progressBg, " 100%)"),
29
+ };
30
+ var handleScrubChange = function (event) {
31
+ setScrubRange(Number(event.target.value));
32
+ if (onScrubChange)
33
+ onScrubChange((scrubRange * duration) / 100);
34
+ };
35
+ var handleVolumeChange = function (event) {
36
+ var value = Number(event.target.value);
37
+ setVolumeLevel(value);
38
+ if (onVolume)
39
+ onVolume(value);
40
+ };
41
+ var handleCaptionChange = function (value) {
42
+ if (onCaption)
43
+ onCaption(value);
44
+ };
45
+ return (_jsxs("div", { className: "bg-gradient-to-t from-black from-60% to-transparent text-light absolute bottom-0 w-full flex flex-col justify-between opacity-0 group-hover:opacity-100", children: [_jsx("div", { className: "mx-2 ".concat(duration > 0 ? "block" : "hidden"), children: _jsx("input", { type: "range", min: "0", max: "100", step: "any", id: "scrubRange", value: scrubRange, onChange: handleScrubChange, onInputCapture: handleScrubChange, style: scrubStyle, className: "w-full rounded-none [&&::-webkit-slider-thumb]:duration-500 [&&::-webkit-slider-thumb]:transition-all [&&::-webkit-slider-thumb]:cursor-grab h-1 cursor-pointer appearance-none [&&::-webkit-slider-thumb]:appearance-none" }) }), _jsxs("div", { className: "flex justify-between", children: [_jsxs("p", { className: "flex justify-start gap-2 items-center", children: [_jsxs(Button, { title: play ? "Pause" : "Play", onClick: togglePlay, btnBackground: "transparent", btnColor: "light", size: "sm", children: [play ? _jsx(FaPause, {}) : _jsx(FaPlay, {}), _jsx("span", { className: "sr-only", children: "Toggle Play" })] }), _jsxs("span", { className: "video-time font-mono text-sm", children: [_jsx("time", { children: toHHMMSS(time) }), " ", duration > 0 && (_jsxs("span", { children: ["/ ", _jsx("time", { children: toHHMMSS(duration) })] }))] })] }), _jsx("div", { className: "flex justify-end gap-2 items-center", children: controlOptions
46
+ ? controlOptions.map(function (option, index) {
47
+ switch (option) {
48
+ case "sound":
49
+ return (_jsx("div", { children: SoundControl(muted, onMute, duration, volumeLevel, handleVolumeChange) }, index));
50
+ case "fullscreen":
51
+ return (_jsx("div", { children: FullscreenControl(fullscreen, duration, onFullscreen) }, index));
52
+ case "pip":
53
+ return _jsx("div", { children: PipControl(duration, onPIP) }, index);
54
+ case "captions":
55
+ return (_jsx("div", { children: CaptionsControl(handleCaptionChange, tracks || [], srcLangs || []) }, index));
56
+ default:
57
+ return null;
58
+ }
59
+ })
60
+ : null })] })] }));
61
+ };
62
+ export default VideoControls;
63
+ //# sourceMappingURL=VideoControls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VideoControls.js","sourceRoot":"","sources":["../../../src/ui/videoplayer/VideoControls.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEnD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE3F,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEjD,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAI5B,IAAM,QAAQ,GAAG,UAAC,IAAiC;IACjD,IAAM,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;IACpB,IAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACxC,IAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACzC,IAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;IAC9C,IAAM,OAAO,GAAG,OAAO,GAAG,EAAE,CAAC;IAE7B,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC;SAC7B,GAAG,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAA9B,CAA8B,CAAC;SAC1C,MAAM,CAAC,UAAC,CAAC,EAAE,CAAC,IAAK,OAAA,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,EAAnB,CAAmB,CAAC;SACrC,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC,CAAC;AAEF,IAAM,aAAa,GAAG,UAAC,EAkBH;QAjBlB,QAAQ,cAAA,EACR,YAAQ,EAAR,IAAI,mBAAG,CAAC,KAAA,EACR,UAAU,gBAAA,EACV,YAAY,EAAZ,IAAI,mBAAG,KAAK,KAAA,EACZ,UAAU,gBAAA,EACV,YAAY,kBAAA,EACZ,KAAK,WAAA,EACL,MAAM,YAAA,EACN,aAAa,mBAAA,EACb,QAAQ,cAAA,EACR,KAAK,WAAA,EACL,SAAS,eAAA,EACT,cAAc,oBAAA,EACd,UAAU,gBAAA,EACV,aAAa,mBAAA,EACb,MAAM,YAAA,EACN,QAAQ,cAAA;IAEF,IAAA,KAA8B,QAAQ,CAAC,CAAC,CAAC,EAAxC,UAAU,QAAA,EAAE,aAAa,QAAe,CAAC;IAC1C,IAAA,KAAgC,QAAQ,CAAC,CAAC,CAAC,EAA1C,WAAW,QAAA,EAAE,cAAc,QAAe,CAAC;IAElD,SAAS,CAAC;QACR,IAAI,IAAI;YAAE,aAAa,CAAC,CAAC,IAAI,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC;;YAC5C,aAAa,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAErB,IAAM,UAAU,GAAG;QACjB,eAAe,EAAE,oCAA6B,aAAa,kBAAQ,aAAa,cAAI,UAAU,gBAAM,UAAU,cAAI,UAAU,gBAAM,UAAU,WAAQ;KACrJ,CAAC;IAEF,IAAM,iBAAiB,GAAG,UAAC,KAA0C;QACnE,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1C,IAAI,aAAa;YAAE,aAAa,CAAC,CAAC,UAAU,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC;IAClE,CAAC,CAAC;IAEF,IAAM,kBAAkB,GAAG,UAAC,KAA0C;QACpE,IAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzC,cAAc,CAAC,KAAK,CAAC,CAAC;QACtB,IAAI,QAAQ;YAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC;IAEF,IAAM,mBAAmB,GAAG,UAAC,KAAa;QACxC,IAAI,SAAS;YAAE,SAAS,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAC,yJAAyJ,aACtK,cAAK,SAAS,EAAE,eAAQ,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAE,YACzD,gBACE,IAAI,EAAC,OAAO,EACZ,GAAG,EAAC,GAAG,EACP,GAAG,EAAC,KAAK,EACT,IAAI,EAAC,KAAK,EACV,EAAE,EAAC,YAAY,EACf,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,iBAAiB,EAC3B,cAAc,EAAE,iBAAiB,EACjC,KAAK,EAAE,UAAU,EACjB,SAAS,EAAC,4NAA4N,GACtO,GACE,EACN,eAAK,SAAS,EAAC,sBAAsB,aACnC,aAAG,SAAS,EAAC,uCAAuC,aAClD,MAAC,MAAM,IACL,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAC9B,OAAO,EAAE,UAAU,EACnB,aAAa,EAAC,aAAa,EAC3B,QAAQ,EAAC,OAAO,EAChB,IAAI,EAAC,IAAI,aAER,IAAI,CAAC,CAAC,CAAC,KAAC,OAAO,KAAG,CAAC,CAAC,CAAC,KAAC,MAAM,KAAG,EAChC,eAAM,SAAS,EAAC,SAAS,4BAAmB,IACrC,EACT,gBAAM,SAAS,EAAC,8BAA8B,aAC5C,yBAAO,QAAQ,CAAC,IAAI,CAAC,GAAQ,EAAC,GAAG,EAChC,QAAQ,GAAG,CAAC,IAAI,CACf,iCACI,yBAAO,QAAQ,CAAC,QAAQ,CAAC,GAAQ,IAC9B,CACR,IACI,IACL,EACJ,cAAK,SAAS,EAAC,qCAAqC,YACjD,cAAc;4BACb,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,UAAC,MAAM,EAAE,KAAK;gCAC/B,QAAQ,MAAM,EAAE,CAAC;oCACf,KAAK,OAAO;wCACV,OAAO,CACL,wBACG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,CAAC,IAD/D,KAAK,CAET,CACP,CAAC;oCACJ,KAAK,YAAY;wCACf,OAAO,CACL,wBAAkB,iBAAiB,CAAC,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAC,IAA7D,KAAK,CAA+D,CAC/E,CAAC;oCACJ,KAAK,KAAK;wCACR,OAAO,wBAAkB,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAnC,KAAK,CAAqC,CAAC;oCAC9D,KAAK,UAAU;wCACb,OAAO,CACL,wBACG,eAAe,CAAC,mBAAmB,EAAE,MAAM,IAAI,EAAE,EAAE,QAAQ,IAAI,EAAE,CAAC,IAD3D,KAAK,CAET,CACP,CAAC;oCACJ;wCACE,OAAO,IAAI,CAAC;gCAChB,CAAC;4BACH,CAAC,CAAC;4BACJ,CAAC,CAAC,IAAI,GACJ,IACF,IACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,aAAa,CAAC","sourcesContent":["import React, { useState, useEffect } from \"react\";\n\nimport { CaptionsControl, FullscreenControl, SoundControl, PipControl } from \"./controls/\";\n\nimport { FaPlay, FaPause } from \"react-icons/fa\";\n\nimport { Button } from \"..\";\n\nimport { VideoControlProps } from \"./types\";\n\nconst toHHMMSS = (secs: number | string | undefined) => {\n const s = secs || 0;\n const sec_num = parseInt(String(s), 10);\n const hours = Math.floor(sec_num / 3600);\n const minutes = Math.floor(sec_num / 60) % 60;\n const seconds = sec_num % 60;\n\n return [hours, minutes, seconds]\n .map((v) => (v < 10 ? \"0\" + v : String(v)))\n .filter((v, i) => v !== \"00\" || i > 0)\n .join(\":\");\n};\n\nconst VideoControls = ({\n duration,\n time = 0,\n togglePlay,\n play = false,\n fullscreen,\n onFullscreen,\n muted,\n onMute,\n onScrubChange,\n onVolume,\n onPIP,\n onCaption,\n controlOptions,\n progressBg,\n progressColor,\n tracks,\n srcLangs,\n}: VideoControlProps) => {\n const [scrubRange, setScrubRange] = useState(0);\n const [volumeLevel, setVolumeLevel] = useState(5);\n\n useEffect(() => {\n if (time) setScrubRange((time / duration) * 100);\n else setScrubRange(0);\n }, [time, duration]);\n\n const scrubStyle = {\n backgroundImage: `linear-gradient(to right, ${progressColor} 0%, ${progressColor} ${scrubRange}%, ${progressBg} ${scrubRange}%, ${progressBg} 100%)`,\n };\n\n const handleScrubChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setScrubRange(Number(event.target.value));\n if (onScrubChange) onScrubChange((scrubRange * duration) / 100);\n };\n\n const handleVolumeChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = Number(event.target.value);\n setVolumeLevel(value);\n if (onVolume) onVolume(value);\n };\n\n const handleCaptionChange = (value: string) => {\n if (onCaption) onCaption(value);\n };\n\n return (\n <div className=\"bg-gradient-to-t from-black from-60% to-transparent text-light absolute bottom-0 w-full flex flex-col justify-between opacity-0 group-hover:opacity-100\">\n <div className={`mx-2 ${duration > 0 ? \"block\" : \"hidden\"}`}>\n <input\n type=\"range\"\n min=\"0\"\n max=\"100\"\n step=\"any\"\n id=\"scrubRange\"\n value={scrubRange}\n onChange={handleScrubChange}\n onInputCapture={handleScrubChange}\n style={scrubStyle}\n className=\"w-full rounded-none [&&::-webkit-slider-thumb]:duration-500 [&&::-webkit-slider-thumb]:transition-all [&&::-webkit-slider-thumb]:cursor-grab h-1 cursor-pointer appearance-none [&&::-webkit-slider-thumb]:appearance-none\"\n />\n </div>\n <div className=\"flex justify-between\">\n <p className=\"flex justify-start gap-2 items-center\">\n <Button\n title={play ? \"Pause\" : \"Play\"}\n onClick={togglePlay}\n btnBackground=\"transparent\"\n btnColor=\"light\"\n size=\"sm\"\n >\n {play ? <FaPause /> : <FaPlay />}\n <span className=\"sr-only\">Toggle Play</span>\n </Button>\n <span className=\"video-time font-mono text-sm\">\n <time>{toHHMMSS(time)}</time>{\" \"}\n {duration > 0 && (\n <span>\n / <time>{toHHMMSS(duration)}</time>\n </span>\n )}\n </span>\n </p>\n <div className=\"flex justify-end gap-2 items-center\">\n {controlOptions\n ? controlOptions.map((option, index) => {\n switch (option) {\n case \"sound\":\n return (\n <div key={index}>\n {SoundControl(muted, onMute, duration, volumeLevel, handleVolumeChange)}\n </div>\n );\n case \"fullscreen\":\n return (\n <div key={index}>{FullscreenControl(fullscreen, duration, onFullscreen)}</div>\n );\n case \"pip\":\n return <div key={index}>{PipControl(duration, onPIP)}</div>;\n case \"captions\":\n return (\n <div key={index}>\n {CaptionsControl(handleCaptionChange, tracks || [], srcLangs || [])}\n </div>\n );\n default:\n return null;\n }\n })\n : null}\n </div>\n </div>\n </div>\n );\n};\n\nexport default VideoControls;\n"]}
@@ -0,0 +1,66 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState, useEffect } from 'react';
4
+ import { twMerge } from 'tailwind-merge';
5
+ import Video from './Video';
6
+ import VideoControls from './VideoControls';
7
+ var VideoPlayer = function (_a) {
8
+ var src = _a.src, poster = _a.poster, loop = _a.loop, _b = _a.className, className = _b === void 0 ? '' : _b, _c = _a.aspect, aspect = _c === void 0 ? 'video' : _c, preload = _a.preload, fallback = _a.fallback, _d = _a.formats, formats = _d === void 0 ? ['mp4'] : _d, _e = _a.defaultError, defaultError = _e === void 0 ? 'Oops! There was an unknown error.' : _e, _f = _a.muted, muted = _f === void 0 ? false : _f, autoplay = _a.autoplay, _g = _a.controlOptions, controlOptions = _g === void 0 ? ['sound', 'fullscreen', 'pip'] : _g, _h = _a.progressBg, progressBg = _h === void 0 ? '#cccccc' : _h, _j = _a.progressColor, progressColor = _j === void 0 ? '#ffffff' : _j, tracks = _a.tracks, srcLangs = _a.srcLangs, grayscale = _a.grayscale;
9
+ var _k = useState(false), play = _k[0], setPlay = _k[1];
10
+ var _l = useState(0), duration = _l[0], setDuration = _l[1];
11
+ var _m = useState(0), time = _m[0], setTime = _m[1];
12
+ var _o = useState(0), currentTime = _o[0], setCurrentTime = _o[1];
13
+ var _p = useState(false), fullscreen = _p[0], setFullscreen = _p[1];
14
+ var _q = useState(false), pictureInPicture = _q[0], setPictureInPicture = _q[1];
15
+ var _r = useState(muted), mute = _r[0], setMute = _r[1];
16
+ var _s = useState(5), volume = _s[0], setVolume = _s[1];
17
+ var _t = useState(), trackIndex = _t[0], setTrackIndex = _t[1];
18
+ useEffect(function () {
19
+ var handleFullscreenChange = function () {
20
+ if (fullscreen && !document.fullscreenElement)
21
+ setFullscreen(false);
22
+ };
23
+ document.addEventListener('fullscreenchange', handleFullscreenChange);
24
+ return function () {
25
+ document.removeEventListener('fullscreenchange', handleFullscreenChange);
26
+ };
27
+ }, [setFullscreen, fullscreen]);
28
+ useEffect(function () {
29
+ setPlay(autoplay !== null && autoplay !== void 0 ? autoplay : false);
30
+ return function () {
31
+ setPlay(false);
32
+ };
33
+ }, [autoplay]);
34
+ var handleScrubChange = function (time) {
35
+ setTime(time);
36
+ setCurrentTime(time);
37
+ };
38
+ var handleEnded = function () {
39
+ setPlay(false);
40
+ handleScrubChange(0);
41
+ };
42
+ var handleVolume = function (volume) {
43
+ setVolume(volume);
44
+ volume === 0 ? setMute(true) : setMute(false);
45
+ };
46
+ var handleTogglePlay = function () { return setPlay(!play); };
47
+ var handleMute = function () { return setMute(!mute); };
48
+ var handleFullscreen = function () {
49
+ setFullscreen(!fullscreen);
50
+ if (typeof document !== null) {
51
+ var player = document.getElementById('player');
52
+ if (player) {
53
+ if (!fullscreen) {
54
+ player.requestFullscreen();
55
+ }
56
+ else
57
+ document.exitFullscreen();
58
+ }
59
+ }
60
+ };
61
+ var handlePiP = function () { return setPictureInPicture(!pictureInPicture); };
62
+ var handleCaption = function (index) { return setTrackIndex(index); };
63
+ return (_jsxs("div", { id: 'player', className: twMerge("video-player w-full dark bg-black group relative ".concat(fullscreen ? 'fullscreen' : ''), className), children: [_jsx(Video, { src: src, controls: false, poster: poster, aspect: aspect, loop: loop, setDuration: setDuration, setTime: setTime, currentTime: currentTime, togglePlay: handleTogglePlay, playEnded: handleEnded, play: play, muted: mute, autoplay: autoplay, preload: preload, fallback: fallback, volume: volume, formats: formats, pictureInPicture: pictureInPicture, defaultError: defaultError, tracks: tracks, srcLangs: srcLangs, trackIndex: trackIndex, grayscale: grayscale }), _jsx(VideoControls, { duration: duration, time: time, togglePlay: handleTogglePlay, play: play, onFullscreen: handleFullscreen, fullscreen: fullscreen, onMute: handleMute, muted: mute, onScrubChange: handleScrubChange, onVolume: handleVolume, onPIP: handlePiP, onCaption: handleCaption, controlOptions: controlOptions, progressBg: progressBg, progressColor: progressColor, tracks: tracks, srcLangs: srcLangs })] }));
64
+ };
65
+ export default VideoPlayer;
66
+ //# sourceMappingURL=VideoPlayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VideoPlayer.js","sourceRoot":"","sources":["../../../src/ui/videoplayer/VideoPlayer.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client'\n\nimport React, { useState, useEffect } from 'react'\n\nimport { twMerge } from 'tailwind-merge'\n\nimport Video from './Video'\nimport VideoControls from './VideoControls'\nimport { VideoPlayerProps } from './types'\n\nconst VideoPlayer = ({\n\tsrc,\n\tposter,\n\tloop,\n\tclassName = '',\n\taspect = 'video',\n\tpreload,\n\tfallback,\n\tformats = ['mp4'],\n\tdefaultError = 'Oops! There was an unknown error.',\n\tmuted = false,\n\tautoplay,\n\tcontrolOptions = ['sound', 'fullscreen', 'pip'],\n\tprogressBg = '#cccccc',\n\tprogressColor = '#ffffff',\n\ttracks,\n\tsrcLangs,\n\tgrayscale,\n}: VideoPlayerProps) => {\n\tconst [play, setPlay] = useState(false)\n\tconst [duration, setDuration] = useState(0)\n\tconst [time, setTime] = useState(0)\n\tconst [currentTime, setCurrentTime] = useState(0)\n\tconst [fullscreen, setFullscreen] = useState(false)\n\tconst [pictureInPicture, setPictureInPicture] = useState(false)\n\tconst [mute, setMute] = useState(muted)\n\tconst [volume, setVolume] = useState(5)\n\tconst [trackIndex, setTrackIndex] = useState<string>()\n\n\tuseEffect(() => {\n\t\tconst handleFullscreenChange = () => {\n\t\t\tif (fullscreen && !document.fullscreenElement) setFullscreen(false)\n\t\t}\n\n\t\tdocument.addEventListener('fullscreenchange', handleFullscreenChange)\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('fullscreenchange', handleFullscreenChange)\n\t\t}\n\t}, [setFullscreen, fullscreen])\n\n\tuseEffect(() => {\n\t\tsetPlay(autoplay ?? false)\n\n\t\treturn () => {\n\t\t\tsetPlay(false)\n\t\t}\n\t}, [autoplay])\n\n\tconst handleScrubChange = (time: number) => {\n\t\tsetTime(time)\n\t\tsetCurrentTime(time)\n\t}\n\n\tconst handleEnded = () => {\n\t\tsetPlay(false)\n\t\thandleScrubChange(0)\n\t}\n\n\tconst handleVolume = (volume: number) => {\n\t\tsetVolume(volume)\n\t\tvolume === 0 ? setMute(true) : setMute(false)\n\t}\n\n\tconst handleTogglePlay = () => setPlay(!play)\n\n\tconst handleMute = () => setMute(!mute)\n\n\tconst handleFullscreen = () => {\n\t\tsetFullscreen(!fullscreen)\n\t\tif (typeof document !== null) {\n\t\t\tconst player = document.getElementById('player')\n\t\t\tif (player) {\n\t\t\t\tif (!fullscreen) {\n\t\t\t\t\tplayer.requestFullscreen()\n\t\t\t\t} else document.exitFullscreen()\n\t\t\t}\n\t\t}\n\t}\n\n\tconst handlePiP = () => setPictureInPicture(!pictureInPicture)\n\n\tconst handleCaption = (index: string) => setTrackIndex(index)\n\n\treturn (\n\t\t<div\n\t\t\tid='player'\n\t\t\tclassName={twMerge(\n\t\t\t\t`video-player w-full dark bg-black group relative ${\n\t\t\t\t\tfullscreen ? 'fullscreen' : ''\n\t\t\t\t}`,\n\t\t\t\tclassName\n\t\t\t)}\n\t\t>\n\t\t\t<Video\n\t\t\t\tsrc={src}\n\t\t\t\tcontrols={false}\n\t\t\t\tposter={poster}\n\t\t\t\taspect={aspect}\n\t\t\t\tloop={loop}\n\t\t\t\tsetDuration={setDuration}\n\t\t\t\tsetTime={setTime}\n\t\t\t\tcurrentTime={currentTime}\n\t\t\t\ttogglePlay={handleTogglePlay}\n\t\t\t\tplayEnded={handleEnded}\n\t\t\t\tplay={play}\n\t\t\t\tmuted={mute}\n\t\t\t\tautoplay={autoplay}\n\t\t\t\tpreload={preload}\n\t\t\t\tfallback={fallback}\n\t\t\t\tvolume={volume}\n\t\t\t\tformats={formats}\n\t\t\t\tpictureInPicture={pictureInPicture}\n\t\t\t\tdefaultError={defaultError}\n\t\t\t\ttracks={tracks}\n\t\t\t\tsrcLangs={srcLangs}\n\t\t\t\ttrackIndex={trackIndex}\n\t\t\t\tgrayscale={grayscale}\n\t\t\t/>\n\t\t\t<VideoControls\n\t\t\t\tduration={duration}\n\t\t\t\ttime={time}\n\t\t\t\ttogglePlay={handleTogglePlay}\n\t\t\t\tplay={play}\n\t\t\t\tonFullscreen={handleFullscreen}\n\t\t\t\tfullscreen={fullscreen}\n\t\t\t\tonMute={handleMute}\n\t\t\t\tmuted={mute}\n\t\t\t\tonScrubChange={handleScrubChange}\n\t\t\t\tonVolume={handleVolume}\n\t\t\t\tonPIP={handlePiP}\n\t\t\t\tonCaption={handleCaption}\n\t\t\t\tcontrolOptions={controlOptions}\n\t\t\t\tprogressBg={progressBg}\n\t\t\t\tprogressColor={progressColor}\n\t\t\t\ttracks={tracks}\n\t\t\t\tsrcLangs={srcLangs}\n\t\t\t/>\n\t\t</div>\n\t)\n}\n\nexport default VideoPlayer\n"]}
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ var VideoTracks = function (_a) {
3
+ var tracks = _a.tracks, srcLangs = _a.srcLangs;
4
+ return tracks && srcLangs
5
+ ? tracks.map(function (src, index) { return (_jsx("track", { kind: 'subtitles', src: src, srcLang: srcLangs[index] }, index)); })
6
+ : null;
7
+ };
8
+ export default VideoTracks;
9
+ //# sourceMappingURL=VideoTracks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VideoTracks.js","sourceRoot":"","sources":["../../../src/ui/videoplayer/VideoTracks.tsx"],"names":[],"mappings":";AAIA,IAAM,WAAW,GAAG,UAAC,EAAsC;QAApC,MAAM,YAAA,EAAE,QAAQ,cAAA;IACtC,OAAO,MAAM,IAAI,QAAQ;QACxB,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,UAAC,GAAG,EAAE,KAAK,IAAK,OAAA,CAC3B,gBACC,IAAI,EAAC,WAAW,EAChB,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,IACnB,KAAK,CACT,CACD,EAP0B,CAO1B,CAAC;QACJ,CAAC,CAAC,IAAI,CAAA;AACR,CAAC,CAAA;AAED,eAAe,WAAW,CAAA","sourcesContent":["import React from 'react'\n\nimport { VideoTracksProps } from './types'\n\nconst VideoTracks = ({ tracks, srcLangs }: VideoTracksProps) => {\n\treturn tracks && srcLangs\n\t\t? tracks.map((src, index) => (\n\t\t\t\t<track\n\t\t\t\t\tkind='subtitles'\n\t\t\t\t\tsrc={src}\n\t\t\t\t\tsrcLang={srcLangs[index]}\n\t\t\t\t\tkey={index}\n\t\t\t\t/>\n\t\t ))\n\t\t: null\n}\n\nexport default VideoTracks\n"]}
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { FaClosedCaptioning } from 'react-icons/fa';
4
+ import { Button, Select } from '../..';
5
+ var CaptionsControl = function (handleCaptionChange, tracks, srcLangs) {
6
+ var _a = useState(false), showSelect = _a[0], setShowSelect = _a[1];
7
+ var onCaptionChange = function (e) {
8
+ setShowSelect(false);
9
+ if (handleCaptionChange)
10
+ handleCaptionChange(e.target.value);
11
+ };
12
+ return tracks ? (_jsxs("div", { id: 'captions-control', className: 'relative', children: [_jsxs(Button, { title: 'Toggle caption options', onClick: function () { return setShowSelect(!showSelect); }, btnBackground: 'transparent', btnColor: 'light', size: 'sm', className: 'lg:-ml-2', children: [_jsx(FaClosedCaptioning, {}), _jsx("span", { className: 'sr-only', children: "Toggle caption options" })] }), _jsx(Select, { title: 'Select Captions', className: "!bg-light !text-dark bottom-8 right-0 absolute ".concat(showSelect ? 'block' : 'hidden'), onChange: onCaptionChange, dropdownSize: 'sm', rows: tracks.length + 1, children: _jsxs(_Fragment, { children: [_jsx("option", { value: '-1', children: "off" }), tracks.map(function (_track, index) { return (_jsx("option", { value: "".concat(index), children: srcLangs[index] }, index)); })] }) })] })) : null;
13
+ };
14
+ export default CaptionsControl;
15
+ //# sourceMappingURL=CaptionsControl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CaptionsControl.js","sourceRoot":"","sources":["../../../../src/ui/videoplayer/controls/CaptionsControl.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAEnD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAEtC,IAAM,eAAe,GAAG,UACvB,mBAA4C,EAC5C,MAAgB,EAChB,QAAkB;IAEZ,IAAA,KAA8B,QAAQ,CAAC,KAAK,CAAC,EAA5C,UAAU,QAAA,EAAE,aAAa,QAAmB,CAAA;IAEnD,IAAM,eAAe,GAAG,UAAC,CAAuC;QAC/D,aAAa,CAAC,KAAK,CAAC,CAAA;QACpB,IAAI,mBAAmB;YAAE,mBAAmB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC7D,CAAC,CAAA;IAED,OAAO,MAAM,CAAC,CAAC,CAAC,CACf,eACC,EAAE,EAAC,kBAAkB,EACrB,SAAS,EAAC,UAAU,aAEpB,MAAC,MAAM,IACN,KAAK,EAAC,wBAAwB,EAC9B,OAAO,EAAE,cAAM,OAAA,aAAa,CAAC,CAAC,UAAU,CAAC,EAA1B,CAA0B,EACzC,aAAa,EAAC,aAAa,EAC3B,QAAQ,EAAC,OAAO,EAChB,IAAI,EAAC,IAAI,EACT,SAAS,EAAC,UAAU,aAEpB,KAAC,kBAAkB,KAAG,EACtB,eAAM,SAAS,EAAC,SAAS,uCAA8B,IAC/C,EACT,KAAC,MAAM,IACN,KAAK,EAAC,iBAAiB,EACvB,SAAS,EAAE,yDACV,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAC9B,EACF,QAAQ,EAAE,eAAe,EACzB,YAAY,EAAC,IAAI,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,YAEvB,8BACC,iBAAQ,KAAK,EAAC,IAAI,oBAAa,EAC9B,MAAM,CAAC,GAAG,CAAC,UAAC,MAAM,EAAE,KAAK,IAAK,OAAA,CAC9B,iBAEC,KAAK,EAAE,UAAG,KAAK,CAAE,YAEhB,QAAQ,CAAC,KAAK,CAAC,IAHX,KAAK,CAIF,CACT,EAP8B,CAO9B,CAAC,IACA,GACK,IACJ,CACN,CAAC,CAAC,CAAC,IAAI,CAAA;AACT,CAAC,CAAA;AAED,eAAe,eAAe,CAAA","sourcesContent":["import React, { useState } from 'react'\n\nimport { FaClosedCaptioning } from 'react-icons/fa'\n\nimport { Button, Select } from '../..'\n\nconst CaptionsControl = (\n\thandleCaptionChange: (value: string) => void,\n\ttracks: string[],\n\tsrcLangs: string[]\n) => {\n\tconst [showSelect, setShowSelect] = useState(false)\n\n\tconst onCaptionChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n\t\tsetShowSelect(false)\n\t\tif (handleCaptionChange) handleCaptionChange(e.target.value)\n\t}\n\n\treturn tracks ? (\n\t\t<div\n\t\t\tid='captions-control'\n\t\t\tclassName='relative'\n\t\t>\n\t\t\t<Button\n\t\t\t\ttitle='Toggle caption options'\n\t\t\t\tonClick={() => setShowSelect(!showSelect)}\n\t\t\t\tbtnBackground='transparent'\n\t\t\t\tbtnColor='light'\n\t\t\t\tsize='sm'\n\t\t\t\tclassName='lg:-ml-2'\n\t\t\t>\n\t\t\t\t<FaClosedCaptioning />\n\t\t\t\t<span className='sr-only'>Toggle caption options</span>\n\t\t\t</Button>\n\t\t\t<Select\n\t\t\t\ttitle='Select Captions'\n\t\t\t\tclassName={`!bg-light !text-dark bottom-8 right-0 absolute ${\n\t\t\t\t\tshowSelect ? 'block' : 'hidden'\n\t\t\t\t}`}\n\t\t\t\tonChange={onCaptionChange}\n\t\t\t\tdropdownSize='sm'\n\t\t\t\trows={tracks.length + 1}\n\t\t\t>\n\t\t\t\t<>\n\t\t\t\t\t<option value='-1'>off</option>\n\t\t\t\t\t{tracks.map((_track, index) => (\n\t\t\t\t\t\t<option\n\t\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\t\tvalue={`${index}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{srcLangs[index]}\n\t\t\t\t\t\t</option>\n\t\t\t\t\t))}\n\t\t\t\t</>\n\t\t\t</Select>\n\t\t</div>\n\t) : null\n}\n\nexport default CaptionsControl\n"]}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button } from "../..";
3
+ import { FaExpand, FaCompress } from "react-icons/fa";
4
+ var FullscreenControl = function (fullscreen, duration, onFullscreen) {
5
+ return (_jsx("div", { id: "fullscreen", children: _jsxs(Button, { title: fullscreen ? "Exit Fullscreen" : "View Fullscreen", onClick: onFullscreen, btnBackground: "transparent", btnColor: "light", size: "sm", disabled: duration === 0, children: [fullscreen ? _jsx(FaCompress, {}) : _jsx(FaExpand, {}), _jsx("span", { className: "sr-only", children: "Toggle Fullscreen" })] }) }));
6
+ };
7
+ export default FullscreenControl;
8
+ //# sourceMappingURL=FullscreenControl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FullscreenControl.js","sourceRoot":"","sources":["../../../../src/ui/videoplayer/controls/FullscreenControl.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEtD,IAAM,iBAAiB,GAAG,UAAC,UAAmB,EAAE,QAAgB,EAAE,YAAyB;IACzF,OAAO,CACL,cAAK,EAAE,EAAC,YAAY,YAClB,MAAC,MAAM,IACL,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,EACzD,OAAO,EAAE,YAAY,EACrB,aAAa,EAAC,aAAa,EAC3B,QAAQ,EAAC,OAAO,EAChB,IAAI,EAAC,IAAI,EACT,QAAQ,EAAE,QAAQ,KAAK,CAAC,aAEvB,UAAU,CAAC,CAAC,CAAC,KAAC,UAAU,KAAG,CAAC,CAAC,CAAC,KAAC,QAAQ,KAAG,EAC3C,eAAM,SAAS,EAAC,SAAS,kCAAyB,IAC3C,GACL,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,iBAAiB,CAAC","sourcesContent":["import { Button } from \"../..\";\n\nimport { FaExpand, FaCompress } from \"react-icons/fa\";\n\nconst FullscreenControl = (fullscreen: boolean, duration: number, onFullscreen?: () => void) => {\n return (\n <div id=\"fullscreen\">\n <Button\n title={fullscreen ? \"Exit Fullscreen\" : \"View Fullscreen\"}\n onClick={onFullscreen}\n btnBackground=\"transparent\"\n btnColor=\"light\"\n size=\"sm\"\n disabled={duration === 0}\n >\n {fullscreen ? <FaCompress /> : <FaExpand />}\n <span className=\"sr-only\">Toggle Fullscreen</span>\n </Button>\n </div>\n );\n};\n\nexport default FullscreenControl;\n"]}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button } from "../..";
3
+ import { MdPictureInPictureAlt } from "react-icons/md";
4
+ var PipControl = function (duration, onPIP) {
5
+ return (_jsx("div", { id: "pip", children: _jsxs(Button, { title: "Toggle Picture in Picture", onClick: onPIP, btnBackground: "transparent", btnColor: "light", size: "sm", className: "lg:-ml-2", disabled: duration === 0, children: [_jsx(MdPictureInPictureAlt, {}), _jsx("span", { className: "sr-only", children: "Toggle Picture in Picture" })] }) }));
6
+ };
7
+ export default PipControl;
8
+ //# sourceMappingURL=PipControl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PipControl.js","sourceRoot":"","sources":["../../../../src/ui/videoplayer/controls/PipControl.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,IAAM,UAAU,GAAG,UAAC,QAAgB,EAAE,KAAkB;IACtD,OAAO,CACL,cAAK,EAAE,EAAC,KAAK,YACX,MAAC,MAAM,IACL,KAAK,EAAC,2BAA2B,EACjC,OAAO,EAAE,KAAK,EACd,aAAa,EAAC,aAAa,EAC3B,QAAQ,EAAC,OAAO,EAChB,IAAI,EAAC,IAAI,EACT,SAAS,EAAC,UAAU,EACpB,QAAQ,EAAE,QAAQ,KAAK,CAAC,aAExB,KAAC,qBAAqB,KAAG,EACzB,eAAM,SAAS,EAAC,SAAS,0CAAiC,IACnD,GACL,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC","sourcesContent":["import { Button } from \"../..\";\n\nimport { MdPictureInPictureAlt } from \"react-icons/md\";\n\nconst PipControl = (duration: number, onPIP?: () => void) => {\n return (\n <div id=\"pip\">\n <Button\n title=\"Toggle Picture in Picture\"\n onClick={onPIP}\n btnBackground=\"transparent\"\n btnColor=\"light\"\n size=\"sm\"\n className=\"lg:-ml-2\"\n disabled={duration === 0}\n >\n <MdPictureInPictureAlt />\n <span className=\"sr-only\">Toggle Picture in Picture</span>\n </Button>\n </div>\n );\n};\n\nexport default PipControl;\n"]}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button } from "../..";
3
+ import { FaVolumeMute, FaVolumeUp } from "react-icons/fa";
4
+ var SoundControl = function (muted, onMute, duration, volumeLevel, handleVolumeChange) {
5
+ return (_jsxs("div", { id: "sound", className: "flex gap-1 items-center", children: [_jsxs(Button, { title: muted ? "Unmute Sound" : "Mute Sound", onClick: onMute, btnBackground: "transparent", btnColor: "light", size: "sm", children: [muted ? _jsx(FaVolumeMute, {}) : _jsx(FaVolumeUp, {}), _jsx("span", { className: "sr-only", children: "Toggle Mute Sound" })] }), _jsx("input", { type: "range", min: "0", max: "10", step: "1", value: volumeLevel, onChange: handleVolumeChange, className: "volume-slider w-16 hidden lg:block", disabled: duration === 0 })] }));
6
+ };
7
+ export default SoundControl;
8
+ //# sourceMappingURL=SoundControl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SoundControl.js","sourceRoot":"","sources":["../../../../src/ui/videoplayer/controls/SoundControl.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE1D,IAAM,YAAY,GAAG,UACnB,KAAc,EACd,MAAkB,EAClB,QAAgB,EAChB,WAAmB,EACnB,kBAAoE;IAEpE,OAAO,CACL,eAAK,EAAE,EAAC,OAAO,EAAC,SAAS,EAAC,yBAAyB,aACjD,MAAC,MAAM,IACL,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,EAC5C,OAAO,EAAE,MAAM,EACf,aAAa,EAAC,aAAa,EAC3B,QAAQ,EAAC,OAAO,EAChB,IAAI,EAAC,IAAI,aAER,KAAK,CAAC,CAAC,CAAC,KAAC,YAAY,KAAG,CAAC,CAAC,CAAC,KAAC,UAAU,KAAG,EAC1C,eAAM,SAAS,EAAC,SAAS,kCAAyB,IAC3C,EACT,gBACE,IAAI,EAAC,OAAO,EACZ,GAAG,EAAC,GAAG,EACP,GAAG,EAAC,IAAI,EACR,IAAI,EAAC,GAAG,EACR,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,kBAAkB,EAC5B,SAAS,EAAC,oCAAoC,EAC9C,QAAQ,EAAE,QAAQ,KAAK,CAAC,GACxB,IACE,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,YAAY,CAAC","sourcesContent":["import { Button } from \"../..\";\n\nimport { FaVolumeMute, FaVolumeUp } from \"react-icons/fa\";\n\nconst SoundControl = (\n muted: boolean,\n onMute: () => void,\n duration: number,\n volumeLevel: number,\n handleVolumeChange: (e: React.ChangeEvent<HTMLInputElement>) => void\n) => {\n return (\n <div id=\"sound\" className=\"flex gap-1 items-center\">\n <Button\n title={muted ? \"Unmute Sound\" : \"Mute Sound\"}\n onClick={onMute}\n btnBackground=\"transparent\"\n btnColor=\"light\"\n size=\"sm\"\n >\n {muted ? <FaVolumeMute /> : <FaVolumeUp />}\n <span className=\"sr-only\">Toggle Mute Sound</span>\n </Button>\n <input\n type=\"range\"\n min=\"0\"\n max=\"10\"\n step=\"1\"\n value={volumeLevel}\n onChange={handleVolumeChange}\n className=\"volume-slider w-16 hidden lg:block\"\n disabled={duration === 0}\n />\n </div>\n );\n};\n\nexport default SoundControl;\n"]}
@@ -0,0 +1,5 @@
1
+ export { default as CaptionsControl } from './CaptionsControl';
2
+ export { default as FullscreenControl } from './FullscreenControl';
3
+ export { default as PipControl } from './PipControl';
4
+ export { default as SoundControl } from './SoundControl';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ui/videoplayer/controls/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAC9D,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAClE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAA;AACpD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAA","sourcesContent":["export { default as CaptionsControl } from './CaptionsControl'\nexport { default as FullscreenControl } from './FullscreenControl'\nexport { default as PipControl } from './PipControl'\nexport { default as SoundControl } from './SoundControl'\n"]}
@@ -0,0 +1,3 @@
1
+ export { default as Video } from './Video';
2
+ export { default as VideoPlayer } from './VideoPlayer';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ui/videoplayer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAA;AAC1C,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAA","sourcesContent":["export { default as Video } from './Video'\nexport { default as VideoPlayer } from './VideoPlayer'"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ui/videoplayer/types/index.ts"],"names":[],"mappings":"","sourcesContent":["export type VideoFormat = 'mp4' | 'webm' | 'ogg'\nexport type PreloadOption = 'auto' | 'metadata' | 'none'\nexport type ControlOption = 'sound' | 'fullscreen' | 'pip' | 'captions'\n\nexport interface VideoTracksProps {\n\ttracks?: string[]\n\tsrcLangs?: string[]\n}\n\nexport interface MediaProps extends VideoTracksProps {\n\tsrc: string\n\tposter?: string\n\tloop?: boolean\n\tpreload?: PreloadOption\n\tformats?: VideoFormat[]\n\tfallback?: string\n\tmuted?: boolean\n\tautoplay?: boolean\n\taspect?: 'square' | 'phone' | 'video' | 'television' | 'cinema' | 'ultrawide'\n\tgrayscale?: 'none' | 'grayscale' | 'sepia'\n}\n\nexport interface VideoSpecificProps {\n\tdefaultError?: string\n\tplay?: boolean\n\ttogglePlay?: () => void\n\tplayEnded?: () => void\n\tpictureInPicture?: boolean\n\tcontrols?: boolean\n\ttrackIndex?: string\n\tvideoWidth?: string\n\tvideoHeight?: string\n\tblur?: boolean\n}\n\nexport interface VideoProps extends MediaProps, VideoSpecificProps {\n\tsetDuration?: (duration: number) => void\n\tsetTime?: (time: number) => void\n\tcurrentTime?: number\n\tvolume?: number\n\tclassName?: string\n}\n\nexport interface VideoPlayerProps extends React.HTMLAttributes<HTMLDivElement>, MediaProps {\n\tclassName?: string\n\tdefaultError?: string\n\tcontrolOptions?: ControlOption[]\n\tprogressBg?: string\n\tprogressColor?: string\n}\n\nexport interface VideoControlProps extends React.HTMLAttributes<HTMLDivElement>, VideoTracksProps {\n\tduration: number\n\ttime: number\n\ttogglePlay: () => void\n\tplay: boolean\n\tfullscreen: boolean\n\tmuted: boolean\n\tonScrubChange?: (time: number) => void\n\tonFullscreen?: () => void\n\tonPIP?: () => void\n\tonMute: () => void\n\tonVolume: (volume: number) => void\n\tonCaption: (index: string) => void\n\tcontrolOptions?: ControlOption[]\n\tprogressBg?: string\n\tprogressColor?: string\n}\n"]}
@@ -0,0 +1,33 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __rest = (this && this.__rest) || function (s, e) {
13
+ var t = {};
14
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
15
+ t[p] = s[p];
16
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
17
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
18
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
19
+ t[p[i]] = s[p[i]];
20
+ }
21
+ return t;
22
+ };
23
+ import { jsx as _jsx } from "react/jsx-runtime";
24
+ import { twMerge } from "tailwind-merge";
25
+ var YoutubeEmbed = function (_a) {
26
+ var _b = _a.className, className = _b === void 0 ? "" : _b, style = _a.style, videoId = _a.videoId, _c = _a.title, title = _c === void 0 ? "YouTube video player" : _c, _d = _a.playerParams, playerParams = _d === void 0 ? {} : _d, _e = _a.loading, loading = _e === void 0 ? "lazy" : _e, _f = _a.allow, allow = _f === void 0 ? "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" : _f, iframeProps = __rest(_a, ["className", "style", "videoId", "title", "playerParams", "loading", "allow"]);
27
+ var baseUrl = "https://www.youtube-nocookie.com/embed/";
28
+ var params = new URLSearchParams(playerParams).toString();
29
+ var embedUrl = "".concat(baseUrl).concat(videoId, "?").concat(params);
30
+ return (_jsx("div", { className: twMerge("aspect-video w-full ", className), style: style, children: _jsx("iframe", __assign({ className: "w-full h-full", src: embedUrl, title: title, allowFullScreen: true, loading: loading, referrerPolicy: "strict-origin-when-cross-origin", allow: allow }, iframeProps)) }));
31
+ };
32
+ export default YoutubeEmbed;
33
+ //# sourceMappingURL=YoutubeEmbed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"YoutubeEmbed.js","sourceRoot":"","sources":["../../../src/ui/youtubeembed/YoutubeEmbed.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,IAAM,YAAY,GAAG,UAAC,EASF;IARlB,IAAA,iBAAc,EAAd,SAAS,mBAAG,EAAE,KAAA,EACd,KAAK,WAAA,EACL,OAAO,aAAA,EACP,aAA8B,EAA9B,KAAK,mBAAG,sBAAsB,KAAA,EAC9B,oBAAiB,EAAjB,YAAY,mBAAG,EAAE,KAAA,EACjB,eAAgB,EAAhB,OAAO,mBAAG,MAAM,KAAA,EAChB,aAAkG,EAAlG,KAAK,mBAAG,0FAA0F,KAAA,EAC/F,WAAW,cARM,8EASrB,CADe;IAEd,IAAM,OAAO,GAAG,yCAAyC,CAAC;IAC1D,IAAM,MAAM,GAAG,IAAI,eAAe,CAAC,YAAsC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACtF,IAAM,QAAQ,GAAG,UAAG,OAAO,SAAG,OAAO,cAAI,MAAM,CAAE,CAAC;IAElD,OAAO,CACL,cAAK,SAAS,EAAE,OAAO,CAAC,sBAAsB,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,YACtE,0BACE,SAAS,EAAC,eAAe,EACzB,GAAG,EAAE,QAAQ,EACb,KAAK,EAAE,KAAK,EACZ,eAAe,QACf,OAAO,EAAE,OAAO,EAChB,cAAc,EAAC,iCAAiC,EAChD,KAAK,EAAE,KAAK,IACR,WAAW,EACf,GACE,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,YAAY,CAAC","sourcesContent":["import React from \"react\";\nimport { YoutubeEmbedProps } from \"./types\";\n\nimport { twMerge } from \"tailwind-merge\";\n\nconst YoutubeEmbed = ({\n className = \"\",\n style,\n videoId,\n title = \"YouTube video player\",\n playerParams = {},\n loading = \"lazy\",\n allow = \"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\",\n ...iframeProps\n}: YoutubeEmbedProps) => {\n const baseUrl = \"https://www.youtube-nocookie.com/embed/\";\n const params = new URLSearchParams(playerParams as Record<string, string>).toString();\n const embedUrl = `${baseUrl}${videoId}?${params}`;\n\n return (\n <div className={twMerge(\"aspect-video w-full \", className)} style={style}>\n <iframe\n className=\"w-full h-full\"\n src={embedUrl}\n title={title}\n allowFullScreen\n loading={loading}\n referrerPolicy=\"strict-origin-when-cross-origin\"\n allow={allow}\n {...iframeProps}\n />\n </div>\n );\n};\n\nexport default YoutubeEmbed;\n"]}
@@ -0,0 +1,2 @@
1
+ export { default as YoutubeEmbed } from './YoutubeEmbed';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ui/youtubeembed/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAA","sourcesContent":["export { default as YoutubeEmbed } from './YoutubeEmbed'\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ui/youtubeembed/types/index.ts"],"names":[],"mappings":"","sourcesContent":["interface PlayerParamsProps {\n autoplay?: 0 | 1;\n controls?: 0 | 1;\n loop?: 0 | 1;\n mute?: 0 | 1;\n start?: number;\n end?: number;\n modestbranding?: 0 | 1;\n rel?: 0 | 1;\n fs?: 0 | 1;\n cc_load_policy?: 0 | 1;\n playsinline?: 0 | 1;\n}\n\ninterface IFrameProps {\n loading?: \"eager\" | \"lazy\";\n allow?: string;\n}\n\nexport interface YoutubeEmbedProps extends IFrameProps {\n className?: string;\n style?: React.CSSProperties;\n videoId: string;\n title?: string;\n playerParams?: PlayerParamsProps;\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@smitch/breeze",
3
+ "version": "0.1.0",
4
+ "description": "A lightweight, Tailwind-powered React/Next.js UI component library.",
5
+ "main": "index.js",
6
+ "keywords": [
7
+ "react",
8
+ "tailwindcss",
9
+ "ui-components",
10
+ "nextjs",
11
+ "breeze-ui"
12
+ ],
13
+ "author": "Stephen Mitchell",
14
+ "license": "MIT",
15
+ "files": [
16
+ "lib",
17
+ "index.d.ts",
18
+ "package.json",
19
+ "README.md",
20
+ ".npmignore"
21
+ ],
22
+ "dependencies": {
23
+ "@smitch/js-lib": "^0.3.22",
24
+ "react-icons": "^5.5.0",
25
+ "tailwind-merge": "^2.5.4",
26
+ "@tailwindcss/forms": "^0.5.9",
27
+ "@tailwindcss/typography": "^0.5.15",
28
+ "prismjs": "^1.30.0"
29
+ },
30
+ "peerDependencies": {
31
+ "react": ">=19",
32
+ "react-dom": "^19.0.0",
33
+ "next": ">=15",
34
+ "tailwindcss": ">=3"
35
+ },
36
+ "devDependencies": {
37
+ "@types/prismjs": "^1.26.5"
38
+ }
39
+ }