@mhmo91/schmancy 0.4.73 → 0.4.74

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 (386) hide show
  1. package/ai/area.md +525 -108
  2. package/ai/busy.md +2 -1
  3. package/ai/button.md +4 -0
  4. package/ai/code-highlight.md +2 -1
  5. package/ai/content-drawer.md +2 -1
  6. package/ai/context.md +7 -2
  7. package/ai/countries.md +2 -1
  8. package/ai/date-range-inline.md +262 -0
  9. package/ai/date-range.md +2 -1
  10. package/ai/details.md +194 -0
  11. package/ai/dialog.md +2 -1
  12. package/ai/directives.md +2 -1
  13. package/ai/form.md +10 -10
  14. package/ai/list.md +10 -9
  15. package/ai/mailbox.md +530 -0
  16. package/ai/map.md +2 -1
  17. package/ai/notification.md +14 -12
  18. package/ai/payment-card-form.md +2 -1
  19. package/ai/sheet.md +6 -4
  20. package/ai/steps.md +6 -0
  21. package/ai/store.md +8 -4
  22. package/ai/surface.md +2 -1
  23. package/ai/teleport.md +2 -1
  24. package/ai/theme.md +690 -8
  25. package/ai/timezone.md +2 -1
  26. package/ai/typography.md +2 -1
  27. package/dist/ai/area.md +525 -108
  28. package/dist/ai/busy.md +2 -1
  29. package/dist/ai/button.md +4 -0
  30. package/dist/ai/code-highlight.md +2 -1
  31. package/dist/ai/content-drawer.md +2 -1
  32. package/dist/ai/context.md +7 -2
  33. package/dist/ai/countries.md +2 -1
  34. package/dist/ai/date-range-inline.md +262 -0
  35. package/dist/ai/date-range.md +2 -1
  36. package/dist/ai/details.md +194 -0
  37. package/dist/ai/dialog.md +2 -1
  38. package/dist/ai/directives.md +2 -1
  39. package/dist/ai/form.md +10 -10
  40. package/dist/ai/list.md +10 -9
  41. package/dist/ai/mailbox.md +530 -0
  42. package/dist/ai/map.md +2 -1
  43. package/dist/ai/notification.md +14 -12
  44. package/dist/ai/payment-card-form.md +2 -1
  45. package/dist/ai/sheet.md +6 -4
  46. package/dist/ai/steps.md +6 -0
  47. package/dist/ai/store.md +8 -4
  48. package/dist/ai/surface.md +2 -1
  49. package/dist/ai/teleport.md +2 -1
  50. package/dist/ai/theme.md +690 -8
  51. package/dist/ai/timezone.md +2 -1
  52. package/dist/ai/typography.md +2 -1
  53. package/dist/{animated-text-Dj3HHUD4.js → animated-text-CqpyC7Y0.js} +3 -3
  54. package/dist/{animated-text-Dj3HHUD4.js.map → animated-text-CqpyC7Y0.js.map} +1 -1
  55. package/dist/{animated-text-CPAqO_J3.cjs → animated-text-DlRt6Q09.cjs} +2 -2
  56. package/dist/{animated-text-CPAqO_J3.cjs.map → animated-text-DlRt6Q09.cjs.map} +1 -1
  57. package/dist/animated-text.cjs +1 -1
  58. package/dist/animated-text.js +1 -1
  59. package/dist/area.cjs +1 -1
  60. package/dist/area.js +1 -1
  61. package/dist/{autocomplete-kJ7y028b.js → autocomplete-B-oKMH7m.js} +3 -3
  62. package/dist/{autocomplete-kJ7y028b.js.map → autocomplete-B-oKMH7m.js.map} +1 -1
  63. package/dist/{autocomplete-B3ArCTZl.cjs → autocomplete-BOGG_9iL.cjs} +2 -2
  64. package/dist/{autocomplete-B3ArCTZl.cjs.map → autocomplete-BOGG_9iL.cjs.map} +1 -1
  65. package/dist/autocomplete.cjs +1 -1
  66. package/dist/autocomplete.js +1 -1
  67. package/dist/{avatar-DI5vtg3k.js → avatar-U5IpwJuj.js} +50 -50
  68. package/dist/{avatar-DI5vtg3k.js.map → avatar-U5IpwJuj.js.map} +1 -1
  69. package/dist/{avatar-r7OnlyPP.cjs → avatar-qkIAB2cX.cjs} +2 -2
  70. package/dist/{avatar-r7OnlyPP.cjs.map → avatar-qkIAB2cX.cjs.map} +1 -1
  71. package/dist/badge.cjs +1 -1
  72. package/dist/badge.js +1 -1
  73. package/dist/{boat-Cp8VgFWP.js → boat-CdR5Pqik.js} +2 -2
  74. package/dist/{boat-Cp8VgFWP.js.map → boat-CdR5Pqik.js.map} +1 -1
  75. package/dist/{boat-COlWXsv8.cjs → boat-DMKcZpZb.cjs} +2 -2
  76. package/dist/{boat-COlWXsv8.cjs.map → boat-DMKcZpZb.cjs.map} +1 -1
  77. package/dist/boat.cjs +1 -1
  78. package/dist/boat.js +1 -1
  79. package/dist/busy.cjs +1 -1
  80. package/dist/busy.js +1 -1
  81. package/dist/button.cjs +1 -1
  82. package/dist/button.js +1 -1
  83. package/dist/card.cjs +1 -1
  84. package/dist/card.js +1 -1
  85. package/dist/{checkbox-Cbkcvj-3.js → checkbox-CVwU3M4h.js} +2 -2
  86. package/dist/{checkbox-Cbkcvj-3.js.map → checkbox-CVwU3M4h.js.map} +1 -1
  87. package/dist/{checkbox-u355dDEB.cjs → checkbox-DP_zX786.cjs} +2 -2
  88. package/dist/{checkbox-u355dDEB.cjs.map → checkbox-DP_zX786.cjs.map} +1 -1
  89. package/dist/checkbox.cjs +1 -1
  90. package/dist/checkbox.js +1 -1
  91. package/dist/{chips-BFn88CJs.cjs → chips-BuMUH3zA.cjs} +2 -2
  92. package/dist/{chips-BFn88CJs.cjs.map → chips-BuMUH3zA.cjs.map} +1 -1
  93. package/dist/{chips-Y5nzkBJw.js → chips-DcCUwYBu.js} +3 -3
  94. package/dist/{chips-Y5nzkBJw.js.map → chips-DcCUwYBu.js.map} +1 -1
  95. package/dist/chips.cjs +1 -1
  96. package/dist/chips.js +1 -1
  97. package/dist/code-highlight.cjs +1 -1
  98. package/dist/code-highlight.js +1 -1
  99. package/dist/{code-preview-D2peRzvQ.js → code-preview-CIXEd04f.js} +3 -3
  100. package/dist/{code-preview-D2peRzvQ.js.map → code-preview-CIXEd04f.js.map} +1 -1
  101. package/dist/{code-preview-CsQWYHL5.cjs → code-preview-CdCzzZTX.cjs} +3 -3
  102. package/dist/{code-preview-CsQWYHL5.cjs.map → code-preview-CdCzzZTX.cjs.map} +1 -1
  103. package/dist/components.cjs +1 -1
  104. package/dist/components.js +1 -1
  105. package/dist/content-drawer.cjs +1 -1
  106. package/dist/content-drawer.js +1 -1
  107. package/dist/{date-range-Ya1J9HQQ.cjs → date-range-CvD9zwK9.cjs} +2 -2
  108. package/dist/{date-range-Ya1J9HQQ.cjs.map → date-range-CvD9zwK9.cjs.map} +1 -1
  109. package/dist/{date-range-inline-Q5qz2lG_.js → date-range-inline-5QP9av94.js} +3 -3
  110. package/dist/{date-range-inline-Q5qz2lG_.js.map → date-range-inline-5QP9av94.js.map} +1 -1
  111. package/dist/{date-range-inline-CXBrxoim.cjs → date-range-inline-CP_a_w01.cjs} +2 -2
  112. package/dist/{date-range-inline-CXBrxoim.cjs.map → date-range-inline-CP_a_w01.cjs.map} +1 -1
  113. package/dist/date-range-inline.cjs +1 -1
  114. package/dist/date-range-inline.js +1 -1
  115. package/dist/{date-range-DnKu_v9b.js → date-range-lJ_fPY4v.js} +4 -4
  116. package/dist/{date-range-DnKu_v9b.js.map → date-range-lJ_fPY4v.js.map} +1 -1
  117. package/dist/date-range.cjs +1 -1
  118. package/dist/date-range.js +1 -1
  119. package/dist/{delay-DVqCtHik.js → delay-BM1jk7XF.js} +2 -2
  120. package/dist/{delay-DVqCtHik.js.map → delay-BM1jk7XF.js.map} +1 -1
  121. package/dist/{delay-Dl6B_yyv.cjs → delay-CB0Wohe7.cjs} +2 -2
  122. package/dist/{delay-Dl6B_yyv.cjs.map → delay-CB0Wohe7.cjs.map} +1 -1
  123. package/dist/delay.cjs +1 -1
  124. package/dist/delay.js +1 -1
  125. package/dist/{details-w1ooWiKA.js → details-B9JrXrCO.js} +2 -2
  126. package/dist/{details-w1ooWiKA.js.map → details-B9JrXrCO.js.map} +1 -1
  127. package/dist/{details-LZ_GGbW-.cjs → details-C22WoRWP.cjs} +2 -2
  128. package/dist/{details-LZ_GGbW-.cjs.map → details-C22WoRWP.cjs.map} +1 -1
  129. package/dist/details.cjs +1 -1
  130. package/dist/details.js +1 -1
  131. package/dist/{dialog-content-B7V_S6GR.js → dialog-content-BHR9cUJ-.js} +4 -4
  132. package/dist/{dialog-content-B7V_S6GR.js.map → dialog-content-BHR9cUJ-.js.map} +1 -1
  133. package/dist/{dialog-content-VroTT22f.cjs → dialog-content-CpxWMPlh.cjs} +2 -2
  134. package/dist/{dialog-content-VroTT22f.cjs.map → dialog-content-CpxWMPlh.cjs.map} +1 -1
  135. package/dist/{dialog-service-Dpz_NIRP.js → dialog-service-DwhuICgc.js} +2 -2
  136. package/dist/dialog-service-DwhuICgc.js.map +1 -0
  137. package/dist/dialog-service-juvsgc5X.cjs +2 -0
  138. package/dist/dialog-service-juvsgc5X.cjs.map +1 -0
  139. package/dist/dialog.cjs +1 -1
  140. package/dist/dialog.js +2 -2
  141. package/dist/{divider-OuCqxcUB.js → divider-Cz4g_Ept.js} +3 -3
  142. package/dist/{divider-OuCqxcUB.js.map → divider-Cz4g_Ept.js.map} +1 -1
  143. package/dist/{divider-CegpMW-2.cjs → divider-DAg0oW4T.cjs} +2 -2
  144. package/dist/{divider-CegpMW-2.cjs.map → divider-DAg0oW4T.cjs.map} +1 -1
  145. package/dist/divider.cjs +1 -1
  146. package/dist/divider.js +1 -1
  147. package/dist/{dropdown-content-BuKCBydD.js → dropdown-content-Bto1swKT.js} +3 -3
  148. package/dist/{dropdown-content-BuKCBydD.js.map → dropdown-content-Bto1swKT.js.map} +1 -1
  149. package/dist/{dropdown-content-f0LuoUKR.cjs → dropdown-content-QvR9QvT0.cjs} +2 -2
  150. package/dist/{dropdown-content-f0LuoUKR.cjs.map → dropdown-content-QvR9QvT0.cjs.map} +1 -1
  151. package/dist/dropdown.cjs +1 -1
  152. package/dist/dropdown.js +1 -1
  153. package/dist/{email-recipients-CvSwxcso.js → email-recipients-C9Yx0eML.js} +7 -7
  154. package/dist/{email-recipients-CvSwxcso.js.map → email-recipients-C9Yx0eML.js.map} +1 -1
  155. package/dist/{email-recipients-BlEtpbdr.cjs → email-recipients-aEI5Hz1y.cjs} +2 -2
  156. package/dist/{email-recipients-BlEtpbdr.cjs.map → email-recipients-aEI5Hz1y.cjs.map} +1 -1
  157. package/dist/extra.cjs +1 -1
  158. package/dist/extra.js +1 -1
  159. package/dist/{flex-HyTTaFX9.js → flex-8Zt64KfZ.js} +2 -2
  160. package/dist/{flex-HyTTaFX9.js.map → flex-8Zt64KfZ.js.map} +1 -1
  161. package/dist/{flex-Cdv04m_E.cjs → flex-BWZv2xik.cjs} +2 -2
  162. package/dist/{flex-Cdv04m_E.cjs.map → flex-BWZv2xik.cjs.map} +1 -1
  163. package/dist/{form-CXRNS-AS.cjs → form-BH43OMu3.cjs} +2 -2
  164. package/dist/{form-CXRNS-AS.cjs.map → form-BH43OMu3.cjs.map} +1 -1
  165. package/dist/{form-BNTXCzQo.js → form-DeoSuBtM.js} +2 -2
  166. package/dist/{form-BNTXCzQo.js.map → form-DeoSuBtM.js.map} +1 -1
  167. package/dist/form.cjs +1 -1
  168. package/dist/form.js +1 -1
  169. package/dist/{formField.mixin-MhetZTeW.js → formField.mixin-BaPL0TYo.js} +2 -2
  170. package/dist/{formField.mixin-MhetZTeW.js.map → formField.mixin-BaPL0TYo.js.map} +1 -1
  171. package/dist/{formField.mixin-zezhhNIA.cjs → formField.mixin-Dta3OeAY.cjs} +2 -2
  172. package/dist/{formField.mixin-zezhhNIA.cjs.map → formField.mixin-Dta3OeAY.cjs.map} +1 -1
  173. package/dist/{icon-C71zn7AW.js → icon-B0JNrBfq.js} +2 -2
  174. package/dist/{icon-C71zn7AW.js.map → icon-B0JNrBfq.js.map} +1 -1
  175. package/dist/{icon-e6XggWlw.cjs → icon-DY2pBLIU.cjs} +2 -2
  176. package/dist/{icon-e6XggWlw.cjs.map → icon-DY2pBLIU.cjs.map} +1 -1
  177. package/dist/{icon-button-CO8rMFUR.cjs → icon-button-D1GjgM8z.cjs} +2 -2
  178. package/dist/{icon-button-CO8rMFUR.cjs.map → icon-button-D1GjgM8z.cjs.map} +1 -1
  179. package/dist/{icon-button-KoYGGW6a.js → icon-button-OZM1xg0D.js} +3 -3
  180. package/dist/{icon-button-KoYGGW6a.js.map → icon-button-OZM1xg0D.js.map} +1 -1
  181. package/dist/icons.cjs +1 -1
  182. package/dist/icons.js +1 -1
  183. package/dist/index.cjs +1 -1
  184. package/dist/index.js +76 -74
  185. package/dist/index.js.map +1 -1
  186. package/dist/{input-LTpT28E4.js → input-CkvjCut5.js} +3 -3
  187. package/dist/{input-LTpT28E4.js.map → input-CkvjCut5.js.map} +1 -1
  188. package/dist/{input-CFvMe_KR.cjs → input-lUWuO40Q.cjs} +2 -2
  189. package/dist/{input-CFvMe_KR.cjs.map → input-lUWuO40Q.cjs.map} +1 -1
  190. package/dist/input.cjs +1 -1
  191. package/dist/input.js +1 -1
  192. package/dist/layout.cjs +1 -1
  193. package/dist/layout.js +1 -1
  194. package/dist/{list-CAJJTrLl.js → list-5rw56k73.js} +2 -2
  195. package/dist/{list-CAJJTrLl.js.map → list-5rw56k73.js.map} +1 -1
  196. package/dist/{list-D2dyHYN9.cjs → list-CIt75CB5.cjs} +2 -2
  197. package/dist/{list-D2dyHYN9.cjs.map → list-CIt75CB5.cjs.map} +1 -1
  198. package/dist/list.cjs +1 -1
  199. package/dist/list.js +1 -1
  200. package/dist/{litElement.mixin-4iclDbF3.cjs → litElement.mixin-BLa7fWsS.cjs} +2 -2
  201. package/dist/{litElement.mixin-4iclDbF3.cjs.map → litElement.mixin-BLa7fWsS.cjs.map} +1 -1
  202. package/dist/{litElement.mixin-SeAIQuRg.js → litElement.mixin-BZErt4H3.js} +2 -2
  203. package/dist/{litElement.mixin-SeAIQuRg.js.map → litElement.mixin-BZErt4H3.js.map} +1 -1
  204. package/dist/mailbox.cjs +1 -1
  205. package/dist/mailbox.js +1 -1
  206. package/dist/{map-CMkosiu4.cjs → map-BY_0W4ER.cjs} +2 -2
  207. package/dist/{map-CMkosiu4.cjs.map → map-BY_0W4ER.cjs.map} +1 -1
  208. package/dist/{map-DwMX_LnY.js → map-BrguuFGa.js} +2 -2
  209. package/dist/{map-DwMX_LnY.js.map → map-BrguuFGa.js.map} +1 -1
  210. package/dist/map.cjs +1 -1
  211. package/dist/map.js +1 -1
  212. package/dist/{media-B98kFRvT.js → media-CLz2t5zS.js} +2 -2
  213. package/dist/{media-B98kFRvT.js.map → media-CLz2t5zS.js.map} +1 -1
  214. package/dist/{media-DxbLFhc5.cjs → media-D6ZtvTjC.cjs} +2 -2
  215. package/dist/{media-DxbLFhc5.cjs.map → media-D6ZtvTjC.cjs.map} +1 -1
  216. package/dist/{menu-ChMwBut9.js → menu-CgDSJpDV.js} +3 -3
  217. package/dist/{menu-ChMwBut9.js.map → menu-CgDSJpDV.js.map} +1 -1
  218. package/dist/{menu-DTRbll_X.cjs → menu-DWD_IywE.cjs} +2 -2
  219. package/dist/{menu-DTRbll_X.cjs.map → menu-DWD_IywE.cjs.map} +1 -1
  220. package/dist/menu.cjs +1 -1
  221. package/dist/menu.js +1 -1
  222. package/dist/nav-drawer.cjs +1 -1
  223. package/dist/nav-drawer.js +1 -1
  224. package/dist/{notification-service-BiEAwrL6.js → notification-service-1HGYK2tM.js} +4 -4
  225. package/dist/{notification-service-BiEAwrL6.js.map → notification-service-1HGYK2tM.js.map} +1 -1
  226. package/dist/{notification-service-h3GuXar7.cjs → notification-service-A3reAJZQ.cjs} +2 -2
  227. package/dist/{notification-service-h3GuXar7.cjs.map → notification-service-A3reAJZQ.cjs.map} +1 -1
  228. package/dist/notification.cjs +1 -1
  229. package/dist/notification.js +2 -2
  230. package/dist/{notify-1NUgv3Qz.js → notify-Bt-KiLeP.js} +2 -2
  231. package/dist/{notify-1NUgv3Qz.js.map → notify-Bt-KiLeP.js.map} +1 -1
  232. package/dist/{notify-CP9929J0.cjs → notify-CVbsMt75.cjs} +2 -2
  233. package/dist/{notify-CP9929J0.cjs.map → notify-CVbsMt75.cjs.map} +1 -1
  234. package/dist/{option-VxlQIYFR.cjs → option-Cd0TxMBE.cjs} +2 -2
  235. package/dist/{option-VxlQIYFR.cjs.map → option-Cd0TxMBE.cjs.map} +1 -1
  236. package/dist/{option-DvEFWkrm.js → option-DvSZ0D0R.js} +2 -2
  237. package/dist/{option-DvEFWkrm.js.map → option-DvSZ0D0R.js.map} +1 -1
  238. package/dist/option.cjs +1 -1
  239. package/dist/option.js +1 -1
  240. package/dist/{payment-card-form-CEd08rns.js → payment-card-form-C6wrIT_X.js} +3 -3
  241. package/dist/{payment-card-form-CEd08rns.js.map → payment-card-form-C6wrIT_X.js.map} +1 -1
  242. package/dist/{payment-card-form-CAPM_YfT.cjs → payment-card-form-CJkWQ3j4.cjs} +2 -2
  243. package/dist/{payment-card-form-CAPM_YfT.cjs.map → payment-card-form-CJkWQ3j4.cjs.map} +1 -1
  244. package/dist/{progress-Bu8wtPRI.cjs → progress-D0iWLtHk.cjs} +2 -2
  245. package/dist/{progress-Bu8wtPRI.cjs.map → progress-D0iWLtHk.cjs.map} +1 -1
  246. package/dist/{progress-CL4SPk5b.js → progress-pOL6OHwT.js} +2 -2
  247. package/dist/{progress-CL4SPk5b.js.map → progress-pOL6OHwT.js.map} +1 -1
  248. package/dist/progress.cjs +1 -1
  249. package/dist/progress.js +1 -1
  250. package/dist/{radio-button-B087BeTl.js → radio-button-C-t6JJsj.js} +3 -3
  251. package/dist/{radio-button-B087BeTl.js.map → radio-button-C-t6JJsj.js.map} +1 -1
  252. package/dist/{radio-button-vz9nLR-m.cjs → radio-button-CSV7-ftB.cjs} +2 -2
  253. package/dist/{radio-button-vz9nLR-m.cjs.map → radio-button-CSV7-ftB.cjs.map} +1 -1
  254. package/dist/radio-group.cjs +1 -1
  255. package/dist/radio-group.js +1 -1
  256. package/dist/{route.component-ke_nkgvP.cjs → route.component-DaBx0B3g.cjs} +3 -3
  257. package/dist/route.component-DaBx0B3g.cjs.map +1 -0
  258. package/dist/{route.component-D1xujH8n.js → route.component-DlVlAMWF.js} +66 -68
  259. package/dist/route.component-DlVlAMWF.js.map +1 -0
  260. package/dist/{schmancy-steps-container-CEvpeKIe.js → schmancy-steps-container-AIJ2_ZSN.js} +2 -2
  261. package/dist/{schmancy-steps-container-CEvpeKIe.js.map → schmancy-steps-container-AIJ2_ZSN.js.map} +1 -1
  262. package/dist/{schmancy-steps-container-DvSClSo1.cjs → schmancy-steps-container-CgzGlBCk.cjs} +2 -2
  263. package/dist/{schmancy-steps-container-DvSClSo1.cjs.map → schmancy-steps-container-CgzGlBCk.cjs.map} +1 -1
  264. package/dist/{select-BoUYZPyl.js → select-CwJ4OuVo.js} +3 -3
  265. package/dist/{select-BoUYZPyl.js.map → select-CwJ4OuVo.js.map} +1 -1
  266. package/dist/{select-4VXPMU8r.cjs → select-GBaqnfMC.cjs} +2 -2
  267. package/dist/{select-4VXPMU8r.cjs.map → select-GBaqnfMC.cjs.map} +1 -1
  268. package/dist/select.cjs +1 -1
  269. package/dist/select.js +1 -1
  270. package/dist/{sheet-IfHxyIo_.cjs → sheet-CXd47YKG.cjs} +2 -2
  271. package/dist/{sheet-IfHxyIo_.cjs.map → sheet-CXd47YKG.cjs.map} +1 -1
  272. package/dist/{sheet-C6djCmPV.js → sheet-fT1oxKgG.js} +4 -4
  273. package/dist/{sheet-C6djCmPV.js.map → sheet-fT1oxKgG.js.map} +1 -1
  274. package/dist/sheet.cjs +1 -1
  275. package/dist/sheet.js +2 -2
  276. package/dist/sheet.service-BxvWBGsJ.cjs +2 -0
  277. package/dist/sheet.service-BxvWBGsJ.cjs.map +1 -0
  278. package/dist/{sheet.service-DZGMoIHy.js → sheet.service-lXqUf6n5.js} +2 -2
  279. package/dist/sheet.service-lXqUf6n5.js.map +1 -0
  280. package/dist/{slider-DERHNjqI.js → slider-CYsku-3b.js} +3 -3
  281. package/dist/{slider-DERHNjqI.js.map → slider-CYsku-3b.js.map} +1 -1
  282. package/dist/{slider-BfNNQ6qI.cjs → slider-DxSzFbQe.cjs} +2 -2
  283. package/dist/{slider-BfNNQ6qI.cjs.map → slider-DxSzFbQe.cjs.map} +1 -1
  284. package/dist/slider.cjs +1 -1
  285. package/dist/slider.js +1 -1
  286. package/dist/{spinner-BOdUWwXq.js → spinner-CrK1E8LD.js} +2 -2
  287. package/dist/{spinner-BOdUWwXq.js.map → spinner-CrK1E8LD.js.map} +1 -1
  288. package/dist/{spinner-Bip-lfsc.cjs → spinner-DrG_NQpx.cjs} +2 -2
  289. package/dist/{spinner-Bip-lfsc.cjs.map → spinner-DrG_NQpx.cjs.map} +1 -1
  290. package/dist/steps.cjs +1 -1
  291. package/dist/steps.js +1 -1
  292. package/dist/{surface-CyhVK7JG.js → surface-C64YekDh.js} +2 -2
  293. package/dist/{surface-CyhVK7JG.js.map → surface-C64YekDh.js.map} +1 -1
  294. package/dist/{surface--Nh6Q896.cjs → surface-DVNi8l6T.cjs} +2 -2
  295. package/dist/{surface--Nh6Q896.cjs.map → surface-DVNi8l6T.cjs.map} +1 -1
  296. package/dist/surface.cjs +1 -1
  297. package/dist/surface.js +1 -1
  298. package/dist/{table-x9dbc3AY.cjs → table-B3WKGYlu.cjs} +2 -2
  299. package/dist/{table-x9dbc3AY.cjs.map → table-B3WKGYlu.cjs.map} +1 -1
  300. package/dist/{table-DnPQ0zCd.js → table-DmrYZ1hR.js} +2 -2
  301. package/dist/{table-DnPQ0zCd.js.map → table-DmrYZ1hR.js.map} +1 -1
  302. package/dist/table.cjs +1 -1
  303. package/dist/table.js +1 -1
  304. package/dist/{tabs-compatibility-D3HfZRKv.cjs → tabs-compatibility-Ds7SEeST.cjs} +2 -2
  305. package/dist/{tabs-compatibility-D3HfZRKv.cjs.map → tabs-compatibility-Ds7SEeST.cjs.map} +1 -1
  306. package/dist/{tabs-compatibility-Dazz1g0Q.js → tabs-compatibility-Uetjk25R.js} +2 -2
  307. package/dist/{tabs-compatibility-Dazz1g0Q.js.map → tabs-compatibility-Uetjk25R.js.map} +1 -1
  308. package/dist/tabs.cjs +1 -1
  309. package/dist/tabs.js +1 -1
  310. package/dist/{tailwind.mixin-kvywknTU.js → tailwind.mixin-B6ADeWOc.js} +2 -2
  311. package/dist/{tailwind.mixin-kvywknTU.js.map → tailwind.mixin-B6ADeWOc.js.map} +1 -1
  312. package/dist/{tailwind.mixin-Bwf86oi5.cjs → tailwind.mixin-df9KoZ9x.cjs} +2 -2
  313. package/dist/{tailwind.mixin-Bwf86oi5.cjs.map → tailwind.mixin-df9KoZ9x.cjs.map} +1 -1
  314. package/dist/teleport.cjs +1 -1
  315. package/dist/teleport.js +1 -1
  316. package/dist/{textarea-bHJFDEva.js → textarea-B1Tng7F9.js} +2 -2
  317. package/dist/{textarea-bHJFDEva.js.map → textarea-B1Tng7F9.js.map} +1 -1
  318. package/dist/{textarea-xRo6a5-Y.cjs → textarea-QKNA3oAQ.cjs} +2 -2
  319. package/dist/{textarea-xRo6a5-Y.cjs.map → textarea-QKNA3oAQ.cjs.map} +1 -1
  320. package/dist/textarea.cjs +1 -1
  321. package/dist/textarea.js +1 -1
  322. package/dist/{theme-button-BPFuZSBY.js → theme-button-CYEhS3ub.js} +2 -2
  323. package/dist/{theme-button-BPFuZSBY.js.map → theme-button-CYEhS3ub.js.map} +1 -1
  324. package/dist/{theme-button-lvD9uCTZ.cjs → theme-button-CoCFS3Rx.cjs} +2 -2
  325. package/dist/{theme-button-lvD9uCTZ.cjs.map → theme-button-CoCFS3Rx.cjs.map} +1 -1
  326. package/dist/theme-button.cjs +1 -1
  327. package/dist/theme-button.js +1 -1
  328. package/dist/theme.cjs +1 -1
  329. package/dist/theme.component-C12jLwtB.cjs +3 -0
  330. package/dist/theme.component-C12jLwtB.cjs.map +1 -0
  331. package/dist/{theme.component-C-PfGTcN.js → theme.component-Df731_fn.js} +247 -171
  332. package/dist/theme.component-Df731_fn.js.map +1 -0
  333. package/dist/theme.events-CPSLaOlR.js +6 -0
  334. package/dist/theme.events-CPSLaOlR.js.map +1 -0
  335. package/dist/theme.events-Car6U_SQ.cjs +2 -0
  336. package/dist/theme.events-Car6U_SQ.cjs.map +1 -0
  337. package/dist/theme.interface-C5Kj6WjD.js.map +1 -1
  338. package/dist/theme.interface-Xg5Zi46a.cjs.map +1 -1
  339. package/dist/theme.js +9 -7
  340. package/dist/theme.js.map +1 -1
  341. package/dist/{timezone-OLjylRB7.cjs → timezone-B7bscKFN.cjs} +2 -2
  342. package/dist/{timezone-OLjylRB7.cjs.map → timezone-B7bscKFN.cjs.map} +1 -1
  343. package/dist/{timezone-BDSbTYTk.js → timezone-CdtCVjMF.js} +3 -3
  344. package/dist/{timezone-BDSbTYTk.js.map → timezone-CdtCVjMF.js.map} +1 -1
  345. package/dist/{tooltip-iM0cfzsV.cjs → tooltip-CjoNCIvr.cjs} +2 -2
  346. package/dist/{tooltip-iM0cfzsV.cjs.map → tooltip-CjoNCIvr.cjs.map} +1 -1
  347. package/dist/{tooltip-CWiU3SEA.js → tooltip-JVkexTyf.js} +2 -2
  348. package/dist/{tooltip-CWiU3SEA.js.map → tooltip-JVkexTyf.js.map} +1 -1
  349. package/dist/tooltip.cjs +1 -1
  350. package/dist/tooltip.js +1 -1
  351. package/dist/{tree-CXIrKI2O.cjs → tree-Be48ABq4.cjs} +2 -2
  352. package/dist/{tree-CXIrKI2O.cjs.map → tree-Be48ABq4.cjs.map} +1 -1
  353. package/dist/{tree-JUf2hHiW.js → tree-CaqiNcJJ.js} +2 -2
  354. package/dist/{tree-JUf2hHiW.js.map → tree-CaqiNcJJ.js.map} +1 -1
  355. package/dist/tree.cjs +1 -1
  356. package/dist/tree.js +1 -1
  357. package/dist/{typewriter-DQuULTla.js → typewriter-CoMrmwFJ.js} +8 -8
  358. package/dist/{typewriter-DQuULTla.js.map → typewriter-CoMrmwFJ.js.map} +1 -1
  359. package/dist/{typewriter-YW7NGa6H.cjs → typewriter-DCYDScE9.cjs} +2 -2
  360. package/dist/{typewriter-YW7NGa6H.cjs.map → typewriter-DCYDScE9.cjs.map} +1 -1
  361. package/dist/typewriter.cjs +1 -1
  362. package/dist/typewriter.js +1 -1
  363. package/dist/{typography-CkLztts5.cjs → typography-BQg6J2hD.cjs} +2 -2
  364. package/dist/{typography-CkLztts5.cjs.map → typography-BQg6J2hD.cjs.map} +1 -1
  365. package/dist/{typography-kXb173Io.js → typography-DkJagEoF.js} +2 -2
  366. package/dist/{typography-kXb173Io.js.map → typography-DkJagEoF.js.map} +1 -1
  367. package/dist/typography.cjs +1 -1
  368. package/dist/typography.js +1 -1
  369. package/package.json +1 -1
  370. package/types/src/theme/context.d.ts +24 -0
  371. package/types/src/theme/index.d.ts +2 -0
  372. package/types/src/theme/theme.component.d.ts +49 -6
  373. package/types/src/theme/theme.events.d.ts +55 -0
  374. package/types/src/theme/theme.interface.d.ts +36 -0
  375. package/types/src/theme/theme.service.d.ts +261 -0
  376. package/dist/dialog-service-Dpz_NIRP.js.map +0 -1
  377. package/dist/dialog-service-Wna1JO09.cjs +0 -2
  378. package/dist/dialog-service-Wna1JO09.cjs.map +0 -1
  379. package/dist/route.component-D1xujH8n.js.map +0 -1
  380. package/dist/route.component-ke_nkgvP.cjs.map +0 -1
  381. package/dist/sheet.service-DR9KJfMa.cjs +0 -2
  382. package/dist/sheet.service-DR9KJfMa.cjs.map +0 -1
  383. package/dist/sheet.service-DZGMoIHy.js.map +0 -1
  384. package/dist/theme.component-C-PfGTcN.js.map +0 -1
  385. package/dist/theme.component-DkcM8QzH.cjs +0 -3
  386. package/dist/theme.component-DkcM8QzH.cjs.map +0 -1
package/ai/area.md CHANGED
@@ -1,29 +1,218 @@
1
- # Schmancy Area
1
+ # Schmancy Area - Advanced Routing System
2
2
 
3
- Schmancy Area is a lightweight, reactive routing and state management system for web components with RxJS integration.
3
+ Schmancy Area is a powerful, reactive routing and state management system for web components with RxJS integration. It supports nested routing, segment-based matching, navigation guards, and multiple independent router outlets.
4
4
 
5
- ## Component Usage
5
+ ## Core Components
6
+
7
+ ### 1. `<schmancy-area>` - Router Outlet
8
+ The main container that displays routed components.
6
9
 
7
10
  ```html
8
11
  <!-- Basic router outlet -->
9
- <schmancy-area
12
+ <schmancy-area
10
13
  name="main"
11
14
  default="home-component">
12
15
  </schmancy-area>
16
+
17
+ <!-- With default component as element -->
18
+ <schmancy-area
19
+ name="sidebar"
20
+ .default=${new MyDefaultComponent()}>
21
+ </schmancy-area>
13
22
  ```
14
23
 
15
- ## Properties
24
+ ### 2. `<schmancy-route>` - Declarative Routing
25
+ Define routes declaratively with segment matching and guards.
26
+
27
+ ```html
28
+ <!-- Simple route -->
29
+ <schmancy-route
30
+ when="/products"
31
+ component="product-list"
32
+ exact>
33
+ </schmancy-route>
34
+
35
+ <!-- Route with dynamic segments -->
36
+ <schmancy-route
37
+ when="/products/:id"
38
+ component="product-detail">
39
+ </schmancy-route>
40
+
41
+ <!-- Route with guard -->
42
+ <schmancy-route
43
+ when="/admin/*"
44
+ component="admin-panel"
45
+ .guard=${() => isAuthenticated()}>
46
+ </schmancy-route>
47
+
48
+ <!-- Route with default component -->
49
+ <schmancy-route
50
+ when="/dashboard"
51
+ component="dashboard-main"
52
+ default="dashboard-overview">
53
+ </schmancy-route>
54
+ ```
55
+
56
+ ## Properties Reference
57
+
58
+ ### `<schmancy-area>` Properties
16
59
 
17
60
  | Property | Type | Description |
18
61
  |----------|------|-------------|
19
62
  | `name` | `string` | **Required**. Unique identifier for this router outlet. |
20
- | `default` | `string \| Promise<NodeModule> \| CustomElementConstructor \| TemplateResult` | Default component to display if none is specified. |
63
+ | `default` | `string \| Promise<NodeModule> \| CustomElementConstructor \| TemplateResult` | Default component to display when no route matches or area is empty. |
64
+
65
+ ### `<schmancy-route>` Properties
66
+
67
+ | Property | Type | Description |
68
+ |----------|------|-------------|
69
+ | `when` | `string` | **Required**. URL segment pattern to match (supports wildcards and parameters). |
70
+ | `component` | `any` | Component to render when route matches (string, constructor, element). |
71
+ | `exact` | `boolean` | Whether route should match exactly (default: false). |
72
+ | `guard` | `() => GuardResult \| Promise<GuardResult>` | Navigation guard function returning boolean, string, or redirect object. |
73
+
74
+ ## URL Segment Matching
75
+
76
+ The `when` attribute supports powerful segment-based routing:
77
+
78
+ ```html
79
+ <!-- Exact match -->
80
+ <schmancy-route when="/home" component="home-page"></schmancy-route>
81
+
82
+ <!-- Dynamic segments with :param syntax -->
83
+ <schmancy-route when="/user/:id" component="user-profile"></schmancy-route>
84
+
85
+ <!-- Wildcard for nested routing -->
86
+ <schmancy-route when="/admin/*" component="admin-layout"></schmancy-route>
87
+
88
+ <!-- Multiple segments -->
89
+ <schmancy-route when="/products/:category/:id" component="product-detail"></schmancy-route>
90
+
91
+ <!-- Optional trailing slash handled automatically -->
92
+ <schmancy-route when="/about" component="about-page"></schmancy-route>
93
+ <!-- Matches both /about and /about/ -->
94
+ ```
95
+
96
+ ### Segment Matching Rules
97
+
98
+ 1. **Exact segments**: `/products` matches only `/products`
99
+ 2. **Dynamic parameters**: `:id` captures any value in that position
100
+ 3. **Wildcards**: `*` matches any remaining path segments
101
+ 4. **Priority**: More specific routes take precedence over wildcards
102
+
103
+ ## Navigation Guards
104
+
105
+ Guards protect routes and can redirect navigation:
106
+
107
+ ```typescript
108
+ // Boolean guard - simple allow/deny
109
+ <schmancy-route
110
+ when="/admin"
111
+ component="admin-panel"
112
+ .guard=${() => user.isAdmin}>
113
+ </schmancy-route>
114
+
115
+ // String guard - redirect to path
116
+ <schmancy-route
117
+ when="/profile"
118
+ component="user-profile"
119
+ .guard=${() => isAuthenticated() || '/login'}>
120
+ </schmancy-route>
121
+
122
+ // Object guard - redirect with explicit syntax
123
+ <schmancy-route
124
+ when="/settings"
125
+ component="settings-page"
126
+ .guard=${() => {
127
+ if (!isAuthenticated()) {
128
+ return { redirect: '/login' };
129
+ }
130
+ if (!hasPermission('settings')) {
131
+ return { redirect: '/unauthorized' };
132
+ }
133
+ return true;
134
+ }}>
135
+ </schmancy-route>
136
+
137
+ // Async guard - check with backend
138
+ <schmancy-route
139
+ when="/premium"
140
+ component="premium-content"
141
+ .guard=${async () => {
142
+ const subscription = await checkSubscription();
143
+ return subscription.isActive || { redirect: '/upgrade' };
144
+ }}>
145
+ </schmancy-route>
146
+ ```
147
+
148
+ ### Guard Return Types
149
+
150
+ | Return Value | Behavior |
151
+ |--------------|----------|
152
+ | `true` | Allow navigation to proceed |
153
+ | `false` | Block navigation silently |
154
+ | `"/path"` (string) | Redirect to the specified path |
155
+ | `{redirect: "/path"}` | Explicit redirect object |
156
+ | `Promise<...>` | Async guard, resolved before navigation |
157
+
158
+ ## Nested Routing
159
+
160
+ Create complex nested routing structures:
161
+
162
+ ```html
163
+ <!-- Parent component with nested routes -->
164
+ <schmancy-route
165
+ when="/app/*"
166
+ component="app-layout"
167
+ default="app-dashboard">
168
+
169
+ <!-- app-layout.ts -->
170
+ <div class="app-container">
171
+ <nav>...</nav>
172
+ <schmancy-area name="app-content">
173
+ <!-- Nested routes -->
174
+ <schmancy-route when="/app/dashboard" component="app-dashboard"></schmancy-route>
175
+ <schmancy-route when="/app/users" component="user-list"></schmancy-route>
176
+ <schmancy-route when="/app/users/:id" component="user-detail"></schmancy-route>
177
+ <schmancy-route when="/app/settings/*" component="settings-layout">
178
+ <!-- Even deeper nesting in settings-layout -->
179
+ </schmancy-route>
180
+ </schmancy-area>
181
+ </div>
182
+ </schmancy-route>
183
+ ```
184
+
185
+ ### Multi-level Nesting Example
186
+
187
+ ```html
188
+ <!-- Root level -->
189
+ <schmancy-area name="root">
190
+ <schmancy-route when="/*" component="app-shell" default="home-page">
191
+
192
+ <!-- Inside app-shell -->
193
+ <schmancy-area name="main">
194
+ <schmancy-route when="/products/*" component="product-layout">
195
+
196
+ <!-- Inside product-layout -->
197
+ <schmancy-area name="product-content">
198
+ <schmancy-route when="/products" component="product-list"></schmancy-route>
199
+ <schmancy-route when="/products/:id" component="product-detail"></schmancy-route>
200
+ <schmancy-route when="/products/:id/reviews" component="product-reviews"></schmancy-route>
201
+ </schmancy-area>
202
+
203
+ </schmancy-route>
204
+ </schmancy-area>
205
+
206
+ </schmancy-route>
207
+ </schmancy-area>
208
+ ```
21
209
 
22
210
  ## Service API
23
211
 
24
- ```ts
212
+ ```typescript
25
213
  // Import the area service
26
- import { area } from '@schmancy/area';
214
+ import { area } from '@schmancy/index';
215
+ // Or specific import: import { area } from '@schmancy/area';
27
216
 
28
217
  // Navigation methods
29
218
  area.push({
@@ -36,11 +225,12 @@ area.push({
36
225
  clearQueryParams?: ['sort'] // Clear specific query params
37
226
  });
38
227
 
39
- area.pop('sidebar'); // Remove an area
228
+ // Remove/clear an area (fixed in latest version)
229
+ area.pop('sidebar'); // Properly removes content from area
40
230
 
41
231
  // Subscription methods (return RxJS Observables)
42
232
  area.on(areaName, skipCurrent?) // Subscribe to an area
43
- area.all(skipCurrent?) // Subscribe to all areas
233
+ area.all(skipCurrent?) // Subscribe to all areas
44
234
  area.getState<T>(areaName) // Get typed state from an area
45
235
  area.params<T>(areaName) // Get typed query params from an area
46
236
  area.param<T>(areaName, key) // Get a specific query param value
@@ -48,36 +238,11 @@ area.props<T>(areaName) // Get typed component props from an area
48
238
  area.prop<T>(areaName, key) // Get a specific component prop value
49
239
  ```
50
240
 
51
- ## Understanding Params vs Props
52
-
53
- - **`params`**: Query parameters that appear in the URL and are useful for bookmarkable state
54
- - **`props`**: Component properties passed directly to the element instance, useful for complex data like functions, objects, or internal state
55
-
56
- ```ts
57
- // Using params (query parameters)
58
- area.push({
59
- area: 'main',
60
- component: 'user-profile',
61
- params: { userId: '123', tab: 'settings' } // Will be in URL
62
- });
63
-
64
- // Using props (component properties)
65
- area.push({
66
- area: 'main',
67
- component: 'my-component',
68
- props: {
69
- data: complexObject, // Complex object
70
- onSave: handleSave, // Function callback
71
- isEnabled: true // Boolean flag
72
- }
73
- });
74
- ```
75
-
76
- ## Examples
241
+ ## Common Patterns
77
242
 
78
243
  ### Basic Navigation
79
244
 
80
- ```ts
245
+ ```typescript
81
246
  // Navigate to a component
82
247
  area.push({
83
248
  component: 'home-page',
@@ -97,7 +262,7 @@ area.push({
97
262
  area.push({
98
263
  component: 'my-component',
99
264
  area: 'main',
100
- props: {
265
+ props: {
101
266
  title: 'Hello World',
102
267
  data: { id: 123, name: 'Test' },
103
268
  onClick: () => console.log('Clicked!')
@@ -105,27 +270,53 @@ area.push({
105
270
  });
106
271
  ```
107
272
 
108
- ### Multiple Independent Areas
273
+ ### Declarative Routing with Guards
274
+
275
+ ```html
276
+ <schmancy-area name="main">
277
+ <!-- Public routes -->
278
+ <schmancy-route when="/home" component="home-page"></schmancy-route>
279
+ <schmancy-route when="/about" component="about-page"></schmancy-route>
280
+
281
+ <!-- Protected routes -->
282
+ <schmancy-route
283
+ when="/dashboard/*"
284
+ component="dashboard-layout"
285
+ .guard=${() => isAuthenticated() || '/login'}>
286
+ </schmancy-route>
287
+
288
+ <!-- Admin only -->
289
+ <schmancy-route
290
+ when="/admin/*"
291
+ component="admin-panel"
292
+ .guard=${() => hasRole('admin') || { redirect: '/unauthorized' }}>
293
+ </schmancy-route>
294
+
295
+ <!-- Catch-all route (should be last) -->
296
+ <schmancy-route when="/*" component="not-found-page"></schmancy-route>
297
+ </schmancy-area>
298
+ ```
109
299
 
110
- ```ts
111
- // Update multiple areas independently
112
- area.push({ component: 'product-list', area: 'main' });
113
- area.push({ component: 'filter-panel', area: 'sidebar' });
300
+ ### Programmatic Navigation with area.pop()
114
301
 
115
- // Open a modal dialog
116
- area.push({
117
- component: 'dialog-component',
302
+ ```typescript
303
+ // Open a modal or sidebar
304
+ area.push({
305
+ component: 'user-settings',
118
306
  area: 'modal',
119
- params: { id: '123' }
307
+ props: { userId: '123' }
120
308
  });
121
309
 
122
- // Close a modal
123
- area.pop('modal');
310
+ // Close/clear the modal (fixed in latest version)
311
+ area.pop('modal'); // This now properly clears the area
312
+
313
+ // Clear multiple areas
314
+ ['modal', 'sidebar', 'overlay'].forEach(name => area.pop(name));
124
315
  ```
125
316
 
126
317
  ### Reactive Subscriptions
127
318
 
128
- ```ts
319
+ ```typescript
129
320
  // Subscribe to area changes
130
321
  area.on('main').subscribe(route => {
131
322
  console.log(`Component: ${route.component}`);
@@ -145,53 +336,175 @@ area.params<UserParams>('user').subscribe(params => {
145
336
  fetchUser(params.id);
146
337
  setActiveTab(params.tab || 'profile');
147
338
  });
339
+ ```
148
340
 
149
- // Get a specific parameter
150
- area.param<string>('product', 'productId').subscribe(id => {
151
- fetchProductDetails(id);
152
- });
341
+ ### Default Components
153
342
 
154
- // Get component props
155
- area.props<{ title: string; data: any }>('main').subscribe(props => {
156
- console.log('Title:', props.title);
157
- console.log('Data:', props.data);
158
- });
343
+ Default components provide fallback UI when no route matches:
159
344
 
160
- // Get a specific prop
161
- area.prop<() => void>('main', 'onClick').subscribe(callback => {
162
- // Use the callback function
163
- callback?.();
164
- });
345
+ ```html
346
+ <!-- Area-level default -->
347
+ <schmancy-area name="main" default="welcome-page">
348
+ <schmancy-route when="/products" component="product-list"></schmancy-route>
349
+ <!-- Shows welcome-page when path is not /products -->
350
+ </schmancy-area>
351
+
352
+ <!-- Route-level default for nested routing -->
353
+ <schmancy-route
354
+ when="/app/*"
355
+ component="app-layout"
356
+ default="app-dashboard">
357
+ <!-- Shows app-dashboard when path is /app or /app/ -->
358
+ </schmancy-route>
165
359
  ```
166
360
 
167
- ### DOM Events
361
+ ## Best Practices
168
362
 
169
- Areas also dispatch DOM events for non-RxJS consumers:
363
+ ### 1. Route Organization
170
364
 
171
- ```js
172
- // Format: schmancy-area-${areaName}-changed
173
- window.addEventListener('schmancy-area-main-changed', event => {
174
- const { component, params, state } = event.detail;
175
- updateUI(component, params, state);
176
- });
365
+ ```html
366
+ <!-- Order routes from most specific to least specific -->
367
+ <schmancy-area name="main">
368
+ <!-- Specific routes first -->
369
+ <schmancy-route when="/products/new" component="product-create"></schmancy-route>
370
+ <schmancy-route when="/products/:id/edit" component="product-edit"></schmancy-route>
371
+ <schmancy-route when="/products/:id" component="product-detail"></schmancy-route>
372
+
373
+ <!-- General routes -->
374
+ <schmancy-route when="/products" component="product-list"></schmancy-route>
375
+
376
+ <!-- Wildcard routes last -->
377
+ <schmancy-route when="/*" component="not-found"></schmancy-route>
378
+ </schmancy-area>
379
+ ```
380
+
381
+ ### 2. Guard Composition
382
+
383
+ ```typescript
384
+ // Compose multiple guard conditions
385
+ const requireAuth = () => isAuthenticated() || '/login';
386
+ const requireAdmin = () => hasRole('admin') || '/unauthorized';
387
+ const requireSubscription = () => hasActiveSubscription() || '/upgrade';
388
+
389
+ // Combine guards
390
+ const premiumAdminGuard = () => {
391
+ if (!isAuthenticated()) return '/login';
392
+ if (!hasRole('admin')) return '/unauthorized';
393
+ if (!hasActiveSubscription()) return '/upgrade';
394
+ return true;
395
+ };
396
+
397
+ <schmancy-route
398
+ when="/premium-admin"
399
+ component="premium-admin-panel"
400
+ .guard=${premiumAdminGuard}>
401
+ </schmancy-route>
177
402
  ```
178
403
 
179
- ## Advanced Usage
404
+ ### 3. Nested Area Management
405
+
406
+ ```typescript
407
+ // Parent component manages child areas
408
+ class AppLayout extends LitElement {
409
+ render() {
410
+ return html`
411
+ <div class="layout">
412
+ <nav>
413
+ <a @click=${() => this.navigate('/app/dashboard')}>Dashboard</a>
414
+ <a @click=${() => this.navigate('/app/users')}>Users</a>
415
+ </nav>
416
+
417
+ <schmancy-area name="app-content">
418
+ <schmancy-route when="/app/dashboard" component="dashboard"></schmancy-route>
419
+ <schmancy-route when="/app/users/*" component="users-module"></schmancy-route>
420
+ </schmancy-area>
421
+ </div>
422
+ `;
423
+ }
424
+
425
+ navigate(path: string) {
426
+ window.history.pushState(null, '', path);
427
+ window.dispatchEvent(new PopStateEvent('popstate'));
428
+ }
429
+ }
430
+ ```
180
431
 
181
- ### Lazy Loading Components
432
+ ### 4. Dynamic Route Loading
182
433
 
183
- ```ts
184
- area.push({
185
- component: import('./components/heavy-dashboard.js'),
186
- area: 'main'
187
- });
434
+ ```typescript
435
+ // Lazy load heavy components
436
+ <schmancy-route
437
+ when="/analytics"
438
+ .component=${() => import('./analytics-dashboard.js').then(m => m.AnalyticsDashboard)}
439
+ .guard=${() => hasFeature('analytics') || '/upgrade'}>
440
+ </schmancy-route>
188
441
  ```
189
442
 
190
- ### Navigation Guards
443
+ ### 5. Error Boundaries
444
+
445
+ ```typescript
446
+ // Wrap routes in error boundaries
447
+ class ErrorBoundary extends LitElement {
448
+ @state() hasError = false;
449
+
450
+ constructor() {
451
+ super();
452
+ window.addEventListener('error', () => {
453
+ this.hasError = true;
454
+ });
455
+ }
456
+
457
+ render() {
458
+ if (this.hasError) {
459
+ return html`<error-page></error-page>`;
460
+ }
461
+ return html`<slot></slot>`;
462
+ }
463
+ }
464
+
465
+ // Use in template
466
+ html`
467
+ <error-boundary>
468
+ <schmancy-area name="main">
469
+ <!-- routes -->
470
+ </schmancy-area>
471
+ </error-boundary>
472
+ `;
473
+ ```
474
+
475
+ ## Migration Guide
476
+
477
+ ### From Direct area.push() to Declarative Routes
478
+
479
+ **Before:**
480
+ ```typescript
481
+ // Old imperative approach
482
+ if (path === '/products') {
483
+ area.push({ component: 'product-list', area: 'main' });
484
+ } else if (path.startsWith('/products/')) {
485
+ const id = path.split('/')[2];
486
+ area.push({
487
+ component: 'product-detail',
488
+ area: 'main',
489
+ params: { id }
490
+ });
491
+ }
492
+ ```
493
+
494
+ **After:**
495
+ ```html
496
+ <!-- New declarative approach -->
497
+ <schmancy-area name="main">
498
+ <schmancy-route when="/products" component="product-list"></schmancy-route>
499
+ <schmancy-route when="/products/:id" component="product-detail"></schmancy-route>
500
+ </schmancy-area>
501
+ ```
191
502
 
192
- ```ts
193
- import { switchMap, EMPTY, of } from 'rxjs';
503
+ ### Updating Guard Logic
194
504
 
505
+ **Before:**
506
+ ```typescript
507
+ // Manual guard checks
195
508
  area.on('protected-area').pipe(
196
509
  switchMap(route => {
197
510
  if (!isAuthenticated()) {
@@ -200,43 +513,104 @@ area.on('protected-area').pipe(
200
513
  }
201
514
  return of(route);
202
515
  })
203
- ).subscribe(handleProtectedRoute);
516
+ ).subscribe();
204
517
  ```
205
518
 
206
- ### Component Reloading Pattern
519
+ **After:**
520
+ ```html
521
+ <!-- Built-in guard support -->
522
+ <schmancy-route
523
+ when="/protected"
524
+ component="protected-content"
525
+ .guard=${() => isAuthenticated() || '/login'}>
526
+ </schmancy-route>
527
+ ```
207
528
 
208
- When updating the same component with different parameters, use this pattern to ensure re-rendering:
529
+ ## Advanced Examples
209
530
 
210
- ```ts
211
- // First push to the main routing area to force component re-creation
212
- area.push({
213
- area: 'main-area',
214
- component: 'user-profile',
215
- params: { userId: '456' },
216
- historyStrategy: 'push'
217
- });
531
+ ### Multi-tenant Application
218
532
 
219
- // Then update any subscription areas with the silent history strategy
220
- area.push({
221
- area: 'user-area',
222
- component: 'user-profile',
223
- params: { userId: '456' },
224
- historyStrategy: 'silent' // Don't create history entry
225
- });
533
+ ```html
534
+ <schmancy-area name="root">
535
+ <!-- Tenant detection route -->
536
+ <schmancy-route
537
+ when="/:tenant/*"
538
+ component="tenant-app"
539
+ .guard=${async ({ tenant }) => {
540
+ const isValid = await validateTenant(tenant);
541
+ return isValid || { redirect: '/invalid-tenant' };
542
+ }}>
543
+
544
+ <!-- Inside tenant-app -->
545
+ <schmancy-area name="tenant-content">
546
+ <schmancy-route when="/:tenant/dashboard" component="tenant-dashboard"></schmancy-route>
547
+ <schmancy-route when="/:tenant/users" component="tenant-users"></schmancy-route>
548
+ <schmancy-route when="/:tenant/settings" component="tenant-settings"></schmancy-route>
549
+ </schmancy-area>
550
+
551
+ </schmancy-route>
552
+ </schmancy-area>
226
553
  ```
227
554
 
228
- This works around the `distinctUntilChanged` behavior in the Area component that compares only component names, not params.
555
+ ### Wizard/Step Navigation
229
556
 
230
- ## Related Components
557
+ ```html
558
+ <schmancy-route when="/onboarding/*" component="onboarding-wizard">
559
+ <!-- Inside onboarding-wizard -->
560
+ <schmancy-area name="wizard-step">
561
+ <schmancy-route
562
+ when="/onboarding/profile"
563
+ component="step-profile"
564
+ .guard=${() => hasCompletedStep(0) || '/onboarding/welcome'}>
565
+ </schmancy-route>
566
+
567
+ <schmancy-route
568
+ when="/onboarding/preferences"
569
+ component="step-preferences"
570
+ .guard=${() => hasCompletedStep(1) || '/onboarding/profile'}>
571
+ </schmancy-route>
572
+
573
+ <schmancy-route
574
+ when="/onboarding/complete"
575
+ component="step-complete"
576
+ .guard=${() => hasCompletedStep(2) || '/onboarding/preferences'}>
577
+ </schmancy-route>
578
+ </schmancy-area>
579
+ </schmancy-route>
580
+ ```
231
581
 
232
- - **[Store](./store.md)** - For more complex state management
233
- - **[Layout](./layout.md)** - For responsive layouts
234
- - **[Teleport](./teleport.md)** - For advanced component transportation
235
- - **[Sheet](./sheet.md)** - For modal overlays
582
+ ## Troubleshooting
583
+
584
+ ### Common Issues and Solutions
585
+
586
+ 1. **Routes not matching**
587
+ - Check route order (specific before general)
588
+ - Verify URL segments match exactly
589
+ - Ensure wildcards are used correctly
590
+
591
+ 2. **Guards not redirecting**
592
+ - Return string path or `{redirect: path}` object
593
+ - Check async guards are returning promises
594
+ - Verify guard function is bound correctly with `.guard=${}`
595
+
596
+ 3. **Nested routes not working**
597
+ - Parent route must use wildcard `/*` to allow nested paths
598
+ - Child area must have unique name
599
+ - Check component hierarchy is rendering child areas
600
+
601
+ 4. **area.pop() not clearing content**
602
+ - Update to latest version (fixed in recent update)
603
+ - Ensure area name is correct
604
+ - Check no other navigation is immediately refilling area
605
+
606
+ 5. **Default components not showing**
607
+ - Verify default is set on correct element (area or route)
608
+ - Check no matching routes are preventing default
609
+ - Ensure component name/reference is valid
236
610
 
237
611
  ## Type Definitions
238
612
 
239
- ```ts
613
+ ```typescript
240
614
  // Route Action - used for navigation
241
615
  interface RouteAction {
242
616
  component: CustomElementConstructor | string | HTMLElement | Promise<NodeModule>;
@@ -256,4 +630,47 @@ interface ActiveRoute {
256
630
  params?: Record<string, unknown>; // Query parameters
257
631
  props?: Record<string, unknown>; // Component properties
258
632
  }
259
- ```
633
+
634
+ // Guard function signatures (from route.component.ts)
635
+ export type GuardResult = boolean | string | { redirect: string };
636
+ type GuardFunction = () => GuardResult | Promise<GuardResult>;
637
+
638
+ // Route component props
639
+ interface RouteProps {
640
+ when: string; // URL segment pattern
641
+ component?: string | CustomElementConstructor | HTMLElement;
642
+ default?: string | CustomElementConstructor | HTMLElement;
643
+ guard?: GuardFunction;
644
+ }
645
+ ```
646
+
647
+ ## Related Components
648
+
649
+ - **[Store](./store.md)** - For complex state management
650
+ - **[Layout](./layout.md)** - For responsive layouts
651
+ - **[Teleport](./teleport.md)** - For advanced component transportation
652
+ - **[Sheet](./sheet.md)** - For modal overlays
653
+
654
+ ## Performance Tips
655
+
656
+ 1. **Use lazy loading** for heavy components
657
+ 2. **Implement route-level code splitting** with dynamic imports
658
+ 3. **Cache guard results** when checking expensive operations
659
+ 4. **Use `historyStrategy: 'silent'`** for non-navigational updates
660
+ 5. **Debounce rapid navigation** in user-triggered events
661
+ 6. **Preload critical routes** during idle time
662
+
663
+ ## Summary
664
+
665
+ Schmancy Area provides a complete routing solution with:
666
+ - ✅ **Declarative routing** with `<schmancy-route>`
667
+ - ✅ **Segment-based matching** with parameters and wildcards
668
+ - ✅ **Navigation guards** with multiple return types
669
+ - ✅ **Nested routing** support for complex applications
670
+ - ✅ **Default components** for fallback UI
671
+ - ✅ **Reactive subscriptions** with RxJS
672
+ - ✅ **Type-safe** API with TypeScript
673
+ - ✅ **Multiple router outlets** for complex layouts
674
+ - ✅ **Fixed area.pop()** functionality for proper cleanup
675
+
676
+ The combination of declarative routes and programmatic navigation provides maximum flexibility for building modern web applications.