@jasonshimmy/custom-elements-runtime 2.8.1 → 3.0.0

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 (91) hide show
  1. package/README.md +159 -46
  2. package/dist/css-utils-Cg4o1MqY.js +643 -0
  3. package/dist/css-utils-Cg4o1MqY.js.map +1 -0
  4. package/dist/css-utils-RqkyBWft.cjs +576 -0
  5. package/dist/css-utils-RqkyBWft.cjs.map +1 -0
  6. package/dist/custom-elements-runtime.cjs.js +3 -3
  7. package/dist/custom-elements-runtime.cjs.js.map +1 -1
  8. package/dist/custom-elements-runtime.dom-jit-css.cjs.js +7 -0
  9. package/dist/custom-elements-runtime.dom-jit-css.cjs.js.map +1 -0
  10. package/dist/custom-elements-runtime.dom-jit-css.es.js +136 -0
  11. package/dist/custom-elements-runtime.dom-jit-css.es.js.map +1 -0
  12. package/dist/custom-elements-runtime.es.js +70 -67
  13. package/dist/custom-elements-runtime.es.js.map +1 -1
  14. package/dist/custom-elements-runtime.event-bus.cjs.js +1 -1
  15. package/dist/custom-elements-runtime.event-bus.cjs.js.map +1 -1
  16. package/dist/custom-elements-runtime.event-bus.es.js +62 -46
  17. package/dist/custom-elements-runtime.event-bus.es.js.map +1 -1
  18. package/dist/custom-elements-runtime.jit-css.cjs.js +2 -0
  19. package/dist/custom-elements-runtime.jit-css.cjs.js.map +1 -0
  20. package/dist/custom-elements-runtime.jit-css.es.js +38 -0
  21. package/dist/custom-elements-runtime.jit-css.es.js.map +1 -0
  22. package/dist/custom-elements-runtime.router.cjs.js +20 -20
  23. package/dist/custom-elements-runtime.router.cjs.js.map +1 -1
  24. package/dist/custom-elements-runtime.router.es.js +448 -434
  25. package/dist/custom-elements-runtime.router.es.js.map +1 -1
  26. package/dist/custom-elements-runtime.ssr.cjs.js +1 -1
  27. package/dist/custom-elements-runtime.ssr.cjs.js.map +1 -1
  28. package/dist/custom-elements-runtime.ssr.es.js +33 -18
  29. package/dist/custom-elements-runtime.ssr.es.js.map +1 -1
  30. package/dist/custom-elements-runtime.store.cjs.js +1 -1
  31. package/dist/custom-elements-runtime.store.cjs.js.map +1 -1
  32. package/dist/custom-elements-runtime.store.es.js +21 -16
  33. package/dist/custom-elements-runtime.store.es.js.map +1 -1
  34. package/dist/custom-elements-runtime.transitions.cjs.js +1 -1
  35. package/dist/custom-elements-runtime.transitions.cjs.js.map +1 -1
  36. package/dist/custom-elements-runtime.transitions.es.js +279 -7
  37. package/dist/custom-elements-runtime.transitions.es.js.map +1 -1
  38. package/dist/custom-elements-runtime.vite-plugin.cjs.js +2 -0
  39. package/dist/custom-elements-runtime.vite-plugin.cjs.js.map +1 -0
  40. package/dist/custom-elements-runtime.vite-plugin.es.js +73 -0
  41. package/dist/custom-elements-runtime.vite-plugin.es.js.map +1 -0
  42. package/dist/dom-jit-css.d.ts +66 -0
  43. package/dist/event-bus.d.ts +3 -1
  44. package/dist/{namespace-helpers-DhLBqt-7.js → helpers-CweFZFWU.js} +265 -287
  45. package/dist/helpers-CweFZFWU.js.map +1 -0
  46. package/dist/helpers-DeWjSmOl.cjs +5 -0
  47. package/dist/helpers-DeWjSmOl.cjs.map +1 -0
  48. package/dist/hooks-BrrLKSub.cjs +3 -0
  49. package/dist/hooks-BrrLKSub.cjs.map +1 -0
  50. package/dist/hooks-DyShDHKo.js +403 -0
  51. package/dist/hooks-DyShDHKo.js.map +1 -0
  52. package/dist/index.d.ts +3 -3
  53. package/dist/jit-css.d.ts +30 -0
  54. package/dist/namespace-helpers-CnpZ5__p.js +45 -0
  55. package/dist/namespace-helpers-CnpZ5__p.js.map +1 -0
  56. package/dist/namespace-helpers-CyIDtI97.cjs +2 -0
  57. package/dist/namespace-helpers-CyIDtI97.cjs.map +1 -0
  58. package/dist/router/types.d.ts +4 -2
  59. package/dist/runtime/css-utils.d.ts +33 -0
  60. package/dist/runtime/discovery-state.d.ts +3 -0
  61. package/dist/runtime/hooks.d.ts +78 -0
  62. package/dist/runtime/jit-hooks.d.ts +28 -0
  63. package/dist/runtime/render-bridge.d.ts +37 -0
  64. package/dist/runtime/scheduler.d.ts +3 -4
  65. package/dist/runtime/secure-expression-evaluator.d.ts +0 -1
  66. package/dist/runtime/style.d.ts +84 -26
  67. package/dist/runtime/template-compiler/lru-cache.d.ts +0 -3
  68. package/dist/runtime/vdom-helpers.d.ts +0 -1
  69. package/dist/ssr.d.ts +42 -0
  70. package/dist/{transitions-DMJXs_tY.js → style-BmyOIMcU.js} +904 -1344
  71. package/dist/style-BmyOIMcU.js.map +1 -0
  72. package/dist/style-D40DsIqJ.cjs +55 -0
  73. package/dist/style-D40DsIqJ.cjs.map +1 -0
  74. package/dist/style.css +1 -1
  75. package/dist/template-compiler-B5uN1EQw.js +3731 -0
  76. package/dist/template-compiler-B5uN1EQw.js.map +1 -0
  77. package/dist/template-compiler-Cx623BSB.cjs +23 -0
  78. package/dist/template-compiler-Cx623BSB.cjs.map +1 -0
  79. package/dist/variables.css +1 -1
  80. package/dist/vite-plugin.d.ts +52 -0
  81. package/package.json +55 -6
  82. package/dist/namespace-helpers-Ctd_h7j2.cjs +0 -5
  83. package/dist/namespace-helpers-Ctd_h7j2.cjs.map +0 -1
  84. package/dist/namespace-helpers-DhLBqt-7.js.map +0 -1
  85. package/dist/template-compiler-CVBKYu3j.js +0 -3991
  86. package/dist/template-compiler-CVBKYu3j.js.map +0 -1
  87. package/dist/template-compiler-G8h2OJbA.cjs +0 -23
  88. package/dist/template-compiler-G8h2OJbA.cjs.map +0 -1
  89. package/dist/transitions-DMJXs_tY.js.map +0 -1
  90. package/dist/transitions-f4KfN29T.cjs +0 -330
  91. package/dist/transitions-f4KfN29T.cjs.map +0 -1
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("node:fs"),u=require("node:path"),h=require("./style-D40DsIqJ.cjs"),g="virtual:cer-jit-css",y="\0virtual:cer-jit-css";function m(S,s){s&&Object.keys(s).length>0&&h.enableJITCSS(s);const o=process.cwd(),l=[];for(const r of S){const t=i.globSync(r,{cwd:o}).map(c=>u.resolve(o,c));l.push(...t)}const v=[...new Set(l)],a=new Set;for(const r of v)try{const t=i.readFileSync(r,"utf-8"),c=h.extractClassesFromHTML(t);for(const e of c)a.add(e)}catch{}if(a.size===0)return"";const p=`<div class="${[...a].join(" ")}"></div>`;return h.jitCSS(p)}function C(S){const{content:s,output:o,virtualModule:l=!0,extendedColors:v,customColors:a,disableVariants:p}=S,r={extendedColors:v,customColors:a,disableVariants:p};let t="",c=null;return{name:"cer-jit-css",buildStart(){const e=process.cwd(),f=new Set;for(const d of s)i.globSync(d,{cwd:e}).forEach(n=>f.add(u.resolve(e,n)));if(c=f,t=m(s,r),o){const d=u.resolve(process.cwd(),o);i.mkdirSync(u.dirname(d),{recursive:!0}),i.writeFileSync(d,t,"utf-8")}},resolveId(e){if(l&&e===g)return y},load(e){if(e===y)return`export default ${JSON.stringify(t)};`},handleHotUpdate({file:e,server:f}){if(c?.has(e)??!1){if(t=m(s,r),o){const n=u.resolve(process.cwd(),o);i.writeFileSync(n,t,"utf-8")}if(l){const n=f,w=n.moduleGraph.getModuleById(y);w&&n.reloadModule(w)}}}}}exports.cerJITCSS=C;
2
+ //# sourceMappingURL=custom-elements-runtime.vite-plugin.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-elements-runtime.vite-plugin.cjs.js","sources":["../src/lib/vite-plugin.ts"],"sourcesContent":["/**\n * Vite plugin for build-time JIT CSS generation.\n *\n * Scans source files for utility class names and emits pre-generated CSS,\n * eliminating all runtime parsing cost for projects with static class lists.\n *\n * @example\n * ```ts\n * // vite.config.ts\n * import { defineConfig } from 'vite';\n * import { cerJITCSS } from '@jasonshimmy/custom-elements-runtime/vite-plugin';\n *\n * export default defineConfig({\n * plugins: [\n * cerJITCSS({\n * content: ['./src/**\\/*.{ts,tsx,html}'],\n * output: 'src/generated-jit.css',\n * extendedColors: true,\n * }),\n * ],\n * });\n * ```\n */\n\nimport type { Plugin } from 'vite';\nimport { readFileSync, writeFileSync, mkdirSync, globSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport {\n jitCSS,\n enableJITCSS,\n extractClassesFromHTML,\n type JITCSSOptions,\n} from './runtime/style';\n\n// --- Re-export extractClassesFromHTML for plugin consumers ---\n\n/**\n * Options for the `cerJITCSS` Vite plugin.\n */\nexport interface CerJITCSSPluginOptions extends JITCSSOptions {\n /**\n * Glob patterns (relative to `process.cwd()`) that identify which source\n * files the plugin should scan for utility class names.\n *\n * @example `['./src/**\\/*.{ts,html}', './index.html']`\n */\n content: string[];\n /**\n * File path (relative to `process.cwd()`) where the generated CSS will\n * be written. When omitted the plugin only emits a virtual module.\n */\n output?: string;\n /**\n * Whether to emit a virtual module `virtual:cer-jit-css` that resolves to\n * the generated CSS text. Defaults to `true`.\n */\n virtualModule?: boolean;\n}\n\nconst VIRTUAL_ID = 'virtual:cer-jit-css';\nconst RESOLVED_VIRTUAL_ID = '\\0virtual:cer-jit-css';\n\nfunction generateFromFiles(\n contentPatterns: string[],\n jitOptions: JITCSSOptions,\n): string {\n if (jitOptions && Object.keys(jitOptions).length > 0) {\n enableJITCSS(jitOptions);\n }\n\n const cwd = process.cwd();\n const files: string[] = [];\n\n for (const pattern of contentPatterns) {\n const matches = globSync(pattern, { cwd }).map((f) => resolve(cwd, f));\n files.push(...matches);\n }\n\n // Deduplicate files\n const uniqueFiles = [...new Set(files)];\n\n // Aggregate all class names across all files\n const allClasses = new Set<string>();\n\n for (const file of uniqueFiles) {\n try {\n const content = readFileSync(file, 'utf-8');\n const classes = extractClassesFromHTML(content);\n for (const cls of classes) allClasses.add(cls);\n } catch {\n // Skip unreadable files\n }\n }\n\n if (allClasses.size === 0) return '';\n\n // Build a fake HTML string containing all discovered classes so jitCSS()\n // can process the full set in one pass.\n const fakeHTML = `<div class=\"${[...allClasses].join(' ')}\"></div>`;\n return jitCSS(fakeHTML);\n}\n\n/**\n * Vite plugin that performs a build-time scan of source files and emits\n * pre-generated JIT CSS as a file and/or `virtual:cer-jit-css` module.\n */\nexport function cerJITCSS(options: CerJITCSSPluginOptions): Plugin {\n const {\n content,\n output,\n virtualModule = true,\n extendedColors,\n customColors,\n disableVariants,\n } = options;\n\n const jitOptions: JITCSSOptions = {\n extendedColors,\n customColors,\n disableVariants,\n };\n\n let generatedCSS = '';\n // Resolved file set built in buildStart and reused in handleHotUpdate to\n // avoid re-running globSync for every HMR file-change event.\n let watchedFiles: Set<string> | null = null;\n\n return {\n name: 'cer-jit-css',\n\n buildStart() {\n const cwd = process.cwd();\n const resolved = new Set<string>();\n for (const pattern of content) {\n globSync(pattern, { cwd }).forEach((f) => resolved.add(resolve(cwd, f)));\n }\n watchedFiles = resolved;\n\n generatedCSS = generateFromFiles(content, jitOptions);\n\n if (output) {\n const outputPath = resolve(process.cwd(), output);\n mkdirSync(dirname(outputPath), { recursive: true });\n writeFileSync(outputPath, generatedCSS, 'utf-8');\n }\n },\n\n resolveId(id: string) {\n if (virtualModule && id === VIRTUAL_ID) {\n return RESOLVED_VIRTUAL_ID;\n }\n return undefined;\n },\n\n load(id: string) {\n if (id === RESOLVED_VIRTUAL_ID) {\n return `export default ${JSON.stringify(generatedCSS)};`;\n }\n return undefined;\n },\n\n handleHotUpdate({ file, server }: { file: string; server: unknown }) {\n // Re-generate when a watched source file changes.\n // Use the cached file set from buildStart to avoid re-globbing.\n const isWatched = watchedFiles?.has(file) ?? false;\n\n if (!isWatched) return;\n\n generatedCSS = generateFromFiles(content, jitOptions);\n\n if (output) {\n const outputPath = resolve(process.cwd(), output);\n writeFileSync(outputPath, generatedCSS, 'utf-8');\n }\n\n if (virtualModule) {\n // Invalidate the virtual module so HMR triggers a reload\n const viteServer = server as {\n moduleGraph: { getModuleById: (id: string) => unknown };\n reloadModule: (mod: unknown) => void;\n };\n const mod = viteServer.moduleGraph.getModuleById(RESOLVED_VIRTUAL_ID);\n if (mod) viteServer.reloadModule(mod);\n }\n },\n };\n}\n"],"names":["VIRTUAL_ID","RESOLVED_VIRTUAL_ID","generateFromFiles","contentPatterns","jitOptions","enableJITCSS","cwd","files","pattern","matches","globSync","f","resolve","uniqueFiles","allClasses","file","content","readFileSync","classes","extractClassesFromHTML","cls","fakeHTML","jitCSS","cerJITCSS","options","output","virtualModule","extendedColors","customColors","disableVariants","generatedCSS","watchedFiles","resolved","outputPath","mkdirSync","dirname","writeFileSync","id","server","viteServer","mod"],"mappings":"oKA2DMA,EAAa,sBACbC,EAAsB,wBAE5B,SAASC,EACPC,EACAC,EACQ,CACJA,GAAc,OAAO,KAAKA,CAAU,EAAE,OAAS,GACjDC,EAAAA,aAAaD,CAAU,EAGzB,MAAME,EAAM,QAAQ,IAAA,EACdC,EAAkB,CAAA,EAExB,UAAWC,KAAWL,EAAiB,CACrC,MAAMM,EAAUC,EAAAA,SAASF,EAAS,CAAE,IAAAF,CAAA,CAAK,EAAE,IAAKK,GAAMC,EAAAA,QAAQN,EAAKK,CAAC,CAAC,EACrEJ,EAAM,KAAK,GAAGE,CAAO,CACvB,CAGA,MAAMI,EAAc,CAAC,GAAG,IAAI,IAAIN,CAAK,CAAC,EAGhCO,MAAiB,IAEvB,UAAWC,KAAQF,EACjB,GAAI,CACF,MAAMG,EAAUC,EAAAA,aAAaF,EAAM,OAAO,EACpCG,EAAUC,EAAAA,uBAAuBH,CAAO,EAC9C,UAAWI,KAAOF,EAASJ,EAAW,IAAIM,CAAG,CAC/C,MAAQ,CAER,CAGF,GAAIN,EAAW,OAAS,EAAG,MAAO,GAIlC,MAAMO,EAAW,eAAe,CAAC,GAAGP,CAAU,EAAE,KAAK,GAAG,CAAC,WACzD,OAAOQ,EAAAA,OAAOD,CAAQ,CACxB,CAMO,SAASE,EAAUC,EAAyC,CACjE,KAAM,CACJ,QAAAR,EACA,OAAAS,EACA,cAAAC,EAAgB,GAChB,eAAAC,EACA,aAAAC,EACA,gBAAAC,CAAA,EACEL,EAEEpB,EAA4B,CAChC,eAAAuB,EACA,aAAAC,EACA,gBAAAC,CAAA,EAGF,IAAIC,EAAe,GAGfC,EAAmC,KAEvC,MAAO,CACL,KAAM,cAEN,YAAa,CACX,MAAMzB,EAAM,QAAQ,IAAA,EACd0B,MAAe,IACrB,UAAWxB,KAAWQ,EACpBN,EAAAA,SAASF,EAAS,CAAE,IAAAF,CAAA,CAAK,EAAE,QAASK,GAAMqB,EAAS,IAAIpB,EAAAA,QAAQN,EAAKK,CAAC,CAAC,CAAC,EAMzE,GAJAoB,EAAeC,EAEfF,EAAe5B,EAAkBc,EAASZ,CAAU,EAEhDqB,EAAQ,CACV,MAAMQ,EAAarB,EAAAA,QAAQ,QAAQ,IAAA,EAAOa,CAAM,EAChDS,EAAAA,UAAUC,EAAAA,QAAQF,CAAU,EAAG,CAAE,UAAW,GAAM,EAClDG,gBAAcH,EAAYH,EAAc,OAAO,CACjD,CACF,EAEA,UAAUO,EAAY,CACpB,GAAIX,GAAiBW,IAAOrC,EAC1B,OAAOC,CAGX,EAEA,KAAKoC,EAAY,CACf,GAAIA,IAAOpC,EACT,MAAO,kBAAkB,KAAK,UAAU6B,CAAY,CAAC,GAGzD,EAEA,gBAAgB,CAAE,KAAAf,EAAM,OAAAuB,GAA6C,CAKnE,GAFkBP,GAAc,IAAIhB,CAAI,GAAK,GAM7C,IAFAe,EAAe5B,EAAkBc,EAASZ,CAAU,EAEhDqB,EAAQ,CACV,MAAMQ,EAAarB,EAAAA,QAAQ,QAAQ,IAAA,EAAOa,CAAM,EAChDW,gBAAcH,EAAYH,EAAc,OAAO,CACjD,CAEA,GAAIJ,EAAe,CAEjB,MAAMa,EAAaD,EAIbE,EAAMD,EAAW,YAAY,cAActC,CAAmB,EAChEuC,GAAKD,EAAW,aAAaC,CAAG,CACtC,EACF,CAAA,CAEJ"}
@@ -0,0 +1,73 @@
1
+ import { globSync as y, mkdirSync as C, writeFileSync as v, readFileSync as I } from "node:fs";
2
+ import { resolve as u, dirname as F } from "node:path";
3
+ import { e as b, b as g, j } from "./style-BmyOIMcU.js";
4
+ const T = "virtual:cer-jit-css", m = "\0virtual:cer-jit-css";
5
+ function w(f, s) {
6
+ s && Object.keys(s).length > 0 && b(s);
7
+ const o = process.cwd(), i = [];
8
+ for (const r of f) {
9
+ const e = y(r, { cwd: o }).map((c) => u(o, c));
10
+ i.push(...e);
11
+ }
12
+ const S = [...new Set(i)], a = /* @__PURE__ */ new Set();
13
+ for (const r of S)
14
+ try {
15
+ const e = I(r, "utf-8"), c = g(e);
16
+ for (const t of c) a.add(t);
17
+ } catch {
18
+ }
19
+ if (a.size === 0) return "";
20
+ const p = `<div class="${[...a].join(" ")}"></div>`;
21
+ return j(p);
22
+ }
23
+ function V(f) {
24
+ const {
25
+ content: s,
26
+ output: o,
27
+ virtualModule: i = !0,
28
+ extendedColors: S,
29
+ customColors: a,
30
+ disableVariants: p
31
+ } = f, r = {
32
+ extendedColors: S,
33
+ customColors: a,
34
+ disableVariants: p
35
+ };
36
+ let e = "", c = null;
37
+ return {
38
+ name: "cer-jit-css",
39
+ buildStart() {
40
+ const t = process.cwd(), d = /* @__PURE__ */ new Set();
41
+ for (const l of s)
42
+ y(l, { cwd: t }).forEach((n) => d.add(u(t, n)));
43
+ if (c = d, e = w(s, r), o) {
44
+ const l = u(process.cwd(), o);
45
+ C(F(l), { recursive: !0 }), v(l, e, "utf-8");
46
+ }
47
+ },
48
+ resolveId(t) {
49
+ if (i && t === T)
50
+ return m;
51
+ },
52
+ load(t) {
53
+ if (t === m)
54
+ return `export default ${JSON.stringify(e)};`;
55
+ },
56
+ handleHotUpdate({ file: t, server: d }) {
57
+ if (c?.has(t) ?? !1) {
58
+ if (e = w(s, r), o) {
59
+ const n = u(process.cwd(), o);
60
+ v(n, e, "utf-8");
61
+ }
62
+ if (i) {
63
+ const n = d, h = n.moduleGraph.getModuleById(m);
64
+ h && n.reloadModule(h);
65
+ }
66
+ }
67
+ }
68
+ };
69
+ }
70
+ export {
71
+ V as cerJITCSS
72
+ };
73
+ //# sourceMappingURL=custom-elements-runtime.vite-plugin.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-elements-runtime.vite-plugin.es.js","sources":["../src/lib/vite-plugin.ts"],"sourcesContent":["/**\n * Vite plugin for build-time JIT CSS generation.\n *\n * Scans source files for utility class names and emits pre-generated CSS,\n * eliminating all runtime parsing cost for projects with static class lists.\n *\n * @example\n * ```ts\n * // vite.config.ts\n * import { defineConfig } from 'vite';\n * import { cerJITCSS } from '@jasonshimmy/custom-elements-runtime/vite-plugin';\n *\n * export default defineConfig({\n * plugins: [\n * cerJITCSS({\n * content: ['./src/**\\/*.{ts,tsx,html}'],\n * output: 'src/generated-jit.css',\n * extendedColors: true,\n * }),\n * ],\n * });\n * ```\n */\n\nimport type { Plugin } from 'vite';\nimport { readFileSync, writeFileSync, mkdirSync, globSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport {\n jitCSS,\n enableJITCSS,\n extractClassesFromHTML,\n type JITCSSOptions,\n} from './runtime/style';\n\n// --- Re-export extractClassesFromHTML for plugin consumers ---\n\n/**\n * Options for the `cerJITCSS` Vite plugin.\n */\nexport interface CerJITCSSPluginOptions extends JITCSSOptions {\n /**\n * Glob patterns (relative to `process.cwd()`) that identify which source\n * files the plugin should scan for utility class names.\n *\n * @example `['./src/**\\/*.{ts,html}', './index.html']`\n */\n content: string[];\n /**\n * File path (relative to `process.cwd()`) where the generated CSS will\n * be written. When omitted the plugin only emits a virtual module.\n */\n output?: string;\n /**\n * Whether to emit a virtual module `virtual:cer-jit-css` that resolves to\n * the generated CSS text. Defaults to `true`.\n */\n virtualModule?: boolean;\n}\n\nconst VIRTUAL_ID = 'virtual:cer-jit-css';\nconst RESOLVED_VIRTUAL_ID = '\\0virtual:cer-jit-css';\n\nfunction generateFromFiles(\n contentPatterns: string[],\n jitOptions: JITCSSOptions,\n): string {\n if (jitOptions && Object.keys(jitOptions).length > 0) {\n enableJITCSS(jitOptions);\n }\n\n const cwd = process.cwd();\n const files: string[] = [];\n\n for (const pattern of contentPatterns) {\n const matches = globSync(pattern, { cwd }).map((f) => resolve(cwd, f));\n files.push(...matches);\n }\n\n // Deduplicate files\n const uniqueFiles = [...new Set(files)];\n\n // Aggregate all class names across all files\n const allClasses = new Set<string>();\n\n for (const file of uniqueFiles) {\n try {\n const content = readFileSync(file, 'utf-8');\n const classes = extractClassesFromHTML(content);\n for (const cls of classes) allClasses.add(cls);\n } catch {\n // Skip unreadable files\n }\n }\n\n if (allClasses.size === 0) return '';\n\n // Build a fake HTML string containing all discovered classes so jitCSS()\n // can process the full set in one pass.\n const fakeHTML = `<div class=\"${[...allClasses].join(' ')}\"></div>`;\n return jitCSS(fakeHTML);\n}\n\n/**\n * Vite plugin that performs a build-time scan of source files and emits\n * pre-generated JIT CSS as a file and/or `virtual:cer-jit-css` module.\n */\nexport function cerJITCSS(options: CerJITCSSPluginOptions): Plugin {\n const {\n content,\n output,\n virtualModule = true,\n extendedColors,\n customColors,\n disableVariants,\n } = options;\n\n const jitOptions: JITCSSOptions = {\n extendedColors,\n customColors,\n disableVariants,\n };\n\n let generatedCSS = '';\n // Resolved file set built in buildStart and reused in handleHotUpdate to\n // avoid re-running globSync for every HMR file-change event.\n let watchedFiles: Set<string> | null = null;\n\n return {\n name: 'cer-jit-css',\n\n buildStart() {\n const cwd = process.cwd();\n const resolved = new Set<string>();\n for (const pattern of content) {\n globSync(pattern, { cwd }).forEach((f) => resolved.add(resolve(cwd, f)));\n }\n watchedFiles = resolved;\n\n generatedCSS = generateFromFiles(content, jitOptions);\n\n if (output) {\n const outputPath = resolve(process.cwd(), output);\n mkdirSync(dirname(outputPath), { recursive: true });\n writeFileSync(outputPath, generatedCSS, 'utf-8');\n }\n },\n\n resolveId(id: string) {\n if (virtualModule && id === VIRTUAL_ID) {\n return RESOLVED_VIRTUAL_ID;\n }\n return undefined;\n },\n\n load(id: string) {\n if (id === RESOLVED_VIRTUAL_ID) {\n return `export default ${JSON.stringify(generatedCSS)};`;\n }\n return undefined;\n },\n\n handleHotUpdate({ file, server }: { file: string; server: unknown }) {\n // Re-generate when a watched source file changes.\n // Use the cached file set from buildStart to avoid re-globbing.\n const isWatched = watchedFiles?.has(file) ?? false;\n\n if (!isWatched) return;\n\n generatedCSS = generateFromFiles(content, jitOptions);\n\n if (output) {\n const outputPath = resolve(process.cwd(), output);\n writeFileSync(outputPath, generatedCSS, 'utf-8');\n }\n\n if (virtualModule) {\n // Invalidate the virtual module so HMR triggers a reload\n const viteServer = server as {\n moduleGraph: { getModuleById: (id: string) => unknown };\n reloadModule: (mod: unknown) => void;\n };\n const mod = viteServer.moduleGraph.getModuleById(RESOLVED_VIRTUAL_ID);\n if (mod) viteServer.reloadModule(mod);\n }\n },\n };\n}\n"],"names":["VIRTUAL_ID","RESOLVED_VIRTUAL_ID","generateFromFiles","contentPatterns","jitOptions","enableJITCSS","cwd","files","pattern","matches","globSync","f","resolve","uniqueFiles","allClasses","file","content","readFileSync","classes","extractClassesFromHTML","cls","fakeHTML","jitCSS","cerJITCSS","options","output","virtualModule","extendedColors","customColors","disableVariants","generatedCSS","watchedFiles","resolved","outputPath","mkdirSync","dirname","writeFileSync","id","server","viteServer","mod"],"mappings":";;;AA2DA,MAAMA,IAAa,uBACbC,IAAsB;AAE5B,SAASC,EACPC,GACAC,GACQ;AACR,EAAIA,KAAc,OAAO,KAAKA,CAAU,EAAE,SAAS,KACjDC,EAAaD,CAAU;AAGzB,QAAME,IAAM,QAAQ,IAAA,GACdC,IAAkB,CAAA;AAExB,aAAWC,KAAWL,GAAiB;AACrC,UAAMM,IAAUC,EAASF,GAAS,EAAE,KAAAF,EAAA,CAAK,EAAE,IAAI,CAACK,MAAMC,EAAQN,GAAKK,CAAC,CAAC;AACrE,IAAAJ,EAAM,KAAK,GAAGE,CAAO;AAAA,EACvB;AAGA,QAAMI,IAAc,CAAC,GAAG,IAAI,IAAIN,CAAK,CAAC,GAGhCO,wBAAiB,IAAA;AAEvB,aAAWC,KAAQF;AACjB,QAAI;AACF,YAAMG,IAAUC,EAAaF,GAAM,OAAO,GACpCG,IAAUC,EAAuBH,CAAO;AAC9C,iBAAWI,KAAOF,EAAS,CAAAJ,EAAW,IAAIM,CAAG;AAAA,IAC/C,QAAQ;AAAA,IAER;AAGF,MAAIN,EAAW,SAAS,EAAG,QAAO;AAIlC,QAAMO,IAAW,eAAe,CAAC,GAAGP,CAAU,EAAE,KAAK,GAAG,CAAC;AACzD,SAAOQ,EAAOD,CAAQ;AACxB;AAMO,SAASE,EAAUC,GAAyC;AACjE,QAAM;AAAA,IACJ,SAAAR;AAAA,IACA,QAAAS;AAAA,IACA,eAAAC,IAAgB;AAAA,IAChB,gBAAAC;AAAA,IACA,cAAAC;AAAA,IACA,iBAAAC;AAAA,EAAA,IACEL,GAEEpB,IAA4B;AAAA,IAChC,gBAAAuB;AAAA,IACA,cAAAC;AAAA,IACA,iBAAAC;AAAA,EAAA;AAGF,MAAIC,IAAe,IAGfC,IAAmC;AAEvC,SAAO;AAAA,IACL,MAAM;AAAA,IAEN,aAAa;AACX,YAAMzB,IAAM,QAAQ,IAAA,GACd0B,wBAAe,IAAA;AACrB,iBAAWxB,KAAWQ;AACpB,QAAAN,EAASF,GAAS,EAAE,KAAAF,EAAA,CAAK,EAAE,QAAQ,CAACK,MAAMqB,EAAS,IAAIpB,EAAQN,GAAKK,CAAC,CAAC,CAAC;AAMzE,UAJAoB,IAAeC,GAEfF,IAAe5B,EAAkBc,GAASZ,CAAU,GAEhDqB,GAAQ;AACV,cAAMQ,IAAarB,EAAQ,QAAQ,IAAA,GAAOa,CAAM;AAChD,QAAAS,EAAUC,EAAQF,CAAU,GAAG,EAAE,WAAW,IAAM,GAClDG,EAAcH,GAAYH,GAAc,OAAO;AAAA,MACjD;AAAA,IACF;AAAA,IAEA,UAAUO,GAAY;AACpB,UAAIX,KAAiBW,MAAOrC;AAC1B,eAAOC;AAAA,IAGX;AAAA,IAEA,KAAKoC,GAAY;AACf,UAAIA,MAAOpC;AACT,eAAO,kBAAkB,KAAK,UAAU6B,CAAY,CAAC;AAAA,IAGzD;AAAA,IAEA,gBAAgB,EAAE,MAAAf,GAAM,QAAAuB,KAA6C;AAKnE,UAFkBP,GAAc,IAAIhB,CAAI,KAAK,IAM7C;AAAA,YAFAe,IAAe5B,EAAkBc,GAASZ,CAAU,GAEhDqB,GAAQ;AACV,gBAAMQ,IAAarB,EAAQ,QAAQ,IAAA,GAAOa,CAAM;AAChD,UAAAW,EAAcH,GAAYH,GAAc,OAAO;AAAA,QACjD;AAEA,YAAIJ,GAAe;AAEjB,gBAAMa,IAAaD,GAIbE,IAAMD,EAAW,YAAY,cAActC,CAAmB;AACpE,UAAIuC,KAAKD,EAAW,aAAaC,CAAG;AAAA,QACtC;AAAA;AAAA,IACF;AAAA,EAAA;AAEJ;"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Non-Shadow DOM JIT CSS runtime scanner.
3
+ *
4
+ * Watches real DOM elements for class changes and injects utility CSS into
5
+ * a shared `<style>` element (or constructable stylesheet) in the host document.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * import { createDOMJITCSS } from '@jasonshimmy/custom-elements-runtime/dom-jit-css';
10
+ *
11
+ * // Watch the full document body
12
+ * const jit = createDOMJITCSS();
13
+ * jit.mount();
14
+ *
15
+ * // Watch a specific container element
16
+ * const jit = createDOMJITCSS({ root: document.getElementById('app')! });
17
+ * jit.mount();
18
+ *
19
+ * // Tear down when no longer needed
20
+ * jit.destroy();
21
+ * ```
22
+ *
23
+ * ## `data-jitcss` attribute semantics
24
+ *
25
+ * | Attribute value | Behaviour |
26
+ * | ------------------------------------------------------ | ----------------------------------------------------------------- |
27
+ * | `data-jitcss` (no value) or `data-jitcss="container"` | Scopes the observer to that element and its subtree |
28
+ * | `data-jitcss="self"` | Only processes classes on that exact element, not descendants |
29
+ * | `data-jitcss="global"` | Observer covers `document.body` (useful on `<html>` or `<body>`) |
30
+ *
31
+ * When `createDOMJITCSS()` is called with no `root`, it auto-detects all
32
+ * `[data-jitcss]` elements and registers an observer for each.
33
+ */
34
+ import { type JITCSSOptions } from './runtime/style';
35
+ /**
36
+ * Options for `createDOMJITCSS()`.
37
+ */
38
+ export interface DOMJITCSSOptions extends JITCSSOptions {
39
+ /**
40
+ * The root element to observe. Defaults to auto-detecting `[data-jitcss]`
41
+ * elements, then falling back to `document.body`.
42
+ */
43
+ root?: Element | ShadowRoot | null;
44
+ /**
45
+ * ID of the `<style>` element injected into the document head.
46
+ * Defaults to `'cer-dom-jit-css'`.
47
+ */
48
+ styleId?: string;
49
+ }
50
+ /** Public handle returned by `createDOMJITCSS()`. */
51
+ export interface DOMJITCSSHandle {
52
+ /** Start observing the DOM and injecting utility CSS. */
53
+ mount(): void;
54
+ /** Stop observing and remove the injected stylesheet. */
55
+ destroy(): void;
56
+ /** Get the number of unique classes processed so far. */
57
+ readonly processedCount: number;
58
+ }
59
+ /**
60
+ * Create a DOM JIT CSS instance that watches class attribute changes and
61
+ * injects CSS utility rules into the document.
62
+ *
63
+ * @param options - Configuration options.
64
+ * @returns A handle with `mount()` and `destroy()` methods.
65
+ */
66
+ export declare function createDOMJITCSS(options?: DOMJITCSSOptions): DOMJITCSSHandle;
@@ -10,6 +10,8 @@ export declare class GlobalEventBus extends EventTarget {
10
10
  private handlers;
11
11
  private static instance;
12
12
  private eventCounters;
13
+ private nativeUnsubscribers;
14
+ private readonly MAX_EVENT_COUNTERS;
13
15
  /**
14
16
  * Returns the singleton instance of GlobalEventBus
15
17
  */
@@ -62,7 +64,7 @@ export declare class GlobalEventBus extends EventTarget {
62
64
  */
63
65
  getActiveEvents(): string[];
64
66
  /**
65
- * Clear all event handlers (useful for testing or cleanup).
67
+ * Clear all event handlers and native EventTarget listeners (useful for testing or cleanup).
66
68
  */
67
69
  clear(): void;
68
70
  /**