@trintel/zooy 1.0.1-beta.0 → 1.0.1

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 (284) hide show
  1. package/README.md +284 -339
  2. package/dist/chunks/{16-ChlL35BX.js → 16-BXti8Tu-.js} +6 -6
  3. package/dist/chunks/16-CMCRqVYz.js +1 -0
  4. package/dist/chunks/{20-CZPIOG-A.js → 20-CQLnFcRb.js} +9 -9
  5. package/dist/chunks/20-Df0dXwyx.js +1 -0
  6. package/dist/chunks/button-B1jzfT-Z.js +272 -0
  7. package/dist/chunks/button-C-oX8EmF.js +66 -0
  8. package/dist/chunks/button-skeleton-CK3BHdja.js +21 -0
  9. package/dist/chunks/{button-skeleton-COf2kCDL.js → button-skeleton-DoCp6sBb.js} +10 -9
  10. package/dist/chunks/checkbox-CgFjYxQ_.js +201 -0
  11. package/dist/chunks/checkbox-t3G-H1NN.js +40 -0
  12. package/dist/chunks/{class-map-BfNAkUL_.js → class-map-D6tjF27Y.js} +2 -2
  13. package/dist/chunks/{class-map-DEHG4tmw.js → class-map-FWQBIzSx.js} +1 -1
  14. package/dist/chunks/collection-helpers-Bk68Vaau.js +7 -0
  15. package/dist/chunks/collection-helpers-afBvMQaC.js +1 -0
  16. package/dist/chunks/content-switcher-item-CedjjtvP.js +351 -0
  17. package/dist/chunks/content-switcher-item-c4WBWz31.js +27 -0
  18. package/dist/chunks/defs-C88lSWuJ.js +1 -0
  19. package/dist/chunks/defs-Do0OvCKd.js +1165 -0
  20. package/dist/chunks/dropdown-item-C0SHr4st.js +69 -0
  21. package/dist/chunks/dropdown-item-Dh5IEXDr.js +621 -0
  22. package/dist/chunks/{focus-rQSNiwy7.js → focus-B3iymVyL.js} +1 -1
  23. package/dist/chunks/{focus-B9JYe97T.js → focus-WnKGH_xB.js} +1 -1
  24. package/dist/chunks/{icon-loader-Dk_AU26w.js → icon-loader-CJxyg-lp.js} +1 -1
  25. package/dist/chunks/{icon-loader-o_JYDmJX.js → icon-loader-ChKeNR4s.js} +1 -1
  26. package/dist/chunks/{icon-loader-utils-BEOGXn0q.js → icon-loader-utils-BwViqIXz.js} +23 -23
  27. package/dist/chunks/icon-loader-utils-DK8DViXt.js +5 -0
  28. package/dist/chunks/if-defined-DYWhlnlE.js +5 -0
  29. package/dist/chunks/{if-defined-C0yJsxi2.js → if-defined-eJcDYClo.js} +1 -1
  30. package/dist/chunks/{if-non-empty-DTGflHtA.js → if-non-empty-COTeEFkK.js} +1 -1
  31. package/dist/chunks/if-non-empty-CxMysAQW.js +1 -0
  32. package/dist/chunks/index-0AElqkkj.js +12 -0
  33. package/dist/chunks/{index-B3mXrMt1.js → index-4WNeLsiw.js} +4 -3
  34. package/dist/chunks/{index-BXczHDk-.js → index-4XJJobHw.js} +12 -11
  35. package/dist/chunks/index-7cXLLw89.js +881 -0
  36. package/dist/chunks/index-9fmHblh5.js +121 -0
  37. package/dist/chunks/{index-BwIoRMDI.js → index-B0nToMRj.js} +7 -6
  38. package/dist/chunks/index-B4SxU_Hu.js +87 -0
  39. package/dist/chunks/index-B5DpS-cb.js +2 -0
  40. package/dist/chunks/{index-CzTjJ8lP.js → index-B5GB0rQW.js} +47 -37
  41. package/dist/chunks/index-B8Ze9ISK.js +17 -0
  42. package/dist/chunks/index-BAAA4wkE.js +45 -0
  43. package/dist/chunks/index-BBWp83R-.js +160 -0
  44. package/dist/chunks/index-BBap1uCI.js +1 -0
  45. package/dist/chunks/index-BGGDxbLL.js +368 -0
  46. package/dist/chunks/index-BMquNDkd.js +381 -0
  47. package/dist/chunks/index-BQnyeVHX.js +1 -0
  48. package/dist/chunks/index-BRnzFxjk.js +25 -0
  49. package/dist/chunks/index-BbJQIwkY.js +452 -0
  50. package/dist/chunks/{index-hLI0Bnyb.js → index-Bb_1S0pr.js} +7 -6
  51. package/dist/chunks/index-BeMnerDj.js +111 -0
  52. package/dist/chunks/index-Bff6B9vY.js +254 -0
  53. package/dist/chunks/index-Bi9WliCA.js +683 -0
  54. package/dist/chunks/{index-D0xRAPD5.js → index-Bls8zdHV.js} +6 -5
  55. package/dist/chunks/index-Bo2QmpPO.js +1 -0
  56. package/dist/chunks/index-BseD7Jzt.js +75 -0
  57. package/dist/chunks/index-Bt7v-zqV.js +77 -0
  58. package/dist/chunks/index-Bunat0DP.js +337 -0
  59. package/dist/chunks/index-BvdNKhJw.js +19 -0
  60. package/dist/chunks/index-BwFE4R87.js +30 -0
  61. package/dist/chunks/index-BwRxBdeg.js +158 -0
  62. package/dist/chunks/index-Bymsj9gH.js +1 -0
  63. package/dist/chunks/index-C-pfDP7B.js +1 -0
  64. package/dist/chunks/index-C2oV5vU3.js +4 -0
  65. package/dist/chunks/index-C3n83pM3.js +103 -0
  66. package/dist/chunks/index-C572_UKV.js +22 -0
  67. package/dist/chunks/index-C6bOvXSf.js +129 -0
  68. package/dist/chunks/{index-CByffhPq.js → index-CBICHiFD.js} +147 -134
  69. package/dist/chunks/index-CEy6bu7P.js +79 -0
  70. package/dist/chunks/index-CFqKkC5Z.js +36 -0
  71. package/dist/chunks/index-CIZ3Gnmm.js +8 -0
  72. package/dist/chunks/index-CIiIAqrQ.js +414 -0
  73. package/dist/chunks/index-CJdEJ8pY.js +15 -0
  74. package/dist/chunks/index-CKYRBtLC.js +79 -0
  75. package/dist/chunks/index-CQl4NaPS.js +65 -0
  76. package/dist/chunks/index-CR3DrmQi.js +235 -0
  77. package/dist/chunks/index-CTsGb3mD.js +364 -0
  78. package/dist/chunks/{index-rwBsdvh6.js → index-CV7TVQ4T.js} +9 -8
  79. package/dist/chunks/index-CWlg_Hu2.js +150 -0
  80. package/dist/chunks/{index-Bwix1iwB.js → index-CYIcfuAW.js} +6 -5
  81. package/dist/chunks/{index-WNXgzThF.js → index-CkxGsCJy.js} +181 -181
  82. package/dist/chunks/index-ClE0uX_c.js +27 -0
  83. package/dist/chunks/index-Cnsy7Qk3.js +511 -0
  84. package/dist/chunks/index-CoAT1iC6.js +12 -0
  85. package/dist/chunks/index-Cp3P3KaW.js +45 -0
  86. package/dist/chunks/index-CqQZpHti.js +3 -0
  87. package/dist/chunks/index-CsjJntyD.js +23 -0
  88. package/dist/chunks/{index-BIaF1Dfx.js → index-Ctna95NT.js} +5 -4
  89. package/dist/chunks/index-Cu1u3Mjn.js +150 -0
  90. package/dist/chunks/index-Cv6qE9qP.js +22 -0
  91. package/dist/chunks/index-Cwb1pbm9.js +252 -0
  92. package/dist/chunks/{index-BSgHSOVT.js → index-CzAwJhyQ.js} +4 -3
  93. package/dist/chunks/index-D8LE8G2j.js +81 -0
  94. package/dist/chunks/{index-C_K070Kn.js → index-D9sRIKMQ.js} +9 -8
  95. package/dist/chunks/index-DBsASlZI.js +15 -0
  96. package/dist/chunks/{index-DurPWBYc.js → index-DGw1TVFB.js} +3 -2
  97. package/dist/chunks/index-DIsXKJDH.js +4 -0
  98. package/dist/chunks/{index-CT43RMOu.js → index-DNWjc2SJ.js} +3 -2
  99. package/dist/chunks/index-DSOPjl5x.js +563 -0
  100. package/dist/chunks/index-DUtoSCTU.js +455 -0
  101. package/dist/chunks/index-DWjrCygZ.js +49 -0
  102. package/dist/chunks/index-DYvD9xjl.js +4 -0
  103. package/dist/chunks/index-DZabSr3s.js +36 -0
  104. package/dist/chunks/index-DbAeG1nY.js +1 -0
  105. package/dist/chunks/index-Dc51G1mo.js +26 -0
  106. package/dist/chunks/index-Dd9iSSXa.js +260 -0
  107. package/dist/chunks/{index-C8LyfVmf.js → index-DfFx1Jz3.js} +6 -5
  108. package/dist/chunks/index-Dh4LYLg5.js +1604 -0
  109. package/dist/chunks/index-Dk3tlz8Q.js +15 -0
  110. package/dist/chunks/index-Do1DszoZ.js +1 -0
  111. package/dist/chunks/index-DrDKdYFJ.js +58 -0
  112. package/dist/chunks/index-DyO3Wdy_.js +37 -0
  113. package/dist/chunks/index-DyyLrVDY.js +188 -0
  114. package/dist/chunks/{index-45EApaFs.js → index-GDVDUQtg.js} +14 -13
  115. package/dist/chunks/index-GbWz6fuF.js +243 -0
  116. package/dist/chunks/index-JWULDURW.js +89 -0
  117. package/dist/chunks/index-MgWriQfr.js +35 -0
  118. package/dist/chunks/index-OgL1A9Rm.js +42 -0
  119. package/dist/chunks/{index-DdNZTQw1.js → index-QzojJs5M.js} +3 -2
  120. package/dist/chunks/index-TJL02uup.js +291 -0
  121. package/dist/chunks/index-Z4ar01y-.js +259 -0
  122. package/dist/chunks/{index-BSh7UYcP.js → index-_xRytR0j.js} +3 -3
  123. package/dist/chunks/index-cuMoh7qn.js +1 -0
  124. package/dist/chunks/index-du3RQU31.js +62 -0
  125. package/dist/chunks/{index-DFA4_spk.js → index-hH_m653R.js} +9 -8
  126. package/dist/chunks/index-hn76Yo-L.js +1 -0
  127. package/dist/chunks/index-i4heE-wx.js +71 -0
  128. package/dist/chunks/index-i9jyrFc9.js +19 -0
  129. package/dist/chunks/index-lFqOe0IJ.js +46 -0
  130. package/dist/chunks/index-pS6-humH.js +74 -0
  131. package/dist/chunks/index-pc36PiDY.js +57 -0
  132. package/dist/chunks/index-qgl9W8eF.js +52 -0
  133. package/dist/chunks/{index-BUxB7aWd.js → index-uwN33H1P.js} +9 -8
  134. package/dist/chunks/index-uxZPrL2m.js +406 -0
  135. package/dist/chunks/index-yzFU-E6F.js +22 -0
  136. package/dist/chunks/{loading-icon-DhJR6LyV.js → loading-icon-CPvmJvpZ.js} +2 -2
  137. package/dist/chunks/loading-icon-DdwpAk8-.js +24 -0
  138. package/dist/chunks/main-BGOPab-5.js +4041 -0
  139. package/dist/chunks/main-Bx21zlkN.js +65 -0
  140. package/dist/chunks/{property-pT1z5CCa.js → property-BkjBVRuu.js} +1 -1
  141. package/dist/chunks/property-DAFv3PCb.js +5 -0
  142. package/dist/chunks/register-BCEOkbXG.js +1583 -0
  143. package/dist/chunks/{register-BK21_Wkj.js → register-Bkr1UKav.js} +1 -1
  144. package/dist/chunks/{register-BMNs2hNG.js → register-DTXmg-gw.js} +1 -1
  145. package/dist/chunks/register-D_CXtGy1.js +1 -0
  146. package/dist/chunks/search-DDFN8-Mz.js +30 -0
  147. package/dist/chunks/search-npG8ywjx.js +240 -0
  148. package/dist/chunks/select-CFy3MvH6.js +76 -0
  149. package/dist/chunks/select-DkCpQORs.js +357 -0
  150. package/dist/chunks/settings-Bgpv8zuU.js +62 -0
  151. package/dist/chunks/settings-jvP7vP60.js +66 -0
  152. package/dist/chunks/{state-FnSmMH94.js → state-BdgD82MZ.js} +1 -1
  153. package/dist/chunks/{state-Bpmgn27B.js → state-uF7CZaP5.js} +1 -1
  154. package/dist/chunks/text-input-BUdM-ojg.js +68 -0
  155. package/dist/chunks/text-input-DVdkm07X.js +372 -0
  156. package/dist/chunks/tooltip-content-BXcBmMsV.js +3 -0
  157. package/dist/chunks/tooltip-content-CWRE_NqH.js +135 -0
  158. package/dist/chunks/{unsafe-html-D49sIpJ5.js → unsafe-html-Bg0eM3hS.js} +5 -5
  159. package/dist/chunks/{unsafe-html-C_MKAcuC.js → unsafe-html-CpAqmPyx.js} +1 -1
  160. package/dist/zooy.cjs.js +1 -1
  161. package/dist/zooy.es.js +20 -2
  162. package/package.json +3 -4
  163. package/src/sass/carbon.scss +117 -0
  164. package/src/sass/main.scss +1 -1
  165. package/src/sass/panels.scss +268 -359
  166. package/src/sass/split.scss +1 -0
  167. package/dist/chunks/16-41wFkj7S.js +0 -1
  168. package/dist/chunks/20-gmyNFvDv.js +0 -1
  169. package/dist/chunks/button-DdJepOoE.js +0 -271
  170. package/dist/chunks/button-skeleton-rf3WDPTZ.js +0 -21
  171. package/dist/chunks/button-zHEPxpXa.js +0 -66
  172. package/dist/chunks/checkbox-B5mHvx0J.js +0 -200
  173. package/dist/chunks/checkbox-BRPCg-DN.js +0 -40
  174. package/dist/chunks/collection-helpers-BwUB2CEz.js +0 -8
  175. package/dist/chunks/collection-helpers-CYLIiyii.js +0 -1
  176. package/dist/chunks/content-switcher-item-DeGjVRQY.js +0 -350
  177. package/dist/chunks/content-switcher-item-DucclV1b.js +0 -27
  178. package/dist/chunks/defs-DMmigODC.js +0 -1077
  179. package/dist/chunks/defs-DPD20sPK.js +0 -1
  180. package/dist/chunks/dropdown-item-BgLQ1VLo.js +0 -69
  181. package/dist/chunks/dropdown-item-DPdwOION.js +0 -620
  182. package/dist/chunks/icon-loader-utils-BBjK16O-.js +0 -5
  183. package/dist/chunks/if-defined-BdZRLDJ6.js +0 -5
  184. package/dist/chunks/if-non-empty-CEHK-hqx.js +0 -1
  185. package/dist/chunks/index-16wphaSo.js +0 -4
  186. package/dist/chunks/index-27oFQaOS.js +0 -37
  187. package/dist/chunks/index-5jmZyISW.js +0 -1
  188. package/dist/chunks/index-B1vQ44Hl.js +0 -363
  189. package/dist/chunks/index-B3CDjjXh.js +0 -214
  190. package/dist/chunks/index-B7mGUQhz.js +0 -79
  191. package/dist/chunks/index-BBNaYDog.js +0 -22
  192. package/dist/chunks/index-BBt9OmO5.js +0 -12
  193. package/dist/chunks/index-BJAuRs3y.js +0 -75
  194. package/dist/chunks/index-BJKftWYn.js +0 -89
  195. package/dist/chunks/index-BLjNrhkN.js +0 -4
  196. package/dist/chunks/index-BOTu9u-3.js +0 -86
  197. package/dist/chunks/index-BPVpH8ll.js +0 -160
  198. package/dist/chunks/index-BRuvyoCz.js +0 -15
  199. package/dist/chunks/index-BXIxcS00.js +0 -22
  200. package/dist/chunks/index-BaVyBv2V.js +0 -25
  201. package/dist/chunks/index-BgbqX0uv.js +0 -234
  202. package/dist/chunks/index-BjQlt8g2.js +0 -451
  203. package/dist/chunks/index-BoNLj7PW.js +0 -44
  204. package/dist/chunks/index-BxVW3p3I.js +0 -258
  205. package/dist/chunks/index-ByKyGGzb.js +0 -3
  206. package/dist/chunks/index-ByTSSU1x.js +0 -1
  207. package/dist/chunks/index-CBbsFlsv.js +0 -290
  208. package/dist/chunks/index-CIbRjtWm.js +0 -32
  209. package/dist/chunks/index-CIzeMGQv.js +0 -81
  210. package/dist/chunks/index-CLGxSjLW.js +0 -62
  211. package/dist/chunks/index-CMF5Cawn.js +0 -70
  212. package/dist/chunks/index-CO-A2KY9.js +0 -562
  213. package/dist/chunks/index-CONgwvp0.js +0 -12
  214. package/dist/chunks/index-CUgiXqyk.js +0 -4
  215. package/dist/chunks/index-C_ttE2g9.js +0 -16
  216. package/dist/chunks/index-CcgnA1uu.js +0 -29
  217. package/dist/chunks/index-Cd7aoWrX.js +0 -336
  218. package/dist/chunks/index-Ce-pMzBC.js +0 -19
  219. package/dist/chunks/index-CgYZ66P_.js +0 -187
  220. package/dist/chunks/index-ChcHMeAS.js +0 -35
  221. package/dist/chunks/index-Cixdzvwd.js +0 -682
  222. package/dist/chunks/index-Clq0Fl19.js +0 -15
  223. package/dist/chunks/index-CtxTJnIm.js +0 -58
  224. package/dist/chunks/index-Cv1hWa_y.js +0 -242
  225. package/dist/chunks/index-D25buhRm.js +0 -79
  226. package/dist/chunks/index-D4DqJG5_.js +0 -16
  227. package/dist/chunks/index-D5GGFPcS.js +0 -251
  228. package/dist/chunks/index-D5kiHJpX.js +0 -413
  229. package/dist/chunks/index-DEjRiv5B.js +0 -1
  230. package/dist/chunks/index-DFZsXFsx.js +0 -19
  231. package/dist/chunks/index-DGauWNwV.js +0 -156
  232. package/dist/chunks/index-DIR0jr3f.js +0 -127
  233. package/dist/chunks/index-DNeagy5a.js +0 -65
  234. package/dist/chunks/index-DO0fmDR9.js +0 -2
  235. package/dist/chunks/index-DSitHBEh.js +0 -36
  236. package/dist/chunks/index-DW7ST0tB.js +0 -1
  237. package/dist/chunks/index-DWfFgEXE.js +0 -110
  238. package/dist/chunks/index-DX6WAtmo.js +0 -874
  239. package/dist/chunks/index-DaPfSuLu.js +0 -393
  240. package/dist/chunks/index-DbKlVm7y.js +0 -74
  241. package/dist/chunks/index-Dgi-m1K-.js +0 -1
  242. package/dist/chunks/index-Dh4uigJs.js +0 -454
  243. package/dist/chunks/index-DnYNK1mz.js +0 -8
  244. package/dist/chunks/index-DnierBep.js +0 -510
  245. package/dist/chunks/index-DnpSGM23.js +0 -213
  246. package/dist/chunks/index-DntY4deR.js +0 -41
  247. package/dist/chunks/index-Dp4A8k6C.js +0 -103
  248. package/dist/chunks/index-Dphpk5r2.js +0 -1
  249. package/dist/chunks/index-DrBrgF-v.js +0 -49
  250. package/dist/chunks/index-Dr_cqQ-_.js +0 -77
  251. package/dist/chunks/index-Dt-nBtrQ.js +0 -26
  252. package/dist/chunks/index-DwTj7cFr.js +0 -57
  253. package/dist/chunks/index-DyZVAYLv.js +0 -52
  254. package/dist/chunks/index-Hh597Yu6.js +0 -121
  255. package/dist/chunks/index-LxkAuMAA.js +0 -1
  256. package/dist/chunks/index-OaQhvPR1.js +0 -46
  257. package/dist/chunks/index-UPr2EvBX.js +0 -149
  258. package/dist/chunks/index-WvrCPen2.js +0 -367
  259. package/dist/chunks/index-cTXIVcWI.js +0 -45
  260. package/dist/chunks/index-caLn8cu1.js +0 -1603
  261. package/dist/chunks/index-jBse-XgU.js +0 -35
  262. package/dist/chunks/index-oTjafsfN.js +0 -25
  263. package/dist/chunks/index-qNmuI3RB.js +0 -149
  264. package/dist/chunks/index-qiqzy9MI.js +0 -23
  265. package/dist/chunks/index-siqJUhKa.js +0 -1
  266. package/dist/chunks/index-w-G9CFId.js +0 -1
  267. package/dist/chunks/index-x6SeA7x7.js +0 -405
  268. package/dist/chunks/loading-icon-DJQIjg97.js +0 -23
  269. package/dist/chunks/main-DUusfqrI.js +0 -18
  270. package/dist/chunks/main-Dp7wHHgP.js +0 -2882
  271. package/dist/chunks/property-DCYiZTFF.js +0 -5
  272. package/dist/chunks/register-Cc9zkA5F.js +0 -1
  273. package/dist/chunks/register-JwwMwdRf.js +0 -1273
  274. package/dist/chunks/search-C3raqgOD.js +0 -30
  275. package/dist/chunks/search-CIhxkVjj.js +0 -239
  276. package/dist/chunks/select-item-4aISXm0r.js +0 -76
  277. package/dist/chunks/select-item-DjoxYopL.js +0 -356
  278. package/dist/chunks/settings-BPOpwVkr.js +0 -594
  279. package/dist/chunks/settings-CK2vhfPu.js +0 -78
  280. package/dist/chunks/text-input-BygzMjjc.js +0 -371
  281. package/dist/chunks/text-input-cjcnMXO-.js +0 -68
  282. package/dist/chunks/tooltip-content-BjdZJ_Ui.js +0 -134
  283. package/dist/chunks/tooltip-content-DHyDYyOH.js +0 -3
  284. package/src/sass/carbon-icons.scss +0 -46
package/README.md CHANGED
@@ -1,332 +1,250 @@
1
1
  # Zooy
2
2
 
3
- A lightweight, event-driven JavaScript UI framework for building complex, interactive web applications. Zooy provides a component-based architecture with lifecycle management, declarative event handling, and powerful layout primitives.
3
+ Event-driven JavaScript UI framework for building complex web applications.
4
4
 
5
- ## Why "zooy"?
5
+ ## Installation
6
6
 
7
- Originally developed for **ThingZoo** (now marketed as **Connect**), an IoT platform designed to manage a "menagerie" of connected devices from around the world.
8
-
9
- The UI framework evolved from:
10
- - **zoo-ui** → The UI library for managing things
11
- - **zoo-youeye** → Phonetic play on pronunciation
12
- - **zooy** → Final form
13
-
14
- The name reflects the framework's core purpose: orchestrating diverse UI components (panels, views, splits) and managing different component libraries (MDC, Carbon, custom) — just as a zoo manages diverse creatures.
15
-
16
- ## Overview
17
-
18
- Zooy is a UI framework that emphasizes:
19
- - **Component lifecycle management** - Automatic cleanup of event listeners and resources
20
- - **Event-driven architecture** - Components communicate through a standardized event system
21
- - **Declarative UI patterns** - HTML-driven component initialization and interaction
22
- - **Progressive enhancement** - Works with server-rendered HTML
23
- - **Pluggable component libraries** - Support for multiple UI libraries (MDC, Carbon Design System, custom components)
24
- - **Lazy loading** - Dynamic imports reduce initial bundle size
25
-
26
- ## Architecture
7
+ ```bash
8
+ npm install @trintel/zooy
9
+ ```
27
10
 
28
- ### Core Hierarchy
11
+ ## Core Architecture
29
12
 
30
13
  ```
31
- EVT (Event Target)
14
+ Evt (Event Target)
32
15
  └─ Component
33
16
  ├─ Panel
34
17
  │ └─ FormPanel
35
18
  ├─ Dragger
36
19
  └─ Split
37
20
 
38
- EVT
21
+ Evt
39
22
  ├─ View
40
23
  └─ Conductor
41
24
 
42
25
  ComponentLibraryRegistry (Static)
43
- ├─ MDC Library (Material Design Components)
44
- └─ Carbon Library (IBM Carbon Design System)
26
+ ├─ MDC Library
27
+ └─ Carbon Library
45
28
  ```
46
29
 
47
- ### Key Concepts
30
+ ## Core Concepts
31
+
32
+ ### Evt
33
+
34
+ Base class extending `EventTarget` with lifecycle-aware listener management.
48
35
 
49
- #### **EVT** - Event System Foundation
50
- Base class that extends `EventTarget` with enhanced listener management:
36
+ **Features:**
51
37
  - Automatic listener cleanup on disposal
52
- - Observer pattern for managing component relationships
38
+ - Observer pattern for component relationships
53
39
  - Interval tracking with automatic cleanup
54
- - Debug mode for development
55
-
56
- #### **Component** - UI Building Block
57
- Base class for all visual components:
58
- - DOM lifecycle management (create, render, enter/exit document)
59
- - Parent-child component hierarchy
60
- - Target-based rendering (components can render into any container)
61
- - Model binding for data association
62
- - Placeholder DOM for async loading states
63
- - Out-of-tree element management (for portals/hoisted elements)
64
-
65
- #### **Panel** - Content Container
66
- Specialized component for dynamic content:
67
- - URI-based content fetching and rendering
68
- - Query parameter management
69
- - Server-side HTML template rendering
70
- - Script and module evaluation
71
- - Form interception and AJAX submission
72
- - Component library auto-initialization (pluggable)
73
- - Async content population with intervals
74
- - Partial DOM replacement for live updates
75
-
76
- #### **ComponentLibraryRegistry** - Pluggable UI Libraries
77
- Central registry system for component libraries:
78
- - Register multiple UI libraries (MDC, Carbon, custom)
79
- - Lazy-load libraries via dynamic imports
80
- - Automatic component initialization when panels render
81
- - Import caching for performance
82
- - Library-specific lifecycle hooks (render, dispose)
83
- - No library lock-in - use what fits your needs
84
-
85
- #### **FormPanel** - Form Management
86
- Enhanced panel for form handling:
87
- - HTML5 constraint validation
88
- - Field-level error display
89
- - Submit interception for AJAX posting
90
- - Server response processing
91
- - Form refresh and replacement
92
- - Success/error callback handling
93
40
 
94
- #### **View** - Panel Orchestrator
95
- Manages multiple panels as a cohesive screen:
96
- - Panel lifecycle management
97
- - Event routing between panels
98
- - Split component integration for layouts
99
- - User context injection
100
- - Browser history recording
101
- - View switching coordination
102
- - Data broadcasting to all panels
103
- - Metadata storage for view state
104
-
105
- #### **Conductor** - Application Controller
106
- Top-level orchestrator for the entire application:
107
- - View lifecycle management (one active view at a time)
108
- - Browser history integration (back/forward navigation)
109
- - View constructor registration
110
- - Navigation routing
111
- - User session management
112
- - View transition coordination
41
+ ### Component
113
42
 
114
- #### **Split** - Resizable Layouts
115
- Sophisticated layout component for dividing space:
116
- - Horizontal (EW) and vertical (NS) orientations
117
- - Nested splitting (recursive division)
118
- - Draggable dividers with Dragger components
119
- - Programmatic nest control (open, close, lock, unlock)
120
- - Animated transitions
121
- - State management for each nest
122
- - Event dispatching for layout changes
43
+ Base class for UI components with DOM lifecycle management.
123
44
 
124
- #### **Dragger** - Drag Functionality
125
- Component for creating draggable elements:
126
- - Constrained movement (X, Y, or both)
127
- - Touch and mouse event support
128
- - Drag start/move/end events with delta tracking
129
- - Lock/unlock state management
130
- - Customizable drag handles
45
+ **Features:**
46
+ - Parent-child hierarchy
47
+ - Target-based rendering
48
+ - Model binding
49
+ - Placeholder support for async loading
131
50
 
132
- ## Key Capabilities
133
-
134
- ### 1. Component Lifecycle
135
- Components follow a predictable lifecycle:
51
+ **Lifecycle:**
136
52
  ```javascript
137
- const panel = new Panel('/api/content');
138
- panel.target = document.getElementById('container');
139
- panel.render(); // Creates DOM → Enters document → Fires READY event
140
- // ... use component ...
141
- panel.dispose(); // Exits document → Cleans up listeners → Removes DOM
53
+ const component = new Component();
54
+ component.target = document.getElementById('container');
55
+ component.render(); // Creates DOM → Enters document → Fires READY event
56
+ component.dispose(); // Exits document Cleans up → Removes DOM
142
57
  ```
143
58
 
144
- ### 2. Event-Driven Communication
145
- Components communicate through standardized events:
146
- ```javascript
147
- // Panel dispatches event
148
- panel.dispatchPanelEvent('custom_action', { data: 'value' });
59
+ ### Panel
149
60
 
150
- // View listens and handles
151
- view.mapPanEv('custom_action', (eventData, panel) => {
152
- console.log('Panel action:', eventData.data);
153
- });
154
- ```
61
+ Component for dynamic, URI-based content.
155
62
 
156
- ### 3. Declarative HTML Patterns
157
- Zooy enhances HTML with data attributes for interactions:
158
- ```html
159
- <!-- Button with custom event -->
160
- <button class="zoo__button" data-zv="save" data-pk="123">Save</button>
161
-
162
- <!-- Form with interception -->
163
- <form class="intercept_submit" data-zv="search" data-href="/api/search">
164
- <input name="q" />
165
- </form>
166
-
167
- <!-- Async content loading -->
168
- <div class="zoo_async_html" data-href="/api/widget"></div>
169
-
170
- <!-- Toggle class interaction -->
171
- <button class="zoo__toggle_class_driver"
172
- data-toggle_class_target_id="menu"
173
- data-toggle_class="open">
174
- Toggle Menu
175
- </button>
176
- ```
63
+ **Features:**
64
+ - URI-based content fetching
65
+ - Query parameter management
66
+ - Server-side HTML rendering
67
+ - Script evaluation
68
+ - Form interception
69
+ - Component library auto-initialization
70
+ - Partial DOM updates
177
71
 
178
- ### 4. URI-Based Content
179
- Panels can load content from URIs with query parameter management:
72
+ **Usage:**
180
73
  ```javascript
181
- const panel = new Panel('/api/data?page=1');
74
+ const panel = new Panel('/api/content');
182
75
  panel.addToQParams('filter', 'active');
183
- panel.renderWithTemplate(); // Fetches: /api/data?page=1&filter=active
76
+ panel.render();
184
77
  ```
185
78
 
186
- ### 5. Form Handling
187
- FormPanel provides validation and AJAX submission:
79
+ ### FormPanel
80
+
81
+ Enhanced panel for form handling.
82
+
83
+ **Features:**
84
+ - HTML5 validation
85
+ - Field-level error display
86
+ - AJAX submission
87
+ - Server response processing
88
+
89
+ **Usage:**
188
90
  ```javascript
189
91
  const form = new FormPanel('/api/form');
190
92
  form.onSubmitSuccess((panel, response) => {
191
- console.log('Form submitted successfully:', response);
93
+ console.log('Submitted:', response);
192
94
  });
193
95
  form.render();
194
96
  ```
195
97
 
196
- ### 6. Resizable Layouts
197
- Split component creates complex, resizable layouts:
198
- ```javascript
199
- const split = new Split();
200
- split.render(document.getElementById('app'));
98
+ ### View
201
99
 
202
- // Create horizontal split: [A | B | C]
203
- split.addSplit(undefined, 'EW', 200, 200);
100
+ Orchestrator for multiple panels.
204
101
 
205
- // Nest A can now be split vertically
206
- split.addSplit(split.getNest('A'), 'NS', 100, 100);
207
- // Results in: [A1 | B | C]
208
- // [A2 | | ]
209
- // [A3 | | ]
102
+ **Features:**
103
+ - Panel lifecycle management
104
+ - Event routing between panels
105
+ - Split layout integration
106
+ - Browser history recording
210
107
 
211
- // Programmatic control
212
- split.open('A');
213
- split.close('C');
214
- split.toggle('B');
108
+ **Usage:**
109
+ ```javascript
110
+ class DashboardView extends View {
111
+ constructor() {
112
+ super();
113
+ this.addPanel('main', new Panel('/dashboard'));
114
+ this.mapPanEv('custom_action', this.handleAction);
115
+ }
116
+
117
+ handleAction(eventData, panel) {
118
+ // Handle panel events
119
+ }
120
+ }
215
121
  ```
216
122
 
217
- ### 7. Navigation & History
218
- Conductor manages application navigation with history:
123
+ ### Conductor
124
+
125
+ Top-level application controller.
126
+
127
+ **Features:**
128
+ - View lifecycle management
129
+ - Browser history integration
130
+ - Navigation routing
131
+ - User session management
132
+
133
+ **Usage:**
219
134
  ```javascript
220
135
  const conductor = new Conductor();
136
+ conductor.registerViewConstructor('dashboard', (pk) => new DashboardView(pk));
137
+ conductor.switchView(new DashboardView());
138
+ ```
221
139
 
222
- // Register view constructors
223
- conductor.registerViewConstructor('dashboard', (pk, data) => {
224
- return new DashboardView(pk, data);
225
- });
140
+ ### Split
226
141
 
227
- // Switch views (records history)
228
- conductor.switchView(new DashboardView());
142
+ Resizable layout component.
229
143
 
230
- // Browser back/forward automatically handled
144
+ **Features:**
145
+ - Horizontal (EW) and vertical (NS) orientations
146
+ - Nested splitting
147
+ - Draggable dividers
148
+ - Programmatic control
149
+ - Animated transitions
150
+
151
+ **Usage:**
152
+ ```javascript
153
+ const split = new Split();
154
+ split.render(document.getElementById('app'));
155
+ split.addSplit(undefined, 'EW', 200, 200); // [A | B | C]
156
+ split.addSplit(split.getNest('A'), 'NS', 100, 100); // Split A vertically
231
157
  ```
232
158
 
233
- ### 8. Component Library Registration
234
- Register UI libraries at application startup:
159
+ ### Dragger
160
+
161
+ Component for draggable elements.
162
+
163
+ **Features:**
164
+ - Constrained movement (X, Y, or both)
165
+ - Touch and mouse support
166
+ - Drag events with delta tracking
167
+
168
+ ## Component Libraries
169
+
170
+ ### Registration
171
+
172
+ Register component libraries at application startup:
173
+
235
174
  ```javascript
236
- import zooy from 'zooy';
175
+ import { registerMdcLibrary, registerCarbonLibrary } from '@trintel/zooy';
237
176
 
238
- const entryFunc = async (user) => {
239
- // Register component libraries (lazy-loaded)
240
- await zooy.registerMdcLibrary(); // Material Design Components
241
- await zooy.registerCarbonLibrary(); // IBM Carbon Design System
177
+ const init = async () => {
178
+ await registerMdcLibrary(); // Material Design Components
179
+ await registerCarbonLibrary(); // IBM Carbon Design System
242
180
 
243
- // Now render your application
181
+ // Render application
244
182
  const view = new MyView();
245
183
  view.render();
246
184
  };
247
185
  ```
248
186
 
249
- ### 9. Material Design Components
250
- MDC components automatically initialize when panels render:
251
- ```html
252
- <button class="mdc-button">
253
- <span class="mdc-button__label">Click Me</span>
254
- </button>
255
-
256
- <ul class="mdc-list mdc-tree">
257
- <li class="mdc-list-item">Tree Item 1</li>
258
- <li class="mdc-list-item">Tree Item 2</li>
259
- </ul>
260
- <!-- Panel.parseContent() automatically initializes all MDC components -->
261
- ```
262
-
263
- ### 10. Carbon Design System
264
- Carbon Web Components load dynamically as needed:
265
- ```html
266
- <!-- Use data-carbon-component to specify which component to load -->
267
- <div data-carbon-component="button">
268
- <cds-button>Click Me</cds-button>
269
- </div>
270
-
271
- <div data-carbon-component="accordion">
272
- <cds-accordion>
273
- <cds-accordion-item title="Section 1">
274
- Content here
275
- </cds-accordion-item>
276
- </cds-accordion>
277
- </div>
278
- <!-- Components are imported dynamically and cached for performance -->
279
- ```
187
+ ### ComponentLibraryRegistry
280
188
 
281
- ## Why Pluggable Component Libraries?
189
+ Central registry for UI libraries.
282
190
 
283
- The ComponentLibraryRegistry architecture provides several key benefits:
191
+ **Features:**
192
+ - Multiple library support
193
+ - Lazy loading via dynamic imports
194
+ - Import caching
195
+ - Library-specific lifecycle hooks
284
196
 
285
- ### 🎯 **No Library Lock-in**
286
- Use MDC, Carbon, or build custom components — zooy doesn't care. Mix and match as needed.
197
+ **Benefits:**
198
+ - No library lock-in
199
+ - Smaller initial bundles
200
+ - Gradual migration support
201
+ - Framework evolution flexibility
287
202
 
288
- ### 📦 **Smaller Initial Bundles**
289
- Component libraries load on-demand via dynamic imports:
203
+ **Bundle Sizes:**
290
204
  - Core framework: ~101KB (~27KB gzipped)
291
205
  - MDC library: +463KB (~62KB gzipped, only if registered)
292
206
  - Carbon library: +34KB (~7KB gzipped, only if registered)
293
- - Individual Carbon components: Loaded as panels use them
294
207
 
295
- ### 🔄 **Gradual Migration**
296
- Migrate from one component library to another incrementally:
297
- 1. Register both libraries
298
- 2. Existing panels continue using MDC
299
- 3. New panels use Carbon
300
- 4. Replace components one-by-one
301
- 5. Eventually remove MDC registration
208
+ ### Material Design Components
302
209
 
303
- ### 🧩 **Framework Evolution**
304
- As component libraries evolve (MDC → Material Web Components), zooy's architecture remains stable. Just swap the registration module.
210
+ MDC components auto-initialize when panels render:
305
211
 
306
- ### 🚀 **Performance**
307
- - Import caching prevents duplicate downloads
308
- - Only load components actually used in your app
309
- - Lazy loading reduces time-to-interactive
212
+ ```html
213
+ <button class="mdc-button">
214
+ <span class="mdc-button__label">Click Me</span>
215
+ </button>
310
216
 
311
- ## Integration Notes
217
+ <ul class="mdc-list mdc-tree">
218
+ <li class="mdc-list-item">Item 1</li>
219
+ </ul>
220
+ ```
312
221
 
313
- ### Carbon Design System Theming
222
+ ### Carbon Design System
314
223
 
315
- If your application imports `@carbon/styles` for theming (e.g., to customize Carbon component styles), you'll need to handle font path configuration:
224
+ Carbon Web Components load dynamically:
316
225
 
317
- **The Issue**: Carbon's default configuration uses Webpack-style paths (`~@ibm/plex`) that don't work with vanilla Sass compilation.
226
+ ```html
227
+ <cds-button>Click Me</cds-button>
228
+
229
+ <cds-accordion>
230
+ <cds-accordion-item title="Section 1">
231
+ Content
232
+ </cds-accordion-item>
233
+ </cds-accordion>
234
+ ```
318
235
 
319
- **Solution**: Override the font path when importing Carbon styles in your application's SCSS:
236
+ **Carbon Theming:**
237
+
238
+ If importing `@carbon/styles` for theming, configure font paths:
320
239
 
321
240
  ```scss
322
- // In your application's theme file
241
+ // Your application's theme file
323
242
  @use '@carbon/styles' as * with (
324
243
  $font-path: '../path/to/node_modules/@ibm/plex'
325
244
  );
326
245
  ```
327
246
 
328
- **Required Dependencies**: Your application's `package.json` should include:
329
-
247
+ **Required dependencies:**
330
248
  ```json
331
249
  {
332
250
  "dependencies": {
@@ -336,72 +254,62 @@ If your application imports `@carbon/styles` for theming (e.g., to customize Car
336
254
  }
337
255
  ```
338
256
 
339
- **Path Calculation**: The `$font-path` should be relative from your CSS output location to the font files:
340
- - CSS output: `/static/css/theme.css`
341
- - Font files: `/static/js/node_modules/@ibm/plex/...`
342
- - Correct path: `../js/node_modules/@ibm/plex`
343
-
344
- **Note**: Zooy itself only imports Carbon Web Components (JavaScript), not the Carbon styles (CSS). CSS theming is the responsibility of the implementing application, allowing full control over design tokens, typography, and component styling.
257
+ **Note:** Zooy imports Carbon Web Components (JavaScript only). CSS theming is the application's responsibility.
345
258
 
346
- ### Carbon Icons
259
+ ### Zoo Components
347
260
 
348
- **⚠️ Deprecated: Client-side placeholder loading has been removed.**
261
+ Native zooy components styled via CSS custom properties.
349
262
 
350
- Zooy previously supported client-side icon placeholder loading (`[data-carbon-icon]`), but this has been removed in favor of server-side rendering for better performance and simplicity.
351
-
352
- **For Django applications**: Use [django-zooy](https://github.com/trinity-telecomms/django-zooy) which provides server-side icon rendering:
263
+ **Usage:**
264
+ ```html
265
+ <zoo-tag token="52">Activated</zoo-tag>
266
+ ```
353
267
 
354
- ```django
355
- {% load carbon %}
356
- {% carbon_icon "add" 16 slot="icon" %}
357
- <!-- Renders: <svg xmlns="..."><path d="..."/></svg> -->
268
+ **Styling:**
269
+ ```scss
270
+ :root {
271
+ --zoo-tag-52-bg: #4fb50b;
272
+ --zoo-tag-52-fg: #ffffff;
273
+ }
358
274
  ```
359
275
 
360
- **Benefits of server-side rendering**:
361
- - ✅ No JavaScript required
362
- - ✅ No network requests
363
- - ✅ No placeholders or flicker
364
- - ✅ Works without JS (progressive enhancement)
365
- - ✅ Instant rendering
276
+ ## Event-Driven Architecture
366
277
 
367
- **For non-Django applications**: The programmatic icon API (`icons-api.js`) is still available for runtime icon generation if needed:
278
+ Components communicate through standardized events:
368
279
 
369
280
  ```javascript
370
- import zooy from 'zooy';
281
+ // Panel dispatches event
282
+ panel.dispatchPanelEvent('custom_action', { data: 'value' });
371
283
 
372
- // Create icon programmatically
373
- const iconSvg = await zooy.icons.createIcon('add', 16, { slot: 'icon' });
374
- document.body.appendChild(iconSvg);
284
+ // View listens and handles
285
+ view.mapPanEv('custom_action', (eventData, panel) => {
286
+ console.log('Panel action:', eventData.data);
287
+ });
375
288
  ```
376
289
 
377
- However, server-side rendering (in templates/build step) is strongly recommended over runtime generation.
378
-
379
- ## Development
290
+ ## Declarative HTML Patterns
380
291
 
381
- ### Prerequisites
382
- - Node.js and npm
383
- - Modern browser with ES6+ support
292
+ Zooy enhances HTML with data attributes:
384
293
 
385
- ### Setup
386
- ```bash
387
- npm install
388
- ```
389
-
390
- ### Linting
391
- ```bash
392
- npm run lint # Check for issues
393
- npm run lint:fix # Auto-fix issues
394
- ```
294
+ ```html
295
+ <!-- Button with custom event -->
296
+ <button class="zoo__button" data-zv="save" data-pk="123">Save</button>
395
297
 
396
- ### Pre-commit Hooks
397
- Husky is configured to run linting before each commit, ensuring code quality.
298
+ <!-- Form interception -->
299
+ <form class="intercept_submit" data-zv="search" data-href="/api/search">
300
+ <input name="q" />
301
+ </form>
398
302
 
399
- ## Code Quality
303
+ <!-- Async content -->
304
+ <div class="zoo_async_html" data-href="/api/widget"></div>
400
305
 
401
- - **ESLint** - Modern flat config with strict rules
402
- - **JSDoc** - Complete documentation for all core components
403
- - **Type annotations** - Comprehensive JSDoc types for IDE support
404
- - **Pre-commit hooks** - Automatic linting before commits
306
+ <!-- Toggle class -->
307
+ <button class="zoo__toggle_class_driver"
308
+ data-toggle_class_target_id="menu"
309
+ data-toggle_class="open">
310
+ Toggle Menu
311
+ </button>
312
+ ```
405
313
 
406
314
  ## Project Structure
407
315
 
@@ -409,63 +317,100 @@ Husky is configured to run linting before each commit, ensuring code quality.
409
317
  zooy/
410
318
  ├── src/
411
319
  │ ├── ui/ # Core UI components
412
- │ │ ├── evt.js # Event system base class
413
- │ │ ├── component.js # Component base class
414
- │ │ ├── panel.js # Content panel (library-agnostic)
415
- │ │ ├── form.js # Form panel with validation
320
+ │ │ ├── evt.js # Event system base
321
+ │ │ ├── component.js # Component base
322
+ │ │ ├── panel.js # Content panel
323
+ │ │ ├── form.js # Form panel
416
324
  │ │ ├── view.js # Panel orchestrator
417
325
  │ │ ├── conductor.js # Application controller
418
326
  │ │ ├── split.js # Resizable layouts
419
327
  │ │ ├── dragger.js # Drag functionality
420
- │ │ ├── component-library-registry.js # Component library registry
421
- │ │ ├── handlers/ # Event handler collections
422
- │ │ ├── mdc/ # Material Design Components
423
- │ │ │ ├── register.js # MDC registration (lazy-loaded)
424
- │ │ │ └── tree-utils.js # MDC tree utilities
425
- │ │ ├── carbon/ # IBM Carbon Design System
426
- │ │ │ ├── register.js # Carbon registration (lazy-loaded)
427
- │ │ │ ├── renderers.js # Dynamic component loading
428
- │ │ │ └── icons-api.js # Programmatic icon API
429
- │ │ └── zoo/ # Custom Zooy components
328
+ │ │ ├── component-library-registry.js
329
+ │ │ ├── handlers/ # Event handlers
330
+ │ │ ├── mdc/ # MDC integration
331
+ │ │ │ ├── register.js
332
+ │ │ │ └── tree-utils.js
333
+ │ │ ├── carbon/ # Carbon integration
334
+ │ │ │ ├── register.js
335
+ │ │ │ ├── renderers.js
336
+ │ │ │ └── components/
337
+ │ │ └── zoo/ # Native components
338
+ │ │ ├── attributes.js
339
+ │ │ └── components/
430
340
  │ ├── dom/ # DOM utilities
431
- │ ├── events/ # Event types and utilities
432
- │ ├── uri/ # URI parsing and manipulation
341
+ │ ├── events/ # Event types
342
+ │ ├── uri/ # URI utilities
433
343
  │ └── user/ # User management
434
- ├── dist/ # Build output (not committed)
435
- │ ├── zooy.es.js # ES module entry point
436
- │ ├── zooy.cjs.js # CommonJS entry point
437
- │ └── chunks/ # Code-split chunks
438
- │ ├── main-[hash].js # Main framework bundle (~101KB, 27KB gzipped)
439
- ├── register-[hash].js # MDC registration chunk (~463KB, 62KB gzipped)
440
- │ └── register-[hash].js # Carbon registration chunk (~34KB, 7KB gzipped)
441
- ├── docs/ # Documentation
442
- │ ├── architecture/ # Architecture docs
443
- │ ├── migration/ # Migration guides
444
- │ └── guides/ # Usage guides
445
- ├── vite.config.js # Build configuration
446
- ├── eslint.config.js # ESLint configuration
447
- └── package.json # Project dependencies
344
+ ├── dist/ # Build output
345
+ │ ├── zooy.es.js
346
+ │ ├── zooy.cjs.js
347
+ │ └── chunks/
348
+ └── sass/ # SASS source files
349
+ ├── main.scss
350
+ ├── split.scss
351
+ └── carbon.scss
352
+ ```
353
+
354
+ ## Exports
355
+
356
+ ```javascript
357
+ import zooy from '@trintel/zooy';
358
+
359
+ // Main exports
360
+ zooy.Evt
361
+ zooy.Component
362
+ zooy.Panel
363
+ zooy.FormPanel
364
+ zooy.View
365
+ zooy.Conductor
366
+ zooy.Split
367
+ zooy.Dragger
368
+ zooy.UserManager
369
+ zooy.DataBinder
370
+ zooy.ComponentLibraryRegistry
371
+ zooy.registerCarbonLibrary
372
+ zooy.registerMdcLibrary
373
+ zooy.domUtils
374
+ zooy.uriUtils
375
+ zooy.handlers
376
+ zooy.zoo
377
+
378
+ // SASS exports
379
+ import '@trintel/zooy/sass'; // Main SASS entry point
448
380
  ```
449
381
 
450
- ## Contributing
382
+ ## Development
451
383
 
452
- ### Code Style
453
- - Use single quotes for strings
454
- - 2-space indentation
455
- - Semicolons required
456
- - Strict equality (===) required
457
- - JSDoc for all public APIs
384
+ ### Setup
458
385
 
459
- ### Workflow
460
- 1. Make changes
461
- 2. Run `npm run lint:fix` to auto-fix issues
462
- 3. Commit (pre-commit hook runs linting automatically)
463
- 4. Submit pull request
386
+ ```bash
387
+ npm install
388
+ ```
389
+
390
+ ### Build
391
+
392
+ ```bash
393
+ npm run build
394
+ ```
395
+
396
+ ### Linting
397
+
398
+ ```bash
399
+ npm run lint # Check
400
+ npm run lint:fix # Auto-fix
401
+ ```
402
+
403
+ ### Pre-commit Hooks
404
+
405
+ Husky runs linting before commits.
406
+
407
+ ## Code Quality
464
408
 
465
- ## Contributors
466
- - Jan Badenhorst
467
- - Andries Niemandt
409
+ - ESLint with flat config
410
+ - JSDoc documentation
411
+ - Type annotations for IDE support
412
+ - Pre-commit hooks
468
413
 
469
414
  ## License
470
415
 
471
- [License information to be added]
416
+ Apache-2.0