luxen-ui 0.3.0 → 0.5.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 (385) hide show
  1. package/cdn/chunks/decorate.js +1 -1
  2. package/cdn/chunks/decorate.js.map +1 -1
  3. package/cdn/chunks/map.js +2 -0
  4. package/cdn/chunks/map.js.map +1 -0
  5. package/cdn/custom-elements.json +6707 -4242
  6. package/cdn/elements/avatar/avatar.d.ts +1 -1
  7. package/cdn/elements/avatar/avatar.d.ts.map +1 -1
  8. package/cdn/elements/avatar/avatar.js +3 -3
  9. package/cdn/elements/avatar/avatar.js.map +1 -1
  10. package/cdn/elements/avatar/index.d.ts +2 -2
  11. package/cdn/elements/avatar/index.d.ts.map +1 -1
  12. package/cdn/elements/avatar/index.js +1 -1
  13. package/cdn/elements/avatar/index.js.map +1 -1
  14. package/cdn/elements/badge/badge.d.ts +1 -1
  15. package/cdn/elements/badge/badge.d.ts.map +1 -1
  16. package/cdn/elements/badge/badge.js +1 -1
  17. package/cdn/elements/badge/badge.js.map +1 -1
  18. package/cdn/elements/badge/index.d.ts +2 -2
  19. package/cdn/elements/badge/index.d.ts.map +1 -1
  20. package/cdn/elements/badge/index.js +1 -1
  21. package/cdn/elements/badge/index.js.map +1 -1
  22. package/cdn/elements/carousel/carousel.d.ts +18 -11
  23. package/cdn/elements/carousel/carousel.d.ts.map +1 -1
  24. package/cdn/elements/carousel/carousel.js +21 -20
  25. package/cdn/elements/carousel/carousel.js.map +1 -1
  26. package/cdn/elements/carousel/index.d.ts +2 -2
  27. package/cdn/elements/carousel/index.d.ts.map +1 -1
  28. package/cdn/elements/carousel/index.js +1 -1
  29. package/cdn/elements/carousel/index.js.map +1 -1
  30. package/cdn/elements/carousel-item/carousel-item.d.ts +1 -1
  31. package/cdn/elements/carousel-item/carousel-item.d.ts.map +1 -1
  32. package/cdn/elements/carousel-item/carousel-item.js +1 -1
  33. package/cdn/elements/carousel-item/carousel-item.js.map +1 -1
  34. package/cdn/elements/carousel-item/index.d.ts +2 -2
  35. package/cdn/elements/carousel-item/index.d.ts.map +1 -1
  36. package/cdn/elements/carousel-item/index.js +1 -1
  37. package/cdn/elements/carousel-item/index.js.map +1 -1
  38. package/cdn/elements/dialog/dialog.d.ts +1 -1
  39. package/cdn/elements/dialog/dialog.d.ts.map +1 -1
  40. package/cdn/elements/dialog/dialog.js +2 -2
  41. package/cdn/elements/dialog/dialog.js.map +1 -1
  42. package/cdn/elements/dialog/dialog.styles.js.map +1 -1
  43. package/cdn/elements/dialog/index.d.ts +2 -2
  44. package/cdn/elements/dialog/index.d.ts.map +1 -1
  45. package/cdn/elements/dialog/index.js +1 -1
  46. package/cdn/elements/dialog/index.js.map +1 -1
  47. package/cdn/elements/divider/divider.d.ts +1 -1
  48. package/cdn/elements/divider/divider.d.ts.map +1 -1
  49. package/cdn/elements/divider/divider.js +1 -1
  50. package/cdn/elements/divider/divider.js.map +1 -1
  51. package/cdn/elements/divider/index.d.ts +2 -2
  52. package/cdn/elements/divider/index.d.ts.map +1 -1
  53. package/cdn/elements/divider/index.js +1 -1
  54. package/cdn/elements/divider/index.js.map +1 -1
  55. package/cdn/elements/drawer/drawer.d.ts +2 -2
  56. package/cdn/elements/drawer/drawer.d.ts.map +1 -1
  57. package/cdn/elements/drawer/drawer.js +1 -1
  58. package/cdn/elements/drawer/drawer.js.map +1 -1
  59. package/cdn/elements/drawer/index.d.ts +2 -2
  60. package/cdn/elements/drawer/index.d.ts.map +1 -1
  61. package/cdn/elements/drawer/index.js +1 -1
  62. package/cdn/elements/drawer/index.js.map +1 -1
  63. package/cdn/elements/dropdown/dropdown.d.ts +7 -4
  64. package/cdn/elements/dropdown/dropdown.d.ts.map +1 -1
  65. package/cdn/elements/dropdown/dropdown.js +7 -4
  66. package/cdn/elements/dropdown/dropdown.js.map +1 -1
  67. package/cdn/elements/dropdown/index.d.ts +2 -2
  68. package/cdn/elements/dropdown/index.d.ts.map +1 -1
  69. package/cdn/elements/dropdown/index.js +1 -1
  70. package/cdn/elements/dropdown/index.js.map +1 -1
  71. package/cdn/elements/dropdown-item/dropdown-item.d.ts +1 -1
  72. package/cdn/elements/dropdown-item/dropdown-item.d.ts.map +1 -1
  73. package/cdn/elements/dropdown-item/dropdown-item.js +2 -2
  74. package/cdn/elements/dropdown-item/dropdown-item.js.map +1 -1
  75. package/cdn/elements/dropdown-item/index.d.ts +2 -2
  76. package/cdn/elements/dropdown-item/index.d.ts.map +1 -1
  77. package/cdn/elements/dropdown-item/index.js +1 -1
  78. package/cdn/elements/dropdown-item/index.js.map +1 -1
  79. package/cdn/elements/icon/icon.d.ts +1 -1
  80. package/cdn/elements/icon/icon.d.ts.map +1 -1
  81. package/cdn/elements/icon/icon.js +2 -2
  82. package/cdn/elements/icon/icon.js.map +1 -1
  83. package/cdn/elements/icon/index.d.ts +2 -2
  84. package/cdn/elements/icon/index.d.ts.map +1 -1
  85. package/cdn/elements/icon/index.js +1 -1
  86. package/cdn/elements/icon/index.js.map +1 -1
  87. package/cdn/elements/input-otp/index.d.ts +2 -2
  88. package/cdn/elements/input-otp/index.d.ts.map +1 -1
  89. package/cdn/elements/input-otp/index.js +1 -1
  90. package/cdn/elements/input-otp/index.js.map +1 -1
  91. package/cdn/elements/input-otp/input-otp.d.ts +1 -1
  92. package/cdn/elements/input-otp/input-otp.d.ts.map +1 -1
  93. package/cdn/elements/input-otp/input-otp.js +1 -1
  94. package/cdn/elements/input-otp/input-otp.js.map +1 -1
  95. package/cdn/elements/input-stepper/index.d.ts +2 -2
  96. package/cdn/elements/input-stepper/index.d.ts.map +1 -1
  97. package/cdn/elements/input-stepper/index.js +1 -1
  98. package/cdn/elements/input-stepper/index.js.map +1 -1
  99. package/cdn/elements/input-stepper/input-stepper.d.ts +1 -1
  100. package/cdn/elements/input-stepper/input-stepper.d.ts.map +1 -1
  101. package/cdn/elements/input-stepper/input-stepper.js +1 -1
  102. package/cdn/elements/input-stepper/input-stepper.js.map +1 -1
  103. package/cdn/elements/popover/index.d.ts +2 -2
  104. package/cdn/elements/popover/index.d.ts.map +1 -1
  105. package/cdn/elements/popover/index.js +1 -1
  106. package/cdn/elements/popover/index.js.map +1 -1
  107. package/cdn/elements/popover/popover.d.ts +1 -1
  108. package/cdn/elements/popover/popover.d.ts.map +1 -1
  109. package/cdn/elements/popover/popover.js +2 -2
  110. package/cdn/elements/popover/popover.js.map +1 -1
  111. package/cdn/elements/rating/index.d.ts +2 -2
  112. package/cdn/elements/rating/index.d.ts.map +1 -1
  113. package/cdn/elements/rating/index.js +1 -1
  114. package/cdn/elements/rating/index.js.map +1 -1
  115. package/cdn/elements/rating/rating.d.ts +1 -1
  116. package/cdn/elements/rating/rating.d.ts.map +1 -1
  117. package/cdn/elements/rating/rating.js +2 -2
  118. package/cdn/elements/rating/rating.js.map +1 -1
  119. package/cdn/elements/skeleton/index.d.ts +2 -2
  120. package/cdn/elements/skeleton/index.d.ts.map +1 -1
  121. package/cdn/elements/skeleton/index.js +1 -1
  122. package/cdn/elements/skeleton/index.js.map +1 -1
  123. package/cdn/elements/skeleton/skeleton.d.ts +1 -1
  124. package/cdn/elements/skeleton/skeleton.d.ts.map +1 -1
  125. package/cdn/elements/skeleton/skeleton.js +1 -1
  126. package/cdn/elements/skeleton/skeleton.js.map +1 -1
  127. package/cdn/elements/spinner/index.d.ts +2 -2
  128. package/cdn/elements/spinner/index.d.ts.map +1 -1
  129. package/cdn/elements/spinner/index.js +1 -1
  130. package/cdn/elements/spinner/index.js.map +1 -1
  131. package/cdn/elements/spinner/spinner.d.ts +1 -1
  132. package/cdn/elements/spinner/spinner.d.ts.map +1 -1
  133. package/cdn/elements/spinner/spinner.js +1 -1
  134. package/cdn/elements/spinner/spinner.js.map +1 -1
  135. package/cdn/elements/sticky-bar/index.d.ts +8 -0
  136. package/cdn/elements/sticky-bar/index.d.ts.map +1 -0
  137. package/cdn/elements/sticky-bar/index.js +2 -0
  138. package/cdn/elements/sticky-bar/index.js.map +1 -0
  139. package/cdn/elements/sticky-bar/sticky-bar.d.ts +46 -0
  140. package/cdn/elements/sticky-bar/sticky-bar.d.ts.map +1 -0
  141. package/cdn/elements/sticky-bar/sticky-bar.js +2 -0
  142. package/cdn/elements/sticky-bar/sticky-bar.js.map +1 -0
  143. package/cdn/elements/stories/index.d.ts +8 -0
  144. package/cdn/elements/stories/index.d.ts.map +1 -0
  145. package/cdn/elements/stories/index.js +2 -0
  146. package/cdn/elements/stories/index.js.map +1 -0
  147. package/cdn/elements/stories/stories.d.ts +50 -0
  148. package/cdn/elements/stories/stories.d.ts.map +1 -0
  149. package/cdn/elements/stories/stories.js +2 -0
  150. package/cdn/elements/stories/stories.js.map +1 -0
  151. package/cdn/elements/stories-viewer/index.d.ts +8 -0
  152. package/cdn/elements/stories-viewer/index.d.ts.map +1 -0
  153. package/cdn/elements/stories-viewer/index.js +2 -0
  154. package/cdn/elements/stories-viewer/index.js.map +1 -0
  155. package/cdn/elements/stories-viewer/stories-viewer.d.ts +136 -0
  156. package/cdn/elements/stories-viewer/stories-viewer.d.ts.map +1 -0
  157. package/cdn/elements/stories-viewer/stories-viewer.js +160 -0
  158. package/cdn/elements/stories-viewer/stories-viewer.js.map +1 -0
  159. package/cdn/elements/story/index.d.ts +8 -0
  160. package/cdn/elements/story/index.d.ts.map +1 -0
  161. package/cdn/elements/story/index.js +2 -0
  162. package/cdn/elements/story/index.js.map +1 -0
  163. package/cdn/elements/story/story.d.ts +48 -0
  164. package/cdn/elements/story/story.d.ts.map +1 -0
  165. package/cdn/elements/story/story.js +35 -0
  166. package/cdn/elements/story/story.js.map +1 -0
  167. package/cdn/elements/tabs/index.d.ts +2 -2
  168. package/cdn/elements/tabs/index.d.ts.map +1 -1
  169. package/cdn/elements/tabs/index.js +1 -1
  170. package/cdn/elements/tabs/index.js.map +1 -1
  171. package/cdn/elements/tabs/tabs.d.ts +1 -1
  172. package/cdn/elements/tabs/tabs.d.ts.map +1 -1
  173. package/cdn/elements/tabs/tabs.js +1 -1
  174. package/cdn/elements/tabs/tabs.js.map +1 -1
  175. package/cdn/elements/toast/index.d.ts +3 -3
  176. package/cdn/elements/toast/index.d.ts.map +1 -1
  177. package/cdn/elements/toast/index.js +1 -1
  178. package/cdn/elements/toast/index.js.map +1 -1
  179. package/cdn/elements/toast/toast.d.ts +2 -2
  180. package/cdn/elements/toast/toast.d.ts.map +1 -1
  181. package/cdn/elements/toast/toast.js +1 -1
  182. package/cdn/elements/toast/toast.js.map +1 -1
  183. package/cdn/elements/tooltip/index.d.ts +2 -2
  184. package/cdn/elements/tooltip/index.d.ts.map +1 -1
  185. package/cdn/elements/tooltip/index.js +1 -1
  186. package/cdn/elements/tooltip/index.js.map +1 -1
  187. package/cdn/elements/tooltip/tooltip.d.ts +4 -4
  188. package/cdn/elements/tooltip/tooltip.d.ts.map +1 -1
  189. package/cdn/elements/tooltip/tooltip.js +2 -2
  190. package/cdn/elements/tooltip/tooltip.js.map +1 -1
  191. package/cdn/elements/tree/index.d.ts +2 -2
  192. package/cdn/elements/tree/index.d.ts.map +1 -1
  193. package/cdn/elements/tree/index.js +1 -1
  194. package/cdn/elements/tree/index.js.map +1 -1
  195. package/cdn/elements/tree/tree.d.ts +5 -5
  196. package/cdn/elements/tree/tree.d.ts.map +1 -1
  197. package/cdn/elements/tree/tree.js +2 -2
  198. package/cdn/elements/tree/tree.js.map +1 -1
  199. package/cdn/elements/tree-item/index.d.ts +2 -2
  200. package/cdn/elements/tree-item/index.d.ts.map +1 -1
  201. package/cdn/elements/tree-item/index.js +1 -1
  202. package/cdn/elements/tree-item/index.js.map +1 -1
  203. package/cdn/elements/tree-item/tree-item.d.ts +2 -2
  204. package/cdn/elements/tree-item/tree-item.d.ts.map +1 -1
  205. package/cdn/elements/tree-item/tree-item.js +2 -2
  206. package/cdn/elements/tree-item/tree-item.js.map +1 -1
  207. package/cdn/registry.d.ts +1 -1
  208. package/cdn/registry.d.ts.map +1 -1
  209. package/cdn/registry.js.map +1 -1
  210. package/cdn/shared/controllers/popover.js.map +1 -1
  211. package/cdn/shared/luxen-form-associated-element.js +1 -1
  212. package/cdn/shared/styles/host.styles.js.map +1 -1
  213. package/cdn/styles/elements/divider.css +7 -0
  214. package/cdn/styles/elements/select.css +3 -3
  215. package/cdn/styles/elements/stories.css +63 -0
  216. package/cdn/styles/elements/story.css +192 -0
  217. package/cdn/styles/index.css +3 -0
  218. package/dist/css/elements/divider.css +7 -0
  219. package/dist/css/elements/select.css +3 -3
  220. package/dist/css/elements/stories.css +63 -0
  221. package/dist/css/elements/story.css +192 -0
  222. package/dist/css/index.css +3 -0
  223. package/dist/custom-elements.json +6707 -4242
  224. package/dist/elements/avatar/avatar.css +13 -7
  225. package/dist/elements/avatar/avatar.d.ts +1 -1
  226. package/dist/elements/avatar/avatar.d.ts.map +1 -1
  227. package/dist/elements/avatar/avatar.js +11 -11
  228. package/dist/elements/avatar/index.d.ts +2 -2
  229. package/dist/elements/avatar/index.d.ts.map +1 -1
  230. package/dist/elements/avatar/index.js +2 -2
  231. package/dist/elements/badge/badge.d.ts +1 -1
  232. package/dist/elements/badge/badge.d.ts.map +1 -1
  233. package/dist/elements/badge/badge.js +5 -5
  234. package/dist/elements/badge/index.d.ts +2 -2
  235. package/dist/elements/badge/index.d.ts.map +1 -1
  236. package/dist/elements/badge/index.js +2 -2
  237. package/dist/elements/carousel/carousel.css +7 -0
  238. package/dist/elements/carousel/carousel.d.ts +18 -11
  239. package/dist/elements/carousel/carousel.d.ts.map +1 -1
  240. package/dist/elements/carousel/carousel.js +193 -167
  241. package/dist/elements/carousel/index.d.ts +2 -2
  242. package/dist/elements/carousel/index.d.ts.map +1 -1
  243. package/dist/elements/carousel/index.js +2 -2
  244. package/dist/elements/carousel-item/carousel-item.d.ts +1 -1
  245. package/dist/elements/carousel-item/carousel-item.d.ts.map +1 -1
  246. package/dist/elements/carousel-item/carousel-item.js +2 -2
  247. package/dist/elements/carousel-item/index.d.ts +2 -2
  248. package/dist/elements/carousel-item/index.d.ts.map +1 -1
  249. package/dist/elements/carousel-item/index.js +2 -2
  250. package/dist/elements/dialog/dialog.d.ts +1 -1
  251. package/dist/elements/dialog/dialog.d.ts.map +1 -1
  252. package/dist/elements/dialog/dialog.js +9 -9
  253. package/dist/elements/dialog/index.d.ts +2 -2
  254. package/dist/elements/dialog/index.d.ts.map +1 -1
  255. package/dist/elements/dialog/index.js +2 -2
  256. package/dist/elements/divider/divider.d.ts +1 -1
  257. package/dist/elements/divider/divider.d.ts.map +1 -1
  258. package/dist/elements/divider/divider.js +3 -3
  259. package/dist/elements/divider/index.d.ts +2 -2
  260. package/dist/elements/divider/index.d.ts.map +1 -1
  261. package/dist/elements/divider/index.js +2 -2
  262. package/dist/elements/drawer/drawer.d.ts +2 -2
  263. package/dist/elements/drawer/drawer.d.ts.map +1 -1
  264. package/dist/elements/drawer/drawer.js +4 -4
  265. package/dist/elements/drawer/index.d.ts +2 -2
  266. package/dist/elements/drawer/index.d.ts.map +1 -1
  267. package/dist/elements/drawer/index.js +2 -2
  268. package/dist/elements/dropdown/dropdown.css +14 -3
  269. package/dist/elements/dropdown/dropdown.d.ts +7 -4
  270. package/dist/elements/dropdown/dropdown.d.ts.map +1 -1
  271. package/dist/elements/dropdown/dropdown.js +41 -29
  272. package/dist/elements/dropdown/index.d.ts +2 -2
  273. package/dist/elements/dropdown/index.d.ts.map +1 -1
  274. package/dist/elements/dropdown/index.js +2 -2
  275. package/dist/elements/dropdown-item/dropdown-item.d.ts +1 -1
  276. package/dist/elements/dropdown-item/dropdown-item.d.ts.map +1 -1
  277. package/dist/elements/dropdown-item/dropdown-item.js +20 -20
  278. package/dist/elements/dropdown-item/index.d.ts +2 -2
  279. package/dist/elements/dropdown-item/index.d.ts.map +1 -1
  280. package/dist/elements/dropdown-item/index.js +2 -2
  281. package/dist/elements/icon/icon.d.ts +1 -1
  282. package/dist/elements/icon/icon.d.ts.map +1 -1
  283. package/dist/elements/icon/icon.js +4 -4
  284. package/dist/elements/icon/index.d.ts +2 -2
  285. package/dist/elements/icon/index.d.ts.map +1 -1
  286. package/dist/elements/icon/index.js +2 -2
  287. package/dist/elements/input-otp/index.d.ts +2 -2
  288. package/dist/elements/input-otp/index.d.ts.map +1 -1
  289. package/dist/elements/input-otp/index.js +2 -2
  290. package/dist/elements/input-otp/input-otp.d.ts +1 -1
  291. package/dist/elements/input-otp/input-otp.d.ts.map +1 -1
  292. package/dist/elements/input-otp/input-otp.js +2 -2
  293. package/dist/elements/input-stepper/index.d.ts +2 -2
  294. package/dist/elements/input-stepper/index.d.ts.map +1 -1
  295. package/dist/elements/input-stepper/index.js +2 -2
  296. package/dist/elements/input-stepper/input-stepper.d.ts +1 -1
  297. package/dist/elements/input-stepper/input-stepper.d.ts.map +1 -1
  298. package/dist/elements/input-stepper/input-stepper.js +8 -8
  299. package/dist/elements/popover/index.d.ts +2 -2
  300. package/dist/elements/popover/index.d.ts.map +1 -1
  301. package/dist/elements/popover/index.js +2 -2
  302. package/dist/elements/popover/popover.d.ts +1 -1
  303. package/dist/elements/popover/popover.d.ts.map +1 -1
  304. package/dist/elements/popover/popover.js +33 -33
  305. package/dist/elements/rating/index.d.ts +2 -2
  306. package/dist/elements/rating/index.d.ts.map +1 -1
  307. package/dist/elements/rating/index.js +2 -2
  308. package/dist/elements/rating/rating.d.ts +1 -1
  309. package/dist/elements/rating/rating.d.ts.map +1 -1
  310. package/dist/elements/rating/rating.js +48 -48
  311. package/dist/elements/skeleton/index.d.ts +2 -2
  312. package/dist/elements/skeleton/index.d.ts.map +1 -1
  313. package/dist/elements/skeleton/index.js +2 -2
  314. package/dist/elements/skeleton/skeleton.d.ts +1 -1
  315. package/dist/elements/skeleton/skeleton.d.ts.map +1 -1
  316. package/dist/elements/skeleton/skeleton.js +1 -1
  317. package/dist/elements/spinner/index.d.ts +2 -2
  318. package/dist/elements/spinner/index.d.ts.map +1 -1
  319. package/dist/elements/spinner/index.js +2 -2
  320. package/dist/elements/spinner/spinner.d.ts +1 -1
  321. package/dist/elements/spinner/spinner.d.ts.map +1 -1
  322. package/dist/elements/spinner/spinner.js +2 -2
  323. package/dist/elements/sticky-bar/index.d.ts +8 -0
  324. package/dist/elements/sticky-bar/index.d.ts.map +1 -0
  325. package/dist/elements/sticky-bar/index.js +4 -0
  326. package/dist/elements/sticky-bar/sticky-bar.css +56 -0
  327. package/dist/elements/sticky-bar/sticky-bar.d.ts +46 -0
  328. package/dist/elements/sticky-bar/sticky-bar.d.ts.map +1 -0
  329. package/dist/elements/sticky-bar/sticky-bar.js +146 -0
  330. package/dist/elements/stories/index.d.ts +8 -0
  331. package/dist/elements/stories/index.d.ts.map +1 -0
  332. package/dist/elements/stories/index.js +4 -0
  333. package/dist/elements/stories/stories.d.ts +50 -0
  334. package/dist/elements/stories/stories.d.ts.map +1 -0
  335. package/dist/elements/stories/stories.js +113 -0
  336. package/dist/elements/stories-viewer/index.d.ts +8 -0
  337. package/dist/elements/stories-viewer/index.d.ts.map +1 -0
  338. package/dist/elements/stories-viewer/index.js +4 -0
  339. package/dist/elements/stories-viewer/stories-viewer.css +337 -0
  340. package/dist/elements/stories-viewer/stories-viewer.d.ts +136 -0
  341. package/dist/elements/stories-viewer/stories-viewer.d.ts.map +1 -0
  342. package/dist/elements/stories-viewer/stories-viewer.js +719 -0
  343. package/dist/elements/story/index.d.ts +8 -0
  344. package/dist/elements/story/index.d.ts.map +1 -0
  345. package/dist/elements/story/index.js +4 -0
  346. package/dist/elements/story/story.d.ts +48 -0
  347. package/dist/elements/story/story.d.ts.map +1 -0
  348. package/dist/elements/story/story.js +161 -0
  349. package/dist/elements/tabs/index.d.ts +2 -2
  350. package/dist/elements/tabs/index.d.ts.map +1 -1
  351. package/dist/elements/tabs/index.js +2 -2
  352. package/dist/elements/tabs/tabs.d.ts +1 -1
  353. package/dist/elements/tabs/tabs.d.ts.map +1 -1
  354. package/dist/elements/tabs/tabs.js +5 -5
  355. package/dist/elements/toast/index.d.ts +3 -3
  356. package/dist/elements/toast/index.d.ts.map +1 -1
  357. package/dist/elements/toast/index.js +3 -3
  358. package/dist/elements/toast/toast.d.ts +2 -2
  359. package/dist/elements/toast/toast.d.ts.map +1 -1
  360. package/dist/elements/toast/toast.js +5 -5
  361. package/dist/elements/tooltip/index.d.ts +2 -2
  362. package/dist/elements/tooltip/index.d.ts.map +1 -1
  363. package/dist/elements/tooltip/index.js +2 -2
  364. package/dist/elements/tooltip/tooltip.css +15 -7
  365. package/dist/elements/tooltip/tooltip.d.ts +4 -4
  366. package/dist/elements/tooltip/tooltip.d.ts.map +1 -1
  367. package/dist/elements/tooltip/tooltip.js +32 -32
  368. package/dist/elements/tree/index.d.ts +2 -2
  369. package/dist/elements/tree/index.d.ts.map +1 -1
  370. package/dist/elements/tree/index.js +2 -2
  371. package/dist/elements/tree/tree.d.ts +5 -5
  372. package/dist/elements/tree/tree.d.ts.map +1 -1
  373. package/dist/elements/tree/tree.js +14 -16
  374. package/dist/elements/tree-item/index.d.ts +2 -2
  375. package/dist/elements/tree-item/index.d.ts.map +1 -1
  376. package/dist/elements/tree-item/index.js +2 -2
  377. package/dist/elements/tree-item/tree-item.d.ts +2 -2
  378. package/dist/elements/tree-item/tree-item.d.ts.map +1 -1
  379. package/dist/elements/tree-item/tree-item.js +28 -28
  380. package/dist/registry.d.ts +1 -1
  381. package/dist/registry.d.ts.map +1 -1
  382. package/dist/skills/luxen-ui/SKILL.md +1 -0
  383. package/dist/skills/luxen-ui/references/select.md +1 -1
  384. package/dist/skills/luxen-ui/references/sticky-bar.md +148 -0
  385. package/package.json +4 -4
@@ -14,5 +14,5 @@ import{c as e,i as t}from"../../chunks/lit.js";import{LuxenElement as n}from"../
14
14
  class="spinner"
15
15
  />
16
16
  </svg>
17
- `}};export{a as LuxenSpinner};
17
+ `}};export{a as Spinner};
18
18
  //# sourceMappingURL=spinner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"spinner.js","names":[],"sources":["../../../src/html/elements/spinner/spinner.css?inline","../../../src/html/elements/spinner/spinner.ts"],"sourcesContent":[":host {\n --size: 1em;\n --indicator-color: currentColor;\n --speed: 0.75s;\n\n flex: none;\n display: inline-flex;\n width: var(--size);\n height: var(--size);\n color: var(--indicator-color);\n}\n\nsvg {\n width: 100%;\n height: 100%;\n fill: currentColor;\n}\n\n.spinner {\n transform-origin: center;\n animation: spin var(--speed) linear infinite;\n}\n\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n","import { html, unsafeCSS } from 'lit';\nimport { LuxenElement } from '../../shared/luxen-element';\nimport hostStyles from '../../shared/styles/host.styles';\nimport rawStyles from './spinner.css?inline';\n\nconst styles = unsafeCSS(rawStyles);\n\n/**\n * @summary A spinner component for indicating loading state.\n * @customElement l-spinner\n *\n * @csspart base - The SVG container element.\n *\n * @cssproperty --size - The size of the spinner (width and height). Defaults to `1em`.\n * @cssproperty --indicator-color - The color of the spinner.\n * @cssproperty --speed - The duration of one full spin cycle.\n */\nexport class LuxenSpinner extends LuxenElement {\n static override styles = [hostStyles, styles];\n\n override render() {\n return html`\n <svg\n part=\"base\"\n role=\"progressbar\"\n aria-label=\"Loading\"\n viewBox=\"0 0 24 24\"\n >\n <path\n d=\"M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z\"\n opacity=\".25\"\n />\n <path\n d=\"M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z\"\n class=\"spinner\"\n />\n </svg>\n `;\n }\n}\n"],"mappings":"8JCKA,IAAM,EAAS,sUAAoB,CAYtB,EAAb,cAAkC,CAAa,oBACpB,CAAC,EAAY,EAAO,CAE7C,QAAkB,CAChB,MAAO,EAAI"}
1
+ {"version":3,"file":"spinner.js","names":[],"sources":["../../../src/html/elements/spinner/spinner.css?inline","../../../src/html/elements/spinner/spinner.ts"],"sourcesContent":[":host {\n --size: 1em;\n --indicator-color: currentColor;\n --speed: 0.75s;\n\n flex: none;\n display: inline-flex;\n width: var(--size);\n height: var(--size);\n color: var(--indicator-color);\n}\n\nsvg {\n width: 100%;\n height: 100%;\n fill: currentColor;\n}\n\n.spinner {\n transform-origin: center;\n animation: spin var(--speed) linear infinite;\n}\n\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n","import { html, unsafeCSS } from 'lit';\nimport { LuxenElement } from '../../shared/luxen-element';\nimport hostStyles from '../../shared/styles/host.styles';\nimport rawStyles from './spinner.css?inline';\n\nconst styles = unsafeCSS(rawStyles);\n\n/**\n * @summary A spinner component for indicating loading state.\n * @customElement l-spinner\n *\n * @csspart base - The SVG container element.\n *\n * @cssproperty --size - The size of the spinner (width and height). Defaults to `1em`.\n * @cssproperty --indicator-color - The color of the spinner.\n * @cssproperty --speed - The duration of one full spin cycle.\n */\nexport class Spinner extends LuxenElement {\n static override styles = [hostStyles, styles];\n\n override render() {\n return html`\n <svg\n part=\"base\"\n role=\"progressbar\"\n aria-label=\"Loading\"\n viewBox=\"0 0 24 24\"\n >\n <path\n d=\"M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z\"\n opacity=\".25\"\n />\n <path\n d=\"M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z\"\n class=\"spinner\"\n />\n </svg>\n `;\n }\n}\n"],"mappings":"8JCKA,IAAM,EAAS,EAAU,oUAAU,CAYtB,EAAb,cAA6B,CAAa,oBACf,CAAC,EAAY,EAAO,CAE7C,QAAkB,CAChB,MAAO,EAAI"}
@@ -0,0 +1,8 @@
1
+ import { StickyBar } from './sticky-bar';
2
+ export * from './sticky-bar';
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ 'l-sticky-bar': StickyBar;
6
+ }
7
+ }
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/html/elements/sticky-bar/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,cAAc,cAAc,CAAC;AAG7B,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,cAAc,EAAE,SAAS,CAAC;KAC3B;CACF"}
@@ -0,0 +1,2 @@
1
+ import{define as e}from"../../define.js";import{StickyBar as t}from"./sticky-bar.js";e(`sticky-bar`,t);
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/html/elements/sticky-bar/index.ts"],"sourcesContent":["import { define } from '../../define';\nimport { StickyBar } from './sticky-bar';\nexport * from './sticky-bar';\ndefine('sticky-bar', StickyBar);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'l-sticky-bar': StickyBar;\n }\n}\n"],"mappings":"qFAGA,EAAO,aAAc,EAAU"}
@@ -0,0 +1,46 @@
1
+ import { PropertyValues } from 'lit';
2
+ import { LuxenElement } from '../../shared/luxen-element';
3
+ /**
4
+ * @summary A bar docked to the viewport edge, revealed in the top layer when a referenced element scrolls out of view.
5
+ * @customElement l-sticky-bar
6
+ *
7
+ * Uses the native `popover="manual"` attribute, so the bar paints in the
8
+ * document's top layer. Pass `for="<id>"` to track an element; the bar
9
+ * reveals when that element leaves the viewport (e.g. an Add-to-cart
10
+ * button on a mobile product page). Omit `for` for a bar that stays
11
+ * visible permanently (cookie banners, promo notices, environment
12
+ * indicators).
13
+ *
14
+ * @slot - Bar content. Owns its own background, padding, and typography.
15
+ *
16
+ * @cssproperty --show-duration - Reveal animation duration. Default `200ms`.
17
+ * @cssproperty --hide-duration - Dismiss animation duration. Default `200ms`.
18
+ * @cssproperty --offset - Distance from the active edge. Default `0px`. Use to clear a sticky header when `placement="top"`.
19
+ *
20
+ * @event show - Fired before the bar reveals. Cancelable.
21
+ * @event after-show - Fired after the reveal animation completes.
22
+ * @event hide - Fired before the bar hides. Cancelable.
23
+ * @event after-hide - Fired after the hide animation completes.
24
+ */
25
+ export declare class StickyBar extends LuxenElement {
26
+ static styles: import('lit').CSSResult[];
27
+ /** HTML id of the element to track. When that element leaves the viewport, the bar reveals. Omit for a permanently visible bar. */
28
+ accessor for: string;
29
+ /** HTML id of the scrolling ancestor used as the IntersectionObserver root. Omit to use the viewport. Useful for nested scroll containers (CMS preview panes, modals). */
30
+ accessor root: string;
31
+ /** Edge to dock against. */
32
+ accessor placement: 'bottom' | 'top';
33
+ private _io?;
34
+ private _observed?;
35
+ connectedCallback(): void;
36
+ disconnectedCallback(): void;
37
+ updated(changed: PropertyValues<this>): void;
38
+ private get _target();
39
+ private _show;
40
+ private _hide;
41
+ private _onToggle;
42
+ private _setupObserver;
43
+ private _teardownObserver;
44
+ render(): import('lit').TemplateResult<1>;
45
+ }
46
+ //# sourceMappingURL=sticky-bar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sticky-bar.d.ts","sourceRoot":"","sources":["../../../src/html/elements/sticky-bar/sticky-bar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAO1D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,SAAU,SAAQ,YAAY;IACzC,OAAgB,MAAM,4BAAwB;IAE9C,mIAAmI;IAEnI,QAAQ,CAAC,GAAG,SAAM;IAElB,0KAA0K;IAE1K,QAAQ,CAAC,IAAI,SAAM;IAEnB,4BAA4B;IAE5B,QAAQ,CAAC,SAAS,EAAE,QAAQ,GAAG,KAAK,CAAY;IAEhD,OAAO,CAAC,GAAG,CAAC,CAAuB;IACnC,OAAO,CAAC,SAAS,CAAC,CAAU;IAEnB,iBAAiB;IAMjB,oBAAoB;IAMpB,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC;IAY9C,OAAO,KAAK,OAAO,GAElB;IAED,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,SAAS,CAGf;IAEF,OAAO,CAAC,cAAc;IAqBtB,OAAO,CAAC,iBAAiB;IAShB,MAAM;CAGhB"}
@@ -0,0 +1,2 @@
1
+ import{c as e,i as t}from"../../chunks/lit.js";import{LuxenElement as n}from"../../shared/luxen-element.js";import{i as r,t as i}from"../../chunks/decorate.js";import a from"../../shared/styles/host.styles.js";var o=e(`:host{--show-duration:.2s;--hide-duration:.2s;--offset:0px;inset:auto;opacity:0;width:100%;transition:opacity var(--hide-duration) ease, translate var(--hide-duration) ease, display var(--hide-duration) allow-discrete, overlay var(--hide-duration) allow-discrete;background:0 0;border:0;margin:0;padding:0;display:block;position:fixed;inset-inline:0}:host([placement=bottom]){bottom:var(--offset);translate:0 100%}:host([placement=top]){top:var(--offset);translate:0 -100%}:host(:popover-open){opacity:1;transition-duration:var(--show-duration);translate:0}@starting-style{:host([placement=bottom]:popover-open){opacity:0;translate:0 100%}:host([placement=top]:popover-open){opacity:0;translate:0 -100%}}@media (prefers-reduced-motion:reduce){:host{--show-duration:0s;--hide-duration:0s}}`),s=class extends n{constructor(...e){super(...e),this.#e=``,this.#t=``,this.#n=`bottom`,this._onToggle=e=>{let t=e;this.emit(t.newState===`open`?`after-show`:`after-hide`)}}static{this.styles=[a,o]}#e;get for(){return this.#e}set for(e){this.#e=e}#t;get root(){return this.#t}set root(e){this.#t=e}#n;get placement(){return this.#n}set placement(e){this.#n=e}connectedCallback(){super.connectedCallback(),this.popover=`manual`,this.addEventListener(`toggle`,this._onToggle)}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener(`toggle`,this._onToggle),this._teardownObserver()}updated(e){(e.has(`for`)||e.has(`root`))&&(this._teardownObserver(),this.for?this._setupObserver():this._show())}get _target(){return this.for?this.getRootNode().getElementById(this.for):null}_show(){this.matches(`:popover-open`)||this.emit(`show`,{cancelable:!0})&&this.showPopover()}_hide(){this.matches(`:popover-open`)&&this.emit(`hide`,{cancelable:!0})&&this.hidePopover()}_setupObserver(){let e=this._target;if(!e)return;this._observed=e;let t=this.root?this.getRootNode().getElementById(this.root):null,n=this.ownerDocument.defaultView??window;this._io=new n.IntersectionObserver(e=>{for(let t of e)t.isIntersecting?this._hide():this._show()},{root:t,threshold:0}),this._io.observe(e)}_teardownObserver(){this._io&&this._observed&&this._io.unobserve(this._observed),this._io?.disconnect(),this._io=void 0,this._observed=void 0}render(){return t`<slot></slot>`}};i([r()],s.prototype,`for`,null),i([r()],s.prototype,`root`,null),i([r({reflect:!0})],s.prototype,`placement`,null);export{s as StickyBar};
2
+ //# sourceMappingURL=sticky-bar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sticky-bar.js","names":[],"sources":["../../../src/html/elements/sticky-bar/sticky-bar.css?inline","../../../src/html/elements/sticky-bar/sticky-bar.ts"],"sourcesContent":[":host {\n --show-duration: 200ms;\n --hide-duration: 200ms;\n --offset: 0px;\n\n /* Override popover UA defaults. */\n position: fixed;\n inset: auto;\n inset-inline: 0;\n width: 100%;\n margin: 0;\n border: 0;\n padding: 0;\n background: transparent;\n display: block;\n opacity: 0;\n transition:\n opacity var(--hide-duration) ease,\n translate var(--hide-duration) ease,\n display var(--hide-duration) allow-discrete,\n overlay var(--hide-duration) allow-discrete;\n}\n\n:host([placement='bottom']) {\n bottom: var(--offset);\n translate: 0 100%;\n}\n\n:host([placement='top']) {\n top: var(--offset);\n translate: 0 -100%;\n}\n\n:host(:popover-open) {\n opacity: 1;\n translate: 0 0;\n transition-duration: var(--show-duration);\n}\n\n@starting-style {\n :host([placement='bottom']:popover-open) {\n opacity: 0;\n translate: 0 100%;\n }\n :host([placement='top']:popover-open) {\n opacity: 0;\n translate: 0 -100%;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n :host {\n --show-duration: 0ms;\n --hide-duration: 0ms;\n }\n}\n","import { html, unsafeCSS, type PropertyValues } from 'lit';\nimport { LuxenElement } from '../../shared/luxen-element';\nimport { property } from 'lit/decorators.js';\nimport hostStyles from '../../shared/styles/host.styles';\nimport rawStyles from './sticky-bar.css?inline';\n\nconst styles = unsafeCSS(rawStyles);\n\n/**\n * @summary A bar docked to the viewport edge, revealed in the top layer when a referenced element scrolls out of view.\n * @customElement l-sticky-bar\n *\n * Uses the native `popover=\"manual\"` attribute, so the bar paints in the\n * document's top layer. Pass `for=\"<id>\"` to track an element; the bar\n * reveals when that element leaves the viewport (e.g. an Add-to-cart\n * button on a mobile product page). Omit `for` for a bar that stays\n * visible permanently (cookie banners, promo notices, environment\n * indicators).\n *\n * @slot - Bar content. Owns its own background, padding, and typography.\n *\n * @cssproperty --show-duration - Reveal animation duration. Default `200ms`.\n * @cssproperty --hide-duration - Dismiss animation duration. Default `200ms`.\n * @cssproperty --offset - Distance from the active edge. Default `0px`. Use to clear a sticky header when `placement=\"top\"`.\n *\n * @event show - Fired before the bar reveals. Cancelable.\n * @event after-show - Fired after the reveal animation completes.\n * @event hide - Fired before the bar hides. Cancelable.\n * @event after-hide - Fired after the hide animation completes.\n */\nexport class StickyBar extends LuxenElement {\n static override styles = [hostStyles, styles];\n\n /** HTML id of the element to track. When that element leaves the viewport, the bar reveals. Omit for a permanently visible bar. */\n @property()\n accessor for = '';\n\n /** HTML id of the scrolling ancestor used as the IntersectionObserver root. Omit to use the viewport. Useful for nested scroll containers (CMS preview panes, modals). */\n @property()\n accessor root = '';\n\n /** Edge to dock against. */\n @property({ reflect: true })\n accessor placement: 'bottom' | 'top' = 'bottom';\n\n private _io?: IntersectionObserver;\n private _observed?: Element;\n\n override connectedCallback() {\n super.connectedCallback();\n this.popover = 'manual';\n this.addEventListener('toggle', this._onToggle);\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener('toggle', this._onToggle);\n this._teardownObserver();\n }\n\n override updated(changed: PropertyValues<this>) {\n if (changed.has('for') || changed.has('root')) {\n this._teardownObserver();\n if (this.for) {\n this._setupObserver();\n } else {\n // No target → permanent bar. Reveal once on mount.\n this._show();\n }\n }\n }\n\n private get _target(): HTMLElement | null {\n return this.for ? (this.getRootNode() as Document | ShadowRoot).getElementById(this.for) : null;\n }\n\n private _show() {\n if (this.matches(':popover-open')) return;\n if (this.emit('show', { cancelable: true })) this.showPopover();\n }\n\n private _hide() {\n if (!this.matches(':popover-open')) return;\n if (this.emit('hide', { cancelable: true })) this.hidePopover();\n }\n\n private _onToggle = (e: Event) => {\n const ev = e as ToggleEvent;\n this.emit(ev.newState === 'open' ? 'after-show' : 'after-hide');\n };\n\n private _setupObserver() {\n const target = this._target;\n if (!target) return;\n this._observed = target;\n const root = this.root\n ? (this.getRootNode() as Document | ShadowRoot).getElementById(this.root)\n : null;\n // Use the element's own realm so an iframe-hosted bar observes the iframe's viewport.\n const view = this.ownerDocument.defaultView ?? window;\n this._io = new view.IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) this._hide();\n else this._show();\n }\n },\n { root, threshold: 0 },\n );\n this._io.observe(target);\n }\n\n private _teardownObserver() {\n if (this._io && this._observed) {\n this._io.unobserve(this._observed);\n }\n this._io?.disconnect();\n this._io = undefined;\n this._observed = undefined;\n }\n\n override render() {\n return html`<slot></slot>`;\n }\n}\n"],"mappings":"kNCMA,IAAM,EAAS,EAAU,uxBAAU,CAwBtB,EAAb,cAA+B,CAAa,uCAK3B,WAIC,WAIuB,wBA2ClB,GAAa,CAChC,IAAM,EAAK,EACX,KAAK,KAAK,EAAG,WAAa,OAAS,aAAe,aAAa,qBAzDxC,CAAC,EAAY,EAAO,QAIpC,KAAA,4CAIA,MAAA,6CAIA,WAAA,2CAKT,mBAA6B,CAC3B,MAAM,mBAAmB,CACzB,KAAK,QAAU,SACf,KAAK,iBAAiB,SAAU,KAAK,UAAU,CAGjD,sBAAgC,CAC9B,MAAM,sBAAsB,CAC5B,KAAK,oBAAoB,SAAU,KAAK,UAAU,CAClD,KAAK,mBAAmB,CAG1B,QAAiB,EAA+B,EAC1C,EAAQ,IAAI,MAAM,EAAI,EAAQ,IAAI,OAAO,IAC3C,KAAK,mBAAmB,CACpB,KAAK,IACP,KAAK,gBAAgB,CAGrB,KAAK,OAAO,EAKlB,IAAY,SAA8B,CACxC,OAAO,KAAK,IAAO,KAAK,aAAa,CAA2B,eAAe,KAAK,IAAI,CAAG,KAG7F,OAAgB,CACV,KAAK,QAAQ,gBAAgB,EAC7B,KAAK,KAAK,OAAQ,CAAE,WAAY,GAAM,CAAC,EAAE,KAAK,aAAa,CAGjE,OAAgB,CACT,KAAK,QAAQ,gBAAgB,EAC9B,KAAK,KAAK,OAAQ,CAAE,WAAY,GAAM,CAAC,EAAE,KAAK,aAAa,CAQjE,gBAAyB,CACvB,IAAM,EAAS,KAAK,QACpB,GAAI,CAAC,EAAQ,OACb,KAAK,UAAY,EACjB,IAAM,EAAO,KAAK,KACb,KAAK,aAAa,CAA2B,eAAe,KAAK,KAAK,CACvE,KAEE,EAAO,KAAK,cAAc,aAAe,OAC/C,KAAK,IAAM,IAAI,EAAK,qBACjB,GAAY,CACX,IAAK,IAAM,KAAS,EACd,EAAM,eAAgB,KAAK,OAAO,CACjC,KAAK,OAAO,EAGrB,CAAE,OAAM,UAAW,EAAG,CACvB,CACD,KAAK,IAAI,QAAQ,EAAO,CAG1B,mBAA4B,CACtB,KAAK,KAAO,KAAK,WACnB,KAAK,IAAI,UAAU,KAAK,UAAU,CAEpC,KAAK,KAAK,YAAY,CACtB,KAAK,IAAM,IAAA,GACX,KAAK,UAAY,IAAA,GAGnB,QAAkB,CAChB,MAAO,EAAI,qBAxFZ,GAAU,CAAA,CAAA,EAAA,UAAA,MAAA,KAAA,IAIV,GAAU,CAAA,CAAA,EAAA,UAAA,OAAA,KAAA,IAIV,EAAS,CAAE,QAAS,GAAM,CAAC,CAAA,CAAA,EAAA,UAAA,YAAA,KAAA"}
@@ -0,0 +1,8 @@
1
+ import { LuxenStories } from './stories';
2
+ export * from './stories';
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ 'l-stories': LuxenStories;
6
+ }
7
+ }
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/html/elements/stories/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,cAAc,WAAW,CAAC;AAG1B,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,WAAW,EAAE,YAAY,CAAC;KAC3B;CACF"}
@@ -0,0 +1,2 @@
1
+ import{define as e}from"../../define.js";import{LuxenStories as t}from"./stories.js";e(`stories`,t);
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/html/elements/stories/index.ts"],"sourcesContent":["import { define } from '../../define';\nimport { LuxenStories } from './stories';\nexport * from './stories';\ndefine('stories', LuxenStories);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'l-stories': LuxenStories;\n }\n}\n"],"mappings":"qFAGA,EAAO,UAAW,EAAa"}
@@ -0,0 +1,50 @@
1
+ import { LuxenElement } from '../../shared/luxen-element';
2
+ import { LuxenStory } from '../story/story';
3
+ export type StoriesAppearance = 'rounded' | 'squared' | 'portrait' | 'landscape';
4
+ /**
5
+ * @summary A horizontal row of `<l-story>` thumbnails. Click opens the linked
6
+ * `<l-stories-viewer>` (matched by `for` → `id`). If `for` is omitted and no
7
+ * viewer exists, a singleton viewer is appended to `<body>` on first click.
8
+ *
9
+ * @example
10
+ * ```html
11
+ * <l-stories for="brand">
12
+ * <l-story src="…video.mp4" poster="…jpg" label="Notre concept"></l-story>
13
+ * <l-story src="…video2.mp4" label="Collant Essentiel"></l-story>
14
+ * </l-stories>
15
+ * <l-stories-viewer id="brand"></l-stories-viewer>
16
+ * ```
17
+ *
18
+ * @event story-open - Fired when the viewer opens. Detail: `{ index: number, story: LuxenStory }`.
19
+ *
20
+ * @cssproperty --size - Thumbnail size (width). Default per appearance.
21
+ * @cssproperty --radius - Thumbnail border radius. Default per appearance (`--radius-full` for rounded, `1rem` for portrait).
22
+ * @cssproperty --gap - Gap between thumbnails. Default `1rem`.
23
+ * @cssproperty --ring-color - Ring color around fresh thumbnails.
24
+ * @cssproperty --ring-color-seen - Ring color for `[seen]` thumbnails.
25
+ * @cssproperty --ring-width - Ring width. Default `2px`.
26
+ * @cssproperty --label-color - Label text color.
27
+ *
28
+ * @customElement l-stories
29
+ */
30
+ export declare class LuxenStories extends LuxenElement {
31
+ createRenderRoot(): this;
32
+ /** ID of the linked `<l-stories-viewer>`. */
33
+ for: string;
34
+ /** Visual appearance of the thumbnails. */
35
+ appearance: StoriesAppearance;
36
+ connectedCallback(): void;
37
+ disconnectedCallback(): void;
38
+ /** Open the linked viewer at the given index. */
39
+ open(index?: number): void;
40
+ /** All `<l-story>` children. */
41
+ stories(): LuxenStory[];
42
+ private _onClick;
43
+ private _resolveViewer;
44
+ }
45
+ declare global {
46
+ interface HTMLElementTagNameMap {
47
+ 'l-stories': LuxenStories;
48
+ }
49
+ }
50
+ //# sourceMappingURL=stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stories.d.ts","sourceRoot":"","sources":["../../../src/html/elements/stories/stories.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;AAEjF;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAAa,YAAa,SAAQ,YAAY;IACnC,gBAAgB;IAIzB,6CAA6C;IAE7C,GAAG,SAAM;IAET,2CAA2C;IAE3C,UAAU,EAAE,iBAAiB,CAAa;IAEjC,iBAAiB;IAQjB,oBAAoB;IAK7B,iDAAiD;IACjD,IAAI,CAAC,KAAK,SAAI;IAYd,gCAAgC;IAChC,OAAO,IAAI,UAAU,EAAE;IAIvB,OAAO,CAAC,QAAQ,CASd;IAEF,OAAO,CAAC,cAAc;CAevB;AAaD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,WAAW,EAAE,YAAY,CAAC;KAC3B;CACF"}
@@ -0,0 +1,2 @@
1
+ import{LuxenElement as e}from"../../shared/luxen-element.js";import{i as t,t as n}from"../../chunks/decorate.js";var r=class extends e{constructor(...e){super(...e),this.for=``,this.appearance=`rounded`,this._onClick=e=>{let t=e.target.closest(`[data-story-trigger]`);if(!t)return;let n=t.closest(`l-story`);if(!n)return;let r=this.stories().indexOf(n);r<0||(e.preventDefault(),this.open(r))}}createRenderRoot(){return this}connectedCallback(){super.connectedCallback(),this.hasAttribute(`role`)||this.setAttribute(`role`,`list`),this.addEventListener(`click`,this._onClick)}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener(`click`,this._onClick)}open(e=0){let t=this.stories();if(!t.length)return;let n=this._resolveViewer();n&&(n.stories=t,n.source=this,n.index=Math.max(0,Math.min(e,t.length-1)),n.open=!0,this.emit(`story-open`,{detail:{index:e,story:t[e]}}))}stories(){return Array.from(this.querySelectorAll(`:scope > l-story`))}_resolveViewer(){if(this.for){let e=this.getRootNode().getElementById?.(this.for);if(e&&i(e))return e}let e=document.querySelector(`l-stories-viewer[data-auto]`);return e||(e=document.createElement(`l-stories-viewer`),e.setAttribute(`data-auto`,``),document.body.appendChild(e)),e}};n([t({reflect:!0})],r.prototype,`for`,void 0),n([t({reflect:!0})],r.prototype,`appearance`,void 0);function i(e){return e.tagName===`L-STORIES-VIEWER`}export{r as LuxenStories};
2
+ //# sourceMappingURL=stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stories.js","names":[],"sources":["../../../src/html/elements/stories/stories.ts"],"sourcesContent":["import { property } from 'lit/decorators.js';\nimport { LuxenElement } from '../../shared/luxen-element';\nimport type { LuxenStory } from '../story/story';\n\nexport type StoriesAppearance = 'rounded' | 'squared' | 'portrait' | 'landscape';\n\n/**\n * @summary A horizontal row of `<l-story>` thumbnails. Click opens the linked\n * `<l-stories-viewer>` (matched by `for` → `id`). If `for` is omitted and no\n * viewer exists, a singleton viewer is appended to `<body>` on first click.\n *\n * @example\n * ```html\n * <l-stories for=\"brand\">\n * <l-story src=\"…video.mp4\" poster=\"…jpg\" label=\"Notre concept\"></l-story>\n * <l-story src=\"…video2.mp4\" label=\"Collant Essentiel\"></l-story>\n * </l-stories>\n * <l-stories-viewer id=\"brand\"></l-stories-viewer>\n * ```\n *\n * @event story-open - Fired when the viewer opens. Detail: `{ index: number, story: LuxenStory }`.\n *\n * @cssproperty --size - Thumbnail size (width). Default per appearance.\n * @cssproperty --radius - Thumbnail border radius. Default per appearance (`--radius-full` for rounded, `1rem` for portrait).\n * @cssproperty --gap - Gap between thumbnails. Default `1rem`.\n * @cssproperty --ring-color - Ring color around fresh thumbnails.\n * @cssproperty --ring-color-seen - Ring color for `[seen]` thumbnails.\n * @cssproperty --ring-width - Ring width. Default `2px`.\n * @cssproperty --label-color - Label text color.\n *\n * @customElement l-stories\n */\nexport class LuxenStories extends LuxenElement {\n override createRenderRoot() {\n return this;\n }\n\n /** ID of the linked `<l-stories-viewer>`. */\n @property({ reflect: true })\n for = '';\n\n /** Visual appearance of the thumbnails. */\n @property({ reflect: true })\n appearance: StoriesAppearance = 'rounded';\n\n override connectedCallback() {\n super.connectedCallback();\n if (!this.hasAttribute('role')) {\n this.setAttribute('role', 'list');\n }\n this.addEventListener('click', this._onClick);\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener('click', this._onClick);\n }\n\n /** Open the linked viewer at the given index. */\n open(index = 0) {\n const stories = this.stories();\n if (!stories.length) return;\n const viewer = this._resolveViewer();\n if (!viewer) return;\n viewer.stories = stories;\n viewer.source = this;\n viewer.index = Math.max(0, Math.min(index, stories.length - 1));\n viewer.open = true;\n this.emit('story-open', { detail: { index, story: stories[index] } });\n }\n\n /** All `<l-story>` children. */\n stories(): LuxenStory[] {\n return Array.from(this.querySelectorAll<LuxenStory>(':scope > l-story'));\n }\n\n private _onClick = (e: MouseEvent) => {\n const trigger = (e.target as HTMLElement).closest<HTMLButtonElement>('[data-story-trigger]');\n if (!trigger) return;\n const story = trigger.closest<LuxenStory>('l-story');\n if (!story) return;\n const index = this.stories().indexOf(story);\n if (index < 0) return;\n e.preventDefault();\n this.open(index);\n };\n\n private _resolveViewer(): LuxenStoriesViewerLike | null {\n if (this.for) {\n const root = this.getRootNode() as Document | ShadowRoot;\n const el = (root as Document).getElementById?.(this.for);\n if (el && _isViewer(el)) return el;\n }\n // Auto-singleton fallback.\n let auto = document.querySelector<LuxenStoriesViewerLike>('l-stories-viewer[data-auto]');\n if (!auto) {\n auto = document.createElement('l-stories-viewer') as LuxenStoriesViewerLike;\n auto.setAttribute('data-auto', '');\n document.body.appendChild(auto);\n }\n return auto;\n }\n}\n\ninterface LuxenStoriesViewerLike extends HTMLElement {\n open: boolean;\n index: number;\n stories: LuxenStory[];\n source: LuxenStories | null;\n}\n\nfunction _isViewer(el: Element): el is LuxenStoriesViewerLike {\n return el.tagName === 'L-STORIES-VIEWER';\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'l-stories': LuxenStories;\n }\n}\n"],"mappings":"iHAgCA,IAAa,EAAb,cAAkC,CAAa,wCAOvC,mBAI0B,wBAiCZ,GAAkB,CACpC,IAAM,EAAW,EAAE,OAAuB,QAA2B,uBAAuB,CAC5F,GAAI,CAAC,EAAS,OACd,IAAM,EAAQ,EAAQ,QAAoB,UAAU,CACpD,GAAI,CAAC,EAAO,OACZ,IAAM,EAAQ,KAAK,SAAS,CAAC,QAAQ,EAAM,CACvC,EAAQ,IACZ,EAAE,gBAAgB,CAClB,KAAK,KAAK,EAAM,GAnDlB,kBAA4B,CAC1B,OAAO,KAWT,mBAA6B,CAC3B,MAAM,mBAAmB,CACpB,KAAK,aAAa,OAAO,EAC5B,KAAK,aAAa,OAAQ,OAAO,CAEnC,KAAK,iBAAiB,QAAS,KAAK,SAAS,CAG/C,sBAAgC,CAC9B,MAAM,sBAAsB,CAC5B,KAAK,oBAAoB,QAAS,KAAK,SAAS,CAIlD,KAAK,EAAQ,EAAG,CACd,IAAM,EAAU,KAAK,SAAS,CAC9B,GAAI,CAAC,EAAQ,OAAQ,OACrB,IAAM,EAAS,KAAK,gBAAgB,CAC/B,IACL,EAAO,QAAU,EACjB,EAAO,OAAS,KAChB,EAAO,MAAQ,KAAK,IAAI,EAAG,KAAK,IAAI,EAAO,EAAQ,OAAS,EAAE,CAAC,CAC/D,EAAO,KAAO,GACd,KAAK,KAAK,aAAc,CAAE,OAAQ,CAAE,QAAO,MAAO,EAAQ,GAAQ,CAAE,CAAC,EAIvE,SAAwB,CACtB,OAAO,MAAM,KAAK,KAAK,iBAA6B,mBAAmB,CAAC,CAc1E,gBAAwD,CACtD,GAAI,KAAK,IAAK,CAEZ,IAAM,EADO,KAAK,aACN,CAAkB,iBAAiB,KAAK,IAAI,CACxD,GAAI,GAAM,EAAU,EAAG,CAAE,OAAO,EAGlC,IAAI,EAAO,SAAS,cAAsC,8BAA8B,CAMxF,OALK,IACH,EAAO,SAAS,cAAc,mBAAmB,CACjD,EAAK,aAAa,YAAa,GAAG,CAClC,SAAS,KAAK,YAAY,EAAK,EAE1B,OA9DR,EAAS,CAAE,QAAS,GAAM,CAAC,CAAA,CAAA,EAAA,UAAA,MAAA,IAAA,GAAA,IAI3B,EAAS,CAAE,QAAS,GAAM,CAAC,CAAA,CAAA,EAAA,UAAA,aAAA,IAAA,GAAA,CAqE9B,SAAS,EAAU,EAA2C,CAC5D,OAAO,EAAG,UAAY"}
@@ -0,0 +1,8 @@
1
+ import { LuxenStoriesViewer } from './stories-viewer';
2
+ export * from './stories-viewer';
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ 'l-stories-viewer': LuxenStoriesViewer;
6
+ }
7
+ }
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/html/elements/stories-viewer/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,cAAc,kBAAkB,CAAC;AAGjC,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,kBAAkB,EAAE,kBAAkB,CAAC;KACxC;CACF"}
@@ -0,0 +1,2 @@
1
+ import{define as e}from"../../define.js";import{LuxenStoriesViewer as t}from"./stories-viewer.js";e(`stories-viewer`,t);
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/html/elements/stories-viewer/index.ts"],"sourcesContent":["import { define } from '../../define';\nimport { LuxenStoriesViewer } from './stories-viewer';\nexport * from './stories-viewer';\ndefine('stories-viewer', LuxenStoriesViewer);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'l-stories-viewer': LuxenStoriesViewer;\n }\n}\n"],"mappings":"kGAGA,EAAO,iBAAkB,EAAmB"}
@@ -0,0 +1,136 @@
1
+ import { CSSResultGroup, PropertyValues } from 'lit';
2
+ import { LuxenElement } from '../../shared/luxen-element';
3
+ import { LuxenStories } from '../stories/stories';
4
+ import { LuxenStory } from '../story/story';
5
+ /**
6
+ * @summary Fullscreen modal that plays a sequence of `<l-story>` videos with an
7
+ * Instagram-style segmented progress bar, previous/next navigation, mute toggle,
8
+ * and auto-advance.
9
+ *
10
+ * Linked to one or more `<l-stories>` rows via matching `id` ↔ `for`. Open
11
+ * programmatically via `open()` or by clicking a thumbnail in a linked row.
12
+ *
13
+ * @slot cta - Default CTA overlay (e.g. shoppable card). Per-story `slot="cta"` inside `<l-story>` overrides this when that story is active.
14
+ * @slot header - Default header overlay (e.g. avatar + author). Per-story override available the same way.
15
+ * @slot close - Override the default close button.
16
+ *
17
+ * @csspart dialog - The native `<dialog>` element.
18
+ * @csspart frame - The aspect-ratio video frame.
19
+ * @csspart progress - The progress bar wrapper.
20
+ * @csspart progress-segment - A single progress segment.
21
+ * @csspart progress-fill - The fill element inside an active segment.
22
+ * @csspart video - The `<video>` element.
23
+ * @csspart overlay - The overlay wrapper that hosts CTA/header slots.
24
+ * @csspart header - The top-left header area (story thumbnail + label fallback, or consumer-supplied content via the `header` slot).
25
+ * @csspart header-label - The default story label inside the header.
26
+ * @csspart actions - The top-right vertical button stack (close, play/pause, mute).
27
+ * @csspart button-close - The close button.
28
+ * @csspart button-pause - The play/pause toggle.
29
+ * @csspart button-mute - The mute toggle.
30
+ * @csspart button-previous - The previous story button.
31
+ * @csspart button-next - The next story button.
32
+ * @csspart spinner - The loading spinner shown while the current video is buffering.
33
+ *
34
+ * @cssproperty --width - Frame width. Default `min(420px, 100vw)`.
35
+ * @cssproperty --progress-color - Active progress fill color. Default `white`.
36
+ * @cssproperty --progress-bg - Inactive progress segment background. Default `rgb(255 255 255 / 35%)`.
37
+ * @cssproperty --progress-gap - Gap between segments. Default `4px`.
38
+ * @cssproperty --show-duration - Open transition duration. Default `200ms`.
39
+ * @cssproperty --hide-duration - Close transition duration. Default `200ms`.
40
+ * @cssproperty --backdrop - Backdrop color. Default `var(--l-backdrop-strong)` — darker than `--l-backdrop` to focus attention on the immersive frame, but still translucent so the page stays perceptible.
41
+ *
42
+ * @event show - Fired when the viewer opens.
43
+ * @event after-show - Fired after the open transition completes.
44
+ * @event hide - Fired when the viewer is about to close. Cancelable.
45
+ * @event after-hide - Fired after the close transition completes.
46
+ * @event story-change - Fired when the active story changes. Detail: `{ index: number, story: LuxenStory }`.
47
+ * @event story-end - Fired when the active story finishes playback. Detail: `{ index: number }`.
48
+ * @event chapter-change - Fired when the active chapter (within a story) changes. Detail: `{ chapter: number, story: LuxenStory }`.
49
+ * @event mute-change - Fired when the mute state changes. Detail: `{ muted: boolean }`.
50
+ *
51
+ * @customElement l-stories-viewer
52
+ */
53
+ export declare class LuxenStoriesViewer extends LuxenElement {
54
+ static styles: CSSResultGroup;
55
+ /** Whether the viewer is open. */
56
+ open: boolean;
57
+ /** Active story index (0-based). */
58
+ index: number;
59
+ /** Whether playback is muted. Defaults to `true` so autoplay always succeeds across browsers. The user can unmute via the dedicated button or the `m` keyboard shortcut. */
60
+ muted: boolean;
61
+ /** Loop the active story instead of advancing. */
62
+ loop: boolean;
63
+ /** Move to the next story when the current one ends; close after the last story. */
64
+ autoAdvance: boolean;
65
+ /** Close when the backdrop is clicked. */
66
+ lightDismiss: boolean;
67
+ /** Active chapter index within the current story. Reflected. */
68
+ chapter: number;
69
+ /** Internal: the playlist set by the source `<l-stories>`. */
70
+ stories: LuxenStory[];
71
+ /** Internal: the source `<l-stories>` element that opened the viewer. */
72
+ source: LuxenStories | null;
73
+ private _dialog;
74
+ private _video;
75
+ /** Tracks the underlying `<video>` paused state so the play/pause button stays in sync. */
76
+ private _paused;
77
+ /** True while the video is buffering / waiting for data. Drives the loading spinner. */
78
+ private _loading;
79
+ private _raf;
80
+ private _holdTimer;
81
+ private _pointerStart;
82
+ private _segments;
83
+ private _chapterStarts;
84
+ /** Tracks the URL we've already injected a prefetch hint for so we don't duplicate. */
85
+ private _prefetchedSrc;
86
+ connectedCallback(): void;
87
+ disconnectedCallback(): void;
88
+ firstUpdated(): void;
89
+ updated(changed: PropertyValues<this>): void;
90
+ private _onCancel;
91
+ private _onNativeClose;
92
+ private _onDialogClick;
93
+ private _onKeyDown;
94
+ private _onFramePointerDown;
95
+ private _onFramePointerUp;
96
+ private _refreshSegmentRefs;
97
+ private _resetSegmentFills;
98
+ private _loadCurrent;
99
+ /**
100
+ * Inject a `<link rel="preload" as="video">` for the next story once the
101
+ * current video crosses 50% playback. Idempotent: tracked by `_prefetchedSrc`,
102
+ * cleaned up on viewer close.
103
+ */
104
+ private _maybePrefetchNext;
105
+ /** Remove every prefetch hint we've injected. Called when the viewer closes. */
106
+ private _clearPrefetchHints;
107
+ private _applyChapterSeek;
108
+ private get _lastChapter();
109
+ private _syncSlots;
110
+ private _tick;
111
+ private _onEnded;
112
+ /** chapter-then-story navigation. */
113
+ private _advance;
114
+ /** Open the viewer at the given index with an explicit playlist. */
115
+ openAt(stories: LuxenStory[], index?: number, source?: LuxenStories | null): void;
116
+ close(): void;
117
+ /** Advance one chapter, or to the next story at the chapter boundary. */
118
+ next(): void;
119
+ /** Retreat one chapter, restart the current chapter past 1s in, or cross into the previous story. */
120
+ previous(): void;
121
+ /** Jump to the next story, skipping any remaining chapters in the current story. */
122
+ nextStory(): void;
123
+ /** Jump to the previous story regardless of current chapter. Lands on chapter 0 of the previous story. */
124
+ previousStory(): void;
125
+ play(): void;
126
+ pause(): void;
127
+ private _emitAfter;
128
+ private _restoreFocus;
129
+ render(): import('lit').TemplateResult<1>;
130
+ }
131
+ declare global {
132
+ interface HTMLElementTagNameMap {
133
+ 'l-stories-viewer': LuxenStoriesViewer;
134
+ }
135
+ }
136
+ //# sourceMappingURL=stories-viewer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stories-viewer.d.ts","sourceRoot":"","sources":["../../../src/html/elements/stories-viewer/stories-viewer.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAGzF,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAejD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,OAAgB,MAAM,EAAE,cAAc,CAAwB;IAE9D,kCAAkC;IAElC,IAAI,UAAS;IAEb,oCAAoC;IAEpC,KAAK,SAAK;IAEV,4KAA4K;IAE5K,KAAK,UAAQ;IAEb,kDAAkD;IAElD,IAAI,UAAS;IAEb,oFAAoF;IAEpF,WAAW,UAAQ;IAEnB,0CAA0C;IAE1C,YAAY,UAAQ;IAEpB,gEAAgE;IAEhE,OAAO,SAAK;IAEZ,8DAA8D;IAC9D,OAAO,EAAE,UAAU,EAAE,CAAM;IAE3B,yEAAyE;IACzE,MAAM,EAAE,YAAY,GAAG,IAAI,CAAQ;IAElB,OAAO,CAAC,OAAO,CAAqB;IACrC,OAAO,CAAC,MAAM,CAAoB;IAElD,2FAA2F;IAClF,OAAO,CAAC,OAAO,CAAS;IAEjC,wFAAwF;IAC/E,OAAO,CAAC,QAAQ,CAAS;IAElC,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,aAAa,CAAoD;IACzE,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,cAAc,CAAiB;IACvC,uFAAuF;IACvF,OAAO,CAAC,cAAc,CAAuB;IAIpC,iBAAiB;IAKjB,oBAAoB;IAQpB,YAAY;IAoBZ,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC;IAoC9C,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,cAAc;IAgBtB,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,UAAU,CAuBhB;IAIF,OAAO,CAAC,mBAAmB,CAKzB;IAEF,OAAO,CAAC,iBAAiB,CAkCvB;IAIF,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,YAAY;IA2BpB;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAiB1B,gFAAgF;IAChF,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,iBAAiB;IAQzB,OAAO,KAAK,YAAY,GAEvB;IAMD,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,KAAK,CAiBX;IAEF,OAAO,CAAC,QAAQ;IAkBhB,qCAAqC;IACrC,OAAO,CAAC,QAAQ;IAmChB,oEAAoE;IACpE,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,KAAK,SAAI,EAAE,MAAM,GAAE,YAAY,GAAG,IAAW;IAO3E,KAAK;IAIL,yEAAyE;IACzE,IAAI;IAIJ,qGAAqG;IACrG,QAAQ;IAIR,oFAAoF;IACpF,SAAS;IAQT,0GAA0G;IAC1G,aAAa;IAMb,IAAI;IAKJ,KAAK;YAOS,UAAU;IAWxB,OAAO,CAAC,aAAa;IAOZ,MAAM;CA8LhB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,kBAAkB,EAAE,kBAAkB,CAAC;KACxC;CACF"}
@@ -0,0 +1,160 @@
1
+ import{c as e,i as t,n}from"../../chunks/lit.js";import{LuxenElement as r}from"../../shared/luxen-element.js";import{i,n as a,r as o,t as s}from"../../chunks/decorate.js";import c from"../../shared/styles/host.styles.js";import{t as l}from"../../chunks/map.js";var u=e(`:host{--width:min(420px, 100vw);--aspect-ratio:9 / 16;--progress-color:white;--progress-bg:#ffffff59;--progress-gap:4px;--show-duration:.2s;--hide-duration:.2s;--backdrop:var(--l-backdrop-strong);display:contents}dialog{color:#fff;opacity:0;width:100vw;max-width:none;height:100dvh;max-height:none;transition-property:opacity,display,overlay;transition-duration:var(--hide-duration);transition-behavior:allow-discrete;background:0 0;border:0;place-items:center;margin:0;padding:0;position:fixed;inset:0;overflow:clip}dialog::backdrop{background:var(--backdrop)}dialog[open]{opacity:1;transition-duration:var(--show-duration);display:grid}@starting-style{dialog[open]{opacity:0}}.frame{width:var(--width);max-width:100vw;max-height:100dvh;aspect-ratio:var(--aspect-ratio);isolation:isolate;-webkit-user-select:none;user-select:none;touch-action:pan-y;background:#000;border-radius:.75rem;position:relative;overflow:clip}@media (width<=480px){.frame{aspect-ratio:auto;border-radius:0;width:100vw;height:100dvh}}.video{object-fit:cover;background:#000;width:100%;height:100%;position:absolute;inset:0}.spinner{z-index:1;color:#fff;pointer-events:none;opacity:0;width:2rem;height:2rem;margin:auto;transition:opacity .15s;position:absolute;inset:0}.spinner[data-state=loading]{opacity:1;transition-delay:.2s}@media (prefers-reduced-motion:reduce){.spinner{transition:none}}.progress{z-index:2;gap:var(--progress-gap);pointer-events:none;display:flex;position:absolute;top:.5rem;left:.5rem;right:.5rem}.progress-segment{background:var(--progress-bg);border-radius:999px;flex:1 1 0;height:2.5px;overflow:clip}.progress-fill{background:var(--progress-color);width:100%;height:100%;transform:scaleX(var(--p,0));transform-origin:0;transition:transform 80ms linear;display:block}.progress-segment[data-state=past] .progress-fill{transform:scaleX(1)}@media (prefers-reduced-motion:reduce){.progress-fill{transition:none}:host{--show-duration:0s;--hide-duration:0s}}.header{z-index:2;pointer-events:none;align-items:center;gap:.625rem;min-width:0;display:flex;position:absolute;top:1.25rem;left:.75rem;right:4rem}.header>::slotted(*){pointer-events:auto}.header-thumb{object-fit:cover;pointer-events:auto;border-radius:50%;flex-shrink:0;width:2rem;height:2rem}.header-text{pointer-events:auto;flex-direction:column;min-width:0;display:flex}.header-label{color:#fff;text-overflow:ellipsis;white-space:nowrap;font-size:.875rem;font-weight:600;line-height:1.2;overflow:hidden}.actions{z-index:2;pointer-events:none;flex-direction:column;gap:.75rem;display:flex;position:absolute;top:1.25rem;right:.75rem}.actions>::slotted(*),.actions .btn{pointer-events:auto}.btn{color:#fff;cursor:pointer;background:#00000040;border:0;border-radius:999px;justify-content:center;align-items:center;width:2rem;height:2rem;padding:0;font-size:1rem;transition:background .15s;display:inline-flex;position:relative}.btn:hover{background:#00000073}.btn:focus-visible{outline:2px solid var(--progress-color);outline-offset:2px}.btn:before{content:"";position:absolute;inset:-6px}.btn-nav{z-index:2;width:2.25rem;height:2.25rem;font-size:1.25rem;position:absolute}.btn-nav:before{inset:-4px}.btn-previous,.btn-next{top:50%;transform:translateY(-50%)}@media (width>=768px){.btn-previous{left:calc(50% - var(--width) / 2 - 3rem)}.btn-next{right:calc(50% - var(--width) / 2 - 3rem)}}@media (width<=767px){.btn-previous,.btn-next{display:none}}.tap-zone{z-index:0;position:absolute;top:0;bottom:0}.tap-previous{width:30%;left:0}.tap-next{left:30%;right:0}.overlay{z-index:1;pointer-events:none;padding:1rem;position:absolute;inset:auto 0 0}.overlay>::slotted(*){pointer-events:auto}.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}`),d=Symbol.for(`luxen-stories-viewer-scroll-lock`);if(typeof document<`u`&&!(d in document)){let e=new CSSStyleSheet;e.replaceSync(`html:has(l-stories-viewer[data-modal]) { overflow: hidden; scrollbar-gutter: stable; }`),document.adoptedStyleSheets.push(e),Object.defineProperty(document,d,{value:e})}var f=class extends r{constructor(...e){super(...e),this.open=!1,this.index=0,this.muted=!0,this.loop=!1,this.autoAdvance=!0,this.lightDismiss=!0,this.chapter=0,this.stories=[],this.source=null,this._paused=!1,this._loading=!1,this._raf=0,this._holdTimer=0,this._pointerStart=null,this._segments=[],this._chapterStarts=[0],this._prefetchedSrc=null,this._onKeyDown=e=>{if(this.open)switch(e.key){case`ArrowLeft`:e.preventDefault(),this.previous();break;case`ArrowRight`:e.preventDefault(),this.next();break;case` `:e.preventDefault(),this._video.paused?this.play():this.pause();break;case`m`:case`M`:e.preventDefault(),this.muted=!this.muted,this.emit(`mute-change`,{detail:{muted:this.muted}});break}},this._onFramePointerDown=e=>{e.target.closest(`button, a, [data-no-gesture]`)||(this._pointerStart={x:e.clientX,y:e.clientY,t:performance.now()},this._holdTimer=window.setTimeout(()=>this.pause(),200))},this._onFramePointerUp=e=>{clearTimeout(this._holdTimer);let t=this._pointerStart;if(this._pointerStart=null,!t)return;let n=e.clientX-t.x,r=e.clientY-t.y,i=performance.now()-t.t,a=i<200&&Math.abs(n)<10&&Math.abs(r)<10;if(i>=200&&Math.abs(n)<10&&Math.abs(r)<10){this._video.paused&&this.play();return}if(a){e.target.closest(`[data-tap]`)?.dataset.tap===`previous`?this.previous():this.next();return}Math.abs(n)>Math.abs(r)&&Math.abs(n)>50?n<0?this.nextStory():this.previousStory():r>50&&this.close()},this._tick=()=>{if(!this.open)return;let e=this._video,t=this._segments[this.chapter];if(e&&t){let n=this._chapterStarts[this.chapter]??0,r=this._chapterStarts[this.chapter+1]??e.duration,i=Math.max(0,r-n),a=i?Math.max(0,Math.min((e.currentTime-n)/i,1)):0;t.style.setProperty(`--p`,String(a)),a>=1&&this.chapter<this._lastChapter&&this._advance(1)}this._raf=requestAnimationFrame(this._tick)}}static{this.styles=[c,u]}connectedCallback(){super.connectedCallback(),this.addEventListener(`keydown`,this._onKeyDown)}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener(`keydown`,this._onKeyDown),cancelAnimationFrame(this._raf),clearTimeout(this._holdTimer),this._clearPrefetchHints()}firstUpdated(){this._dialog.addEventListener(`cancel`,e=>this._onCancel(e)),this._dialog.addEventListener(`close`,()=>this._onNativeClose()),this._dialog.addEventListener(`click`,e=>this._onDialogClick(e)),this._video.addEventListener(`ended`,()=>this._onEnded()),this._video.addEventListener(`loadedmetadata`,()=>this._tick()),this._video.addEventListener(`play`,()=>this._paused=!1),this._video.addEventListener(`pause`,()=>this._paused=!0),this._video.addEventListener(`loadstart`,()=>this._loading=!0),this._video.addEventListener(`waiting`,()=>this._loading=!0),this._video.addEventListener(`playing`,()=>this._loading=!1),this._video.addEventListener(`canplay`,()=>this._loading=!1),this._video.addEventListener(`error`,()=>this._loading=!1),this._video.addEventListener(`timeupdate`,()=>this._maybePrefetchNext())}updated(e){if(e.has(`open`)){if(this.open&&!this._dialog.open)this.emit(`show`),this.toggleAttribute(`data-modal`,!0),this._dialog.showModal(),this._loadCurrent(),this._emitAfter(`after-show`);else if(!this.open&&this._dialog.open){if(!this.emit(`hide`,{cancelable:!0})){this.open=!0;return}this._dialog.close()}}if(e.has(`index`)&&this.open){this._loadCurrent();let e=this.stories[this.index];e&&this.emit(`story-change`,{detail:{index:this.index,story:e}})}e.has(`chapter`)&&this.open&&!e.has(`index`)&&this._applyChapterSeek(),e.has(`muted`)&&this._video&&(this._video.muted=this.muted)}_onCancel(e){this.emit(`hide`,{cancelable:!0})||e.preventDefault()}_onNativeClose(){cancelAnimationFrame(this._raf),this._video.pause(),this._video.removeAttribute(`src`),this._video.load(),this._clearPrefetchHints();for(let e=0;e<=this.index&&e<this.stories.length;e++)this.stories[e].seen=!0;this._restoreFocus(),this.open=!1,this.removeAttribute(`data-modal`),this._emitAfter(`after-hide`)}_onDialogClick(e){this.lightDismiss&&e.target===this._dialog&&(this.open=!1)}_refreshSegmentRefs(){this._segments=Array.from(this.shadowRoot.querySelectorAll(`[part~="progress-fill"]`))}_resetSegmentFills(){this._refreshSegmentRefs();for(let e=0;e<this._segments.length;e++){let t=+(e<this.chapter);this._segments[e].style.setProperty(`--p`,String(t))}}_loadCurrent(){let e=this.stories[this.index];e&&(cancelAnimationFrame(this._raf),this._prefetchedSrc=null,this._chapterStarts=e.getChapterStarts(),this.chapter=0,this._syncSlots(e),this._video.muted=this.muted,this._video.loop=this.loop,this._video.src===e.src?this._video.currentTime=0:this._video.src=e.src,requestAnimationFrame(()=>this._resetSegmentFills()),this._video.play().catch(()=>{this.muted=!0,this._video.muted=!0,this._video.play().catch(()=>{})}))}_maybePrefetchNext(){let e=this._video;if(!e.duration||e.currentTime/e.duration<.5)return;let t=this.stories[this.index+1];if(!t?.src||this._prefetchedSrc===t.src)return;this._prefetchedSrc=t.src;let n=document.createElement(`link`);n.rel=`preload`,n.as=`video`,n.href=t.src,n.crossOrigin=`anonymous`,n.dataset.luxenStoriesPrefetch=``,document.head.appendChild(n)}_clearPrefetchHints(){let e=document.head.querySelectorAll(`link[data-luxen-stories-prefetch]`);for(let t of e)t.remove();this._prefetchedSrc=null}_applyChapterSeek(){let e=this._chapterStarts[this.chapter]??0;this._video.currentTime=e,this._resetSegmentFills();let t=this.stories[this.index];t&&this.emit(`chapter-change`,{detail:{chapter:this.chapter,story:t}})}get _lastChapter(){return Math.max(0,this._chapterStarts.length-1)}_syncSlots(e){for(let e of Array.from(this.children))e.dataset.storySlot!==void 0&&e.remove();for(let t of Array.from(e.children)){if(!t.getAttribute?.(`slot`))continue;let e=t.cloneNode(!0);e.dataset.storySlot=``,this.appendChild(e)}}_onEnded(){if(this.stories[this.index]&&this.emit(`story-end`,{detail:{index:this.index}}),this.loop){this._video.currentTime=this._chapterStarts[0]??0,this.chapter=0,this._video.play().catch(()=>{});return}this.autoAdvance&&(this.index<this.stories.length-1?this.index+=1:this.close())}_advance(e){if(e===1){this.chapter<this._lastChapter?this.chapter+=1:this.index<this.stories.length-1?this.index+=1:this.close();return}let t=this._chapterStarts[this.chapter]??0;if(this._video.currentTime>t+1){this._video.currentTime=t,this._resetSegmentFills();return}if(this.chapter>0)--this.chapter;else if(this.index>0){let e=this.stories[this.index-1],t=Math.max(0,e.getChapterStarts().length-1);--this.index,queueMicrotask(()=>{this.chapter=t})}}openAt(e,t=0,n=null){this.stories=e,this.source=n,this.index=Math.max(0,Math.min(t,e.length-1)),this.open=!0}close(){this.open=!1}next(){this._advance(1)}previous(){this._advance(-1)}nextStory(){this.index<this.stories.length-1?this.index+=1:this.close()}previousStory(){this.index>0&&--this.index}play(){this._video?.play().catch(()=>{}),this._raf=requestAnimationFrame(this._tick)}pause(){this._video?.pause(),cancelAnimationFrame(this._raf)}async _emitAfter(e){await new Promise(e=>requestAnimationFrame(()=>e(null)));let t=this._dialog.getAnimations({subtree:!1});await Promise.all(t.map(e=>e.finished.catch(()=>{}))),e===`after-show`===this.open&&(this.emit(e),e===`after-show`&&(this._raf=requestAnimationFrame(this._tick)))}_restoreFocus(){((this.source?.stories()??this.stories)[this.index]?.querySelector(`button[data-story-trigger]`))?.focus({preventScroll:!1})}render(){let e=this.stories.length,r=this.stories[this.index],i=this.index===0,a=this.index>=e-1,o=this._chapterStarts.length?this._chapterStarts:r?.getChapterStarts()??[0];return t`
2
+ <dialog
3
+ part="dialog"
4
+ aria-label="Stories"
5
+ >
6
+ <div
7
+ part="frame"
8
+ class="frame"
9
+ @pointerdown=${this._onFramePointerDown}
10
+ @pointerup=${this._onFramePointerUp}
11
+ @pointercancel=${this._onFramePointerUp}
12
+ >
13
+ <div
14
+ part="progress"
15
+ class="progress"
16
+ role="progressbar"
17
+ aria-valuenow=${this.chapter+1}
18
+ aria-valuemin="1"
19
+ aria-valuemax=${o.length||1}
20
+ >
21
+ ${l(o,(e,n)=>t`
22
+ <span
23
+ part="progress-segment"
24
+ class="progress-segment"
25
+ data-state=${n<this.chapter?`past`:n===this.chapter?`active`:`future`}
26
+ >
27
+ <span
28
+ part="progress-fill"
29
+ class="progress-fill"
30
+ ></span>
31
+ </span>
32
+ `)}
33
+ </div>
34
+
35
+ <header
36
+ part="header"
37
+ class="header"
38
+ data-no-gesture
39
+ >
40
+ <slot name="header">
41
+ ${r?.poster?t`<img
42
+ class="header-thumb"
43
+ src=${r.poster}
44
+ alt=""
45
+ />`:n}
46
+ ${r?.label?t`<div class="header-text">
47
+ <div
48
+ part="header-label"
49
+ class="header-label"
50
+ >
51
+ ${r.label}
52
+ </div>
53
+ </div>`:n}
54
+ </slot>
55
+ </header>
56
+
57
+ <div
58
+ part="actions"
59
+ class="actions"
60
+ data-no-gesture
61
+ >
62
+ <slot name="close">
63
+ <button
64
+ type="button"
65
+ part="button-close"
66
+ class="btn btn-close"
67
+ aria-label="Close"
68
+ @click=${()=>this.close()}
69
+ >
70
+ <l-icon name="mdi:close"></l-icon>
71
+ </button>
72
+ </slot>
73
+ <button
74
+ type="button"
75
+ part="button-pause"
76
+ class="btn btn-pause"
77
+ aria-label=${this._paused?`Play`:`Pause`}
78
+ aria-pressed=${this._paused?`true`:`false`}
79
+ @click=${()=>this._paused?this.play():this.pause()}
80
+ >
81
+ <l-icon name=${this._paused?`mdi:play`:`mdi:pause`}></l-icon>
82
+ </button>
83
+ <button
84
+ type="button"
85
+ part="button-mute"
86
+ class="btn btn-mute"
87
+ aria-label=${this.muted?`Unmute`:`Mute`}
88
+ aria-pressed=${this.muted?`false`:`true`}
89
+ @click=${()=>{this.muted=!this.muted,this.emit(`mute-change`,{detail:{muted:this.muted}})}}
90
+ >
91
+ <l-icon name=${this.muted?`mdi:volume-off`:`mdi:volume-high`}></l-icon>
92
+ </button>
93
+ </div>
94
+
95
+ <video
96
+ part="video"
97
+ class="video"
98
+ playsinline
99
+ preload="metadata"
100
+ ?muted=${this.muted}
101
+ ></video>
102
+
103
+ <l-spinner
104
+ part="spinner"
105
+ class="spinner"
106
+ aria-label="Loading"
107
+ data-no-gesture
108
+ data-state=${this._loading?`loading`:`idle`}
109
+ ></l-spinner>
110
+
111
+ <!-- Tap zones: invisible overlays that translate clicks into previous/next.
112
+ Sit BELOW header / overlay / chevron buttons in z-order, above the video. -->
113
+ <div
114
+ class="tap-zone tap-previous"
115
+ data-tap="previous"
116
+ aria-hidden="true"
117
+ ></div>
118
+ <div
119
+ class="tap-zone tap-next"
120
+ data-tap="next"
121
+ aria-hidden="true"
122
+ ></div>
123
+
124
+ <div
125
+ part="overlay"
126
+ class="overlay"
127
+ data-no-gesture
128
+ >
129
+ <slot name="cta"></slot>
130
+ </div>
131
+
132
+ <div
133
+ class="sr-only"
134
+ aria-live="polite"
135
+ >
136
+ ${e?`Story ${this.index+1} of ${e}${this.stories[this.index]?.label?` — ${this.stories[this.index].label}`:``}${o.length>1?` — chapter ${this.chapter+1} of ${o.length}`:``}`:``}
137
+ </div>
138
+ </div>
139
+
140
+ ${i?n:t`<button
141
+ type="button"
142
+ part="button-previous"
143
+ class="btn btn-nav btn-previous"
144
+ aria-label="Previous story"
145
+ @click=${()=>this.previousStory()}
146
+ >
147
+ <l-icon name="mdi:chevron-left"></l-icon>
148
+ </button>`}
149
+ ${a?n:t`<button
150
+ type="button"
151
+ part="button-next"
152
+ class="btn btn-nav btn-next"
153
+ aria-label="Next story"
154
+ @click=${()=>this.nextStory()}
155
+ >
156
+ <l-icon name="mdi:chevron-right"></l-icon>
157
+ </button>`}
158
+ </dialog>
159
+ `}};s([i({type:Boolean,reflect:!0})],f.prototype,`open`,void 0),s([i({type:Number,reflect:!0})],f.prototype,`index`,void 0),s([i({type:Boolean,reflect:!0})],f.prototype,`muted`,void 0),s([i({type:Boolean,reflect:!0})],f.prototype,`loop`,void 0),s([i({type:Boolean,reflect:!0,attribute:`auto-advance`})],f.prototype,`autoAdvance`,void 0),s([i({type:Boolean,reflect:!0,attribute:`light-dismiss`})],f.prototype,`lightDismiss`,void 0),s([i({type:Number,reflect:!0})],f.prototype,`chapter`,void 0),s([a(`dialog`)],f.prototype,`_dialog`,void 0),s([a(`video`)],f.prototype,`_video`,void 0),s([o()],f.prototype,`_paused`,void 0),s([o()],f.prototype,`_loading`,void 0);export{f as LuxenStoriesViewer};
160
+ //# sourceMappingURL=stories-viewer.js.map