@mhmo91/schmancy 0.4.72 → 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.
- package/ai/area.md +525 -108
- package/ai/busy.md +2 -1
- package/ai/button.md +4 -0
- package/ai/code-highlight.md +2 -1
- package/ai/content-drawer.md +2 -1
- package/ai/context.md +7 -2
- package/ai/countries.md +2 -1
- package/ai/date-range-inline.md +262 -0
- package/ai/date-range.md +2 -1
- package/ai/details.md +194 -0
- package/ai/dialog.md +2 -1
- package/ai/directives.md +2 -1
- package/ai/form.md +10 -10
- package/ai/list.md +10 -9
- package/ai/mailbox.md +530 -0
- package/ai/map.md +2 -1
- package/ai/notification.md +14 -12
- package/ai/payment-card-form.md +2 -1
- package/ai/sheet.md +6 -4
- package/ai/steps.md +193 -9
- package/ai/store.md +8 -4
- package/ai/surface.md +2 -1
- package/ai/teleport.md +2 -1
- package/ai/theme.md +690 -8
- package/ai/timezone.md +2 -1
- package/ai/typography.md +2 -1
- package/dist/ai/area.md +525 -108
- package/dist/ai/busy.md +2 -1
- package/dist/ai/button.md +4 -0
- package/dist/ai/code-highlight.md +2 -1
- package/dist/ai/content-drawer.md +2 -1
- package/dist/ai/context.md +7 -2
- package/dist/ai/countries.md +2 -1
- package/dist/ai/date-range-inline.md +262 -0
- package/dist/ai/date-range.md +2 -1
- package/dist/ai/details.md +194 -0
- package/dist/ai/dialog.md +2 -1
- package/dist/ai/directives.md +2 -1
- package/dist/ai/form.md +10 -10
- package/dist/ai/list.md +10 -9
- package/dist/ai/mailbox.md +530 -0
- package/dist/ai/map.md +2 -1
- package/dist/ai/notification.md +14 -12
- package/dist/ai/payment-card-form.md +2 -1
- package/dist/ai/sheet.md +6 -4
- package/dist/ai/steps.md +193 -9
- package/dist/ai/store.md +8 -4
- package/dist/ai/surface.md +2 -1
- package/dist/ai/teleport.md +2 -1
- package/dist/ai/theme.md +690 -8
- package/dist/ai/timezone.md +2 -1
- package/dist/ai/typography.md +2 -1
- package/dist/{animated-text-CBOMltQE.js → animated-text-CqpyC7Y0.js} +3 -3
- package/dist/{animated-text-CBOMltQE.js.map → animated-text-CqpyC7Y0.js.map} +1 -1
- package/dist/{animated-text-rE-SkQgz.cjs → animated-text-DlRt6Q09.cjs} +2 -2
- package/dist/{animated-text-rE-SkQgz.cjs.map → animated-text-DlRt6Q09.cjs.map} +1 -1
- package/dist/animated-text.cjs +1 -1
- package/dist/animated-text.js +1 -1
- package/dist/area.cjs +1 -1
- package/dist/area.js +14 -13
- package/dist/{autocomplete-BAcf_l63.js → autocomplete-B-oKMH7m.js} +3 -3
- package/dist/{autocomplete-BAcf_l63.js.map → autocomplete-B-oKMH7m.js.map} +1 -1
- package/dist/{autocomplete-CuO8ztL4.cjs → autocomplete-BOGG_9iL.cjs} +2 -2
- package/dist/{autocomplete-CuO8ztL4.cjs.map → autocomplete-BOGG_9iL.cjs.map} +1 -1
- package/dist/autocomplete.cjs +1 -1
- package/dist/autocomplete.js +1 -1
- package/dist/{avatar-D3gNBale.js → avatar-U5IpwJuj.js} +70 -71
- package/dist/avatar-U5IpwJuj.js.map +1 -0
- package/dist/{avatar-N3BODeY1.cjs → avatar-qkIAB2cX.cjs} +3 -3
- package/dist/avatar-qkIAB2cX.cjs.map +1 -0
- package/dist/badge.cjs +1 -1
- package/dist/badge.js +1 -1
- package/dist/{boat-BQoWbDxu.js → boat-CdR5Pqik.js} +2 -2
- package/dist/{boat-BQoWbDxu.js.map → boat-CdR5Pqik.js.map} +1 -1
- package/dist/{boat-CWXlAq65.cjs → boat-DMKcZpZb.cjs} +2 -2
- package/dist/{boat-CWXlAq65.cjs.map → boat-DMKcZpZb.cjs.map} +1 -1
- package/dist/boat.cjs +1 -1
- package/dist/boat.js +1 -1
- package/dist/busy.cjs +1 -1
- package/dist/busy.js +1 -1
- package/dist/button.cjs +1 -1
- package/dist/button.js +1 -1
- package/dist/card.cjs +1 -1
- package/dist/card.js +1 -1
- package/dist/{checkbox-DBO-neG5.js → checkbox-CVwU3M4h.js} +2 -2
- package/dist/{checkbox-DBO-neG5.js.map → checkbox-CVwU3M4h.js.map} +1 -1
- package/dist/{checkbox-DIYmuPtk.cjs → checkbox-DP_zX786.cjs} +2 -2
- package/dist/{checkbox-DIYmuPtk.cjs.map → checkbox-DP_zX786.cjs.map} +1 -1
- package/dist/checkbox.cjs +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/{chips-BYE5hQQr.cjs → chips-BuMUH3zA.cjs} +2 -2
- package/dist/{chips-BYE5hQQr.cjs.map → chips-BuMUH3zA.cjs.map} +1 -1
- package/dist/{chips-C_7proIN.js → chips-DcCUwYBu.js} +3 -3
- package/dist/{chips-C_7proIN.js.map → chips-DcCUwYBu.js.map} +1 -1
- package/dist/chips.cjs +1 -1
- package/dist/chips.js +1 -1
- package/dist/code-highlight.cjs +1 -1
- package/dist/code-highlight.js +1 -1
- package/dist/{code-preview-CQ-EAz9F.js → code-preview-CIXEd04f.js} +2 -2
- package/dist/{code-preview-CQ-EAz9F.js.map → code-preview-CIXEd04f.js.map} +1 -1
- package/dist/{code-preview-CzcyBpl-.cjs → code-preview-CdCzzZTX.cjs} +2 -2
- package/dist/{code-preview-CzcyBpl-.cjs.map → code-preview-CdCzzZTX.cjs.map} +1 -1
- package/dist/components.cjs +1 -1
- package/dist/components.js +1 -1
- package/dist/content-drawer.cjs +1 -1
- package/dist/content-drawer.js +1 -1
- package/dist/{context-object-K_1gDFu-.cjs → context-object-bNADqf9U.cjs} +2 -2
- package/dist/{context-object-K_1gDFu-.cjs.map → context-object-bNADqf9U.cjs.map} +1 -1
- package/dist/{context-object-CDDP4bTk.js → context-object-u5gBaozZ.js} +46 -32
- package/dist/{context-object-CDDP4bTk.js.map → context-object-u5gBaozZ.js.map} +1 -1
- package/dist/{date-range-DCghMsV8.cjs → date-range-CvD9zwK9.cjs} +2 -2
- package/dist/{date-range-DCghMsV8.cjs.map → date-range-CvD9zwK9.cjs.map} +1 -1
- package/dist/{date-range-inline-JgIiOHQM.js → date-range-inline-5QP9av94.js} +3 -3
- package/dist/{date-range-inline-JgIiOHQM.js.map → date-range-inline-5QP9av94.js.map} +1 -1
- package/dist/{date-range-inline-Z0ASWN4I.cjs → date-range-inline-CP_a_w01.cjs} +2 -2
- package/dist/{date-range-inline-Z0ASWN4I.cjs.map → date-range-inline-CP_a_w01.cjs.map} +1 -1
- package/dist/date-range-inline.cjs +1 -1
- package/dist/date-range-inline.js +1 -1
- package/dist/{date-range-WqwMEh16.js → date-range-lJ_fPY4v.js} +4 -4
- package/dist/{date-range-WqwMEh16.js.map → date-range-lJ_fPY4v.js.map} +1 -1
- package/dist/date-range.cjs +1 -1
- package/dist/date-range.js +1 -1
- package/dist/{delay-LnWlFwkK.js → delay-BM1jk7XF.js} +2 -2
- package/dist/delay-BM1jk7XF.js.map +1 -0
- package/dist/{delay-Ew4cphs1.cjs → delay-CB0Wohe7.cjs} +2 -2
- package/dist/delay-CB0Wohe7.cjs.map +1 -0
- package/dist/delay.cjs +1 -1
- package/dist/delay.js +1 -1
- package/dist/{details-BVEV0hUx.js → details-B9JrXrCO.js} +2 -2
- package/dist/{details-BVEV0hUx.js.map → details-B9JrXrCO.js.map} +1 -1
- package/dist/{details-C01m-iWQ.cjs → details-C22WoRWP.cjs} +2 -2
- package/dist/{details-C01m-iWQ.cjs.map → details-C22WoRWP.cjs.map} +1 -1
- package/dist/details.cjs +1 -1
- package/dist/details.js +1 -1
- package/dist/{dialog-content-B_w_iJyW.js → dialog-content-BHR9cUJ-.js} +4 -4
- package/dist/{dialog-content-B_w_iJyW.js.map → dialog-content-BHR9cUJ-.js.map} +1 -1
- package/dist/{dialog-content-BFmy9Sbo.cjs → dialog-content-CpxWMPlh.cjs} +2 -2
- package/dist/{dialog-content-BFmy9Sbo.cjs.map → dialog-content-CpxWMPlh.cjs.map} +1 -1
- package/dist/{dialog-service-DwJ_7FB3.js → dialog-service-DwhuICgc.js} +2 -2
- package/dist/dialog-service-DwhuICgc.js.map +1 -0
- package/dist/dialog-service-juvsgc5X.cjs +2 -0
- package/dist/dialog-service-juvsgc5X.cjs.map +1 -0
- package/dist/dialog.cjs +1 -1
- package/dist/dialog.js +2 -2
- package/dist/{divider-FkKYlJY3.js → divider-Cz4g_Ept.js} +3 -3
- package/dist/{divider-FkKYlJY3.js.map → divider-Cz4g_Ept.js.map} +1 -1
- package/dist/{divider-BWG6TAr2.cjs → divider-DAg0oW4T.cjs} +2 -2
- package/dist/{divider-BWG6TAr2.cjs.map → divider-DAg0oW4T.cjs.map} +1 -1
- package/dist/divider.cjs +1 -1
- package/dist/divider.js +1 -1
- package/dist/{dropdown-content-BStJGihR.js → dropdown-content-Bto1swKT.js} +3 -3
- package/dist/{dropdown-content-BStJGihR.js.map → dropdown-content-Bto1swKT.js.map} +1 -1
- package/dist/{dropdown-content-m1aSF-Oh.cjs → dropdown-content-QvR9QvT0.cjs} +2 -2
- package/dist/{dropdown-content-m1aSF-Oh.cjs.map → dropdown-content-QvR9QvT0.cjs.map} +1 -1
- package/dist/dropdown.cjs +1 -1
- package/dist/dropdown.js +1 -1
- package/dist/{email-recipients-CpghUhQ1.js → email-recipients-C9Yx0eML.js} +7 -7
- package/dist/{email-recipients-CpghUhQ1.js.map → email-recipients-C9Yx0eML.js.map} +1 -1
- package/dist/{email-recipients-CbZNnzoj.cjs → email-recipients-aEI5Hz1y.cjs} +2 -2
- package/dist/{email-recipients-CbZNnzoj.cjs.map → email-recipients-aEI5Hz1y.cjs.map} +1 -1
- package/dist/extra.cjs +1 -1
- package/dist/extra.js +1 -1
- package/dist/{flex-C6yj5Sxi.js → flex-8Zt64KfZ.js} +2 -2
- package/dist/{flex-C6yj5Sxi.js.map → flex-8Zt64KfZ.js.map} +1 -1
- package/dist/{flex-BNVtJlgu.cjs → flex-BWZv2xik.cjs} +2 -2
- package/dist/{flex-BNVtJlgu.cjs.map → flex-BWZv2xik.cjs.map} +1 -1
- package/dist/{form-ns7c4fcj.cjs → form-BH43OMu3.cjs} +2 -2
- package/dist/{form-ns7c4fcj.cjs.map → form-BH43OMu3.cjs.map} +1 -1
- package/dist/{form-C85Qev2L.js → form-DeoSuBtM.js} +2 -2
- package/dist/{form-C85Qev2L.js.map → form-DeoSuBtM.js.map} +1 -1
- package/dist/form.cjs +1 -1
- package/dist/form.js +1 -1
- package/dist/{formField.mixin-CKb_MTS7.js → formField.mixin-BaPL0TYo.js} +2 -2
- package/dist/{formField.mixin-CKb_MTS7.js.map → formField.mixin-BaPL0TYo.js.map} +1 -1
- package/dist/{formField.mixin-B3CXBJKX.cjs → formField.mixin-Dta3OeAY.cjs} +2 -2
- package/dist/{formField.mixin-B3CXBJKX.cjs.map → formField.mixin-Dta3OeAY.cjs.map} +1 -1
- package/dist/{icon-DKPLcbdu.js → icon-B0JNrBfq.js} +2 -2
- package/dist/{icon-DKPLcbdu.js.map → icon-B0JNrBfq.js.map} +1 -1
- package/dist/{icon-DUstfLaC.cjs → icon-DY2pBLIU.cjs} +2 -2
- package/dist/{icon-DUstfLaC.cjs.map → icon-DY2pBLIU.cjs.map} +1 -1
- package/dist/{icon-button-DiRex-eZ.cjs → icon-button-D1GjgM8z.cjs} +2 -2
- package/dist/{icon-button-DiRex-eZ.cjs.map → icon-button-D1GjgM8z.cjs.map} +1 -1
- package/dist/{icon-button-CIkRej0r.js → icon-button-OZM1xg0D.js} +3 -3
- package/dist/{icon-button-CIkRej0r.js.map → icon-button-OZM1xg0D.js.map} +1 -1
- package/dist/icons.cjs +1 -1
- package/dist/icons.js +1 -1
- package/dist/index-CCi1otmh.cjs +2 -0
- package/dist/{index-DyJ0oDpR.cjs.map → index-CCi1otmh.cjs.map} +1 -1
- package/dist/index-CW6PhEkx.js +17 -0
- package/dist/{index-CuY8m6ta.js.map → index-CW6PhEkx.js.map} +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +221 -218
- package/dist/index.js.map +1 -1
- package/dist/{input-DODcsAZu.js → input-CkvjCut5.js} +3 -3
- package/dist/{input-DODcsAZu.js.map → input-CkvjCut5.js.map} +1 -1
- package/dist/{input-B7MqsI2h.cjs → input-lUWuO40Q.cjs} +2 -2
- package/dist/{input-B7MqsI2h.cjs.map → input-lUWuO40Q.cjs.map} +1 -1
- package/dist/input.cjs +1 -1
- package/dist/input.js +1 -1
- package/dist/layout.cjs +1 -1
- package/dist/layout.js +1 -1
- package/dist/{list-Cx6tpiFE.js → list-5rw56k73.js} +2 -2
- package/dist/{list-Cx6tpiFE.js.map → list-5rw56k73.js.map} +1 -1
- package/dist/{list-DxduK4sb.cjs → list-CIt75CB5.cjs} +2 -2
- package/dist/{list-DxduK4sb.cjs.map → list-CIt75CB5.cjs.map} +1 -1
- package/dist/list.cjs +1 -1
- package/dist/list.js +1 -1
- package/dist/{litElement.mixin-B12Y4mEr.cjs → litElement.mixin-BLa7fWsS.cjs} +2 -2
- package/dist/{litElement.mixin-B12Y4mEr.cjs.map → litElement.mixin-BLa7fWsS.cjs.map} +1 -1
- package/dist/{litElement.mixin-BZ8iGvPl.js → litElement.mixin-BZErt4H3.js} +2 -2
- package/dist/{litElement.mixin-BZ8iGvPl.js.map → litElement.mixin-BZErt4H3.js.map} +1 -1
- package/dist/mailbox.cjs +1 -1
- package/dist/mailbox.js +1 -1
- package/dist/{map-sgCf8pYD.cjs → map-BY_0W4ER.cjs} +2 -2
- package/dist/{map-sgCf8pYD.cjs.map → map-BY_0W4ER.cjs.map} +1 -1
- package/dist/{map-dT8yp1iK.js → map-BrguuFGa.js} +2 -2
- package/dist/{map-dT8yp1iK.js.map → map-BrguuFGa.js.map} +1 -1
- package/dist/map.cjs +1 -1
- package/dist/map.js +1 -1
- package/dist/{media-CgH0D5rY.js → media-CLz2t5zS.js} +2 -2
- package/dist/{media-CgH0D5rY.js.map → media-CLz2t5zS.js.map} +1 -1
- package/dist/{media-CwjupDLj.cjs → media-D6ZtvTjC.cjs} +2 -2
- package/dist/{media-CwjupDLj.cjs.map → media-D6ZtvTjC.cjs.map} +1 -1
- package/dist/{menu-oZRtmhVd.js → menu-CgDSJpDV.js} +3 -3
- package/dist/{menu-oZRtmhVd.js.map → menu-CgDSJpDV.js.map} +1 -1
- package/dist/{menu-X25Q7tpY.cjs → menu-DWD_IywE.cjs} +2 -2
- package/dist/{menu-X25Q7tpY.cjs.map → menu-DWD_IywE.cjs.map} +1 -1
- package/dist/menu.cjs +1 -1
- package/dist/menu.js +1 -1
- package/dist/nav-drawer.cjs +1 -1
- package/dist/nav-drawer.js +1 -1
- package/dist/{notification-service-y0T4rXdS.js → notification-service-1HGYK2tM.js} +4 -4
- package/dist/notification-service-1HGYK2tM.js.map +1 -0
- package/dist/{notification-service-kLTt3JtW.cjs → notification-service-A3reAJZQ.cjs} +2 -2
- package/dist/notification-service-A3reAJZQ.cjs.map +1 -0
- package/dist/notification.cjs +1 -1
- package/dist/notification.js +2 -2
- package/dist/{notify-BnjvURrc.js → notify-Bt-KiLeP.js} +2 -2
- package/dist/{notify-BnjvURrc.js.map → notify-Bt-KiLeP.js.map} +1 -1
- package/dist/{notify-EGStToeW.cjs → notify-CVbsMt75.cjs} +2 -2
- package/dist/{notify-EGStToeW.cjs.map → notify-CVbsMt75.cjs.map} +1 -1
- package/dist/{option-D4_WBCWz.cjs → option-Cd0TxMBE.cjs} +2 -2
- package/dist/{option-D4_WBCWz.cjs.map → option-Cd0TxMBE.cjs.map} +1 -1
- package/dist/{option-CD1NSUXu.js → option-DvSZ0D0R.js} +2 -2
- package/dist/{option-CD1NSUXu.js.map → option-DvSZ0D0R.js.map} +1 -1
- package/dist/option.cjs +1 -1
- package/dist/option.js +1 -1
- package/dist/{payment-card-form-lWlhuDb3.js → payment-card-form-C6wrIT_X.js} +3 -3
- package/dist/{payment-card-form-lWlhuDb3.js.map → payment-card-form-C6wrIT_X.js.map} +1 -1
- package/dist/{payment-card-form-96Rw6cLf.cjs → payment-card-form-CJkWQ3j4.cjs} +2 -2
- package/dist/{payment-card-form-96Rw6cLf.cjs.map → payment-card-form-CJkWQ3j4.cjs.map} +1 -1
- package/dist/{progress-BkxGzGOm.cjs → progress-D0iWLtHk.cjs} +2 -2
- package/dist/{progress-BkxGzGOm.cjs.map → progress-D0iWLtHk.cjs.map} +1 -1
- package/dist/{progress-DGk9tC4y.js → progress-pOL6OHwT.js} +2 -2
- package/dist/{progress-DGk9tC4y.js.map → progress-pOL6OHwT.js.map} +1 -1
- package/dist/progress.cjs +1 -1
- package/dist/progress.js +1 -1
- package/dist/{radio-button-DHM38A7h.js → radio-button-C-t6JJsj.js} +3 -3
- package/dist/{radio-button-DHM38A7h.js.map → radio-button-C-t6JJsj.js.map} +1 -1
- package/dist/{radio-button-w9ZxzEPa.cjs → radio-button-CSV7-ftB.cjs} +2 -2
- package/dist/{radio-button-w9ZxzEPa.cjs.map → radio-button-CSV7-ftB.cjs.map} +1 -1
- package/dist/radio-group.cjs +1 -1
- package/dist/radio-group.js +1 -1
- package/dist/route.component-DaBx0B3g.cjs +12 -0
- package/dist/route.component-DaBx0B3g.cjs.map +1 -0
- package/dist/route.component-DlVlAMWF.js +341 -0
- package/dist/route.component-DlVlAMWF.js.map +1 -0
- package/dist/rxjs-utils.cjs +1 -1
- package/dist/rxjs-utils.js +1 -1
- package/dist/{schmancy-steps-container-WYO4SOrb.js → schmancy-steps-container-AIJ2_ZSN.js} +12 -12
- package/dist/schmancy-steps-container-AIJ2_ZSN.js.map +1 -0
- package/dist/{schmancy-steps-container-CPSL_8H0.cjs → schmancy-steps-container-CgzGlBCk.cjs} +6 -6
- package/dist/schmancy-steps-container-CgzGlBCk.cjs.map +1 -0
- package/dist/{select-bDAzyQOZ.js → select-CwJ4OuVo.js} +3 -3
- package/dist/{select-bDAzyQOZ.js.map → select-CwJ4OuVo.js.map} +1 -1
- package/dist/{select-CxCcgqW_.cjs → select-GBaqnfMC.cjs} +2 -2
- package/dist/{select-CxCcgqW_.cjs.map → select-GBaqnfMC.cjs.map} +1 -1
- package/dist/select.cjs +1 -1
- package/dist/select.js +1 -1
- package/dist/{selector-hook-CIpuCUbr.js → selector-hook-ChImS_JT.js} +2 -2
- package/dist/{selector-hook-CIpuCUbr.js.map → selector-hook-ChImS_JT.js.map} +1 -1
- package/dist/{selector-hook-DB8RFC1y.cjs → selector-hook-cqmAutda.cjs} +2 -2
- package/dist/{selector-hook-DB8RFC1y.cjs.map → selector-hook-cqmAutda.cjs.map} +1 -1
- package/dist/{sheet-Bm0ukLXt.cjs → sheet-CXd47YKG.cjs} +2 -2
- package/dist/{sheet-Bm0ukLXt.cjs.map → sheet-CXd47YKG.cjs.map} +1 -1
- package/dist/{sheet-pO6PmiAf.js → sheet-fT1oxKgG.js} +4 -4
- package/dist/{sheet-pO6PmiAf.js.map → sheet-fT1oxKgG.js.map} +1 -1
- package/dist/sheet.cjs +1 -1
- package/dist/sheet.js +2 -2
- package/dist/sheet.service-BxvWBGsJ.cjs +2 -0
- package/dist/sheet.service-BxvWBGsJ.cjs.map +1 -0
- package/dist/{sheet.service-ieSXeqCj.js → sheet.service-lXqUf6n5.js} +2 -2
- package/dist/sheet.service-lXqUf6n5.js.map +1 -0
- package/dist/{slider-CxZGMYF-.js → slider-CYsku-3b.js} +3 -3
- package/dist/{slider-CxZGMYF-.js.map → slider-CYsku-3b.js.map} +1 -1
- package/dist/{slider-BwXXp74f.cjs → slider-DxSzFbQe.cjs} +2 -2
- package/dist/{slider-BwXXp74f.cjs.map → slider-DxSzFbQe.cjs.map} +1 -1
- package/dist/slider.cjs +1 -1
- package/dist/slider.js +1 -1
- package/dist/{spinner-b3VWC6It.js → spinner-CrK1E8LD.js} +2 -2
- package/dist/{spinner-b3VWC6It.js.map → spinner-CrK1E8LD.js.map} +1 -1
- package/dist/{spinner-nN77H00p.cjs → spinner-DrG_NQpx.cjs} +2 -2
- package/dist/{spinner-nN77H00p.cjs.map → spinner-DrG_NQpx.cjs.map} +1 -1
- package/dist/steps.cjs +1 -1
- package/dist/steps.js +1 -1
- package/dist/store.cjs +1 -1
- package/dist/store.js +2 -2
- package/dist/{surface-C2WjztRc.js → surface-C64YekDh.js} +2 -2
- package/dist/{surface-C2WjztRc.js.map → surface-C64YekDh.js.map} +1 -1
- package/dist/{surface-Cm8zYK5d.cjs → surface-DVNi8l6T.cjs} +2 -2
- package/dist/{surface-Cm8zYK5d.cjs.map → surface-DVNi8l6T.cjs.map} +1 -1
- package/dist/surface.cjs +1 -1
- package/dist/surface.js +1 -1
- package/dist/{table-BfhuaB9J.cjs → table-B3WKGYlu.cjs} +2 -2
- package/dist/{table-BfhuaB9J.cjs.map → table-B3WKGYlu.cjs.map} +1 -1
- package/dist/{table-Dp7npAuy.js → table-DmrYZ1hR.js} +2 -2
- package/dist/{table-Dp7npAuy.js.map → table-DmrYZ1hR.js.map} +1 -1
- package/dist/table.cjs +1 -1
- package/dist/table.js +1 -1
- package/dist/{tabs-compatibility-CA-wWRoe.cjs → tabs-compatibility-Ds7SEeST.cjs} +2 -2
- package/dist/{tabs-compatibility-CA-wWRoe.cjs.map → tabs-compatibility-Ds7SEeST.cjs.map} +1 -1
- package/dist/{tabs-compatibility-U4cq8X3I.js → tabs-compatibility-Uetjk25R.js} +2 -2
- package/dist/{tabs-compatibility-U4cq8X3I.js.map → tabs-compatibility-Uetjk25R.js.map} +1 -1
- package/dist/tabs.cjs +1 -1
- package/dist/tabs.js +1 -1
- package/dist/tailwind.mixin-B6ADeWOc.js +43 -0
- package/dist/{tailwind.mixin-D2DVHS9V.js.map → tailwind.mixin-B6ADeWOc.js.map} +1 -1
- package/dist/tailwind.mixin-df9KoZ9x.cjs +2 -0
- package/dist/{tailwind.mixin-BlZIIaOE.cjs.map → tailwind.mixin-df9KoZ9x.cjs.map} +1 -1
- package/dist/teleport.cjs +1 -1
- package/dist/teleport.js +1 -1
- package/dist/{textarea-BRNj3tvi.js → textarea-B1Tng7F9.js} +2 -2
- package/dist/{textarea-BRNj3tvi.js.map → textarea-B1Tng7F9.js.map} +1 -1
- package/dist/{textarea-CxZKoXaU.cjs → textarea-QKNA3oAQ.cjs} +2 -2
- package/dist/{textarea-CxZKoXaU.cjs.map → textarea-QKNA3oAQ.cjs.map} +1 -1
- package/dist/textarea.cjs +1 -1
- package/dist/textarea.js +1 -1
- package/dist/{theme-button-N_Wt3bos.js → theme-button-CYEhS3ub.js} +2 -2
- package/dist/{theme-button-N_Wt3bos.js.map → theme-button-CYEhS3ub.js.map} +1 -1
- package/dist/{theme-button-MrIoOFEB.cjs → theme-button-CoCFS3Rx.cjs} +2 -2
- package/dist/{theme-button-MrIoOFEB.cjs.map → theme-button-CoCFS3Rx.cjs.map} +1 -1
- package/dist/theme-button.cjs +1 -1
- package/dist/theme-button.js +1 -1
- package/dist/theme.cjs +1 -1
- package/dist/theme.component-C12jLwtB.cjs +3 -0
- package/dist/theme.component-C12jLwtB.cjs.map +1 -0
- package/dist/{theme.component-6VfET_t-.js → theme.component-Df731_fn.js} +247 -171
- package/dist/theme.component-Df731_fn.js.map +1 -0
- package/dist/theme.events-CPSLaOlR.js +6 -0
- package/dist/theme.events-CPSLaOlR.js.map +1 -0
- package/dist/theme.events-Car6U_SQ.cjs +2 -0
- package/dist/theme.events-Car6U_SQ.cjs.map +1 -0
- package/dist/theme.interface-C5Kj6WjD.js.map +1 -1
- package/dist/theme.interface-Xg5Zi46a.cjs.map +1 -1
- package/dist/theme.js +9 -7
- package/dist/theme.js.map +1 -1
- package/dist/{timezone-BVd9UEba.cjs → timezone-B7bscKFN.cjs} +2 -2
- package/dist/{timezone-BVd9UEba.cjs.map → timezone-B7bscKFN.cjs.map} +1 -1
- package/dist/{timezone-DR_4m9Cc.js → timezone-CdtCVjMF.js} +3 -3
- package/dist/{timezone-DR_4m9Cc.js.map → timezone-CdtCVjMF.js.map} +1 -1
- package/dist/{tooltip-DOQVLRaH.cjs → tooltip-CjoNCIvr.cjs} +2 -2
- package/dist/{tooltip-DOQVLRaH.cjs.map → tooltip-CjoNCIvr.cjs.map} +1 -1
- package/dist/{tooltip-BpPHc8Wr.js → tooltip-JVkexTyf.js} +2 -2
- package/dist/{tooltip-BpPHc8Wr.js.map → tooltip-JVkexTyf.js.map} +1 -1
- package/dist/tooltip.cjs +1 -1
- package/dist/tooltip.js +1 -1
- package/dist/{tree-BANkyLn7.cjs → tree-Be48ABq4.cjs} +2 -2
- package/dist/{tree-BANkyLn7.cjs.map → tree-Be48ABq4.cjs.map} +1 -1
- package/dist/{tree-C5zu8wXc.js → tree-CaqiNcJJ.js} +2 -2
- package/dist/{tree-C5zu8wXc.js.map → tree-CaqiNcJJ.js.map} +1 -1
- package/dist/tree.cjs +1 -1
- package/dist/tree.js +1 -1
- package/dist/{typewriter-CdztqkoR.js → typewriter-CoMrmwFJ.js} +8 -8
- package/dist/{typewriter-CdztqkoR.js.map → typewriter-CoMrmwFJ.js.map} +1 -1
- package/dist/{typewriter-DS0D0UZM.cjs → typewriter-DCYDScE9.cjs} +2 -2
- package/dist/{typewriter-DS0D0UZM.cjs.map → typewriter-DCYDScE9.cjs.map} +1 -1
- package/dist/typewriter.cjs +1 -1
- package/dist/typewriter.js +1 -1
- package/dist/{typography-C8vZfuLF.cjs → typography-BQg6J2hD.cjs} +2 -2
- package/dist/{typography-C8vZfuLF.cjs.map → typography-BQg6J2hD.cjs.map} +1 -1
- package/dist/{typography-o9FJ6Lzo.js → typography-DkJagEoF.js} +2 -2
- package/dist/{typography-o9FJ6Lzo.js.map → typography-DkJagEoF.js.map} +1 -1
- package/dist/typography.cjs +1 -1
- package/dist/typography.js +1 -1
- package/package.json +1 -1
- package/types/src/area/area.component.d.ts +25 -5
- package/types/src/area/index.d.ts +1 -0
- package/types/src/area/route.component.d.ts +43 -0
- package/types/src/area/route.test.d.ts +20 -0
- package/types/src/steps/schmancy-steps-container.d.ts +9 -0
- package/types/src/store/context-collection.d.ts +26 -2
- package/types/src/theme/context.d.ts +24 -0
- package/types/src/theme/index.d.ts +2 -0
- package/types/src/theme/theme.component.d.ts +49 -6
- package/types/src/theme/theme.events.d.ts +55 -0
- package/types/src/theme/theme.interface.d.ts +36 -0
- package/types/src/theme/theme.service.d.ts +261 -0
- package/dist/area.component-C86pi_TT.js +0 -283
- package/dist/area.component-C86pi_TT.js.map +0 -1
- package/dist/area.component-nX_dCv4R.cjs +0 -8
- package/dist/area.component-nX_dCv4R.cjs.map +0 -1
- package/dist/avatar-D3gNBale.js.map +0 -1
- package/dist/avatar-N3BODeY1.cjs.map +0 -1
- package/dist/delay-Ew4cphs1.cjs.map +0 -1
- package/dist/delay-LnWlFwkK.js.map +0 -1
- package/dist/dialog-service-DS-aEjlX.cjs +0 -2
- package/dist/dialog-service-DS-aEjlX.cjs.map +0 -1
- package/dist/dialog-service-DwJ_7FB3.js.map +0 -1
- package/dist/index-CuY8m6ta.js +0 -19
- package/dist/index-DyJ0oDpR.cjs +0 -2
- package/dist/notification-service-kLTt3JtW.cjs.map +0 -1
- package/dist/notification-service-y0T4rXdS.js.map +0 -1
- package/dist/schmancy-steps-container-CPSL_8H0.cjs.map +0 -1
- package/dist/schmancy-steps-container-WYO4SOrb.js.map +0 -1
- package/dist/sheet.service-DV9xNhS8.cjs +0 -2
- package/dist/sheet.service-DV9xNhS8.cjs.map +0 -1
- package/dist/sheet.service-ieSXeqCj.js.map +0 -1
- package/dist/tailwind.mixin-BlZIIaOE.cjs +0 -2
- package/dist/tailwind.mixin-D2DVHS9V.js +0 -43
- package/dist/theme.component-6VfET_t-.js.map +0 -1
- package/dist/theme.component-B_EubPsq.cjs +0 -3
- package/dist/theme.component-B_EubPsq.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
|
|
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
|
-
##
|
|
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
|
-
|
|
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
|
|
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
|
-
```
|
|
212
|
+
```typescript
|
|
25
213
|
// Import the area service
|
|
26
|
-
import { area } from '@schmancy/
|
|
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
|
-
|
|
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
|
-
##
|
|
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
|
-
```
|
|
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
|
-
###
|
|
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
|
-
|
|
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
|
-
|
|
116
|
-
|
|
117
|
-
|
|
302
|
+
```typescript
|
|
303
|
+
// Open a modal or sidebar
|
|
304
|
+
area.push({
|
|
305
|
+
component: 'user-settings',
|
|
118
306
|
area: 'modal',
|
|
119
|
-
|
|
307
|
+
props: { userId: '123' }
|
|
120
308
|
});
|
|
121
309
|
|
|
122
|
-
// Close
|
|
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
|
-
```
|
|
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
|
-
|
|
150
|
-
area.param<string>('product', 'productId').subscribe(id => {
|
|
151
|
-
fetchProductDetails(id);
|
|
152
|
-
});
|
|
341
|
+
### Default Components
|
|
153
342
|
|
|
154
|
-
|
|
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
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
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
|
-
|
|
361
|
+
## Best Practices
|
|
168
362
|
|
|
169
|
-
|
|
363
|
+
### 1. Route Organization
|
|
170
364
|
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
432
|
+
### 4. Dynamic Route Loading
|
|
182
433
|
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
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
|
-
###
|
|
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
|
-
|
|
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(
|
|
516
|
+
).subscribe();
|
|
204
517
|
```
|
|
205
518
|
|
|
206
|
-
|
|
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
|
-
|
|
529
|
+
## Advanced Examples
|
|
209
530
|
|
|
210
|
-
|
|
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
|
-
|
|
220
|
-
area
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
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
|
-
|
|
555
|
+
### Wizard/Step Navigation
|
|
229
556
|
|
|
230
|
-
|
|
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
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
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
|
-
```
|
|
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.
|