@mhmo91/schmancy 0.10.33 → 0.10.34

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 (334) hide show
  1. package/custom-elements.json +7 -22
  2. package/dist/SchmancyElement-CA0Wqt8m.js +284 -0
  3. package/dist/{SchmancyElement-DuzT2AMa.js.map → SchmancyElement-CA0Wqt8m.js.map} +1 -1
  4. package/dist/SchmancyElement-CYIif26I.cjs +2 -0
  5. package/dist/{SchmancyElement-D8_z9JrW.cjs.map → SchmancyElement-CYIif26I.cjs.map} +1 -1
  6. package/dist/agent/schmancy.agent.js +1181 -1288
  7. package/dist/agent/schmancy.agent.js.map +1 -1
  8. package/dist/agent/schmancy.manifest.json +4 -10
  9. package/dist/{area-WGfTrwcJ.cjs → area-CTSTgjlx.cjs} +1 -1
  10. package/dist/{area-WGfTrwcJ.cjs.map → area-CTSTgjlx.cjs.map} +1 -1
  11. package/dist/{area-0l8V7HlF.js → area-DviXdbDx.js} +2 -2
  12. package/dist/{area-0l8V7HlF.js.map → area-DviXdbDx.js.map} +1 -1
  13. package/dist/area.cjs +1 -1
  14. package/dist/area.js +1 -1
  15. package/dist/{audio-x9oLVKBH.js → audio-DFYoaw0M.js} +1 -1
  16. package/dist/{audio-x9oLVKBH.js.map → audio-DFYoaw0M.js.map} +1 -1
  17. package/dist/{audio-9QLk4pU-.cjs → audio-Q9oB_cQR.cjs} +1 -1
  18. package/dist/{audio-9QLk4pU-.cjs.map → audio-Q9oB_cQR.cjs.map} +1 -1
  19. package/dist/audio.cjs +1 -1
  20. package/dist/audio.js +2 -2
  21. package/dist/{autocomplete-sjZovPcs.js → autocomplete-BDvuma6D.js} +3 -3
  22. package/dist/{autocomplete-sjZovPcs.js.map → autocomplete-BDvuma6D.js.map} +1 -1
  23. package/dist/{autocomplete-CjjfXbJC.cjs → autocomplete-DmLXJr7C.cjs} +1 -1
  24. package/dist/{autocomplete-CjjfXbJC.cjs.map → autocomplete-DmLXJr7C.cjs.map} +1 -1
  25. package/dist/autocomplete.cjs +1 -1
  26. package/dist/autocomplete.js +1 -1
  27. package/dist/avatar.cjs +1 -1
  28. package/dist/avatar.js +3 -3
  29. package/dist/badge.cjs +1 -1
  30. package/dist/badge.js +1 -1
  31. package/dist/boat-BgpWcLnV.cjs +38 -0
  32. package/dist/boat-BgpWcLnV.cjs.map +1 -0
  33. package/dist/boat-Y5UMiJCV.js +216 -0
  34. package/dist/boat-Y5UMiJCV.js.map +1 -0
  35. package/dist/boat.cjs +1 -1
  36. package/dist/boat.js +1 -1
  37. package/dist/breadcrumb.cjs +1 -1
  38. package/dist/breadcrumb.js +2 -2
  39. package/dist/{busy-DDKXlzDA.cjs → busy-CgzZbGfx.cjs} +1 -1
  40. package/dist/{busy-DDKXlzDA.cjs.map → busy-CgzZbGfx.cjs.map} +1 -1
  41. package/dist/{busy-DwD-XHqS.js → busy-DgQ4ux5N.js} +2 -2
  42. package/dist/{busy-DwD-XHqS.js.map → busy-DgQ4ux5N.js.map} +1 -1
  43. package/dist/busy.cjs +1 -1
  44. package/dist/busy.js +1 -1
  45. package/dist/{button-nDZQe1ES.cjs → button-DFvR1iXX.cjs} +1 -1
  46. package/dist/{button-nDZQe1ES.cjs.map → button-DFvR1iXX.cjs.map} +1 -1
  47. package/dist/{button-qARUurjf.js → button-qbN1muQ0.js} +2 -2
  48. package/dist/{button-qARUurjf.js.map → button-qbN1muQ0.js.map} +1 -1
  49. package/dist/button.cjs +1 -1
  50. package/dist/button.js +3 -3
  51. package/dist/{card-D3IxxBBP.js → card-DAbr-7Vy.js} +2 -2
  52. package/dist/{card-D3IxxBBP.js.map → card-DAbr-7Vy.js.map} +1 -1
  53. package/dist/{card-DWZhZ5Ds.cjs → card-D_GlwZ5q.cjs} +1 -1
  54. package/dist/{card-DWZhZ5Ds.cjs.map → card-D_GlwZ5q.cjs.map} +1 -1
  55. package/dist/card.cjs +1 -1
  56. package/dist/card.js +1 -1
  57. package/dist/{checkbox-t__wRS-9.js → checkbox-BNORaxMF.js} +2 -2
  58. package/dist/{checkbox-t__wRS-9.js.map → checkbox-BNORaxMF.js.map} +1 -1
  59. package/dist/{checkbox-BBttnA_a.cjs → checkbox-BUY_uc_r.cjs} +1 -1
  60. package/dist/{checkbox-BBttnA_a.cjs.map → checkbox-BUY_uc_r.cjs.map} +1 -1
  61. package/dist/checkbox.cjs +1 -1
  62. package/dist/checkbox.js +1 -1
  63. package/dist/{chips-DIZFWnDZ.cjs → chips-CXZ4dJCK.cjs} +1 -1
  64. package/dist/{chips-DIZFWnDZ.cjs.map → chips-CXZ4dJCK.cjs.map} +1 -1
  65. package/dist/{chips-xaoSmwBK.js → chips-Dg6Lk6BT.js} +4 -4
  66. package/dist/{chips-xaoSmwBK.js.map → chips-Dg6Lk6BT.js.map} +1 -1
  67. package/dist/chips.cjs +1 -1
  68. package/dist/chips.js +2 -2
  69. package/dist/connectivity.cjs +1 -1
  70. package/dist/connectivity.js +3 -3
  71. package/dist/content-drawer.cjs +1 -1
  72. package/dist/content-drawer.js +1 -1
  73. package/dist/{date-range-8OkCahnR.js → date-range-BU6WX7d5.js} +3 -3
  74. package/dist/{date-range-8OkCahnR.js.map → date-range-BU6WX7d5.js.map} +1 -1
  75. package/dist/{date-range-Bbzg9aym.cjs → date-range-C-_be3_E.cjs} +1 -1
  76. package/dist/{date-range-Bbzg9aym.cjs.map → date-range-C-_be3_E.cjs.map} +1 -1
  77. package/dist/{date-range-inline-BEP-oWJZ.js → date-range-inline-7o7xtVIu.js} +2 -2
  78. package/dist/{date-range-inline-BEP-oWJZ.js.map → date-range-inline-7o7xtVIu.js.map} +1 -1
  79. package/dist/{date-range-inline-lhkwHFxY.cjs → date-range-inline-DJtUmHKF.cjs} +1 -1
  80. package/dist/{date-range-inline-lhkwHFxY.cjs.map → date-range-inline-DJtUmHKF.cjs.map} +1 -1
  81. package/dist/date-range-inline.cjs +1 -1
  82. package/dist/date-range-inline.js +1 -1
  83. package/dist/date-range.cjs +1 -1
  84. package/dist/date-range.js +1 -1
  85. package/dist/delay.cjs +1 -1
  86. package/dist/delay.js +2 -2
  87. package/dist/{details-3X9YKpuP.cjs → details-Bs0MyyvF.cjs} +1 -1
  88. package/dist/{details-3X9YKpuP.cjs.map → details-Bs0MyyvF.cjs.map} +1 -1
  89. package/dist/{details-BO_3CCNn.js → details-EfbDPVEo.js} +2 -2
  90. package/dist/{details-BO_3CCNn.js.map → details-EfbDPVEo.js.map} +1 -1
  91. package/dist/details.cjs +1 -1
  92. package/dist/details.js +1 -1
  93. package/dist/{directives-BOsvcH83.cjs → directives-fLwDj6b0.cjs} +1 -1
  94. package/dist/{directives-BOsvcH83.cjs.map → directives-fLwDj6b0.cjs.map} +1 -1
  95. package/dist/{directives-D7AoVfPK.js → directives-zi1Mm2er.js} +3 -3
  96. package/dist/{directives-D7AoVfPK.js.map → directives-zi1Mm2er.js.map} +1 -1
  97. package/dist/directives.cjs +1 -1
  98. package/dist/directives.js +2 -2
  99. package/dist/{divider-BHgrisGQ.js → divider-CEPfrIwe.js} +2 -2
  100. package/dist/{divider-BHgrisGQ.js.map → divider-CEPfrIwe.js.map} +1 -1
  101. package/dist/{divider-D21yKZNJ.cjs → divider-CdIsWZrM.cjs} +1 -1
  102. package/dist/{divider-D21yKZNJ.cjs.map → divider-CdIsWZrM.cjs.map} +1 -1
  103. package/dist/divider.cjs +1 -1
  104. package/dist/divider.js +1 -1
  105. package/dist/dropdown.cjs +1 -1
  106. package/dist/dropdown.js +2 -2
  107. package/dist/{expand-wRphbpW6.cjs → expand--at1k3qo.cjs} +1 -1
  108. package/dist/{expand-wRphbpW6.cjs.map → expand--at1k3qo.cjs.map} +1 -1
  109. package/dist/{expand-2TTbmm_z.js → expand-g1vqqUp1.js} +3 -3
  110. package/dist/{expand-2TTbmm_z.js.map → expand-g1vqqUp1.js.map} +1 -1
  111. package/dist/expand.cjs +1 -1
  112. package/dist/expand.js +1 -1
  113. package/dist/{float-dtDqRmcL.js → float-DxVzgI9o.js} +2 -2
  114. package/dist/{float-dtDqRmcL.js.map → float-DxVzgI9o.js.map} +1 -1
  115. package/dist/{float-B0L_CH4v.cjs → float-P9HukAm-.cjs} +1 -1
  116. package/dist/{float-B0L_CH4v.cjs.map → float-P9HukAm-.cjs.map} +1 -1
  117. package/dist/float.cjs +1 -1
  118. package/dist/float.js +1 -1
  119. package/dist/{form-DvqHReDF.cjs → form-ByYhXe1p.cjs} +1 -1
  120. package/dist/{form-DvqHReDF.cjs.map → form-ByYhXe1p.cjs.map} +1 -1
  121. package/dist/{form-BxY-9F6N.js → form-CqLaozHp.js} +3 -3
  122. package/dist/{form-BxY-9F6N.js.map → form-CqLaozHp.js.map} +1 -1
  123. package/dist/form.cjs +1 -1
  124. package/dist/form.js +10 -10
  125. package/dist/handover/agent-runtime-followups.md +1 -1
  126. package/dist/handover/agent-runtime-v1.md +3 -3
  127. package/dist/{icons-CO8UrTJQ.js → icons-CkphcMp6.js} +2 -2
  128. package/dist/{icons-CO8UrTJQ.js.map → icons-CkphcMp6.js.map} +1 -1
  129. package/dist/{icons-BbC4t44c.cjs → icons-DYtiRU5V.cjs} +1 -1
  130. package/dist/{icons-BbC4t44c.cjs.map → icons-DYtiRU5V.cjs.map} +1 -1
  131. package/dist/icons.cjs +1 -1
  132. package/dist/icons.js +1 -1
  133. package/dist/{iframe-BepoWz9Z.cjs → iframe-C3trkP8q.cjs} +1 -1
  134. package/dist/{iframe-BepoWz9Z.cjs.map → iframe-C3trkP8q.cjs.map} +1 -1
  135. package/dist/{iframe-t5zo89Fs.js → iframe-CjqJksl8.js} +2 -2
  136. package/dist/{iframe-t5zo89Fs.js.map → iframe-CjqJksl8.js.map} +1 -1
  137. package/dist/iframe.cjs +1 -1
  138. package/dist/iframe.js +1 -1
  139. package/dist/index.cjs +1 -1
  140. package/dist/index.js +37 -37
  141. package/dist/{input-2OR6wjfT.js → input-CG51zDVh.js} +2 -2
  142. package/dist/{input-2OR6wjfT.js.map → input-CG51zDVh.js.map} +1 -1
  143. package/dist/{input-B-wPPC5o.cjs → input-DuavpwNL.cjs} +1 -1
  144. package/dist/{input-B-wPPC5o.cjs.map → input-DuavpwNL.cjs.map} +1 -1
  145. package/dist/{input-chip-O5-pgek1.cjs → input-chip-57tgNXKT.cjs} +1 -1
  146. package/dist/{input-chip-O5-pgek1.cjs.map → input-chip-57tgNXKT.cjs.map} +1 -1
  147. package/dist/{input-chip-NBsnZkzu.js → input-chip-C6Lq1927.js} +2 -2
  148. package/dist/{input-chip-NBsnZkzu.js.map → input-chip-C6Lq1927.js.map} +1 -1
  149. package/dist/input.cjs +1 -1
  150. package/dist/input.js +1 -1
  151. package/dist/json.cjs +1 -1
  152. package/dist/json.js +3 -3
  153. package/dist/kbd.cjs +1 -1
  154. package/dist/kbd.js +2 -2
  155. package/dist/{layout-D7nKwpa5.cjs → layout-6ipbiWTl.cjs} +1 -1
  156. package/dist/{layout-D7nKwpa5.cjs.map → layout-6ipbiWTl.cjs.map} +1 -1
  157. package/dist/{layout-CJ01zE9V.js → layout-D4IOwx7p.js} +1 -1
  158. package/dist/{layout-CJ01zE9V.js.map → layout-D4IOwx7p.js.map} +1 -1
  159. package/dist/layout.cjs +1 -1
  160. package/dist/layout.js +2 -2
  161. package/dist/{lightbox-Droe9dYY.js → lightbox-CsyO2XSr.js} +2 -2
  162. package/dist/{lightbox-Droe9dYY.js.map → lightbox-CsyO2XSr.js.map} +1 -1
  163. package/dist/{lightbox-DVpvjsYb.cjs → lightbox-H8pVWGMX.cjs} +1 -1
  164. package/dist/{lightbox-DVpvjsYb.cjs.map → lightbox-H8pVWGMX.cjs.map} +1 -1
  165. package/dist/lightbox.cjs +1 -1
  166. package/dist/lightbox.js +1 -1
  167. package/dist/{list-DzAWv99q.js → list-BAwH0pQW.js} +2 -2
  168. package/dist/{list-DzAWv99q.js.map → list-BAwH0pQW.js.map} +1 -1
  169. package/dist/{list-JjUsFCP6.cjs → list-Bs9m8kw7.cjs} +1 -1
  170. package/dist/{list-JjUsFCP6.cjs.map → list-Bs9m8kw7.cjs.map} +1 -1
  171. package/dist/list.cjs +1 -1
  172. package/dist/list.js +1 -1
  173. package/dist/{menu-B5EKUeeD.cjs → menu-BMcGzj1h.cjs} +1 -1
  174. package/dist/{menu-B5EKUeeD.cjs.map → menu-BMcGzj1h.cjs.map} +1 -1
  175. package/dist/{menu-CgdXrzir.js → menu-tQVARVaC.js} +3 -3
  176. package/dist/{menu-CgdXrzir.js.map → menu-tQVARVaC.js.map} +1 -1
  177. package/dist/menu.cjs +1 -1
  178. package/dist/menu.js +1 -1
  179. package/dist/{mixins-Cevarn7V.js → mixins-Bp0wIHg2.js} +1 -1
  180. package/dist/{mixins-Cevarn7V.js.map → mixins-Bp0wIHg2.js.map} +1 -1
  181. package/dist/{mixins-JyO9GSGy.cjs → mixins-CGXSzZc7.cjs} +1 -1
  182. package/dist/{mixins-JyO9GSGy.cjs.map → mixins-CGXSzZc7.cjs.map} +1 -1
  183. package/dist/mixins.cjs +1 -1
  184. package/dist/mixins.js +2 -2
  185. package/dist/nav-drawer.cjs +1 -1
  186. package/dist/nav-drawer.js +1 -1
  187. package/dist/navigation-bar.cjs +1 -1
  188. package/dist/navigation-bar.js +1 -1
  189. package/dist/navigation-rail.cjs +1 -1
  190. package/dist/navigation-rail.js +2 -2
  191. package/dist/{notification-CaeRS5US.cjs → notification-Bz00zdpV.cjs} +1 -1
  192. package/dist/{notification-CaeRS5US.cjs.map → notification-Bz00zdpV.cjs.map} +1 -1
  193. package/dist/{notification-Dxwx0Zln.js → notification-D1tX2nx5.js} +4 -4
  194. package/dist/{notification-Dxwx0Zln.js.map → notification-D1tX2nx5.js.map} +1 -1
  195. package/dist/notification.cjs +1 -1
  196. package/dist/notification.js +1 -1
  197. package/dist/{option-C6wXFQOM.cjs → option-BnybLEDO.cjs} +1 -1
  198. package/dist/{option-C6wXFQOM.cjs.map → option-BnybLEDO.cjs.map} +1 -1
  199. package/dist/{option-BCnYutZz.js → option-BpGV8Apj.js} +2 -2
  200. package/dist/{option-BCnYutZz.js.map → option-BpGV8Apj.js.map} +1 -1
  201. package/dist/option.cjs +1 -1
  202. package/dist/option.js +1 -1
  203. package/dist/{overlay-BWcB2pRx.js → overlay-BpNhd74N.js} +24 -7
  204. package/dist/overlay-BpNhd74N.js.map +1 -0
  205. package/dist/{overlay-5PMZ75PO.cjs → overlay-UQR2Dy3u.cjs} +18 -3
  206. package/dist/overlay-UQR2Dy3u.cjs.map +1 -0
  207. package/dist/overlay.cjs +1 -1
  208. package/dist/{overlay.confirm-body-B7W0DOGS.js → overlay.confirm-body-BHcXu5Wk.js} +6 -6
  209. package/dist/{overlay.confirm-body-B7W0DOGS.js.map → overlay.confirm-body-BHcXu5Wk.js.map} +1 -1
  210. package/dist/{overlay.confirm-body-CsvwcBvG.cjs → overlay.confirm-body-CVDtVk5X.cjs} +1 -1
  211. package/dist/{overlay.confirm-body-CsvwcBvG.cjs.map → overlay.confirm-body-CVDtVk5X.cjs.map} +1 -1
  212. package/dist/overlay.js +3 -3
  213. package/dist/{overlay.service-CC4zckoV.cjs → overlay.service-C8RsQzgM.cjs} +1 -1
  214. package/dist/{overlay.service-CC4zckoV.cjs.map → overlay.service-C8RsQzgM.cjs.map} +1 -1
  215. package/dist/{overlay.service-zx465FI8.js → overlay.service-DTE6NwIM.js} +2 -2
  216. package/dist/{overlay.service-zx465FI8.js.map → overlay.service-DTE6NwIM.js.map} +1 -1
  217. package/dist/{progress-BoFm3r6h.js → progress-CAKsxp29.js} +2 -2
  218. package/dist/{progress-BoFm3r6h.js.map → progress-CAKsxp29.js.map} +1 -1
  219. package/dist/{progress-Bc_IBaNH.cjs → progress-gbIALDRs.cjs} +1 -1
  220. package/dist/{progress-Bc_IBaNH.cjs.map → progress-gbIALDRs.cjs.map} +1 -1
  221. package/dist/progress.cjs +1 -1
  222. package/dist/progress.js +1 -1
  223. package/dist/{radio-group-C34WDjrN.cjs → radio-group-CfJ5DtI4.cjs} +1 -1
  224. package/dist/{radio-group-C34WDjrN.cjs.map → radio-group-CfJ5DtI4.cjs.map} +1 -1
  225. package/dist/{radio-group-DnHhGrXp.js → radio-group-otyvZvUk.js} +2 -2
  226. package/dist/{radio-group-DnHhGrXp.js.map → radio-group-otyvZvUk.js.map} +1 -1
  227. package/dist/radio-group.cjs +1 -1
  228. package/dist/radio-group.js +1 -1
  229. package/dist/range.cjs +1 -1
  230. package/dist/range.js +2 -2
  231. package/dist/{select-D61MbhmA.cjs → select-81jniVTs.cjs} +1 -1
  232. package/dist/{select-D61MbhmA.cjs.map → select-81jniVTs.cjs.map} +1 -1
  233. package/dist/{select-C_ljy5k4.js → select-9vXx1fhr.js} +3 -3
  234. package/dist/{select-C_ljy5k4.js.map → select-9vXx1fhr.js.map} +1 -1
  235. package/dist/select.cjs +1 -1
  236. package/dist/select.js +1 -1
  237. package/dist/skeleton.cjs +1 -1
  238. package/dist/skeleton.js +2 -2
  239. package/dist/skills/boat.md +27 -18
  240. package/dist/skills/schmancy/boat.md +27 -18
  241. package/dist/slider.cjs +1 -1
  242. package/dist/slider.js +2 -2
  243. package/dist/{sound.service-Czs3gmRx.cjs → sound.service-CmIw63aM.cjs} +1 -1
  244. package/dist/{sound.service-Czs3gmRx.cjs.map → sound.service-CmIw63aM.cjs.map} +1 -1
  245. package/dist/{sound.service-Cuo4-X_-.js → sound.service-D3ZSq1Kj.js} +1 -1
  246. package/dist/{sound.service-Cuo4-X_-.js.map → sound.service-D3ZSq1Kj.js.map} +1 -1
  247. package/dist/{splash-screen-CbcYpkIx.js → splash-screen-BOjrmGLk.js} +2 -2
  248. package/dist/{splash-screen-CbcYpkIx.js.map → splash-screen-BOjrmGLk.js.map} +1 -1
  249. package/dist/{splash-screen-C0oeDPxV.cjs → splash-screen-C5KAWXvA.cjs} +1 -1
  250. package/dist/{splash-screen-C0oeDPxV.cjs.map → splash-screen-C5KAWXvA.cjs.map} +1 -1
  251. package/dist/splash-screen.cjs +1 -1
  252. package/dist/splash-screen.js +1 -1
  253. package/dist/{src-DEgL_xJv.cjs → src-Bm1vop0l.cjs} +1 -1
  254. package/dist/{src-DEgL_xJv.cjs.map → src-Bm1vop0l.cjs.map} +1 -1
  255. package/dist/{src-CdX0NekF.js → src-DoOhMBtI.js} +35 -35
  256. package/dist/{src-CdX0NekF.js.map → src-DoOhMBtI.js.map} +1 -1
  257. package/dist/{state-B-5H9i10.js → state-CWBRTSvE.js} +1 -1
  258. package/dist/{state-B-5H9i10.js.map → state-CWBRTSvE.js.map} +1 -1
  259. package/dist/{state-D85Se4Fx.cjs → state-Cex3rmx2.cjs} +1 -1
  260. package/dist/{state-D85Se4Fx.cjs.map → state-Cex3rmx2.cjs.map} +1 -1
  261. package/dist/state.cjs +1 -1
  262. package/dist/state.js +2 -2
  263. package/dist/steps.cjs +1 -1
  264. package/dist/steps.js +2 -2
  265. package/dist/{surface-gZpeCF6E.js → surface-9S5scTsD.js} +2 -2
  266. package/dist/{surface-gZpeCF6E.js.map → surface-9S5scTsD.js.map} +1 -1
  267. package/dist/{surface-DHPaLOTA.cjs → surface-PfiejLuw.cjs} +1 -1
  268. package/dist/{surface-DHPaLOTA.cjs.map → surface-PfiejLuw.cjs.map} +1 -1
  269. package/dist/surface.cjs +1 -1
  270. package/dist/surface.js +1 -1
  271. package/dist/switch.cjs +1 -1
  272. package/dist/switch.js +2 -2
  273. package/dist/table.cjs +1 -1
  274. package/dist/table.js +2 -2
  275. package/dist/{tabs-DJNdoE-x.js → tabs-BBOjAmgG.js} +2 -2
  276. package/dist/{tabs-DJNdoE-x.js.map → tabs-BBOjAmgG.js.map} +1 -1
  277. package/dist/{tabs-DgaVwuOo.cjs → tabs-uYvb1P06.cjs} +1 -1
  278. package/dist/{tabs-DgaVwuOo.cjs.map → tabs-uYvb1P06.cjs.map} +1 -1
  279. package/dist/tabs.cjs +1 -1
  280. package/dist/tabs.js +1 -1
  281. package/dist/teleport.cjs +1 -1
  282. package/dist/teleport.js +1 -1
  283. package/dist/{textarea-8x0prbgm.js → textarea-QzSj8Dkl.js} +2 -2
  284. package/dist/{textarea-8x0prbgm.js.map → textarea-QzSj8Dkl.js.map} +1 -1
  285. package/dist/{textarea-2QE5z6Ny.cjs → textarea-YPHX4g7Y.cjs} +1 -1
  286. package/dist/{textarea-2QE5z6Ny.cjs.map → textarea-YPHX4g7Y.cjs.map} +1 -1
  287. package/dist/textarea.cjs +1 -1
  288. package/dist/textarea.js +1 -1
  289. package/dist/{theme-DSD9Bs69.js → theme-C2Mp-VGt.js} +4 -4
  290. package/dist/{theme-DSD9Bs69.js.map → theme-C2Mp-VGt.js.map} +1 -1
  291. package/dist/{theme-button-Dpr6SGzB.cjs → theme-button-CJmhxfMe.cjs} +1 -1
  292. package/dist/{theme-button-Dpr6SGzB.cjs.map → theme-button-CJmhxfMe.cjs.map} +1 -1
  293. package/dist/{theme-button-nd6Z7plT.js → theme-button-DGWAXhzd.js} +2 -2
  294. package/dist/{theme-button-nd6Z7plT.js.map → theme-button-DGWAXhzd.js.map} +1 -1
  295. package/dist/theme-button.cjs +1 -1
  296. package/dist/theme-button.js +1 -1
  297. package/dist/{theme-D0yboni1.cjs → theme-iKUaS9JB.cjs} +1 -1
  298. package/dist/{theme-D0yboni1.cjs.map → theme-iKUaS9JB.cjs.map} +1 -1
  299. package/dist/theme.cjs +1 -1
  300. package/dist/theme.js +3 -3
  301. package/dist/{theme.service-mRlvWZVs.js → theme.service-hc4N-1Oz.js} +1 -1
  302. package/dist/{theme.service-mRlvWZVs.js.map → theme.service-hc4N-1Oz.js.map} +1 -1
  303. package/dist/{theme.service-LtQw04e6.cjs → theme.service-p61RsJBF.cjs} +1 -1
  304. package/dist/{theme.service-LtQw04e6.cjs.map → theme.service-p61RsJBF.cjs.map} +1 -1
  305. package/dist/tree.cjs +1 -1
  306. package/dist/tree.js +2 -2
  307. package/dist/{typography-CiZQpzE4.cjs → typography-Bdt8RlX2.cjs} +1 -1
  308. package/dist/{typography-CiZQpzE4.cjs.map → typography-Bdt8RlX2.cjs.map} +1 -1
  309. package/dist/{typography-DXyf-KdK.js → typography-DwV0sqht.js} +2 -2
  310. package/dist/{typography-DXyf-KdK.js.map → typography-DwV0sqht.js.map} +1 -1
  311. package/dist/typography.cjs +1 -1
  312. package/dist/typography.js +1 -1
  313. package/dist/visually-hidden.cjs +1 -1
  314. package/dist/visually-hidden.js +2 -2
  315. package/dist/{window-qKfP5c6M.cjs → window-D2WfvNng.cjs} +1 -1
  316. package/dist/{window-qKfP5c6M.cjs.map → window-D2WfvNng.cjs.map} +1 -1
  317. package/dist/{window-C_ATa3qM.js → window-n4jN60B_.js} +3 -3
  318. package/dist/{window-C_ATa3qM.js.map → window-n4jN60B_.js.map} +1 -1
  319. package/dist/window.cjs +1 -1
  320. package/dist/window.js +1 -1
  321. package/package.json +1 -1
  322. package/skills/schmancy/boat.md +27 -18
  323. package/src/boat/boat.ts +121 -365
  324. package/src/overlay/overlay.component.ts +28 -0
  325. package/types/src/boat/boat.d.ts +18 -25
  326. package/types/src/overlay/overlay.component.d.ts +1 -0
  327. package/dist/SchmancyElement-D8_z9JrW.cjs +0 -2
  328. package/dist/SchmancyElement-DuzT2AMa.js +0 -284
  329. package/dist/boat-CEaQaCmG.js +0 -339
  330. package/dist/boat-CEaQaCmG.js.map +0 -1
  331. package/dist/boat-CI5rcGS5.cjs +0 -85
  332. package/dist/boat-CI5rcGS5.cjs.map +0 -1
  333. package/dist/overlay-5PMZ75PO.cjs.map +0 -1
  334. package/dist/overlay-BWcB2pRx.js.map +0 -1
@@ -1,5 +1,5 @@
1
- import { t as e, u as t } from "./SchmancyElement-DuzT2AMa.js";
2
- import "./mixins-Cevarn7V.js";
1
+ import { t as e, u as t } from "./SchmancyElement-CA0Wqt8m.js";
2
+ import "./mixins-Bp0wIHg2.js";
3
3
  import { consume as n, createContext as r, provide as i } from "@lit/context";
4
4
  import { customElement as a, property as o, queryAssignedElements as s } from "lit/decorators.js";
5
5
  import { css as c, html as l } from "lit";
@@ -1 +1 @@
1
- {"version":3,"file":"list-DzAWv99q.js","names":[],"sources":["../src/list/context.ts","../src/surface/context.ts","../src/list/list-item.ts","../src/list/list.ts"],"sourcesContent":["import { createContext } from '@lit/context'\nimport { TSurfaceColor } from '@schmancy/types/surface'\nexport const SchmancyListTypeContext = createContext<TSurfaceColor>(undefined)\n","import { createContext } from '@lit/context'\nimport { TSurfaceColor } from '@schmancy/types/surface'\nexport const SchmancySurfaceTypeContext = createContext<TSurfaceColor>('surface')\n","import { consume } from '@lit/context'\nimport { SchmancyElement } from '@mixins/index'\nimport { SchmancySurfaceTypeContext } from '@schmancy/surface/context'\nimport { TSurfaceColor } from '@schmancy/types/surface'\nimport { css, html } from 'lit'\nimport { customElement, property, queryAssignedElements } from 'lit/decorators.js'\n\n/**\n * @element schmancy-list-item\n * @slot leading - leading content\n * @slot trailing - trailing content\n * @slot - default content\n */\n@customElement('schmancy-list-item')\nexport class SchmancyListItem extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t\tborder-radius: 0.5rem;\n\t\ttransition:\n\t\t\tbackground 200ms ease,\n\t\t\tbox-shadow 300ms ease,\n\t\t\ttransform 200ms cubic-bezier(0.34, 1.56, 0.64, 1);\n\t}\n\t:host(:hover:not([readonly])) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-surface-on) 8%, transparent);\n\t\tbox-shadow: 0 2px 8px -4px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 10%, transparent);\n\t}\n\t:host(:active:not([readonly])) {\n\t\ttransform: scale(0.98);\n\t\ttransition-duration: 100ms;\n\t}\n\t:host([selected]) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-secondary-container) 30%, transparent);\n\t\tbox-shadow: 0 0 10px -3px color-mix(in srgb, var(--schmancy-sys-color-secondary-default) 12%, transparent);\n\t}\n\t@media (prefers-reduced-motion: reduce) {\n\t\t:host { transition: background 200ms ease; }\n\t\t:host(:active:not([readonly])) { transform: none; }\n\t}\n`];\n\t@consume({ context: SchmancySurfaceTypeContext, subscribe: true })\n\t@property()\n\tvariant: TSurfaceColor\n\n\t@property({ type: Boolean, reflect: true })\n\trounded: boolean\n\n\t@property({ type: Boolean, reflect: true }) readonly: boolean\n\n\t@property({ type: Boolean, reflect: true }) selected: boolean = false\n\n\t@queryAssignedElements({\n\t\tslot: 'leading',\n\t\tflatten: true,\n\t})\n\tprivate leading!: HTMLElement[]\n\n\t@queryAssignedElements({\n\t\tslot: 'trailing',\n\t\tflatten: true,\n\t})\n\tprivate trailing!: HTMLElement[]\n\n\tprotected get imgClasses(): string[] {\n\t\treturn ['h-4', 'w-4', 'sm:h-5', 'sm:w-5', 'object-contain']\n\t}\n\n\tfirstUpdated() {\n\t\tthis.leading?.forEach(img => {\n\t\t\timg.classList.add(...this.imgClasses)\n\t\t})\n\t\tthis.trailing?.forEach(img => {\n\t\t\timg.classList.add(...this.imgClasses)\n\t\t})\n\t}\n\n\trender() {\n\t\tconst classes = {\n\t\t\t'w-full flex items-center min-h-[36px] sm:min-h-[40px] py-1 px-2 sm:px-3 text-sm': true,\n\t\t\t'focus-visible:outline-solid focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:z-1 outline-secondary-default outline-hidden': true,\n\t\t\t'cursor-pointer': !this.readonly,\n\t\t}\n\n\t\treturn html`<li .tabIndex=${this.readonly ? -1 : 0} class=${this.classMap(classes)}>\n\t\t\t<slot></slot>\n\t\t</li>`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-list-item': SchmancyListItem\n\t}\n}\n","import { provide } from '@lit/context'\nimport { SchmancyElement } from '@mixins/index'\nimport { TSurfaceColor } from '@schmancy/types/surface'\nimport { css, html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { SchmancyListTypeContext } from './context'\n\n/**\n * `<schmancy-list>` component.\n *\n * A list component that wraps its content within a customizable surface.\n * It allows you to set the surface type and fill style, and can optionally\n * enable scrolling behavior by delegating the scroller attribute to the surface.\n *\n * @element schmancy-list\n * @slot - The default slot for list items.\n *\n * @example\n * <schmancy-list surface=\"container\" scroller>\n * <schmancy-list-item>List Item 1</schmancy-list-item>\n * </schmancy-list>\n */\n@customElement('schmancy-list')\nexport class List extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t\tpadding-top: 8px;\n\t\tpadding-bottom: 8px;\n\t}\n`];\n\t/**\n\t * Defines the type or color of the surface used by the component.\n\t * This value is provided to descendant components via context.\n\t *\n\t * @attr surface\n\t * @type {TSurfaceColor}\n\t * @default 'surface'\n\t */\n\t@provide({ context: SchmancyListTypeContext })\n\t@property()\n\tsurface: TSurfaceColor\n\n\t/**\n\t * Defines the elevation level of the surface.\n\t *\n\t * @attr elevation\n\t * @type {number}\n\t * @default 0\n\t */\n\t@property({ type: Number })\n\televation: 0 | 1 | 2 | 3 | 4 | 5 = 0\n\n\t/**\n\t * Renders the component's template.\n\t * The list content is wrapped inside a `<schmancy-surface>` element.\n\t * The scroller property is delegated to the surface so that it controls\n\t * the scrollable behavior.\n\t *\n\t * @returns The HTML template for the component.\n\t */\n\trender() {\n\t\treturn html`\n\t\t\t<schmancy-surface .elevation=${this.elevation} type=${this.surface}>\n\t\t\t\t<ul>\n\t\t\t\t\t<slot></slot>\n\t\t\t\t</ul>\n\t\t\t</schmancy-surface>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-list': List\n\t}\n}\n"],"mappings":";;;;;AAEA,IAAa,IAA0B,EAAA,KAA6B,CAAA,GCAvD,IAA6B,EAA6B,SAAA,GCYhE,IAAA,cAA+B,EAAA;CAAA,YAAA,GAAA,GAAA;EAAA,MAAA,GAAA,CAAA,GAAA,KAAA,WAAA,CAoC2B;CAAA;CAAA;EAAA,KAAA,SAnChD,CAAC,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiDpB,IAAA,aAAc;EACb,OAAO;GAAC;GAAO;GAAO;GAAU;GAAU;EAAA;CAC3C;CAEA,eAAA;EACC,KAAK,SAAS,SAAQ,MAAA;GACrB,EAAI,UAAU,IAAA,GAAO,KAAK,UAAA;EAAA,CAAA,GAE3B,KAAK,UAAU,SAAQ,MAAA;GACtB,EAAI,UAAU,IAAA,GAAO,KAAK,UAAA;EAAA,CAAA;CAE5B;CAEA,SAAA;EACC,IAAM,IAAU;GACf,mFAAA,CAAmF;GACnF,iJAAA,CAAiJ;GACjJ,kBAAA,CAAmB,KAAK;EAAA;EAGzB,OAAO,CAAI,iBAAiB,KAAK,WAAA,KAAgB,EAAA,SAAW,KAAK,SAAS,CAAA,EAAA;;;CAG3E;AAAA;AAAA,EAAA,CA9CC,EAAQ;CAAE,SAAS;CAA4B,WAAA,CAAW;AAAA,CAAA,GAC1D,EAAA,CAAA,GAAS,EAAA,WAAA,WAAA,KAAA,CAAA,GAAA,EAAA,CAGT,EAAS;CAAE,MAAM;CAAS,SAAA,CAAS;AAAA,CAAA,CAAA,GAAM,EAAA,WAAA,WAAA,KAAA,CAAA,GAAA,EAAA,CAGzC,EAAS;CAAE,MAAM;CAAS,SAAA,CAAS;AAAA,CAAA,CAAA,GAAM,EAAA,WAAA,YAAA,KAAA,CAAA,GAAA,EAAA,CAEzC,EAAS;CAAE,MAAM;CAAS,SAAA,CAAS;AAAA,CAAA,CAAA,GAAM,EAAA,WAAA,YAAA,KAAA,CAAA,GAAA,EAAA,CAEzC,EAAsB;CACtB,MAAM;CACN,SAAA,CAAS;AAAA,CAAA,CAAA,GACT,EAAA,WAAA,WAAA,KAAA,CAAA,GAAA,EAAA,CAGA,EAAsB;CACtB,MAAM;CACN,SAAA,CAAS;AAAA,CAAA,CAAA,GACT,EAAA,WAAA,YAAA,KAAA,CAAA,GAAA,IAAA,EAAA,CAhDD,EAAc,oBAAA,CAAA,GAAoB,CAAA;ACU5B,IAAA,IAAA,cAAmB,EAAA;CAAA,YAAA,GAAA,GAAA;EAAA,MAAA,GAAA,CAAA,GAAA,KAAA,YA4BU;CAAA;CAAA;EAAA,KAAA,SA3BnB,CAAC,CAAG;;;;;;;;CAqCpB,SAAA;EACC,OAAO,CAAI;kCACqB,KAAK,UAAA,QAAkB,KAAK,QAAA;;;;;;CAM7D;AAAA;AAAA,EAAA,CA9BC,EAAQ,EAAE,SAAS,EAAA,CAAA,GACnB,EAAA,CAAA,GAAS,EAAA,WAAA,WAAA,KAAA,CAAA,GAAA,EAAA,CAUT,EAAS,EAAE,MAAM,OAAA,CAAA,CAAA,GAAQ,EAAA,WAAA,aAAA,KAAA,CAAA,GAAA,IAAA,EAAA,CA5B1B,EAAc,eAAA,CAAA,GAAe,CAAA;AAAA,SAAA,KAAA,GAAA,KAAA,GAAA,KAAA"}
1
+ {"version":3,"file":"list-BAwH0pQW.js","names":[],"sources":["../src/list/context.ts","../src/surface/context.ts","../src/list/list-item.ts","../src/list/list.ts"],"sourcesContent":["import { createContext } from '@lit/context'\nimport { TSurfaceColor } from '@schmancy/types/surface'\nexport const SchmancyListTypeContext = createContext<TSurfaceColor>(undefined)\n","import { createContext } from '@lit/context'\nimport { TSurfaceColor } from '@schmancy/types/surface'\nexport const SchmancySurfaceTypeContext = createContext<TSurfaceColor>('surface')\n","import { consume } from '@lit/context'\nimport { SchmancyElement } from '@mixins/index'\nimport { SchmancySurfaceTypeContext } from '@schmancy/surface/context'\nimport { TSurfaceColor } from '@schmancy/types/surface'\nimport { css, html } from 'lit'\nimport { customElement, property, queryAssignedElements } from 'lit/decorators.js'\n\n/**\n * @element schmancy-list-item\n * @slot leading - leading content\n * @slot trailing - trailing content\n * @slot - default content\n */\n@customElement('schmancy-list-item')\nexport class SchmancyListItem extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t\tborder-radius: 0.5rem;\n\t\ttransition:\n\t\t\tbackground 200ms ease,\n\t\t\tbox-shadow 300ms ease,\n\t\t\ttransform 200ms cubic-bezier(0.34, 1.56, 0.64, 1);\n\t}\n\t:host(:hover:not([readonly])) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-surface-on) 8%, transparent);\n\t\tbox-shadow: 0 2px 8px -4px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 10%, transparent);\n\t}\n\t:host(:active:not([readonly])) {\n\t\ttransform: scale(0.98);\n\t\ttransition-duration: 100ms;\n\t}\n\t:host([selected]) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-secondary-container) 30%, transparent);\n\t\tbox-shadow: 0 0 10px -3px color-mix(in srgb, var(--schmancy-sys-color-secondary-default) 12%, transparent);\n\t}\n\t@media (prefers-reduced-motion: reduce) {\n\t\t:host { transition: background 200ms ease; }\n\t\t:host(:active:not([readonly])) { transform: none; }\n\t}\n`];\n\t@consume({ context: SchmancySurfaceTypeContext, subscribe: true })\n\t@property()\n\tvariant: TSurfaceColor\n\n\t@property({ type: Boolean, reflect: true })\n\trounded: boolean\n\n\t@property({ type: Boolean, reflect: true }) readonly: boolean\n\n\t@property({ type: Boolean, reflect: true }) selected: boolean = false\n\n\t@queryAssignedElements({\n\t\tslot: 'leading',\n\t\tflatten: true,\n\t})\n\tprivate leading!: HTMLElement[]\n\n\t@queryAssignedElements({\n\t\tslot: 'trailing',\n\t\tflatten: true,\n\t})\n\tprivate trailing!: HTMLElement[]\n\n\tprotected get imgClasses(): string[] {\n\t\treturn ['h-4', 'w-4', 'sm:h-5', 'sm:w-5', 'object-contain']\n\t}\n\n\tfirstUpdated() {\n\t\tthis.leading?.forEach(img => {\n\t\t\timg.classList.add(...this.imgClasses)\n\t\t})\n\t\tthis.trailing?.forEach(img => {\n\t\t\timg.classList.add(...this.imgClasses)\n\t\t})\n\t}\n\n\trender() {\n\t\tconst classes = {\n\t\t\t'w-full flex items-center min-h-[36px] sm:min-h-[40px] py-1 px-2 sm:px-3 text-sm': true,\n\t\t\t'focus-visible:outline-solid focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:z-1 outline-secondary-default outline-hidden': true,\n\t\t\t'cursor-pointer': !this.readonly,\n\t\t}\n\n\t\treturn html`<li .tabIndex=${this.readonly ? -1 : 0} class=${this.classMap(classes)}>\n\t\t\t<slot></slot>\n\t\t</li>`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-list-item': SchmancyListItem\n\t}\n}\n","import { provide } from '@lit/context'\nimport { SchmancyElement } from '@mixins/index'\nimport { TSurfaceColor } from '@schmancy/types/surface'\nimport { css, html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { SchmancyListTypeContext } from './context'\n\n/**\n * `<schmancy-list>` component.\n *\n * A list component that wraps its content within a customizable surface.\n * It allows you to set the surface type and fill style, and can optionally\n * enable scrolling behavior by delegating the scroller attribute to the surface.\n *\n * @element schmancy-list\n * @slot - The default slot for list items.\n *\n * @example\n * <schmancy-list surface=\"container\" scroller>\n * <schmancy-list-item>List Item 1</schmancy-list-item>\n * </schmancy-list>\n */\n@customElement('schmancy-list')\nexport class List extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t\tpadding-top: 8px;\n\t\tpadding-bottom: 8px;\n\t}\n`];\n\t/**\n\t * Defines the type or color of the surface used by the component.\n\t * This value is provided to descendant components via context.\n\t *\n\t * @attr surface\n\t * @type {TSurfaceColor}\n\t * @default 'surface'\n\t */\n\t@provide({ context: SchmancyListTypeContext })\n\t@property()\n\tsurface: TSurfaceColor\n\n\t/**\n\t * Defines the elevation level of the surface.\n\t *\n\t * @attr elevation\n\t * @type {number}\n\t * @default 0\n\t */\n\t@property({ type: Number })\n\televation: 0 | 1 | 2 | 3 | 4 | 5 = 0\n\n\t/**\n\t * Renders the component's template.\n\t * The list content is wrapped inside a `<schmancy-surface>` element.\n\t * The scroller property is delegated to the surface so that it controls\n\t * the scrollable behavior.\n\t *\n\t * @returns The HTML template for the component.\n\t */\n\trender() {\n\t\treturn html`\n\t\t\t<schmancy-surface .elevation=${this.elevation} type=${this.surface}>\n\t\t\t\t<ul>\n\t\t\t\t\t<slot></slot>\n\t\t\t\t</ul>\n\t\t\t</schmancy-surface>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-list': List\n\t}\n}\n"],"mappings":";;;;;AAEA,IAAa,IAA0B,EAAA,KAA6B,CAAA,GCAvD,IAA6B,EAA6B,SAAA,GCYhE,IAAA,cAA+B,EAAA;CAAA,YAAA,GAAA,GAAA;EAAA,MAAA,GAAA,CAAA,GAAA,KAAA,WAAA,CAoC2B;CAAA;CAAA;EAAA,KAAA,SAnChD,CAAC,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiDpB,IAAA,aAAc;EACb,OAAO;GAAC;GAAO;GAAO;GAAU;GAAU;EAAA;CAC3C;CAEA,eAAA;EACC,KAAK,SAAS,SAAQ,MAAA;GACrB,EAAI,UAAU,IAAA,GAAO,KAAK,UAAA;EAAA,CAAA,GAE3B,KAAK,UAAU,SAAQ,MAAA;GACtB,EAAI,UAAU,IAAA,GAAO,KAAK,UAAA;EAAA,CAAA;CAE5B;CAEA,SAAA;EACC,IAAM,IAAU;GACf,mFAAA,CAAmF;GACnF,iJAAA,CAAiJ;GACjJ,kBAAA,CAAmB,KAAK;EAAA;EAGzB,OAAO,CAAI,iBAAiB,KAAK,WAAA,KAAgB,EAAA,SAAW,KAAK,SAAS,CAAA,EAAA;;;CAG3E;AAAA;AAAA,EAAA,CA9CC,EAAQ;CAAE,SAAS;CAA4B,WAAA,CAAW;AAAA,CAAA,GAC1D,EAAA,CAAA,GAAS,EAAA,WAAA,WAAA,KAAA,CAAA,GAAA,EAAA,CAGT,EAAS;CAAE,MAAM;CAAS,SAAA,CAAS;AAAA,CAAA,CAAA,GAAM,EAAA,WAAA,WAAA,KAAA,CAAA,GAAA,EAAA,CAGzC,EAAS;CAAE,MAAM;CAAS,SAAA,CAAS;AAAA,CAAA,CAAA,GAAM,EAAA,WAAA,YAAA,KAAA,CAAA,GAAA,EAAA,CAEzC,EAAS;CAAE,MAAM;CAAS,SAAA,CAAS;AAAA,CAAA,CAAA,GAAM,EAAA,WAAA,YAAA,KAAA,CAAA,GAAA,EAAA,CAEzC,EAAsB;CACtB,MAAM;CACN,SAAA,CAAS;AAAA,CAAA,CAAA,GACT,EAAA,WAAA,WAAA,KAAA,CAAA,GAAA,EAAA,CAGA,EAAsB;CACtB,MAAM;CACN,SAAA,CAAS;AAAA,CAAA,CAAA,GACT,EAAA,WAAA,YAAA,KAAA,CAAA,GAAA,IAAA,EAAA,CAhDD,EAAc,oBAAA,CAAA,GAAoB,CAAA;ACU5B,IAAA,IAAA,cAAmB,EAAA;CAAA,YAAA,GAAA,GAAA;EAAA,MAAA,GAAA,CAAA,GAAA,KAAA,YA4BU;CAAA;CAAA;EAAA,KAAA,SA3BnB,CAAC,CAAG;;;;;;;;CAqCpB,SAAA;EACC,OAAO,CAAI;kCACqB,KAAK,UAAA,QAAkB,KAAK,QAAA;;;;;;CAM7D;AAAA;AAAA,EAAA,CA9BC,EAAQ,EAAE,SAAS,EAAA,CAAA,GACnB,EAAA,CAAA,GAAS,EAAA,WAAA,WAAA,KAAA,CAAA,GAAA,EAAA,CAUT,EAAS,EAAE,MAAM,OAAA,CAAA,CAAA,GAAQ,EAAA,WAAA,aAAA,KAAA,CAAA,GAAA,IAAA,EAAA,CA5B1B,EAAc,eAAA,CAAA,GAAe,CAAA;AAAA,SAAA,KAAA,GAAA,KAAA,GAAA,KAAA"}
@@ -1,4 +1,4 @@
1
- require(`./chunk-CncqDLb2.cjs`);const e=require(`./SchmancyElement-D8_z9JrW.cjs`);require(`./mixins-JyO9GSGy.cjs`);let t=require(`@lit/context`),n=require(`lit/decorators.js`),r=require(`lit`);var i=(0,t.createContext)(void 0),a=(0,t.createContext)(`surface`),o=class extends e.t{constructor(...e){super(...e),this.selected=!1}static{this.styles=[r.css`
1
+ require(`./chunk-CncqDLb2.cjs`);const e=require(`./SchmancyElement-CYIif26I.cjs`);require(`./mixins-CGXSzZc7.cjs`);let t=require(`@lit/context`),n=require(`lit/decorators.js`),r=require(`lit`);var i=(0,t.createContext)(void 0),a=(0,t.createContext)(`surface`),o=class extends e.t{constructor(...e){super(...e),this.selected=!1}static{this.styles=[r.css`
2
2
  :host {
3
3
  display: block;
4
4
  border-radius: 0.5rem;
@@ -1 +1 @@
1
- {"version":3,"file":"list-JjUsFCP6.cjs","names":[],"sources":["../src/list/context.ts","../src/surface/context.ts","../src/list/list-item.ts","../src/list/list.ts"],"sourcesContent":["import { createContext } from '@lit/context'\nimport { TSurfaceColor } from '@schmancy/types/surface'\nexport const SchmancyListTypeContext = createContext<TSurfaceColor>(undefined)\n","import { createContext } from '@lit/context'\nimport { TSurfaceColor } from '@schmancy/types/surface'\nexport const SchmancySurfaceTypeContext = createContext<TSurfaceColor>('surface')\n","import { consume } from '@lit/context'\nimport { SchmancyElement } from '@mixins/index'\nimport { SchmancySurfaceTypeContext } from '@schmancy/surface/context'\nimport { TSurfaceColor } from '@schmancy/types/surface'\nimport { css, html } from 'lit'\nimport { customElement, property, queryAssignedElements } from 'lit/decorators.js'\n\n/**\n * @element schmancy-list-item\n * @slot leading - leading content\n * @slot trailing - trailing content\n * @slot - default content\n */\n@customElement('schmancy-list-item')\nexport class SchmancyListItem extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t\tborder-radius: 0.5rem;\n\t\ttransition:\n\t\t\tbackground 200ms ease,\n\t\t\tbox-shadow 300ms ease,\n\t\t\ttransform 200ms cubic-bezier(0.34, 1.56, 0.64, 1);\n\t}\n\t:host(:hover:not([readonly])) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-surface-on) 8%, transparent);\n\t\tbox-shadow: 0 2px 8px -4px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 10%, transparent);\n\t}\n\t:host(:active:not([readonly])) {\n\t\ttransform: scale(0.98);\n\t\ttransition-duration: 100ms;\n\t}\n\t:host([selected]) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-secondary-container) 30%, transparent);\n\t\tbox-shadow: 0 0 10px -3px color-mix(in srgb, var(--schmancy-sys-color-secondary-default) 12%, transparent);\n\t}\n\t@media (prefers-reduced-motion: reduce) {\n\t\t:host { transition: background 200ms ease; }\n\t\t:host(:active:not([readonly])) { transform: none; }\n\t}\n`];\n\t@consume({ context: SchmancySurfaceTypeContext, subscribe: true })\n\t@property()\n\tvariant: TSurfaceColor\n\n\t@property({ type: Boolean, reflect: true })\n\trounded: boolean\n\n\t@property({ type: Boolean, reflect: true }) readonly: boolean\n\n\t@property({ type: Boolean, reflect: true }) selected: boolean = false\n\n\t@queryAssignedElements({\n\t\tslot: 'leading',\n\t\tflatten: true,\n\t})\n\tprivate leading!: HTMLElement[]\n\n\t@queryAssignedElements({\n\t\tslot: 'trailing',\n\t\tflatten: true,\n\t})\n\tprivate trailing!: HTMLElement[]\n\n\tprotected get imgClasses(): string[] {\n\t\treturn ['h-4', 'w-4', 'sm:h-5', 'sm:w-5', 'object-contain']\n\t}\n\n\tfirstUpdated() {\n\t\tthis.leading?.forEach(img => {\n\t\t\timg.classList.add(...this.imgClasses)\n\t\t})\n\t\tthis.trailing?.forEach(img => {\n\t\t\timg.classList.add(...this.imgClasses)\n\t\t})\n\t}\n\n\trender() {\n\t\tconst classes = {\n\t\t\t'w-full flex items-center min-h-[36px] sm:min-h-[40px] py-1 px-2 sm:px-3 text-sm': true,\n\t\t\t'focus-visible:outline-solid focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:z-1 outline-secondary-default outline-hidden': true,\n\t\t\t'cursor-pointer': !this.readonly,\n\t\t}\n\n\t\treturn html`<li .tabIndex=${this.readonly ? -1 : 0} class=${this.classMap(classes)}>\n\t\t\t<slot></slot>\n\t\t</li>`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-list-item': SchmancyListItem\n\t}\n}\n","import { provide } from '@lit/context'\nimport { SchmancyElement } from '@mixins/index'\nimport { TSurfaceColor } from '@schmancy/types/surface'\nimport { css, html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { SchmancyListTypeContext } from './context'\n\n/**\n * `<schmancy-list>` component.\n *\n * A list component that wraps its content within a customizable surface.\n * It allows you to set the surface type and fill style, and can optionally\n * enable scrolling behavior by delegating the scroller attribute to the surface.\n *\n * @element schmancy-list\n * @slot - The default slot for list items.\n *\n * @example\n * <schmancy-list surface=\"container\" scroller>\n * <schmancy-list-item>List Item 1</schmancy-list-item>\n * </schmancy-list>\n */\n@customElement('schmancy-list')\nexport class List extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t\tpadding-top: 8px;\n\t\tpadding-bottom: 8px;\n\t}\n`];\n\t/**\n\t * Defines the type or color of the surface used by the component.\n\t * This value is provided to descendant components via context.\n\t *\n\t * @attr surface\n\t * @type {TSurfaceColor}\n\t * @default 'surface'\n\t */\n\t@provide({ context: SchmancyListTypeContext })\n\t@property()\n\tsurface: TSurfaceColor\n\n\t/**\n\t * Defines the elevation level of the surface.\n\t *\n\t * @attr elevation\n\t * @type {number}\n\t * @default 0\n\t */\n\t@property({ type: Number })\n\televation: 0 | 1 | 2 | 3 | 4 | 5 = 0\n\n\t/**\n\t * Renders the component's template.\n\t * The list content is wrapped inside a `<schmancy-surface>` element.\n\t * The scroller property is delegated to the surface so that it controls\n\t * the scrollable behavior.\n\t *\n\t * @returns The HTML template for the component.\n\t */\n\trender() {\n\t\treturn html`\n\t\t\t<schmancy-surface .elevation=${this.elevation} type=${this.surface}>\n\t\t\t\t<ul>\n\t\t\t\t\t<slot></slot>\n\t\t\t\t</ul>\n\t\t\t</schmancy-surface>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-list': List\n\t}\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"list-Bs9m8kw7.cjs","names":[],"sources":["../src/list/context.ts","../src/surface/context.ts","../src/list/list-item.ts","../src/list/list.ts"],"sourcesContent":["import { createContext } from '@lit/context'\nimport { TSurfaceColor } from '@schmancy/types/surface'\nexport const SchmancyListTypeContext = createContext<TSurfaceColor>(undefined)\n","import { createContext } from '@lit/context'\nimport { TSurfaceColor } from '@schmancy/types/surface'\nexport const SchmancySurfaceTypeContext = createContext<TSurfaceColor>('surface')\n","import { consume } from '@lit/context'\nimport { SchmancyElement } from '@mixins/index'\nimport { SchmancySurfaceTypeContext } from '@schmancy/surface/context'\nimport { TSurfaceColor } from '@schmancy/types/surface'\nimport { css, html } from 'lit'\nimport { customElement, property, queryAssignedElements } from 'lit/decorators.js'\n\n/**\n * @element schmancy-list-item\n * @slot leading - leading content\n * @slot trailing - trailing content\n * @slot - default content\n */\n@customElement('schmancy-list-item')\nexport class SchmancyListItem extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t\tborder-radius: 0.5rem;\n\t\ttransition:\n\t\t\tbackground 200ms ease,\n\t\t\tbox-shadow 300ms ease,\n\t\t\ttransform 200ms cubic-bezier(0.34, 1.56, 0.64, 1);\n\t}\n\t:host(:hover:not([readonly])) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-surface-on) 8%, transparent);\n\t\tbox-shadow: 0 2px 8px -4px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 10%, transparent);\n\t}\n\t:host(:active:not([readonly])) {\n\t\ttransform: scale(0.98);\n\t\ttransition-duration: 100ms;\n\t}\n\t:host([selected]) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-secondary-container) 30%, transparent);\n\t\tbox-shadow: 0 0 10px -3px color-mix(in srgb, var(--schmancy-sys-color-secondary-default) 12%, transparent);\n\t}\n\t@media (prefers-reduced-motion: reduce) {\n\t\t:host { transition: background 200ms ease; }\n\t\t:host(:active:not([readonly])) { transform: none; }\n\t}\n`];\n\t@consume({ context: SchmancySurfaceTypeContext, subscribe: true })\n\t@property()\n\tvariant: TSurfaceColor\n\n\t@property({ type: Boolean, reflect: true })\n\trounded: boolean\n\n\t@property({ type: Boolean, reflect: true }) readonly: boolean\n\n\t@property({ type: Boolean, reflect: true }) selected: boolean = false\n\n\t@queryAssignedElements({\n\t\tslot: 'leading',\n\t\tflatten: true,\n\t})\n\tprivate leading!: HTMLElement[]\n\n\t@queryAssignedElements({\n\t\tslot: 'trailing',\n\t\tflatten: true,\n\t})\n\tprivate trailing!: HTMLElement[]\n\n\tprotected get imgClasses(): string[] {\n\t\treturn ['h-4', 'w-4', 'sm:h-5', 'sm:w-5', 'object-contain']\n\t}\n\n\tfirstUpdated() {\n\t\tthis.leading?.forEach(img => {\n\t\t\timg.classList.add(...this.imgClasses)\n\t\t})\n\t\tthis.trailing?.forEach(img => {\n\t\t\timg.classList.add(...this.imgClasses)\n\t\t})\n\t}\n\n\trender() {\n\t\tconst classes = {\n\t\t\t'w-full flex items-center min-h-[36px] sm:min-h-[40px] py-1 px-2 sm:px-3 text-sm': true,\n\t\t\t'focus-visible:outline-solid focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:z-1 outline-secondary-default outline-hidden': true,\n\t\t\t'cursor-pointer': !this.readonly,\n\t\t}\n\n\t\treturn html`<li .tabIndex=${this.readonly ? -1 : 0} class=${this.classMap(classes)}>\n\t\t\t<slot></slot>\n\t\t</li>`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-list-item': SchmancyListItem\n\t}\n}\n","import { provide } from '@lit/context'\nimport { SchmancyElement } from '@mixins/index'\nimport { TSurfaceColor } from '@schmancy/types/surface'\nimport { css, html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { SchmancyListTypeContext } from './context'\n\n/**\n * `<schmancy-list>` component.\n *\n * A list component that wraps its content within a customizable surface.\n * It allows you to set the surface type and fill style, and can optionally\n * enable scrolling behavior by delegating the scroller attribute to the surface.\n *\n * @element schmancy-list\n * @slot - The default slot for list items.\n *\n * @example\n * <schmancy-list surface=\"container\" scroller>\n * <schmancy-list-item>List Item 1</schmancy-list-item>\n * </schmancy-list>\n */\n@customElement('schmancy-list')\nexport class List extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t\tpadding-top: 8px;\n\t\tpadding-bottom: 8px;\n\t}\n`];\n\t/**\n\t * Defines the type or color of the surface used by the component.\n\t * This value is provided to descendant components via context.\n\t *\n\t * @attr surface\n\t * @type {TSurfaceColor}\n\t * @default 'surface'\n\t */\n\t@provide({ context: SchmancyListTypeContext })\n\t@property()\n\tsurface: TSurfaceColor\n\n\t/**\n\t * Defines the elevation level of the surface.\n\t *\n\t * @attr elevation\n\t * @type {number}\n\t * @default 0\n\t */\n\t@property({ type: Number })\n\televation: 0 | 1 | 2 | 3 | 4 | 5 = 0\n\n\t/**\n\t * Renders the component's template.\n\t * The list content is wrapped inside a `<schmancy-surface>` element.\n\t * The scroller property is delegated to the surface so that it controls\n\t * the scrollable behavior.\n\t *\n\t * @returns The HTML template for the component.\n\t */\n\trender() {\n\t\treturn html`\n\t\t\t<schmancy-surface .elevation=${this.elevation} type=${this.surface}>\n\t\t\t\t<ul>\n\t\t\t\t\t<slot></slot>\n\t\t\t\t</ul>\n\t\t\t</schmancy-surface>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-list': List\n\t}\n}\n"],"mappings":"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"}
package/dist/list.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./list-JjUsFCP6.cjs`);Object.defineProperty(exports,`List`,{enumerable:!0,get:function(){return e.t}}),Object.defineProperty(exports,`SchmancyListItem`,{enumerable:!0,get:function(){return e.n}}),exports.SchmancyListTypeContext=e.r;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./list-Bs9m8kw7.cjs`);Object.defineProperty(exports,`List`,{enumerable:!0,get:function(){return e.t}}),Object.defineProperty(exports,`SchmancyListItem`,{enumerable:!0,get:function(){return e.n}}),exports.SchmancyListTypeContext=e.r;
package/dist/list.js CHANGED
@@ -1,2 +1,2 @@
1
- import { n as e, r as t, t as n } from "./list-DzAWv99q.js";
1
+ import { n as e, r as t, t as n } from "./list-BAwH0pQW.js";
2
2
  export { n as List, e as SchmancyListItem, t as SchmancyListTypeContext };
@@ -1,4 +1,4 @@
1
- require(`./chunk-CncqDLb2.cjs`);const e=require(`./SchmancyElement-D8_z9JrW.cjs`);require(`./mixins-JyO9GSGy.cjs`);const t=require(`./overlay.service-CC4zckoV.cjs`);let n=require(`rxjs`),r=require(`lit/decorators.js`),i=require(`lit`);var a=class extends e.t{constructor(...e){super(...e),this.dismissParentMenu=()=>{this.dispatchEvent(new CustomEvent(`close`,{bubbles:!0,composed:!0}))}}static{this.styles=[i.css`
1
+ require(`./chunk-CncqDLb2.cjs`);const e=require(`./SchmancyElement-CYIif26I.cjs`);require(`./mixins-CGXSzZc7.cjs`);const t=require(`./overlay.service-C8RsQzgM.cjs`);let n=require(`rxjs`),r=require(`lit/decorators.js`),i=require(`lit`);var a=class extends e.t{constructor(...e){super(...e),this.dismissParentMenu=()=>{this.dispatchEvent(new CustomEvent(`close`,{bubbles:!0,composed:!0}))}}static{this.styles=[i.css`
2
2
  :host {
3
3
  display: block;
4
4
  }
@@ -1 +1 @@
1
- {"version":3,"file":"menu-B5EKUeeD.cjs","names":[],"sources":["../src/menu/menu-item.ts","../src/menu/menu.ts"],"sourcesContent":["import { SchmancyElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement } from 'lit/decorators.js'\n\n@customElement('schmancy-menu-item')\nexport default class SchmancyMenuItem extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t}\n`]\n\n\tprivate dismissParentMenu = (): void => {\n\t\t// Bubbling 'close' is the protocol the overlay `show()` watches; the\n\t\t// enclosing `<schmancy-menu>` opens the menu via `show()` and this\n\t\t// completes the subscription, so the overlay tears itself down.\n\t\tthis.dispatchEvent(new CustomEvent('close', { bubbles: true, composed: true }))\n\t}\n\n\tprotected render(): unknown {\n\t\treturn html`\n\t\t\t<schmancy-list-item @click=${this.dismissParentMenu}>\n\t\t\t\t<slot></slot>\n\t\t\t</schmancy-list-item>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-menu-item': SchmancyMenuItem\n\t}\n}\n","import { SchmancyElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement, query } from 'lit/decorators.js'\nimport { takeUntil } from 'rxjs'\nimport { show } from '../overlay/overlay.service'\n\n/**\n * Menu Component\n *\n * The overlay renders ONLY the raw menu items passed via the default slot.\n * NO <ul> wrapper, NO classes, NO additional markup. The overlay system\n * handles positioning (anchored at the trigger click) and dismissal.\n *\n * @example Basic menu with auto-dismiss\n * ```typescript\n * <schmancy-menu>\n * <schmancy-button slot=\"trigger\">Actions</schmancy-button>\n * <schmancy-menu-item @click=${() => editItem()}>Edit</schmancy-menu-item>\n * <schmancy-menu-item @click=${() => deleteItem()}>Delete</schmancy-menu-item>\n * </schmancy-menu>\n * ```\n * Note: `<schmancy-menu-item>` dispatches a bubbling 'close' event on click;\n * the overlay `show()` observable completes and the menu tears down.\n *\n * @example Custom component (manual dismiss)\n * ```typescript\n * <schmancy-menu>\n * <schmancy-icon-button slot=\"trigger\">settings</schmancy-icon-button>\n * <my-settings-form\n * @submit=${(e) => e.target.dispatchEvent(new CustomEvent('close', { bubbles: true, composed: true }))}\n * ></my-settings-form>\n * </schmancy-menu>\n * ```\n *\n * @slot trigger - Button to open menu (new naming)\n * @slot button - Button to open menu (backward compatible)\n * @slot default - Menu items or any custom component to display in the overlay\n */\n@customElement('schmancy-menu')\nexport default class SchmancyMenu extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tposition: relative;\n\t\tdisplay: flex;\n\t}\n`]\n\n\t@query('slot:not([name])')\n\tprivate menuSlot!: HTMLSlotElement\n\n\tprivate showMenu = (event: MouseEvent): void => {\n\t\tconst menuItems = this.menuSlot?.assignedElements() || []\n\t\tif (menuItems.length === 0) return\n\n\t\t// Move slot items into a fresh container so the overlay can adopt them\n\t\t// without leaving stale references in our shadow tree. The overlay\n\t\t// surface no longer ships padding, so the wrapper owns its breathing\n\t\t// room — menu items shouldn't collide with the surface edge.\n\t\tconst overlayContainer = document.createElement('div')\n\t\toverlayContainer.style.padding = '0.5rem'\n\t\tmenuItems.forEach(item => overlayContainer.appendChild(item))\n\n\t\t// Anchor at the click so the overlay system positions the menu\n\t\t// adjacent to the trigger; subscription completion (any dismissal —\n\t\t// item click → bubbling 'close', backdrop, Esc, disconnect) restores\n\t\t// the items as light DOM so the next open re-projects them.\n\t\tshow(overlayContainer, { anchor: event })\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe({\n\t\t\t\tcomplete: () => menuItems.forEach(item => this.appendChild(item)),\n\t\t\t})\n\t}\n\n\trender() {\n\t\treturn html`\n\t\t\t<slot name=\"trigger\" @click=${this.showMenu}>\n\t\t\t\t<slot name=\"button\" @click=${this.showMenu}>\n\t\t\t\t\t<schmancy-icon-button>more_vert</schmancy-icon-button>\n\t\t\t\t</slot>\n\t\t\t</slot>\n\t\t\t<div hidden>\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-menu': SchmancyMenu\n\t}\n}\n"],"mappings":"2OAKe,IAAA,EAAA,cAA+B,EAAA,CAAA,CAAA,YAAA,GAAA,EAAA,CAAA,MAAA,GAAA,CAAA,EAAA,KAAA,sBAAA,CAW5C,KAAK,cAAc,IAAI,YAAY,QAAS,CAAE,QAAA,CAAS,EAAM,SAAA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,KAAA,OAVxD,CAAC,EAAA,GAAG;;;;GAapB,QAAA,CACC,MAAO,GAAA,IAAI;gCACmB,KAAK,kBAAA;;;GAIpC,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eArBc,oBAAA,CAAA,EAAoB,CAAA,ECmCpB,IAAA,EAAA,cAA2B,EAAA,CAAA,CAAA,YAAA,GAAA,EAAA,CAAA,MAAA,GAAA,CAAA,EAAA,KAAA,SAWrB,GAAA,CACnB,IAAM,EAAY,KAAK,UAAU,iBAAA,GAAsB,CAAA,EACvD,GAAI,EAAU,SAAW,EAAG,OAM5B,IAAM,EAAmB,SAAS,cAAc,KAAA,EAChD,EAAiB,MAAM,QAAU,SACjC,EAAU,QAAQ,GAAQ,EAAiB,YAAY,CAAA,CAAA,EAMvD,EAAA,EAAK,EAAkB,CAAE,OAAQ,CAAA,CAAA,EAC/B,MAAA,EAAA,EAAA,WAAe,KAAK,aAAA,CAAA,EACpB,UAAU,CACV,aAAgB,EAAU,QAAQ,GAAQ,KAAK,YAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,KAAA,OA7B9C,CAAC,EAAA,GAAG;;;;;GAiCpB,QAAA,CACC,MAAO,GAAA,IAAI;iCACoB,KAAK,SAAA;iCACL,KAAK,SAAA;;;;;;;GAQrC,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OArCO,kBAAA,CAAA,EAAkB,EAAA,UAAA,WAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eATX,eAAA,CAAA,EAAe,CAAA"}
1
+ {"version":3,"file":"menu-BMcGzj1h.cjs","names":[],"sources":["../src/menu/menu-item.ts","../src/menu/menu.ts"],"sourcesContent":["import { SchmancyElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement } from 'lit/decorators.js'\n\n@customElement('schmancy-menu-item')\nexport default class SchmancyMenuItem extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t}\n`]\n\n\tprivate dismissParentMenu = (): void => {\n\t\t// Bubbling 'close' is the protocol the overlay `show()` watches; the\n\t\t// enclosing `<schmancy-menu>` opens the menu via `show()` and this\n\t\t// completes the subscription, so the overlay tears itself down.\n\t\tthis.dispatchEvent(new CustomEvent('close', { bubbles: true, composed: true }))\n\t}\n\n\tprotected render(): unknown {\n\t\treturn html`\n\t\t\t<schmancy-list-item @click=${this.dismissParentMenu}>\n\t\t\t\t<slot></slot>\n\t\t\t</schmancy-list-item>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-menu-item': SchmancyMenuItem\n\t}\n}\n","import { SchmancyElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement, query } from 'lit/decorators.js'\nimport { takeUntil } from 'rxjs'\nimport { show } from '../overlay/overlay.service'\n\n/**\n * Menu Component\n *\n * The overlay renders ONLY the raw menu items passed via the default slot.\n * NO <ul> wrapper, NO classes, NO additional markup. The overlay system\n * handles positioning (anchored at the trigger click) and dismissal.\n *\n * @example Basic menu with auto-dismiss\n * ```typescript\n * <schmancy-menu>\n * <schmancy-button slot=\"trigger\">Actions</schmancy-button>\n * <schmancy-menu-item @click=${() => editItem()}>Edit</schmancy-menu-item>\n * <schmancy-menu-item @click=${() => deleteItem()}>Delete</schmancy-menu-item>\n * </schmancy-menu>\n * ```\n * Note: `<schmancy-menu-item>` dispatches a bubbling 'close' event on click;\n * the overlay `show()` observable completes and the menu tears down.\n *\n * @example Custom component (manual dismiss)\n * ```typescript\n * <schmancy-menu>\n * <schmancy-icon-button slot=\"trigger\">settings</schmancy-icon-button>\n * <my-settings-form\n * @submit=${(e) => e.target.dispatchEvent(new CustomEvent('close', { bubbles: true, composed: true }))}\n * ></my-settings-form>\n * </schmancy-menu>\n * ```\n *\n * @slot trigger - Button to open menu (new naming)\n * @slot button - Button to open menu (backward compatible)\n * @slot default - Menu items or any custom component to display in the overlay\n */\n@customElement('schmancy-menu')\nexport default class SchmancyMenu extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tposition: relative;\n\t\tdisplay: flex;\n\t}\n`]\n\n\t@query('slot:not([name])')\n\tprivate menuSlot!: HTMLSlotElement\n\n\tprivate showMenu = (event: MouseEvent): void => {\n\t\tconst menuItems = this.menuSlot?.assignedElements() || []\n\t\tif (menuItems.length === 0) return\n\n\t\t// Move slot items into a fresh container so the overlay can adopt them\n\t\t// without leaving stale references in our shadow tree. The overlay\n\t\t// surface no longer ships padding, so the wrapper owns its breathing\n\t\t// room — menu items shouldn't collide with the surface edge.\n\t\tconst overlayContainer = document.createElement('div')\n\t\toverlayContainer.style.padding = '0.5rem'\n\t\tmenuItems.forEach(item => overlayContainer.appendChild(item))\n\n\t\t// Anchor at the click so the overlay system positions the menu\n\t\t// adjacent to the trigger; subscription completion (any dismissal —\n\t\t// item click → bubbling 'close', backdrop, Esc, disconnect) restores\n\t\t// the items as light DOM so the next open re-projects them.\n\t\tshow(overlayContainer, { anchor: event })\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe({\n\t\t\t\tcomplete: () => menuItems.forEach(item => this.appendChild(item)),\n\t\t\t})\n\t}\n\n\trender() {\n\t\treturn html`\n\t\t\t<slot name=\"trigger\" @click=${this.showMenu}>\n\t\t\t\t<slot name=\"button\" @click=${this.showMenu}>\n\t\t\t\t\t<schmancy-icon-button>more_vert</schmancy-icon-button>\n\t\t\t\t</slot>\n\t\t\t</slot>\n\t\t\t<div hidden>\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-menu': SchmancyMenu\n\t}\n}\n"],"mappings":"2OAKe,IAAA,EAAA,cAA+B,EAAA,CAAA,CAAA,YAAA,GAAA,EAAA,CAAA,MAAA,GAAA,CAAA,EAAA,KAAA,sBAAA,CAW5C,KAAK,cAAc,IAAI,YAAY,QAAS,CAAE,QAAA,CAAS,EAAM,SAAA,CAAU,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,KAAA,OAVxD,CAAC,EAAA,GAAG;;;;GAapB,QAAA,CACC,MAAO,GAAA,IAAI;gCACmB,KAAK,kBAAA;;;GAIpC,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eArBc,oBAAA,CAAA,EAAoB,CAAA,ECmCpB,IAAA,EAAA,cAA2B,EAAA,CAAA,CAAA,YAAA,GAAA,EAAA,CAAA,MAAA,GAAA,CAAA,EAAA,KAAA,SAWrB,GAAA,CACnB,IAAM,EAAY,KAAK,UAAU,iBAAA,GAAsB,CAAA,EACvD,GAAI,EAAU,SAAW,EAAG,OAM5B,IAAM,EAAmB,SAAS,cAAc,KAAA,EAChD,EAAiB,MAAM,QAAU,SACjC,EAAU,QAAQ,GAAQ,EAAiB,YAAY,CAAA,CAAA,EAMvD,EAAA,EAAK,EAAkB,CAAE,OAAQ,CAAA,CAAA,EAC/B,MAAA,EAAA,EAAA,WAAe,KAAK,aAAA,CAAA,EACpB,UAAU,CACV,aAAgB,EAAU,QAAQ,GAAQ,KAAK,YAAY,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,KAAA,OA7B9C,CAAC,EAAA,GAAG;;;;;GAiCpB,QAAA,CACC,MAAO,GAAA,IAAI;iCACoB,KAAK,SAAA;iCACL,KAAK,SAAA;;;;;;;GAQrC,CAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OArCO,kBAAA,CAAA,EAAkB,EAAA,UAAA,WAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,eATX,eAAA,CAAA,EAAe,CAAA"}
@@ -1,6 +1,6 @@
1
- import { t as e, u as t } from "./SchmancyElement-DuzT2AMa.js";
2
- import "./mixins-Cevarn7V.js";
3
- import { o as n } from "./overlay.service-zx465FI8.js";
1
+ import { t as e, u as t } from "./SchmancyElement-CA0Wqt8m.js";
2
+ import "./mixins-Bp0wIHg2.js";
3
+ import { o as n } from "./overlay.service-DTE6NwIM.js";
4
4
  import { takeUntil as r } from "rxjs";
5
5
  import { customElement as i, query as a } from "lit/decorators.js";
6
6
  import { css as o, html as s } from "lit";
@@ -1 +1 @@
1
- {"version":3,"file":"menu-CgdXrzir.js","names":[],"sources":["../src/menu/menu-item.ts","../src/menu/menu.ts"],"sourcesContent":["import { SchmancyElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement } from 'lit/decorators.js'\n\n@customElement('schmancy-menu-item')\nexport default class SchmancyMenuItem extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t}\n`]\n\n\tprivate dismissParentMenu = (): void => {\n\t\t// Bubbling 'close' is the protocol the overlay `show()` watches; the\n\t\t// enclosing `<schmancy-menu>` opens the menu via `show()` and this\n\t\t// completes the subscription, so the overlay tears itself down.\n\t\tthis.dispatchEvent(new CustomEvent('close', { bubbles: true, composed: true }))\n\t}\n\n\tprotected render(): unknown {\n\t\treturn html`\n\t\t\t<schmancy-list-item @click=${this.dismissParentMenu}>\n\t\t\t\t<slot></slot>\n\t\t\t</schmancy-list-item>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-menu-item': SchmancyMenuItem\n\t}\n}\n","import { SchmancyElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement, query } from 'lit/decorators.js'\nimport { takeUntil } from 'rxjs'\nimport { show } from '../overlay/overlay.service'\n\n/**\n * Menu Component\n *\n * The overlay renders ONLY the raw menu items passed via the default slot.\n * NO <ul> wrapper, NO classes, NO additional markup. The overlay system\n * handles positioning (anchored at the trigger click) and dismissal.\n *\n * @example Basic menu with auto-dismiss\n * ```typescript\n * <schmancy-menu>\n * <schmancy-button slot=\"trigger\">Actions</schmancy-button>\n * <schmancy-menu-item @click=${() => editItem()}>Edit</schmancy-menu-item>\n * <schmancy-menu-item @click=${() => deleteItem()}>Delete</schmancy-menu-item>\n * </schmancy-menu>\n * ```\n * Note: `<schmancy-menu-item>` dispatches a bubbling 'close' event on click;\n * the overlay `show()` observable completes and the menu tears down.\n *\n * @example Custom component (manual dismiss)\n * ```typescript\n * <schmancy-menu>\n * <schmancy-icon-button slot=\"trigger\">settings</schmancy-icon-button>\n * <my-settings-form\n * @submit=${(e) => e.target.dispatchEvent(new CustomEvent('close', { bubbles: true, composed: true }))}\n * ></my-settings-form>\n * </schmancy-menu>\n * ```\n *\n * @slot trigger - Button to open menu (new naming)\n * @slot button - Button to open menu (backward compatible)\n * @slot default - Menu items or any custom component to display in the overlay\n */\n@customElement('schmancy-menu')\nexport default class SchmancyMenu extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tposition: relative;\n\t\tdisplay: flex;\n\t}\n`]\n\n\t@query('slot:not([name])')\n\tprivate menuSlot!: HTMLSlotElement\n\n\tprivate showMenu = (event: MouseEvent): void => {\n\t\tconst menuItems = this.menuSlot?.assignedElements() || []\n\t\tif (menuItems.length === 0) return\n\n\t\t// Move slot items into a fresh container so the overlay can adopt them\n\t\t// without leaving stale references in our shadow tree. The overlay\n\t\t// surface no longer ships padding, so the wrapper owns its breathing\n\t\t// room — menu items shouldn't collide with the surface edge.\n\t\tconst overlayContainer = document.createElement('div')\n\t\toverlayContainer.style.padding = '0.5rem'\n\t\tmenuItems.forEach(item => overlayContainer.appendChild(item))\n\n\t\t// Anchor at the click so the overlay system positions the menu\n\t\t// adjacent to the trigger; subscription completion (any dismissal —\n\t\t// item click → bubbling 'close', backdrop, Esc, disconnect) restores\n\t\t// the items as light DOM so the next open re-projects them.\n\t\tshow(overlayContainer, { anchor: event })\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe({\n\t\t\t\tcomplete: () => menuItems.forEach(item => this.appendChild(item)),\n\t\t\t})\n\t}\n\n\trender() {\n\t\treturn html`\n\t\t\t<slot name=\"trigger\" @click=${this.showMenu}>\n\t\t\t\t<slot name=\"button\" @click=${this.showMenu}>\n\t\t\t\t\t<schmancy-icon-button>more_vert</schmancy-icon-button>\n\t\t\t\t</slot>\n\t\t\t</slot>\n\t\t\t<div hidden>\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-menu': SchmancyMenu\n\t}\n}\n"],"mappings":";;;;;;AAKe,IAAA,IAAA,cAA+B,EAAA;CAAA,YAAA,GAAA,GAAA;EAAA,MAAA,GAAA,CAAA,GAAA,KAAA,0BAAA;GAW5C,KAAK,cAAc,IAAI,YAAY,SAAS;IAAE,SAAA,CAAS;IAAM,UAAA,CAAU;GAAA,CAAA,CAAA;EAAA;CAAA;CAAA;EAAA,KAAA,SAVxD,CAAC,CAAG;;;;;;CAapB,SAAA;EACC,OAAO,CAAI;gCACmB,KAAK,kBAAA;;;;CAIpC;AAAA;AAAA,IAAA,EAAA,CArBA,EAAc,oBAAA,CAAA,GAAoB,CAAA;ACmCpB,IAAA,IAAA,cAA2B,EAAA;CAAA,YAAA,GAAA,GAAA;EAAA,MAAA,GAAA,CAAA,GAAA,KAAA,YAWrB,MAAA;GACnB,IAAM,IAAY,KAAK,UAAU,iBAAA,KAAsB,CAAA;GACvD,IAAI,EAAU,WAAW,GAAG;GAM5B,IAAM,IAAmB,SAAS,cAAc,KAAA;GAChD,EAAiB,MAAM,UAAU,UACjC,EAAU,SAAQ,MAAQ,EAAiB,YAAY,CAAA,CAAA,GAMvD,EAAK,GAAkB,EAAE,QAAQ,EAAA,CAAA,EAC/B,KAAK,EAAU,KAAK,aAAA,CAAA,EACpB,UAAU,EACV,gBAAgB,EAAU,SAAQ,MAAQ,KAAK,YAAY,CAAA,CAAA,EAAA,CAAA;EAAA;CAAA;CAAA;EAAA,KAAA,SA7B9C,CAAC,CAAG;;;;;;;CAiCpB,SAAA;EACC,OAAO,CAAI;iCACoB,KAAK,SAAA;iCACL,KAAK,SAAA;;;;;;;;CAQrC;AAAA;AAAA,EAAA,CArCC,EAAM,kBAAA,CAAA,GAAkB,EAAA,WAAA,YAAA,KAAA,CAAA,GAAA,IAAA,EAAA,CATzB,EAAc,eAAA,CAAA,GAAe,CAAA"}
1
+ {"version":3,"file":"menu-tQVARVaC.js","names":[],"sources":["../src/menu/menu-item.ts","../src/menu/menu.ts"],"sourcesContent":["import { SchmancyElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement } from 'lit/decorators.js'\n\n@customElement('schmancy-menu-item')\nexport default class SchmancyMenuItem extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tdisplay: block;\n\t}\n`]\n\n\tprivate dismissParentMenu = (): void => {\n\t\t// Bubbling 'close' is the protocol the overlay `show()` watches; the\n\t\t// enclosing `<schmancy-menu>` opens the menu via `show()` and this\n\t\t// completes the subscription, so the overlay tears itself down.\n\t\tthis.dispatchEvent(new CustomEvent('close', { bubbles: true, composed: true }))\n\t}\n\n\tprotected render(): unknown {\n\t\treturn html`\n\t\t\t<schmancy-list-item @click=${this.dismissParentMenu}>\n\t\t\t\t<slot></slot>\n\t\t\t</schmancy-list-item>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-menu-item': SchmancyMenuItem\n\t}\n}\n","import { SchmancyElement } from '@mixins/index'\nimport { css, html } from 'lit'\nimport { customElement, query } from 'lit/decorators.js'\nimport { takeUntil } from 'rxjs'\nimport { show } from '../overlay/overlay.service'\n\n/**\n * Menu Component\n *\n * The overlay renders ONLY the raw menu items passed via the default slot.\n * NO <ul> wrapper, NO classes, NO additional markup. The overlay system\n * handles positioning (anchored at the trigger click) and dismissal.\n *\n * @example Basic menu with auto-dismiss\n * ```typescript\n * <schmancy-menu>\n * <schmancy-button slot=\"trigger\">Actions</schmancy-button>\n * <schmancy-menu-item @click=${() => editItem()}>Edit</schmancy-menu-item>\n * <schmancy-menu-item @click=${() => deleteItem()}>Delete</schmancy-menu-item>\n * </schmancy-menu>\n * ```\n * Note: `<schmancy-menu-item>` dispatches a bubbling 'close' event on click;\n * the overlay `show()` observable completes and the menu tears down.\n *\n * @example Custom component (manual dismiss)\n * ```typescript\n * <schmancy-menu>\n * <schmancy-icon-button slot=\"trigger\">settings</schmancy-icon-button>\n * <my-settings-form\n * @submit=${(e) => e.target.dispatchEvent(new CustomEvent('close', { bubbles: true, composed: true }))}\n * ></my-settings-form>\n * </schmancy-menu>\n * ```\n *\n * @slot trigger - Button to open menu (new naming)\n * @slot button - Button to open menu (backward compatible)\n * @slot default - Menu items or any custom component to display in the overlay\n */\n@customElement('schmancy-menu')\nexport default class SchmancyMenu extends SchmancyElement {\n\tstatic styles = [css`\n\t:host {\n\t\tposition: relative;\n\t\tdisplay: flex;\n\t}\n`]\n\n\t@query('slot:not([name])')\n\tprivate menuSlot!: HTMLSlotElement\n\n\tprivate showMenu = (event: MouseEvent): void => {\n\t\tconst menuItems = this.menuSlot?.assignedElements() || []\n\t\tif (menuItems.length === 0) return\n\n\t\t// Move slot items into a fresh container so the overlay can adopt them\n\t\t// without leaving stale references in our shadow tree. The overlay\n\t\t// surface no longer ships padding, so the wrapper owns its breathing\n\t\t// room — menu items shouldn't collide with the surface edge.\n\t\tconst overlayContainer = document.createElement('div')\n\t\toverlayContainer.style.padding = '0.5rem'\n\t\tmenuItems.forEach(item => overlayContainer.appendChild(item))\n\n\t\t// Anchor at the click so the overlay system positions the menu\n\t\t// adjacent to the trigger; subscription completion (any dismissal —\n\t\t// item click → bubbling 'close', backdrop, Esc, disconnect) restores\n\t\t// the items as light DOM so the next open re-projects them.\n\t\tshow(overlayContainer, { anchor: event })\n\t\t\t.pipe(takeUntil(this.disconnecting))\n\t\t\t.subscribe({\n\t\t\t\tcomplete: () => menuItems.forEach(item => this.appendChild(item)),\n\t\t\t})\n\t}\n\n\trender() {\n\t\treturn html`\n\t\t\t<slot name=\"trigger\" @click=${this.showMenu}>\n\t\t\t\t<slot name=\"button\" @click=${this.showMenu}>\n\t\t\t\t\t<schmancy-icon-button>more_vert</schmancy-icon-button>\n\t\t\t\t</slot>\n\t\t\t</slot>\n\t\t\t<div hidden>\n\t\t\t\t<slot></slot>\n\t\t\t</div>\n\t\t`\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'schmancy-menu': SchmancyMenu\n\t}\n}\n"],"mappings":";;;;;;AAKe,IAAA,IAAA,cAA+B,EAAA;CAAA,YAAA,GAAA,GAAA;EAAA,MAAA,GAAA,CAAA,GAAA,KAAA,0BAAA;GAW5C,KAAK,cAAc,IAAI,YAAY,SAAS;IAAE,SAAA,CAAS;IAAM,UAAA,CAAU;GAAA,CAAA,CAAA;EAAA;CAAA;CAAA;EAAA,KAAA,SAVxD,CAAC,CAAG;;;;;;CAapB,SAAA;EACC,OAAO,CAAI;gCACmB,KAAK,kBAAA;;;;CAIpC;AAAA;AAAA,IAAA,EAAA,CArBA,EAAc,oBAAA,CAAA,GAAoB,CAAA;ACmCpB,IAAA,IAAA,cAA2B,EAAA;CAAA,YAAA,GAAA,GAAA;EAAA,MAAA,GAAA,CAAA,GAAA,KAAA,YAWrB,MAAA;GACnB,IAAM,IAAY,KAAK,UAAU,iBAAA,KAAsB,CAAA;GACvD,IAAI,EAAU,WAAW,GAAG;GAM5B,IAAM,IAAmB,SAAS,cAAc,KAAA;GAChD,EAAiB,MAAM,UAAU,UACjC,EAAU,SAAQ,MAAQ,EAAiB,YAAY,CAAA,CAAA,GAMvD,EAAK,GAAkB,EAAE,QAAQ,EAAA,CAAA,EAC/B,KAAK,EAAU,KAAK,aAAA,CAAA,EACpB,UAAU,EACV,gBAAgB,EAAU,SAAQ,MAAQ,KAAK,YAAY,CAAA,CAAA,EAAA,CAAA;EAAA;CAAA;CAAA;EAAA,KAAA,SA7B9C,CAAC,CAAG;;;;;;;CAiCpB,SAAA;EACC,OAAO,CAAI;iCACoB,KAAK,SAAA;iCACL,KAAK,SAAA;;;;;;;;CAQrC;AAAA;AAAA,EAAA,CArCC,EAAM,kBAAA,CAAA,GAAkB,EAAA,WAAA,YAAA,KAAA,CAAA,GAAA,IAAA,EAAA,CATzB,EAAc,eAAA,CAAA,GAAe,CAAA"}
package/dist/menu.cjs CHANGED
@@ -1 +1 @@
1
- require(`./menu-B5EKUeeD.cjs`);
1
+ require(`./menu-BMcGzj1h.cjs`);
package/dist/menu.js CHANGED
@@ -1 +1 @@
1
- import "./menu-CgdXrzir.js";
1
+ import "./menu-tQVARVaC.js";
@@ -1,4 +1,4 @@
1
- import { t as e, u as t } from "./SchmancyElement-DuzT2AMa.js";
1
+ import { t as e, u as t } from "./SchmancyElement-CA0Wqt8m.js";
2
2
  import { property as n, state as r } from "lit/decorators.js";
3
3
  import { css as i } from "lit";
4
4
  var a = Symbol.for("schmancy.form-field"), o = "schmancy:field:connect";
@@ -1 +1 @@
1
- {"version":3,"file":"mixins-Cevarn7V.js","names":[],"sources":["../mixins/formField.mixin.ts","../mixins/litElement.mixin.ts","../src/surface/surface.styles.ts","../mixins/surface.mixin.ts"],"sourcesContent":["import { CSSResult, LitElement, PropertyValueMap } from 'lit'\nimport { property, state } from 'lit/decorators.js'\nimport { IBaseMixin } from './baseElement'\nimport { Constructor } from './constructor'\nimport { ITailwindElementMixin } from './tailwind.mixin'\nimport { SchmancyElement } from './SchmancyElement'\n\n/**\n * Cross-realm brand used by `<schmancy-form>` to discover form fields by\n * inheritance rather than tag-name allowlists. `Symbol.for` puts the symbol in\n * the global registry so detection works across module realms/bundles.\n */\nexport const SCHMANCY_FORM_FIELD = Symbol.for('schmancy.form-field')\n\n/**\n * Composed event a field dispatches in `connectedCallback`. `<schmancy-form>`\n * subscribes via `fromEvent(this, FIELD_CONNECT_EVENT)` and adds the field to\n * its registry. No matching disconnect event — composed events from a\n * disconnected node have an empty composed path; cleanup is via `isConnected`\n * filter at iteration time.\n */\nexport const FIELD_CONNECT_EVENT = 'schmancy:field:connect'\n\n/**\n * Validation modes.\n * - `dirty` (default per Revolute) — show errors only after value diverged.\n * - `touched` — show errors after first blur, even if value unchanged.\n * - `always` — show errors immediately (live search).\n * - `submitted` — hold all errors until submit (wizard step).\n * - `length` — fire validation only when `value.length` reaches `maxlength`\n * (Stripe pattern for predictable-length fields: ZIP, phone, card number).\n */\nexport type ValidateOn = 'always' | 'touched' | 'dirty' | 'submitted' | 'length'\n\n/**\n * Per-field error-message override map. Keys are `ValidityState` flag names;\n * values are the message to display when that flag is set. Unset flags fall\n * back to the mixin's hardcoded defaults (English).\n *\n * Use for i18n or domain-specific copy:\n * ```ts\n * <schmancy-input\n * .errorMessages=${{ valueMissing: 'Adresse e-mail requise', typeMismatch: 'Format e-mail invalide' }}\n * type=\"email\" required\n * ></schmancy-input>\n * ```\n */\nexport type ErrorMessages = Partial<Record<keyof ValidityState, string>>\n\n/**\n * Interface defining the properties and methods that the FormFieldMixin adds.\n */\nexport interface IFormFieldMixin extends Element {\n\tname: string\n\tvalue: string | string[] | boolean | number | undefined\n\tlabel: string\n\trequired: boolean\n\tdisabled: boolean\n\treadonly: boolean\n\terror: boolean\n\tvalidationMessage: string\n\thint?: string\n\tid: string\n\n\t/** Set to `true` once the user has blurred the field at least once. */\n\ttouched: boolean\n\t/** `true` when the current value differs from the captured default. */\n\tdirty: boolean\n\t/** Inverse of `dirty`. */\n\tpristine: boolean\n\t/** Set to `true` by `<schmancy-form>` on submit (forces error display). */\n\tsubmitted: boolean\n\t/** Validation mode — controls when errors display. Default `'dirty'`. */\n\tvalidateOn: ValidateOn\n\n\t/**\n\t * Per-field error-message override map (i18n hook). See `ErrorMessages`.\n\t * Unset keys fall back to the mixin's hardcoded English defaults.\n\t */\n\terrorMessages?: ErrorMessages\n\n\t/**\n\t * `ElementInternals` instance attached by the mixin. Exposed so subclasses\n\t * with non-standard validity semantics (date-range, multi-select) can\n\t * surface platform `ValidityStateFlags` directly via\n\t * `internals.setValidity({ valueMissing: true })` rather than rolling their\n\t * own `attachInternals` call.\n\t */\n\tinternals: ElementInternals | undefined\n\n\tform: HTMLFormElement | null\n\n\tcheckValidity(): boolean\n\treportValidity(): boolean\n\tsetCustomValidity(message: string): void\n\n\t/** Mark the field as touched (component should call on blur). */\n\tmarkTouched(): void\n\t/** Mark the field as submitted (called by `<schmancy-form>` on submit). */\n\tmarkSubmitted(): void\n\t/**\n\t * Clear the `submitted` flag without resetting value/touched/error.\n\t * Used by wizards: stepping back from step N to step N-1 should not\n\t * leave step N-1's fields in aggressive \"show all errors\" mode.\n\t */\n\tclearSubmitted(): void\n\n\t/**\n\t * `true` while an async validator is in flight. Broadcast as\n\t * `:state(validating)`. `<schmancy-form>` blocks submit until every\n\t * registered field's `isValidating` is back to `false`.\n\t */\n\tisValidating: boolean\n\n\t/**\n\t * Run an async validator. While the promise is pending, `isValidating` is\n\t * `true` and `:state(validating)` is broadcast. On resolve, the returned\n\t * string is passed to `setCustomValidity` — empty string clears any\n\t * existing custom error; non-empty marks the field invalid with that\n\t * message.\n\t *\n\t * Submitting the form while a validator is pending is queued — the form\n\t * waits for `Promise.all(pending validators)` to settle before proceeding.\n\t */\n\trunAsyncValidator(fn: () => Promise<string>): Promise<void>\n\n\t/**\n\t * Whether the gate for showing validation errors is open right now. Exposed\n\t * so subclasses with custom error-display channels (e.g. select renders\n\t * errors on a child input) can keep their gate consistent with the mixin's.\n\t * Subclasses should not override this — extend the truth table by changing\n\t * `validateOn` instead.\n\t */\n\t_shouldShowError(): boolean\n\n\ttoFormEntries(): Array<[string, FormDataEntryValue]>\n\tresetForm(): void\n\n\temitChange(detail: any): void\n}\n\n/** Predicate used by `<schmancy-form>` to detect mixin descendants. */\nexport function isSchmancyFormField(el: unknown): el is IFormFieldMixin {\n\treturn !!el && typeof el === 'object' && (el as any).constructor?.[SCHMANCY_FORM_FIELD] === true\n}\n\n/**\n * A mixin that adds form field capabilities to a LitElement class.\n * Components that extend this mixin are automatically discovered and\n * collected by `<schmancy-form>` — no tag-name registration needed.\n *\n * Subclasses may override `toFormEntries()` to contribute multiple\n * name/value pairs to FormData (e.g. date-range, tag-input).\n *\n * @example\n * ```ts\n * class MyInput extends FormFieldMixin(TailwindElement(css`...`)) {\n * // Your component code here\n * }\n * ```\n */\nexport function FormFieldMixin<T extends Constructor<LitElement>>(superClass: T) {\n\tclass FormFieldMixinClass extends superClass {\n\t\tstatic formAssociated = true\n\n\t\t/** Brand for cross-realm detection by `<schmancy-form>`. */\n\t\tstatic readonly [SCHMANCY_FORM_FIELD] = true\n\n\t\t// Element internals for form association\n\t\tinternals: ElementInternals | undefined\n\n\t\t/** Value snapshot captured at first render, used by `resetForm()`. */\n\t\tprotected _defaultValue: string | string[] | boolean | number | undefined = undefined\n\n\t\t@property({ type: String })\n\t\tname: string = ''\n\n\t\t@property({ reflect: true })\n\t\tvalue: string | string[] | boolean | number | undefined = ''\n\n\t\t@property({ type: String })\n\t\tlabel: string = ''\n\n\t\t@property({ type: Boolean, reflect: true })\n\t\trequired: boolean = false\n\n\t\t@property({ type: Boolean, reflect: true })\n\t\tdisabled: boolean = false\n\n\t\t@property({ type: Boolean, reflect: true })\n\t\treadonly: boolean = false\n\n\t\t@property({ type: Boolean, reflect: true })\n\t\terror: boolean = false\n\n\t\t@property({ type: String })\n\t\tvalidationMessage: string = ''\n\n\t\t@property({ type: String })\n\t\thint?: string\n\n\t\t@property({ reflect: true })\n\t\toverride id: string = `schmancy-field-${Date.now()}-${Math.floor(Math.random() * 1000)}`\n\n\t\t// ----- Validation UX state (Revolute contract) -----\n\n\t\t/** True after the user has blurred the field at least once. */\n\t\t@state() touched: boolean = false\n\n\t\t/** Set by `<schmancy-form>` on submit; persists until `resetForm()`. */\n\t\t@state() submitted: boolean = false\n\n\t\t/**\n\t\t * When errors display. Default `'dirty'` — the autofocus+cancel anti-pattern\n\t\t * is avoided because pristine fields never show errors until submit.\n\t\t */\n\t\t@property({ type: String, reflect: true })\n\t\tvalidateOn: ValidateOn = 'dirty'\n\n\t\t/**\n\t\t * Optional override for the validity-flag → message map. See\n\t\t * `ErrorMessages`. Unset keys fall back to the mixin's defaults.\n\t\t */\n\t\t@property({ attribute: false })\n\t\terrorMessages?: ErrorMessages\n\n\t\t/** True when value has been changed from the captured default. */\n\t\tget dirty(): boolean {\n\t\t\treturn this._defaultValue !== undefined && this.value !== this._defaultValue\n\t\t}\n\n\t\tget pristine(): boolean {\n\t\t\treturn !this.dirty\n\t\t}\n\n\t\tmarkTouched(): void {\n\t\t\tif (!this.touched) this.touched = true\n\t\t}\n\n\t\tmarkSubmitted(): void {\n\t\t\tif (!this.submitted) this.submitted = true\n\t\t}\n\n\t\tclearSubmitted(): void {\n\t\t\tif (this.submitted) this.submitted = false\n\t\t}\n\n\t\t/**\n\t\t * Reactive flag set while an async validator is in flight. Read by\n\t\t * `<schmancy-form>` to gate submit; broadcast as `:state(validating)`\n\t\t * for CSS spinner targeting.\n\t\t */\n\t\t@state() isValidating: boolean = false\n\n\t\tasync runAsyncValidator(fn: () => Promise<string>): Promise<void> {\n\t\t\tif (this.isValidating) {\n\t\t\t\t// Cancel-by-supersede semantics — a new call wins; the previous\n\t\t\t\t// is best-effort and its result is dropped if it resolves later.\n\t\t\t\tthis._asyncValidatorEpoch++\n\t\t\t}\n\t\t\tconst epoch = ++this._asyncValidatorEpoch\n\t\t\tthis.isValidating = true\n\t\t\ttry {\n\t\t\t\tconst message = await fn()\n\t\t\t\tif (epoch !== this._asyncValidatorEpoch) return // superseded\n\t\t\t\tthis.setCustomValidity(message)\n\t\t\t} finally {\n\t\t\t\tif (epoch === this._asyncValidatorEpoch) {\n\t\t\t\t\tthis.isValidating = false\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tprivate _asyncValidatorEpoch: number = 0\n\n\t\t/**\n\t\t * Whether `checkValidity()` should display errors right now.\n\t\t * `submitted` overrides every mode — once a submit attempt happens, the\n\t\t * field stays in live-correction mode (Phase 3) for the rest of the\n\t\t * session, and `resetForm()` is the only way back. The leading\n\t\t * underscore marks this as an internal API: subclasses may call it but\n\t\t * should not override it (extend the truth table by changing\n\t\t * `validateOn` instead).\n\t\t */\n\t\t_shouldShowError(): boolean {\n\t\t\tif (this.submitted) return true\n\t\t\tswitch (this.validateOn) {\n\t\t\t\tcase 'always':\n\t\t\t\t\treturn true\n\t\t\t\tcase 'touched':\n\t\t\t\t\treturn this.touched\n\t\t\t\tcase 'dirty':\n\t\t\t\t\treturn this.dirty\n\t\t\t\tcase 'submitted':\n\t\t\t\t\treturn false\n\t\t\t\tcase 'length':\n\t\t\t\t\t// Predictable-length fields: validate once value reaches the\n\t\t\t\t\t// maxlength constraint. Stripe pattern. Falls back to dirty\n\t\t\t\t\t// if no maxlength is set.\n\t\t\t\t\tif (typeof this.value === 'string') {\n\t\t\t\t\t\tconst max = (this as unknown as { maxlength?: number }).maxlength\n\t\t\t\t\t\tif (typeof max === 'number' && max > 0) {\n\t\t\t\t\t\t\treturn this.value.length >= max\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this.dirty\n\t\t\t}\n\t\t}\n\n\t\tconstructor(...args: any[]) {\n\t\t\tsuper(...args)\n\t\t\ttry {\n\t\t\t\tthis.internals = this.attachInternals()\n\t\t\t} catch {\n\t\t\t\tthis.internals = undefined\n\t\t\t}\n\t\t}\n\n\t\toverride connectedCallback(): void {\n\t\t\tsuper.connectedCallback()\n\t\t\t// Register with any ancestor <schmancy-form> via composed event.\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent(FIELD_CONNECT_EVENT, {\n\t\t\t\t\tdetail: this,\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\n\t\t/** The form this element is associated with (native FACE behavior). */\n\t\tget form(): HTMLFormElement | null {\n\t\t\treturn this.internals?.form ?? null\n\t\t}\n\n\t\tprotected firstUpdated(changedProps: PropertyValueMap<any>): void {\n\t\t\tsuper.firstUpdated?.(changedProps)\n\t\t\tif (this._defaultValue === undefined) this._defaultValue = this.value\n\t\t\t// Sync platform validity (`internals.setValidity`) once after first\n\t\t\t// render so `<form>.checkValidity()` and `:invalid` reflect truth\n\t\t\t// even when no property change has fired through `willUpdate` yet\n\t\t\t// (e.g. for required-empty fields with class-field-initialized\n\t\t\t// defaults that Lit doesn't see as \"changed\" on the first cycle).\n\t\t\tthis.checkValidity()\n\t\t}\n\n\t\tprotected willUpdate(changedProps: PropertyValueMap<any>): void {\n\t\t\tsuper.willUpdate(changedProps)\n\n\t\t\tif (changedProps.has('value')) {\n\t\t\t\tthis.internals?.setFormValue(this.value as string | File | FormData | null)\n\t\t\t\t// :state(dirty) tracks value-vs-default; recompute on every value change.\n\t\t\t\tif (this.dirty) this.internals?.states.add('dirty')\n\t\t\t\telse this.internals?.states.delete('dirty')\n\t\t\t\t// Always sync platform validity (internals.setValidity) so\n\t\t\t\t// `<form>.checkValidity()` and `:invalid` reflect truth, even\n\t\t\t\t// while the visual `error` gate stays closed for pristine\n\t\t\t\t// fields under `validateOn: 'dirty'`. The visibility gate is\n\t\t\t\t// inside checkValidity() itself.\n\t\t\t\tthis.checkValidity()\n\t\t\t}\n\n\t\t\tif (changedProps.has('required') || changedProps.has('disabled')) {\n\t\t\t\tthis.checkValidity()\n\t\t\t}\n\n\t\t\tif (changedProps.has('isValidating')) {\n\t\t\t\tif (this.isValidating) this.internals?.states.add('validating')\n\t\t\t\telse this.internals?.states.delete('validating')\n\t\t\t}\n\n\t\t\tif (changedProps.has('touched')) {\n\t\t\t\tif (this.touched) this.internals?.states.add('touched')\n\t\t\t\telse this.internals?.states.delete('touched')\n\t\t\t\t// Phase 2 — blur on a dirty field. Validate to surface the error.\n\t\t\t\tif (this.touched && this.dirty) this.checkValidity()\n\t\t\t}\n\n\t\t\tif (changedProps.has('submitted')) {\n\t\t\t\tif (this.submitted) {\n\t\t\t\t\tthis.internals?.states.add('submitted')\n\t\t\t\t\t// Phase 4 — submit forces error display regardless of dirty/touched.\n\t\t\t\t\tthis.checkValidity()\n\t\t\t\t} else {\n\t\t\t\t\tthis.internals?.states.delete('submitted')\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Note: we do not write to `internals.setValidity` from willUpdate\n\t\t\t// based on `error` / `validationMessage` changes. `checkValidity`\n\t\t\t// and `setCustomValidity` are the sole writers — overwriting the\n\t\t\t// validity flags from willUpdate would clobber structured flags\n\t\t\t// set by subclass overrides (e.g. input.ts surfaces typeMismatch /\n\t\t\t// patternMismatch / tooShort / etc.).\n\n\t\t\tif (changedProps.has('error')) {\n\t\t\t\tif (this.error) this.internals?.states.add('invalid')\n\t\t\t\telse this.internals?.states.delete('invalid')\n\t\t\t\t// ARIA reflection through ElementInternals reaches AT through shadow DOM.\n\t\t\t\tif (this.internals) this.internals.ariaInvalid = this.error ? 'true' : 'false'\n\t\t\t}\n\n\t\t\tif (changedProps.has('required') || changedProps.has('disabled')) {\n\t\t\t\tif (this.required) this.internals?.states.add('required')\n\t\t\t\telse this.internals?.states.delete('required')\n\t\t\t\t// Suppress aria-required when disabled — disabled fields shouldn't\n\t\t\t\t// announce as required to assistive tech.\n\t\t\t\tif (this.internals) {\n\t\t\t\t\tthis.internals.ariaRequired = this.required && !this.disabled ? 'true' : 'false'\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (changedProps.has('disabled')) {\n\t\t\t\tif (this.disabled) this.internals?.states.add('disabled')\n\t\t\t\telse this.internals?.states.delete('disabled')\n\t\t\t}\n\t\t\tif (changedProps.has('readonly')) {\n\t\t\t\tif (this.readonly) this.internals?.states.add('readonly')\n\t\t\t\telse this.internals?.states.delete('readonly')\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Native FACE lifecycle — called by the browser when the owning form\n\t\t * is reset. Delegates to `resetForm()` so subclasses have one\n\t\t * override point for both programmatic and user-initiated resets.\n\t\t */\n\t\tformResetCallback(): void {\n\t\t\tthis.resetForm()\n\t\t}\n\n\t\t/** Native FACE lifecycle — called when the form's disabled state changes. */\n\t\tformDisabledCallback(disabled: boolean): void {\n\t\t\tthis.disabled = disabled\n\t\t}\n\n\t\t/**\n\t\t * Native FACE lifecycle — restore value after bfcache / form autofill.\n\t\t */\n\t\tformStateRestoreCallback(state: string | File | FormData | null): void {\n\t\t\tif (state == null) return\n\t\t\tthis.value = state as any\n\t\t}\n\n\t\t/** Override to customize reset behavior; default restores `_defaultValue`. */\n\t\tresetForm(): void {\n\t\t\tthis.value = this._defaultValue ?? ''\n\t\t\tthis.error = false\n\t\t\tthis.validationMessage = ''\n\t\t\tthis.touched = false\n\t\t\tthis.submitted = false\n\t\t\tthis.internals?.setValidity({})\n\t\t}\n\n\t\t/**\n\t\t * Contribute entries to a parent FormData. Default: a single\n\t\t * `[name, value]` pair when `name` is set and value is meaningful.\n\t\t * Override for multi-entry controls (e.g. date range).\n\t\t */\n\t\ttoFormEntries(): Array<[string, FormDataEntryValue]> {\n\t\t\tif (!this.name || this.disabled) return []\n\t\t\tconst v = this.value\n\t\t\tif (v === undefined || v === null || v === '') return []\n\t\t\tif (Array.isArray(v)) return v.map(item => [this.name, String(item)] as [string, FormDataEntryValue])\n\t\t\tif (typeof v === 'boolean') return v ? [[this.name, 'on']] : []\n\t\t\treturn [[this.name, String(v)]]\n\t\t}\n\n\t\tcheckValidity(): boolean {\n\t\t\tif (this.disabled) {\n\t\t\t\tthis.internals?.setValidity({})\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\tconst requiredFailed =\n\t\t\t\tthis.required && (this.value === '' || this.value === undefined || this.value === null)\n\t\t\t// Custom errors set via setCustomValidity() are platform-truth too —\n\t\t\t// preserve them through re-validation cycles.\n\t\t\tconst customErrorSet = !!this.internals?.validity?.customError\n\t\t\tconst isValid = !requiredFailed && !customErrorSet\n\t\t\tconst requiredMessage =\n\t\t\t\tthis.errorMessages?.valueMissing ?? 'This field is required'\n\t\t\tconst defaultMessage = requiredFailed ? requiredMessage : 'Invalid value'\n\n\t\t\t// Platform validity (read by `form.checkValidity()` and `:invalid`)\n\t\t\t// is always set to the truth — independent of the visual gate.\n\t\t\tif (requiredFailed) {\n\t\t\t\tthis.internals?.setValidity(\n\t\t\t\t\t{ valueMissing: true },\n\t\t\t\t\tthis.validationMessage || defaultMessage,\n\t\t\t\t)\n\t\t\t} else if (!customErrorSet) {\n\t\t\t\t// No required failure, no custom error — clear flags.\n\t\t\t\tthis.internals?.setValidity({})\n\t\t\t}\n\t\t\t// (customErrorSet branch falls through — leave the custom validity intact.)\n\n\t\t\t// Visual `error` flag is gated. The returned boolean tells the caller\n\t\t\t// the truth; only the in-component error display is suppressed for\n\t\t\t// pristine fields under `validateOn: 'dirty'`.\n\t\t\tif (this._shouldShowError()) {\n\t\t\t\tthis.error = !isValid\n\t\t\t\tif (!isValid && !this.validationMessage) {\n\t\t\t\t\tthis.validationMessage = defaultMessage\n\t\t\t\t} else if (isValid) {\n\t\t\t\t\tthis.validationMessage = ''\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn isValid\n\t\t}\n\n\t\treportValidity(): boolean {\n\t\t\tconst isValid = this.checkValidity()\n\t\t\tif (!isValid) this.internals?.reportValidity()\n\t\t\treturn isValid\n\t\t}\n\n\t\tsetCustomValidity(message: string): void {\n\t\t\tthis.validationMessage = message\n\t\t\tthis.error = message !== ''\n\t\t\tif (message) {\n\t\t\t\tthis.internals?.setValidity({ customError: true }, message)\n\t\t\t} else {\n\t\t\t\tthis.internals?.setValidity({})\n\t\t\t}\n\t\t}\n\n\t\temitChange(detail: any): void {\n\t\t\tif ('dispatchScopedEvent' in this && typeof this.dispatchScopedEvent === 'function') {\n\t\t\t\tthis.dispatchScopedEvent('change', detail, { bubbles: true })\n\t\t\t} else {\n\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\tnew CustomEvent('change', {\n\t\t\t\t\t\tdetail,\n\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\tcomposed: true,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn FormFieldMixinClass as Constructor<IFormFieldMixin> & T\n}\n\n/**\n * A convenience function that composes FormFieldMixin with SchmancyElement\n * to create a base class for Schmancy form components. Subclasses gain the\n * full SchmancyElement stack (SignalWatcher, _activeHost wrap, AbortSignal,\n * automatic Tailwind injection) plus the form-field semantics.\n */\nexport function SchmancyFormField<T extends CSSResult>(componentStyle?: T) {\n\tclass StyledSchmancyElement extends SchmancyElement {\n\t\tstatic styles = componentStyle ? [componentStyle] : []\n\t}\n\treturn FormFieldMixin(StyledSchmancyElement) as unknown as Constructor<IFormFieldMixin> &\n\t\tConstructor<ITailwindElementMixin> &\n\t\tConstructor<LitElement> &\n\t\tConstructor<IBaseMixin>\n}\n","import { CSSResult, LitElement } from 'lit'\nimport { IBaseMixin } from './baseElement'\nimport { Constructor } from './constructor'\nimport { SchmancyElement } from './SchmancyElement'\n\n/**\n * @deprecated Extend `SchmancyElement` directly and declare `static styles`.\n *\n * Before: extends $LitElement(css`...`)\n * After: extends SchmancyElement { static styles = [css`...`] }\n *\n * Kept as a thin alias for the migration window; will be removed in the next\n * major Schmancy release. The returned class extends `SchmancyElement` so\n * runtime semantics (Tailwind injection, `disconnecting` Subject,\n * `disconnectedSignal` AbortSignal, SignalWatcher) match exactly.\n */\nexport const $LitElement = <T extends CSSResult>(componentStyle?: T) => {\n\tclass LegacyAlias extends SchmancyElement {\n\t\tstatic styles = componentStyle ? [componentStyle] : []\n\t}\n\treturn LegacyAlias as CustomElementConstructor &\n\t\tConstructor<LitElement> &\n\t\tConstructor<IBaseMixin>\n}\n","import { css } from 'lit'\n\n/**\n * Luminous Glass surface type styles.\n *\n * Depth model: blur intensity + opacity replaces M3 tonal hierarchy.\n * - solid: opaque ground (0 blur, 100% opacity)\n * - subtle: frosted panel (4px blur, ~72% opacity)\n * - glass: full frosted glass (20px blur, ~55% opacity)\n * - luminous: glass + glow halo (24px blur, ~22% opacity)\n */\nexport const surfaceTypeStyles = css`\n\t/* ================================================================\n\t STRUCTURAL TYPES — All-glass depth model.\n\t Nothing is opaque. Every layer is translucent.\n\t Blur creates readability. Light borders isolate layers.\n\t Rule: text must ALWAYS be readable on every surface.\n\t ================================================================ */\n\n\t/* Solid — dense glass, high readability ground layer (no blur — 92% opacity is enough) */\n\t:host([type='solid']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\t\tbackground: color-mix(in srgb, var(--glass-base) 92%, transparent);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t}\n\n\t/* Subtle — bright vibrant glass: near-white tint, saturated blur, top-edge highlight */\n\t:host([type='subtle']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\t\tbackground: color-mix(in srgb, var(--glass-base) 30%, transparent);\n\t\tbackdrop-filter: blur(12px) saturate(160%);\n\t\t-webkit-backdrop-filter: blur(12px) saturate(160%);\n\t\tborder: 1px solid color-mix(in srgb, var(--schmancy-sys-color-outlineVariant) 60%, transparent);\n\t\tbox-shadow: inset 0 1px 0 color-mix(in srgb, var(--schmancy-sys-color-surface-on) 8%, transparent);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t}\n\n\t/* Glass — frosted glass, blur ensures readability */\n\t:host([type='glass']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\n\t\tbackground: color-mix(in srgb, var(--glass-base) 55%, transparent);\n\t\tbackdrop-filter: blur(16px) saturate(180%) brightness(1.05);\n\t\t-webkit-backdrop-filter: blur(16px) saturate(180%) brightness(1.05);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t\tcontain: content;\n\t\tposition: relative;\n\t\toverflow: hidden;\n\t\tisolation: isolate;\n\t}\n\n\t/* Luminous — glass + glow halo, heavy blur keeps readability */\n\t:host([type='luminous']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\t\t--glow-color: var(--schmancy-sys-color-primary-default);\n\n\t\tbackground: color-mix(in srgb, var(--glass-base) 42%, transparent);\n\t\tbackdrop-filter: blur(20px) saturate(200%) brightness(1.08);\n\t\t-webkit-backdrop-filter: blur(20px) saturate(200%) brightness(1.08);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t\tcontain: content;\n\t\tposition: relative;\n\t\toverflow: hidden;\n\t\tisolation: isolate;\n\t}\n\n\t/* ================================================================\n\t UTILITY TYPES\n\t ================================================================ */\n\n\t/* Transparent — no background */\n\t:host([type='transparent']) {\n\t\tbackground-color: transparent;\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t}\n\n\t/* Outlined — border with luminous hover potential */\n\t:host([type='outlined']) {\n\t\tbackground-color: transparent;\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t\tborder: 1px solid var(--schmancy-sys-color-outlineVariant);\n\t\ttransition: border-color 300ms ease, box-shadow 300ms ease;\n\t}\n\n\t/* ================================================================\n\t SEMANTIC TYPES — tinted glass for status/role\n\t ================================================================ */\n\n\t:host([type='primary']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-primary-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-primary-default);\n\t}\n\t:host([type='secondary']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-secondary-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-secondary-default);\n\t}\n\t:host([type='tertiary']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-tertiary-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-tertiary-default);\n\t}\n\t:host([type='error']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-error-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-error-onContainer);\n\t}\n\t:host([type='success']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-success-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-success-onContainer);\n\t}\n\t:host([type='warning']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-warning-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-warning-onContainer);\n\t}\n\t:host([type='info']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-info-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-info-onContainer);\n\t}\n\n\t/* ================================================================\n\t LEGACY M3 ALIASES — backward compatibility\n\t Old type names render as their new Luminous Glass equivalents.\n\t ================================================================ */\n\n\t/* solid aliases — dense glass */\n\t:host([type='surface']),\n\t:host([type='surfaceDim']),\n\t:host([type='surfaceBright']),\n\t:host([type='containerLowest']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\t\tbackground: color-mix(in srgb, var(--glass-base) 92%, transparent);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t}\n\n\t/* subtle aliases — bright vibrant glass */\n\t:host([type='containerLow']),\n\t:host([type='container']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\t\tbackground: color-mix(in srgb, var(--glass-base) 30%, transparent);\n\t\tbackdrop-filter: blur(12px) saturate(160%);\n\t\t-webkit-backdrop-filter: blur(12px) saturate(160%);\n\t\tborder: 1px solid color-mix(in srgb, var(--schmancy-sys-color-outlineVariant) 60%, transparent);\n\t\tbox-shadow: inset 0 1px 0 color-mix(in srgb, var(--schmancy-sys-color-surface-on) 8%, transparent);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t}\n\n\t/* glass aliases */\n\t:host([type='containerHigh']),\n\t:host([type='containerHighest']),\n\t:host([type='glassOforim']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\n\t\tbackground: color-mix(in srgb, var(--glass-base) 55%, transparent);\n\t\tbackdrop-filter: blur(16px) saturate(180%) brightness(1.05);\n\t\t-webkit-backdrop-filter: blur(16px) saturate(180%) brightness(1.05);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t\tposition: relative;\n\t\toverflow: hidden;\n\t\tisolation: isolate;\n\t}\n\n\t/* ================================================================\n\t REDUCED MOTION — disable glass animations\n\t ================================================================ */\n`\n\n/**\n * Surface rounded corner styles\n */\nexport const surfaceRoundedStyles = css`\n\t:host([rounded='none']) {\n\t\tborder-radius: 0;\n\t}\n\t:host([rounded='top']) {\n\t\tborder-radius: var(--schmancy-sys-shape-corner-large) var(--schmancy-sys-shape-corner-large) 0 0;\n\t}\n\t:host([rounded='left']) {\n\t\tborder-radius: var(--schmancy-sys-shape-corner-large) 0 0 var(--schmancy-sys-shape-corner-large);\n\t}\n\t:host([rounded='right']) {\n\t\tborder-radius: 0 var(--schmancy-sys-shape-corner-large) var(--schmancy-sys-shape-corner-large) 0;\n\t}\n\t:host([rounded='bottom']) {\n\t\tborder-radius: 0 0 var(--schmancy-sys-shape-corner-large) var(--schmancy-sys-shape-corner-large);\n\t}\n\t:host([rounded='all']) {\n\t\tborder-radius: var(--schmancy-sys-shape-corner-large);\n\t}\n`\n\n/**\n * Luminous glow elevation — replaces M3 dark drop shadows with primary-colored glow.\n * No ::after tint overlay — depth comes from glow intensity, not surface tint.\n */\nexport const surfaceElevationStyles = css`\n\t:host([elevation='1']) {\n\t\tbox-shadow: 0 2px 12px -2px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 15%, transparent);\n\t\tposition: relative;\n\t}\n\t:host([elevation='2']) {\n\t\tbox-shadow: 0 4px 20px -2px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 22%, transparent);\n\t\tposition: relative;\n\t}\n\t:host([elevation='3']) {\n\t\tbox-shadow: 0 8px 32px -4px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 28%, transparent);\n\t\tposition: relative;\n\t}\n\t:host([elevation='4']) {\n\t\tbox-shadow: 0 12px 44px -4px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 35%, transparent);\n\t\tposition: relative;\n\t}\n\t:host([elevation='5']) {\n\t\tbox-shadow: 0 20px 60px -4px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 42%, transparent);\n\t\tposition: relative;\n\t}\n`\n\n/**\n * Surface clickable styles - luminous hover, spring active\n */\nexport const surfaceClickableStyles = css`\n\t:host([clickable]) {\n\t\tcursor: pointer;\n\t\tuser-select: none;\n\t\t-webkit-tap-highlight-color: transparent;\n\t\ttransition:\n\t\t\tfilter 200ms ease,\n\t\t\ttransform 300ms cubic-bezier(0.34, 1.56, 0.64, 1),\n\t\t\tbox-shadow 400ms ease;\n\t}\n\t:host([clickable]:hover) {\n\t\tfilter: brightness(1.03);\n\t}\n\t:host([clickable]:active) {\n\t\tfilter: brightness(0.96);\n\t\ttransform: scale(0.98);\n\t\ttransition-duration: 100ms;\n\t}\n\t:host([clickable]:focus-visible) {\n\t\toutline: 2px solid var(--schmancy-sys-color-primary-default);\n\t\toutline-offset: 2px;\n\t}\n\t@media (prefers-reduced-motion: reduce) {\n\t\t:host([clickable]) { transition: filter 150ms ease; }\n\t\t:host([clickable]:hover) { transform: none; box-shadow: none; }\n\t\t:host([clickable]:active) { transform: none; }\n\t}\n`\n\n/**\n * Combined surface styles - includes all surface styling capabilities\n */\nexport const surfaceStyles = css`\n\t${surfaceTypeStyles}\n\t${surfaceRoundedStyles}\n\t${surfaceElevationStyles}\n\t${surfaceClickableStyles}\n`\n","import type { Constructor } from './constructor'\nimport { CSSResultGroup, CSSResultOrNative, LitElement } from 'lit'\nimport { property } from 'lit/decorators.js'\nimport type { TSurfaceColor } from '../src/types/surface'\nimport { surfaceStyles } from '../src/surface/surface.styles'\n\nexport type SchmancySurfaceRounded = 'none' | 'top' | 'left' | 'right' | 'bottom' | 'all'\nexport type SchmancySurfaceElevation = 0 | 1 | 2 | 3 | 4 | 5\n\nexport declare class ISurfaceMixin {\n\trounded: SchmancySurfaceRounded\n\televation: SchmancySurfaceElevation\n\ttype: TSurfaceColor\n\tclickable: boolean\n}\n\n/**\n * SurfaceMixin - Adds surface styling properties AND styles to any LitElement\n *\n * Uses Lit's finalizeStyles hook to inject surfaceStyles CSS for all surface type selectors.\n * This is the recommended pattern for mixins that need to add styles.\n *\n * Provides these reflected properties:\n * - `rounded`: 'none' | 'top' | 'left' | 'right' | 'bottom' | 'all' - Corner rounding\n * - `elevation`: 0-5 - Shadow depth level\n * - `type`: TSurfaceColor - Surface color variant (26+ options)\n *\n * Usage:\n * ```typescript\n * import { SurfaceMixin } from '@mixins/surface.mixin'\n *\n * @customElement('my-component')\n * class MyComponent extends SurfaceMixin(TailwindElement(css`\n * :host { display: block; }\n * `)) {\n * // Component now has type, fill, rounded, elevation properties\n * // AND surfaceStyles are automatically included\n * }\n * ```\n */\nexport const SurfaceMixin = <T extends Constructor<LitElement>>(superClass: T) => {\n\tclass SurfaceMixinClass extends superClass {\n\t\t/**\n\t\t * Override finalizeStyles to inject surfaceStyles.\n\t\t * This is the Lit-recommended way for mixins to add styles.\n\t\t */\n\t\tprotected static finalizeStyles(styles?: CSSResultGroup): CSSResultOrNative[] {\n\t\t\t// Get parent's finalized styles using LitElement's method\n\t\t\tconst parentStyles = (superClass as unknown as typeof LitElement).finalizeStyles(styles)\n\t\t\t// Append surfaceStyles at the end (higher specificity)\n\t\t\treturn [...parentStyles, surfaceStyles as CSSResultOrNative]\n\t\t}\n\n\t\t/**\n\t\t * Specifies the rounding style of the component's corners.\n\t\t * @default 'none'\n\t\t */\n\t\t@property({ reflect: true })\n\t\trounded: SchmancySurfaceRounded = 'none'\n\n\t\t/**\n\t\t * Defines the elevation level (shadow depth) of the surface.\n\t\t * @default 0\n\t\t */\n\t\t@property({ type: Number, reflect: true })\n\t\televation: SchmancySurfaceElevation = 0\n\n\t\t/**\n\t\t * Specifies the surface type for styling.\n\t\t * @default 'container'\n\t\t */\n\t\t@property({ reflect: true })\n\t\ttype: TSurfaceColor = 'subtle'\n\n\t\t/**\n\t\t * Makes the surface interactive with hover, active states and cursor pointer.\n\t\t * @default false\n\t\t */\n\t\t@property({ type: Boolean, reflect: true })\n\t\tclickable = false\n\t}\n\treturn SurfaceMixinClass as Constructor<ISurfaceMixin> & T\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"mixins-Bp0wIHg2.js","names":[],"sources":["../mixins/formField.mixin.ts","../mixins/litElement.mixin.ts","../src/surface/surface.styles.ts","../mixins/surface.mixin.ts"],"sourcesContent":["import { CSSResult, LitElement, PropertyValueMap } from 'lit'\nimport { property, state } from 'lit/decorators.js'\nimport { IBaseMixin } from './baseElement'\nimport { Constructor } from './constructor'\nimport { ITailwindElementMixin } from './tailwind.mixin'\nimport { SchmancyElement } from './SchmancyElement'\n\n/**\n * Cross-realm brand used by `<schmancy-form>` to discover form fields by\n * inheritance rather than tag-name allowlists. `Symbol.for` puts the symbol in\n * the global registry so detection works across module realms/bundles.\n */\nexport const SCHMANCY_FORM_FIELD = Symbol.for('schmancy.form-field')\n\n/**\n * Composed event a field dispatches in `connectedCallback`. `<schmancy-form>`\n * subscribes via `fromEvent(this, FIELD_CONNECT_EVENT)` and adds the field to\n * its registry. No matching disconnect event — composed events from a\n * disconnected node have an empty composed path; cleanup is via `isConnected`\n * filter at iteration time.\n */\nexport const FIELD_CONNECT_EVENT = 'schmancy:field:connect'\n\n/**\n * Validation modes.\n * - `dirty` (default per Revolute) — show errors only after value diverged.\n * - `touched` — show errors after first blur, even if value unchanged.\n * - `always` — show errors immediately (live search).\n * - `submitted` — hold all errors until submit (wizard step).\n * - `length` — fire validation only when `value.length` reaches `maxlength`\n * (Stripe pattern for predictable-length fields: ZIP, phone, card number).\n */\nexport type ValidateOn = 'always' | 'touched' | 'dirty' | 'submitted' | 'length'\n\n/**\n * Per-field error-message override map. Keys are `ValidityState` flag names;\n * values are the message to display when that flag is set. Unset flags fall\n * back to the mixin's hardcoded defaults (English).\n *\n * Use for i18n or domain-specific copy:\n * ```ts\n * <schmancy-input\n * .errorMessages=${{ valueMissing: 'Adresse e-mail requise', typeMismatch: 'Format e-mail invalide' }}\n * type=\"email\" required\n * ></schmancy-input>\n * ```\n */\nexport type ErrorMessages = Partial<Record<keyof ValidityState, string>>\n\n/**\n * Interface defining the properties and methods that the FormFieldMixin adds.\n */\nexport interface IFormFieldMixin extends Element {\n\tname: string\n\tvalue: string | string[] | boolean | number | undefined\n\tlabel: string\n\trequired: boolean\n\tdisabled: boolean\n\treadonly: boolean\n\terror: boolean\n\tvalidationMessage: string\n\thint?: string\n\tid: string\n\n\t/** Set to `true` once the user has blurred the field at least once. */\n\ttouched: boolean\n\t/** `true` when the current value differs from the captured default. */\n\tdirty: boolean\n\t/** Inverse of `dirty`. */\n\tpristine: boolean\n\t/** Set to `true` by `<schmancy-form>` on submit (forces error display). */\n\tsubmitted: boolean\n\t/** Validation mode — controls when errors display. Default `'dirty'`. */\n\tvalidateOn: ValidateOn\n\n\t/**\n\t * Per-field error-message override map (i18n hook). See `ErrorMessages`.\n\t * Unset keys fall back to the mixin's hardcoded English defaults.\n\t */\n\terrorMessages?: ErrorMessages\n\n\t/**\n\t * `ElementInternals` instance attached by the mixin. Exposed so subclasses\n\t * with non-standard validity semantics (date-range, multi-select) can\n\t * surface platform `ValidityStateFlags` directly via\n\t * `internals.setValidity({ valueMissing: true })` rather than rolling their\n\t * own `attachInternals` call.\n\t */\n\tinternals: ElementInternals | undefined\n\n\tform: HTMLFormElement | null\n\n\tcheckValidity(): boolean\n\treportValidity(): boolean\n\tsetCustomValidity(message: string): void\n\n\t/** Mark the field as touched (component should call on blur). */\n\tmarkTouched(): void\n\t/** Mark the field as submitted (called by `<schmancy-form>` on submit). */\n\tmarkSubmitted(): void\n\t/**\n\t * Clear the `submitted` flag without resetting value/touched/error.\n\t * Used by wizards: stepping back from step N to step N-1 should not\n\t * leave step N-1's fields in aggressive \"show all errors\" mode.\n\t */\n\tclearSubmitted(): void\n\n\t/**\n\t * `true` while an async validator is in flight. Broadcast as\n\t * `:state(validating)`. `<schmancy-form>` blocks submit until every\n\t * registered field's `isValidating` is back to `false`.\n\t */\n\tisValidating: boolean\n\n\t/**\n\t * Run an async validator. While the promise is pending, `isValidating` is\n\t * `true` and `:state(validating)` is broadcast. On resolve, the returned\n\t * string is passed to `setCustomValidity` — empty string clears any\n\t * existing custom error; non-empty marks the field invalid with that\n\t * message.\n\t *\n\t * Submitting the form while a validator is pending is queued — the form\n\t * waits for `Promise.all(pending validators)` to settle before proceeding.\n\t */\n\trunAsyncValidator(fn: () => Promise<string>): Promise<void>\n\n\t/**\n\t * Whether the gate for showing validation errors is open right now. Exposed\n\t * so subclasses with custom error-display channels (e.g. select renders\n\t * errors on a child input) can keep their gate consistent with the mixin's.\n\t * Subclasses should not override this — extend the truth table by changing\n\t * `validateOn` instead.\n\t */\n\t_shouldShowError(): boolean\n\n\ttoFormEntries(): Array<[string, FormDataEntryValue]>\n\tresetForm(): void\n\n\temitChange(detail: any): void\n}\n\n/** Predicate used by `<schmancy-form>` to detect mixin descendants. */\nexport function isSchmancyFormField(el: unknown): el is IFormFieldMixin {\n\treturn !!el && typeof el === 'object' && (el as any).constructor?.[SCHMANCY_FORM_FIELD] === true\n}\n\n/**\n * A mixin that adds form field capabilities to a LitElement class.\n * Components that extend this mixin are automatically discovered and\n * collected by `<schmancy-form>` — no tag-name registration needed.\n *\n * Subclasses may override `toFormEntries()` to contribute multiple\n * name/value pairs to FormData (e.g. date-range, tag-input).\n *\n * @example\n * ```ts\n * class MyInput extends FormFieldMixin(TailwindElement(css`...`)) {\n * // Your component code here\n * }\n * ```\n */\nexport function FormFieldMixin<T extends Constructor<LitElement>>(superClass: T) {\n\tclass FormFieldMixinClass extends superClass {\n\t\tstatic formAssociated = true\n\n\t\t/** Brand for cross-realm detection by `<schmancy-form>`. */\n\t\tstatic readonly [SCHMANCY_FORM_FIELD] = true\n\n\t\t// Element internals for form association\n\t\tinternals: ElementInternals | undefined\n\n\t\t/** Value snapshot captured at first render, used by `resetForm()`. */\n\t\tprotected _defaultValue: string | string[] | boolean | number | undefined = undefined\n\n\t\t@property({ type: String })\n\t\tname: string = ''\n\n\t\t@property({ reflect: true })\n\t\tvalue: string | string[] | boolean | number | undefined = ''\n\n\t\t@property({ type: String })\n\t\tlabel: string = ''\n\n\t\t@property({ type: Boolean, reflect: true })\n\t\trequired: boolean = false\n\n\t\t@property({ type: Boolean, reflect: true })\n\t\tdisabled: boolean = false\n\n\t\t@property({ type: Boolean, reflect: true })\n\t\treadonly: boolean = false\n\n\t\t@property({ type: Boolean, reflect: true })\n\t\terror: boolean = false\n\n\t\t@property({ type: String })\n\t\tvalidationMessage: string = ''\n\n\t\t@property({ type: String })\n\t\thint?: string\n\n\t\t@property({ reflect: true })\n\t\toverride id: string = `schmancy-field-${Date.now()}-${Math.floor(Math.random() * 1000)}`\n\n\t\t// ----- Validation UX state (Revolute contract) -----\n\n\t\t/** True after the user has blurred the field at least once. */\n\t\t@state() touched: boolean = false\n\n\t\t/** Set by `<schmancy-form>` on submit; persists until `resetForm()`. */\n\t\t@state() submitted: boolean = false\n\n\t\t/**\n\t\t * When errors display. Default `'dirty'` — the autofocus+cancel anti-pattern\n\t\t * is avoided because pristine fields never show errors until submit.\n\t\t */\n\t\t@property({ type: String, reflect: true })\n\t\tvalidateOn: ValidateOn = 'dirty'\n\n\t\t/**\n\t\t * Optional override for the validity-flag → message map. See\n\t\t * `ErrorMessages`. Unset keys fall back to the mixin's defaults.\n\t\t */\n\t\t@property({ attribute: false })\n\t\terrorMessages?: ErrorMessages\n\n\t\t/** True when value has been changed from the captured default. */\n\t\tget dirty(): boolean {\n\t\t\treturn this._defaultValue !== undefined && this.value !== this._defaultValue\n\t\t}\n\n\t\tget pristine(): boolean {\n\t\t\treturn !this.dirty\n\t\t}\n\n\t\tmarkTouched(): void {\n\t\t\tif (!this.touched) this.touched = true\n\t\t}\n\n\t\tmarkSubmitted(): void {\n\t\t\tif (!this.submitted) this.submitted = true\n\t\t}\n\n\t\tclearSubmitted(): void {\n\t\t\tif (this.submitted) this.submitted = false\n\t\t}\n\n\t\t/**\n\t\t * Reactive flag set while an async validator is in flight. Read by\n\t\t * `<schmancy-form>` to gate submit; broadcast as `:state(validating)`\n\t\t * for CSS spinner targeting.\n\t\t */\n\t\t@state() isValidating: boolean = false\n\n\t\tasync runAsyncValidator(fn: () => Promise<string>): Promise<void> {\n\t\t\tif (this.isValidating) {\n\t\t\t\t// Cancel-by-supersede semantics — a new call wins; the previous\n\t\t\t\t// is best-effort and its result is dropped if it resolves later.\n\t\t\t\tthis._asyncValidatorEpoch++\n\t\t\t}\n\t\t\tconst epoch = ++this._asyncValidatorEpoch\n\t\t\tthis.isValidating = true\n\t\t\ttry {\n\t\t\t\tconst message = await fn()\n\t\t\t\tif (epoch !== this._asyncValidatorEpoch) return // superseded\n\t\t\t\tthis.setCustomValidity(message)\n\t\t\t} finally {\n\t\t\t\tif (epoch === this._asyncValidatorEpoch) {\n\t\t\t\t\tthis.isValidating = false\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tprivate _asyncValidatorEpoch: number = 0\n\n\t\t/**\n\t\t * Whether `checkValidity()` should display errors right now.\n\t\t * `submitted` overrides every mode — once a submit attempt happens, the\n\t\t * field stays in live-correction mode (Phase 3) for the rest of the\n\t\t * session, and `resetForm()` is the only way back. The leading\n\t\t * underscore marks this as an internal API: subclasses may call it but\n\t\t * should not override it (extend the truth table by changing\n\t\t * `validateOn` instead).\n\t\t */\n\t\t_shouldShowError(): boolean {\n\t\t\tif (this.submitted) return true\n\t\t\tswitch (this.validateOn) {\n\t\t\t\tcase 'always':\n\t\t\t\t\treturn true\n\t\t\t\tcase 'touched':\n\t\t\t\t\treturn this.touched\n\t\t\t\tcase 'dirty':\n\t\t\t\t\treturn this.dirty\n\t\t\t\tcase 'submitted':\n\t\t\t\t\treturn false\n\t\t\t\tcase 'length':\n\t\t\t\t\t// Predictable-length fields: validate once value reaches the\n\t\t\t\t\t// maxlength constraint. Stripe pattern. Falls back to dirty\n\t\t\t\t\t// if no maxlength is set.\n\t\t\t\t\tif (typeof this.value === 'string') {\n\t\t\t\t\t\tconst max = (this as unknown as { maxlength?: number }).maxlength\n\t\t\t\t\t\tif (typeof max === 'number' && max > 0) {\n\t\t\t\t\t\t\treturn this.value.length >= max\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this.dirty\n\t\t\t}\n\t\t}\n\n\t\tconstructor(...args: any[]) {\n\t\t\tsuper(...args)\n\t\t\ttry {\n\t\t\t\tthis.internals = this.attachInternals()\n\t\t\t} catch {\n\t\t\t\tthis.internals = undefined\n\t\t\t}\n\t\t}\n\n\t\toverride connectedCallback(): void {\n\t\t\tsuper.connectedCallback()\n\t\t\t// Register with any ancestor <schmancy-form> via composed event.\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent(FIELD_CONNECT_EVENT, {\n\t\t\t\t\tdetail: this,\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t}),\n\t\t\t)\n\t\t}\n\n\t\t/** The form this element is associated with (native FACE behavior). */\n\t\tget form(): HTMLFormElement | null {\n\t\t\treturn this.internals?.form ?? null\n\t\t}\n\n\t\tprotected firstUpdated(changedProps: PropertyValueMap<any>): void {\n\t\t\tsuper.firstUpdated?.(changedProps)\n\t\t\tif (this._defaultValue === undefined) this._defaultValue = this.value\n\t\t\t// Sync platform validity (`internals.setValidity`) once after first\n\t\t\t// render so `<form>.checkValidity()` and `:invalid` reflect truth\n\t\t\t// even when no property change has fired through `willUpdate` yet\n\t\t\t// (e.g. for required-empty fields with class-field-initialized\n\t\t\t// defaults that Lit doesn't see as \"changed\" on the first cycle).\n\t\t\tthis.checkValidity()\n\t\t}\n\n\t\tprotected willUpdate(changedProps: PropertyValueMap<any>): void {\n\t\t\tsuper.willUpdate(changedProps)\n\n\t\t\tif (changedProps.has('value')) {\n\t\t\t\tthis.internals?.setFormValue(this.value as string | File | FormData | null)\n\t\t\t\t// :state(dirty) tracks value-vs-default; recompute on every value change.\n\t\t\t\tif (this.dirty) this.internals?.states.add('dirty')\n\t\t\t\telse this.internals?.states.delete('dirty')\n\t\t\t\t// Always sync platform validity (internals.setValidity) so\n\t\t\t\t// `<form>.checkValidity()` and `:invalid` reflect truth, even\n\t\t\t\t// while the visual `error` gate stays closed for pristine\n\t\t\t\t// fields under `validateOn: 'dirty'`. The visibility gate is\n\t\t\t\t// inside checkValidity() itself.\n\t\t\t\tthis.checkValidity()\n\t\t\t}\n\n\t\t\tif (changedProps.has('required') || changedProps.has('disabled')) {\n\t\t\t\tthis.checkValidity()\n\t\t\t}\n\n\t\t\tif (changedProps.has('isValidating')) {\n\t\t\t\tif (this.isValidating) this.internals?.states.add('validating')\n\t\t\t\telse this.internals?.states.delete('validating')\n\t\t\t}\n\n\t\t\tif (changedProps.has('touched')) {\n\t\t\t\tif (this.touched) this.internals?.states.add('touched')\n\t\t\t\telse this.internals?.states.delete('touched')\n\t\t\t\t// Phase 2 — blur on a dirty field. Validate to surface the error.\n\t\t\t\tif (this.touched && this.dirty) this.checkValidity()\n\t\t\t}\n\n\t\t\tif (changedProps.has('submitted')) {\n\t\t\t\tif (this.submitted) {\n\t\t\t\t\tthis.internals?.states.add('submitted')\n\t\t\t\t\t// Phase 4 — submit forces error display regardless of dirty/touched.\n\t\t\t\t\tthis.checkValidity()\n\t\t\t\t} else {\n\t\t\t\t\tthis.internals?.states.delete('submitted')\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Note: we do not write to `internals.setValidity` from willUpdate\n\t\t\t// based on `error` / `validationMessage` changes. `checkValidity`\n\t\t\t// and `setCustomValidity` are the sole writers — overwriting the\n\t\t\t// validity flags from willUpdate would clobber structured flags\n\t\t\t// set by subclass overrides (e.g. input.ts surfaces typeMismatch /\n\t\t\t// patternMismatch / tooShort / etc.).\n\n\t\t\tif (changedProps.has('error')) {\n\t\t\t\tif (this.error) this.internals?.states.add('invalid')\n\t\t\t\telse this.internals?.states.delete('invalid')\n\t\t\t\t// ARIA reflection through ElementInternals reaches AT through shadow DOM.\n\t\t\t\tif (this.internals) this.internals.ariaInvalid = this.error ? 'true' : 'false'\n\t\t\t}\n\n\t\t\tif (changedProps.has('required') || changedProps.has('disabled')) {\n\t\t\t\tif (this.required) this.internals?.states.add('required')\n\t\t\t\telse this.internals?.states.delete('required')\n\t\t\t\t// Suppress aria-required when disabled — disabled fields shouldn't\n\t\t\t\t// announce as required to assistive tech.\n\t\t\t\tif (this.internals) {\n\t\t\t\t\tthis.internals.ariaRequired = this.required && !this.disabled ? 'true' : 'false'\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (changedProps.has('disabled')) {\n\t\t\t\tif (this.disabled) this.internals?.states.add('disabled')\n\t\t\t\telse this.internals?.states.delete('disabled')\n\t\t\t}\n\t\t\tif (changedProps.has('readonly')) {\n\t\t\t\tif (this.readonly) this.internals?.states.add('readonly')\n\t\t\t\telse this.internals?.states.delete('readonly')\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Native FACE lifecycle — called by the browser when the owning form\n\t\t * is reset. Delegates to `resetForm()` so subclasses have one\n\t\t * override point for both programmatic and user-initiated resets.\n\t\t */\n\t\tformResetCallback(): void {\n\t\t\tthis.resetForm()\n\t\t}\n\n\t\t/** Native FACE lifecycle — called when the form's disabled state changes. */\n\t\tformDisabledCallback(disabled: boolean): void {\n\t\t\tthis.disabled = disabled\n\t\t}\n\n\t\t/**\n\t\t * Native FACE lifecycle — restore value after bfcache / form autofill.\n\t\t */\n\t\tformStateRestoreCallback(state: string | File | FormData | null): void {\n\t\t\tif (state == null) return\n\t\t\tthis.value = state as any\n\t\t}\n\n\t\t/** Override to customize reset behavior; default restores `_defaultValue`. */\n\t\tresetForm(): void {\n\t\t\tthis.value = this._defaultValue ?? ''\n\t\t\tthis.error = false\n\t\t\tthis.validationMessage = ''\n\t\t\tthis.touched = false\n\t\t\tthis.submitted = false\n\t\t\tthis.internals?.setValidity({})\n\t\t}\n\n\t\t/**\n\t\t * Contribute entries to a parent FormData. Default: a single\n\t\t * `[name, value]` pair when `name` is set and value is meaningful.\n\t\t * Override for multi-entry controls (e.g. date range).\n\t\t */\n\t\ttoFormEntries(): Array<[string, FormDataEntryValue]> {\n\t\t\tif (!this.name || this.disabled) return []\n\t\t\tconst v = this.value\n\t\t\tif (v === undefined || v === null || v === '') return []\n\t\t\tif (Array.isArray(v)) return v.map(item => [this.name, String(item)] as [string, FormDataEntryValue])\n\t\t\tif (typeof v === 'boolean') return v ? [[this.name, 'on']] : []\n\t\t\treturn [[this.name, String(v)]]\n\t\t}\n\n\t\tcheckValidity(): boolean {\n\t\t\tif (this.disabled) {\n\t\t\t\tthis.internals?.setValidity({})\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\tconst requiredFailed =\n\t\t\t\tthis.required && (this.value === '' || this.value === undefined || this.value === null)\n\t\t\t// Custom errors set via setCustomValidity() are platform-truth too —\n\t\t\t// preserve them through re-validation cycles.\n\t\t\tconst customErrorSet = !!this.internals?.validity?.customError\n\t\t\tconst isValid = !requiredFailed && !customErrorSet\n\t\t\tconst requiredMessage =\n\t\t\t\tthis.errorMessages?.valueMissing ?? 'This field is required'\n\t\t\tconst defaultMessage = requiredFailed ? requiredMessage : 'Invalid value'\n\n\t\t\t// Platform validity (read by `form.checkValidity()` and `:invalid`)\n\t\t\t// is always set to the truth — independent of the visual gate.\n\t\t\tif (requiredFailed) {\n\t\t\t\tthis.internals?.setValidity(\n\t\t\t\t\t{ valueMissing: true },\n\t\t\t\t\tthis.validationMessage || defaultMessage,\n\t\t\t\t)\n\t\t\t} else if (!customErrorSet) {\n\t\t\t\t// No required failure, no custom error — clear flags.\n\t\t\t\tthis.internals?.setValidity({})\n\t\t\t}\n\t\t\t// (customErrorSet branch falls through — leave the custom validity intact.)\n\n\t\t\t// Visual `error` flag is gated. The returned boolean tells the caller\n\t\t\t// the truth; only the in-component error display is suppressed for\n\t\t\t// pristine fields under `validateOn: 'dirty'`.\n\t\t\tif (this._shouldShowError()) {\n\t\t\t\tthis.error = !isValid\n\t\t\t\tif (!isValid && !this.validationMessage) {\n\t\t\t\t\tthis.validationMessage = defaultMessage\n\t\t\t\t} else if (isValid) {\n\t\t\t\t\tthis.validationMessage = ''\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn isValid\n\t\t}\n\n\t\treportValidity(): boolean {\n\t\t\tconst isValid = this.checkValidity()\n\t\t\tif (!isValid) this.internals?.reportValidity()\n\t\t\treturn isValid\n\t\t}\n\n\t\tsetCustomValidity(message: string): void {\n\t\t\tthis.validationMessage = message\n\t\t\tthis.error = message !== ''\n\t\t\tif (message) {\n\t\t\t\tthis.internals?.setValidity({ customError: true }, message)\n\t\t\t} else {\n\t\t\t\tthis.internals?.setValidity({})\n\t\t\t}\n\t\t}\n\n\t\temitChange(detail: any): void {\n\t\t\tif ('dispatchScopedEvent' in this && typeof this.dispatchScopedEvent === 'function') {\n\t\t\t\tthis.dispatchScopedEvent('change', detail, { bubbles: true })\n\t\t\t} else {\n\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\tnew CustomEvent('change', {\n\t\t\t\t\t\tdetail,\n\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\tcomposed: true,\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn FormFieldMixinClass as Constructor<IFormFieldMixin> & T\n}\n\n/**\n * A convenience function that composes FormFieldMixin with SchmancyElement\n * to create a base class for Schmancy form components. Subclasses gain the\n * full SchmancyElement stack (SignalWatcher, _activeHost wrap, AbortSignal,\n * automatic Tailwind injection) plus the form-field semantics.\n */\nexport function SchmancyFormField<T extends CSSResult>(componentStyle?: T) {\n\tclass StyledSchmancyElement extends SchmancyElement {\n\t\tstatic styles = componentStyle ? [componentStyle] : []\n\t}\n\treturn FormFieldMixin(StyledSchmancyElement) as unknown as Constructor<IFormFieldMixin> &\n\t\tConstructor<ITailwindElementMixin> &\n\t\tConstructor<LitElement> &\n\t\tConstructor<IBaseMixin>\n}\n","import { CSSResult, LitElement } from 'lit'\nimport { IBaseMixin } from './baseElement'\nimport { Constructor } from './constructor'\nimport { SchmancyElement } from './SchmancyElement'\n\n/**\n * @deprecated Extend `SchmancyElement` directly and declare `static styles`.\n *\n * Before: extends $LitElement(css`...`)\n * After: extends SchmancyElement { static styles = [css`...`] }\n *\n * Kept as a thin alias for the migration window; will be removed in the next\n * major Schmancy release. The returned class extends `SchmancyElement` so\n * runtime semantics (Tailwind injection, `disconnecting` Subject,\n * `disconnectedSignal` AbortSignal, SignalWatcher) match exactly.\n */\nexport const $LitElement = <T extends CSSResult>(componentStyle?: T) => {\n\tclass LegacyAlias extends SchmancyElement {\n\t\tstatic styles = componentStyle ? [componentStyle] : []\n\t}\n\treturn LegacyAlias as CustomElementConstructor &\n\t\tConstructor<LitElement> &\n\t\tConstructor<IBaseMixin>\n}\n","import { css } from 'lit'\n\n/**\n * Luminous Glass surface type styles.\n *\n * Depth model: blur intensity + opacity replaces M3 tonal hierarchy.\n * - solid: opaque ground (0 blur, 100% opacity)\n * - subtle: frosted panel (4px blur, ~72% opacity)\n * - glass: full frosted glass (20px blur, ~55% opacity)\n * - luminous: glass + glow halo (24px blur, ~22% opacity)\n */\nexport const surfaceTypeStyles = css`\n\t/* ================================================================\n\t STRUCTURAL TYPES — All-glass depth model.\n\t Nothing is opaque. Every layer is translucent.\n\t Blur creates readability. Light borders isolate layers.\n\t Rule: text must ALWAYS be readable on every surface.\n\t ================================================================ */\n\n\t/* Solid — dense glass, high readability ground layer (no blur — 92% opacity is enough) */\n\t:host([type='solid']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\t\tbackground: color-mix(in srgb, var(--glass-base) 92%, transparent);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t}\n\n\t/* Subtle — bright vibrant glass: near-white tint, saturated blur, top-edge highlight */\n\t:host([type='subtle']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\t\tbackground: color-mix(in srgb, var(--glass-base) 30%, transparent);\n\t\tbackdrop-filter: blur(12px) saturate(160%);\n\t\t-webkit-backdrop-filter: blur(12px) saturate(160%);\n\t\tborder: 1px solid color-mix(in srgb, var(--schmancy-sys-color-outlineVariant) 60%, transparent);\n\t\tbox-shadow: inset 0 1px 0 color-mix(in srgb, var(--schmancy-sys-color-surface-on) 8%, transparent);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t}\n\n\t/* Glass — frosted glass, blur ensures readability */\n\t:host([type='glass']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\n\t\tbackground: color-mix(in srgb, var(--glass-base) 55%, transparent);\n\t\tbackdrop-filter: blur(16px) saturate(180%) brightness(1.05);\n\t\t-webkit-backdrop-filter: blur(16px) saturate(180%) brightness(1.05);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t\tcontain: content;\n\t\tposition: relative;\n\t\toverflow: hidden;\n\t\tisolation: isolate;\n\t}\n\n\t/* Luminous — glass + glow halo, heavy blur keeps readability */\n\t:host([type='luminous']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\t\t--glow-color: var(--schmancy-sys-color-primary-default);\n\n\t\tbackground: color-mix(in srgb, var(--glass-base) 42%, transparent);\n\t\tbackdrop-filter: blur(20px) saturate(200%) brightness(1.08);\n\t\t-webkit-backdrop-filter: blur(20px) saturate(200%) brightness(1.08);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t\tcontain: content;\n\t\tposition: relative;\n\t\toverflow: hidden;\n\t\tisolation: isolate;\n\t}\n\n\t/* ================================================================\n\t UTILITY TYPES\n\t ================================================================ */\n\n\t/* Transparent — no background */\n\t:host([type='transparent']) {\n\t\tbackground-color: transparent;\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t}\n\n\t/* Outlined — border with luminous hover potential */\n\t:host([type='outlined']) {\n\t\tbackground-color: transparent;\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t\tborder: 1px solid var(--schmancy-sys-color-outlineVariant);\n\t\ttransition: border-color 300ms ease, box-shadow 300ms ease;\n\t}\n\n\t/* ================================================================\n\t SEMANTIC TYPES — tinted glass for status/role\n\t ================================================================ */\n\n\t:host([type='primary']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-primary-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-primary-default);\n\t}\n\t:host([type='secondary']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-secondary-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-secondary-default);\n\t}\n\t:host([type='tertiary']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-tertiary-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-tertiary-default);\n\t}\n\t:host([type='error']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-error-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-error-onContainer);\n\t}\n\t:host([type='success']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-success-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-success-onContainer);\n\t}\n\t:host([type='warning']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-warning-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-warning-onContainer);\n\t}\n\t:host([type='info']) {\n\t\tbackground: color-mix(in srgb, var(--schmancy-sys-color-info-default) 12%, transparent);\n\t\tbackdrop-filter: blur(4px) saturate(140%);\n\t\t-webkit-backdrop-filter: blur(4px) saturate(140%);\n\t\tcolor: var(--schmancy-sys-color-info-onContainer);\n\t}\n\n\t/* ================================================================\n\t LEGACY M3 ALIASES — backward compatibility\n\t Old type names render as their new Luminous Glass equivalents.\n\t ================================================================ */\n\n\t/* solid aliases — dense glass */\n\t:host([type='surface']),\n\t:host([type='surfaceDim']),\n\t:host([type='surfaceBright']),\n\t:host([type='containerLowest']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\t\tbackground: color-mix(in srgb, var(--glass-base) 92%, transparent);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t}\n\n\t/* subtle aliases — bright vibrant glass */\n\t:host([type='containerLow']),\n\t:host([type='container']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\t\tbackground: color-mix(in srgb, var(--glass-base) 30%, transparent);\n\t\tbackdrop-filter: blur(12px) saturate(160%);\n\t\t-webkit-backdrop-filter: blur(12px) saturate(160%);\n\t\tborder: 1px solid color-mix(in srgb, var(--schmancy-sys-color-outlineVariant) 60%, transparent);\n\t\tbox-shadow: inset 0 1px 0 color-mix(in srgb, var(--schmancy-sys-color-surface-on) 8%, transparent);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t}\n\n\t/* glass aliases */\n\t:host([type='containerHigh']),\n\t:host([type='containerHighest']),\n\t:host([type='glassOforim']) {\n\t\t--glass-base: var(--schmancy-sys-color-surface-lowest);\n\t\t--glass-tint: var(--schmancy-sys-color-surface-on);\n\n\t\tbackground: color-mix(in srgb, var(--glass-base) 55%, transparent);\n\t\tbackdrop-filter: blur(16px) saturate(180%) brightness(1.05);\n\t\t-webkit-backdrop-filter: blur(16px) saturate(180%) brightness(1.05);\n\t\tcolor: var(--schmancy-sys-color-surface-on);\n\t\tposition: relative;\n\t\toverflow: hidden;\n\t\tisolation: isolate;\n\t}\n\n\t/* ================================================================\n\t REDUCED MOTION — disable glass animations\n\t ================================================================ */\n`\n\n/**\n * Surface rounded corner styles\n */\nexport const surfaceRoundedStyles = css`\n\t:host([rounded='none']) {\n\t\tborder-radius: 0;\n\t}\n\t:host([rounded='top']) {\n\t\tborder-radius: var(--schmancy-sys-shape-corner-large) var(--schmancy-sys-shape-corner-large) 0 0;\n\t}\n\t:host([rounded='left']) {\n\t\tborder-radius: var(--schmancy-sys-shape-corner-large) 0 0 var(--schmancy-sys-shape-corner-large);\n\t}\n\t:host([rounded='right']) {\n\t\tborder-radius: 0 var(--schmancy-sys-shape-corner-large) var(--schmancy-sys-shape-corner-large) 0;\n\t}\n\t:host([rounded='bottom']) {\n\t\tborder-radius: 0 0 var(--schmancy-sys-shape-corner-large) var(--schmancy-sys-shape-corner-large);\n\t}\n\t:host([rounded='all']) {\n\t\tborder-radius: var(--schmancy-sys-shape-corner-large);\n\t}\n`\n\n/**\n * Luminous glow elevation — replaces M3 dark drop shadows with primary-colored glow.\n * No ::after tint overlay — depth comes from glow intensity, not surface tint.\n */\nexport const surfaceElevationStyles = css`\n\t:host([elevation='1']) {\n\t\tbox-shadow: 0 2px 12px -2px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 15%, transparent);\n\t\tposition: relative;\n\t}\n\t:host([elevation='2']) {\n\t\tbox-shadow: 0 4px 20px -2px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 22%, transparent);\n\t\tposition: relative;\n\t}\n\t:host([elevation='3']) {\n\t\tbox-shadow: 0 8px 32px -4px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 28%, transparent);\n\t\tposition: relative;\n\t}\n\t:host([elevation='4']) {\n\t\tbox-shadow: 0 12px 44px -4px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 35%, transparent);\n\t\tposition: relative;\n\t}\n\t:host([elevation='5']) {\n\t\tbox-shadow: 0 20px 60px -4px color-mix(in srgb, var(--schmancy-sys-color-primary-default) 42%, transparent);\n\t\tposition: relative;\n\t}\n`\n\n/**\n * Surface clickable styles - luminous hover, spring active\n */\nexport const surfaceClickableStyles = css`\n\t:host([clickable]) {\n\t\tcursor: pointer;\n\t\tuser-select: none;\n\t\t-webkit-tap-highlight-color: transparent;\n\t\ttransition:\n\t\t\tfilter 200ms ease,\n\t\t\ttransform 300ms cubic-bezier(0.34, 1.56, 0.64, 1),\n\t\t\tbox-shadow 400ms ease;\n\t}\n\t:host([clickable]:hover) {\n\t\tfilter: brightness(1.03);\n\t}\n\t:host([clickable]:active) {\n\t\tfilter: brightness(0.96);\n\t\ttransform: scale(0.98);\n\t\ttransition-duration: 100ms;\n\t}\n\t:host([clickable]:focus-visible) {\n\t\toutline: 2px solid var(--schmancy-sys-color-primary-default);\n\t\toutline-offset: 2px;\n\t}\n\t@media (prefers-reduced-motion: reduce) {\n\t\t:host([clickable]) { transition: filter 150ms ease; }\n\t\t:host([clickable]:hover) { transform: none; box-shadow: none; }\n\t\t:host([clickable]:active) { transform: none; }\n\t}\n`\n\n/**\n * Combined surface styles - includes all surface styling capabilities\n */\nexport const surfaceStyles = css`\n\t${surfaceTypeStyles}\n\t${surfaceRoundedStyles}\n\t${surfaceElevationStyles}\n\t${surfaceClickableStyles}\n`\n","import type { Constructor } from './constructor'\nimport { CSSResultGroup, CSSResultOrNative, LitElement } from 'lit'\nimport { property } from 'lit/decorators.js'\nimport type { TSurfaceColor } from '../src/types/surface'\nimport { surfaceStyles } from '../src/surface/surface.styles'\n\nexport type SchmancySurfaceRounded = 'none' | 'top' | 'left' | 'right' | 'bottom' | 'all'\nexport type SchmancySurfaceElevation = 0 | 1 | 2 | 3 | 4 | 5\n\nexport declare class ISurfaceMixin {\n\trounded: SchmancySurfaceRounded\n\televation: SchmancySurfaceElevation\n\ttype: TSurfaceColor\n\tclickable: boolean\n}\n\n/**\n * SurfaceMixin - Adds surface styling properties AND styles to any LitElement\n *\n * Uses Lit's finalizeStyles hook to inject surfaceStyles CSS for all surface type selectors.\n * This is the recommended pattern for mixins that need to add styles.\n *\n * Provides these reflected properties:\n * - `rounded`: 'none' | 'top' | 'left' | 'right' | 'bottom' | 'all' - Corner rounding\n * - `elevation`: 0-5 - Shadow depth level\n * - `type`: TSurfaceColor - Surface color variant (26+ options)\n *\n * Usage:\n * ```typescript\n * import { SurfaceMixin } from '@mixins/surface.mixin'\n *\n * @customElement('my-component')\n * class MyComponent extends SurfaceMixin(TailwindElement(css`\n * :host { display: block; }\n * `)) {\n * // Component now has type, fill, rounded, elevation properties\n * // AND surfaceStyles are automatically included\n * }\n * ```\n */\nexport const SurfaceMixin = <T extends Constructor<LitElement>>(superClass: T) => {\n\tclass SurfaceMixinClass extends superClass {\n\t\t/**\n\t\t * Override finalizeStyles to inject surfaceStyles.\n\t\t * This is the Lit-recommended way for mixins to add styles.\n\t\t */\n\t\tprotected static finalizeStyles(styles?: CSSResultGroup): CSSResultOrNative[] {\n\t\t\t// Get parent's finalized styles using LitElement's method\n\t\t\tconst parentStyles = (superClass as unknown as typeof LitElement).finalizeStyles(styles)\n\t\t\t// Append surfaceStyles at the end (higher specificity)\n\t\t\treturn [...parentStyles, surfaceStyles as CSSResultOrNative]\n\t\t}\n\n\t\t/**\n\t\t * Specifies the rounding style of the component's corners.\n\t\t * @default 'none'\n\t\t */\n\t\t@property({ reflect: true })\n\t\trounded: SchmancySurfaceRounded = 'none'\n\n\t\t/**\n\t\t * Defines the elevation level (shadow depth) of the surface.\n\t\t * @default 0\n\t\t */\n\t\t@property({ type: Number, reflect: true })\n\t\televation: SchmancySurfaceElevation = 0\n\n\t\t/**\n\t\t * Specifies the surface type for styling.\n\t\t * @default 'container'\n\t\t */\n\t\t@property({ reflect: true })\n\t\ttype: TSurfaceColor = 'subtle'\n\n\t\t/**\n\t\t * Makes the surface interactive with hover, active states and cursor pointer.\n\t\t * @default false\n\t\t */\n\t\t@property({ type: Boolean, reflect: true })\n\t\tclickable = false\n\t}\n\treturn SurfaceMixinClass as Constructor<ISurfaceMixin> & T\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- require(`./chunk-CncqDLb2.cjs`);const e=require(`./SchmancyElement-D8_z9JrW.cjs`);let t=require(`lit/decorators.js`),n=require(`lit`);var r=Symbol.for(`schmancy.form-field`),i=`schmancy:field:connect`;function a(e){return!!e&&typeof e==`object`&&!0===e.constructor?.[r]}function o(n){class a extends n{static{this.formAssociated=!0}static{this[r]=!0}get dirty(){return this._defaultValue!==void 0&&this.value!==this._defaultValue}get pristine(){return!this.dirty}markTouched(){this.touched||=!0}markSubmitted(){this.submitted||=!0}clearSubmitted(){this.submitted&&=!1}async runAsyncValidator(e){this.isValidating&&this._asyncValidatorEpoch++;let t=++this._asyncValidatorEpoch;this.isValidating=!0;try{let n=await e();if(t!==this._asyncValidatorEpoch)return;this.setCustomValidity(n)}finally{t===this._asyncValidatorEpoch&&(this.isValidating=!1)}}_shouldShowError(){if(this.submitted)return!0;switch(this.validateOn){case`always`:return!0;case`touched`:return this.touched;case`dirty`:return this.dirty;case`submitted`:return!1;case`length`:if(typeof this.value==`string`){let e=this.maxlength;if(typeof e==`number`&&e>0)return this.value.length>=e}return this.dirty}}constructor(...e){super(...e),this._defaultValue=void 0,this.name=``,this.value=``,this.label=``,this.required=!1,this.disabled=!1,this.readonly=!1,this.error=!1,this.validationMessage=``,this.id=`schmancy-field-${Date.now()}-${Math.floor(1e3*Math.random())}`,this.touched=!1,this.submitted=!1,this.validateOn=`dirty`,this.isValidating=!1,this._asyncValidatorEpoch=0;try{this.internals=this.attachInternals()}catch{this.internals=void 0}}connectedCallback(){super.connectedCallback(),this.dispatchEvent(new CustomEvent(i,{detail:this,bubbles:!0,composed:!0}))}get form(){return this.internals?.form??null}firstUpdated(e){super.firstUpdated?.(e),this._defaultValue===void 0&&(this._defaultValue=this.value),this.checkValidity()}willUpdate(e){super.willUpdate(e),e.has(`value`)&&(this.internals?.setFormValue(this.value),this.dirty?this.internals?.states.add(`dirty`):this.internals?.states.delete(`dirty`),this.checkValidity()),(e.has(`required`)||e.has(`disabled`))&&this.checkValidity(),e.has(`isValidating`)&&(this.isValidating?this.internals?.states.add(`validating`):this.internals?.states.delete(`validating`)),e.has(`touched`)&&(this.touched?this.internals?.states.add(`touched`):this.internals?.states.delete(`touched`),this.touched&&this.dirty&&this.checkValidity()),e.has(`submitted`)&&(this.submitted?(this.internals?.states.add(`submitted`),this.checkValidity()):this.internals?.states.delete(`submitted`)),e.has(`error`)&&(this.error?this.internals?.states.add(`invalid`):this.internals?.states.delete(`invalid`),this.internals&&(this.internals.ariaInvalid=this.error?`true`:`false`)),(e.has(`required`)||e.has(`disabled`))&&(this.required?this.internals?.states.add(`required`):this.internals?.states.delete(`required`),this.internals&&(this.internals.ariaRequired=this.required&&!this.disabled?`true`:`false`)),e.has(`disabled`)&&(this.disabled?this.internals?.states.add(`disabled`):this.internals?.states.delete(`disabled`)),e.has(`readonly`)&&(this.readonly?this.internals?.states.add(`readonly`):this.internals?.states.delete(`readonly`))}formResetCallback(){this.resetForm()}formDisabledCallback(e){this.disabled=e}formStateRestoreCallback(e){e!=null&&(this.value=e)}resetForm(){this.value=this._defaultValue??``,this.error=!1,this.validationMessage=``,this.touched=!1,this.submitted=!1,this.internals?.setValidity({})}toFormEntries(){if(!this.name||this.disabled)return[];let e=this.value;return e==null||e===``?[]:Array.isArray(e)?e.map(e=>[this.name,String(e)]):typeof e==`boolean`?e?[[this.name,`on`]]:[]:[[this.name,String(e)]]}checkValidity(){if(this.disabled)return this.internals?.setValidity({}),!0;let e=this.required&&(this.value===``||this.value===void 0||this.value===null),t=!!this.internals?.validity?.customError,n=!e&&!t,r=this.errorMessages?.valueMissing??`This field is required`,i=e?r:`Invalid value`;return e?this.internals?.setValidity({valueMissing:!0},this.validationMessage||i):t||this.internals?.setValidity({}),this._shouldShowError()&&(this.error=!n,n||this.validationMessage?n&&(this.validationMessage=``):this.validationMessage=i),n}reportValidity(){let e=this.checkValidity();return e||this.internals?.reportValidity(),e}setCustomValidity(e){this.validationMessage=e,this.error=e!==``,e?this.internals?.setValidity({customError:!0},e):this.internals?.setValidity({})}emitChange(e){`dispatchScopedEvent`in this&&typeof this.dispatchScopedEvent==`function`?this.dispatchScopedEvent(`change`,e,{bubbles:!0}):this.dispatchEvent(new CustomEvent(`change`,{detail:e,bubbles:!0,composed:!0}))}}return e.u([(0,t.property)({type:String})],a.prototype,`name`,void 0),e.u([(0,t.property)({reflect:!0})],a.prototype,`value`,void 0),e.u([(0,t.property)({type:String})],a.prototype,`label`,void 0),e.u([(0,t.property)({type:Boolean,reflect:!0})],a.prototype,`required`,void 0),e.u([(0,t.property)({type:Boolean,reflect:!0})],a.prototype,`disabled`,void 0),e.u([(0,t.property)({type:Boolean,reflect:!0})],a.prototype,`readonly`,void 0),e.u([(0,t.property)({type:Boolean,reflect:!0})],a.prototype,`error`,void 0),e.u([(0,t.property)({type:String})],a.prototype,`validationMessage`,void 0),e.u([(0,t.property)({type:String})],a.prototype,`hint`,void 0),e.u([(0,t.property)({reflect:!0})],a.prototype,`id`,void 0),e.u([(0,t.state)()],a.prototype,`touched`,void 0),e.u([(0,t.state)()],a.prototype,`submitted`,void 0),e.u([(0,t.property)({type:String,reflect:!0})],a.prototype,`validateOn`,void 0),e.u([(0,t.property)({attribute:!1})],a.prototype,`errorMessages`,void 0),e.u([(0,t.state)()],a.prototype,`isValidating`,void 0),a}function s(t){class n extends e.t{static{this.styles=t?[t]:[]}}return o(n)}var c=t=>{class n extends e.t{static{this.styles=t?[t]:[]}}return n},l=n.css`
1
+ require(`./chunk-CncqDLb2.cjs`);const e=require(`./SchmancyElement-CYIif26I.cjs`);let t=require(`lit/decorators.js`),n=require(`lit`);var r=Symbol.for(`schmancy.form-field`),i=`schmancy:field:connect`;function a(e){return!!e&&typeof e==`object`&&!0===e.constructor?.[r]}function o(n){class a extends n{static{this.formAssociated=!0}static{this[r]=!0}get dirty(){return this._defaultValue!==void 0&&this.value!==this._defaultValue}get pristine(){return!this.dirty}markTouched(){this.touched||=!0}markSubmitted(){this.submitted||=!0}clearSubmitted(){this.submitted&&=!1}async runAsyncValidator(e){this.isValidating&&this._asyncValidatorEpoch++;let t=++this._asyncValidatorEpoch;this.isValidating=!0;try{let n=await e();if(t!==this._asyncValidatorEpoch)return;this.setCustomValidity(n)}finally{t===this._asyncValidatorEpoch&&(this.isValidating=!1)}}_shouldShowError(){if(this.submitted)return!0;switch(this.validateOn){case`always`:return!0;case`touched`:return this.touched;case`dirty`:return this.dirty;case`submitted`:return!1;case`length`:if(typeof this.value==`string`){let e=this.maxlength;if(typeof e==`number`&&e>0)return this.value.length>=e}return this.dirty}}constructor(...e){super(...e),this._defaultValue=void 0,this.name=``,this.value=``,this.label=``,this.required=!1,this.disabled=!1,this.readonly=!1,this.error=!1,this.validationMessage=``,this.id=`schmancy-field-${Date.now()}-${Math.floor(1e3*Math.random())}`,this.touched=!1,this.submitted=!1,this.validateOn=`dirty`,this.isValidating=!1,this._asyncValidatorEpoch=0;try{this.internals=this.attachInternals()}catch{this.internals=void 0}}connectedCallback(){super.connectedCallback(),this.dispatchEvent(new CustomEvent(i,{detail:this,bubbles:!0,composed:!0}))}get form(){return this.internals?.form??null}firstUpdated(e){super.firstUpdated?.(e),this._defaultValue===void 0&&(this._defaultValue=this.value),this.checkValidity()}willUpdate(e){super.willUpdate(e),e.has(`value`)&&(this.internals?.setFormValue(this.value),this.dirty?this.internals?.states.add(`dirty`):this.internals?.states.delete(`dirty`),this.checkValidity()),(e.has(`required`)||e.has(`disabled`))&&this.checkValidity(),e.has(`isValidating`)&&(this.isValidating?this.internals?.states.add(`validating`):this.internals?.states.delete(`validating`)),e.has(`touched`)&&(this.touched?this.internals?.states.add(`touched`):this.internals?.states.delete(`touched`),this.touched&&this.dirty&&this.checkValidity()),e.has(`submitted`)&&(this.submitted?(this.internals?.states.add(`submitted`),this.checkValidity()):this.internals?.states.delete(`submitted`)),e.has(`error`)&&(this.error?this.internals?.states.add(`invalid`):this.internals?.states.delete(`invalid`),this.internals&&(this.internals.ariaInvalid=this.error?`true`:`false`)),(e.has(`required`)||e.has(`disabled`))&&(this.required?this.internals?.states.add(`required`):this.internals?.states.delete(`required`),this.internals&&(this.internals.ariaRequired=this.required&&!this.disabled?`true`:`false`)),e.has(`disabled`)&&(this.disabled?this.internals?.states.add(`disabled`):this.internals?.states.delete(`disabled`)),e.has(`readonly`)&&(this.readonly?this.internals?.states.add(`readonly`):this.internals?.states.delete(`readonly`))}formResetCallback(){this.resetForm()}formDisabledCallback(e){this.disabled=e}formStateRestoreCallback(e){e!=null&&(this.value=e)}resetForm(){this.value=this._defaultValue??``,this.error=!1,this.validationMessage=``,this.touched=!1,this.submitted=!1,this.internals?.setValidity({})}toFormEntries(){if(!this.name||this.disabled)return[];let e=this.value;return e==null||e===``?[]:Array.isArray(e)?e.map(e=>[this.name,String(e)]):typeof e==`boolean`?e?[[this.name,`on`]]:[]:[[this.name,String(e)]]}checkValidity(){if(this.disabled)return this.internals?.setValidity({}),!0;let e=this.required&&(this.value===``||this.value===void 0||this.value===null),t=!!this.internals?.validity?.customError,n=!e&&!t,r=this.errorMessages?.valueMissing??`This field is required`,i=e?r:`Invalid value`;return e?this.internals?.setValidity({valueMissing:!0},this.validationMessage||i):t||this.internals?.setValidity({}),this._shouldShowError()&&(this.error=!n,n||this.validationMessage?n&&(this.validationMessage=``):this.validationMessage=i),n}reportValidity(){let e=this.checkValidity();return e||this.internals?.reportValidity(),e}setCustomValidity(e){this.validationMessage=e,this.error=e!==``,e?this.internals?.setValidity({customError:!0},e):this.internals?.setValidity({})}emitChange(e){`dispatchScopedEvent`in this&&typeof this.dispatchScopedEvent==`function`?this.dispatchScopedEvent(`change`,e,{bubbles:!0}):this.dispatchEvent(new CustomEvent(`change`,{detail:e,bubbles:!0,composed:!0}))}}return e.u([(0,t.property)({type:String})],a.prototype,`name`,void 0),e.u([(0,t.property)({reflect:!0})],a.prototype,`value`,void 0),e.u([(0,t.property)({type:String})],a.prototype,`label`,void 0),e.u([(0,t.property)({type:Boolean,reflect:!0})],a.prototype,`required`,void 0),e.u([(0,t.property)({type:Boolean,reflect:!0})],a.prototype,`disabled`,void 0),e.u([(0,t.property)({type:Boolean,reflect:!0})],a.prototype,`readonly`,void 0),e.u([(0,t.property)({type:Boolean,reflect:!0})],a.prototype,`error`,void 0),e.u([(0,t.property)({type:String})],a.prototype,`validationMessage`,void 0),e.u([(0,t.property)({type:String})],a.prototype,`hint`,void 0),e.u([(0,t.property)({reflect:!0})],a.prototype,`id`,void 0),e.u([(0,t.state)()],a.prototype,`touched`,void 0),e.u([(0,t.state)()],a.prototype,`submitted`,void 0),e.u([(0,t.property)({type:String,reflect:!0})],a.prototype,`validateOn`,void 0),e.u([(0,t.property)({attribute:!1})],a.prototype,`errorMessages`,void 0),e.u([(0,t.state)()],a.prototype,`isValidating`,void 0),a}function s(t){class n extends e.t{static{this.styles=t?[t]:[]}}return o(n)}var c=t=>{class n extends e.t{static{this.styles=t?[t]:[]}}return n},l=n.css`
2
2
  /* ================================================================
3
3
  STRUCTURAL TYPES — All-glass depth model.
4
4
  Nothing is opaque. Every layer is translucent.