@mhmo91/schmancy 0.9.2 → 0.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (386) hide show
  1. package/README.md +19 -75
  2. package/ai/INDEX.md +321 -0
  3. package/ai/area.md +194 -40
  4. package/ai/audio.md +69 -0
  5. package/ai/boat.md +47 -0
  6. package/ai/charts.md +93 -0
  7. package/ai/connectivity.md +36 -0
  8. package/ai/date-range-inline.md +44 -0
  9. package/ai/delay.md +50 -0
  10. package/ai/discovery.md +67 -0
  11. package/ai/expand.md +63 -0
  12. package/ai/extra.md +59 -0
  13. package/ai/float.md +14 -0
  14. package/ai/iframe.md +44 -0
  15. package/ai/json.md +33 -0
  16. package/ai/layout.md +63 -0
  17. package/ai/mailbox.md +102 -0
  18. package/ai/map.md +55 -0
  19. package/ai/mixins.md +169 -38
  20. package/ai/option.md +43 -0
  21. package/ai/page.md +42 -0
  22. package/ai/qr-scanner.md +51 -0
  23. package/ai/range.md +47 -0
  24. package/ai/rxjs-utils.md +60 -0
  25. package/ai/slider.md +43 -0
  26. package/ai/store.md +158 -49
  27. package/ai/teleport.md +55 -0
  28. package/ai/theme-button.md +26 -0
  29. package/ai/typewriter.md +46 -0
  30. package/ai/utils.md +95 -0
  31. package/ai/window.md +67 -0
  32. package/dist/ai/INDEX.md +321 -0
  33. package/dist/ai/area.md +194 -40
  34. package/dist/ai/audio.md +69 -0
  35. package/dist/ai/boat.md +47 -0
  36. package/dist/ai/charts.md +93 -0
  37. package/dist/ai/connectivity.md +36 -0
  38. package/dist/ai/date-range-inline.md +44 -0
  39. package/dist/ai/delay.md +50 -0
  40. package/dist/ai/discovery.md +67 -0
  41. package/dist/ai/expand.md +63 -0
  42. package/dist/ai/extra.md +59 -0
  43. package/dist/ai/float.md +14 -0
  44. package/dist/ai/iframe.md +44 -0
  45. package/dist/ai/json.md +33 -0
  46. package/dist/ai/layout.md +63 -0
  47. package/dist/ai/mailbox.md +102 -0
  48. package/dist/ai/map.md +55 -0
  49. package/dist/ai/mixins.md +169 -38
  50. package/dist/ai/option.md +43 -0
  51. package/dist/ai/page.md +42 -0
  52. package/dist/ai/qr-scanner.md +51 -0
  53. package/dist/ai/range.md +47 -0
  54. package/dist/ai/rxjs-utils.md +60 -0
  55. package/dist/ai/slider.md +43 -0
  56. package/dist/ai/store.md +158 -49
  57. package/dist/ai/teleport.md +55 -0
  58. package/dist/ai/theme-button.md +26 -0
  59. package/dist/ai/typewriter.md +46 -0
  60. package/dist/ai/utils.md +95 -0
  61. package/dist/ai/window.md +67 -0
  62. package/dist/{area-DbBcfm5p.js → area-CC8fUnra.js} +2 -2
  63. package/dist/{area-DbBcfm5p.js.map → area-CC8fUnra.js.map} +1 -1
  64. package/dist/{area-1h9xEpTc.cjs → area-wnWUAHEn.cjs} +1 -1
  65. package/dist/{area-1h9xEpTc.cjs.map → area-wnWUAHEn.cjs.map} +1 -1
  66. package/dist/area.cjs +1 -1
  67. package/dist/area.js +1 -1
  68. package/dist/{autocomplete-OE70CcYP.cjs → autocomplete-B2Z3WK_7.cjs} +1 -1
  69. package/dist/{autocomplete-OE70CcYP.cjs.map → autocomplete-B2Z3WK_7.cjs.map} +1 -1
  70. package/dist/{autocomplete-DDVsegep.js → autocomplete-CJ7YgtKN.js} +3 -3
  71. package/dist/{autocomplete-DDVsegep.js.map → autocomplete-CJ7YgtKN.js.map} +1 -1
  72. package/dist/autocomplete.cjs +1 -1
  73. package/dist/autocomplete.js +1 -1
  74. package/dist/badge.cjs +1 -1
  75. package/dist/badge.js +1 -1
  76. package/dist/{boat-Cf1oJ0ka.cjs → boat-B57_4TzJ.cjs} +1 -1
  77. package/dist/{boat-Cf1oJ0ka.cjs.map → boat-B57_4TzJ.cjs.map} +1 -1
  78. package/dist/{boat-T8Ov4-yA.js → boat-C9eU6NO-.js} +2 -2
  79. package/dist/{boat-T8Ov4-yA.js.map → boat-C9eU6NO-.js.map} +1 -1
  80. package/dist/boat.cjs +1 -1
  81. package/dist/boat.js +1 -1
  82. package/dist/{busy-DF9wztWL.cjs → busy--6oimtop.cjs} +1 -1
  83. package/dist/{busy-DF9wztWL.cjs.map → busy--6oimtop.cjs.map} +1 -1
  84. package/dist/{busy-BD6D5P-l.js → busy-CGZXy0h-.js} +1 -1
  85. package/dist/{busy-BD6D5P-l.js.map → busy-CGZXy0h-.js.map} +1 -1
  86. package/dist/busy.cjs +1 -1
  87. package/dist/busy.js +1 -1
  88. package/dist/button.cjs +1 -1
  89. package/dist/button.js +2 -2
  90. package/dist/{card-Csvu8UJ9.cjs → card-BGJ0Hb1O.cjs} +1 -1
  91. package/dist/{card-Csvu8UJ9.cjs.map → card-BGJ0Hb1O.cjs.map} +1 -1
  92. package/dist/{card-DM_miKMd.js → card-C-ee-l5O.js} +1 -1
  93. package/dist/{card-DM_miKMd.js.map → card-C-ee-l5O.js.map} +1 -1
  94. package/dist/card.cjs +1 -1
  95. package/dist/card.js +1 -1
  96. package/dist/charts.cjs +1 -1
  97. package/dist/charts.js +2 -2
  98. package/dist/{checkbox-sJujc_ga.cjs → checkbox-DuYaKoDZ.cjs} +1 -1
  99. package/dist/{checkbox-sJujc_ga.cjs.map → checkbox-DuYaKoDZ.cjs.map} +1 -1
  100. package/dist/{checkbox-BgGtMaMR.js → checkbox-FRcorDrD.js} +1 -1
  101. package/dist/{checkbox-BgGtMaMR.js.map → checkbox-FRcorDrD.js.map} +1 -1
  102. package/dist/checkbox.cjs +1 -1
  103. package/dist/checkbox.js +1 -1
  104. package/dist/{chips-D_e6wijp.cjs → chips-BpA0A-qr.cjs} +1 -1
  105. package/dist/{chips-D_e6wijp.cjs.map → chips-BpA0A-qr.cjs.map} +1 -1
  106. package/dist/{chips-BZaH4wez.js → chips-CyzNbKJD.js} +3 -3
  107. package/dist/{chips-BZaH4wez.js.map → chips-CyzNbKJD.js.map} +1 -1
  108. package/dist/chips.cjs +1 -1
  109. package/dist/chips.js +2 -2
  110. package/dist/{code-highlight-Q3cc6ukq.js → code-highlight-C7O9ltXm.js} +1 -1
  111. package/dist/{code-highlight-Q3cc6ukq.js.map → code-highlight-C7O9ltXm.js.map} +1 -1
  112. package/dist/{code-highlight-DlhERv_O.cjs → code-highlight-DsBdSQBG.cjs} +1 -1
  113. package/dist/{code-highlight-DlhERv_O.cjs.map → code-highlight-DsBdSQBG.cjs.map} +1 -1
  114. package/dist/code-highlight.cjs +1 -1
  115. package/dist/code-highlight.js +1 -1
  116. package/dist/{components-CRhkB3V2.js → components-CkMvOiTR.js} +2 -2
  117. package/dist/{components-CRhkB3V2.js.map → components-CkMvOiTR.js.map} +1 -1
  118. package/dist/{components-DnlEYYDs.cjs → components-dDI3xeIf.cjs} +1 -1
  119. package/dist/{components-DnlEYYDs.cjs.map → components-dDI3xeIf.cjs.map} +1 -1
  120. package/dist/components.cjs +1 -1
  121. package/dist/components.js +1 -1
  122. package/dist/connectivity.cjs +1 -1
  123. package/dist/connectivity.js +1 -1
  124. package/dist/content-drawer.cjs +1 -1
  125. package/dist/content-drawer.js +1 -1
  126. package/dist/{date-range-cymbTDnl.cjs → date-range-70zhLUKE.cjs} +1 -1
  127. package/dist/{date-range-cymbTDnl.cjs.map → date-range-70zhLUKE.cjs.map} +1 -1
  128. package/dist/{date-range-C0IYnvHF.js → date-range-BrN_Bs6_.js} +3 -3
  129. package/dist/{date-range-C0IYnvHF.js.map → date-range-BrN_Bs6_.js.map} +1 -1
  130. package/dist/{date-range-inline-Cfwt-ReH.cjs → date-range-inline-CPzD-tIv.cjs} +1 -1
  131. package/dist/{date-range-inline-Cfwt-ReH.cjs.map → date-range-inline-CPzD-tIv.cjs.map} +1 -1
  132. package/dist/{date-range-inline-0ENN4Plz.js → date-range-inline-Cp294DxR.js} +1 -1
  133. package/dist/{date-range-inline-0ENN4Plz.js.map → date-range-inline-Cp294DxR.js.map} +1 -1
  134. package/dist/date-range-inline.cjs +1 -1
  135. package/dist/date-range-inline.js +1 -1
  136. package/dist/date-range.cjs +1 -1
  137. package/dist/date-range.js +1 -1
  138. package/dist/{delay-D6mQLUp-.cjs → delay-COcAkBqB.cjs} +1 -1
  139. package/dist/{delay-D6mQLUp-.cjs.map → delay-COcAkBqB.cjs.map} +1 -1
  140. package/dist/{delay-D1dVP93u.js → delay-IV0Swce2.js} +3 -3
  141. package/dist/{delay-D1dVP93u.js.map → delay-IV0Swce2.js.map} +1 -1
  142. package/dist/delay.cjs +1 -1
  143. package/dist/delay.js +1 -1
  144. package/dist/{details-Cv4OOrVW.js → details-CuKmr3Qw.js} +2 -2
  145. package/dist/{details-Cv4OOrVW.js.map → details-CuKmr3Qw.js.map} +1 -1
  146. package/dist/{details-CPT_Mi4e.cjs → details-DgWkPqmt.cjs} +1 -1
  147. package/dist/{details-CPT_Mi4e.cjs.map → details-DgWkPqmt.cjs.map} +1 -1
  148. package/dist/details.cjs +1 -1
  149. package/dist/details.js +1 -1
  150. package/dist/dialog.cjs +1 -1
  151. package/dist/dialog.js +2 -2
  152. package/dist/{divider-DDC-kND3.js → divider-BWoUbfgZ.js} +2 -2
  153. package/dist/{divider-DDC-kND3.js.map → divider-BWoUbfgZ.js.map} +1 -1
  154. package/dist/{divider-nZ_2to2N.cjs → divider-BghtrMbn.cjs} +1 -1
  155. package/dist/{divider-nZ_2to2N.cjs.map → divider-BghtrMbn.cjs.map} +1 -1
  156. package/dist/divider.cjs +1 -1
  157. package/dist/divider.js +1 -1
  158. package/dist/dropdown.cjs +1 -1
  159. package/dist/dropdown.js +2 -2
  160. package/dist/{expand-Bp3N8CcL.js → expand-CJU9m4ga.js} +3 -3
  161. package/dist/{expand-Bp3N8CcL.js.map → expand-CJU9m4ga.js.map} +1 -1
  162. package/dist/{expand-Crdts9q_.cjs → expand-XyDE5SsO.cjs} +1 -1
  163. package/dist/{expand-Crdts9q_.cjs.map → expand-XyDE5SsO.cjs.map} +1 -1
  164. package/dist/expand.cjs +1 -1
  165. package/dist/expand.js +1 -1
  166. package/dist/{extra-DupwhQhC.js → extra-BxXFmW1w.js} +2 -2
  167. package/dist/{extra-DupwhQhC.js.map → extra-BxXFmW1w.js.map} +1 -1
  168. package/dist/{extra-B0IZCg0t.cjs → extra-CsrRKKqE.cjs} +1 -1
  169. package/dist/{extra-B0IZCg0t.cjs.map → extra-CsrRKKqE.cjs.map} +1 -1
  170. package/dist/extra.cjs +1 -1
  171. package/dist/extra.js +1 -1
  172. package/dist/{float-Dqdc1_S5.js → float-BD86t_NU.js} +2 -2
  173. package/dist/{float-Dqdc1_S5.js.map → float-BD86t_NU.js.map} +1 -1
  174. package/dist/{float-CQoJ_oSB.cjs → float-DBv1FINW.cjs} +1 -1
  175. package/dist/{float-CQoJ_oSB.cjs.map → float-DBv1FINW.cjs.map} +1 -1
  176. package/dist/float.cjs +1 -1
  177. package/dist/float.js +1 -1
  178. package/dist/{form-CW5XNuTg.js → form-Cp5-I_ZV.js} +1 -1
  179. package/dist/{form-CW5XNuTg.js.map → form-Cp5-I_ZV.js.map} +1 -1
  180. package/dist/{form-CvoLqMY7.cjs → form-D0bIeDWT.cjs} +1 -1
  181. package/dist/{form-CvoLqMY7.cjs.map → form-D0bIeDWT.cjs.map} +1 -1
  182. package/dist/form.cjs +1 -1
  183. package/dist/form.js +1 -1
  184. package/dist/{icons-Cpfdb7sA.js → icons-BpU0_l92.js} +1 -1
  185. package/dist/{icons-Cpfdb7sA.js.map → icons-BpU0_l92.js.map} +1 -1
  186. package/dist/{icons-BLQHEbIk.cjs → icons-D8w_20mO.cjs} +1 -1
  187. package/dist/{icons-BLQHEbIk.cjs.map → icons-D8w_20mO.cjs.map} +1 -1
  188. package/dist/icons.cjs +1 -1
  189. package/dist/icons.js +1 -1
  190. package/dist/{iframe-sJGXBbxT.cjs → iframe-BjwxA2Pg.cjs} +1 -1
  191. package/dist/{iframe-sJGXBbxT.cjs.map → iframe-BjwxA2Pg.cjs.map} +1 -1
  192. package/dist/{iframe-DG6HVYdy.js → iframe-tY1GY5g1.js} +1 -1
  193. package/dist/{iframe-DG6HVYdy.js.map → iframe-tY1GY5g1.js.map} +1 -1
  194. package/dist/iframe.cjs +1 -1
  195. package/dist/iframe.js +1 -1
  196. package/dist/index.cjs +1 -1
  197. package/dist/index.js +33 -33
  198. package/dist/{input-BevxycIt.js → input-BnfTpRN9.js} +1 -1
  199. package/dist/{input-BevxycIt.js.map → input-BnfTpRN9.js.map} +1 -1
  200. package/dist/{input-DGTdmp1Q.cjs → input-BwxwognS.cjs} +1 -1
  201. package/dist/{input-DGTdmp1Q.cjs.map → input-BwxwognS.cjs.map} +1 -1
  202. package/dist/{input-chip-BWS-SFU4.js → input-chip-CkM2aYmO.js} +1 -1
  203. package/dist/{input-chip-BWS-SFU4.js.map → input-chip-CkM2aYmO.js.map} +1 -1
  204. package/dist/{input-chip-CKVtjInb.cjs → input-chip-MjOwX5EY.cjs} +1 -1
  205. package/dist/{input-chip-CKVtjInb.cjs.map → input-chip-MjOwX5EY.cjs.map} +1 -1
  206. package/dist/input.cjs +1 -1
  207. package/dist/input.js +1 -1
  208. package/dist/json.cjs +1 -1
  209. package/dist/json.js +2 -2
  210. package/dist/{layout-CQdd8UCr.cjs → layout-BV0EeyUS.cjs} +1 -1
  211. package/dist/{layout-CQdd8UCr.cjs.map → layout-BV0EeyUS.cjs.map} +1 -1
  212. package/dist/{layout-DxLjlDfr.js → layout-CJSlZlFL.js} +2 -2
  213. package/dist/{layout-DxLjlDfr.js.map → layout-CJSlZlFL.js.map} +1 -1
  214. package/dist/layout.cjs +1 -1
  215. package/dist/layout.js +2 -2
  216. package/dist/{lightbox-C_863_XU.cjs → lightbox-CpNMZHZW.cjs} +1 -1
  217. package/dist/{lightbox-C_863_XU.cjs.map → lightbox-CpNMZHZW.cjs.map} +1 -1
  218. package/dist/{lightbox-Bjc55lHH.js → lightbox-groqGmJH.js} +2 -2
  219. package/dist/{lightbox-Bjc55lHH.js.map → lightbox-groqGmJH.js.map} +1 -1
  220. package/dist/lightbox.cjs +1 -1
  221. package/dist/lightbox.js +1 -1
  222. package/dist/{list-CaXzdN9_.cjs → list-CyHd0Zc2.cjs} +1 -1
  223. package/dist/{list-CaXzdN9_.cjs.map → list-CyHd0Zc2.cjs.map} +1 -1
  224. package/dist/{list-BAqhlzZd.js → list-DzkqT_r-.js} +2 -2
  225. package/dist/{list-BAqhlzZd.js.map → list-DzkqT_r-.js.map} +1 -1
  226. package/dist/list.cjs +1 -1
  227. package/dist/list.js +1 -1
  228. package/dist/{litElement.mixin-DN6X9_wD.cjs → litElement.mixin-BG6_-nYX.cjs} +1 -1
  229. package/dist/{litElement.mixin-DN6X9_wD.cjs.map → litElement.mixin-BG6_-nYX.cjs.map} +1 -1
  230. package/dist/{litElement.mixin-Dktub0ri.js → litElement.mixin-Dm-4L8zL.js} +1 -1
  231. package/dist/{litElement.mixin-Dktub0ri.js.map → litElement.mixin-Dm-4L8zL.js.map} +1 -1
  232. package/dist/{mailbox-DuMUH4f3.js → mailbox-BcqnXYVP.js} +4 -4
  233. package/dist/{mailbox-DuMUH4f3.js.map → mailbox-BcqnXYVP.js.map} +1 -1
  234. package/dist/{mailbox-BvsLXpvy.cjs → mailbox-C5eYTd7p.cjs} +1 -1
  235. package/dist/{mailbox-BvsLXpvy.cjs.map → mailbox-C5eYTd7p.cjs.map} +1 -1
  236. package/dist/mailbox.cjs +1 -1
  237. package/dist/mailbox.js +1 -1
  238. package/dist/{map-C2Msv9TQ.cjs → map-BncheFt5.cjs} +1 -1
  239. package/dist/{map-C2Msv9TQ.cjs.map → map-BncheFt5.cjs.map} +1 -1
  240. package/dist/{map-DkIy1ph7.js → map-C0o1PgLE.js} +1 -1
  241. package/dist/{map-DkIy1ph7.js.map → map-C0o1PgLE.js.map} +1 -1
  242. package/dist/map.cjs +1 -1
  243. package/dist/map.js +1 -1
  244. package/dist/{menu-DEeDKW5U.js → menu-uwqlQbLd.js} +2 -2
  245. package/dist/{menu-DEeDKW5U.js.map → menu-uwqlQbLd.js.map} +1 -1
  246. package/dist/{menu-Mm71lv9k.cjs → menu-yXzwJZFf.cjs} +1 -1
  247. package/dist/{menu-Mm71lv9k.cjs.map → menu-yXzwJZFf.cjs.map} +1 -1
  248. package/dist/menu.cjs +1 -1
  249. package/dist/menu.js +1 -1
  250. package/dist/mixins.cjs +1 -1
  251. package/dist/mixins.js +3 -3
  252. package/dist/nav-drawer.cjs +1 -1
  253. package/dist/nav-drawer.js +1 -1
  254. package/dist/navigation-bar.cjs +1 -1
  255. package/dist/navigation-bar.js +1 -1
  256. package/dist/navigation-rail.cjs +1 -1
  257. package/dist/navigation-rail.js +2 -2
  258. package/dist/{notification-cTgXEDZ0.cjs → notification-BjwTfLAl.cjs} +1 -1
  259. package/dist/{notification-cTgXEDZ0.cjs.map → notification-BjwTfLAl.cjs.map} +1 -1
  260. package/dist/{notification-K-ug8cKk.js → notification-DzYT4deA.js} +3 -3
  261. package/dist/{notification-K-ug8cKk.js.map → notification-DzYT4deA.js.map} +1 -1
  262. package/dist/notification.cjs +1 -1
  263. package/dist/notification.js +1 -1
  264. package/dist/{option-5rEOmtAm.cjs → option-BJsD3u2D.cjs} +1 -1
  265. package/dist/{option-5rEOmtAm.cjs.map → option-BJsD3u2D.cjs.map} +1 -1
  266. package/dist/{option-TFSKvSjT.js → option-JFHxgiYl.js} +1 -1
  267. package/dist/{option-TFSKvSjT.js.map → option-JFHxgiYl.js.map} +1 -1
  268. package/dist/option.cjs +1 -1
  269. package/dist/option.js +1 -1
  270. package/dist/page.cjs +1 -1
  271. package/dist/page.js +3 -3
  272. package/dist/{progress-Cta3nM-f.js → progress-BUh5WBqx.js} +2 -2
  273. package/dist/{progress-Cta3nM-f.js.map → progress-BUh5WBqx.js.map} +1 -1
  274. package/dist/{progress-iu0AMbSg.cjs → progress-BoRmyGAa.cjs} +1 -1
  275. package/dist/{progress-iu0AMbSg.cjs.map → progress-BoRmyGAa.cjs.map} +1 -1
  276. package/dist/progress.cjs +1 -1
  277. package/dist/progress.js +1 -1
  278. package/dist/{provide-D69zybs5.js → provide-8MrDz_qX.js} +1 -1
  279. package/dist/{provide-D69zybs5.js.map → provide-8MrDz_qX.js.map} +1 -1
  280. package/dist/{provide-BEyyKlDM.cjs → provide-CDkxgjHb.cjs} +1 -1
  281. package/dist/{provide-BEyyKlDM.cjs.map → provide-CDkxgjHb.cjs.map} +1 -1
  282. package/dist/qr-scanner.cjs +1 -1
  283. package/dist/qr-scanner.js +2 -2
  284. package/dist/{radio-group-BjSWmYJC.js → radio-group-DbOWUPhi.js} +1 -1
  285. package/dist/{radio-group-BjSWmYJC.js.map → radio-group-DbOWUPhi.js.map} +1 -1
  286. package/dist/{radio-group-DKPN0T50.cjs → radio-group-rhrvhB5X.cjs} +1 -1
  287. package/dist/{radio-group-DKPN0T50.cjs.map → radio-group-rhrvhB5X.cjs.map} +1 -1
  288. package/dist/radio-group.cjs +1 -1
  289. package/dist/radio-group.js +1 -1
  290. package/dist/range.cjs +1 -1
  291. package/dist/range.js +1 -1
  292. package/dist/{scroll-mayaGGpE.cjs → scroll-BE9W9PF2.cjs} +1 -1
  293. package/dist/{scroll-mayaGGpE.cjs.map → scroll-BE9W9PF2.cjs.map} +1 -1
  294. package/dist/{scroll-tG1vaRFO.js → scroll-qGks1R0k.js} +1 -1
  295. package/dist/{scroll-tG1vaRFO.js.map → scroll-qGks1R0k.js.map} +1 -1
  296. package/dist/{select-CepryGGP.js → select-D9sgBRjU.js} +2 -2
  297. package/dist/{select-CepryGGP.js.map → select-D9sgBRjU.js.map} +1 -1
  298. package/dist/{select-C4YK5Arj.cjs → select-DXU2kzg4.cjs} +1 -1
  299. package/dist/{select-C4YK5Arj.cjs.map → select-DXU2kzg4.cjs.map} +1 -1
  300. package/dist/select.cjs +1 -1
  301. package/dist/select.js +1 -1
  302. package/dist/{sheet-D2uT95S1.js → sheet-CIxCCJ3H.js} +4 -4
  303. package/dist/{sheet-D2uT95S1.js.map → sheet-CIxCCJ3H.js.map} +1 -1
  304. package/dist/{sheet-Cy4C2-kG.cjs → sheet-CeX6BbNp.cjs} +1 -1
  305. package/dist/{sheet-Cy4C2-kG.cjs.map → sheet-CeX6BbNp.cjs.map} +1 -1
  306. package/dist/sheet.cjs +1 -1
  307. package/dist/sheet.js +2 -2
  308. package/dist/{sheet.service-Os8KJGSE.js → sheet.service-CAB7weBc.js} +1 -1
  309. package/dist/{sheet.service-Os8KJGSE.js.map → sheet.service-CAB7weBc.js.map} +1 -1
  310. package/dist/{sheet.service-Dv5Hwj3k.cjs → sheet.service-DPAp7E3x.cjs} +1 -1
  311. package/dist/{sheet.service-Dv5Hwj3k.cjs.map → sheet.service-DPAp7E3x.cjs.map} +1 -1
  312. package/dist/slider.cjs +1 -1
  313. package/dist/slider.js +2 -2
  314. package/dist/{src-BLcmKlCH.js → src-CbO5kJ2O.js} +42 -42
  315. package/dist/{src-BLcmKlCH.js.map → src-CbO5kJ2O.js.map} +1 -1
  316. package/dist/{src-tfU0akqI.cjs → src-SraDxEeg.cjs} +1 -1
  317. package/dist/{src-tfU0akqI.cjs.map → src-SraDxEeg.cjs.map} +1 -1
  318. package/dist/steps.cjs +1 -1
  319. package/dist/steps.js +3 -3
  320. package/dist/{surface-CiiIYeJN.cjs → surface-DuH0pm2v.cjs} +1 -1
  321. package/dist/{surface-CiiIYeJN.cjs.map → surface-DuH0pm2v.cjs.map} +1 -1
  322. package/dist/{surface-fXvRpS6s.js → surface-eN_Jy2MJ.js} +3 -3
  323. package/dist/{surface-fXvRpS6s.js.map → surface-eN_Jy2MJ.js.map} +1 -1
  324. package/dist/surface.cjs +1 -1
  325. package/dist/surface.js +1 -1
  326. package/dist/{surface.mixin-C4hbgyaP.cjs → surface.mixin-CIXgN6iw.cjs} +1 -1
  327. package/dist/{surface.mixin-C4hbgyaP.cjs.map → surface.mixin-CIXgN6iw.cjs.map} +1 -1
  328. package/dist/{surface.mixin-DBuxL5aL.js → surface.mixin-D9jv1sKG.js} +1 -1
  329. package/dist/{surface.mixin-DBuxL5aL.js.map → surface.mixin-D9jv1sKG.js.map} +1 -1
  330. package/dist/{table-BRVKlNjl.cjs → table-C9rRQJEB.cjs} +1 -1
  331. package/dist/{table-BRVKlNjl.cjs.map → table-C9rRQJEB.cjs.map} +1 -1
  332. package/dist/{table-BeXnwSsq.js → table-Dg_tUGB_.js} +2 -2
  333. package/dist/{table-BeXnwSsq.js.map → table-Dg_tUGB_.js.map} +1 -1
  334. package/dist/table.cjs +1 -1
  335. package/dist/table.js +1 -1
  336. package/dist/{tabs-y708NWQ2.js → tabs-BbFC9omR.js} +2 -2
  337. package/dist/{tabs-y708NWQ2.js.map → tabs-BbFC9omR.js.map} +1 -1
  338. package/dist/{tabs-CBU9Ctqm.cjs → tabs-soTL-x4G.cjs} +1 -1
  339. package/dist/{tabs-CBU9Ctqm.cjs.map → tabs-soTL-x4G.cjs.map} +1 -1
  340. package/dist/tabs.cjs +1 -1
  341. package/dist/tabs.js +1 -1
  342. package/dist/tailwind.mixin-BIVhjNvD.js +225 -0
  343. package/dist/{tailwind.mixin-C4cx3IOr.js.map → tailwind.mixin-BIVhjNvD.js.map} +1 -1
  344. package/dist/tailwind.mixin-DSuEu-y3.cjs +2 -0
  345. package/dist/{tailwind.mixin-DGiyLbEi.cjs.map → tailwind.mixin-DSuEu-y3.cjs.map} +1 -1
  346. package/dist/teleport.cjs +1 -1
  347. package/dist/teleport.js +1 -1
  348. package/dist/{textarea-BhAoJg8c.cjs → textarea-DaRUJ0ri.cjs} +1 -1
  349. package/dist/{textarea-BhAoJg8c.cjs.map → textarea-DaRUJ0ri.cjs.map} +1 -1
  350. package/dist/{textarea-Bl8-gQEJ.js → textarea-hChvHbNM.js} +1 -1
  351. package/dist/{textarea-Bl8-gQEJ.js.map → textarea-hChvHbNM.js.map} +1 -1
  352. package/dist/textarea.cjs +1 -1
  353. package/dist/textarea.js +1 -1
  354. package/dist/{theme-DZUpYJn-.js → theme-B0M8Hlyo.js} +3 -3
  355. package/dist/{theme-DZUpYJn-.js.map → theme-B0M8Hlyo.js.map} +1 -1
  356. package/dist/{theme-C-vdR-Ic.cjs → theme-ZYH2MqX9.cjs} +1 -1
  357. package/dist/{theme-C-vdR-Ic.cjs.map → theme-ZYH2MqX9.cjs.map} +1 -1
  358. package/dist/{theme-button-CwrvpOMK.js → theme-button-BtlX_Zgd.js} +1 -1
  359. package/dist/{theme-button-CwrvpOMK.js.map → theme-button-BtlX_Zgd.js.map} +1 -1
  360. package/dist/{theme-button-Cx1iKh7G.cjs → theme-button-Dvqg-rE_.cjs} +1 -1
  361. package/dist/{theme-button-Cx1iKh7G.cjs.map → theme-button-Dvqg-rE_.cjs.map} +1 -1
  362. package/dist/theme-button.cjs +1 -1
  363. package/dist/theme-button.js +1 -1
  364. package/dist/theme.cjs +1 -1
  365. package/dist/theme.js +2 -2
  366. package/dist/tooltip.cjs +1 -1
  367. package/dist/tooltip.js +1 -1
  368. package/dist/tree.cjs +1 -1
  369. package/dist/tree.js +1 -1
  370. package/dist/{typewriter-mxVw5dFn.js → typewriter-CCel8Nta.js} +3 -3
  371. package/dist/{typewriter-mxVw5dFn.js.map → typewriter-CCel8Nta.js.map} +1 -1
  372. package/dist/{typewriter-CXQIzqPV.cjs → typewriter-Cf9f2bdx.cjs} +1 -1
  373. package/dist/{typewriter-CXQIzqPV.cjs.map → typewriter-Cf9f2bdx.cjs.map} +1 -1
  374. package/dist/typewriter.cjs +1 -1
  375. package/dist/typewriter.js +1 -1
  376. package/dist/typography.cjs +1 -1
  377. package/dist/typography.js +1 -1
  378. package/dist/{window-DFMlB1Tq.cjs → window-B9_14c12.cjs} +1 -1
  379. package/dist/{window-DFMlB1Tq.cjs.map → window-B9_14c12.cjs.map} +1 -1
  380. package/dist/{window-EWYJJC_H.js → window-CbgdwOZD.js} +2 -2
  381. package/dist/{window-EWYJJC_H.js.map → window-CbgdwOZD.js.map} +1 -1
  382. package/dist/window.cjs +1 -1
  383. package/dist/window.js +1 -1
  384. package/package.json +1 -1
  385. package/dist/tailwind.mixin-C4cx3IOr.js +0 -225
  386. package/dist/tailwind.mixin-DGiyLbEi.cjs +0 -2
@@ -0,0 +1,43 @@
1
+ # schmancy-option
2
+
3
+ > Selectable item for `schmancy-select`, `schmancy-autocomplete`, and `schmancy-menu`. Lightweight and a11y-ready.
4
+
5
+ ## Usage
6
+ ```html
7
+ <schmancy-select label="Country">
8
+ <schmancy-option value="us">United States</schmancy-option>
9
+ <schmancy-option value="de">Germany</schmancy-option>
10
+ <schmancy-option value="jp" disabled>Japan</schmancy-option>
11
+ </schmancy-select>
12
+ ```
13
+
14
+ ## Properties
15
+ | Property | Type | Default | Description |
16
+ |----------|------|---------|-------------|
17
+ | `value` | string | `''` | Value reported when this option is selected |
18
+ | `label` | string | auto | Display label (falls back to text content) |
19
+ | `selected` | boolean | `false` | Reflects selected state |
20
+ | `disabled` | boolean | `false` | Disables interaction |
21
+ | `group` | string | `''` | Grouping identifier for grouped lists |
22
+ | `icon` | string | `''` | Material icon name before the label |
23
+
24
+ ## Events
25
+ | Event | Payload | When |
26
+ |-------|---------|------|
27
+ | `click` | — | Standard click event |
28
+ | `option-select` | `CustomEvent<{ value, label }>` | Dispatched on activation |
29
+
30
+ ## Behavior
31
+ - Auto-generates `id` for ARIA wiring if not set.
32
+ - Infers `label` from text content when omitted.
33
+ - Keyboard focusable with a visible focus ring via `:focus-visible`.
34
+ - Parent select/autocomplete coordinates selection state via slot query.
35
+
36
+ ## Example — grouped options
37
+ ```html
38
+ <schmancy-select label="Framework">
39
+ <schmancy-option value="lit" group="web" icon="bolt">Lit</schmancy-option>
40
+ <schmancy-option value="react" group="web">React</schmancy-option>
41
+ <schmancy-option value="swift" group="mobile">Swift</schmancy-option>
42
+ </schmancy-select>
43
+ ```
@@ -0,0 +1,42 @@
1
+ # schmancy-page
2
+
3
+ > Native mobile-like page container. Fills remaining viewport height, prevents rubber-banding, pull-to-refresh, and double-tap zoom.
4
+
5
+ ## Usage
6
+ ```html
7
+ <schmancy-page rows="auto_1fr_auto">
8
+ <header>App bar</header>
9
+ <main>Scrollable content</main>
10
+ <footer>Bottom nav</footer>
11
+ </schmancy-page>
12
+ ```
13
+
14
+ ## Properties
15
+ | Property | Type | Default | Description |
16
+ |----------|------|---------|-------------|
17
+ | `rows` | string | `'auto_1fr_auto'` | Grid template rows — underscores become spaces (e.g. `'1fr_2fr_auto'`) |
18
+ | `show-scrollbar` | boolean | `false` | Display scrollbar on scrollable area |
19
+ | `no-select` | boolean | `false` | Disable text selection |
20
+
21
+ ## Behavior
22
+ - Listens to `visualViewport` resize/scroll + `orientationchange` + keyboard focus events to recompute height.
23
+ - Accounts for theme bottom offset (iOS safe area, home indicator).
24
+ - Auto-assigns semantic elements (`header`, `main`, `footer`) to slots.
25
+ - Inner scroll area uses `schmancy-scroll` for momentum-preserving scroll.
26
+
27
+ ## When to Use
28
+ - Root of a mobile view or panel that should feel like a native page.
29
+ - Any container where viewport-aware height + scroll containment matters.
30
+
31
+ ## Example — 3-row app shell
32
+ ```html
33
+ <schmancy-page rows="auto_1fr_auto">
34
+ <schmancy-surface type="solid" rounded="none">
35
+ <schmancy-typography type="title">My App</schmancy-typography>
36
+ </schmancy-surface>
37
+
38
+ <div class="p-4">…scrollable content…</div>
39
+
40
+ <schmancy-navigation-bar></schmancy-navigation-bar>
41
+ </schmancy-page>
42
+ ```
@@ -0,0 +1,51 @@
1
+ # schmancy-qr-scanner
2
+
3
+ > Camera-based QR code scanner using `jsQR`. Requests rear-camera access, decodes frames in real time, deduplicates reads.
4
+
5
+ ## Usage
6
+ ```html
7
+ <schmancy-qr-scanner
8
+ continuous
9
+ @scan-result=${e => this.handleScan(e.detail.data)}
10
+ ></schmancy-qr-scanner>
11
+ ```
12
+
13
+ ```typescript
14
+ handleScan(data: string) {
15
+ console.log('QR decoded:', data)
16
+ }
17
+ ```
18
+
19
+ ## Properties
20
+ | Property | Type | Default | Description |
21
+ |----------|------|---------|-------------|
22
+ | `continuous` | boolean | `true` | Keep scanning after a successful read (dedupe repeated reads) |
23
+
24
+ ## Events
25
+ | Event | Detail | When |
26
+ |-------|--------|------|
27
+ | `scan-result` | `{ data: string, timestamp: number }` | QR code successfully decoded |
28
+
29
+ ## Behavior
30
+ - Requests `getUserMedia` with `facingMode: 'environment'` (rear camera) at 1280×720.
31
+ - Decodes via `jsQR` on `animationFrames` stream with `throttleTime` to avoid CPU thrashing.
32
+ - `distinctUntilChanged` prevents duplicate emissions for the same code.
33
+ - Brief success flash on each valid read.
34
+ - Stops camera + tears down subscriptions on disconnect.
35
+ - Displays an error state if camera permission is denied.
36
+
37
+ ## Requires
38
+ - HTTPS (or `localhost`) for camera access.
39
+ - User permission to the camera.
40
+
41
+ ## Example
42
+ ```html
43
+ <schmancy-surface type="glass" rounded="all">
44
+ <schmancy-qr-scanner
45
+ @scan-result=${(e: CustomEvent<{ data: string }>) => {
46
+ $notify.success(`Scanned: ${e.detail.data}`)
47
+ this.scannedCode = e.detail.data
48
+ }}
49
+ ></schmancy-qr-scanner>
50
+ </schmancy-surface>
51
+ ```
@@ -0,0 +1,47 @@
1
+ # schmancy-range
2
+
3
+ > Numeric slider input with theme-driven track gradient and focus halo.
4
+
5
+ ## Usage
6
+ ```html
7
+ <schmancy-range
8
+ label="Volume"
9
+ min="0"
10
+ max="100"
11
+ step="1"
12
+ .value=${50}
13
+ @change=${e => this.volume = e.detail.value}
14
+ ></schmancy-range>
15
+ ```
16
+
17
+ ## Properties
18
+ | Property | Type | Default | Description |
19
+ |----------|------|---------|-------------|
20
+ | `min` | number | `0` | Minimum value |
21
+ | `max` | number | `1` | Maximum value |
22
+ | `step` | number | `0.01` | Increment per tick |
23
+ | `value` | number | `0` | Current value |
24
+ | `label` | string | — | Optional label (current value displays on the right) |
25
+ | `disabled` | boolean | `false` | Disabled state (38% opacity) |
26
+
27
+ ## Events
28
+ | Event | Payload | When |
29
+ |-------|---------|------|
30
+ | `change` | `{ value: number }` | On input change |
31
+
32
+ ## Visual
33
+ - Primary-colored track gradient (filled portion = primary, empty = 30% primary).
34
+ - Circular thumb with hover halo (8px primary glow at 12% opacity).
35
+ - Disabled state: 38% opacity, not-allowed cursor.
36
+
37
+ ## Example — precise float control
38
+ ```html
39
+ <schmancy-range
40
+ label="Mass"
41
+ min="0.5"
42
+ max="2.0"
43
+ step="0.05"
44
+ .value=${this.mass}
45
+ @change=${(e: CustomEvent<{ value: number }>) => this.mass = e.detail.value}
46
+ ></schmancy-range>
47
+ ```
@@ -0,0 +1,60 @@
1
+ # Schmancy RxJS Utils
2
+
3
+ > RxJS-wrapped DOM observation helpers. Use when you need to react to elements appearing, disappearing, or changing across the document.
4
+
5
+ ## Imports
6
+ ```typescript
7
+ import {
8
+ mutationObserver,
9
+ waitForElement,
10
+ waitForElementAll,
11
+ waitForElements,
12
+ waitForElementsAll,
13
+ waitUntil,
14
+ } from '@mhmo91/schmancy'
15
+ ```
16
+
17
+ ## `mutationObserver(target, options?)`
18
+ RxJS wrapper around `MutationObserver`.
19
+ ```typescript
20
+ mutationObserver(document.body, { childList: true, subtree: true })
21
+ .pipe(takeUntil(this.disconnecting))
22
+ .subscribe(mutations => { /* react */ })
23
+ ```
24
+
25
+ ## `waitForElement(selector, timeout = 5000)`
26
+ Emits the first matching element once it exists in the DOM. Throws on timeout. Pass `undefined` to wait forever.
27
+ ```typescript
28
+ waitForElement('#auth-banner').subscribe(el => el.focus())
29
+ waitForElement('.lazy-panel', 10000).subscribe(el => el.click())
30
+ ```
31
+
32
+ ## `waitForElementAll(selector, timeout?)`
33
+ Emits whenever the matching set changes (all current matches).
34
+ ```typescript
35
+ waitForElementAll('.live-tile').subscribe(tiles => {
36
+ tiles.forEach(t => observe(t))
37
+ })
38
+ ```
39
+
40
+ ## `waitForElements([sel1, sel2, ...], timeout?)` / `waitForElementsAll`
41
+ Multi-selector variants — resolve once *any*/`every` selector is present.
42
+
43
+ ## `waitUntil([selectors], timeout = 5000)`
44
+ Emits once when **all** selectors have matches. Throws on timeout.
45
+ ```typescript
46
+ waitUntil(['header', 'main', 'footer'])
47
+ .subscribe(() => console.log('Page shell ready'))
48
+ ```
49
+
50
+ ## How It Works
51
+ All helpers share `mutationObserver(document.body)` with `childList: true, subtree: true` and `.startWith(document.body)` so they check once immediately and re-check on every DOM mutation.
52
+
53
+ ## When to Use
54
+ - Integrating third-party scripts that inject DOM late.
55
+ - Coordinating with slot-projected children that may mount asynchronously.
56
+ - Awaiting app-shell elements before attaching shortcuts.
57
+
58
+ ## When NOT to Use
59
+ - Inside your own component — use `firstUpdated()` or `queryAssignedElements`.
60
+ - For cross-shadow discovery — use [discovery](./discovery.md) instead.
@@ -0,0 +1,43 @@
1
+ # schmancy-slider / schmancy-slide
2
+
3
+ > Horizontal snap-scrolling carousel with optional arrow controls.
4
+
5
+ ## Usage
6
+ ```html
7
+ <schmancy-slider show-arrows>
8
+ <schmancy-slide>
9
+ <img src="a.jpg" />
10
+ </schmancy-slide>
11
+ <schmancy-slide>
12
+ <div class="p-8">Second slide</div>
13
+ </schmancy-slide>
14
+ <schmancy-slide>
15
+ <div class="p-8">Third slide</div>
16
+ </schmancy-slide>
17
+ </schmancy-slider>
18
+ ```
19
+
20
+ ## schmancy-slider Properties
21
+ | Property | Type | Default | Description |
22
+ |----------|------|---------|-------------|
23
+ | `showArrows` | boolean | `true` | Render prev/next navigation buttons |
24
+
25
+ ## Events
26
+ | Event | Payload | When |
27
+ |-------|---------|------|
28
+ | `slide-changed` | `{ index: number }` | Centered slide changes after scroll settles |
29
+
30
+ ## Behavior
31
+ - Each `schmancy-slide` is sized to `flex: 0 0 100%` of the slider.
32
+ - `scroll-snap-type: x mandatory` — scroll always lands on a slide.
33
+ - Scrollbars hidden across browsers.
34
+ - Scroll events throttled to 100ms for stable index tracking.
35
+ - Arrow buttons scroll to previous/next slide when `show-arrows` is true.
36
+
37
+ ## Example — programmatic control
38
+ ```typescript
39
+ const slider = this.renderRoot.querySelector('schmancy-slider')
40
+ slider?.addEventListener('slide-changed', (e: CustomEvent<{ index: number }>) => {
41
+ this.activeIndex = e.detail.index
42
+ })
43
+ ```
package/dist/ai/store.md CHANGED
@@ -1,83 +1,192 @@
1
- # Schmancy Store (Context System)
1
+ # Store State Foundation
2
2
 
3
- > Reactive state management with `createContext`, `@select` decorator, and persistent storage.
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`.
22
+
23
+ ## Creating a context
4
24
 
5
- ## Creating a Context
6
25
  ```typescript
7
26
  import { createContext } from '@mhmo91/schmancy'
8
27
 
9
- // Object store
10
- const userContext = createContext({ name: '', email: '' }, 'local', 'user')
28
+ // Object store — persisted to localStorage
29
+ export const userContext = createContext<User>(new User(), 'local', 'user')
11
30
 
12
- // Collection store (Map-based)
13
- const itemsContext = createContext(new Map<string, Item>(), 'indexeddb', 'items')
31
+ // Collection store Map keyed by id
32
+ export const contactsContext = createContext<Map<string, Contact>>(new Map(), 'memory', 'contacts')
14
33
 
15
- // Array store
16
- const tagsContext = createContext<string>([], 'memory', 'tags')
34
+ // Array store — ordered list
35
+ export const tagsContext = createContext<string[]>([], 'memory', 'tags')
36
+
37
+ // Session-scoped (per browser tab)
38
+ export const draftContext = createContext<{ text: string }>({ text: '' }, 'session', 'compose-draft')
17
39
  ```
18
40
 
19
- ## Storage Types
20
- | Type | Description |
21
- |------|-------------|
22
- | `'memory'` | In-memory only (lost on refresh) |
23
- | `'local'` | localStorage (persistent) |
24
- | `'session'` | sessionStorage (per tab) |
25
- | `'indexeddb'` | IndexedDB (large data, persistent) |
41
+ ### Storage tiers
42
+
43
+ | Mode | Backing | Survives refresh? | Survives tab close? | Size |
44
+ |------|---------|-------------------|---------------------|------|
45
+ | `'memory'` | JS heap | ❌ | ❌ | small |
46
+ | `'session'` | `sessionStorage` | ✅ | ❌ (per-tab) | ~5 MB |
47
+ | `'local'` | `localStorage` | | | ~5 MB |
48
+ | `'indexeddb'` | IndexedDB | ✅ | ✅ | GB |
49
+
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'`
55
+
56
+ ## Reading with `@select`
26
57
 
27
- ## Reading State with @select
28
58
  ```typescript
29
59
  import { select } from '@mhmo91/schmancy'
30
60
 
31
- @customElement('my-component')
32
- class MyComponent extends $LitElement() {
33
- // Auto-subscribes to context changes, triggers re-render
34
- @select(userContext)
35
- user!: { name: string; email: string }
61
+ @customElement('user-card')
62
+ class UserCard extends $LitElement() {
63
+ // Auto-subscribes, re-renders on change
64
+ @select(userContext) user!: User
36
65
 
37
- // With selector function
38
- @select(itemsContext, (items) => items.size)
39
- itemCount!: number
66
+ // Selector function narrows the dependency
67
+ @select(contactsContext, m => m.size) contactCount!: number
40
68
 
41
- // Collection as Map
42
- @select(itemsContext)
43
- items!: Map<string, Item>
69
+ // Collection → stays as Map
70
+ @select(contactsContext) contacts!: Map<string, Contact>
44
71
  }
45
72
  ```
46
73
 
47
- ## Writing State
74
+ `@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.
78
+ - `debug` — log every emission.
79
+
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.
87
+
88
+ ## Writing state
89
+
90
+ ### Object store
48
91
  ```typescript
49
- // Object store
50
92
  userContext.set({ name: 'Alice', email: 'alice@test.com' })
93
+ userContext.set({ ...userContext.value, name: 'Bob' }) // partial update pattern
94
+ ```
51
95
 
52
- // Collection store
53
- itemsContext.set('item-1', { name: 'Widget' })
54
- itemsContext.delete('item-1')
55
- itemsContext.replace(new Map([...]))
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
+ ```
56
102
 
57
- // Array store
103
+ ### Array store
104
+ ```typescript
58
105
  tagsContext.push('new-tag')
59
106
  tagsContext.replace(['a', 'b', 'c'])
60
107
  ```
61
108
 
62
109
  ## Observable API
110
+
63
111
  ```typescript
64
- // Subscribe to changes
65
- userContext.$.pipe(
66
- takeUntil(this.disconnecting)
67
- ).subscribe(user => { ... })
112
+ connectedCallback() {
113
+ super.connectedCallback()
114
+
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
+ }
122
+ ```
68
123
 
69
- // Current value (synchronous)
70
- const current = userContext.value
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.
71
127
 
72
- // Ready state
73
- if (userContext.ready) { ... }
74
- ```
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.
75
130
 
76
- ## @select Options
77
- `required` (default true): wait for value before connectedCallback. `updateOnly`: only requestUpdate. `deepClone`: structuredClone. `debug`: log activity.
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:
78
134
 
79
- ## selectItem (Collection Helper)
80
135
  ```typescript
81
- @selectItem(itemsContext, (component) => component.itemId)
82
- selectedItem!: Item | undefined
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
+ }
162
+
163
+ private onInput(v: string) {
164
+ this.text = v
165
+ this.draftCtx?.set({ text: v })
166
+ }
167
+ }
83
168
  ```
169
+
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.
189
+
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).
@@ -0,0 +1,55 @@
1
+ # schmancy-teleport
2
+
3
+ > Move DOM between locations with a FLIP-animated transition. Two instances sharing an `id` handshake via broadcast events — when one mounts, it finds the other and flies the content between them.
4
+
5
+ ## Usage
6
+ ```html
7
+ <!-- Start position -->
8
+ <schmancy-teleport id="hero-image">
9
+ <img src="portrait.jpg" alt="" />
10
+ </schmancy-teleport>
11
+
12
+ <!-- Later, in a different view -->
13
+ <schmancy-teleport id="hero-image"></schmancy-teleport>
14
+ ```
15
+
16
+ When the second instance mounts, the image smoothly animates from its old bounding rect to the new one.
17
+
18
+ ## Properties
19
+ | Property | Type | Default | Description |
20
+ |----------|------|---------|-------------|
21
+ | `id` | string | **required** | Shared identifier between source and target |
22
+ | `uuid` | number | auto | Instance UUID for disambiguation (read-only) |
23
+ | `delay` | number | `0` | Delay before teleporting (ms) |
24
+
25
+ ## Discovery Events
26
+ The service broadcasts on `window`:
27
+ - `FINDING_MORTIES` — "is anyone mounted with id X?"
28
+ - `HERE_RICKY` — instances reply with self reference
29
+ - `WhereAreYouRicky` / `HereMorty` — instance-to-instance handshake
30
+
31
+ Uses RxJS with a race/throwIfEmpty pattern to handle missing counterparts gracefully.
32
+
33
+ ## Typical Pattern — route transitions
34
+ ```html
35
+ <!-- List view -->
36
+ ${repeat(items, item => item.id, item => html`
37
+ <schmancy-teleport id=${`card-${item.id}`}>
38
+ <schmancy-card @click=${() => router.push(`/item/${item.id}`)}>
39
+ <img src=${item.thumbnail} />
40
+ </schmancy-card>
41
+ </schmancy-teleport>
42
+ `)}
43
+
44
+ <!-- Detail view -->
45
+ <schmancy-teleport id=${`card-${this.params.id}`}></schmancy-teleport>
46
+ ```
47
+
48
+ ## Notes
49
+ - Uses `watchElementRect` (ResizeObserver + scroll tracking) to keep source/target in sync.
50
+ - Animation uses the FLIP technique: capture first rect, invert on mount, play to final.
51
+ - All subscriptions clean up via `takeUntil(this.disconnecting)`.
52
+ - Each teleport pair must share a unique `id` string.
53
+
54
+ ## See Also
55
+ - For programmatic teleportation from JS: import `teleportationService` from `@mhmo91/schmancy/teleport`.
@@ -0,0 +1,26 @@
1
+ # schmancy-theme-button
2
+
3
+ > Minimal palette-icon button that spins 360° on click. Hook its `click` to toggle/regenerate your theme.
4
+
5
+ ## Usage
6
+ ```html
7
+ <schmancy-theme-button @click=${() => this.toggleTheme()}></schmancy-theme-button>
8
+ ```
9
+
10
+ ## Behavior
11
+ - Renders a `schmancy-button` (variant `text`) wrapping a palette `schmancy-icon`.
12
+ - On click: Web Animations API rotates the icon 360° over 300ms.
13
+ - No properties — it's a UI affordance; wire the theme logic via `@click`.
14
+
15
+ ## Typical Wiring
16
+ ```typescript
17
+ import { theme } from '@mhmo91/schmancy'
18
+
19
+ // Toggle dark/light
20
+ <schmancy-theme-button @click=${() => theme.toggleScheme()}></schmancy-theme-button>
21
+
22
+ // Randomize primary color
23
+ <schmancy-theme-button @click=${() => theme.randomize()}></schmancy-theme-button>
24
+ ```
25
+
26
+ See [theme.md](./theme.md) for the full theme service API.
@@ -0,0 +1,46 @@
1
+ # schmancy-typewriter
2
+
3
+ > Text-reveal component powered by [TypeIt](https://typeitjs.com). Characters pop in with entrance + wobble physics; custom cursor pulses with drop-shadow glow.
4
+
5
+ ## Usage
6
+ ```html
7
+ <schmancy-typewriter>
8
+ Hello, world.
9
+ </schmancy-typewriter>
10
+ ```
11
+
12
+ ## Properties
13
+ | Property | Type | Default | Description |
14
+ |----------|------|---------|-------------|
15
+ | `speed` | number | `35` | Ms per character typed |
16
+ | `deleteSpeed` | number | `20` | Ms per character deleted |
17
+ | `delay` | number | `0` | Initial delay before typing (inherited via `delayContext`) |
18
+ | `autoStart` | boolean | `true` | Start typing on connect |
19
+ | `cursorChar` | string | `''` | Character for the cursor (empty = default block cursor) |
20
+ | `once` | boolean | `true` | Only animate once per session (`sessionStorage` hash) |
21
+ | `loop` | boolean | `false` | Loop infinitely (overrides `once`) |
22
+ | `cyclePause` | number | `1500` | Default pause for cycling (ms) |
23
+
24
+ ## Behavior
25
+ - **Lazy start** via IntersectionObserver — won't type until visible.
26
+ - **Session caching** — when `once=true`, content hash is stored; subsequent visits skip the animation.
27
+ - **Delay coordination** — consumes `delayContext`, staggering with parent `schmancy-delay`.
28
+ - Character entrance animation: scale 0.3 → 1.1 → 1 with blur-to-focus.
29
+ - Alternating characters get a subtle `wobble` rotation.
30
+ - Cursor pulses with `drop-shadow(0 0 8px currentColor)` glow.
31
+
32
+ ## Slot Content
33
+ Text (or nested HTML) goes in the default slot. TypeIt handles strings, tags, line breaks.
34
+
35
+ ```html
36
+ <schmancy-typewriter speed="50">
37
+ First line.<br>
38
+ <strong>Bold second.</strong>
39
+ </schmancy-typewriter>
40
+ ```
41
+
42
+ ## Vs. `typewriter` directive
43
+ - **Component (`schmancy-typewriter`)**: slot-based, lazy-starts on visibility, one-shot content reveal with cached skipping.
44
+ - **Directive (`typewriter([...phrases])`)**: cycles through a phrase array with typing + deleting + optional Web Audio sound. See [directives.md](./directives.md).
45
+
46
+ Use the directive for looping taglines. Use the component for one-time paragraph reveals.