@mhmo91/schmancy 0.9.3 → 0.9.4

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 (369) hide show
  1. package/ai/INDEX.md +53 -302
  2. package/ai/area.md +91 -165
  3. package/ai/mailbox.md +1 -1
  4. package/ai/mixins.md +37 -139
  5. package/ai/store.md +70 -136
  6. package/dist/ai/INDEX.md +53 -302
  7. package/dist/ai/area.md +91 -165
  8. package/dist/ai/mailbox.md +1 -1
  9. package/dist/ai/mixins.md +37 -139
  10. package/dist/ai/store.md +70 -136
  11. package/dist/{area-CC8fUnra.js → area-CRoGqD_u.js} +2 -2
  12. package/dist/area-CRoGqD_u.js.map +1 -0
  13. package/dist/{area-wnWUAHEn.cjs → area-JPykB7A9.cjs} +1 -1
  14. package/dist/area-JPykB7A9.cjs.map +1 -0
  15. package/dist/area.cjs +1 -1
  16. package/dist/area.js +1 -1
  17. package/dist/{autocomplete-B2Z3WK_7.cjs → autocomplete-5rVhbieU.cjs} +1 -1
  18. package/dist/{autocomplete-B2Z3WK_7.cjs.map → autocomplete-5rVhbieU.cjs.map} +1 -1
  19. package/dist/{autocomplete-CJ7YgtKN.js → autocomplete-BllPQwr8.js} +3 -3
  20. package/dist/{autocomplete-CJ7YgtKN.js.map → autocomplete-BllPQwr8.js.map} +1 -1
  21. package/dist/autocomplete.cjs +1 -1
  22. package/dist/autocomplete.js +1 -1
  23. package/dist/badge.cjs +1 -1
  24. package/dist/badge.js +1 -1
  25. package/dist/{boat-C9eU6NO-.js → boat-BDTQ-du9.js} +2 -2
  26. package/dist/{boat-C9eU6NO-.js.map → boat-BDTQ-du9.js.map} +1 -1
  27. package/dist/{boat-B57_4TzJ.cjs → boat-DYEAZ8Qj.cjs} +1 -1
  28. package/dist/{boat-B57_4TzJ.cjs.map → boat-DYEAZ8Qj.cjs.map} +1 -1
  29. package/dist/boat.cjs +1 -1
  30. package/dist/boat.js +1 -1
  31. package/dist/{busy-CGZXy0h-.js → busy-ChDAeaKF.js} +1 -1
  32. package/dist/{busy-CGZXy0h-.js.map → busy-ChDAeaKF.js.map} +1 -1
  33. package/dist/{busy--6oimtop.cjs → busy-Dj7Xn0Z0.cjs} +1 -1
  34. package/dist/{busy--6oimtop.cjs.map → busy-Dj7Xn0Z0.cjs.map} +1 -1
  35. package/dist/busy.cjs +1 -1
  36. package/dist/busy.js +1 -1
  37. package/dist/button.cjs +1 -1
  38. package/dist/button.js +2 -2
  39. package/dist/{card-BGJ0Hb1O.cjs → card-BvPWVEJX.cjs} +1 -1
  40. package/dist/{card-BGJ0Hb1O.cjs.map → card-BvPWVEJX.cjs.map} +1 -1
  41. package/dist/{card-C-ee-l5O.js → card-DZFPRPqs.js} +1 -1
  42. package/dist/{card-C-ee-l5O.js.map → card-DZFPRPqs.js.map} +1 -1
  43. package/dist/card.cjs +1 -1
  44. package/dist/card.js +1 -1
  45. package/dist/charts.cjs +1 -1
  46. package/dist/charts.js +2 -2
  47. package/dist/{checkbox-DuYaKoDZ.cjs → checkbox-BC_37rsG.cjs} +1 -1
  48. package/dist/{checkbox-DuYaKoDZ.cjs.map → checkbox-BC_37rsG.cjs.map} +1 -1
  49. package/dist/{checkbox-FRcorDrD.js → checkbox-GSSjqo6w.js} +1 -1
  50. package/dist/{checkbox-FRcorDrD.js.map → checkbox-GSSjqo6w.js.map} +1 -1
  51. package/dist/checkbox.cjs +1 -1
  52. package/dist/checkbox.js +1 -1
  53. package/dist/{chips-BpA0A-qr.cjs → chips-B19XS8Xc.cjs} +1 -1
  54. package/dist/{chips-BpA0A-qr.cjs.map → chips-B19XS8Xc.cjs.map} +1 -1
  55. package/dist/{chips-CyzNbKJD.js → chips-B9oAEfE_.js} +3 -3
  56. package/dist/{chips-CyzNbKJD.js.map → chips-B9oAEfE_.js.map} +1 -1
  57. package/dist/chips.cjs +1 -1
  58. package/dist/chips.js +2 -2
  59. package/dist/{code-highlight-C7O9ltXm.js → code-highlight-DCk5lJY-.js} +1 -1
  60. package/dist/{code-highlight-C7O9ltXm.js.map → code-highlight-DCk5lJY-.js.map} +1 -1
  61. package/dist/{code-highlight-DsBdSQBG.cjs → code-highlight-fSLrlgOb.cjs} +1 -1
  62. package/dist/{code-highlight-DsBdSQBG.cjs.map → code-highlight-fSLrlgOb.cjs.map} +1 -1
  63. package/dist/code-highlight.cjs +1 -1
  64. package/dist/code-highlight.js +1 -1
  65. package/dist/{components-CkMvOiTR.js → components-COsM6sJZ.js} +2 -2
  66. package/dist/{components-CkMvOiTR.js.map → components-COsM6sJZ.js.map} +1 -1
  67. package/dist/{components-dDI3xeIf.cjs → components-CyD6a7gQ.cjs} +1 -1
  68. package/dist/{components-dDI3xeIf.cjs.map → components-CyD6a7gQ.cjs.map} +1 -1
  69. package/dist/components.cjs +1 -1
  70. package/dist/components.js +1 -1
  71. package/dist/connectivity.cjs +1 -1
  72. package/dist/connectivity.js +1 -1
  73. package/dist/content-drawer.cjs +1 -1
  74. package/dist/content-drawer.js +1 -1
  75. package/dist/{date-range-BrN_Bs6_.js → date-range-Sfyco9-n.js} +3 -3
  76. package/dist/{date-range-BrN_Bs6_.js.map → date-range-Sfyco9-n.js.map} +1 -1
  77. package/dist/{date-range-70zhLUKE.cjs → date-range-ZAaQB22I.cjs} +1 -1
  78. package/dist/{date-range-70zhLUKE.cjs.map → date-range-ZAaQB22I.cjs.map} +1 -1
  79. package/dist/{date-range-inline-Cp294DxR.js → date-range-inline-Bl8qbiQF.js} +1 -1
  80. package/dist/{date-range-inline-Cp294DxR.js.map → date-range-inline-Bl8qbiQF.js.map} +1 -1
  81. package/dist/{date-range-inline-CPzD-tIv.cjs → date-range-inline-m7nLjOMI.cjs} +1 -1
  82. package/dist/{date-range-inline-CPzD-tIv.cjs.map → date-range-inline-m7nLjOMI.cjs.map} +1 -1
  83. package/dist/date-range-inline.cjs +1 -1
  84. package/dist/date-range-inline.js +1 -1
  85. package/dist/date-range.cjs +1 -1
  86. package/dist/date-range.js +1 -1
  87. package/dist/{delay-COcAkBqB.cjs → delay-7boauN6N.cjs} +1 -1
  88. package/dist/{delay-COcAkBqB.cjs.map → delay-7boauN6N.cjs.map} +1 -1
  89. package/dist/{delay-IV0Swce2.js → delay-CgX6m0HN.js} +3 -3
  90. package/dist/{delay-IV0Swce2.js.map → delay-CgX6m0HN.js.map} +1 -1
  91. package/dist/delay.cjs +1 -1
  92. package/dist/delay.js +1 -1
  93. package/dist/{details-DgWkPqmt.cjs → details-BHnk8l4q.cjs} +1 -1
  94. package/dist/{details-DgWkPqmt.cjs.map → details-BHnk8l4q.cjs.map} +1 -1
  95. package/dist/{details-CuKmr3Qw.js → details-BPkUg8Cq.js} +2 -2
  96. package/dist/{details-CuKmr3Qw.js.map → details-BPkUg8Cq.js.map} +1 -1
  97. package/dist/details.cjs +1 -1
  98. package/dist/details.js +1 -1
  99. package/dist/dialog.cjs +1 -1
  100. package/dist/dialog.js +2 -2
  101. package/dist/directives.cjs.map +1 -1
  102. package/dist/directives.js.map +1 -1
  103. package/dist/discovery.cjs.map +1 -1
  104. package/dist/discovery.js.map +1 -1
  105. package/dist/{divider-BWoUbfgZ.js → divider-CW9a7MMj.js} +2 -2
  106. package/dist/{divider-BWoUbfgZ.js.map → divider-CW9a7MMj.js.map} +1 -1
  107. package/dist/{divider-BghtrMbn.cjs → divider-_khrhrZo.cjs} +1 -1
  108. package/dist/{divider-BghtrMbn.cjs.map → divider-_khrhrZo.cjs.map} +1 -1
  109. package/dist/divider.cjs +1 -1
  110. package/dist/divider.js +1 -1
  111. package/dist/dropdown.cjs +1 -1
  112. package/dist/dropdown.js +2 -2
  113. package/dist/{expand-XyDE5SsO.cjs → expand-Cp7-PH8b.cjs} +1 -1
  114. package/dist/{expand-XyDE5SsO.cjs.map → expand-Cp7-PH8b.cjs.map} +1 -1
  115. package/dist/{expand-CJU9m4ga.js → expand-iQ7EOMP7.js} +3 -3
  116. package/dist/{expand-CJU9m4ga.js.map → expand-iQ7EOMP7.js.map} +1 -1
  117. package/dist/expand.cjs +1 -1
  118. package/dist/expand.js +1 -1
  119. package/dist/{extra-CsrRKKqE.cjs → extra-IKAiJJhv.cjs} +1 -1
  120. package/dist/{extra-CsrRKKqE.cjs.map → extra-IKAiJJhv.cjs.map} +1 -1
  121. package/dist/{extra-BxXFmW1w.js → extra-wEpvEFbK.js} +2 -2
  122. package/dist/{extra-BxXFmW1w.js.map → extra-wEpvEFbK.js.map} +1 -1
  123. package/dist/extra.cjs +1 -1
  124. package/dist/extra.js +1 -1
  125. package/dist/{float-BD86t_NU.js → float-BQ_urmMs.js} +2 -2
  126. package/dist/{float-BD86t_NU.js.map → float-BQ_urmMs.js.map} +1 -1
  127. package/dist/{float-DBv1FINW.cjs → float-D5rNC82i.cjs} +1 -1
  128. package/dist/{float-DBv1FINW.cjs.map → float-D5rNC82i.cjs.map} +1 -1
  129. package/dist/float.cjs +1 -1
  130. package/dist/float.js +1 -1
  131. package/dist/{form-D0bIeDWT.cjs → form-BqN1AGFj.cjs} +1 -1
  132. package/dist/{form-D0bIeDWT.cjs.map → form-BqN1AGFj.cjs.map} +1 -1
  133. package/dist/{form-Cp5-I_ZV.js → form-CajC5HnO.js} +1 -1
  134. package/dist/{form-Cp5-I_ZV.js.map → form-CajC5HnO.js.map} +1 -1
  135. package/dist/form.cjs +1 -1
  136. package/dist/form.js +1 -1
  137. package/dist/{icons-D8w_20mO.cjs → icons-B57_93VV.cjs} +1 -1
  138. package/dist/{icons-D8w_20mO.cjs.map → icons-B57_93VV.cjs.map} +1 -1
  139. package/dist/{icons-BpU0_l92.js → icons-BDqiGXrO.js} +1 -1
  140. package/dist/{icons-BpU0_l92.js.map → icons-BDqiGXrO.js.map} +1 -1
  141. package/dist/icons.cjs +1 -1
  142. package/dist/icons.js +1 -1
  143. package/dist/{iframe-BjwxA2Pg.cjs → iframe-DNHL3GIk.cjs} +1 -1
  144. package/dist/{iframe-BjwxA2Pg.cjs.map → iframe-DNHL3GIk.cjs.map} +1 -1
  145. package/dist/{iframe-tY1GY5g1.js → iframe-WnWPIrBG.js} +1 -1
  146. package/dist/{iframe-tY1GY5g1.js.map → iframe-WnWPIrBG.js.map} +1 -1
  147. package/dist/iframe.cjs +1 -1
  148. package/dist/iframe.js +1 -1
  149. package/dist/index.cjs +1 -1
  150. package/dist/index.js +33 -33
  151. package/dist/{input-BwxwognS.cjs → input-BiSrTcrR.cjs} +1 -1
  152. package/dist/{input-BwxwognS.cjs.map → input-BiSrTcrR.cjs.map} +1 -1
  153. package/dist/{input-BnfTpRN9.js → input-VaXHFrRn.js} +1 -1
  154. package/dist/{input-BnfTpRN9.js.map → input-VaXHFrRn.js.map} +1 -1
  155. package/dist/{input-chip-MjOwX5EY.cjs → input-chip-Dy-AiP55.cjs} +1 -1
  156. package/dist/{input-chip-MjOwX5EY.cjs.map → input-chip-Dy-AiP55.cjs.map} +1 -1
  157. package/dist/{input-chip-CkM2aYmO.js → input-chip-QejNcRnS.js} +1 -1
  158. package/dist/{input-chip-CkM2aYmO.js.map → input-chip-QejNcRnS.js.map} +1 -1
  159. package/dist/input.cjs +1 -1
  160. package/dist/input.js +1 -1
  161. package/dist/json.cjs +1 -1
  162. package/dist/json.js +2 -2
  163. package/dist/{layout-CJSlZlFL.js → layout-CnsXeCAy.js} +2 -2
  164. package/dist/{layout-CJSlZlFL.js.map → layout-CnsXeCAy.js.map} +1 -1
  165. package/dist/{layout-BV0EeyUS.cjs → layout-DNYG3phx.cjs} +1 -1
  166. package/dist/{layout-BV0EeyUS.cjs.map → layout-DNYG3phx.cjs.map} +1 -1
  167. package/dist/layout.cjs +1 -1
  168. package/dist/layout.js +2 -2
  169. package/dist/{lightbox-groqGmJH.js → lightbox-BrI1Z31s.js} +2 -2
  170. package/dist/{lightbox-groqGmJH.js.map → lightbox-BrI1Z31s.js.map} +1 -1
  171. package/dist/{lightbox-CpNMZHZW.cjs → lightbox-CmACf0t5.cjs} +1 -1
  172. package/dist/{lightbox-CpNMZHZW.cjs.map → lightbox-CmACf0t5.cjs.map} +1 -1
  173. package/dist/lightbox.cjs +1 -1
  174. package/dist/lightbox.js +1 -1
  175. package/dist/{list-DzkqT_r-.js → list-Cm-jjXxM.js} +2 -2
  176. package/dist/{list-DzkqT_r-.js.map → list-Cm-jjXxM.js.map} +1 -1
  177. package/dist/{list-CyHd0Zc2.cjs → list-swIL9VDv.cjs} +1 -1
  178. package/dist/{list-CyHd0Zc2.cjs.map → list-swIL9VDv.cjs.map} +1 -1
  179. package/dist/list.cjs +1 -1
  180. package/dist/list.js +1 -1
  181. package/dist/{litElement.mixin-BG6_-nYX.cjs → litElement.mixin-3llHwB-8.cjs} +1 -1
  182. package/dist/{litElement.mixin-BG6_-nYX.cjs.map → litElement.mixin-3llHwB-8.cjs.map} +1 -1
  183. package/dist/{litElement.mixin-Dm-4L8zL.js → litElement.mixin-6jJYHCrZ.js} +1 -1
  184. package/dist/{litElement.mixin-Dm-4L8zL.js.map → litElement.mixin-6jJYHCrZ.js.map} +1 -1
  185. package/dist/{mailbox-BcqnXYVP.js → mailbox-BuvsVaAQ.js} +4 -4
  186. package/dist/{mailbox-BcqnXYVP.js.map → mailbox-BuvsVaAQ.js.map} +1 -1
  187. package/dist/{mailbox-C5eYTd7p.cjs → mailbox-D6LkQcN5.cjs} +1 -1
  188. package/dist/{mailbox-C5eYTd7p.cjs.map → mailbox-D6LkQcN5.cjs.map} +1 -1
  189. package/dist/mailbox.cjs +1 -1
  190. package/dist/mailbox.js +1 -1
  191. package/dist/{map-C0o1PgLE.js → map-CQiKAxC3.js} +1 -1
  192. package/dist/{map-C0o1PgLE.js.map → map-CQiKAxC3.js.map} +1 -1
  193. package/dist/{map-BncheFt5.cjs → map-D5NN4VET.cjs} +1 -1
  194. package/dist/{map-BncheFt5.cjs.map → map-D5NN4VET.cjs.map} +1 -1
  195. package/dist/map.cjs +1 -1
  196. package/dist/map.js +1 -1
  197. package/dist/{menu-uwqlQbLd.js → menu-C1x04YZw.js} +2 -2
  198. package/dist/{menu-uwqlQbLd.js.map → menu-C1x04YZw.js.map} +1 -1
  199. package/dist/{menu-yXzwJZFf.cjs → menu-CkgMO9K5.cjs} +1 -1
  200. package/dist/{menu-yXzwJZFf.cjs.map → menu-CkgMO9K5.cjs.map} +1 -1
  201. package/dist/menu.cjs +1 -1
  202. package/dist/menu.js +1 -1
  203. package/dist/mixins.cjs +1 -1
  204. package/dist/mixins.js +3 -3
  205. package/dist/nav-drawer.cjs +1 -1
  206. package/dist/nav-drawer.js +1 -1
  207. package/dist/navigation-bar.cjs +1 -1
  208. package/dist/navigation-bar.js +1 -1
  209. package/dist/navigation-rail.cjs +1 -1
  210. package/dist/navigation-rail.js +2 -2
  211. package/dist/{notification-DzYT4deA.js → notification-BnBgxjF-.js} +3 -3
  212. package/dist/{notification-DzYT4deA.js.map → notification-BnBgxjF-.js.map} +1 -1
  213. package/dist/{notification-BjwTfLAl.cjs → notification-CZFEhWxc.cjs} +1 -1
  214. package/dist/{notification-BjwTfLAl.cjs.map → notification-CZFEhWxc.cjs.map} +1 -1
  215. package/dist/notification.cjs +1 -1
  216. package/dist/notification.js +1 -1
  217. package/dist/{option-BJsD3u2D.cjs → option-BrxCVwSx.cjs} +1 -1
  218. package/dist/{option-BJsD3u2D.cjs.map → option-BrxCVwSx.cjs.map} +1 -1
  219. package/dist/{option-JFHxgiYl.js → option-DBO8xZwd.js} +1 -1
  220. package/dist/{option-JFHxgiYl.js.map → option-DBO8xZwd.js.map} +1 -1
  221. package/dist/option.cjs +1 -1
  222. package/dist/option.js +1 -1
  223. package/dist/page.cjs +1 -1
  224. package/dist/page.js +3 -3
  225. package/dist/{progress-BoRmyGAa.cjs → progress-Db2e4_Zd.cjs} +1 -1
  226. package/dist/{progress-BoRmyGAa.cjs.map → progress-Db2e4_Zd.cjs.map} +1 -1
  227. package/dist/{progress-BUh5WBqx.js → progress-DeiHxXo7.js} +2 -2
  228. package/dist/{progress-BUh5WBqx.js.map → progress-DeiHxXo7.js.map} +1 -1
  229. package/dist/progress.cjs +1 -1
  230. package/dist/progress.js +1 -1
  231. package/dist/{provide-8MrDz_qX.js → provide-C1aQhxYo.js} +1 -1
  232. package/dist/{provide-8MrDz_qX.js.map → provide-C1aQhxYo.js.map} +1 -1
  233. package/dist/{provide-CDkxgjHb.cjs → provide-DHnhQtCH.cjs} +1 -1
  234. package/dist/{provide-CDkxgjHb.cjs.map → provide-DHnhQtCH.cjs.map} +1 -1
  235. package/dist/qr-scanner.cjs +1 -1
  236. package/dist/qr-scanner.js +2 -2
  237. package/dist/{radio-group-rhrvhB5X.cjs → radio-group-Cspwd-Vw.cjs} +1 -1
  238. package/dist/{radio-group-rhrvhB5X.cjs.map → radio-group-Cspwd-Vw.cjs.map} +1 -1
  239. package/dist/{radio-group-DbOWUPhi.js → radio-group-zSO0AkJf.js} +1 -1
  240. package/dist/{radio-group-DbOWUPhi.js.map → radio-group-zSO0AkJf.js.map} +1 -1
  241. package/dist/radio-group.cjs +1 -1
  242. package/dist/radio-group.js +1 -1
  243. package/dist/range.cjs +1 -1
  244. package/dist/range.js +1 -1
  245. package/dist/{scroll-BE9W9PF2.cjs → scroll-QMCmbbDv.cjs} +1 -1
  246. package/dist/{scroll-BE9W9PF2.cjs.map → scroll-QMCmbbDv.cjs.map} +1 -1
  247. package/dist/{scroll-qGks1R0k.js → scroll-cBDzye64.js} +1 -1
  248. package/dist/{scroll-qGks1R0k.js.map → scroll-cBDzye64.js.map} +1 -1
  249. package/dist/{select-DXU2kzg4.cjs → select-Ct37l3lg.cjs} +1 -1
  250. package/dist/{select-DXU2kzg4.cjs.map → select-Ct37l3lg.cjs.map} +1 -1
  251. package/dist/{select-D9sgBRjU.js → select-c6HbWvKP.js} +2 -2
  252. package/dist/{select-D9sgBRjU.js.map → select-c6HbWvKP.js.map} +1 -1
  253. package/dist/select.cjs +1 -1
  254. package/dist/select.js +1 -1
  255. package/dist/{sheet-CIxCCJ3H.js → sheet-BMXcUiIm.js} +4 -4
  256. package/dist/{sheet-CIxCCJ3H.js.map → sheet-BMXcUiIm.js.map} +1 -1
  257. package/dist/{sheet-CeX6BbNp.cjs → sheet-CQec-bCV.cjs} +1 -1
  258. package/dist/{sheet-CeX6BbNp.cjs.map → sheet-CQec-bCV.cjs.map} +1 -1
  259. package/dist/sheet.cjs +1 -1
  260. package/dist/sheet.js +2 -2
  261. package/dist/{sheet.service-CAB7weBc.js → sheet.service-BcPV3Du4.js} +1 -1
  262. package/dist/{sheet.service-CAB7weBc.js.map → sheet.service-BcPV3Du4.js.map} +1 -1
  263. package/dist/{sheet.service-DPAp7E3x.cjs → sheet.service-Dumvr1HT.cjs} +1 -1
  264. package/dist/{sheet.service-DPAp7E3x.cjs.map → sheet.service-Dumvr1HT.cjs.map} +1 -1
  265. package/dist/slider.cjs +1 -1
  266. package/dist/slider.js +2 -2
  267. package/dist/{src-CbO5kJ2O.js → src-BLngW2bl.js} +42 -42
  268. package/dist/{src-CbO5kJ2O.js.map → src-BLngW2bl.js.map} +1 -1
  269. package/dist/{src-SraDxEeg.cjs → src-BtQVyqMy.cjs} +1 -1
  270. package/dist/{src-SraDxEeg.cjs.map → src-BtQVyqMy.cjs.map} +1 -1
  271. package/dist/steps.cjs +1 -1
  272. package/dist/steps.js +3 -3
  273. package/dist/{surface-DuH0pm2v.cjs → surface-BjKZoJxK.cjs} +1 -1
  274. package/dist/{surface-DuH0pm2v.cjs.map → surface-BjKZoJxK.cjs.map} +1 -1
  275. package/dist/{surface-eN_Jy2MJ.js → surface-pK8hME5c.js} +3 -3
  276. package/dist/{surface-eN_Jy2MJ.js.map → surface-pK8hME5c.js.map} +1 -1
  277. package/dist/surface.cjs +1 -1
  278. package/dist/surface.js +1 -1
  279. package/dist/{surface.mixin-CIXgN6iw.cjs → surface.mixin-C5sDI1-_.cjs} +1 -1
  280. package/dist/{surface.mixin-CIXgN6iw.cjs.map → surface.mixin-C5sDI1-_.cjs.map} +1 -1
  281. package/dist/{surface.mixin-D9jv1sKG.js → surface.mixin-CBNRpJum.js} +1 -1
  282. package/dist/{surface.mixin-D9jv1sKG.js.map → surface.mixin-CBNRpJum.js.map} +1 -1
  283. package/dist/{table-Dg_tUGB_.js → table-BXIHX9h4.js} +2 -2
  284. package/dist/{table-Dg_tUGB_.js.map → table-BXIHX9h4.js.map} +1 -1
  285. package/dist/{table-C9rRQJEB.cjs → table-CiqgZzSd.cjs} +1 -1
  286. package/dist/{table-C9rRQJEB.cjs.map → table-CiqgZzSd.cjs.map} +1 -1
  287. package/dist/table.cjs +1 -1
  288. package/dist/table.js +1 -1
  289. package/dist/{tabs-soTL-x4G.cjs → tabs-CKa-W4qA.cjs} +1 -1
  290. package/dist/{tabs-soTL-x4G.cjs.map → tabs-CKa-W4qA.cjs.map} +1 -1
  291. package/dist/{tabs-BbFC9omR.js → tabs-nbV5eblZ.js} +2 -2
  292. package/dist/{tabs-BbFC9omR.js.map → tabs-nbV5eblZ.js.map} +1 -1
  293. package/dist/tabs.cjs +1 -1
  294. package/dist/tabs.js +1 -1
  295. package/dist/tailwind.mixin-BCJOOX1_.js +225 -0
  296. package/dist/tailwind.mixin-BCJOOX1_.js.map +1 -0
  297. package/dist/tailwind.mixin-BF1Huas7.cjs +2 -0
  298. package/dist/tailwind.mixin-BF1Huas7.cjs.map +1 -0
  299. package/dist/teleport.cjs +1 -1
  300. package/dist/teleport.js +1 -1
  301. package/dist/{textarea-DaRUJ0ri.cjs → textarea-Cp1ZE60O.cjs} +1 -1
  302. package/dist/{textarea-DaRUJ0ri.cjs.map → textarea-Cp1ZE60O.cjs.map} +1 -1
  303. package/dist/{textarea-hChvHbNM.js → textarea-D7q8exMg.js} +1 -1
  304. package/dist/{textarea-hChvHbNM.js.map → textarea-D7q8exMg.js.map} +1 -1
  305. package/dist/textarea.cjs +1 -1
  306. package/dist/textarea.js +1 -1
  307. package/dist/{theme-ZYH2MqX9.cjs → theme-Da4SPq9X.cjs} +1 -1
  308. package/dist/{theme-ZYH2MqX9.cjs.map → theme-Da4SPq9X.cjs.map} +1 -1
  309. package/dist/{theme-B0M8Hlyo.js → theme-_VPV6Bxh.js} +3 -3
  310. package/dist/{theme-B0M8Hlyo.js.map → theme-_VPV6Bxh.js.map} +1 -1
  311. package/dist/{theme-button-BtlX_Zgd.js → theme-button--sX8A-m1.js} +1 -1
  312. package/dist/{theme-button-BtlX_Zgd.js.map → theme-button--sX8A-m1.js.map} +1 -1
  313. package/dist/{theme-button-Dvqg-rE_.cjs → theme-button-Ci8VQ7KW.cjs} +1 -1
  314. package/dist/{theme-button-Dvqg-rE_.cjs.map → theme-button-Ci8VQ7KW.cjs.map} +1 -1
  315. package/dist/theme-button.cjs +1 -1
  316. package/dist/theme-button.js +1 -1
  317. package/dist/theme.cjs +1 -1
  318. package/dist/theme.js +2 -2
  319. package/dist/tooltip.cjs +1 -1
  320. package/dist/tooltip.js +1 -1
  321. package/dist/tree.cjs +1 -1
  322. package/dist/tree.js +1 -1
  323. package/dist/{typewriter-Cf9f2bdx.cjs → typewriter-B2TnHPjw.cjs} +1 -1
  324. package/dist/{typewriter-Cf9f2bdx.cjs.map → typewriter-B2TnHPjw.cjs.map} +1 -1
  325. package/dist/{typewriter-CCel8Nta.js → typewriter-BrZNa8T-.js} +3 -3
  326. package/dist/{typewriter-CCel8Nta.js.map → typewriter-BrZNa8T-.js.map} +1 -1
  327. package/dist/typewriter.cjs +1 -1
  328. package/dist/typewriter.js +1 -1
  329. package/dist/typography.cjs +1 -1
  330. package/dist/typography.js +1 -1
  331. package/dist/{window-CbgdwOZD.js → window-CM1ycigo.js} +2 -2
  332. package/dist/{window-CbgdwOZD.js.map → window-CM1ycigo.js.map} +1 -1
  333. package/dist/{window-B9_14c12.cjs → window-Uii13x_r.cjs} +1 -1
  334. package/dist/{window-B9_14c12.cjs.map → window-Uii13x_r.cjs.map} +1 -1
  335. package/dist/window.cjs +1 -1
  336. package/dist/window.js +1 -1
  337. package/mixins/baseElement.ts +1 -1
  338. package/mixins/discovery.service.ts +1 -1
  339. package/package.json +1 -2
  340. package/src/area/area.service.ts +1 -1
  341. package/src/area/router.types.ts +1 -1
  342. package/src/directives/animate-text.ts +1 -1
  343. package/src/discovery/discovery.service.ts +1 -1
  344. package/src/input/input.ts +1 -1
  345. package/src/mailbox/README.md +7 -10
  346. package/src/mailbox/types.ts +0 -1
  347. package/types/mixins/discovery.service.d.ts +1 -1
  348. package/types/src/discovery/discovery.service.d.ts +1 -1
  349. package/types/src/mailbox/types.d.ts +0 -1
  350. package/dist/area-CC8fUnra.js.map +0 -1
  351. package/dist/area-wnWUAHEn.cjs.map +0 -1
  352. package/dist/tailwind.mixin-BIVhjNvD.js +0 -225
  353. package/dist/tailwind.mixin-BIVhjNvD.js.map +0 -1
  354. package/dist/tailwind.mixin-DSuEu-y3.cjs +0 -2
  355. package/dist/tailwind.mixin-DSuEu-y3.cjs.map +0 -1
  356. package/src/area/readme.md +0 -338
  357. package/src/area/router-guide.md +0 -360
  358. package/src/autocomplete/README.md +0 -485
  359. package/src/content-drawer/readme.md +0 -709
  360. package/src/icons/readme.md +0 -37
  361. package/src/list/readme.md +0 -62
  362. package/src/radio-group/readme.md +0 -315
  363. package/src/select/README.md +0 -405
  364. package/src/tabs/Readme.md +0 -397
  365. package/src/teleport/readme.md +0 -91
  366. package/src/tree/README.md +0 -59
  367. package/src/typewriter/IMPROVEMENTS.md +0 -174
  368. package/src/typewriter/QUICK_REFERENCE.md +0 -166
  369. package/src/typewriter/test-typewriter.html +0 -97
package/ai/store.md CHANGED
@@ -1,192 +1,126 @@
1
- # Store — State Foundation
1
+ # Store — Context System
2
2
 
3
- > **Not a utility. The state backbone of a Schmancy app.**
4
- > `createContext` + `@select` replaces Redux, Zustand, and a route-scoped cache without ceremony.
5
-
6
- A real app runs *many* small contexts — not one monolith. Typical production apps sit around 8–10:
7
-
8
- ```
9
- userContext ('local') — signed-in user (persists across sessions)
10
- organizationContext ('local') — current org
11
- appStateContext ('local') — core app state (lists, selections, flags)
12
- agentsContext ('memory') — fetched data (re-fetched on reload)
13
- contactsContext ('memory') — Map<id, Contact> — mass data
14
- templatesContext ('memory') — list fetched from server
15
- currentTemplateIdCtx ('local') — small pointer ref that persists
16
- composeContext ('local') — draft form state
17
- draftCtx ('session') — per-thread chat input (tab-scoped)
18
- strictCtx ('session') — per-thread toggles (tab-scoped)
19
- ```
20
-
21
- **Split by persistence tier + lifetime**, not by feature area. Per-component ephemeral state → `session`. Cached fetches → `memory`. User-saved preferences → `local`. Large cached data → `indexeddb`.
3
+ Reactive state management: `createContext`, `@select`, `@selectItem`.
22
4
 
23
5
  ## Creating a context
24
6
 
25
7
  ```typescript
26
8
  import { createContext } from '@mhmo91/schmancy'
27
9
 
28
- // Object store — persisted to localStorage
29
- export const userContext = createContext<User>(new User(), 'local', 'user')
30
-
31
- // Collection store — Map keyed by id
32
- export const contactsContext = createContext<Map<string, Contact>>(new Map(), 'memory', 'contacts')
10
+ // Object
11
+ const userContext = createContext<User>(new User(), 'local', 'user')
33
12
 
34
- // Array store — ordered list
35
- export const tagsContext = createContext<string[]>([], 'memory', 'tags')
13
+ // Map (collection)
14
+ const itemsContext = createContext<Map<string, Item>>(new Map(), 'indexeddb', 'items')
36
15
 
37
- // Session-scoped (per browser tab)
38
- export const draftContext = createContext<{ text: string }>({ text: '' }, 'session', 'compose-draft')
16
+ // Array
17
+ const tagsContext = createContext<string[]>([], 'memory', 'tags')
39
18
  ```
40
19
 
41
- ### Storage tiers
20
+ Signature: `createContext(initial, storage, key)`.
42
21
 
43
- | Mode | Backing | Survives refresh? | Survives tab close? | Size |
44
- |------|---------|-------------------|---------------------|------|
45
- | `'memory'` | JS heap | | | small |
22
+ ## Storage backends
23
+
24
+ | Mode | Backing | Survives refresh | Survives tab close | Capacity |
25
+ |------|---------|------------------|--------------------|----------|
26
+ | `'memory'` | JS heap | ❌ | ❌ | RAM |
46
27
  | `'session'` | `sessionStorage` | ✅ | ❌ (per-tab) | ~5 MB |
47
28
  | `'local'` | `localStorage` | ✅ | ✅ | ~5 MB |
48
29
  | `'indexeddb'` | IndexedDB | ✅ | ✅ | GB |
49
30
 
50
- Rule of thumb:
51
- - **User session data, prefs, drafts meant to persist** → `'local'`
52
- - **Per-tab ephemeral data** (wizard progress, per-thread drafts) → `'session'`
53
- - **Fetched from API, regenerable** → `'memory'`
54
- - **Large arrays, file-like data, offline-first** → `'indexeddb'`
31
+ Pick by data size and lifetime:
32
+ - User prefs, long-lived drafts → `'local'`
33
+ - Per-tab ephemeral (cart, wizard) → `'session'`
34
+ - Fetched from API, regenerable → `'memory'`
35
+ - Collections with >100 entries you want cached → `'indexeddb'`
55
36
 
56
37
  ## Reading with `@select`
57
38
 
58
39
  ```typescript
59
40
  import { select } from '@mhmo91/schmancy'
60
41
 
61
- @customElement('user-card')
62
- class UserCard extends $LitElement() {
63
- // Auto-subscribes, re-renders on change
42
+ @customElement('my-component')
43
+ class MyComponent extends $LitElement() {
64
44
  @select(userContext) user!: User
65
45
 
66
- // Selector function narrows the dependency
67
- @select(contactsContext, m => m.size) contactCount!: number
46
+ // Selector narrows the dependency
47
+ @select(itemsContext, m => m.size) count!: number
68
48
 
69
- // Collection stays as Map
70
- @select(contactsContext) contacts!: Map<string, Contact>
49
+ @select(itemsContext) items!: Map<string, Item>
71
50
  }
72
51
  ```
73
52
 
74
53
  `@select` options:
75
- - `required` (default `true`) — wait for context `.ready` before `connectedCallback` completes.
76
- - `updateOnly` — only call `requestUpdate`, don't assign. Use when you read the value imperatively.
77
- - `deepClone` — `structuredClone` the value to prevent accidental mutation.
54
+ - `required` (default `true`) — wait for `.ready` before `connectedCallback` completes.
55
+ - `updateOnly` — call `requestUpdate` without assigning.
56
+ - `deepClone` — `structuredClone` the value.
78
57
  - `debug` — log every emission.
79
58
 
80
- ### Pick one item from a collection
81
- ```typescript
82
- @selectItem(contactsContext, component => component.contactId)
83
- contact!: Contact | undefined
84
- ```
85
-
86
- Use this on components that carry the key as a property (e.g. `this.contactId`) — avoids reading the whole map.
59
+ ## `@selectItem`
87
60
 
88
- ## Writing state
61
+ Pick one entry from a collection context, keyed off a component property:
89
62
 
90
- ### Object store
91
63
  ```typescript
92
- userContext.set({ name: 'Alice', email: 'alice@test.com' })
93
- userContext.set({ ...userContext.value, name: 'Bob' }) // partial update pattern
64
+ @selectItem(itemsContext, component => component.itemId)
65
+ item!: Item | undefined
94
66
  ```
95
67
 
96
- ### Collection (Map) store
97
- ```typescript
98
- contactsContext.set('id-1', { id: 'id-1', name: 'Alice' })
99
- contactsContext.delete('id-1')
100
- contactsContext.replace(new Map([/* fresh batch */]))
101
- ```
68
+ ## Writing
102
69
 
103
- ### Array store
104
70
  ```typescript
105
- tagsContext.push('new-tag')
106
- tagsContext.replace(['a', 'b', 'c'])
71
+ // Object
72
+ userContext.set({ name: 'Alice' })
73
+ userContext.set({ ...userContext.value, name: 'Bob' })
74
+
75
+ // Map
76
+ itemsContext.set('id-1', item)
77
+ itemsContext.delete('id-1')
78
+ itemsContext.replace(newMap)
79
+
80
+ // Array
81
+ tagsContext.push('new')
82
+ tagsContext.replace(['a', 'b'])
107
83
  ```
108
84
 
109
85
  ## Observable API
110
86
 
111
87
  ```typescript
112
- connectedCallback() {
113
- super.connectedCallback()
88
+ userContext.$.pipe(
89
+ filter(() => userContext.ready),
90
+ takeUntil(this.disconnecting),
91
+ ).subscribe(user => { /* ... */ })
114
92
 
115
- userContext.$.pipe(
116
- filter(() => userContext.ready), // gate on initialization
117
- distinctUntilChanged((a, b) => a.id === b.id), // ignore unrelated writes
118
- switchMap(user => this.loadForUser(user)), // cascade load
119
- takeUntil(this.disconnecting), // cleanup
120
- ).subscribe(data => this.data = data)
121
- }
93
+ userContext.value // synchronous snapshot
94
+ userContext.ready // true once the backing store has loaded
122
95
  ```
123
96
 
124
- - **`ctx.$`**a `BehaviorSubject`. Use for chained transforms.
125
- - **`ctx.value`** — synchronous snapshot.
126
- - **`ctx.ready`** — boolean; becomes `true` after the backing store has loaded.
97
+ Gate subscriptions on `.ready` `'local'` / `'session'` / `'indexeddb'` contexts emit their default value before the real stored value hydrates.
127
98
 
128
- ### The gating pattern
129
- Every non-trivial subscription starts with `filter(() => ctx.ready)`. When your context is backed by `indexeddb` or re-hydrated from `localStorage`, the initial default value is emitted before the real stored value lands. Gate on `.ready` to skip the default.
99
+ ## Dynamic contexts
130
100
 
131
- ## Dynamic contexts (per-instance)
132
-
133
- For per-component ephemeral state that still benefits from persistence, instantiate the context **inside** `connectedCallback` with an instance-specific key:
101
+ For per-instance state with persistence, create the context inside `connectedCallback` with an instance-scoped key:
134
102
 
135
103
  ```typescript
136
- import { createContext, IStore } from '@mhmo91/schmancy'
137
-
138
- @customElement('chat-input')
139
- class ChatInput extends $LitElement() {
140
- @property() draftKey?: string
141
-
142
- private draftCtx: IStore<{ text: string }> | null = null
143
-
144
- connectedCallback() {
145
- super.connectedCallback()
146
-
147
- if (this.draftKey) {
148
- this.draftCtx = createContext<{ text: string }>(
149
- { text: '' },
150
- 'session',
151
- this.draftKey, // e.g. `chat-draft-${threadId}`
152
- )
153
-
154
- // Hydrate once
155
- this.draftCtx.$.pipe(
156
- filter(() => this.draftCtx!.ready),
157
- take(1),
158
- tap(v => { this.text = v.text }),
159
- ).subscribe()
160
- }
161
- }
104
+ private draftCtx: IStore<{ text: string }> | null = null
162
105
 
163
- private onInput(v: string) {
164
- this.text = v
165
- this.draftCtx?.set({ text: v })
106
+ connectedCallback() {
107
+ super.connectedCallback()
108
+ if (this.draftKey) {
109
+ this.draftCtx = createContext<{ text: string }>(
110
+ { text: '' },
111
+ 'session',
112
+ this.draftKey,
113
+ )
166
114
  }
167
115
  }
168
116
  ```
169
117
 
170
- This is the pattern for *every* "draft that persists until sent" input.
171
-
172
- ## Architectural rules
173
-
174
- 1. **Declare contexts at module scope**, not inside classes — except dynamic per-instance ones.
175
- 2. **Name the storage key** even for `'memory'` contexts — it helps debugging.
176
- 3. **Keep each context small and single-purpose**. 9 small contexts beat 1 god context.
177
- 4. **Subscribe with `takeUntil(this.disconnecting)`** — every time, no exceptions.
178
- 5. **Gate on `.ready`** before any async cascading work.
179
- 6. **Only the owning component writes**. Everyone else reads via `@select`.
180
- 7. **Don't put functions, observables, or class instances into context** — only plain serializable data (for `'local'` / `'session'` / `'indexeddb'`).
181
-
182
- ## Anti-patterns
183
-
184
- - ❌ Storing Promises in context. Use `memory` contexts for cached fetch *results*, not the in-flight Promise.
185
- - ❌ Cross-writing: component A writes to context X which is "owned" by component B. Centralize writes.
186
- - ❌ One monolithic `appContext` holding everything. You lose `distinctUntilChanged` granularity.
187
- - ❌ Forgetting `.ready` — causes double-fires on load with stale default values.
188
- - ❌ Using `'local'` for large blobs — hits quota, blocks the main thread on stringify/parse.
118
+ ## Rules
189
119
 
190
- ## See also
191
- - [mixins](./mixins.md) `$LitElement` provides `disconnecting` for every subscription.
192
- - [area](./area.md) routing + contexts compose naturally (guards read context state).
120
+ - Declare contexts at module scope (except dynamic per-instance ones).
121
+ - Name the storage key even for `'memory'` contexts it helps debugging.
122
+ - Keep each context single-purpose. One write shouldn't invalidate unrelated readers.
123
+ - Only the owning component writes. Others read via `@select`.
124
+ - Every subscription uses `takeUntil(this.disconnecting)`.
125
+ - Gate on `.ready` before async cascading work.
126
+ - Don't store Promises, Observables, functions, or class instances in persistent contexts.
package/dist/ai/INDEX.md CHANGED
@@ -1,321 +1,72 @@
1
- # Schmancy AI Index
1
+ # Schmancy Documentation Index
2
2
 
3
- > Single-file navigation for AI agents. Foundations first, then components sorted by **what job they do**.
3
+ A Web Component UI library on Lit + RxJS + Tailwind CSS.
4
4
 
5
- Schmancy is not just a component library. It's four concentric layers:
5
+ ## Foundations
6
6
 
7
- ```
8
- ┌─ FOUNDATIONS ──────────────────────────────────────┐
9
- │ Routing · State · Base class · Theme · Directives │
10
- │ (Not components. The framework your app runs on.) │
11
- ├─ ATOMS ────────────────────────────────────────────┤
12
- │ Typography · Icons · Surfaces · Buttons · Scroll │
13
- │ (The vocabulary every screen repeats.) │
14
- ├─ COMPOSITES ───────────────────────────────────────┤
15
- │ Forms · Navigation · Overlays · Feedback · Data │
16
- │ (Job-specific components.) │
17
- └─ UTILITIES ────────────────────────────────────────┘
18
- Discovery · RxJS helpers · Search · Numbers · etc.
19
- ```
7
+ The framework pieces — touch before components.
20
8
 
21
- **Most of a Schmancy app is foundations + atoms + services.** Composites are reached for when a real user-facing job needs them. Start in that order.
9
+ - [Area](./area.md) `<schmancy-area>`, `<schmancy-route>`, `area.push()`, `lazy()` for routing.
10
+ - [Store](./store.md) — `createContext`, `@select`, `@selectItem`, storage backends.
11
+ - [Mixins](./mixins.md) — `$LitElement` base class.
12
+ - [Theme](./theme.md) — `<schmancy-theme>`, color scheme, CSS variables.
13
+ - [Directives](./directives.md) — Lit directives for physics, effects, text, visibility, interaction.
14
+ - [Animation](./animation.md) — Spring presets (`SPRING_SMOOTH`, etc.), `createAnimation`.
22
15
 
23
- ---
16
+ ## Components by job
24
17
 
25
- # Layer 1 — Foundations
18
+ ### Display
19
+ [Typography](./typography.md) · [Icons](./icons.md) · [Avatar](./avatar.md) · [Divider](./divider.md) · [Badge](./badge.md) · [Code Highlight](./code-highlight.md) · [Typewriter](./typewriter.md) · [JSON](./json.md) · [Iframe](./iframe.md) · [Map](./map.md) · [Charts](./charts.md)
26
20
 
27
- These are the load-bearing pieces. Touch them wrong and everything above breaks.
21
+ ### Surfaces & layout
22
+ [Surface](./surface.md) · [Card](./card.md) · [Scroll / Grid / Flex](./layout.md) · [Page](./page.md) · [Content Drawer](./content-drawer.md) · [Window](./window.md) · [Boat](./boat.md) · [Float](./float.md)
28
23
 
29
- ## 1.1 Routing — `area` + `schmancy-area` + `schmancy-route`
30
- **Job:** Control which component occupies a region of the screen, with browser history, guards, params, and lazy loading.
24
+ ### Forms
25
+ [Form](./form.md) · [Input](./input.md) · [Textarea](./textarea.md) · [Select](./select.md) · [Autocomplete](./autocomplete.md) · [Option](./option.md) · [Checkbox](./checkbox.md) · [Radio Group](./radio-group.md) · [Chips](./chips.md) · [Date Range](./date-range.md) · [Date Range Inline](./date-range-inline.md) · [Range](./range.md) · [Extra (Country/Timezone)](./extra.md)
31
26
 
32
- ```typescript
33
- import { area, lazy } from '@mhmo91/schmancy'
34
- ```
27
+ ### Navigation
28
+ [Nav Drawer](./nav-drawer.md) · [Tabs](./tabs.md) · [Navigation Bar](./navigation-bar.md) · [Navigation Rail](./navigation-rail.md) · [Steps](./steps.md) · [Teleport](./teleport.md) · [Theme Button](./theme-button.md)
35
29
 
36
- ```html
37
- <schmancy-area name="root" .default=${lazy(() => import('./home.page'))}>
38
- <schmancy-route when="home-page" .component=${lazy(() => import('./home.page'))} />
39
- <schmancy-route when="dashboard"
40
- .component=${lazy(() => import('./dashboard.page'))}
41
- .guard=${firebaseAuth$.pipe(map(u => !!u), takeUntil(this.disconnecting))}
42
- @redirect=${() => area.push({ area: 'root', component: 'home-page', historyStrategy: 'replace' })}
43
- />
44
- </schmancy-area>
45
- ```
30
+ ### Overlays
31
+ [Dialog](./dialog.md) · [Sheet](./sheet.md) · [Notification](./notification.md) · [Menu](./menu.md) · [Dropdown](./dropdown.md) · [Tooltip](./tooltip.md) · [Lightbox](./lightbox.md) · [Expand](./expand.md)
46
32
 
47
- - **Named areas**: multiple independent regions, 2-level nesting common (`name="root"` + `name="aria"` inside the outer shell).
48
- - **Guards are Observables**: subscribe, emit `boolean`; when `false` a `redirect` event fires.
49
- - **Lazy is mandatory** for route components — `lazy(() => import('...'))` returns a preloadable reference.
50
- - **`when="tag-name"` must exactly match** `@customElement('tag-name')`.
51
- - **Programmatic navigation**: `area.push({ area, component, params?, historyStrategy? })`.
52
- - **Subscribe to route state**: `area.on('root').pipe(takeUntil(this.disconnecting)).subscribe(...)`.
33
+ ### Interactive
34
+ [Button](./button.md) · [List](./list.md) · [Details](./details.md) · [Table](./table.md) · [Tree](./tree.md) · [Slider](./slider.md) · [QR Scanner](./qr-scanner.md)
53
35
 
54
- Full doc: [area.md](./area.md)
36
+ ### Feedback
37
+ [Progress](./progress.md) · [Busy](./busy.md) · [Connectivity](./connectivity.md) · [Delay](./delay.md)
55
38
 
56
- ## 1.2 State — `createContext` + `@select`
57
- **Job:** App-wide reactive state with storage, without Redux boilerplate.
39
+ ### Domain
40
+ [Mailbox](./mailbox.md)
58
41
 
59
- ```typescript
60
- import { createContext, select } from '@mhmo91/schmancy'
42
+ ## Services (imperative APIs)
61
43
 
62
- // Declare once at module scope
63
- export const userContext = createContext<User>(new User(), 'local', 'user')
64
- export const sessionContext = createContext<Session>({}, 'session', 'session')
65
- export const cacheContext = createContext<Map<string, Item>>(new Map(), 'memory', 'cache')
44
+ | Service | Purpose |
45
+ |---------|---------|
46
+ | `area` | Route navigation (see [area](./area.md)) |
47
+ | `$dialog` | Open dialogs (see [dialog](./dialog.md)) |
48
+ | `$notify` | Toast notifications (see [notification](./notification.md)) |
49
+ | `schmancyContentDrawer` | Side panel (see [content-drawer](./content-drawer.md)) |
50
+ | `theme` | Theme state, `fullscreen$` (see [theme](./theme.md)) |
51
+ | `sound` | Audio feedback (see [audio](./audio.md)) |
52
+ | `overlayStack` | Z-index coordinator (see [utils](./utils.md)) |
53
+ | `windowManager` | Window registry (see [window](./window.md)) |
66
54
 
67
- // Consume in a component — auto-subscribes and re-renders
68
- @customElement('my-component')
69
- class MyComponent extends $LitElement() {
70
- @select(userContext) user!: User
55
+ ## Utilities
71
56
 
72
- firstUpdated() {
73
- // Gate on readiness; chain with RxJS; clean up on disconnect
74
- userContext.$.pipe(
75
- filter(() => userContext.ready),
76
- distinctUntilChanged((a, b) => a.id === b.id),
77
- switchMap(u => this.loadForUser(u)),
78
- takeUntil(this.disconnecting),
79
- ).subscribe()
80
- }
81
- }
82
- ```
57
+ [Discovery](./discovery.md) — cross-shadow component lookup.
58
+ [RxJS Utils](./rxjs-utils.md) `waitForElement`, `waitUntil`, `mutationObserver`.
59
+ [Utils](./utils.md) — `similarity`, `numbers`, `overlayStack`, `intersection$`, `hashContent`.
60
+ [Audio](./audio.md) synthesized feedback sounds.
83
61
 
84
- - **Storage modes**: `'memory'` · `'local'` · `'session'` · `'indexeddb'`.
85
- - **Collection-aware**: `Map` and `Array` contexts get `.set(k,v)`, `.delete(k)`, `.push(v)`, `.replace(...)` helpers.
86
- - **`.ready`** is a boolean — gate async work behind `filter(() => ctx.ready)`.
87
- - **`.$`** is a BehaviorSubject — compose with RxJS.
88
- - **`.value`** is the synchronous snapshot.
89
- - **`@selectItem`** for picking one entry from a collection context.
62
+ ## Conventions
90
63
 
91
- **Real architectures use many small contexts** (aria runs 9: user, organization, app state, templates, contacts, agents, compose, draft, strict) — not one monolith.
92
-
93
- Full doc: [store.md](./store.md)
94
-
95
- ## 1.3 Base class `$LitElement`
96
- **Job:** Every Schmancy component extends this. It wires RxJS cleanup, Tailwind, and cross-shadow discovery into every element.
97
-
98
- ```typescript
99
- import { $LitElement } from '@mhmo91/schmancy/mixins'
100
-
101
- @customElement('my-component')
102
- class MyComponent extends $LitElement(css`:host { display: block }`) {
103
- connectedCallback() {
104
- super.connectedCallback()
105
- // The `disconnecting` Subject emits once on disconnect
106
- myObservable$.pipe(takeUntil(this.disconnecting)).subscribe()
107
- }
108
- }
109
- ```
110
-
111
- Provides: `disconnecting` (RxJS Subject) · `classMap()` (space-splitting) · `styleMap()` · `discover<T>(tag)` · Tailwind support · auto-response to discovery events.
112
-
113
- **Rule of thumb:** if you're writing a Lit component inside a Schmancy app, extend `$LitElement`. No exceptions.
114
-
115
- → Full doc: [mixins.md](./mixins.md)
116
-
117
- ## 1.4 Theme — `schmancy-theme` + `theme` service
118
- **Job:** Provide color scheme (dark/light), brand color, and CSS custom properties to everything below it.
119
-
120
- ```html
121
- <schmancy-theme root scheme="dark" color="#6366F1">
122
- <!-- entire app -->
123
- </schmancy-theme>
124
- ```
125
-
126
- - One `root` theme per app, typically wrapping `schmancy-surface type="solid" fill="all"`.
127
- - Nested `<schmancy-theme>` can re-scope color/scheme for a subtree.
128
- - CSS vars auto-generated: `--schmancy-sys-color-{role}-{variant}`.
129
- - `theme.fullscreen$` — observable of viewport fullscreen state.
130
-
131
- → Full doc: [theme.md](./theme.md)
132
-
133
- ## 1.5 Directives — behavior without components
134
- **Job:** Attach physics, effects, visibility, and interactions to *any* element via Lit directive syntax. 19 directives, modular imports.
135
-
136
- ```typescript
137
- import { magnetic, cursorGlow, gravity, reveal, animateText, tooltip, drag, drop } from '@mhmo91/schmancy/directives'
138
- ```
139
-
140
- ```html
141
- <schmancy-card ${cursorGlow()} ${gravity({ stagger: 100 })}>...</schmancy-card>
142
- <div ${reveal(this.expanded, { preset: 'smooth' })}>expandable content</div>
143
- <span ${animateText({ animation: 'blur-reveal' })}>Hello</span>
144
- <button ${tooltip('Save your changes')}>Save</button>
145
- ```
146
-
147
- Categories:
148
- - **Physics**: `magnetic`, `cursorGlow`, `livingBorder`, `gravity`, `depthOfField`, `longPress`
149
- - **Effects**: `nebula`, `liquid`, `ripple`
150
- - **Text**: `animateText`, `cycleText`, `typewriter`
151
- - **Visibility**: `reveal`, `intersect`
152
- - **Interaction**: `drag`, `drop`, `color`, `tooltip`
153
-
154
- → Full doc: [directives.md](./directives.md)
155
-
156
- ---
157
-
158
- # Layer 2 — Atoms
159
-
160
- The display vocabulary. You'll use these on nearly every screen.
161
-
162
- | Job | Tag | Doc |
163
- |-----|-----|-----|
164
- | **Text** | `schmancy-typography` | [typography](./typography.md) |
165
- | **Iconography** | `schmancy-icon`, `schmancy-icon-button` | [icons](./icons.md), [button](./button.md) |
166
- | **Primary actions** | `schmancy-button` | [button](./button.md) |
167
- | **Glass depth container** | `schmancy-surface` | [surface](./surface.md) |
168
- | **Scroll region** | `schmancy-scroll` | [layout](./layout.md) |
169
- | **Visual separation** | `schmancy-divider` | [divider](./divider.md) |
170
- | **Profile image** | `schmancy-avatar` | [avatar](./avatar.md) |
171
-
172
- ---
173
-
174
- # Layer 3 — Composites (sorted by job)
175
-
176
- ## Forms — collect input
177
- | Job | Tag | Doc |
178
- |-----|-----|-----|
179
- | Validation container | `schmancy-form` | [form](./form.md) |
180
- | Single-line text | `schmancy-input` | [input](./input.md) |
181
- | Multi-line text | `schmancy-textarea` | [textarea](./textarea.md) |
182
- | Single-choice dropdown | `schmancy-select` + `schmancy-option` | [select](./select.md), [option](./option.md) |
183
- | Searchable dropdown | `schmancy-autocomplete` | [autocomplete](./autocomplete.md) |
184
- | Boolean | `schmancy-checkbox` | [checkbox](./checkbox.md) |
185
- | One-of-many | `schmancy-radio-group` | [radio-group](./radio-group.md) |
186
- | Multi-select tags / filters | `schmancy-chips` | [chips](./chips.md) |
187
- | Date / date range | `schmancy-date-range`, `schmancy-date-range-inline` | [date-range](./date-range.md), [date-range-inline](./date-range-inline.md) |
188
- | Numeric slider | `schmancy-range` | [range](./range.md) |
189
- | Country / timezone | `schmancy-select-countries`, `schmancy-select-timezones` | [extra](./extra.md) |
190
-
191
- ## Navigation — structural layout
192
- | Job | Tag | Doc |
193
- |-----|-----|-----|
194
- | App shell with side drawer | `schmancy-nav-drawer` (+ navbar, content) | [nav-drawer](./nav-drawer.md) |
195
- | Tabbed sub-views | `schmancy-tabs` | [tabs](./tabs.md) |
196
- | Mobile bottom nav | `schmancy-navigation-bar` | [navigation-bar](./navigation-bar.md) |
197
- | Desktop side rail | `schmancy-navigation-rail` | [navigation-rail](./navigation-rail.md) |
198
- | Multi-step flow | `schmancy-steps` | [steps](./steps.md) |
199
- | Master-detail split | `schmancy-content-drawer` | [content-drawer](./content-drawer.md) |
200
- | Viewport-aware page root | `schmancy-page` | [page](./page.md) |
201
- | Floating draggable panel | `schmancy-window`, `schmancy-boat`, `schmancy-float` | [window](./window.md), [boat](./boat.md), [float](./float.md) |
202
- | FLIP transition between views | `schmancy-teleport` | [teleport](./teleport.md) |
203
-
204
- ## Overlays — temporarily above everything (services preferred)
205
- | Job | API | Fallback tag | Doc |
206
- |-----|-----|--------------|-----|
207
- | Modal / confirm | **`$dialog()` service** | `schmancy-dialog` | [dialog](./dialog.md) |
208
- | Toast / banner | **`$notify()` service** | `schmancy-notification` | [notification](./notification.md) |
209
- | Side/bottom panel | **`schmancyContentDrawer.open()`** | `schmancy-sheet` | [sheet](./sheet.md) |
210
- | Context menu | `schmancy-menu` | — | [menu](./menu.md) |
211
- | Floating panel | `schmancy-dropdown` | — | [dropdown](./dropdown.md) |
212
- | Hover hint | `tooltip` directive | `schmancy-tooltip` | [tooltip](./tooltip.md), [directives](./directives.md) |
213
- | Image gallery | `schmancy-lightbox` | — | [lightbox](./lightbox.md) |
214
- | Accordion | `schmancy-expand` | `schmancy-details` | [expand](./expand.md), [details](./details.md) |
215
-
216
- **Service > component for overlays.** Real apps call `$dialog()` / `$notify()` / `schmancyContentDrawer.open()` hundreds of times — managing overlay lifecycle imperatively keeps templates clean.
217
-
218
- ## Interaction — actionable content
219
- | Job | Tag | Doc |
220
- |-----|-----|-----|
221
- | Clickable container | `schmancy-card` | [card](./card.md) |
222
- | Selectable list | `schmancy-list` + `schmancy-list-item` | [list](./list.md) |
223
- | Expandable row | `schmancy-details` | [details](./details.md) |
224
- | Tabular data | `schmancy-table` | [table](./table.md) |
225
- | Hierarchical data | `schmancy-tree` | [tree](./tree.md) |
226
- | Carousel | `schmancy-slider` + `schmancy-slide` | [slider](./slider.md) |
227
- | Camera QR scan | `schmancy-qr-scanner` | [qr-scanner](./qr-scanner.md) |
228
-
229
- ## Feedback — status / progress
230
- | Job | Tag | Doc |
231
- |-----|-----|-----|
232
- | Linear progress | `schmancy-progress` | [progress](./progress.md) |
233
- | Spinner / skeleton overlay | `schmancy-busy` | [busy](./busy.md) |
234
- | Status indicator | `schmancy-badge` | [badge](./badge.md) |
235
- | Online/offline banner | `schmancy-connectivity-status` | [connectivity](./connectivity.md) |
236
- | Deferred render with stagger | `schmancy-delay` | [delay](./delay.md) |
237
-
238
- ## Rich display — specialized rendering
239
- | Job | Tag | Doc |
240
- |-----|-----|-----|
241
- | Syntax-highlighted code | `schmancy-code-highlight` | [code-highlight](./code-highlight.md) |
242
- | Typewriter reveal | `schmancy-typewriter` | [typewriter](./typewriter.md) |
243
- | JSON viewer (debug) | `schmancy-json` | [json](./json.md) |
244
- | Sandboxed iframe | `schmancy-iframe` | [iframe](./iframe.md) |
245
- | Google Maps | `schmancy-map` | [map](./map.md) |
246
- | Area chart | `schmancy-area-chart` | [charts](./charts.md) |
247
- | Horizontal pills chart | `schmancy-pills` | [charts](./charts.md) |
248
- | Theme toggle button | `schmancy-theme-button` | [theme-button](./theme-button.md) |
249
-
250
- ## Domain — specific to a workflow
251
- | Job | Tag | Doc |
252
- |-----|-----|-----|
253
- | Email composition | `schmancy-mailbox` (+ 5 sub-tags) | [mailbox](./mailbox.md) |
254
-
255
- ## Layout primitives (prefer Tailwind for new code)
256
- | Job | Tag | Doc |
257
- |-----|-----|-----|
258
- | Grid / flex / scroll | `schmancy-grid`, `schmancy-flex`, `schmancy-scroll`, `sch-grid`, `sch-flex` | [layout](./layout.md) |
259
-
260
- ---
261
-
262
- # Layer 4 — Utilities (non-component)
263
-
264
- | Module | Purpose | Doc |
265
- |--------|---------|-----|
266
- | Audio | Synthesized emotional sounds (`sound.play('joyful')`) | [audio](./audio.md) |
267
- | Discovery | Cross-shadow-DOM component lookup | [discovery](./discovery.md) |
268
- | RxJS utils | `waitForElement`, `waitUntil`, `mutationObserver` | [rxjs-utils](./rxjs-utils.md) |
269
- | Utils | `similarity`, `numbers`, `overlayStack`, `intersection$`, `hashContent` | [utils](./utils.md) |
270
- | Animation | Spring presets, `createAnimation`, Tailwind integration | [animation](./animation.md) |
271
-
272
- ---
273
-
274
- # The 80/20 cheat sheet
275
-
276
- If you're new to Schmancy and shipping a screen today, reach for these in this order:
277
-
278
- 1. **Wrap the app** in `<schmancy-theme root>` + `<schmancy-surface type="solid" fill="all">` + `<schmancy-scroll>`.
279
- 2. **Route** with `<schmancy-area name="root">` + `<schmancy-route>` + `lazy()`.
280
- 3. **Store** state in `createContext(..., 'local')` + `@select` in components.
281
- 4. **Extend** `$LitElement` in every component. Use `takeUntil(this.disconnecting)` for every subscription.
282
- 5. **Compose screens** from atoms: `schmancy-typography`, `schmancy-icon`, `schmancy-button`, `schmancy-surface`, `schmancy-divider`.
283
- 6. **Forms**: `schmancy-input` + `schmancy-chips` + `schmancy-checkbox` + `schmancy-form`. Reach for `schmancy-select` / `schmancy-autocomplete` only when needed.
284
- 7. **Overlays**: `$dialog()` + `$notify()` + `schmancyContentDrawer.open()` — service APIs, not template tags.
285
- 8. **Effects**: reach for `cursorGlow`, `magnetic`, `reveal`, `animateText` directives before writing CSS animations.
286
-
287
- Everything else is demand-driven.
288
-
289
- ---
290
-
291
- # Conventions (enforce these)
292
-
293
- - **Lists use `repeat(items, item => item.id, tpl)`** — never `.map()` in templates.
294
- - **View switching uses `cache(...)`** — preserves DOM and state.
295
- - **Expensive work uses `guard([deps], fn)`** — memoizes against identity changes.
296
- - **DOM access uses `ref(createRef())`** — never `querySelector` for own shadow tree if a ref will do.
297
- - **Conditionals use `when(...)` / `choose(...)` / `ifDefined(...)`** — cleaner than ternaries.
298
- - **All subscriptions use `.pipe(takeUntil(this.disconnecting))`** — no manual unsubscribe.
299
- - **No `setTimeout` / `setInterval` / `addEventListener`** — use RxJS (`timer`, `interval`, `fromEvent`).
300
- - **No hardcoded colors** — use `--schmancy-sys-color-*` CSS vars or Tailwind theme classes.
301
- - **No mixing `classMap` with string interpolation** — it must be the sole expression in `class=`.
302
- - **ARIA wiring on combobox forms**: `role="combobox"` + `aria-haspopup="listbox"` + `aria-expanded` + `aria-controls` + a `#live-status` live region.
303
- - **Overlay z-index**: always go through `overlayStack` (dialogs/sheets/windows already do).
304
-
305
- ---
306
-
307
- # Services reference (import these by name)
308
-
309
- | Service | From | Purpose |
310
- |---------|------|---------|
311
- | `area` | `@mhmo91/schmancy` | Router imperative API |
312
- | `$dialog` | `@mhmo91/schmancy` | Modal/confirm dialogs |
313
- | `$notify` | `@mhmo91/schmancy` | Toast notifications |
314
- | `schmancyContentDrawer` | `@mhmo91/schmancy` | Side panel |
315
- | `theme` | `@mhmo91/schmancy` | Theme state + fullscreen$ |
316
- | `sound` | `@mhmo91/schmancy` | Emotional sounds |
317
- | `overlayStack` | `@mhmo91/schmancy` | Z-index coordinator |
318
- | `windowManager` | `@mhmo91/schmancy/window` | Window registry |
319
- | `teleportationService` | `@mhmo91/schmancy/teleport` | Teleport coordination |
320
- | `reducedMotion$` | `@mhmo91/schmancy/directives` | Reactive reduced-motion preference |
321
- | `fromResizeObserver` | `@mhmo91/schmancy/directives` | RxJS ResizeObserver |
64
+ - Lists use `repeat(items, item => item.id, tpl)`.
65
+ - View switching uses `cache(...)`.
66
+ - Expensive work uses `guard([deps], fn)`.
67
+ - DOM access uses `ref(createRef())`.
68
+ - Conditionals use `when(...)`, `choose(...)`, `ifDefined(...)`.
69
+ - All RxJS subscriptions end with `.pipe(takeUntil(this.disconnecting))`.
70
+ - Don't use `setTimeout` / `setInterval` / `addEventListener` — use RxJS (`timer`, `interval`, `fromEvent`).
71
+ - Colors come from `--schmancy-sys-color-*` CSS vars or Tailwind theme classes.
72
+ - `classMap(...)` must be the sole expression in `class=`; never mix with string interpolation.